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
|
||||
LOCALE = LC_ALL=pl_PL.utf8
|
||||
FILE = pygtktalog.py
|
||||
DIST = bin/prepare_dist_package.sh
|
||||
POT_GEN = bin/generate_pot.py
|
||||
|
||||
.PHONY: run
|
||||
run:
|
||||
@@ -25,7 +27,7 @@ distclean: clean
|
||||
.PHONY: pot
|
||||
pot:
|
||||
@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."
|
||||
|
||||
.PHONY: pltrans
|
||||
@@ -43,13 +45,19 @@ pltrans: pot
|
||||
@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: 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
|
||||
test:
|
||||
cd test && $(PYTHON_EXEC) run_tests.py
|
||||
|
||||
.PHONY: dist
|
||||
dist:
|
||||
echo "implement me"
|
||||
@$(DIST)
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
@@ -62,6 +70,8 @@ help:
|
||||
@echo " pot: Generate .pot file from sources and .glade files."
|
||||
@echo " pltrans: Generate/merge polish translation file and then invoke editor."
|
||||
@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 " dist: Make distribution egg."
|
||||
@echo " dist: Make distribution package."
|
||||
@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
|
||||
|
||||
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