这里有一个蟒蛇新手。 我想我的网站支持英文和中文。所以我只是按照django书,第19章国际化。但它似乎对我不起作用,字符串我希望显示为中文,仍然是英文。我的代码和设置如下。
[settings.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',
)
在我的app views.py中,我强制在索引
中将语言代码设置为'zh-cn'def index( request ):
response= render_to_response( 'index.htm' )
response.set_cookie('django_language','zh-cn')
return response
然后我希望在index.htm之后加载的另一个页面会显示一个中文字符串。
Annother页面由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项目文件夹中,我得到了django.po 区域设置/ ZH-CN / LC_MESSAGES / 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"
我想我犯了一个错误。以上命令返回一个字符串,该字符串与您键入的字符串相同,而不是转换后的字符串。在上面的命令中,它是“上传演示”,即如果您在上面的命令中将“上传演示”更改为“bla bla”,您将“bla bla”。
答案 0 :(得分:7)
也许为时已晚,但我打赌你的问题可能是由于项目设置中缺少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
答案 1 :(得分: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 fuzzy string translation not showing up
友好的问候, Wout的
答案 2 :(得分:2)
您可以看到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
这对我来说很完美
答案 3 :(得分:1)
我遇到了类似的问题:compilemessages
似乎只在当前目录中的locale
上运行。这是一种补救措施:
find . -name "locale" | while read VAR1; do CURR="``pwd``";cd $VAR1/..; echo "in $VAR1";django-admin.py compilemessages ; cd $CURR; done`
答案 4 :(得分:0)
我认为问题在于您传递的makemessages和compilemessages参数。 @Vishnu上面的回答是正确的。
不要将zh-cn
用于区域设置。使用zh_CN
。
django-admin.py makemessages -l zh_CN
django-admin.py compilemessages -l zh_CN
Django Docs中定义的“区域设置名称”为:
语言环境名称,表单ll的语言规范或表单 ll_CC 的组合语言和国家/地区规范。示例:它, 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
答案 5 :(得分: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',
]