7

这里是python新手。我希望我的网站支持英文和中文。所以我只是按照 django 书,第 19 章国际化。但这似乎对我不起作用,我希望字符串显示为中文,仍然是英文。我的代码和设置如下。

[设置.py]

LANGUAGE_CODE = 'zh-cn'
USE_I18N = True
USE_L10N = True
LANGUAGES = (
    ('en', 'English'),
    ('zh-cn', 'Chinese')
)

TEMPLATE_CONTEXT_PROCESSORS = {
        'django.core.context_processors.i18n',
}
    MIDDLEWARE_CLASSES = (
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

在我的应用程序views.py中,我在索引中强制将语言代码设置为“zh-cn”

def index( request ):
    response= render_to_response( 'index.htm' )
    response.set_cookie('django_language','zh-cn')
    return response

那么我希望在 index.htm 之后加载的另一个页面将显示一个中文字符串。

另一个页面由 upload.html 渲染

{% load i18n %}
<html>
<head>
{% block head %}

{% endblock %}
</head>
<body>
{% block body %}
<h1>{% trans 'Upload Demo' %}</h1>
{% endblock %}
</body>
</html>

在那之后,我做

django-admin.py makemessages -l zh-cn -e htm

在我的 django 项目文件夹中,我在 locale/zh-cn/LC_MESSAGES/django.po 获得了 django.po 内容就像

#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-05-10 18:33+0800\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"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: uploader/template/base.htm:10
msgid "Upload Demo"
msgstr "上传文件"

此后,我调用以下命令来编译消息 django-admin.py compilemessages

我在 django.po 的某个文件夹中获得了 django.mo 文件

我首先访问索引页面,然后访问另一个页面,该页面具有“上传演示”字符串 ID。实际上我仍然在那里看到英文字符串。

并尝试通过打印语言代码调试,发现语言设置正确。

context = RequestContext(request) 打印上下文 translation.activate('zh-cn')

最后,我使用

gettext locale/zh-cn/LC_MESSAGES/django.mo "Upload Demo"

真的有'上传演示'。所以我认为问题就在这里。但是为什么会这样呢?我真的很困惑。有谁能够帮我。

非常感谢任何评论或帮助。


gettext locale/zh-cn/LC_MESSAGES/django.mo "Upload Demo"

我想我犯了一个错误。上面的命令返回一个字符串,它与您输入的字符串 ID 相同,而不是翻译后的字符串。在上面的命令中,它是“Upload Demo”,也就是说,如果您将上面命令中的“Upload Demo”更改为“bla bla”,您将“bla bla”。

4

6 回答 6

9

也许为时已晚,但我敢打赌您的问题可能是由于LOCALE_PATHS项目设置中缺少元组。

在拔掉头发一个小时后,我通过简单地将其添加到我项目的 settings.py 文件中解决了同样的问题:

LOCALE_PATHS = (
    '/home/myuser/Projects/Some_project_root/My_django_project_root/locale',
)

这就是该目录的外观:

locale/
├── de
│   └── LC_MESSAGES
│       ├── django.mo
│       └── django.po
├── en
│   └── LC_MESSAGES
│       ├── django.mo
│       └── django.po
└── es
    └── LC_MESSAGES
        ├── django.mo
        └── django.po
于 2013-12-23T20:52:14.820 回答
3

您的代码块有点乱,因此很难全部阅读。但您可能希望从 .mo 文件开始。它包含一个#, fuzzy注释。模糊意味着构建脚本不确定翻译,因此需要翻译人员(=您)的注意。首先检查所有#, fuzzy标记的翻译。如果翻译正确(或在您更正了错误的翻译之后)删除#, fuzzy注释。接下来再次运行编译消息。这可以解决您的问题。

#, fuzzy
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"Report-Msgid-Bugs-To: \n" 
"POT-Creation-Date: 2012-05-10 18:33+0800\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME \n" 
"Language-Team: LANGUAGE \n" 
"Language: \n" 
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

另请参阅:django 模糊字符串翻译未显示

友好的问候, Wout

于 2012-05-10T09:34:27.623 回答
3

您可以看到 LANGUAGE_CODE 与 django_language 不同。我认为 utils.py 中的 get_language 不能正确处理下划线 LANGUAGES。get_language 将返回 zh-cn 但不应将其切入 cn。相反,应该将 zh-cn 转换为 zh_CN。

所以你应该在setting.py中使用下面的代码

LANGUAGES = (
  ('en', _('English')),
  ('zh-cn', _('Simplified Chinese')),
)

并从终端运行以下命令

django-admin.py makemessages -l zh_CN
django-admin.py compilemessages

这对我来说非常有用

于 2014-06-17T08:51:14.130 回答
1

我相信问题在于您传递的makemessagescompilemessages参数。@Vishnu 上面的回答是正确的。

TLDR

不要zh-cn用于语言环境。使用zh_CN.

django-admin.py makemessages -l zh_CN
django-admin.py compilemessages -l zh_CN

解释

Django Docs中定义的“语言环境名称”是:

语言环境名称,可以是 ll 形式的语言规范,也可以是ll_CC形式的语言和国家/地区组合规范。示例:it、de_AT、es、pt_BR。语言部分总是小写,国家部分总是大写。分隔符是一个下划线。

makemessages示例中(位于 makemessages 文档的底部),您会注意到语言环境名称约定的使用:

django-admin makemessages --locale=pt_BR
django-admin makemessages --locale=pt_BR --locale=fr
django-admin makemessages -l pt_BR
django-admin makemessages -l pt_BR -l fr
django-admin makemessages --exclude=pt_BR
django-admin makemessages --exclude=pt_BR --exclude=fr
django-admin makemessages -x pt_BR
django-admin makemessages -x pt_BR -x fr

您会在compilemessages示例中注意到相同的内容:

django-admin compilemessages --locale=pt_BR
django-admin compilemessages --locale=pt_BR --locale=fr -f
django-admin compilemessages -l pt_BR
django-admin compilemessages -l pt_BR -l fr --use-fuzzy
django-admin compilemessages --exclude=pt_BR
django-admin compilemessages --exclude=pt_BR --exclude=fr
django-admin compilemessages -x pt_BR
django-admin compilemessages -x pt_BR -x fr
于 2015-04-19T05:01:15.010 回答
1

我遇到过类似的问题:compilemessages似乎只locale在当前目录中工作。这是一个补救措施:

find . -name "locale" | while read VAR1; do CURR="``pwd``";cd $VAR1/..; echo "in $VAR1";django-admin.py compilemessages ; cd $CURR; done`
于 2015-01-14T18:14:40.833 回答
0

这段代码中有一个突出的问题如下: 在 settings.py 中,如果使用了其他中间件,请确保 MIDDLEWARE 设置中的 django.middleware.locale.LocaleMiddleware 位于 SessionMiddleware 和 CacheMiddleware 之后,并且在 CommonMiddleware 之前。

# settings.py

 MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.cache',
# ...
'django.middleware.locale.LocaleMiddleware',
# ...
'django.middleware.common.CommonMiddleware',
]

如需更多信息,请参阅: 1、2

于 2020-12-17T18:25:25.317 回答