【问题标题】:Django translations for different Industries/applications针对不同行业/应用程序的 Django 翻译
【发布时间】:2014-08-07 16:41:23
【问题描述】:

我们正在开发一个服务于多个行业的应用程序。我希望使用 django 的 i18n 功能来完成两件事:

  1. 翻译成不同的语言(标准)。
  2. 不同行业的翻译(标准低得多)。

假设该应用程序服务于兽医和汽车修理工,您最终会得到一个选项矩阵:

              | English | French
----------------------------------
Vets          | horse   | cheval 
----------------------------------
Car Mechanics | car     | voiture

我想我可以很容易地为不同的上下文设置消息文件:

python manage.py makemessages -l fr_vet
etc...

现在我将如何激活该翻译?

我从请求中了解了中间行业,我可以继承django.middleware.locale.LocaleMiddleware 并更改它,还是需要继承django.utils.translation 并更改激活功能?还是完全不同的东西?

如果我错过了有关如何执行此操作的现有解释,请致歉 - 这是一个经典案例,“我确信答案必须存在,但不知道它叫什么,我无法在谷歌上搜索它”。

【问题讨论】:

    标签: django localization internationalization gettext middleware


    【解决方案1】:

    我曾经遇到过同样的情况,我阅读了几乎所有关于翻译的 Django 文档(真的很庞大)...我想与您分享一些可以提供帮助的重要链接:

    在模板中切换语言: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#switching-language-in-templates

    这一篇,我认为对你来说是最重要的一篇,“django 是如何发现语言的……” https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-language-preference

    我认为您缺少的一件事是您的设置文件中的语言,例如:

    LANGUAGES = (
       ('de', _('German')),
       ('en', _('English')),
    )
    

    【讨论】:

    • 非常感谢,我会看看那个,看看我能走多远。我可以滥用语言名称的第二部分(例如“en_VET”中的“VET”)来识别不同的翻译吗?
    • 谢谢,我会检查并确认答案,一旦我得到它的工作。
    【解决方案2】:

    Lara 的回答很有用,但没有完全解释,我认为值得添加一个完整的解释。

    只需添加设置行业翻译代码的中间件:

        from django.middleware.locale import LocaleMiddleware
        from django.utils import translation
    
        class CustomLocaleMiddleware(LocaleMiddleware):
            def process_request(self, request):
                check_path = self.is_language_prefix_patterns_used()
                language = translation.get_language_from_request(
                    request, check_path=check_path)
                if hasattr(request, 'user_info'):
                    language = language[:2] + '-' + request.user_info['trans_code']
                translation.activate(language)
                request.LANGUAGE_CODE = translation.get_language()
    

    (注意:user_info 被添加到称为 before CustomLocaleMiddleware 的中间件中的request 中)

    request.user_info['trans_code'] 将被设置为“ve”(兽医)和“cm”(汽车修理工)。

    然后在设置中:

        MIDDLEWARE_CLASSES = (
            ...
            'path.to.middleware.CustomAuthMiddleware', # this adds request.user_info
            'path.to.middleware.CustomLocaleMiddleware',
            ...
        )
    
        LANGUAGE_CODE = 'en'
        USE_I18N = True
        USE_L10N = True
    
        LANGUAGES = (
            ('en-ve', 'English Vets'),
            ('en-cm', 'English Car Mechanics'),
            ('fr-ve', 'French Vets'),
            ('fr-cm', 'French Car Mechanics'),
        )
    
        LOCALE_PATHS = (os.path.join(BASE_DIR,'locale'),)
    

    你可以用

    创建你的.po文件
    python manage.py makemessages -l en_VE -l en_CM -l fr_VE -l fr_CM
    

    这样做的好处是,如果您有它但尚未构建“de-ve”或“de-cm”,它将默认为标准的“de”翻译。

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2010-12-19
      相关资源
      最近更新 更多