Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / babeljs.py @ af2a766f

History | View | Annotate | Download (4.24 KB)

1
# -*- 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
            if isinstance(self.domain, list):
42
                domains = self.domain
43
            else:
44
                domains = [self.domain]
45

    
46
            if not self.input_file:
47
                if self.locale:
48
                    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
                else:
54
                    for locale in os.listdir(self.directory):
55
                        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
            else:
62
                po_files.append( (self.locale, self.input_file) )
63
                if self.output_file:
64
                    js_files.append(self.output_file)
65
                else:
66
                    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

    
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()