Project

General

Profile

Revision c6e081ce

IDc6e081cec229e1399093f5b5f79964154405eced
Parent d6ec920c
Child f6ecd27a

Added by Francois POIROTTE over 6 years ago

[#1721] Fusion traductions du thème et de l'appli

Change-Id: I1ac312bd3fc2deefd0a4ba9015189b3830d18748
Refs: #1721

View differences:

MANIFEST.in
12 12
graft vigiboard/public
13 13
include *.ini
14 14
include jsl.cfg
15
include babeljs.py
16 15
include app_cfg.py
babeljs.py
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()
setup.py
25 25

  
26 26
cmdclass = {}
27 27
try:
28
    from babeljs import compile_catalog_plusjs
28
    from buildenv.babeljs import compile_catalog_plusjs
29 29
except ImportError:
30 30
    pass
31 31
else:
vigiboard/controllers/root.py
261 261
            localedir = os.path.join(conf['paths']['root'], 'i18n')
262 262

  
263 263
        lang = get_lang()
264
        modules = (
265
            (conf['package'].__name__, localedir),
266
            ('vigilo-themes', resource_filename('vigilo.themes.i18n', '')),
267
        )
264 268

  
265
        # Localise le fichier *.mo actuellement chargé
266
        # et génère le chemin jusqu'au *.js correspondant.
267
        filename = gettext.find(conf['package'].__name__, localedir,
268
            languages=lang)
269
        js = filename[:-3] + '.js'
270

  
271
        themes_filename = gettext.find(
272
            'vigilo-themes',
273
            resource_filename('vigilo.themes.i18n', ''),
274
            languages=lang)
275
        themes_js = themes_filename[:-3] + '.js'
276

  
277
        # Récupère et envoie le contenu du fichier de traduction *.js.
278
        fhandle = open(js, 'r')
279
        translations = fhandle.read()
280
        fhandle.close()
281

  
282
        fhandle = open(themes_js, 'r')
283
        translations += fhandle.read()
284
        fhandle.close()
269
        # Charge et installe le fichier JS de traduction de chaque module
270
        translations = "babel.Translations.load("
271
        for domain, directory in modules:
272
            try:
273
                mofile = gettext.find(domain, directory, languages=lang)
274
                if mofile is None:
275
                    continue
276

  
277
                fhandle = open(mofile[:-3] + '.js', 'r')
278
                translations += fhandle.read()
279
                fhandle.close()
280
                translations += ").load("
281
            except ImportError:
282
                pass
283
        translations += "{}).install()"
285 284

  
286 285
        response.headers['Content-Type'] = 'text/javascript; charset=utf-8'
287 286
        return translations

Also available in: Unified diff