Django翻译不起作用

jef*_*eff 7 python django localization internationalization language-translation

我正在尝试让Django的翻译系统工作,遵循这里的教程.

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

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

def with_template(request):
    return render(request, 'translation_template.html')
Run Code Online (Sandbox Code Playgroud)

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

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

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

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')),
)
Run Code Online (Sandbox Code Playgroud)

保存这些后,我在终端执行:

python ./manage.py makemessages -l tr
Run Code Online (Sandbox Code Playgroud)

然后编辑新创建myproject/locale/tr/LC_MESSAGES/django.po的有这个:

msgid "hello"
msgstr "merhaba"
Run Code Online (Sandbox Code Playgroud)

然后执行

python ./manage.py compilemessages
Run Code Online (Sandbox Code Playgroud)

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

我在这做错了什么?

谢谢你的帮助!

编辑:

我在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 ""
Run Code Online (Sandbox Code Playgroud)

jef*_*eff 11

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

我在视图中测试了它:

from TranslationTest import settings
return HttpResponse(settings.LOCALE_PATHS)
Run Code Online (Sandbox Code Playgroud)

它显示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'), )
Run Code Online (Sandbox Code Playgroud)

现在它的工作原理.

但我仍然想知道,为什么不makemessages明白它应该在LOCALE_PATHSsettings.py指定的文件中创建?

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

感谢您的帮助!


Lea*_*day 9

如果您激活了区域设置中间件,就会发生这种情况。通过这样做,我认为您的会话本地取决于您的浏览器区域设置。

如果您评论区域设置中间件,它应该按预期工作。

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',
]
Run Code Online (Sandbox Code Playgroud)


小智 7

我尝试了上面提供的几乎所有解决方案,但没有成功。compilemessages然后我意识到我忘记了按照命令运行makemessages。所以请确保你运行:

python manage.py compilemessages 
Run Code Online (Sandbox Code Playgroud)

运行 makemessages 后。该compilemessages命令的作用是将.po文件转换为.mo区域设置目录中的文件。这是必需的,因为.mo文件是 gettext 唯一可以理解的文件。没有.mo文件翻译将无法工作,这对我来说就是这种情况。


Hoj*_*esi 5

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

LANGUAGE_CODE = 'fa-IR'
Run Code Online (Sandbox Code Playgroud)

但是当您想调用 makemessages 命令时,您应该更改-_

makemessages -l fa_IR
Run Code Online (Sandbox Code Playgroud)