繁体   English   中英

django 翻译对我不起作用

[英]django translation not working for me

我不能强制 django 翻译字符串,从请求中选择的语言是正确的,但我没有翻译的字符串。

也许这里可能有问题:当我运行 shell 时,返回的language_code与我在settings.py中的不相等

gettext = lambda s: s
USE_I18N = True
USE_L10N = True
LANGUAGE_CODE = 'en'

LANGUAGES = (
   ('cs', gettext('Czech')),
   ('en', gettext('English')),
)

>>> from django.utils import translation
>>> 
>>> translation.get_language()
'en-us'
>>> from django.conf import settings
>>> settings.LANGUAGE_CODE
'en'

我的消息文件在locale/cs/LC_MESSAGES/django.{mo,po}我那里有这个内容(周短名称的翻译缩写):

msgid "Mo Tu We Th Fr Sa Su"
msgstr "Po Út St Čt Pá So Ne"

鉴于,当我获得正确的价值“cs”时

print get_language() 
'cs'

下一行是ugettext

ugettext('Mo Tu We Th Fr Sa Su')
'Mo Tu We Th Fr Sa Su'

但我期待

'Po Út St Čt Pá So Ne'

有人可以告诉我哪里可能有问题吗? :o)

翻译可能是.po文件,但在.mo文件中缺失。 尝试通过运行重新编译消息

./manage.py compilemessages 

1. 确保你有一个正确翻译的.mo文件:

执行msgunfmt./locale/jp/LC_MESSAGES/django.mo反编译.mo文件:

示例 output:

msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "world"
msgstr "日语世界"

2. 确保 Python 的内置gettext有效

在项目根目录下执行python ,输入Python shell ,然后执行:

import gettext
assert gettext.translation("django", "locale", ['jp']).gettext("world") == "日语世界"

3.确保正确设置LOCALE_PATHS

在项目根目录下执行python manage.py ,输入Django shell ,然后执行:

from django.conf import settings
assert len(settings.LOCALE_PATHS) > 0

4.确保Django的gettext在相应的语言上下文下工作

输入Django shell ,执行:

from django.utils import translation
with translation.override("jp"):
    assert translation.gettext("world") == "日语世界"

5.确保你有一个标准的语言代码,django支持它

输入Django shell ,执行:

from django.utils import translation
assert 'ja' in translation.trans_real.get_languages()
assert 'zh-hans' in translation.trans_real.get_languages()
assert 'zh-hant' in translation.trans_real.get_languages()
assert 'zh-cn' not in translation.trans_real.get_languages()

6.确保你有正确的语言环境

服务器代码

from django.contrib import admin
from django.http import JsonResponse
from django.urls import path
from django.utils.translation import gettext_lazy, get_language


def home(_):
    return JsonResponse(dict(
        language=get_language(),
        hello=gettext_lazy("world")
    ), json_dumps_params=dict(ensure_ascii=False, indent=4))


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home)
]

测试它:

curl 'http://localhost:8000' -H 'Accept-Language: ja'

示例响应:

{
    "language": "ja",
    "hello": "日语世界"
}

所需的配置但不是默认的 Django 项目:

  1. LOCALE_PATHS django 查找.mo文件需要locale路径
  2. MIDDLEWARE LocaleMiddleware项目需要 LocaleMiddleware 来检测上下文的语言
BASE_DIR = Path(__file__).resolve().parent.parent
LOCALE_PATHS = (
    BASE_DIR / "locale", # Here
)
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware', # And here
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

另一个注意事项:

不要执行mkdir locale来手动创建locale文件夹, python manage.py makemessages将创建locale文件夹(如果您的设置有效)。

i18n项目的正确国际化Django

  1. 设置LOCALE_PATHS
  2. 设置LocaleMiddleware
  3. python manage.py makemessages
  4. python manage.py compilemessages
  5. python manage.py runserver看是否有效。

我整夜跟踪代码,发现了一些线索。 主要在trans_real.py和gettext.py中。 您可以在“翻译”功能中添加断点。

  1. 应用程序启动时,翻译代码仅执行一次。 所以你需要重新加载uwsgi来加载新版本。
  2. 永远不会使用Po文件。 gettext.py只使用“mo”文件。(在我的笔记本电脑中)。 所以你必须在更改后编译消息。
  3. 语言代码中的“ - ”将在语言环境路径中转换为“_”。 例如,“zh-CN”将转换为“zh_CN”。 这就是无法找到翻译文件的原因。 我认为如果只使用两个字符作为语言代码会更好。 在Linux系统中应该考虑区分大小写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM