Code

Ticket #17181: multiple_locales_and_domains.diff

File multiple_locales_and_domains.diff, 20.1 KB (added by aminland, 2 years ago)
Line 
1diff --git a/django/core/management/commands/compilemessages.py b/django/core/management/commands/compilemessages.py
2index b5eaeb1..17ddd17 100644
3--- a/django/core/management/commands/compilemessages.py
4+++ b/django/core/management/commands/compilemessages.py
5@@ -24,34 +24,37 @@ def compile_messages(stderr, locale=None):
6         raise CommandError("This script should be run from the Django SVN tree or your project or app tree, or with the settings module specified.")
7 
8     for basedir in basedirs:
9+        dirs = [basedir]
10         if locale:
11-            basedir = os.path.join(basedir, locale, 'LC_MESSAGES')
12-        for dirpath, dirnames, filenames in os.walk(basedir):
13-            for f in filenames:
14-                if f.endswith('.po'):
15-                    stderr.write('processing file %s in %s\n' % (f, dirpath))
16-                    fn = os.path.join(dirpath, f)
17-                    if has_bom(fn):
18-                        raise CommandError("The %s file has a BOM (Byte Order Mark). Django only supports .po files encoded in UTF-8 and without any BOM." % fn)
19-                    pf = os.path.splitext(fn)[0]
20-                    # Store the names of the .mo and .po files in an environment
21-                    # variable, rather than doing a string replacement into the
22-                    # command, so that we can take advantage of shell quoting, to
23-                    # quote any malicious characters/escaping.
24-                    # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
25-                    os.environ['djangocompilemo'] = pf + '.mo'
26-                    os.environ['djangocompilepo'] = pf + '.po'
27-                    if sys.platform == 'win32': # Different shell-variable syntax
28-                        cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
29-                    else:
30-                        cmd = 'msgfmt --check-format -o "$djangocompilemo" "$djangocompilepo"'
31-                    os.system(cmd)
32+            dirs = [os.path.join(basedir, l, 'LC_MESSAGES') for l in (locale if isinstance(locale, list) else [locale])]
33+           
34+        for dir in dirs:
35+            for dirpath, dirnames, filenames in os.walk(dir):
36+                for f in filenames:
37+                    if f.endswith('.po'):
38+                        stderr.write('processing file %s in %s\n' % (f, dirpath))
39+                        fn = os.path.join(dirpath, f)
40+                        if has_bom(fn):
41+                            raise CommandError("The %s file has a BOM (Byte Order Mark). Django only supports .po files encoded in UTF-8 and without any BOM." % fn)
42+                        pf = os.path.splitext(fn)[0]
43+                        # Store the names of the .mo and .po files in an environment
44+                        # variable, rather than doing a string replacement into the
45+                        # command, so that we can take advantage of shell quoting, to
46+                        # quote any malicious characters/escaping.
47+                        # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
48+                        os.environ['djangocompilemo'] = pf + '.mo'
49+                        os.environ['djangocompilepo'] = pf + '.po'
50+                        if sys.platform == 'win32': # Different shell-variable syntax
51+                            cmd = 'msgfmt --check-format -o "%djangocompilemo%" "%djangocompilepo%"'
52+                        else:
53+                            cmd = 'msgfmt --check-format -o "$djangocompilemo" "$djangocompilepo"'
54+                        os.system(cmd)
55 
56 
57 class Command(BaseCommand):
58     option_list = BaseCommand.option_list + (
59-        make_option('--locale', '-l', dest='locale',
60-            help='The locale to process. Default is to process all.'),
61+        make_option('--locale', '-l', dest='locale', action="append",
62+            help='A locale to process. Default is to process all.'),
63     )
64     help = 'Compiles .po files to .mo files for use with builtin gettext support.'
65 
66diff --git a/django/core/management/commands/makemessages.py b/django/core/management/commands/makemessages.py
67old mode 100755
68new mode 100644
69index 9d0dc68..9761bb3
70--- a/django/core/management/commands/makemessages.py
71+++ b/django/core/management/commands/makemessages.py
72@@ -141,10 +141,15 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False,
73     else:
74         raise CommandError("This script should be run from the Django SVN tree or your project or app tree. If you did indeed run it from the SVN checkout or your project or application, maybe you are just missing the conf/locale (in the django tree) or locale (for project and application) directory? It is not created automatically, you have to create it by hand if you want to enable i18n for your project or application.")
75 
76-    if domain not in ('django', 'djangojs'):
77+    if domain is None:
78+           domains = ['django']
79+    else:
80+        domains = [domain] if not isinstance(domain, list) else domain
81+
82+    if any(d not in ('django', 'djangojs') for d in domains):
83         raise CommandError("currently makemessages only supports domains 'django' and 'djangojs'")
84 
85-    if (locale is None and not all) or domain is None:
86+    if (locale is None and not all) or not domains:
87         message = "Type '%s help %s' for usage information." % (os.path.basename(sys.argv[0]), sys.argv[1])
88         raise CommandError(message)
89 
90@@ -158,162 +163,162 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False,
91 
92     languages = []
93     if locale is not None:
94-        languages.append(locale)
95+        languages += [locale] if not isinstance(locale, list) else locale
96     elif all:
97         locale_dirs = filter(os.path.isdir, glob.glob('%s/*' % localedir))
98         languages = [os.path.basename(l) for l in locale_dirs]
99 
100     wrap = no_wrap and '--no-wrap' or ''
101-
102-    for locale in languages:
103-        if verbosity > 0:
104-            print "processing language", locale
105-        basedir = os.path.join(localedir, locale, 'LC_MESSAGES')
106-        if not os.path.isdir(basedir):
107-            os.makedirs(basedir)
108-
109-        pofile = os.path.join(basedir, '%s.po' % domain)
110-        potfile = os.path.join(basedir, '%s.pot' % domain)
111-
112-        if os.path.exists(potfile):
113-            os.unlink(potfile)
114-
115-        for dirpath, file in find_files(".", ignore_patterns, verbosity, symlinks=symlinks):
116-            file_base, file_ext = os.path.splitext(file)
117-            if domain == 'djangojs' and file_ext in extensions:
118-                if verbosity > 1:
119-                    sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
120-                src = open(os.path.join(dirpath, file), "rU").read()
121-                src = pythonize_re.sub('\n#', src)
122-                thefile = '%s.py' % file
123-                f = open(os.path.join(dirpath, thefile), "w")
124-                try:
125-                    f.write(src)
126-                finally:
127-                    f.close()
128-                cmd = (
129-                    'xgettext -d %s -L Perl %s --keyword=gettext_noop '
130-                    '--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 '
131-                    '--keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 '
132-                    '--from-code UTF-8 --add-comments=Translators -o - "%s"' % (
133-                        domain, wrap, os.path.join(dirpath, thefile)
134-                    )
135-                )
136-                msgs, errors = _popen(cmd)
137-                if errors:
138-                    os.unlink(os.path.join(dirpath, thefile))
139-                    if os.path.exists(potfile):
140-                        os.unlink(potfile)
141-                    raise CommandError(
142-                        "errors happened while running xgettext on %s\n%s" %
143-                        (file, errors))
144-                if msgs:
145-                    old = '#: ' + os.path.join(dirpath, thefile)[2:]
146-                    new = '#: ' + os.path.join(dirpath, file)[2:]
147-                    msgs = msgs.replace(old, new)
148-                    if os.path.exists(potfile):
149-                        # Strip the header
150-                        msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
151-                    else:
152-                        msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
153-                    f = open(potfile, 'ab')
154-                    try:
155-                        f.write(msgs)
156-                    finally:
157-                        f.close()
158-                os.unlink(os.path.join(dirpath, thefile))
159-            elif domain == 'django' and (file_ext == '.py' or file_ext in extensions):
160-                thefile = file
161-                orig_file = os.path.join(dirpath, file)
162-                if file_ext in extensions:
163-                    src = open(orig_file, "rU").read()
164+    for domain in domains:
165+        for locale in languages:
166+            if verbosity > 0:
167+                print "processing domain %s for language %s" % (domain, locale)
168+            basedir = os.path.join(localedir, locale, 'LC_MESSAGES')
169+            if not os.path.isdir(basedir):
170+                os.makedirs(basedir)
171+   
172+            pofile = os.path.join(basedir, '%s.po' % domain)
173+            potfile = os.path.join(basedir, '%s.pot' % domain)
174+   
175+            if os.path.exists(potfile):
176+                os.unlink(potfile)
177+   
178+            for dirpath, file in find_files(".", ignore_patterns, verbosity, symlinks=symlinks):
179+                file_base, file_ext = os.path.splitext(file)
180+                if domain == 'djangojs' and file_ext in extensions:
181+                    if verbosity > 1:
182+                        sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
183+                    src = open(os.path.join(dirpath, file), "rU").read()
184+                    src = pythonize_re.sub('\n#', src)
185                     thefile = '%s.py' % file
186                     f = open(os.path.join(dirpath, thefile), "w")
187                     try:
188-                        f.write(templatize(src, orig_file[2:]))
189+                        f.write(src)
190                     finally:
191                         f.close()
192-                if verbosity > 1:
193-                    sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
194-                cmd = (
195-                    'xgettext -d %s -L Python %s --keyword=gettext_noop '
196-                    '--keyword=gettext_lazy --keyword=__ --keyword=ngettext_lazy:1,2 '
197-                    '--keyword=ugettext_noop --keyword=ugettext_lazy '
198-                    '--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 '
199-                    '--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 '
200-                    '--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 '
201-                    '--add-comments=Translators -o - "%s"' % (
202-                        domain, wrap, os.path.join(dirpath, thefile))
203-                )
204-                msgs, errors = _popen(cmd)
205-                if errors:
206-                    if thefile != file:
207+                    cmd = (
208+                        'xgettext -d %s -L Perl %s --keyword=gettext_noop '
209+                        '--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 '
210+                        '--keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 '
211+                        '--from-code UTF-8 --add-comments=Translators -o - "%s"' % (
212+                            domain, wrap, os.path.join(dirpath, thefile)
213+                        )
214+                    )
215+                    msgs, errors = _popen(cmd)
216+                    if errors:
217                         os.unlink(os.path.join(dirpath, thefile))
218-                    if os.path.exists(potfile):
219-                        os.unlink(potfile)
220-                    raise CommandError(
221-                        "errors happened while running xgettext on %s\n%s" %
222-                        (file, errors))
223-                if msgs:
224-                    if thefile != file:
225+                        if os.path.exists(potfile):
226+                            os.unlink(potfile)
227+                        raise CommandError(
228+                            "errors happened while running xgettext on %s\n%s" %
229+                            (file, errors))
230+                    if msgs:
231                         old = '#: ' + os.path.join(dirpath, thefile)[2:]
232-                        new = '#: ' + orig_file[2:]
233+                        new = '#: ' + os.path.join(dirpath, file)[2:]
234                         msgs = msgs.replace(old, new)
235-                    if os.path.exists(potfile):
236-                        # Strip the header
237-                        msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
238-                    else:
239-                        msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
240-                    f = open(potfile, 'ab')
241+                        if os.path.exists(potfile):
242+                            # Strip the header
243+                            msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
244+                        else:
245+                            msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
246+                        f = open(potfile, 'ab')
247+                        try:
248+                            f.write(msgs)
249+                        finally:
250+                            f.close()
251+                    os.unlink(os.path.join(dirpath, thefile))
252+                elif domain == 'django' and (file_ext == '.py' or file_ext in extensions):
253+                    thefile = file
254+                    orig_file = os.path.join(dirpath, file)
255+                    if file_ext in extensions:
256+                        src = open(orig_file, "rU").read()
257+                        thefile = '%s.py' % file
258+                        f = open(os.path.join(dirpath, thefile), "w")
259+                        try:
260+                            f.write(templatize(src, orig_file[2:]))
261+                        finally:
262+                            f.close()
263+                    if verbosity > 1:
264+                        sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
265+                    cmd = (
266+                        'xgettext -d %s -L Python %s --keyword=gettext_noop '
267+                        '--keyword=gettext_lazy --keyword=__ --keyword=ngettext_lazy:1,2 '
268+                        '--keyword=ugettext_noop --keyword=ugettext_lazy '
269+                        '--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 '
270+                        '--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 '
271+                        '--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 '
272+                        '--add-comments=Translators -o - "%s"' % (
273+                            domain, wrap, os.path.join(dirpath, thefile))
274+                    )
275+                    msgs, errors = _popen(cmd)
276+                    if errors:
277+                        if thefile != file:
278+                            os.unlink(os.path.join(dirpath, thefile))
279+                        if os.path.exists(potfile):
280+                            os.unlink(potfile)
281+                        raise CommandError(
282+                            "errors happened while running xgettext on %s\n%s" %
283+                            (file, errors))
284+                    if msgs:
285+                        if thefile != file:
286+                            old = '#: ' + os.path.join(dirpath, thefile)[2:]
287+                            new = '#: ' + orig_file[2:]
288+                            msgs = msgs.replace(old, new)
289+                        if os.path.exists(potfile):
290+                            # Strip the header
291+                            msgs = '\n'.join(dropwhile(len, msgs.split('\n')))
292+                        else:
293+                            msgs = msgs.replace('charset=CHARSET', 'charset=UTF-8')
294+                        f = open(potfile, 'ab')
295+                        try:
296+                            f.write(msgs)
297+                        finally:
298+                            f.close()
299+                    if thefile != file:
300+                        os.unlink(os.path.join(dirpath, thefile))
301+   
302+            if os.path.exists(potfile):
303+                msgs, errors = _popen('msguniq %s --to-code=utf-8 "%s"' %
304+                                      (wrap, potfile))
305+                if errors:
306+                    os.unlink(potfile)
307+                    raise CommandError(
308+                        "errors happened while running msguniq\n%s" % errors)
309+                if os.path.exists(pofile):
310+                    f = open(potfile, 'w')
311                     try:
312                         f.write(msgs)
313                     finally:
314                         f.close()
315-                if thefile != file:
316-                    os.unlink(os.path.join(dirpath, thefile))
317-
318-        if os.path.exists(potfile):
319-            msgs, errors = _popen('msguniq %s --to-code=utf-8 "%s"' %
320-                                  (wrap, potfile))
321-            if errors:
322-                os.unlink(potfile)
323-                raise CommandError(
324-                    "errors happened while running msguniq\n%s" % errors)
325-            if os.path.exists(pofile):
326-                f = open(potfile, 'w')
327+                    msgs, errors = _popen('msgmerge %s -q "%s" "%s"' %
328+                                          (wrap, pofile, potfile))
329+                    if errors:
330+                        os.unlink(potfile)
331+                        raise CommandError(
332+                            "errors happened while running msgmerge\n%s" % errors)
333+                elif not invoked_for_django:
334+                    msgs = copy_plural_forms(msgs, locale, domain, verbosity)
335+                msgs = msgs.replace(
336+                    "#. #-#-#-#-#  %s.pot (PACKAGE VERSION)  #-#-#-#-#\n" % domain, "")
337+                f = open(pofile, 'wb')
338                 try:
339                     f.write(msgs)
340                 finally:
341                     f.close()
342-                msgs, errors = _popen('msgmerge %s -q "%s" "%s"' %
343-                                      (wrap, pofile, potfile))
344-                if errors:
345-                    os.unlink(potfile)
346-                    raise CommandError(
347-                        "errors happened while running msgmerge\n%s" % errors)
348-            elif not invoked_for_django:
349-                msgs = copy_plural_forms(msgs, locale, domain, verbosity)
350-            msgs = msgs.replace(
351-                "#. #-#-#-#-#  %s.pot (PACKAGE VERSION)  #-#-#-#-#\n" % domain, "")
352-            f = open(pofile, 'wb')
353-            try:
354-                f.write(msgs)
355-            finally:
356-                f.close()
357-            os.unlink(potfile)
358-            if no_obsolete:
359-                msgs, errors = _popen('msgattrib %s -o "%s" --no-obsolete "%s"' %
360-                                      (wrap, pofile, pofile))
361-                if errors:
362-                    raise CommandError(
363-                        "errors happened while running msgattrib\n%s" % errors)
364+                os.unlink(potfile)
365+                if no_obsolete:
366+                    msgs, errors = _popen('msgattrib %s -o "%s" --no-obsolete "%s"' %
367+                                          (wrap, pofile, pofile))
368+                    if errors:
369+                        raise CommandError(
370+                            "errors happened while running msgattrib\n%s" % errors)
371 
372 
373 class Command(NoArgsCommand):
374     option_list = NoArgsCommand.option_list + (
375-        make_option('--locale', '-l', default=None, dest='locale',
376+        make_option('--locale', '-l', default=None, dest='locale', action="append",
377             help='Creates or updates the message files for the given locale (e.g. pt_BR).'),
378-        make_option('--domain', '-d', default='django', dest='domain',
379+        make_option('--domain', '-d', default=None, dest='domain', action="append",
380             help='The domain of the message files (default: "django").'),
381         make_option('--all', '-a', action='store_true', dest='all',
382             default=False, help='Updates the message files for all existing locales.'),