我们正在开发一个服务于多个行业的应用程序。我希望使用django的i18n功能来完成两件事:
假设该应用程序提供兽医和汽车修理工,您最终会得到一系列选项:
| 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;。
答案 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”。