Django翻译不起作用

时间:2015-04-16 23:47:59

标签: python django localization internationalization language-translation

我正按照教程here尝试让Django的翻译系统正常工作。

这是我的两个视图(一个用于直接输出,一个用于模板),两个都不起作用。

def home(request):        
    output = _("hello") # (lazy)
    return HttpResponse(output)

def with_template(request):
    return render(request, 'translation_template.html')

这是第二个视图的模板文件:

{% extends "base_site.html" %}
{% load i18n %}

{% block content %}
<p>{% trans 'hello' %}</p>
{% language 'tr' %}
<p>{% trans 'hello' %}</p>
{% endlanguage %}
{% language 'tr-TR' %}
<p>{% trans 'hello' %}</p>
{% endlanguage %}
{% endblock %}

在我的设置文件中,我添加了以下内容:(如果需要,可以添加之前的部分)

LANGUAGE_CODE = 'en-us'    
# also tried LANGUAGE_CODE = 'tr'  and LANGUAGE_CODE = 'tr-TR'
PROJECT_DIR = os.path.dirname(__file__)

"""
# tried but didn't work
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.context_processors.auth",
    "django.core.context_processors.i18n",
)
"""
LOCALE_PATHS = ( os.path.join(PROJECT_DIR, 'locale'), )
LANGUAGES = (
    ('tr', _('Turkish')),
    ('en', _('English')),
)

保存后,我在终端执行:

python ./manage.py makemessages -l tr

然后编辑新创建的myproject/locale/tr/LC_MESSAGES/django.po以获得此内容:

msgid "hello"
msgstr "merhaba"

然后执行

python ./manage.py compilemessages

并重新启动服务器。终端命令没有显示错误,但是当我加载视图时,没有任何&#34; hello&#34; s被翻译。

我在这里做错了什么?

感谢您的帮助!

编辑:

我在en /../ django.po中发现了一个可疑代码,可能不相关,但可能是。这是文件的开头。模糊(空 - >空)翻译,可能是问题吗?

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""

7 个答案:

答案 0 :(得分:8)

我解决了我的问题。就我而言,问题在于settings.py。中的LOCALE_PATHS定义。

我在视图中测试了它:

from TranslationTest import settings
return HttpResponse(settings.LOCALE_PATHS)

它显示home/myProjects/TranslationTest/TranslationTest/locale,但是makemessages正在home/myProjects/TranslationTest/locale

中生成文件

所以我按如下方式更改了设置:

SITE_ROOT = os.path.dirname(os.path.realpath(__name__))
LOCALE_PATHS = ( os.path.join(SITE_ROOT, 'locale'), )

现在它有效。

但我仍然想知道,为什么makemessages没有理解它应该在settings.py所指定的LOCALE_PATHS中创建文件?

根据我的理解,它总是在SITE_ROOT / locale中生成语言环境文件,所以我们应该始终将LOCALE_PATHS设置为?如果这是默认值,为什么要设置它?我希望进一步了解这个问题。

感谢您的帮助!

答案 1 :(得分:2)

如果您激活了语言环境中间件,则会发生这种情况。这样一来,我认为您的会话本地取决于您的浏览器区域。

如果您注释区域设置中间件,它应该可以按预期运行。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    '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',
]

答案 2 :(得分:1)

请记住,如果您的语言中包含国家/地区,例如fa-IR,必须在您的设置文件中添加:

LANGUAGE_CODE = 'fa-IR'

但是当您要调用makemessages命令时,应将-更改为_

makemessages -l fa_IR

答案 3 :(得分:0)

我只想提醒一些引起我一个小问题的问题,那就是我应该更改浏览器的语言(通过选项)。 但是,我完全完成了所有工作,但看不到翻译后的文字。 顺便说一句,我不想​​使用任何特定的URL来查看翻译。

答案 4 :(得分:0)

对我来说,在网上评论是可以的

USE_I18N = True
USE_L10N = True
LANGUAGE_CODE = 'uk'
LANGUAGES = (
('uk', _('Ukrainian')),
# ('en', _('English')),
)

项目根目录中没有语言环境文件夹,没有自定义LOCALE_PATHS

答案 5 :(得分:0)

将本地中间件添加到 django 中间件对我有用'django.middleware.locale.LocaleMiddleware',

答案 6 :(得分:0)

您可能需要阅读此How Django discovers language preference

TLDR;

区域设置中间件按以下顺序决定用户语言:

  1. i18n_patterns 函数在您的根 URLconf
  2. 如果失败,它将查找由 LANGUAGE_COOKIE_NAME 设置设置的 cookie
  3. 否则,它会查看您的浏览器
  4. 发送的 Accept-Language HTTP 标头
  5. 否则,它将使用全局 LANGUAGE_CODE 设置

就我而言,我遵循了教程,但我不知道为什么我的语言没有改变。

我已经完成了语言环境文件夹,我已经翻译了两种语言的所有字符串,并且我已经正确设置了 LOCALE_PATH 和其他内容。

所以为了测试,我更改了 LANGUAGE_CODE 以显示印地语文本,但我不知道语言优先级的东西。

我在我的设置中设置了以下内容

LANGUAGES = (
    ('hi', _('Hindi')),
    ('en', _('English')),
)
LANGUAGE_CODE = 'hi'

所以发生的事情是我没有指定语言的 cookie,所以优先级下降了在 http 标头中传递的浏览器默认语言。

所以它从未出现在我的设置中的 LANGUAGE_CODE 并且 request.LANGUAGE_CODE 中的语言设置为 en。

所以为了解决这个问题,我将 cookie 设置为在我的浏览器之前优先

from django.conf import settings
from django.http import HttpResponse
from django.utils import translation
user_language = 'hi'
translation.activate(user_language)
response = HttpResponse(...)
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language)

我从这里拿的Explicitly setting the active language