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

djs*_*ith 7 django translation

我正在构建一个Django应用程序,它使用Django的翻译功能来提供多种语言的本地化.但我也在使用Django的翻译功能,根据当前登录用户的设置将某些术语翻译成不同的行业.

例如,对于在学习评估行业工作的英语用户,我想要以下行为:

对于页面的给定请求:

  1. 查找用户的自然语言(例如,德语)
  2. 查看用户的行业(例如,学习评估)
  3. 激活德语/学习评估语言(例如,translation.activate("learning-assessment-de"))

"learning-assessment-de".po文件只会翻译项目中所有字符串的子集,因为它只能翻译某些行业特定的术语.

这是个问题:

当一个字符串丢失时,我希望Django回退到德语(在上面的步骤#1中确定)而不是英语(我在settings.py中的默认语言).

我的默认英语/德语.po文件将假定某个行业.

这可能吗?

Han*_*ody 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
Run Code Online (Sandbox Code Playgroud)

上述两个函数取自django.utils.translation.trans_real模块。只需向这些函数添加几行即可。您还需要修改其他函数(例如gettextngettextpgettext)以接受fallback_language参数并将其传递给上述两个函数。请尝试此代码是否有效。

请注意,猴子修补是项目范围内的 - 它也会影响您的整个应用程序和第三方应用程序。或者,您可以以模块的源代码django.utils.translation.trans_real为基础来创建自定义翻译函数,这些函数仅在应用程序中的少数位置使用。