【问题标题】:What's the correct way to set up Django translation?设置 Django 翻译的正确方法是什么?
【发布时间】:2013-12-26 09:15:00
【问题描述】:

我在 Django 1.6 上遇到了翻译问题。我已将此添加到我的 settings.py 中:

LANGUAGE_CODE = 'en-us'
ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('de', ugettext('German')),
)

还添加了中间件:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

以及每当我使用应为 l10nd 的字符串时,我的 *.py 文件:

from django.utils.translation import ugettext_lazy as _

我的模板以:

开头
{% extends "base.html" %}
{% load i18n %}

在模板中我使用了trans 占位符。例如

<h1>{% trans "Register a tank" %}</h1>

我在 locale/de/LC_MESSAGES/django.po 中提供了翻译:

msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"

我的浏览器设置为首先请求德语内容: Browser settings

我错过了什么?

附:我目前模糊的项目托管在 GitHub 上:https://github.com/frlan/blankspot

【问题讨论】:

标签: python django django-i18n


【解决方案1】:

LOCALE_PATHS添加到settings.py并设置如下:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

注意LOCALE_PATHS必须是一个元组(看路径末尾的逗号)。

现在基于LOCALE_PATHSlocale 文件夹应该位于项目的根目录中。

并确保从项目的根目录运行命令 django-admin.py makemessages -l dedjango-admin.py compilemessages

djPrj
  |
  +---> djPrj
  |
  +---> djApp
  |
  +---> locale
  |
  +---> templates

还将MIDDLEWARE_CLASSES 重新排列为LocaleMiddlewareSessionMiddleware 之后和CommonMiddleware 之前,如here 所述:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

重新启动您的服务 (python manage.py runserver) 并再次检查。


为了确保您的本地化应用到您的 Django 管理页面以及 Django 的默认 django.mo 文件,请执行以下测试:

项目的主要urls.pypatterns 替换为i18n_patterns

from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    # ...
)

现在转到带有 de 前缀的管理页面,例如:http://127.0.0.1:8000/de/admin/ 并且管理页面应该用德语显示。

好的,你能看到德语的 Django 管理页面吗?

还可以使用de 前缀检查您的视图。


根据您的project code,有些句子不在trans 块中。把它们写成:

{% trans "your sentence" %}

您还必须在代码中为视图和模型使用ugettext_lazy 而不是ugettext(阅读herehere。)

替换这个:

from django.utils.translation import ugettext as _ 

与:

from django.utils.translation import ugettext_lazy as _

现在一切都会好起来的。

【讨论】:

  • @frlan,你能看到 django 的德语管理页面吗? (我更新了我的答案)
  • 是的,我能看到。
  • 有可能上传您的代码项目,但在某个地方用最少的用例不起作用?
  • 不完全是我最初要求的项目可通过github.com/frlan/blankspot 获得——创建数据库连接后它应该可以工作。
  • 我的错。错过更新该特定文件。现在它似乎工作了!是的。非常感谢
【解决方案2】:

在我的例子中,我使用 en-gb 作为参数来运行

django-admin.py makemessages -l en-gb

相反,它应该是 en_GB。

django-admin.py makemessages -l en_GB

【讨论】:

    【解决方案3】:

    请在django.po中设置translated string,然后使用python manage.py compilemessages

    for e.g 
    
    #: path/to/python/module.py:23
    msgid "Welcome to my site."
    msgstr "put appropriate translated string here"
    

    建议-:您可以使用django-rosetta 包从UI 界面添加translated string。从 django-admin 添加 T-string 很容易。 https://github.com/mbi/django-rosetta

    【讨论】:

    • 我已经这样做了(并立即更新了问题——错过了。对不起。)
    • 您是否添加了 django-view 来设置语言和 HTML 下拉代码以将 lang 传递给该视图?
    • 只做了我上面提到的。我的想法是 Django 自己决定语言。 (在边界内)
    • 但是 django-rosetta 看起来真的很不错。
    【解决方案4】:

    检查cookies和session——根据How Django Discovers Language Preference,流程是这样的:

    1. URL 中的语言前缀,当在 URLconf 中使用 i18n_patterns 时
    2. _当前用户会话中的语言键
    3. django_language cookie(或由 settings.LANGUAGE_COOKIE_NAME 指定)
    4. Accept-Language HTTP 标头(这是您的浏览器设置发送的内容)
    5. settings.LANGUAGE_CODE

    由于您的浏览器设置设置为首选“de”,我怀疑 LocaleMiddleware 必须在前面的步骤 1.-3 中做出其他决定。

    【讨论】:

      【解决方案5】:

      你需要在你的设置中enable the LocaleMiddleware,告诉 Django 根据浏览器设置进行语言检测。更改您的语言首选项会有效地设置 Accept-Language 标头。您可能需要签入隐身窗口,因为其他语言检测方法具有更高的优先级,例如用户会话和django_language cookie。

      【讨论】:

      • 已激活。我刚刚更新了帖子。不过谢谢你的提示。
      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 2017-12-17
      • 2021-12-06
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多