Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
覆盖默认的Django翻译_Django_Internationalization - Fatal编程技术网

覆盖默认的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
    compilemessages
    )-makemessages将在应用程序.po文件中添加django标准消息,找到它们并进行翻译,运行compilemessages以更新.mo文件
  • 试用
背后的逻辑:(我想;)-当
ugettext
函数搜索一条消息(字符串)的翻译时,需要搜索多个
.po
/
.mo
文件使用第一个匹配项。因此,如果我们的本地应用程序
.po
/
.mo
是该顺序的第一个,我们的翻译将覆盖所有其他应用程序(例如django默认)

可供替代的 当您需要翻译所有或大部分django默认消息时,另一种可能性(,我没有尝试过)是复制我们地区或其他特殊文件夹中的默认django
.po
文件,修复翻译并注册文件夹(如果新的话)在
LOCALE\u路径中
django
settings
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“最后的行动”

  • 像往常一样编译你的信息

这是我们部署的另一个解决方案。它涉及到对
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()))