diff options
Diffstat (limited to 'oslo_i18n')
-rw-r--r-- | oslo_i18n/fixture.py | 76 | ||||
-rw-r--r-- | oslo_i18n/tests/test_fixture.py | 50 |
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)) |