我需要在我的项目中实现国际化,所以我想使用i18n作为静态内容,而我使用app django-modeltranslation作为模型。我支持以下语言:
en-us(默认) NL-NL 去德 FR-FR ES-ES
虽然我是荷兰人,但是django并没有改为荷兰人的语言。我确实有一个英文窗口,但铬是设置荷兰来测试国际化。这不是唯一的问题,只有当默认语言发生变化时,模型才会自行转换。当我将默认语言设置为荷兰语时,所有模型都将显示荷兰语翻译,但静态内容保持英语。
注意:我确实使用了compilemessages并重新启动了服务器
Settings.py
USE_I18N = True
LANGUAGE_CODE = 'en-us'
gettext = lambda s: s
LANGUAGES = (
('en-us', gettext('English')),
('nl-nl', gettext('Dutch')),
('fr-fr', gettext('French')),
('de-de', gettext('German')),
('es-es', gettext('Spain')),
)
LOCALE_PATHS = ('/vagrant/locale', )
/vagrant/locale/en-us/LC_MESSAGES/django.po(缩短显示错误的文件)
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-05-17 23:14+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Language: en-us\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: PyDiving/settings.py:170
msgid "English"
msgstr ""
#: PyDiving/settings.py:171
msgid "Dutch"
msgstr ""
#: PyDiving/settings.py:172
msgid "French"
msgstr ""
#: PyDiving/settings.py:173
msgid "German"
msgstr ""
#: PyDiving/settings.py:174
msgid "Spain"
msgstr ""
#: company/templates/company/company_detail.html:22
msgid "City"
msgstr ""
/vagrant/locale/nl-nl/LC_MESSAGES/django.po(仅显示缩短帖子的差异)
"Language: nl-nl\n"
#: company/templates/company/company_detail.html:28
msgid "Postal Code"
msgstr "Postcode"
#: company/templates/company/company_detail.html:34
msgid "City"
msgstr "Stad"
模板公司/ templates / company / company_detail.html
{% load i18n %}
{{ company.text }} # this is the model translation, this will change when i change the default language
{% trans "City" %} # this always says "City"
默认语言为en-us时的结果
EnglishCity
其中'英语是模型的内容'
默认语言nl-nl
NederlandsCity
答案 0 :(得分:2)
我发现不同的平台允许/喜欢不同的语言文件夹名称。我正在我的开发系统(Mac OS X)上拔头发,因为'/ pt-br / LC_MESSAGES /'不起作用,即使makemessages创建文件夹并且编译消息也正常工作。一旦我将这些语言重命名为'/ pt_br / LC_MESSAGES /'(注意下划线),它终于跳了出来。请注意我在设置中的LANGUAGES元组使用aa-bb表单,就像你在这里使用一样。
将同一个项目迁移到生产(Ubuntu),它再次停止工作,我尝试了Sun下的所有内容,认为文件夹名称必须已经正确,因为它们适用于我的dev。机。最后,出于绝望,尝试将国家组件大写为'/ pt_BR / LC_MESSAGES /',并且,繁荣,它又开始工作了。我发现使用aa_BB表格可以普遍使用。
因此,我认为您正在寻找的解决方案是更改locale文件夹中的语言环境目录的名称。你应该:
[project]
locale
de_DE
en_US
es_ES
fr_FR
nl_NL
...
settings.py
在每个内部你当然会正常使用LC_MESSAGES等。您的Django配置不应该更改,这正是gettext在您的平台上接受的内容。同样,我认为如果你使用aa_BB表格,你在大多数系统上都可以。
如果出于某种原因需要某个其他位置的区域设置文件夹,请确保相应地设置属性settings.LOCALE_PATHS。此外,Django文档清楚地说明了它如何找到此文件夹:https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations。
答案 1 :(得分:0)
我遇到过这篇文章:Django internationalization language codes。显然,django只支持iso 639-1语言代码,这在文档中找不到,更糟糕的是,它说你必须使用像en-us这样的代码。只要我将语言更改为en-us&gt; en,nl-nl&gt;等等,它立即起作用。
无论如何,感谢您的关注。
答案 2 :(得分:0)
我知道这个问题已经回答了一年多了,但是我遇到了类似的问题,经过几个小时的努力想弄清楚,我终于找到了确定性的问题。
免责声明:我使用的是pt-br,因为它是我的母语,但你可以将它推广到你想要的任何语言
首先,我在django应用程序上做了什么(假设您已经创建了项目和应用程序[s],当前目录是项目目录):
mkdir locale
django-admin.py makemessages -l pt_BR
django-admin.py compilemessages
LOCALE_PATHS =('/path/to/locale_foder',)
在此之后,我的Django应用程序从未被翻译过。无论我做了什么......
根据django文档(https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-language-preference),django有一种预定义的方法来查找语言首选项,这就是它的工作原理:
我突出了第4号,因为在我的情况下,那就是我正在使用的那个。这意味着我的应用程序依赖于HTTP浏览器数据。
现在,由于我们依赖于HTTP数据,让我们来看看浏览器的行为方式。我主要使用chrome和firefox。我的Chrome在笔记本上有以下语言设置:
这就是问题,我的Accept-Language HTTP标头正在发送pt,但是我没有pt语言环境,我只有pt-br语言环境。如果是相反的方式,这将起作用。我的结论是,应该始终使用iso 639-1代码,并从那里使用专门化。例如:我现在使用pt作为pt-br的默认值,而pt-pt用于葡萄牙特定的翻译。