i18n在heroku的生产环境中不起作用

时间:2012-11-06 07:44:25

标签: django heroku internationalization

我已经看过一百多篇关于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

7 个答案:

答案 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正在寻找你的翻译:

  
      
  1. LOCALE_PATHS中列出的目录具有最高优先级,   首先出现的优先级高于那些优先级   出现在后面。
  2.   
  3. 然后,它查找并使用它是否存在区域设置   INSTALLED_APPS中列出的每个已安装应用程序中的目录。该   首先出现的优先级高于出现的优先级   后面。
  4.   
  5. 最后,Django提供了基本翻译   django / conf / locale用作后备。
  6.   

使用上面描述的设置,您必须确保您的树看起来像这样(最重要的是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禁用(此答案已在此处),