[openstack-dev] [oslo] Question on oslo_i18n._message

Doug Hellmann doug at doughellmann.com
Mon Aug 10 22:59:58 UTC 2015


Excerpts from Okuma, Wayne's message of 2015-08-10 21:22:09 +0000:
> Hello All,
> 
> I have a question on the usage of oslo_i18n._message and hope to get an answer.
> 
> Some background first:
> I'm working on a portion of Glance - the Glance Metadata Definitions (i.e., metadefs) section.
> We have about ~20 .JSON files which hold data. The .JSON files get loaded into the Glance.metadef_xxx related tables which in turn gets displayed in Horizon via the glance REST API code.
> There are some fields in the .JSON files which need to be internationalized.
> I have a program which produces glance-json.pot files for the JSON files.
> 
> In Horizon, when they are viewing the data, the end-user may change the language they wish to see by going into the profile section (upper right hand corner of Horizon) and selecting the language. So,  I need a more dynamic version of i18n than just the version of i18n that gets started up when the Glance service is started (i.e., based on GLANCE_LOCALEDIR and LANGUAGE, LANG, etc., settings).

The API layer can also set a language based on the browser settings. Are
the JSON files being served by the glance API? Or are they in some other
way coming through from glance?

> 
> This seems to work:
> 
> import oslo_i18n
> 
> # Assumes GLANCE_JSON_LOCALEDIR has been set appropriately.
> def translate(message, locale=None):
>     obj = oslo_i18n._message.Message(message, domain='glance-json')
>     return oslo_i18n.translate(obj, locale)
> ...
> # then in code...
>     def _format_namespace_from_db(self, namespace_obj, locale=None):
>     ...
>         display_name=translate(namespace_obj['display_name'], locale),
> 
> The returned display_name will have the correct version based on the locale passed in.
> 
> But, is this correct usage of oslo_i18n._message()?
> Or is it to remain hidden since it is not part of oslo_i18n.__init__py?
> If it is to remain hidden, then, what would be the better way of getting a "dynamic" translation based on some arbitrary locale that is passed in.
> 
> If you don't know the answer, but, know someone that might - please pass on their name(s) and I can try to contact them directly.
> 
> Thanks and Regards,
> Wayne Okuma

As you surmise, the "_message" module is marked private (note the
"_" prefix on the name), so you shouldn't use it directly. The fact that
Message objects exists is an implementation detail of the lazy
translation machinery, and isn't meant to be something that applications
rely on.

You could use oslo_i18n.TranslatorFactory to get a function to wrap
your strings instead [1].  The "primary" attribute should be what
you want. Passing the return value to translate() would then give
you the translated value.

Something like:

  factory = oslo_i18n.TranslatorFactory('glance-json')
  trans = factory.primary

  def translate(message, locale=None):
      return oslo_i18n.translate(trans(message), locale)

This ought to work whether lazy translation is enabled or not, as long
as the catalog files are installed properly.

Doug

[1] http://docs.openstack.org/developer/oslo.i18n/api.html#oslo_i18n.TranslatorFactory



More information about the OpenStack-dev mailing list