mirror of
https://github.com/gryf/pygtktalog.git
synced 2025-12-17 11:30:19 +01:00
Moved scripts into bin subdir, slightly modified Makefile, added plgen and
dist targets, removed CZYTAJTO.
This commit is contained in:
16
Makefile
16
Makefile
@@ -1,6 +1,8 @@
|
|||||||
PYTHON_EXEC = PYTHONPATH=/home/gryf/Devel/Python/pyGTKtalog:/home/gryf/.python_lib python
|
PYTHON_EXEC = PYTHONPATH=/home/gryf/Devel/Python/pyGTKtalog:/home/gryf/.python_lib python
|
||||||
LOCALE = LC_ALL=pl_PL.utf8
|
LOCALE = LC_ALL=pl_PL.utf8
|
||||||
FILE = pygtktalog.py
|
FILE = pygtktalog.py
|
||||||
|
DIST = bin/prepare_dist_package.sh
|
||||||
|
POT_GEN = bin/generate_pot.py
|
||||||
|
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run:
|
run:
|
||||||
@@ -25,7 +27,7 @@ distclean: clean
|
|||||||
.PHONY: pot
|
.PHONY: pot
|
||||||
pot:
|
pot:
|
||||||
@if [ ! -d locale ]; then mkdir locale; fi
|
@if [ ! -d locale ]; then mkdir locale; fi
|
||||||
@python generate_pot.py pygtktalog pygtktalog > locale/pygtktalog.pot
|
@python $(POT_GEN) pygtktalog pygtktalog > locale/pygtktalog.pot
|
||||||
@echo "locale/pygtktalog.pot (re)generated."
|
@echo "locale/pygtktalog.pot (re)generated."
|
||||||
|
|
||||||
.PHONY: pltrans
|
.PHONY: pltrans
|
||||||
@@ -43,13 +45,19 @@ pltrans: pot
|
|||||||
@msgfmt locale/pl.po -o locale/pl/LC_MESSAGES/pygtktalog.mo
|
@msgfmt locale/pl.po -o locale/pl/LC_MESSAGES/pygtktalog.mo
|
||||||
@echo "Message catalog for pl_PL.utf8 saved in locale/pl/LC_MESSAGES/pygtktalog.mo"
|
@echo "Message catalog for pl_PL.utf8 saved in locale/pl/LC_MESSAGES/pygtktalog.mo"
|
||||||
|
|
||||||
|
.PHONY: plgen
|
||||||
|
plgen: pot
|
||||||
|
@echo "Compile message catalog for pl_PL.utf8"
|
||||||
|
@msgfmt locale/pl.po -o locale/pl/LC_MESSAGES/pygtktalog.mo
|
||||||
|
@echo "Message catalog for pl_PL.utf8 saved in locale/pl/LC_MESSAGES/pygtktalog.mo"
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test:
|
test:
|
||||||
cd test && $(PYTHON_EXEC) run_tests.py
|
cd test && $(PYTHON_EXEC) run_tests.py
|
||||||
|
|
||||||
.PHONY: dist
|
.PHONY: dist
|
||||||
dist:
|
dist:
|
||||||
echo "implement me"
|
@$(DIST)
|
||||||
|
|
||||||
.PHONY: help
|
.PHONY: help
|
||||||
help:
|
help:
|
||||||
@@ -62,6 +70,8 @@ help:
|
|||||||
@echo " pot: Generate .pot file from sources and .glade files."
|
@echo " pot: Generate .pot file from sources and .glade files."
|
||||||
@echo " pltrans: Generate/merge polish translation file and then invoke editor."
|
@echo " pltrans: Generate/merge polish translation file and then invoke editor."
|
||||||
@echo " Environment variable EDITOR is expected"
|
@echo " Environment variable EDITOR is expected"
|
||||||
|
@echo " plgen: Just generate polish translation file without merging and"
|
||||||
|
@echo " editing."
|
||||||
@echo " test: Launch unit tests for application."
|
@echo " test: Launch unit tests for application."
|
||||||
@echo " dist: Make distribution egg."
|
@echo " dist: Make distribution package."
|
||||||
@echo
|
@echo
|
||||||
|
|||||||
2
README
2
README
@@ -1,4 +1,4 @@
|
|||||||
pyGTKtalog 1.0
|
pyGTKtalog 1.9
|
||||||
==============
|
==============
|
||||||
|
|
||||||
pyGTKtalog is Linux/FreeBSD program for indexing CD/DVD or directories on
|
pyGTKtalog is Linux/FreeBSD program for indexing CD/DVD or directories on
|
||||||
|
|||||||
163
generate_pot.py
163
generate_pot.py
@@ -1,163 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""
|
|
||||||
Generate POT
|
|
||||||
~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Generate a pot file with all translations for PyGTK applications
|
|
||||||
based on the organization idea I shared in my article about i18n
|
|
||||||
in PyGTK applications.
|
|
||||||
|
|
||||||
:copyright: 2006-2007 by Armin Ronacher.
|
|
||||||
:license: GNU GPL, see LICENSE for more details.
|
|
||||||
"""
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
from xml.dom import minidom
|
|
||||||
from compiler import parse, ast
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
PO_HEADER = """#
|
|
||||||
# %(name)s Language File
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: %(name)s\\n"
|
|
||||||
"POT-Creation-Date: %(time)s\\n"
|
|
||||||
"Last-Translator: Roman Dobosz <gryf73@gmail.com>\\n"
|
|
||||||
"MIME-Version: 1.0\\n"
|
|
||||||
"Content-Type: text/plain; charset=utf-8\\n"
|
|
||||||
"Content-Transfer-Encoding: utf-8\\n"
|
|
||||||
"Generated-By: %(filename)s\\n"\
|
|
||||||
"""
|
|
||||||
|
|
||||||
EMPTY_STRING = ''
|
|
||||||
EMPTY_LINE = ['""\n']
|
|
||||||
LINE_SHIFT = ['\\n"\n"']
|
|
||||||
|
|
||||||
|
|
||||||
class StringCollection(object):
|
|
||||||
"""Class for collecting strings."""
|
|
||||||
|
|
||||||
def __init__(self, basename):
|
|
||||||
self.db = {}
|
|
||||||
self.order = []
|
|
||||||
self.offset = len(basename)
|
|
||||||
|
|
||||||
def feed(self, file, line, string):
|
|
||||||
name = file[self.offset:].lstrip('/')
|
|
||||||
if string not in self.db:
|
|
||||||
self.db[string] = [(name, line)]
|
|
||||||
self.order.append(string)
|
|
||||||
else:
|
|
||||||
self.db[string].append((name, line))
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
for string in self.order:
|
|
||||||
yield string, self.db[string]
|
|
||||||
|
|
||||||
|
|
||||||
def quote(s):
|
|
||||||
"""Quotes a given string so that it is useable in a .po file."""
|
|
||||||
result = ['"']
|
|
||||||
firstmatch = True
|
|
||||||
for char in s:
|
|
||||||
if char == '\n':
|
|
||||||
if firstmatch:
|
|
||||||
result = EMPTY_LINE + result
|
|
||||||
firstmatch = False
|
|
||||||
result += LINE_SHIFT
|
|
||||||
continue
|
|
||||||
if char in '\t"':
|
|
||||||
result.append('\\')
|
|
||||||
result.append(char)
|
|
||||||
result.append('"')
|
|
||||||
return EMPTY_STRING.join(result)
|
|
||||||
|
|
||||||
|
|
||||||
def scan_python_file(filename, calls):
|
|
||||||
"""Scan a python file for gettext calls."""
|
|
||||||
def scan(nodelist):
|
|
||||||
for node in nodelist:
|
|
||||||
if isinstance(node, ast.CallFunc):
|
|
||||||
handle = False
|
|
||||||
for pos, n in enumerate(node):
|
|
||||||
if pos == 0:
|
|
||||||
if isinstance(n, ast.Name) and n.name in calls:
|
|
||||||
handle = True
|
|
||||||
elif pos == 1:
|
|
||||||
if handle:
|
|
||||||
if n.__class__ is ast.Const and \
|
|
||||||
isinstance(n.value, basestring):
|
|
||||||
yield n.lineno, n.value
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
for line in scan([n]):
|
|
||||||
yield line
|
|
||||||
elif hasattr(node, '__iter__'):
|
|
||||||
for n in scan(node):
|
|
||||||
yield n
|
|
||||||
|
|
||||||
fp = file(filename)
|
|
||||||
try:
|
|
||||||
try:
|
|
||||||
return scan(parse(fp.read()))
|
|
||||||
except:
|
|
||||||
print >> sys.stderr, 'Syntax Error in file %r' % filename
|
|
||||||
finally:
|
|
||||||
fp.close()
|
|
||||||
|
|
||||||
|
|
||||||
def scan_glade_file(filename):
|
|
||||||
"""Scan a glade file for translatable strings."""
|
|
||||||
try:
|
|
||||||
doc = minidom.parse(filename)
|
|
||||||
except:
|
|
||||||
print >> sys.stderr, 'Syntax Error in file %r' % filename
|
|
||||||
for element in doc.getElementsByTagName('property'):
|
|
||||||
if element.getAttribute('translatable') == 'yes':
|
|
||||||
data = element.firstChild.nodeValue
|
|
||||||
if data and not data.startswith('gtk-'):
|
|
||||||
yield data
|
|
||||||
|
|
||||||
|
|
||||||
def scan_tree(pathname, calls=['_']):
|
|
||||||
"""Scans a tree for translatable strings."""
|
|
||||||
out = StringCollection(pathname)
|
|
||||||
for folder, _, files in os.walk(pathname):
|
|
||||||
for filename in files:
|
|
||||||
filename = os.path.join(folder, filename)
|
|
||||||
if filename.endswith('.py'):
|
|
||||||
result = scan_python_file(filename, calls)
|
|
||||||
if result is not None:
|
|
||||||
for lineno, string in result:
|
|
||||||
out.feed(filename, lineno, string)
|
|
||||||
elif filename.endswith('.glade'):
|
|
||||||
result = scan_glade_file(filename)
|
|
||||||
if result is not None:
|
|
||||||
for string in result:
|
|
||||||
out.feed(filename, None, string)
|
|
||||||
for line in out:
|
|
||||||
yield line
|
|
||||||
|
|
||||||
|
|
||||||
def run():
|
|
||||||
if len(sys.argv) != 3:
|
|
||||||
print 'usage: %s <basefolder> <name>' % sys.argv[0]
|
|
||||||
sys.exit()
|
|
||||||
print PO_HEADER % {
|
|
||||||
'time': datetime.now(),
|
|
||||||
'filename': sys.argv[0],
|
|
||||||
'name': sys.argv[2],
|
|
||||||
}
|
|
||||||
basepath = sys.argv[1]
|
|
||||||
for string, occurrences in scan_tree(basepath):
|
|
||||||
print
|
|
||||||
for path, lineno in occurrences:
|
|
||||||
print '#. file %r, line %s' % (path, lineno or '?')
|
|
||||||
print 'msgid %s' % quote(string)
|
|
||||||
print 'msgstr ""'
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
run()
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# remove ~, pyc, pyo files from current directory
|
|
||||||
|
|
||||||
mkdir t 2>/dev/null
|
|
||||||
if [ $? != 0 ]; then
|
|
||||||
echo "cannot create directory 't': File exist."
|
|
||||||
echo "Rename it, move or rename, bcoz it's on the way."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
cd t
|
|
||||||
alias ls=ls
|
|
||||||
|
|
||||||
PREV=`ls -1 ..|grep bz2|tail -n 1|cut -f '2' -d '_'|cut -f 1 -d '.'`
|
|
||||||
REV=`svn export svn://10.0.0.10/repos/Python/pyGTKtalog pyGTKtalog |tail -n 1|cut -f 3 -d " "|cut -f 1 -d '.'`
|
|
||||||
|
|
||||||
cd pyGTKtalog
|
|
||||||
find . -name \*~ -exec rm '{}' ';'
|
|
||||||
find . -name \*pyc -exec rm '{}' ';'
|
|
||||||
find . -name \*pyo -exec rm '{}' ';'
|
|
||||||
find . -type d -name .svn -exec rm -fr '{}' ';'
|
|
||||||
rm -fr db img
|
|
||||||
rm -fr prepare_dist_package.sh
|
|
||||||
|
|
||||||
svn log -r ${PREV}:HEAD -v svn://10.0.0.10/repos/Python/pyGTKtalog > CHANGELOG
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
tar jcf ../pygtktalog_${REV}.tar.bz2 pyGTKtalog
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
rm -fr t
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user