【问题标题】:Django i18n work in code but not in templates?Django i18n 在代码中工作,但不在模板中?
【发布时间】:2013-01-11 13:17:27
【问题描述】:

我创建了我的语言文件(其中包含来自我的模板的消息),然后编译它们。

这是我的设置文件中的内容:

USE_I18N = True
LOCALE_PATHS = (
    '/srv/www/rewards_system/locale',
)

ugettext = lambda s: s
LANGUAGES = (
    ('bg', ugettext('Bulgarian')),
    ('en', ugettext('English')),  
)
LANGUAGE_CODE = 'bg'
USE_L10N = True

我得到的结果是,所有从带有 ugettext() 函数的代码运行的翻译都完美地翻译成保加利亚语,但所有来自内部模板 ({% trans "word" %}) 的翻译都以英语显示。

我的模板顶部有{% load i18n %}

我正在使用render 函数加载它

render(request,
       'company/signup.html', 
       { 'form': form })

这意味着RequestContext被发送到模板。

我在这里做错了什么?

谢谢

【问题讨论】:

  • 您在 po-file 中看到您的翻译吗?
  • 是的,来自模板的消息(以及相应的翻译)出现在 .po 文件中。
  • 你能不能尝试打印当前的语言,以确保它不只是运行英语。
  • 它实际上打印的是英文,但代码的翻译是保加利亚语?
  • Django 将从几个参数中读取当前语言,然后渲染该语言的文本。一个想法是在调用 render 之前对 activate('bg') 进行硬编码。

标签: django internationalization django-templates translation


【解决方案1】:

我遇到了类似的问题,最终使用strace 解决了它。我的问题是由locale 目录中的语言子目录名称不正确引起的。这有点误导,因为浏览器传递的语言代码或在settings.py 中配置的语言代码包含连字符(例如zh-CN),而目录名称需要包含下划线(例如locale/zh_CNL)。这实际上是 Django 正在寻找的:

stat("/myapp/locale/zh_CN/LC_MESSAGES/django.mo", 0x7fff08a385c0) = -1 ENOENT (No such file or directory)

一旦目录被重命名为ru_RU Django 就能找到它:

stat("/home/webcookies/wps2/locale/ru_RU/LC_MESSAGES/django.mo", {st_mode=S_IFREG|0664, st_size=689, ...}) = 0

我还发现以下代码片段可用于测试翻译正确性:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")

from django.utils.translation import ugettext as _
from django.utils.translation import activate
activate('ru-RU')
print(_("English text to be translated"))

【讨论】:

  • 关于语言代码中连字符的评论绝对是“上帝派来的”。由于各种原因,我需要使用包含连字符的语言代码。这破坏了 Django 本地化,我不知道为什么。重命名语言文件夹,用下划线代替连字符,让我一切正常。非常感谢 :)
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多