summaryrefslogtreecommitdiff
path: root/oslo_i18n
diff options
context:
space:
mode:
Diffstat (limited to 'oslo_i18n')
-rw-r--r--oslo_i18n/fixture.py76
-rw-r--r--oslo_i18n/tests/test_fixture.py50
2 files changed, 126 insertions, 0 deletions
diff --git a/oslo_i18n/fixture.py b/oslo_i18n/fixture.py
index e62fc8c..6dd2ee0 100644
--- a/oslo_i18n/fixture.py
+++ b/oslo_i18n/fixture.py
@@ -13,6 +13,8 @@
"""
+import gettext
+
import fixtures
import six
@@ -87,3 +89,77 @@ class ToggleLazy(fixtures.Fixture):
def _restore_original(self):
_lazy.enable_lazy(self._original_value)
+
+
+class _PrefixTranslator(gettext.NullTranslations):
+ """Translator that adds prefix to message ids
+
+ NOTE: gettext.NullTranslations is an old style class
+
+ :parm prefix: prefix to add to message id. If not specified (None)
+ then 'noprefix' is used.
+ :type prefix: string
+
+ """
+
+ def __init__(self, fp=None, prefix='noprefix'):
+ gettext.NullTranslations.__init__(self, fp)
+ self.prefix = prefix
+
+ def gettext(self, message):
+ msg = gettext.NullTranslations.gettext(self, message)
+ return self.prefix + msg
+
+ def ugettext(self, message):
+ msg = gettext.NullTranslations.ugettext(self, message)
+ return self.prefix + msg
+
+
+def _prefix_translations(*x, **y):
+ """Use message id prefixed with domain and language as translation
+
+ """
+ return _PrefixTranslator(prefix=x[0] + '/' + y['languages'][0] + ': ')
+
+
+class PrefixLazyTranslation(fixtures.Fixture):
+ """Fixture to prefix lazy translation enabled messages
+
+ Use of this fixture will cause messages supporting lazy translation to
+ be replaced with the message id prefixed with 'domain/language:'.
+ For example, 'oslo/en_US: message about something'. It will also
+ override the available languages returned from
+ oslo_18n.get_available_languages to the specified languages.
+
+ This will enable tests to ensure that messages were translated lazily
+ with the specified language and not immediately with the default language.
+
+ NOTE that this does not work unless lazy translation is enabled, so it
+ uses the ToggleLazy fixture to enable lazy translation.
+
+ :param languages: list of languages to support. If not specified (None)
+ then ['en_US'] is used.
+ :type languages: list of strings
+
+ """
+
+ _DEFAULT_LANG = 'en_US'
+
+ def __init__(self, languages=None):
+ super(PrefixLazyTranslation, self).__init__()
+ self.languages = languages or [PrefixLazyTranslation._DEFAULT_LANG]
+
+ def setUp(self):
+ super(PrefixLazyTranslation, self).setUp()
+ self.useFixture(ToggleLazy(True))
+ self.useFixture(fixtures.MonkeyPatch(
+ 'oslo_i18n._gettextutils.get_available_languages',
+ lambda *x, **y: self.languages))
+ self.useFixture(fixtures.MonkeyPatch(
+ 'oslo.i18n.get_available_languages',
+ lambda *x, **y: self.languages))
+ self.useFixture(fixtures.MonkeyPatch(
+ 'oslo_i18n.get_available_languages',
+ lambda *x, **y: self.languages))
+ self.useFixture(fixtures.MonkeyPatch('gettext.translation',
+ _prefix_translations))
diff --git a/oslo_i18n/tests/test_fixture.py b/oslo_i18n/tests/test_fixture.py
index b5e7f53..7bc29d1 100644
--- a/oslo_i18n/tests/test_fixture.py
+++ b/oslo_i18n/tests/test_fixture.py
@@ -15,8 +15,13 @@
from oslotest import base as test_base
import six
+from oslo import i18n as old_i18n
+import oslo_i18n as new_i18n
+from oslo_i18n import _gettextutils
+from oslo_i18n._i18n import _
from oslo_i18n import _lazy
from oslo_i18n import _message
+from oslo_i18n import _translate
from oslo_i18n import fixture
@@ -72,3 +77,48 @@ class ToggleLazyFixtureText(test_base.BaseTestCase):
self.assertFalse(_lazy.USE_LAZY)
f._restore_original()
self.assertFalse(_lazy.USE_LAZY)
+
+
+_FAKE_LANG = 'en_ZZ'
+
+
+class PrefixLazyTranslationTest(test_base.BaseTestCase):
+
+ def test_default(self):
+
+ # Turn lazy off to check that fixture turns it on
+ self.useFixture(fixture.ToggleLazy(False))
+ self.useFixture(fixture.PrefixLazyTranslation())
+ self.assertTrue(_lazy.USE_LAZY)
+ default_lang = fixture.PrefixLazyTranslation._DEFAULT_LANG
+ raw_id1 = 'fake msg1'
+ expected_msg = 'oslo.i18n/' + default_lang + ': ' + raw_id1
+ msg1 = _(raw_id1) # noqa
+ self.assertEqual([default_lang],
+ _gettextutils.get_available_languages('oslo'))
+ self.assertEqual([default_lang],
+ old_i18n.get_available_languages('oslo'))
+ self.assertEqual([default_lang],
+ new_i18n.get_available_languages('oslo'))
+ self.assertEqual(expected_msg, _translate.translate(msg1))
+
+ def test_extra_lang(self):
+ languages = _gettextutils.get_available_languages('oslo')
+ languages.append(_FAKE_LANG)
+ self.useFixture(fixture.PrefixLazyTranslation(languages=languages))
+ raw_id1 = 'fake msg1'
+ expected_msg_en_US = ('oslo.i18n/' +
+ fixture.PrefixLazyTranslation._DEFAULT_LANG +
+ ': ' + raw_id1)
+ expected_msg_en_ZZ = 'oslo.i18n/' + _FAKE_LANG + ': ' + raw_id1
+ msg1 = _(raw_id1) # noqa
+ self.assertEqual(languages,
+ _gettextutils.get_available_languages('oslo'))
+ self.assertEqual(languages,
+ old_i18n.get_available_languages('oslo'))
+ self.assertEqual(languages,
+ new_i18n.get_available_languages('oslo'))
+ self.assertEqual(expected_msg_en_US, _translate.translate(msg1))
+ self.assertEqual(expected_msg_en_ZZ,
+ _translate.translate(msg1,
+ desired_locale=_FAKE_LANG))