覆盖默认的Django翻译
我有一个包含以下内容的模板:覆盖默认的Django翻译,django,internationalization,Django,Internationalization,我有一个包含以下内容的模板: {% trans "Log out" %} Django会自动将其翻译为西班牙语Terminar sesión。然而,我想把它翻译成Cerrar sesión 我曾尝试将此文本添加到.po文件中,但在编译消息时,我收到一个错误,表示此文本重复 有没有办法更改/覆盖默认的Django翻译 谢谢。最简单的方法是收集django.contrib.admin区域设置文件夹中的.po文件并重新编译它(您可以使用POEdit进行编译) 您还可以覆盖django.contrib
{% trans "Log out" %}
Django会自动将其翻译为西班牙语Terminar sesión。然而,我想把它翻译成Cerrar sesión
我曾尝试将此文本添加到.po文件中,但在编译消息时,我收到一个错误,表示此文本重复
有没有办法更改/覆盖默认的Django翻译
谢谢。最简单的方法是收集django.contrib.admin区域设置文件夹中的.po文件并重新编译它(您可以使用POEdit进行编译) 您还可以覆盖django.contrib.admin模板,方法是将它们放在项目模板文件夹(例如:yourproject/templates/admin/change_form.html)中,然后从项目根目录运行makemessages(尽管django 1.4 alpha不再支持这一点,如果我是正确的)
编辑:罗伯特·卢乔的答案是干净的方法这对我来说很有效:
- 在应用程序文件夹中创建一个文件,该文件将保存需要覆盖翻译的django邮件,例如
django_standard_messages.py
- 在django lib文件夹或
文件中查找需要覆盖的消息(字符串),例如django.po
具有消息django.forms/fields.py
,我们希望以不同方式将其翻译为德语(u“此字段为必填项”)
- 在
中添加所有此类消息,如下所示:django\u standard\u messages.py
- 翻译文件(
,makemessages
)-makemessages将在应用程序.po文件中添加django标准消息,找到它们并进行翻译,运行compilemessages以更新.mo文件compilemessages
- 试用
ugettext
函数搜索一条消息(字符串)的翻译时,需要搜索多个.po
/.mo
文件使用第一个匹配项。因此,如果我们的本地应用程序.po
/.mo
是该顺序的第一个,我们的翻译将覆盖所有其他应用程序(例如django默认)
可供替代的
当您需要翻译所有或大部分django默认消息时,另一种可能性(,我没有尝试过)是复制我们地区或其他特殊文件夹中的默认django.po
文件,修复翻译并注册文件夹(如果新的话)在LOCALE\u路径中
djangosettings
file作为列表中的第一个条目
后面的逻辑:与前一节中提到的非常相似。基于此,他的替代方案完全可行。和IMO更简单(仅将覆盖的区域设置保存在一个特殊的.po文件中)。以下是步骤:
- 向区域设置添加额外的路径
-
地区\路径=(
#默认值,其中makemessages命令将生成文件 join(BASE_DIR,'myproject','locale'),
#我们新的扩展区域设置目录
join(BASE\u DIR、'myproject'、'locale\u extra'), )
-
地区\路径=(
- 查找要翻译的原始Django(或第三方)字符串
- 例:“最近的行动”
- 添加新的.po文件“myproject/locale_extra/en/LC_MESSAGES/django.po”,并使用以下替代翻译:
-
msgid“最近的行动”
msgstr“最后的行动”
-
msgid“最近的行动”
- 像往常一样编译你的信息
Django Translation
类的\u add\u installed\u apps\u translations
方法进行monkey修补,以将项目应用程序的翻译优先于Django应用程序的翻译
# patches.py
from __future__ import absolute_import, unicode_literals
import os
from django.apps import apps
from django.core.exceptions import AppRegistryNotReady
from django.utils.translation.trans_real import DjangoTranslation
def patchDjangoTranslation():
"""
Patch Django to prioritize the project's app translations over
its own. Fixes GitLab issue #734 for Django 1.11.
Might needs to be updated for future Django versions.
"""
def _add_installed_apps_translations_new(self):
"""Merges translations from each installed app."""
try:
# Django apps
app_configs = [
app for app in apps.get_app_configs() if app.name.startswith('django.')
]
# Non Django apps
app_configs = [
app for app in apps.get_app_configs() if not app.name.startswith('django.')
]
app_configs = reversed(app_configs)
except AppRegistryNotReady:
raise AppRegistryNotReady(
"The translation infrastructure cannot be initialized before the "
"apps registry is ready. Check that you don't make non-lazy "
"gettext calls at import time.")
for app_config in app_configs:
localedir = os.path.join(app_config.path, 'locale')
if os.path.exists(localedir):
translation = self._new_gnu_trans(localedir)
self.merge(translation)
DjangoTranslation._add_installed_apps_translations = _add_installed_apps_translations_new
然后在主应用程序的.ready()
方法中,调用patchdjangtranslation
:
from .patches import patchDjangoTranslation
class CommonApp(MayanAppConfig):
app_namespace = 'common'
app_url = ''
has_rest_api = True
has_tests = True
name = 'mayan.apps.common'
verbose_name = _('Common')
def ready(self):
super(CommonApp, self).ready()
patchDjangoTranslation() # Apply patch
主要变化如下:
# Django apps
app_configs = [
app for app in apps.get_app_configs() if app.name.startswith('django.')
]
# Non Django apps
app_configs = [
app for app in apps.get_app_configs() if not app.name.startswith('django.')
]
app_configs = reversed(app_configs)
原件是:
app_configs = reversed(list(apps.get_app_configs()))
此块输出应用列表,将项目应用放在Django应用之前,而不是按照应用在INSTALLED\u apps
设置中出现的顺序解释应用的翻译。由于这只在确定要使用的翻译时发生,因此它不会影响代码的任何其他部分,也不需要进行其他更改
它适用于Django版本1.11到2.2。这是一个非常好的答案,因为它保持了包的完整性和代码的最小化。(它可以工作。)我只是在我的设置中将我的应用程序的locale路径放到locale_path元组中,它似乎覆盖了所有默认字符串。很好。谢谢!这是一个很好的解决方案。它对我很有效(django 1.9)。我已经尝试了这两种解决方案,这是最好和最清晰的答案。[更新后10分钟]:您将受到警告。不要在应用程序中创建“自定义”区域设置文件夹,否则
makemessages
会将应用程序的字符串放入该“自定义”区域设置文件夹,并在注释中添加“新的”自定义翻译。您必须在应用程序外部创建一个新文件夹(例如,在“全局应用程序”目录中)。
app_configs = reversed(list(apps.get_app_configs()))