我已经看过一百多篇关于i18n问题的帖子,似乎没有任何解决方案可以解决我的问题。
我有一个运行Django 1.3.1的应用程序,它在我的开发机器上运行良好。但当我带到 heroku 时,没有任何反应。文件根本没有翻译。似乎找不到我项目中的locale文件夹。
Locale文件夹位于我的项目级别,这是我的设置:
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
LANGUAGE_CODE = 'pt-br'
USE_I18N = True
USE_L10N = True
ugettext = lambda s: s
LANGUAGES = (
('en-us', ugettext('English')),
('pt-br', ugettext('Portuguese')),
)
LOCALE_PATHS = (
os.path.join(BASE_PATH, "locale"),
)
Locale文件夹遵循以下结构:
locale
pt_BR
LC_MESAGES
django.mo
django.po
答案 0 :(得分:4)
我发现不同的平台更喜欢不同的语言文件夹名称。我正在我的开发系统(Mac OS X)上拔头发,因为'/ pt-br / LC_MESSAGES /'不起作用,即使makemessages创建文件夹并且编译消息也正常工作。一旦我将这些语言重命名为'/ pt_br / LC_MESSAGES /'(注意下划线),它终于跳了出来。
将同一个项目迁移到生产(Ubuntu),它再次停止工作,我尝试了Sun下的所有内容,认为文件夹名称必须已经正确,因为它们适用于我的dev。机。我终于出于绝望,尝试将国家组件大写为'/ pt_BR / LC_MESSAGES /',并且,繁荣,它又开始工作了。
即使我认为我的Python和Django以及我所有的各种Python / Django库和应用程序都是(按设计)相同的版本,我怀疑每个系统都有不同的gettext版本/版本,这可能是造成差异的原因
答案 1 :(得分:3)
在上面的示例中,您写了LC_MESAGES
而非 LC_MESSAGES
(请注意双S),我相信这很可能是您的问题。
如果没有,请继续阅读!
我最近遇到了这个问题(再次!),答案在this part of the django documentation
中找到我怀疑你的“管理”应用程序已被翻译,但你自己的(项目)应用程序没有同样的问题。
似乎Django正在寻找你的翻译:
- LOCALE_PATHS中列出的目录具有最高优先级, 首先出现的优先级高于那些优先级 出现在后面。
- 然后,它查找并使用它是否存在区域设置 INSTALLED_APPS中列出的每个已安装应用程序中的目录。该 首先出现的优先级高于出现的优先级 后面。
- 最后,Django提供了基本翻译 django / conf / locale用作后备。
醇>
使用上面描述的设置,您必须确保您的树看起来像这样(最重要的是settings.py位于'locale'目录上方的目录中):
+-project_top/
|
+-project_app/
| |
| +-locale/
| | |
| | +-pt_BR/
| | |
| | +-LC_MESSAGES/
| | |
| | +-django.po
| |
| +-settings.py
|
+-manage.py
答案 2 :(得分:3)
默认情况下,git会忽略已编译的翻译文件(*.mo
)。确认您已从.gitignore
文件中删除此例外。
如果是这种情况,请删除此异常,将这些文件添加到git,提交并推送到Heroku,以便将它们提供给Heroku中的应用程序。
答案 3 :(得分:0)
首先,您的语言设置有误。
应该是这样的:
LANGUAGES = (
('zh', 'China'),
('en', 'English'),
('ja', 'Japanese'),
)
接下来,检查Cookie设置中的域是否正确。
我有同样的问题,并认为Heroku的虚拟环境永远不会支持i18n,但最终发现会话cookie中的'django-language'值属于我的本地测试服务器'0.0.0.0:5000'.
更改设置后,我在本地服务器上完成的翻译开箱即用。
答案 4 :(得分:0)
在某些情况下,名称中带有“-”或“ _”的目录无法正确寻址。为了将您的网址自定义为2个字符的代码,您可以创建一个别名:
from django.conf import global_settings, locale
EXTRA_LANG_INFO = {
'pt': {
'fallback': ['pt-br'],
},
}
LANG_INFO = dict(locale.LANG_INFO, **EXTRA_LANG_INFO)
locale.LANG_INFO = LANG_INFO
答案 5 :(得分:0)
我想在上方突出显示@msaad的评论。如果您在Mac OS X上进行开发,并且翻译目录全部为小写字母,则从es_es-> es_ES进行更改,然后重新部署。这为我解决了问题。在OS X上,该系统不区分大小写,但在linux系统上则不区分大小写。
答案 6 :(得分:0)
我没有回答与Heroku有关的问题,只是为了收集尽可能多的可能性:
我有Debian 10开发和生产中的Debian 10虚拟服务器。开发一切正常,i18n生产失败。
原因:我需要 apt install gettext
。
此外,请确保 .mo文件位于git 中并且未被.gitignore禁用(此答案已在此处),