X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/978606e5eeeb0f0d3cfaeecf378afa983a4a7b11..d7f362301d17a84c8eeb3428b208eca691c49aaa:/apps/modeltranslation/management/commands/translation2po.py diff --git a/apps/modeltranslation/management/commands/translation2po.py b/apps/modeltranslation/management/commands/translation2po.py index 9ab8489c6..9cb34deca 100644 --- a/apps/modeltranslation/management/commands/translation2po.py +++ b/apps/modeltranslation/management/commands/translation2po.py @@ -1,4 +1,3 @@ -import polib import os import sys @@ -8,6 +7,7 @@ from django.conf import settings from django.core.management.base import BaseCommand from django.core.management.color import color_style +import polib import modeltranslation.models from modeltranslation.translator import translator, NotRegistered @@ -22,7 +22,7 @@ def metadata(language=''): 'POT-Creation-Date': '%s' % t, 'PO-Revision-Date': '%s' % t, 'Last-Translator': 'you ', - 'Language-Team': '%s ' % language, + 'Language-Team': '%s' % dict(settings.LANGUAGES).get(language, language), 'MIME-Version': '1.0', 'Content-Type': 'text/plain; charset=utf-8', 'Content-Transfer-Encoding': '8bit', @@ -44,39 +44,71 @@ def make_po(language=''): class Command(BaseCommand): option_list = BaseCommand.option_list + ( make_option('-d', '--directory', help='Specify which directory should hold generated PO files', dest='directory'), + make_option('-l', '--load', help='load locales back to source', action='store_true', dest='load', default=False), ) help = 'Export models from app to po files' args = 'app' - def handle(self, appname, **options): - app = __import__(appname) - pofiles = {} + def get_models(self, app): + r = [] for mdname in dir(app.models): if mdname[0] == '_': continue md = getattr(app.models, mdname) try: opts = translator.get_options_for_model(md) + r.append((md, opts)) except NotRegistered: continue + return r + + def handle(self, appname, **options): + app = __import__(appname) + if options['load']: + objects = {} + modmod = {} + for md, opts in self.get_models(app): + if not md.__name__ in objects: + objects[md.__name__] = {} + modmod['model'] = md + + for lng in zip(*settings.LANGUAGES)[0]: + pofile = os.path.join(options['directory'], lng, appname + '.po') + po = polib.pofile(pofile) + for entry in po: + loc, pk = entry.occurrences[0] + _appname, modelname, fieldname = loc.split('/') + try: + obj = objects[modelname][pk] + except KeyError: + obj = modmod['model'].objects.get(pk=pk) + objects[modelname][pk] = obj + setattr(obj, fieldname, entry.msgstr) + + for mod, objcs in objects.items(): + for o in objcs.values(): + o.save() + + else: + pofiles = {} + for md, opts in self.get_models(app): + for obj in md.objects.all().order_by('pk'): + for fld in opts.fields: + for locfld in opts.localized_fieldnames[fld]: + cur_lang = lang(locfld) + try: + po = pofiles[cur_lang] + except: + po = make_po(cur_lang) + pofiles[cur_lang] = po + + entry = polib.POEntry( + msgid=getattr(obj, '%s_%s' % (fld, settings.LANGUAGE_CODE)), + msgstr=getattr(obj, locfld), + occurrences=[('%s/%s/%s' % (appname, md.__name__, locfld), obj.id)]) + po.append(entry) - for obj in md.objects.all().order_by('pk'): - for fld in opts.fields: - for locfld in opts.localized_fieldnames[fld]: - cur_lang = lang(locfld) - try: - po = pofiles[cur_lang] - except: - po = make_po(cur_lang) - pofiles[cur_lang] = po - - entry = polib.POEntry( - msgid=getattr(obj, '%s_%s' % (fld, settings.LANGUAGE_CODE)), - msgstr=getattr(obj, locfld), - occurrences=[('%s/%s/%s' % (appname, mdname, locfld), obj.id)]) - po.append(entry) - - directory = options['directory'] - for lng, po in pofiles.items(): - try: os.makedirs(os.path.join(directory, lng)) - except OSError: pass - po.save(os.path.join(directory, lng, '%s.po' % appname)) + directory = options['directory'] + for lng, po in pofiles.items(): + try: os.makedirs(os.path.join(directory, lng)) + except OSError: pass + po.save(os.path.join(directory, lng, '%s.po' % appname))