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设置为这个?如果这是默认值,为什么要设置它?我希望进一步了解这个问题.
感谢您的帮助!
如果您激活了区域设置中间件,就会发生这种情况。通过这样做,我认为您的会话本地取决于您的浏览器区域设置。
如果您评论区域设置中间件,它应该按预期工作。
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文件翻译将无法工作,这对我来说就是这种情况。
请记住,如果您的语言中有一个国家/地区,例如 fa-IR,则必须在您的设置文件中添加:
LANGUAGE_CODE = 'fa-IR'
Run Code Online (Sandbox Code Playgroud)
但是当您想调用 makemessages 命令时,您应该更改-为_:
makemessages -l fa_IR
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5651 次 |
| 最近记录: |