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

标签 django translation

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

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

对于给定的页面请求:

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

  • “learning-assessment-de”.po 文件将仅翻译项目中所有字符串的子集,因为它仅用于翻译某些行业特定的术语。

    这是问题:

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

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

    这可能吗?

    最佳答案

    我认为这是可能的,并且最快的方法之一(即使测试它是否有效)是猴子补丁 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参数并将其传递给上述两个。请尝试此代码是否有效。

    请注意,monkey-patching 是项目范围的 - 它也会影响您的整个应用程序和第三方应用程序。或者,您可以获取 django.utils.translation.trans_real 的来源模块作为创建自定义翻译功能的基础,这些功能仅在您的应用程序中的少数地方使用。

    关于django - 如何在运行时回退到 Django 中的多种语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18577722/

    相关文章:

    在 JS 中翻译?

    python - Django REST Framework 序列化程序 - 访问现有的外键

    用于通用关系的 Django 表单。如何包含它们?

    python - Django 应用程序 - 使用 UWSGI 或 Phusion Passenger 进行部署

    laravel - 我想在 Laravel 5.3 上使用带变量的复数翻译

    javascript - jquery datepicker 德语

    python - 在 Django 1.9 中保存时将用户添加到组

    django - 如何更改 django 中验证器的默认错误消息

    django - 将包含变量的惰性翻译字符串传递给 Django 中的函数

    用于编辑 .resx 文件的 ASP.NET 组件