不同行业/应用程序的Django翻译

时间:2014-08-07 16:41:23

标签: django localization internationalization gettext middleware

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

  1. 翻译成不同的语言(标准)。
  2. 向不同行业的翻译(更不用说标准)。
  3. 假设该应用程序提供兽医和汽车修理工,您最终会得到一系列选项:

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

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

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

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

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

    如果我错过了关于如何做到的现有解释,那么这是一个经典案例 - 这是一个经典案例,我确定答案必须存在,但不知道它叫什么我不能谷歌#34;。

2 个答案:

答案 0 :(得分:0)

我曾经遇到过同样的情况,我几乎阅读了所有关于翻译的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')),
)

答案 1 :(得分:0)

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已添加到request中间件中,在 CustomLocaleMiddleware

之前称为

对于兽医,

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”翻译,但尚未构建“de-ve”或“de-cm”。