我们正在开发一个应用程序,它将服务于多个行业。我希望使用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和修改激活功能?还是完全不同的东西?
如果我错过了关于如何做到这一点的现有解释--这是一个经典的例子:“我确信答案肯定存在,但我不知道答案是什么,我不能搜索它”。
发布于 2014-08-16 21:25:27
劳拉的回答是有用的,但没有完全解释,我认为有必要补充一个完整的解释。
所需要的只是添加设置业界翻译代码的中间件:
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-ve“或"de-cm”,它就会默认为标准的"de“翻译。
发布于 2014-08-07 21:12:48
我曾经遇到过同样的情况,我读过几乎所有关于翻译的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')),
)https://stackoverflow.com/questions/25187845
复制相似问题