django - 如何使翻译工作?
Posted
技术标签:
【中文标题】django - 如何使翻译工作?【英文标题】:django - how to make translation work? 【发布时间】:2010-12-22 09:47:04 【问题描述】:我正在尝试使用 i18n 以不同的语言呈现模板。我做了我能读到的一切,从设置语言代码,创建和编译翻译文件,包括模板中的翻译标签等等,我的模板仍然以英语呈现,即使通过 LANGUAGE_CODE 变量指向我打算呈现的正确(和不同)代码。我错过了什么?
模板:
% extends "base.html" %
% load i18n %
% get_current_language as LANGUAGE_CODE %
% get_available_languages as LANGUAGES %
% get_current_language_bidi as LANGUAGE_BIDI %
% block title %% trans "translation test" %% endblock %
% block content %
<div id="some-text">
% trans "some translated text goes here" %
% blocktrans %
<ol>
<li>here are some</li>
<li>items that should be</li>
<li>translated as well</li>
</ol>
% endblocktrans %
<ul>
<li>The current language is <b> LANGUAGE_CODE </b></li>
% if LANGUAGE_BIDI %
<li>The current language is bidirectional</li>
% else %
<li>The current language is <b>not</b> bidirectional</li>
% endif %
<li>Available languages are:
<ul>
% for lang in LANGUAGES %
<li> lang.1</li>
% endfor %
</ul>
</li>
</ul>
</div>
% endblock %
查看:
from django.shortcuts import render_to_response
from django.template import RequestContext
from pdb import set_trace as debugger
def check(request):
return render_to_response('index.html', context_instance=RequestContext(request)
命令行(我确实在 .po 文件中填写了正确的翻译):
$ django-admin.py makemessages -l he-il -e html
$ django-admin.py compilemessages
settings.py:
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'he-il'
gettext = lambda s: s
LANGUAGES = (
('he-il', gettext('Hebrew')),
('en-us', gettext('English')),
)
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.i18n",
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
)
【问题讨论】:
【参考方案1】:只需将生成的语言环境文件的路径添加到settings.py
文件中,如下所示
LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
【讨论】:
多年后您的回答仍然有帮助!谢谢! 要添加更多,我会推荐os.path.join(BASE_DIR, 'locale'),
。 不要使用相对路径,虽然它们在开发中工作,但根据服务器等情况,它们可能无法实时工作。【参考方案2】:
这是一个完整的解决方案,我从 Django 1.4 开始使用,并且仍在 1.7.1 中:
在 settings.py 中……
添加到 MIDDLEWEAR_CLASSES,语言环境,它可以根据请求启用语言选择:
'django.middleware.locale.LocaleMiddleware',
添加 LOCALE_PATHS,这是您的翻译文件将存储的位置:
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
启用 I18N:
USE_I18N = True
设置您要将网站翻译成的语言:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
将 i18n 模板上下文处理器添加到 TEMPLATE_CONTEXT_PROCESSORS,请求现在将包括 LANGUAGES 和 LANGUAGE_CODE:
'django.core.context_processors.i18n',
在 urls.py 中:
在 url_patterns 中,添加以下内容,将启用设置语言重定向视图:
url(r'^i18n/', include('django.conf.urls.i18n')),
有关更多信息,请参阅 Translations 中的杂项。
添加以下导入,并用 i18n_patterns 封装要翻译的 url。这是我的样子:
from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^i18n/', include('django.conf.urls.i18n')),
)
urlpatterns += i18n_patterns('',
(_(r'^dual-lang/'), include('duallang.urls')),
(r'^', include('home.urls')),
)
现在任何你使用文本并想要转换它的地方,导入lazytext并用它包装每个字符串,就像这样_('text'),你甚至可以去你的其他urls.py文件并像这样进行url翻译:
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
您可以将要翻译的文本包装在其他文件中,例如 models.py、views.py 等。这是一个示例模型字段,其中包含 label 和 help_text 的翻译:
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
在您的 html 模板中...
对您的模板执行相同操作并加载 i18n 模板标签,并对您要翻译的静态内容使用 trans 和 transblock。这是一个例子:
% load i18n %
% trans "This is a translation" %<br><br>
% blocktrans with book_t='book title'|title author_t='an author'|title %
This is book_t by author_t . Block trans is powerful!
% endblocktrans %
现在为您的每个语言环境运行一个 makemessages:
./manage.py makemessages -l pl
现在剩下的就是进入您的 /locales 文件夹,并编辑每个 .po 文件。填写每个 msgstr 的数据。这是一个这样的例子:
msgid "English"
msgstr "Angielski"
最后编译消息:
./manage.py compilemessages
对于模型实例数据转换,您可以使用一些可用的可重用包,例如
翻译还有很多东西要学,internationalization 与这个主题密切相关,所以也请查看文档。我还建议查看一些可用于 Django 的国际化包,例如 django-rosetta 和 django-linguo。它们帮助翻译模型内容,django-rosetta 不会在您的数据库中为此创建新条目,而 django-linguo 会。
如果你遵循这个,你应该有一个好的开始。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!
【讨论】:
谢谢 :) 还要小心,你必须把 LocalMidleware:It should come after SessionMiddleware, because LocaleMiddleware makes use of session data. And it should come before CommonMiddleware because CommonMiddleware needs an activated language in order to resolve the requested URL.
更多你可以找到here【参考方案3】:
我可能是错的 - 因为我唯一一次使用翻译的东西是在很多个月前的一个测试项目中 - 但我认为你不想要这个:
$ django-admin.py makemessages -l he-il -e html
而是这样:
$ django-admin.py makemessages -l he_il -e html
注意he_il
中的下划线。
我也遇到了 pt-BR 的问题,直到我用 pt_br 制作了消息文件。然后事情开始起作用了......
是的,这并不明显,我在任何地方都找不到有关它的文档。
希望对您有所帮助。
【讨论】:
刚刚遇到了这个有趣的行为。 LANGUAGE 设置应使用破折号,但 /locale/ 中的路径应使用下划线。 +1 就是这样!这些互联网上都有关于这个的问题,你已经确定了。我刚刚将我的语言从 fr-fr 重命名为 fr_fr,一切都变得栩栩如生! (在 Django 重启后)。 是的,我不得不使用:LANGUAGE_CODE = 'en_GB' while in LANGUAGES = (('en-gb', ugettext('English')), ...)【参考方案4】:我也有同样的问题。但我通过将“语言:”放入 .po 文件来解决它。在我的情况下,.po 文件不包含“语言:”属性,它看起来像......
"语言团队:LANGUAGE \n" “语言:\n” “MIME 版本:1.0\n”但是当我输入语言代码时(在我的例子中是 'ru' 或 'en')
"语言团队:LANGUAGE \n" “语言:ru\n” “MIME 版本:1.0\n”对我有用
【讨论】:
【参考方案5】:我遇到了同样的问题,您的语言环境路径似乎必须以斜杠结尾:
LOCALE_PATHS = (
'/dir/to/my/locale/',
)
【讨论】:
谢谢。这是我的情况。这是针对那些遇到相同问题的人的 sn-p:LOCALE_PATHS = os.path.join(BASE_DIR, '<app-name>','locale/')
在我的情况下,我也错过了尾随逗号“,”【参考方案6】:
我的方法是使用 django 在它自己的翻译文件中使用的确切语言代码(而不是通过 settings.py 中提供的链接),假设这种语言是受支持的(如果不是事情变得复杂,因为您还必须向 django 提供自己的翻译文件)。
我通过转到 $DJANGO_DIR/conf/locale 并查看文件夹的名称找到了此代码(对我来说,它位于 /usr/local/lib/python2.6/dist-packages/django/conf/locale,但是它可能会因操作系统等而有所不同。
【讨论】:
【参考方案7】:是的,您确实需要按照 celopes 的建议制作消息文件,然后编译它们
python manage.py compilemessages
但是您仍然会遇到问题。
暂时禁用 LocaleMiddleware,即删除它
django.middleware.locale.LocaleMiddleware
来自您的中间件列表。如果您不需要在运行时切换语言,请不要使用它,但如果您确实需要它,那么有一个solution。我之前有the same problem,有人向我解释过。
我之前也有this weird issue。 Makemessages 命令会阻塞在 .py 文件中用反斜杠包裹的字符串。
【讨论】:
django 关于翻译的文档很好,但很长,很遗憾你需要阅读大部分内容。 我删除了那个中间件,但没有任何改变。即使 LANGUAGE_CODE 指向“he”,页面仍仅以英文呈现(我将其从“he-il”更改为 django.conf.locale 所具有的)。有什么想法吗? 消息构建和编译是否有任何错误消息?看看 locale/he/django.po 有没有#,模糊标记? 你有 locale/he/django.mo 文件吗? 添加了指向另一个可能问题的链接。【参考方案8】:我遇到了同样的问题,我试图切换我的语言,但 django 拒绝了。没有错误,没有警告,但 django 将语言切换为 pl-pl(在我的情况下)。但是从语言环境中删除所有文件夹并执行命令: django-admin.py makemessages -l pl_PL(第二个 PL 用下划线代替破折号和大写字母,解决了这个问题)。
我希望它可以帮助一些人。
【讨论】:
【参考方案9】:我有同样的问题。我在this link under another similar question中详细解释过。
简单地说,我的问题已经通过使用以下代码重新加载服务器解决了:
sudo /etc/init.d/uwsgi reload
现在,每次我更改短语并编译语言文件后,我都会重新加载服务器以查看更改。
【讨论】:
以上是关于django - 如何使翻译工作?的主要内容,如果未能解决你的问题,请参考以下文章