Django L10N 无法识别我的地区路径?
我知道有很多话题在讨论同样的事情,但我在这些话题中找不到解决方案。
我创建了一个新的 Django 项目。
这是我唯一的模板:
{% load i18n %}
[...]
<h1>{% trans "Please translate me" %}</h1>
<h1>{{ _("Please translate me") }}</h1>
<h1>{% blocktrans %}Please translate me{% endblocktrans %}</h1>
<p>{% trans "Password" %}</p>
<p>{{ _("Password") }}</p>
<p>{% blocktrans %}Password{% endblocktrans %}</p>
<h1>{% get_current_language as lang %}{{lang}}</h1>
<p>LOCALE_PATHS = {{ s }}</p>
[...]
如你所见,我尝试了三种不同的翻译方法:trans 和 blocktrans 标签,甚至还有 _("字符串") 的调用。这些代码行就在一个小表单下面,用来更改语言。这里不需要复制表单的内容,你会看到它工作得很好。
这是调用模板的视图:
def welcome(request):
from djp import settings
s=settings.LOCALE_PATHS
return render(request, 'welcome.html', locals())
我的设置:
LANGUAGE_CODE = 'en_us' # EDIT
USE_I18N = True
USE_L10N = True
gettext = lambda x: x
LANGUAGES = (
('en_us', gettext('English')),
('fr_fr', gettext('French')),
('de_de', gettext('German')),
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
我还添加了 django.core.context_processors.i18n 和 django.middleware.locale.LocaleMiddleware 这两行,并在 urlpatterns 中加入了 url(r'^i18n/', include('django.conf.urls.i18n')) 这一行。
现在,在运行 ./manage.py makemessages -l fr_fr 后,我打开 django.po 文件,删除所有的 # 和 fuzzy 行,并翻译所有字符串,除了 'Password',因为这个是 Django 自动翻译的:
[...]
#: templates/welcome.html:30 templates/welcome.html.py:31
#: templates/welcome.html:32
msgid "Please translate me"
msgstr "S'il-te-plaît traduis moi"
#: templates/welcome.html:33 templates/welcome.html.py:34
#: templates/welcome.html:35
msgid "Password"
msgstr ""
然后我运行 ./manage.py compilemessages,得到了 django.mo 文件,并启动了服务器。
现在我看到的英文是:
Please translate me
Please translate me
Please translate me
Password
Password
Password
en-us
LOCALE_PATHS = ('/media/pawantu/Data/Projets/VirtualEnvs/loc/djp/locale',)
法语是:
Please translate me
Please translate me
Please translate me
Mot de passe
Mot de passe
Mot de passe
fr-fr
LOCALE_PATHS = ('/media/pawantu/Data/Projets/VirtualEnvs/loc/djp/locale',)
德语是:
Please translate me
Please translate me
Please translate me
Passwort
Passwort
Passwort
de-de
LOCALE_PATHS = ('/media/pawantu/Data/Projets/VirtualEnvs/loc/djp/locale',)
所以,如你所见,'Password' 这个词被正确翻译了(我想是 Django 的功劳),这意味着这些标签(trans、blocktrans 和 _(""))是有效的,语言也正确切换了。
但是我的翻译没有显示出来。我尝试清理浏览器的缓存,但没有解决问题。
你觉得这里的问题是什么?是否有可能 Django 找不到我的 locale 目录,即使我已经设置了 LOCALE_PATHS 元组?
Django 版本:1.6.5
2 个回答
首先,LANGUAGE_CODE 是用来保存你默认安装的语言设置的:
https://docs.djangoproject.com/en/1.6/ref/settings/#language-code所以它应该指向一种语言,而不是你的语言列表:
LANGUAGE_CODE = 'en_us'
然后(你不需要粘贴你的网址,我这里只是给个示例)在你的 urls.py 文件中:
urlpatterns = i18n_patterns('',
...
yourapppurls are here
...
)
在这里我们可以看到,关于Django的本地化设置,有一些重要的信息。
LocaleMiddleware这个功能只能选择那些Django自带的翻译语言。如果你想为你的应用提供一些Django没有的翻译,你至少需要提供一个基本的翻译,具体的要求可以在Locale限制的说明中找到。
这就解释了为什么我的翻译没有被使用。
如果有一个基础语言可用,但指定的子语言没有,Django会使用基础语言。举个例子,如果用户指定了de-at(奥地利德语),但Django只有de(标准德语),那么Django就会使用de。
这就解释了为什么“Password”这个词还是被翻译了!
知道了这一点,我把我的LANGUAGES改成了
LANGUAGES = (
('en', gettext('English')),
('fr', gettext('French')),
('de', gettext('German')),
)
... 并且调整了我的本地化子目录的名称以匹配它。
你可以通过列出django/conf/locale目录(如果你使用virtualenv的话,这个目录在你的site-packages文件夹里)来查看Django支持哪些语言。