diff options
author | Maurits van Rees <maurits@vanrees.org> | 2021-09-02 15:28:05 +0200 |
---|---|---|
committer | Maurits van Rees <maurits@vanrees.org> | 2021-09-03 10:57:00 +0200 |
commit | 61c9e278c82f44c76cc55f7c850f661f4e22103d (patch) | |
tree | 0dd3a6bbab73a7b8aab4fe20ee262a4c65c7a9fa /src | |
parent | 51480fc597fa04b2a044b873605cb114efacf9f6 (diff) | |
download | zope-i18n-61c9e278c82f44c76cc55f7c850f661f4e22103d.tar.gz |
Support character sets.maurits/character-sets-autopep8
sr@Latn and sr@Cyrl will be added to language sr.
See https://github.com/collective/plone.app.locales/issues/326
Diffstat (limited to 'src')
-rw-r--r-- | src/zope/i18n/tests/sr-default.mo | bin | 0 -> 328 bytes | |||
-rw-r--r-- | src/zope/i18n/tests/sr-default.po | 12 | ||||
-rw-r--r-- | src/zope/i18n/tests/sr@Cyrl-default.mo | bin | 0 -> 324 bytes | |||
-rw-r--r-- | src/zope/i18n/tests/sr@Cyrl-default.po | 12 | ||||
-rw-r--r-- | src/zope/i18n/tests/sr@Latn-default.mo | bin | 0 -> 325 bytes | |||
-rw-r--r-- | src/zope/i18n/tests/sr@Latn-default.po | 12 | ||||
-rw-r--r-- | src/zope/i18n/tests/test_translationdomain.py | 71 | ||||
-rw-r--r-- | src/zope/i18n/translationdomain.py | 5 |
8 files changed, 112 insertions, 0 deletions
diff --git a/src/zope/i18n/tests/sr-default.mo b/src/zope/i18n/tests/sr-default.mo Binary files differnew file mode 100644 index 0000000..28aba76 --- /dev/null +++ b/src/zope/i18n/tests/sr-default.mo diff --git a/src/zope/i18n/tests/sr-default.po b/src/zope/i18n/tests/sr-default.po new file mode 100644 index 0000000..c8366f2 --- /dev/null +++ b/src/zope/i18n/tests/sr-default.po @@ -0,0 +1,12 @@ +msgid "" +msgstr "" +"Project-Id-Version: Zope 5\n" +"PO-Revision-Date: 2021/09/02\n" +"Last-Translator: Zope 3 contributors\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "short_greeting" +msgstr "Hello in Serbian Standard!" diff --git a/src/zope/i18n/tests/sr@Cyrl-default.mo b/src/zope/i18n/tests/sr@Cyrl-default.mo Binary files differnew file mode 100644 index 0000000..fef8012 --- /dev/null +++ b/src/zope/i18n/tests/sr@Cyrl-default.mo diff --git a/src/zope/i18n/tests/sr@Cyrl-default.po b/src/zope/i18n/tests/sr@Cyrl-default.po new file mode 100644 index 0000000..7ffcaf7 --- /dev/null +++ b/src/zope/i18n/tests/sr@Cyrl-default.po @@ -0,0 +1,12 @@ +msgid "" +msgstr "" +"Project-Id-Version: Zope 5\n" +"PO-Revision-Date: 2021/09/02\n" +"Last-Translator: Zope 3 contributors\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "short_greeting" +msgstr "Hello in српски!" diff --git a/src/zope/i18n/tests/sr@Latn-default.mo b/src/zope/i18n/tests/sr@Latn-default.mo Binary files differnew file mode 100644 index 0000000..51173d7 --- /dev/null +++ b/src/zope/i18n/tests/sr@Latn-default.mo diff --git a/src/zope/i18n/tests/sr@Latn-default.po b/src/zope/i18n/tests/sr@Latn-default.po new file mode 100644 index 0000000..65b1c97 --- /dev/null +++ b/src/zope/i18n/tests/sr@Latn-default.po @@ -0,0 +1,12 @@ +msgid "" +msgstr "" +"Project-Id-Version: Zope 5\n" +"PO-Revision-Date: 2021/09/02\n" +"Last-Translator: Zope 3 contributors\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +msgid "short_greeting" +msgstr "Hello in Serbian Latin!" diff --git a/src/zope/i18n/tests/test_translationdomain.py b/src/zope/i18n/tests/test_translationdomain.py index 550ec85..5d55156 100644 --- a/src/zope/i18n/tests/test_translationdomain.py +++ b/src/zope/i18n/tests/test_translationdomain.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ############################################################################## # # Copyright (c) 2001-2008 Zope Foundation and Contributors. @@ -197,3 +198,73 @@ class TestGlobalTranslationDomain(TestITranslationDomain, unittest.TestCase): with self.assertRaises(KeyError): self._domain.reloadCatalogs(('dne',)) + + def test_character_sets(self): + """Test two character sets for the same language. + + Serbian can be written in Latin or Cyrillic, + where Latin is currently most used. + Interestingly, every Latin character can actually be mapped to + one Cyrillic character, and the other way around, + so you could write a script to turn one po-file into the other. + + But most practical is to have two locales with names + sr@Latn and sr@Cyrl. These are then two character sets + for the same language. So they should end up together + under the same language in a translation domain. + + The best way for an integrator to choose which one to use, + is to add an environment variable 'zope_i18n_allowed_languages' + and let this contain either sr@Latn or sr@Cyrl. + + See https://github.com/collective/plone.app.locales/issues/326 + """ + standard_file = os.path.join(testdir, 'sr-default.mo') + latin_file = os.path.join(testdir, 'sr@Latn-default.mo') + cyrillic_file = os.path.join(testdir, 'sr@Cyrl-default.mo') + standard_catalog = GettextMessageCatalog('sr', 'char', standard_file) + latin_catalog = GettextMessageCatalog('sr@Latn', 'char', latin_file) + cyrillic_catalog = GettextMessageCatalog( + 'sr@Cyrl', 'char', cyrillic_file + ) + + # Test the standard file. + domain = TranslationDomain('char') + domain.addCatalog(standard_catalog) + self.assertEqual( + domain.translate('short_greeting', target_language='sr'), + u"Hello in Serbian Standard!", + ) + + # Test the Latin file. + domain = TranslationDomain('char') + domain.addCatalog(latin_catalog) + self.assertEqual( + domain.translate('short_greeting', target_language='sr'), + u"Hello in Serbian Latin!", + ) + # Note that sr@Latn is not recognizes as language id. + self.assertEqual( + domain.translate('short_greeting', target_language='sr@Latn'), + u"short_greeting", + ) + + # Test the Cyrillic file. + domain = TranslationDomain('char') + domain.addCatalog(cyrillic_catalog) + self.assertEqual( + domain.translate('short_greeting', target_language='sr'), + u"Hello in српски!", + ) + + # When I have all three locales, this is the order that + # os.listdir gives them in: + domain = TranslationDomain('char') + domain.addCatalog(latin_catalog) + domain.addCatalog(cyrillic_catalog) + domain.addCatalog(standard_catalog) + # The Latin one is first, so it wins. + self.assertEqual( + domain.translate('short_greeting', target_language='sr'), + u"Hello in Serbian Latin!", + ) diff --git a/src/zope/i18n/translationdomain.py b/src/zope/i18n/translationdomain.py index c62741b..e56d75c 100644 --- a/src/zope/i18n/translationdomain.py +++ b/src/zope/i18n/translationdomain.py @@ -50,6 +50,11 @@ class TranslationDomain(object): def _registerMessageCatalog(self, language, catalog_name): key = language + if "@" in key: + # sr@Latn and sr@Cyrl are two character set variants of + # the same Serbian language. + # See https://github.com/collective/plone.app.locales/issues/326 + key = key.split("@")[0] mc = self._catalogs.setdefault(key, []) mc.append(catalog_name) |