不同行业/应用的Django翻译

不同行业/应用的Django翻译,django,localization,internationalization,gettext,middleware,Django,Localization,Internationalization,Gettext,Middleware,我们正在开发一个服务于多个行业的应用程序。我希望使用django的i18n功能来完成两件事: 翻译成不同语言的标准。 翻译到不同行业的标准要低得多。 假设该应用程序服务于兽医和汽车修理工,您将得到一个选项矩阵: | English | French ---------------------------------- Vets | horse | cheval ---------------------------------- Car Mec

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

翻译成不同语言的标准。 翻译到不同行业的标准要低得多。 假设该应用程序服务于兽医和汽车修理工,您将得到一个选项矩阵:

              | English | French
----------------------------------
Vets          | horse   | cheval 
----------------------------------
Car Mechanics | car     | voiture
我想我可以很容易地为不同的上下文设置消息文件:

python manage.py makemessages -l fr_vet
etc...
现在我该如何激活该翻译

我知道中间的行业,从请求中,我可以子类化并修改它,还是需要子类化django.utils.translation并修改激活函数?还是完全不同的东西


如果我错过了一个关于如何做到这一点的现有解释——这是一个典型的例子,我确信答案肯定存在,但不知道它叫什么,我不能用谷歌搜索它。

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

在模板中切换语言:

这一个,我想对你来说是最重要的一个,django是如何发现语言的。。。

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

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

劳拉的回答很有用,但没有完全解释,我认为值得补充一个完整的解释

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

    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()
注意:用户信息添加到中间件中的请求中,该中间件在CustomLocalEmidware之前调用

请求。对于兽医,用户信息['trans_code']将设置为ve,对于汽车修理工,用户信息['trans_code']将设置为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,它将默认为标准反翻译功能。

非常感谢,我会看看这一点,看看我能做多少。我是否可以误用语言名称的第二部分(例如en_-VET中的VET)来识别不同的翻译?谢谢,我会检查并确认答案。