Added --previous flag to msgmerge command used by makemessages

Also took the opportunity to slightly refactor gettext options
so as to ease customization by subclassing the command.
Thanks Michal Čihař for the report and initial patch.
This commit is contained in:
Claude Paroz 2014-03-06 10:13:22 +01:00
parent 20948612c7
commit 06efeae598
3 changed files with 32 additions and 34 deletions

View File

@ -80,14 +80,8 @@ class TranslatableFile(object):
'--keyword=ngettext_lazy:1,2', '--keyword=ngettext_lazy:1,2',
'--keyword=pgettext:1c,2', '--keyword=pgettext:1c,2',
'--keyword=npgettext:1c,2,3', '--keyword=npgettext:1c,2,3',
'--from-code=UTF-8',
'--add-comments=Translators',
'--output=-' '--output=-'
] ] + command.xgettext_options
if command.wrap:
args.append(command.wrap)
if command.location:
args.append(command.location)
args.append(work_file) args.append(work_file)
elif domain == 'django' and (file_ext == '.py' or file_ext in command.extensions): elif domain == 'django' and (file_ext == '.py' or file_ext in command.extensions):
thefile = self.file thefile = self.file
@ -115,14 +109,8 @@ class TranslatableFile(object):
'--keyword=npgettext:1c,2,3', '--keyword=npgettext:1c,2,3',
'--keyword=pgettext_lazy:1c,2', '--keyword=pgettext_lazy:1c,2',
'--keyword=npgettext_lazy:1c,2,3', '--keyword=npgettext_lazy:1c,2,3',
'--from-code=UTF-8',
'--add-comments=Translators',
'--output=-' '--output=-'
] ] + command.xgettext_options
if command.wrap:
args.append(command.wrap)
if command.location:
args.append(command.location)
args.append(work_file) args.append(work_file)
else: else:
return return
@ -206,6 +194,11 @@ class Command(NoArgsCommand):
requires_system_checks = False requires_system_checks = False
leave_locale_alone = True leave_locale_alone = True
msgmerge_options = ['-q', '--previous']
msguniq_options = ['--to-code=utf-8']
msgattrib_options = ['--no-obsolete']
xgettext_options = ['--from-code=UTF-8', '--add-comments=Translators']
def handle_noargs(self, *args, **options): def handle_noargs(self, *args, **options):
locale = options.get('locale') locale = options.get('locale')
self.domain = options.get('domain') self.domain = options.get('domain')
@ -217,8 +210,19 @@ class Command(NoArgsCommand):
if options.get('use_default_ignore_patterns'): if options.get('use_default_ignore_patterns'):
ignore_patterns += ['CVS', '.*', '*~', '*.pyc'] ignore_patterns += ['CVS', '.*', '*~', '*.pyc']
self.ignore_patterns = list(set(ignore_patterns)) self.ignore_patterns = list(set(ignore_patterns))
self.wrap = '--no-wrap' if options.get('no_wrap') else ''
self.location = '--no-location' if options.get('no_location') else '' # Avoid messing with mutable class variables
if options.get('no_wrap'):
self.msgmerge_options = self.msgmerge_options[:] + ['--no-wrap']
self.msguniq_options = self.msguniq_options[:] + ['--no-wrap']
self.msgattrib_options = self.msgattrib_options[:] + ['--no-wrap']
self.xgettext_options = self.xgettext_options[:] + ['--no-wrap']
if options.get('no_location'):
self.msgmerge_options = self.msgmerge_options[:] + ['--no-location']
self.msguniq_options = self.msguniq_options[:] + ['--no-location']
self.msgattrib_options = self.msgattrib_options[:] + ['--no-location']
self.xgettext_options = self.xgettext_options[:] + ['--no-location']
self.no_obsolete = options.get('no_obsolete') self.no_obsolete = options.get('no_obsolete')
self.keep_pot = options.get('keep_pot') self.keep_pot = options.get('keep_pot')
@ -307,12 +311,7 @@ class Command(NoArgsCommand):
potfile = os.path.join(path, '%s.pot' % str(self.domain)) potfile = os.path.join(path, '%s.pot' % str(self.domain))
if not os.path.exists(potfile): if not os.path.exists(potfile):
continue continue
args = ['msguniq', '--to-code=utf-8'] args = ['msguniq'] + self.msguniq_options + [potfile]
if self.wrap:
args.append(self.wrap)
if self.location:
args.append(self.location)
args.append(potfile)
msgs, errors, status = popen_wrapper(args) msgs, errors, status = popen_wrapper(args)
if errors: if errors:
if status != STATUS_OK: if status != STATUS_OK:
@ -389,12 +388,7 @@ class Command(NoArgsCommand):
pofile = os.path.join(basedir, '%s.po' % str(self.domain)) pofile = os.path.join(basedir, '%s.po' % str(self.domain))
if os.path.exists(pofile): if os.path.exists(pofile):
args = ['msgmerge', '-q'] args = ['msgmerge'] + self.msgmerge_options + [pofile, potfile]
if self.wrap:
args.append(self.wrap)
if self.location:
args.append(self.location)
args.extend([pofile, potfile])
msgs, errors, status = popen_wrapper(args) msgs, errors, status = popen_wrapper(args)
if errors: if errors:
if status != STATUS_OK: if status != STATUS_OK:
@ -413,12 +407,7 @@ class Command(NoArgsCommand):
fp.write(msgs) fp.write(msgs)
if self.no_obsolete: if self.no_obsolete:
args = ['msgattrib', '-o', pofile, '--no-obsolete'] args = ['msgattrib'] + self.msgattrib_options + ['-o', pofile, pofile]
if self.wrap:
args.append(self.wrap)
if self.location:
args.append(self.location)
args.append(pofile)
msgs, errors, status = popen_wrapper(args) msgs, errors, status = popen_wrapper(args)
if errors: if errors:
if status != STATUS_OK: if status != STATUS_OK:

View File

@ -569,6 +569,11 @@ Example usage::
Added the ability to specify multiple locales. Added the ability to specify multiple locales.
.. versionchanged:: 1.7
Added the ``--previous`` option to the ``msgmerge`` command when merging
with existing po files.
.. django-admin-option:: --domain .. django-admin-option:: --domain
Use the ``--domain`` or ``-d`` option to change the domain of the messages files. Use the ``--domain`` or ``-d`` option to change the domain of the messages files.

View File

@ -572,6 +572,10 @@ Internationalization
app or project message file. See :ref:`how-to-create-language-files` for app or project message file. See :ref:`how-to-create-language-files` for
details. details.
* The :djadmin:`makemessages` command now always adds the ``--previous``
command line flag to the ``msgmerge`` command, keeping previously translated
strings in po files for fuzzy strings.
* The following settings to adjust the language cookie options were introduced: * The following settings to adjust the language cookie options were introduced:
:setting:`LANGUAGE_COOKIE_AGE`, :setting:`LANGUAGE_COOKIE_DOMAIN` :setting:`LANGUAGE_COOKIE_AGE`, :setting:`LANGUAGE_COOKIE_DOMAIN`
and :setting:`LANGUAGE_COOKIE_PATH`. and :setting:`LANGUAGE_COOKIE_PATH`.