使Django首先搜索当前应用程序的消息文件(.mo)

使Django首先搜索当前应用程序的消息文件(.mo),django,translation,Django,Translation,Django按照此处记录的顺序搜索消息文件(.mo): 是否可以让Django首先在当前使用的应用程序的区域设置目录中搜索消息文件 我最近在一个项目中发现了一个bug,它是由两个应用程序具有相同的消息id但翻译不同引起的。所有的应用程序都有自己的语言环境目录。出于各种原因,django恐怕不是这样工作的: 一个短语应该有一个翻译。撇开Django不谈,这也是gettext(用于翻译消息的引擎)的问题。此外,期望系统在所有页面中翻译一个短语并保持一致,这听起来很正常。毕竟,它在原语中仍然是同一个

Django按照此处记录的顺序搜索消息文件(.mo):

是否可以让Django首先在当前使用的应用程序的区域设置目录中搜索消息文件


我最近在一个项目中发现了一个bug,它是由两个应用程序具有相同的消息id但翻译不同引起的。所有的应用程序都有自己的语言环境目录。

出于各种原因,django恐怕不是这样工作的:

  • 一个短语应该有一个翻译。撇开Django不谈,这也是gettext(用于翻译消息的引擎)的问题。此外,期望系统在所有页面中翻译一个短语并保持一致,这听起来很正常。毕竟,它在原语中仍然是同一个短语
  • “当前应用程序”是什么意思?当前应用程序是生成当前视图的应用程序吗?翻译本身可能来自另一个应用程序的模块。如何决定这两个应用程序中哪一个是合适的?翻译也可能是惰性的,这会增加此类决策的复杂性
  • 我建议您在
    INSTALLED_APPS
    中重新排序应用程序,以匹配您喜欢的翻译,或者使用
    LOCALE_PATHS
    设置定义新的翻译消息路径,以提供您自己的翻译

    注意:从技术上讲,可以通过提供此模块的自定义实现来覆盖django.utils.translation.trans\u real中的默认行为,以根据需要更改行为(此模块中的
    translation()
    方法实现选择算法)。然后您还应该重写最初在
    django.utils.translation.\uuuu init\uuuuu
    模块中定义的
    Trans
    类,以返回您的自定义Trans\u real模块(例如,将这个新类命名为MyCustomTrans),并显式地将其设置为项目的init模块中的某个翻译类,以便在代码的早期加载:

    from django.utils import translation
    translation._trans = MyCustomTrans()
    
    现在您的自定义算法将被使用,但这将需要大量的工作,在我看来不值得的麻烦