Add a gettextutils.install() helper function

Part of fixing bug #995287

Every top-level script in every project needs to call gettext.install()
so that a _() builtin function is installed and strings are translated
using the correct translation domain.

However, translations are always installed in the default localedir
(which is commonly '/usr/share/locale') and, in cases like devstack, may
be found in a project-specific localedir. To support such a use case we
should have project-specific environment variables for overriding the
default value of localedir - e.g. NOVA_LOCALEDIR.

Add a new gettextutils.install() helper method to make this as easy as
possible for projects to get right.

Change-Id: I6c8549c8ff00797c96f2dd4b0b5266d18d77aa19
This commit is contained in:
Mark McLoughlin 2013-04-01 02:01:00 +01:00
parent fe8f5c64eb
commit 6072f65d5e
2 changed files with 33 additions and 2 deletions

View File

@ -24,6 +24,7 @@ Usual usage in an openstack.common module:
"""
import gettext
import os
t = gettext.translation('oslo', 'locale', fallback=True)
@ -31,3 +32,19 @@ t = gettext.translation('oslo', 'locale', fallback=True)
def _(msg):
return t.ugettext(msg)
def install(domain):
"""Install a _() function using the given translation domain.
Given a translation domain, install a _() function using gettext's
install() function.
The main difference from gettext.install() is that we allow
overriding the default localedir (e.g. /usr/share/locale) using
a translation-domain-specific environment variable (e.g.
NOVA_LOCALEDIR).
"""
gettext.install(domain,
localedir=os.environ.get(domain.upper() + '_LOCALEDIR'),
unicode=True)

View File

@ -17,7 +17,9 @@
import logging
from openstack.common.gettextutils import _
import mock
from openstack.common import gettextutils
from tests import utils
@ -27,4 +29,16 @@ LOG = logging.getLogger(__name__)
class GettextTest(utils.BaseTestCase):
def test_gettext_does_not_blow_up(self):
LOG.info(_('test'))
LOG.info(gettextutils._('test'))
def test_gettext_install_looks_up_localedir(self):
with mock.patch('os.environ.get') as environ_get:
with mock.patch('gettext.install') as gettext_install:
environ_get.return_value = '/foo/bar'
gettextutils.install('blaa')
environ_get.assert_called_once_with('BLAA_LOCALEDIR')
gettext_install.assert_called_once_with('blaa',
localedir='/foo/bar',
unicode=True)