我正按照教程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 ""
答案 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;
区域设置中间件按以下顺序决定用户语言:
i18n_patterns
函数在您的根 URLconf
LANGUAGE_COOKIE_NAME
设置设置的 cookieLANGUAGE_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)