1

我需要在我的项目中实现国际化,所以我想将 i18n 用于静态内容,而我将应用程序 django-modeltranslation 用于模型。我支持以下语言:

en-us (默认) nl-nl de-de fr-fr es-es

虽然我是荷兰人,但 django 不会将语言更改为荷兰语。我确实有一个英文窗口,但 chrome 设置为荷兰语来测试国际化。这不是唯一的问题,只有模型在默认语言更改时会自行翻译。当我将默认语言设置为荷兰语时,所有模型都将显示荷兰语翻译,但静态内容保持为英语。

注意:我确实使用了 compilemessages 并重新启动了服务器

设置.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
4

3 回答 3

2

我发现不同的平台允许/喜欢不同的语言文件夹名称。我在我的开发系统 (Mac OS X) 上大发雷霆,因为 '/pt-br/LC_MESSAGES/' 不起作用,即使 makemessages 以这种方式创建文件夹并且编译消息也可以正常工作。一旦我将语言重命名为“/pt_br/LC_MESSAGES/”(注意下划线),它终于焕发生机。请注意,我的 LANGUAGES 元组在设置中使用 aa-bb 形式,就像您在此处使用的一样。

将同一个项目迁移到生产环境(Ubuntu),它再次停止工作,我在 Sun 下尝试了一切,认为文件夹名称必须已经正确,因为它们在我的开发中工作。机器。最后,出于绝望,我尝试将“/pt_BR/LC_MESSAGES/”之类的国家组件大写,然后,它又开始工作了。我发现使用 aa_BB 形式普遍适用。

因此,我认为您正在寻找的解决方案是更改您的语言环境文件夹中的语言环境目录的名称。你应该有:

[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 。

于 2013-05-28T11:55:12.377 回答
1

我知道这个问题已经回答了一年多,但我遇到了类似的问题,经过几个小时试图弄清楚,我终于找到了一个确定性的答案。

免责声明:我使用 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 设置中的同名变量中指定的语言。

我突出显示了数字 4,因为就我而言,这就是我正在使用的那个。这意味着我的应用程序依赖于 HTTP 浏览器数据。

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

  • pt
  • 恩-我们
  • zh

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

于 2014-05-28T05:02:57.620 回答
0

我遇到了这篇文章:Django 国际化语言代码。显然,django 只支持 iso 639-1 语言代码,这在文档中是找不到的,更糟糕​​的是,它说你必须使用像 en-us 这样的代码。一旦我将语言更改为 en-us > en、nl-nl > nl 等,它立即生效。

无论如何,感谢您的关注。

于 2013-05-23T15:18:39.320 回答