8 | | |
9 | | Below is the complete code of get_javascript_catalog modified, if there are no issues with this change I would like to do a pull request for it. |
10 | | |
11 | | |
12 | | {{{ |
13 | | def get_javascript_catalog(locale, domain, packages): |
14 | | default_locale = to_locale(settings.LANGUAGE_CODE) |
15 | | app_configs = apps.get_app_configs() |
16 | | allowable_packages = set(app_config.name for app_config in app_configs) |
17 | | allowable_packages.update(DEFAULT_PACKAGES) |
18 | | packages = [p for p in packages if p in allowable_packages] |
19 | | t = {} |
20 | | paths = [] |
21 | | |
22 | | # paths of requested packages |
23 | | for package in packages: |
24 | | p = importlib.import_module(package) |
25 | | path = os.path.join(os.path.dirname(upath(p.__file__)), 'locale') |
26 | | paths.append(path) |
27 | | # add the filesystem paths listed in the LOCALE_PATHS setting |
28 | | paths.extend(reversed(settings.LOCALE_PATHS)) |
29 | | |
30 | | # First load the settings.LANGUAGE_CODE translations as fallback |
31 | | for path in paths: |
32 | | try: |
33 | | catalog = gettext_module.translation(domain, path, [default_locale]) |
34 | | except IOError: |
35 | | catalog = None |
36 | | if catalog is not None: |
37 | | t.update(catalog._catalog) |
38 | | |
39 | | # finally load the currently selected language, if it isn't identical to the default. |
40 | | if locale != default_locale: |
41 | | for path in paths: |
42 | | try: |
43 | | catalog = gettext_module.translation(domain, path, [locale]) |
44 | | except IOError: |
45 | | catalog = None |
46 | | if catalog is not None: |
47 | | t.update(catalog._catalog) |
48 | | |
49 | | plural = None |
50 | | if '' in t: |
51 | | for l in t[''].split('\n'): |
52 | | if l.startswith('Plural-Forms:'): |
53 | | plural = l.split(':', 1)[1].strip() |
54 | | |
55 | | #This is to prevent the unnecessary if condition on the below for loop. |
56 | | del t[''] |
57 | | |
58 | | if plural is not None: |
59 | | # this should actually be a compiled function of a typical plural-form: |
60 | | # Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : |
61 | | # n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; |
62 | | plural = [el.strip() for el in plural.split(';') if el.strip().startswith('plural=')][0].split('=', 1)[1] |
63 | | |
64 | | pdict = {} |
65 | | maxcnts = {} |
66 | | catalog = {} |
67 | | for k, v in t.items(): |
68 | | if isinstance(k, six.string_types): |
69 | | catalog[k] = v |
70 | | elif isinstance(k, tuple): |
71 | | msgid = k[0] |
72 | | cnt = k[1] |
73 | | maxcnts[msgid] = max(cnt, maxcnts.get(msgid, 0)) |
74 | | pdict.setdefault(msgid, {})[cnt] = v |
75 | | else: |
76 | | raise TypeError(k) |
77 | | for k, v in pdict.items(): |
78 | | catalog[k] = [v.get(i, '') for i in range(maxcnts[msgid] + 1)] |
79 | | |
80 | | return catalog, plural |
81 | | }}} |