Django L10N 无法识别我的地区路径?

1 投票
2 回答
1188 浏览
提问于 2025-04-18 15:56

我知道有很多话题在讨论同样的事情,但我在这些话题中找不到解决方案。
我创建了一个新的 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.i18ndjango.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 个回答

0

首先,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
    ...
)
0

在这里我们可以看到,关于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支持哪些语言。

撰写回答