I18n似乎不适用于模型转换(有点)

时间:2013-05-20 12:53:53

标签: django django-i18n

我需要在我的项目中实现国际化,所以我想使用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

3 个答案:

答案 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
  • 创建了一个pt_BR语言环境:django-admin.py makemessages -l pt_BR
  • 更改了已创建文件中的文字
  • 汇编了所有邮件:django-admin.py compilemessages
  • 将LOCALE_PATHS变量添加到django设置:LOCALE_PATHS =('/path/to/locale_foder',)

在此之后,我的Django应用程序从未被翻译过。无论我做了什么......

根据django文档(https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-language-preference),django有一种预定义的方法来查找语言首选项,这就是它的工作原理:

  1. django在url中搜索语言前缀,为此,你必须在django url中使用i18n_patterns。
  2. 如果上述操作失败,请在用户会话中搜索变量
  3. 如果上述操作失败,请搜索cookie
  4. 如果上述操作失败,请使用Accept-Language HTTP标头
  5. 如果上述操作失败,请使用django设置中同名变量中指定的语言。
  6. 我突出了第4号,因为在我的情况下,那就是我正在使用的那个。这意味着我的应用程序依赖于HTTP浏览器数据。

    现在,由于我们依赖于HTTP数据,让我们来看看浏览器的行为方式。我主要使用chrome和firefox。我的Chrome在笔记本上有以下语言设置:

    • PT
    • EN-US
    • EN

    这就是问题,我的Accept-Language HTTP标头正在发送pt,但是我没有pt语言环境,我只有pt-br语言环境。如果是相反的方式,这将起作用。我的结论是,应该始终使用iso 639-1代码,并从那里使用专门化。例如:我现在使用pt作为pt-br的默认值,而pt-pt用于葡萄牙特定的翻译。