[英]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
.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 "日语世界"
gettext
有效在项目根目录下执行python
,输入Python shell
,然后执行:
import gettext
assert gettext.translation("django", "locale", ['jp']).gettext("world") == "日语世界"
LOCALE_PATHS
在项目根目录下执行python manage.py
,输入Django shell
,然后执行:
from django.conf import settings
assert len(settings.LOCALE_PATHS) > 0
gettext
在相应的语言上下文下工作输入Django shell
,执行:
from django.utils import translation
with translation.override("jp"):
assert translation.gettext("world") == "日语世界"
输入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()
服务器代码:
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": "日语世界"
}
LOCALE_PATHS
django 查找.mo
文件需要locale
路径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
:LOCALE_PATHS
LocaleMiddleware
python manage.py makemessages
python manage.py compilemessages
python manage.py runserver
看是否有效。我整夜跟踪代码,发现了一些线索。 主要在trans_real.py和gettext.py中。 您可以在“翻译”功能中添加断点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.