d99353c44d
We should avoid using six.iteritems/keys achieve iterators. We can use dict.items/keys instead, as it will return iterators in PY3 as well. And dict.items/keys will more readable. In py2, the performance about list should be negligible, see https://wiki.openstack.org/wiki/Python3 and http://lists.openstack.org/pipermail/openstack-dev/2015-June/066391.html Change-Id: I8cdac1b75918094b9b3acbc65d53d231e86eca19
74 lines
2.8 KiB
Python
74 lines
2.8 KiB
Python
# Copyright 2012 Red Hat, Inc.
|
|
# Copyright 2013 IBM Corp.
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import six
|
|
|
|
__all__ = [
|
|
'translate',
|
|
]
|
|
|
|
|
|
def translate(obj, desired_locale=None):
|
|
"""Gets the translated unicode representation of the given object.
|
|
|
|
If the object is not translatable it is returned as-is.
|
|
|
|
If the desired_locale argument is None the object is translated to
|
|
the system locale.
|
|
|
|
:param obj: the object to translate
|
|
:param desired_locale: the locale to translate the message to, if None the
|
|
default system locale will be used
|
|
:returns: the translated object in unicode, or the original object if
|
|
it could not be translated
|
|
|
|
"""
|
|
from oslo_i18n import _message # avoid circular dependency at module level
|
|
message = obj
|
|
if not isinstance(message, _message.Message):
|
|
# If the object to translate is not already translatable,
|
|
# let's first get its unicode representation
|
|
message = six.text_type(obj)
|
|
if isinstance(message, _message.Message):
|
|
# Even after unicoding() we still need to check if we are
|
|
# running with translatable unicode before translating
|
|
return message.translate(desired_locale)
|
|
return obj
|
|
|
|
|
|
def translate_args(args, desired_locale=None):
|
|
"""Translates all the translatable elements of the given arguments object.
|
|
|
|
This method is used for translating the translatable values in method
|
|
arguments which include values of tuples or dictionaries.
|
|
If the object is not a tuple or a dictionary the object itself is
|
|
translated if it is translatable.
|
|
|
|
If the locale is None the object is translated to the system locale.
|
|
|
|
:param args: the args to translate
|
|
:param desired_locale: the locale to translate the args to, if None the
|
|
default system locale will be used
|
|
:returns: a new args object with the translated contents of the original
|
|
"""
|
|
if isinstance(args, tuple):
|
|
return tuple(translate(v, desired_locale) for v in args)
|
|
if isinstance(args, dict):
|
|
translated_dict = dict((key, translate(value, desired_locale))
|
|
for key, value in args.items())
|
|
return translated_dict
|
|
return translate(args, desired_locale)
|