diff -r 57b4279d8c4e -r 03e267d67478 app/django/bin/make-messages.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/django/bin/make-messages.py Fri Jul 18 18:22:23 2008 +0000 @@ -0,0 +1,159 @@ +#!/usr/bin/env python + +# Need to ensure that the i18n framework is enabled +from django.conf import settings +settings.configure(USE_I18N = True) + +from django.utils.translation import templatize +import re +import os +import sys +import getopt +from itertools import dropwhile + +pythonize_re = re.compile(r'\n\s*//') + +def make_messages(): + localedir = None + + if os.path.isdir(os.path.join('conf', 'locale')): + localedir = os.path.abspath(os.path.join('conf', 'locale')) + elif os.path.isdir('locale'): + localedir = os.path.abspath('locale') + else: + print "This script should be run from the django svn tree or your project or app tree." + print "If you did indeed run it from the svn checkout or your project or application," + print "maybe you are just missing the conf/locale (in the django tree) or locale (for project" + print "and application) directory?" + print "make-messages.py doesn't create it automatically, you have to create it by hand if" + print "you want to enable i18n for your project or application." + sys.exit(1) + + (opts, args) = getopt.getopt(sys.argv[1:], 'l:d:va') + + lang = None + domain = 'django' + verbose = False + all = False + + for o, v in opts: + if o == '-l': + lang = v + elif o == '-d': + domain = v + elif o == '-v': + verbose = True + elif o == '-a': + all = True + + if domain not in ('django', 'djangojs'): + print "currently make-messages.py only supports domains 'django' and 'djangojs'" + sys.exit(1) + if (lang is None and not all) or domain is None: + print "usage: make-messages.py -l " + print " or: make-messages.py -a" + sys.exit(1) + + languages = [] + + if lang is not None: + languages.append(lang) + elif all: + languages = [el for el in os.listdir(localedir) if not el.startswith('.')] + + for lang in languages: + + print "processing language", lang + basedir = os.path.join(localedir, lang, 'LC_MESSAGES') + if not os.path.isdir(basedir): + os.makedirs(basedir) + + pofile = os.path.join(basedir, '%s.po' % domain) + potfile = os.path.join(basedir, '%s.pot' % domain) + + if os.path.exists(potfile): + os.unlink(potfile) + + all_files = [] + for (dirpath, dirnames, filenames) in os.walk("."): + all_files.extend([(dirpath, f) for f in filenames]) + all_files.sort() + for dirpath, file in all_files: + if domain == 'djangojs' and file.endswith('.js'): + if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath)) + src = open(os.path.join(dirpath, file), "rb").read() + src = pythonize_re.sub('\n#', src) + open(os.path.join(dirpath, '%s.py' % file), "wb").write(src) + thefile = '%s.py' % file + cmd = 'xgettext -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (domain, os.path.join(dirpath, thefile)) + (stdin, stdout, stderr) = os.popen3(cmd, 't') + msgs = stdout.read() + errors = stderr.read() + if errors: + print "errors happened while running xgettext on %s" % file + print errors + sys.exit(8) + old = '#: '+os.path.join(dirpath, thefile)[2:] + new = '#: '+os.path.join(dirpath, file)[2:] + msgs = msgs.replace(old, new) + if os.path.exists(potfile): + # Strip the header + msgs = '\n'.join(dropwhile(len, msgs.split('\n'))) + else: + msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8') + if msgs: + open(potfile, 'ab').write(msgs) + os.unlink(os.path.join(dirpath, thefile)) + elif domain == 'django' and (file.endswith('.py') or file.endswith('.html')): + thefile = file + if file.endswith('.html'): + src = open(os.path.join(dirpath, file), "rb").read() + thefile = '%s.py' % file + open(os.path.join(dirpath, thefile), "wb").write(templatize(src)) + if verbose: + sys.stdout.write('processing file %s in %s\n' % (file, dirpath)) + cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % ( + domain, os.path.join(dirpath, thefile)) + (stdin, stdout, stderr) = os.popen3(cmd, 't') + msgs = stdout.read() + errors = stderr.read() + if errors: + print "errors happened while running xgettext on %s" % file + print errors + sys.exit(8) + if thefile != file: + old = '#: '+os.path.join(dirpath, thefile)[2:] + new = '#: '+os.path.join(dirpath, file)[2:] + msgs = msgs.replace(old, new) + if os.path.exists(potfile): + # Strip the header + msgs = '\n'.join(dropwhile(len, msgs.split('\n'))) + else: + msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8') + if msgs: + open(potfile, 'ab').write(msgs) + if thefile != file: + os.unlink(os.path.join(dirpath, thefile)) + + if os.path.exists(potfile): + (stdin, stdout, stderr) = os.popen3('msguniq --to-code=utf-8 "%s"' % potfile, 'b') + msgs = stdout.read() + errors = stderr.read() + if errors: + print "errors happened while running msguniq" + print errors + sys.exit(8) + open(potfile, 'w').write(msgs) + if os.path.exists(pofile): + (stdin, stdout, stderr) = os.popen3('msgmerge -q "%s" "%s"' % (pofile, potfile), 'b') + msgs = stdout.read() + errors = stderr.read() + if errors: + print "errors happened while running msgmerge" + print errors + sys.exit(8) + open(pofile, 'wb').write(msgs) + os.unlink(potfile) + +if __name__ == "__main__": + make_messages()