Projet

Général

Profil

0001-i18n-add-translate-template-filter-71590.patch

Frédéric Péters, 26 décembre 2022 16:18

Télécharger (5,3 ko)

Voir les différences:

Subject: [PATCH 1/6] i18n: add |translate template filter (#71590)

 tests/test_i18n.py                | 41 +++++++++++++++++++++++++++++++
 wcs/qommon/publisher.py           | 34 ++++++++++++++++++++++---
 wcs/qommon/templatetags/qommon.py |  5 ++++
 3 files changed, 77 insertions(+), 3 deletions(-)
tests/test_i18n.py
4 4

  
5 5
from wcs import sql
6 6
from wcs.i18n import TranslatableMessage
7
from wcs.qommon.template import Template
7 8

  
8 9
from .test_sql import column_exists_in_table
9 10
from .utilities import clean_temporary_pub, create_temporary_pub, get_app
......
74 75

  
75 76
    catalog = TranslatableMessage.load_as_catalog('fr')
76 77
    assert catalog == {(None, 'string 1'): 'chaine 1', (None, 'string 2'): 'chaine 2'}
78

  
79

  
80
def test_translate_template_tag(pub):
81
    pub.cfg['language'] = {'language': 'en', 'multilinguism': True, 'languages': ['fr', 'en']}
82
    pub.write_cfg()
83
    TranslatableMessage.do_table()
84
    TranslatableMessage.wipe()
85

  
86
    msg = TranslatableMessage()
87
    msg.string = 'string 1'
88
    msg.string_fr = 'chaine 1'
89
    msg.store()
90

  
91
    tmpl1 = Template('{{ "string 1"|translate }}')
92
    tmpl2 = Template('{{ "string 2"|translate }}')
93
    assert tmpl1.render() == 'string 1'
94
    assert tmpl2.render() == 'string 2'
95
    assert TranslatableMessage.count() == 1
96
    with pub.with_language('fr'):
97
        assert tmpl1.render() == 'chaine 1'
98
        assert tmpl2.render() == 'string 2'
99
        assert TranslatableMessage.count() == 2  # string 2 has been added to catalog
100

  
101
        # check it's not added a second time
102
        del pub._i18n_catalog['fr']
103
        assert tmpl2.render() == 'string 2'
104
        assert TranslatableMessage.count() == 2
105

  
106
    # test context
107
    tmpl3 = Template('{{ "string 1"|translate:"plop" }}')
108
    assert tmpl3.render() == 'string 1'
109
    with pub.with_language('fr'):
110
        assert tmpl3.render() == 'string 1'
111
        assert TranslatableMessage.count() == 3  # added to catalog
112

  
113
        msg = TranslatableMessage.select([sql.Equal('string', 'string 1'), sql.Equal('context', 'plop')])[0]
114
        msg.string_fr = 'alt chaine 1'
115
        msg.store()
116
        del pub._i18n_catalog['fr']
117
        assert tmpl3.render() == 'alt chaine 1'
wcs/qommon/publisher.py
383 383
            yield
384 384
            self.activate_language(current_language, request=self.get_request())
385 385

  
386
    def translate(self, string, context=None):
386
    def is_using_default_language(self):
387
        if not (self.has_i18n_enabled() and self.current_language):
388
            return True
389
        return bool(self.cfg.get('language', {}).get('language') == self.current_language)
390

  
391
    def translate(self, string, context=None, register=False):
387 392
        if type(string).__name__ == '__proxy__':  # lazy gettext
388 393
            return str(string)
389 394
        if not self.has_i18n_enabled():
390 395
            return string
391 396
        string = str(string)  # unlazy
392
        if self.current_language and self.cfg.get('language', {}).get('language') != self.current_language:
393
            return self._i18n_catalog[self.current_language].get((context, string.strip())) or string
397
        if not self.is_using_default_language():
398
            from wcs.i18n import TranslatableMessage
399

  
400
            string = string.strip()
401
            if self.current_language not in self._i18n_catalog:
402
                self._i18n_catalog[self.current_language] = TranslatableMessage.load_as_catalog(
403
                    self.current_language
404
                )
405
            catalog_string = self._i18n_catalog[self.current_language].get((context, string))
406
            if register and not catalog_string:
407
                from wcs.sql import Equal, Null
408

  
409
                criteria = [Equal('string', string)]
410
                if context:
411
                    criteria.append(Equal('context', context))
412
                else:
413
                    criteria.append(Null('context'))
414
                msgs = TranslatableMessage.exists(criteria)
415
                if not msgs:
416
                    msg = TranslatableMessage()
417
                    msg.context = context
418
                    msg.string = string
419
                    msg.locations = []
420
                    msg.store()
421
            return catalog_string or string
394 422
        return string
395 423

  
396 424
    def load_site_options(self):
wcs/qommon/templatetags/qommon.py
1048 1048
    allowed_tags = [t.strip() for t in allowed_tags]
1049 1049
    allowed_tags = [t for t in allowed_tags if t]
1050 1050
    return strip_some_tags(unlazy(value), allowed_tags)
1051

  
1052

  
1053
@register.filter(is_safe=True)
1054
def translate(string, context=None):
1055
    return get_publisher().translate(string, context=context, register=True)
1051
-