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, '&lt;app-name&gt;','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 - 如何使翻译工作?的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何翻译模型的字段

如何将链接放入 django 中的翻译标签

为啥 Django 翻译不使用 javascript 中的基础语言?

如何使翻译 qml

如何将空间 JOIN 翻译成 Django 查询语言?

机器翻译引擎的基本原理 ——LSTM