如何在Django运行时回退到多种语言?

9
我正在构建一个Django应用程序,使用Django的翻译功能为多种语言提供本地化支持。但同时也要根据当前登录用户的设置,使用Django的翻译功能将某些术语翻译成不同的行业术语。
例如,对于在学习评估行业工作的英语用户,我希望实现以下行为:
对于给定页面的请求:
1. 查找用户的自然语言(例如,德语)。 2. 查找用户的行业(例如,学习评估)。 3. 激活德语/学习评估语言(例如,translation.activate("learning-assessment-de"))。
“learning-assessment-de” .po文件将只翻译项目中所有字符串的子集,因为它只是用于翻译某些特定行业术语。
这就是问题所在:当一个字符串缺失时,我希望Django会回退到德语(在上述第一步中确定),而不是英语(我的settings.py中的默认语言)。
我的默认英语/德语.po文件将假设某个特定行业。
这是否可行?

我不明白,如果字符串不在.po文件中缺失,那么它还可能在哪里缺失呢? - yuvi
有趣的是,看起来最好的方法是使用定制的gettext函数,可以接收一个请求对象作为参数"gettext('Hello world', request)"。 - Mario César
1个回答

1

我认为这是可能的,而且这是最快的方法之一(即使是测试是否有效),就是通过猴子补丁 Django 翻译模块来添加回退语言支持,像这样(未经测试):

from django.utils.translation import trans_real
... # Import other things


# Added `fallback_language` parameter
def do_translate(message, translation_function, fallback_language=None):
    """
    Translates 'message' using the given 'translation_function' name -- which
    will be either gettext or ugettext. It uses the current thread to find the
    translation object to use. If no current translation is activated, the
    message will be run through the default translation object.
    """
    global _default

    # str() is allowing a bytestring message to remain bytestring on Python 2
    eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n'))
    t = getattr(_active, "value", None)
    if t is not None:
        result = getattr(t, translation_function)(eol_message)
    else:

        # Use other language as fallback.
        if fallback_language is not None:
            fallback = translation(fallback_language)
            result = getattr(_default, translation_function)(eol_message)

        else:
            if _default is None:
                from django.conf import settings
                _default = translation(settings.LANGUAGE_CODE)
            result = getattr(_default, translation_function)(eol_message)
    if isinstance(message, SafeData):
        return mark_safe(result)
    return result

# Added `fallback_language` parameter
def do_ntranslate(singular, plural, number, translation_function, fallback_language=None):
    global _default

    t = getattr(_active, "value", None)
    if t is not None:
        return getattr(t, translation_function)(singular, plural, number)

    # Use other language as fallback.
    if fallback_language is not None:
       fallback = translation(fallback_language)
       return getattr(fallback, translation_function)(singular, plural, number)

    if _default is None:
        from django.conf import settings
        _default = translation(settings.LANGUAGE_CODE)
    return getattr(_default, translation_function)(singular, plural, number)


# Override Django functions with custom ones.
trans_real.do_translate = do_translate
trans_real.do_ntranslate = do_ntranslate

这两个函数来自于django.utils.translation.trans_real模块。只需添加几行代码即可。您还需要修改其他函数(例如gettextngettextpgettext),以接受fallback_language参数并将其传递给上述两个函数。请尝试此代码是否有效。
请注意,猴子补丁是项目范围的 - 它会影响您的整个应用程序和第三方应用程序。或者,您可以将django.utils.translation.trans_real模块的源代码作为基础,创建自定义翻译函数,仅在应用程序中的少数位置使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接