如何覆盖Django管理界面的翻译?

38

我尝试覆盖Django管理站点的默认翻译。

我正在使用Django 1.6。我的settings.py文件包含如下内容:

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

# ...

LANGUAGE_CODE = 'nl'
USE_I18N = True
USE_L10N = True
LOCALE_PATHS = (os.path.join(BASE_DIR, "locale"),)

我已经将文件django/contrib/admin/locale/nl/LC_MESSAGES/django.po复制到my_project/locale/nl/LC_MESSAGES/django.po,并对它进行了一些更改。

接下来,我运行了python manage.py compilemessagespython manage.py runserver命令。

然而,当我访问localhost:8000/admin时,仍然看到Django默认的管理员翻译。我做错了什么?

编辑 - 我找到了问题:

上述描述是覆盖应用程序翻译的正确方法。我按照自己的说明进行操作,它们有效。我遇到问题的原因是第一次意外省略了nl子目录。我是一个愚蠢的人。


你重启了开发服务器吗?根据我的经验,翻译文件会被积极缓存。 - sk1p
我重新启动了开发服务器,并部署了代码,但仍然忽略我的翻译 :-( - Jaap Joris Vens
你的意思是你删除了“nl”子目录? - TankorSmash
14
顺带一提,Django 1.6现在已经很久没有得到支持了。你应该考虑升级到2.2版本。 - alfajet
4
@hedgie,您能否撰写一个答案并自行接受以关闭此问题? - Yacine Mahdid
显示剩余2条评论
2个回答

7

虽然 @hedgie 已经回答了他们自己的问题,但我会提供一个答案并加入一些上下文和描述。截至 Django 3.0,此答案仍适用。

就像您可以通过复制模板的名称和目录结构在我们自己的项目中覆盖 Django 提供的管理模板一样,您也可以通过在项目中复制 .po 文件的名称和目录结构来覆盖 Django 提供的管理翻译。

Django 的管理翻译位于 django/contrib/admin/locale/ 中,并按语言以名为 [language code]/LC_MESSAGES/ 的目录组织。这些单独的语言目录包含两个 .po 文件,django.podjangojs.po,以及各自的已编译 .mo 文件。您将覆盖 .po 文件,并编译我们自己的 .mo 文件。

首先,您必须在设置中启用翻译,并告诉 Django 您存储翻译文件的位置。

settings.py

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

# ...

LANGUAGE_CODE = 'nl-NL'
USE_I18N = True
USE_L10N = True
LOCALE_PATHS = (os.path.join(BASE_DIR, "locale"),)  # our custom translations will go here

请注意,虽然Django使用的目录是nl,但荷兰荷兰语的完整语言标识符是nl-NL。您可以在这里找到按国家组织的完整标识符列表。
接下来,您将模仿Django的目录结构,并在新目录中创建两个文件: my_project/locale/nl/LC_MESSAGES/django.po my_project/locale/nl/LC_MESSAGES/djangojs.po 请注意,此路径也必须与您在 settings.py 中提供的路径相匹配。
复制并粘贴Django的翻译文件。现在,您可以编辑您喜欢的任何字符串的翻译。例如: django.po
msgid "Are you sure?"
--- msgstr "Weet u het zeker?"
+++ msgstr "Weet u het zeker?!"

现在您需要使用以下命令编译消息: python manage.py compilemessages 该命令将编译您的 .po 文件为 .mo 文件,Django 将使用它来翻译任何匹配的 gettext 调用。现在,您应该能够在管理界面中看到您的自定义翻译。

太棒了!只需要注意:不需要“复制和粘贴Django翻译文件的内容”。新文件似乎已经与现有的.po文件合并。 - frnhr

0

我知道这是老问题了,在我的情况下,我想要更改“身份验证和授权”的应用程序名称。这就是我实现它的方式。

  1. 运行命令:python manage.py makemessages -l en

    注意:此命令将在 locale/en/LC_MESSAGES/ 目录下生成一个 .po 文件。

    在运行此命令之前,请确保您已经在 setting.py 中设置了区域目录路径,我的设置如下:LOCALE_PATHS = (os.path.join(BASE_DIR, "locale"),)

  2. 打开 django.po 文件,删除其中的所有内容,并添加以下内容:

    #: contrib/auth/apps.py:16
    msgid "Authentication and Authorization"
    msgstr "用户认证"
    

    注意:在我的情况下,我正在重命名 auth 模型的“Authentication and Authorization”应用程序名称。

  3. 运行命令 python manage.py compilemessages 来编译翻译。 注意:这将生成相应的 .mo 文件。

  4. 重新启动 Django

我希望这能帮助到其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接