Fixed #5463 -- Allow alternate file extensions on files that are translated.
Patch from Jannis Leidel. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8234 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
afa98dba98
commit
3735f27660
|
@ -5,9 +5,39 @@ from itertools import dropwhile
|
||||||
from optparse import make_option
|
from optparse import make_option
|
||||||
from django.core.management.base import CommandError, BaseCommand
|
from django.core.management.base import CommandError, BaseCommand
|
||||||
|
|
||||||
|
try:
|
||||||
|
set
|
||||||
|
except NameError:
|
||||||
|
from sets import Set as set # For Python 2.3
|
||||||
|
|
||||||
pythonize_re = re.compile(r'\n\s*//')
|
pythonize_re = re.compile(r'\n\s*//')
|
||||||
|
|
||||||
def make_messages(locale=None, domain='django', verbosity='1', all=False):
|
def handle_extensions(extensions=('html',)):
|
||||||
|
"""
|
||||||
|
organizes multiple extensions that are separated with commas or passed by
|
||||||
|
using --extension/-e multiple times.
|
||||||
|
|
||||||
|
for example: running 'django-admin makemessages -e js,txt -e xhtml -a'
|
||||||
|
would result in a extension list: ['.js', '.txt', '.xhtml']
|
||||||
|
|
||||||
|
>>> handle_extensions(['.html', 'html,js,py,py,py,.py', 'py,.py'])
|
||||||
|
['.html', '.js']
|
||||||
|
>>> handle_extensions(['.html, txt,.tpl'])
|
||||||
|
['.html', '.tpl', '.txt']
|
||||||
|
"""
|
||||||
|
ext_list = []
|
||||||
|
for ext in extensions:
|
||||||
|
ext_list.extend(ext.replace(' ','').split(','))
|
||||||
|
for i, ext in enumerate(ext_list):
|
||||||
|
if not ext.startswith('.'):
|
||||||
|
ext_list[i] = '.%s' % ext_list[i]
|
||||||
|
|
||||||
|
# we don't want *.py files here because of the way non-*.py files
|
||||||
|
# are handled in make_messages() (they are copied to file.ext.py files to
|
||||||
|
# trick xgettext to parse them as Python files)
|
||||||
|
return set([x for x in ext_list if x != '.py'])
|
||||||
|
|
||||||
|
def make_messages(locale=None, domain='django', verbosity='1', all=False, extensions=None):
|
||||||
"""
|
"""
|
||||||
Uses the locale directory from the Django SVN tree or an application/
|
Uses the locale directory from the Django SVN tree or an application/
|
||||||
project to process all
|
project to process all
|
||||||
|
@ -63,7 +93,8 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False):
|
||||||
all_files.extend([(dirpath, f) for f in filenames])
|
all_files.extend([(dirpath, f) for f in filenames])
|
||||||
all_files.sort()
|
all_files.sort()
|
||||||
for dirpath, file in all_files:
|
for dirpath, file in all_files:
|
||||||
if domain == 'djangojs' and file.endswith('.js'):
|
file_base, file_ext = os.path.splitext(file)
|
||||||
|
if domain == 'djangojs' and file_ext == '.js':
|
||||||
if verbosity > 1:
|
if verbosity > 1:
|
||||||
sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
|
sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
|
||||||
src = open(os.path.join(dirpath, file), "rb").read()
|
src = open(os.path.join(dirpath, file), "rb").read()
|
||||||
|
@ -87,9 +118,9 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False):
|
||||||
if msgs:
|
if msgs:
|
||||||
open(potfile, 'ab').write(msgs)
|
open(potfile, 'ab').write(msgs)
|
||||||
os.unlink(os.path.join(dirpath, thefile))
|
os.unlink(os.path.join(dirpath, thefile))
|
||||||
elif domain == 'django' and (file.endswith('.py') or file.endswith('.html')):
|
elif domain == 'django' and (file_ext == '.py' or file_ext in extensions):
|
||||||
thefile = file
|
thefile = file
|
||||||
if file.endswith('.html'):
|
if file_ext in extensions:
|
||||||
src = open(os.path.join(dirpath, file), "rb").read()
|
src = open(os.path.join(dirpath, file), "rb").read()
|
||||||
thefile = '%s.py' % file
|
thefile = '%s.py' % file
|
||||||
open(os.path.join(dirpath, thefile), "wb").write(templatize(src))
|
open(os.path.join(dirpath, thefile), "wb").write(templatize(src))
|
||||||
|
@ -144,6 +175,9 @@ class Command(BaseCommand):
|
||||||
help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
|
help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
|
||||||
make_option('--all', '-a', action='store_true', dest='all',
|
make_option('--all', '-a', action='store_true', dest='all',
|
||||||
default=False, help='Reexamines all source code and templates for new translation strings and updates all message files for all available languages.'),
|
default=False, help='Reexamines all source code and templates for new translation strings and updates all message files for all available languages.'),
|
||||||
|
make_option('--extension', '-e', dest='extensions',
|
||||||
|
help='The file extension(s) to examine (default: ".html", separate multiple extensions with commas, or use -e multiple times)',
|
||||||
|
action='append'),
|
||||||
)
|
)
|
||||||
help = "Runs over the entire source tree of the current directory and pulls out all strings marked for translation. It creates (or updates) a message file in the conf/locale (in the django tree) or locale (for project and application) directory."
|
help = "Runs over the entire source tree of the current directory and pulls out all strings marked for translation. It creates (or updates) a message file in the conf/locale (in the django tree) or locale (for project and application) directory."
|
||||||
|
|
||||||
|
@ -158,5 +192,14 @@ class Command(BaseCommand):
|
||||||
domain = options.get('domain')
|
domain = options.get('domain')
|
||||||
verbosity = int(options.get('verbosity'))
|
verbosity = int(options.get('verbosity'))
|
||||||
process_all = options.get('all')
|
process_all = options.get('all')
|
||||||
|
extensions = options.get('extensions') or ['html']
|
||||||
|
|
||||||
make_messages(locale, domain, verbosity, process_all)
|
if domain == 'djangojs':
|
||||||
|
extensions = []
|
||||||
|
else:
|
||||||
|
extensions = handle_extensions(extensions)
|
||||||
|
|
||||||
|
if '.js' in extensions:
|
||||||
|
raise CommandError("JavaScript files should be examined by using the special 'djangojs' domain only.")
|
||||||
|
|
||||||
|
make_messages(locale, domain, verbosity, process_all, extensions)
|
||||||
|
|
|
@ -412,6 +412,20 @@ Example usage::
|
||||||
|
|
||||||
django-admin.py makemessages --all
|
django-admin.py makemessages --all
|
||||||
|
|
||||||
|
--extension
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
Use the ``--extension`` or ``-e`` option to specify a list of file extensions
|
||||||
|
to examine (default: ".html").
|
||||||
|
|
||||||
|
Example usage::
|
||||||
|
|
||||||
|
django-admin.py makemessages --locale=de --extension xhtml
|
||||||
|
|
||||||
|
Separate multiple extensions with commas or use -e or --extension multiple times::
|
||||||
|
|
||||||
|
django-admin.py makemessages --locale=de --extension=html,txt --extension xml
|
||||||
|
|
||||||
--locale
|
--locale
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -426,6 +426,21 @@ If run over your project source tree or your application source tree, it will
|
||||||
do the same, but the location of the locale directory is ``locale/LANG/LC_MESSAGES``
|
do the same, but the location of the locale directory is ``locale/LANG/LC_MESSAGES``
|
||||||
(note the missing ``conf`` prefix).
|
(note the missing ``conf`` prefix).
|
||||||
|
|
||||||
|
By default ``django-admin.py makemessages`` examines every file that has the
|
||||||
|
``.html`` file extension. In case you want to override that default, use the
|
||||||
|
``--extension`` or ``-e`` option to specify the file extensions to examine::
|
||||||
|
|
||||||
|
django-admin.py makemessages -l de -e txt
|
||||||
|
|
||||||
|
Separate multiple extensions with commas and/or use ``-e`` or ``--extension`` multiple times::
|
||||||
|
|
||||||
|
django-admin.py makemessages -l=de -e=html,txt -e xml
|
||||||
|
|
||||||
|
When `creating JavaScript translation catalogs`_ you need to use the special
|
||||||
|
'djangojs' domain, **not** ``-e js``.
|
||||||
|
|
||||||
|
.. _create a JavaScript translation catalog: #creating-javascript-translation-catalogs
|
||||||
|
|
||||||
.. admonition:: No gettext?
|
.. admonition:: No gettext?
|
||||||
|
|
||||||
If you don't have the ``gettext`` utilities installed,
|
If you don't have the ``gettext`` utilities installed,
|
||||||
|
|
|
@ -49,7 +49,7 @@ Executes
|
||||||
.B sqlall
|
.B sqlall
|
||||||
for the given app(s) in the current database.
|
for the given app(s) in the current database.
|
||||||
.TP
|
.TP
|
||||||
.BI "makemessages [" "\-\-locale=LOCALE" "] [" "\-\-domain=DOMAIN" "] [" "\-\-all" "]"
|
.BI "makemessages [" "\-\-locale=LOCALE" "] [" "\-\-domain=DOMAIN" "] [" "\-\-extension=EXTENSION" "] [" "\-\-all" "]"
|
||||||
Runs over the entire source tree of the current directory and pulls out all
|
Runs over the entire source tree of the current directory and pulls out all
|
||||||
strings marked for translation. It creates (or updates) a message file in the
|
strings marked for translation. It creates (or updates) a message file in the
|
||||||
conf/locale (in the django tree) or locale (for project and application) directory.
|
conf/locale (in the django tree) or locale (for project and application) directory.
|
||||||
|
@ -154,6 +154,10 @@ The locale to process when using makemessages or compilemessages.
|
||||||
.I \-d, \-\-domain=DOMAIN
|
.I \-d, \-\-domain=DOMAIN
|
||||||
The domain of the message files (default: "django") when using makemessages.
|
The domain of the message files (default: "django") when using makemessages.
|
||||||
.TP
|
.TP
|
||||||
|
.I \-e, \-\-extension=EXTENSION
|
||||||
|
The file extension(s) to examine (default: ".html", separate multiple
|
||||||
|
extensions with commas, or use -e multiple times).
|
||||||
|
.TP
|
||||||
.I \-a, \-\-all
|
.I \-a, \-\-all
|
||||||
Process all available locales when using makemessages.
|
Process all available locales when using makemessages.
|
||||||
.SH "ENVIRONMENT"
|
.SH "ENVIRONMENT"
|
||||||
|
|
Loading…
Reference in New Issue