vigigraph / babeljs.py @ a51531ed
History | View | Annotate | Download (4.24 KB)
1 | 7c9baa43 | Francois POIROTTE | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | """
|
||
3 | Provides a class derived from Babel's compile_catalog
|
||
4 | which automatically creates JavaScript files compatible
|
||
5 | with Babel's JavaScript frontend.
|
||
6 |
|
||
7 | This code was taken from:
|
||
8 | http://svn.python.org/projects/doctools/trunk/setup.py
|
||
9 |
|
||
10 | And generates files for use with:
|
||
11 | http://babel.edgewall.org/browser/trunk/contrib/babel.js
|
||
12 | """
|
||
13 | try:
|
||
14 | from babel.messages.pofile import read_po |
||
15 | from babel.messages.frontend import compile_catalog |
||
16 | try:
|
||
17 | from simplejson import dump |
||
18 | except ImportError: |
||
19 | from json import dump |
||
20 | except ImportError: |
||
21 | pass
|
||
22 | else:
|
||
23 | import os |
||
24 | from distutils import log |
||
25 | |||
26 | class compile_catalog_plusjs(compile_catalog): |
||
27 | """
|
||
28 | An extended command that writes all message strings that occur in
|
||
29 | JavaScript files to a JavaScript file along with the .mo file.
|
||
30 |
|
||
31 | Unfortunately, babel's setup command isn't built very extensible, so
|
||
32 | most of the run() code is duplicated here.
|
||
33 | """
|
||
34 | |||
35 | def run(self): |
||
36 | compile_catalog.run(self)
|
||
37 | |||
38 | po_files = [] |
||
39 | js_files = [] |
||
40 | |||
41 | dce2dfcd | Francois POIROTTE | if isinstance(self.domain, list): |
42 | domains = self.domain
|
||
43 | else:
|
||
44 | domains = [self.domain]
|
||
45 | |||
46 | 7c9baa43 | Francois POIROTTE | if not self.input_file: |
47 | if self.locale: |
||
48 | dce2dfcd | Francois POIROTTE | for domain in domains: |
49 | basename = os.path.join(self.directory, self.locale, |
||
50 | 'LC_MESSAGES', domain)
|
||
51 | po_files.append( (self.locale, basename + '.po') ) |
||
52 | js_files.append( basename + '.js')
|
||
53 | 7c9baa43 | Francois POIROTTE | else:
|
54 | for locale in os.listdir(self.directory): |
||
55 | dce2dfcd | Francois POIROTTE | for domain in domains: |
56 | basename = os.path.join(self.directory, locale,
|
||
57 | 'LC_MESSAGES', domain)
|
||
58 | if os.path.exists(basename + '.po'): |
||
59 | po_files.append( (locale, basename + '.po') )
|
||
60 | js_files.append(basename + '.js')
|
||
61 | 7c9baa43 | Francois POIROTTE | else:
|
62 | dce2dfcd | Francois POIROTTE | po_files.append( (self.locale, self.input_file) ) |
63 | 7c9baa43 | Francois POIROTTE | if self.output_file: |
64 | js_files.append(self.output_file)
|
||
65 | else:
|
||
66 | dce2dfcd | Francois POIROTTE | for domain in domains: |
67 | js_files.append(os.path.join( |
||
68 | self.directory,
|
||
69 | self.locale,
|
||
70 | 'LC_MESSAGES',
|
||
71 | domain + '.js'
|
||
72 | )) |
||
73 | 7c9baa43 | Francois POIROTTE | |
74 | for js_file, (locale, po_file) in zip(js_files, po_files): |
||
75 | infile = open(po_file, 'r') |
||
76 | try:
|
||
77 | catalog = read_po(infile, locale) |
||
78 | finally:
|
||
79 | infile.close() |
||
80 | |||
81 | if catalog.fuzzy and not self.use_fuzzy: |
||
82 | continue
|
||
83 | |||
84 | log.info('writing JavaScript strings in catalog %r to %r',
|
||
85 | po_file, js_file) |
||
86 | |||
87 | jscatalog = {} |
||
88 | for message in catalog: |
||
89 | # Si le message n'a pas encore été traduit,
|
||
90 | # on ne l'ajoute pas. Le message d'origine
|
||
91 | # (non traduit) sera renvoyé.
|
||
92 | if not message.string: |
||
93 | continue
|
||
94 | |||
95 | # On n'ajoute le message au fichier de traduction JS
|
||
96 | # auto-généré que si le message est utilisé dans du
|
||
97 | # code JavaScript.
|
||
98 | if any(x[0].endswith('.js') for x in message.locations): |
||
99 | msgid = message.id |
||
100 | if isinstance(msgid, (list, tuple)): |
||
101 | msgid = msgid[0]
|
||
102 | jscatalog[msgid] = message.string |
||
103 | |||
104 | outfile = open(js_file, 'wb') |
||
105 | try:
|
||
106 | outfile.write('babel.Translations.load(');
|
||
107 | dump(dict(
|
||
108 | messages=jscatalog, |
||
109 | plural_expr=catalog.plural_expr, |
||
110 | locale=str(catalog.locale)
|
||
111 | ), outfile) |
||
112 | outfile.write(').install();')
|
||
113 | finally:
|
||
114 | outfile.close() |