Django i18n 翻译在生产中不起作用 (Heroku)

Django i18n translations not working in production (Heroku)

我的翻译在本地工作,但在 Heroku 的生产中,我的网站在更改语言后仍使用其默认语言(英语)。

这些在我的 settings.py 文件中:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

USE_I18N = True
USE_L10N = True

LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]

这是我的结构:

myproject
├── Procfile
├── locale
│   └── fr
│       └── LC_MESSAGES
│           ├── django.mo
│           └── django.po
├── myproject
│   ├── __init__.py
│   └── settings.py

我认为这是一个 path issue 所以我 SSH 进入我的 Heroku 应用程序并打印 LOCALE_PATHS:

>>> from myproject.settings import LOCALE_PATHS
>>> print(LOCALE_PATHS)
['/app/locale']

pwdlocale/returnspwd /app/locale.

我做错了什么?

我发现了问题:
我的 django.mo 文件被 .gitignore 忽略,因为我使用 default GitHub Python gitignore file.

问题是 .mo 文件(编译的翻译)不存在于 repo 中,因此在 Heroku 构建过程中没有打包与应用程序的其余部分一起部署。

可能的解决方案是:

  1. 将它们添加到存储库
  2. 在构建期间生成 .mo 个文件

我建议在构建期间生成它们,原因如下:

  • 自动编译,少一个手动步骤
  • 它将确保翻译始终是最新的
  • 编译后的文件不是源文件,因此应该在存储库中

要生成它们,您可以使用 Heroku 构建的 post 编译挂钩:

使用以下行创建一个文件 bin/post_compile(没有扩展名,如 procfile):

python ./manage.py compilemessages

您可以选择添加特定语言(例如 python ./manage.py compilemessages -l nl

我从 this answer 得到了类似问题的最后一部分。