django - 如何使翻译工作?

时间:2009-12-02 12:49:21

标签: django internationalization translation

我正在尝试使用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',
)

9 个答案:

答案 0 :(得分:65)

只需将生成的语言环境文件的路径添加到settings.py文件中,如下所示

LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)

答案 1 :(得分:21)

这是我从Django 1.4开始使用的完整解决方案,仍然在1.7.1中:

在settings.py ...

添加到MIDDLEWEAR_CLASSES,locale,它可根据请求选择语言:

'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封装要翻译的网址。这就是我的样子:

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文件并像这样进行网址翻译:< / p>

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-rosettadjango-linguo。它们有助于翻译模型内容,django-rosetta不会在数据库中为此创建新条目,而django-linguo会这样做。

如果你遵循这个,你应该有一个良好的开端。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!

答案 2 :(得分:20)

我可能错了 - 因为我使用翻译的唯一一次是在许多月前的测试项目中 - 但我认为你不想要这个:

$ django-admin.py makemessages -l he-il -e html

而是这个:

$ django-admin.py makemessages -l he_il -e html

注意he_il中的下划线。

我也遇到过pt-BR的问题,直到我用pt_br制作了消息文件。然后事情就开始了......

是的,这并不明显,我无法在任何地方找到相关文档。

希望有所帮助。

答案 3 :(得分:15)

我有同样的问题。但我通过将“语言:”放到.po文件来解决它。在我的情况下.po文件不包含“Language:”属性,它看起来像......

"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"

但是当我输入语言代码时(在我的情况下'ru'或'en')

"Language-Team: LANGUAGE \n"
"Language: ru\n"
"MIME-Version: 1.0\n"

它对我有用

答案 4 :(得分:5)

我遇到了同样的问题,您的语言环境路径似乎必须以斜杠结尾

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
)

答案 5 :(得分:2)

我采用的方式是使用django在其自己的翻译文件中使用的确切语言代码(而不是通过settings.py中提供的链接),假设支持这种语言(如果不是事情变得复杂,那么你必须提供自己的翻译文件到django)。

我通过转到$ DJANGO_DIR / conf / locale并查看文件夹的名称找到了这段代码(对我而言,它位于/usr/local/lib/python2.6/dist-packages/django/conf/locale,但是它可能因操作系统等而有所不同。

答案 6 :(得分:1)

是的,你确实需要像celope建议的那样制作消息文件然后编译它们

python manage.py compilemessages

但你仍然会遇到问题。

稍微禁用LocaleMiddleware,即删除此

django.middleware.locale.LocaleMiddleware

来自您的中间件列表。如果您不需要在运行时切换语言,请不要使用它,但如果您确实需要,则有solution。我之前有the same problem,有人向我解释过。

之前我还有this weird issue。 Makemessages命令会阻塞.py文件中用反斜杠包装的字符串。

答案 7 :(得分:1)

我有同样的问题,我试图改变我的语言,django说没有去。没有错误,没有警告,但django将语言切换为pl-pl(在我的情况下)。但是从语言环境中删除所有文件夹并执行命令: django-admin.py makemessages -l pl_PL(下划线代替第二个PL的破折号和大写字母,解决了这个问题)。

我希望它可以帮助一些人。

答案 8 :(得分:0)

我有同样的问题。我在this link under another similar question中详细解释了它。

简而言之,我的问题已通过使用以下代码重新加载服务器来解决:

sudo /etc/init.d/uwsgi reload

现在,每次我更改短语和编译语言文件后,我都会重新加载服务器以查看更改。