Python 如何";堆栈";gettext中的语言

Python 如何";堆栈";gettext中的语言,python,django,gettext,transifex,Python,Django,Gettext,Transifex,可能是一个错误的标题,对不起,但我希望我能在下面更好地解释 我是一个受欢迎的开源项目的一部分,我们希望为该项目提供我们的观众想要的任何语言代码的翻译。我们的翻译都是由我们的用户群提供的,我们愿意支持这群支持者/用户所需要的任何东西 该项目是用Python/Django编写的,我们使用gettext和Transifex提供管理翻译建议的出色服务 当有人想要语言的地区变体时,我们的问题就来了。让我们假设这个问题是法语(fr) 我们已经为语言代码fr提供了可靠的翻译。但是,如果来自(比如)加拿大的投稿

可能是一个错误的标题,对不起,但我希望我能在下面更好地解释

我是一个受欢迎的开源项目的一部分,我们希望为该项目提供我们的观众想要的任何语言代码的翻译。我们的翻译都是由我们的用户群提供的,我们愿意支持这群支持者/用户所需要的任何东西

该项目是用Python/Django编写的,我们使用gettext和Transifex提供管理翻译建议的出色服务

当有人想要语言的地区变体时,我们的问题就来了。让我们假设这个问题是法语(fr)

我们已经为语言代码
fr
提供了可靠的翻译。但是,如果来自(比如)加拿大的投稿人出现并希望投稿
fr\u CA
,由于以下情况,我们会突然遇到维护难题:

  • fr\u CA
    翻译不完整。在本例中,gettext返回到“untranslated”,在我们的项目中,它的意思是
    en

  • 如果
    fr\u CA
    翻译从
    fr
    复制了大量的位,然后只是在这里和那里更改一些位以更好地匹配区域设置,然后,我们突然发现我们需要更改基本
    fr
    翻译中的某些内容,我们会遇到一个同步问题,这个问题不是说法语的贡献者能够轻易解决的

  • 对我来说更有意义的是,存在某种形式的“覆盖”设置,我们可以在其中“堆叠”语言<代码>基本的fr,然后是
    fr\u CA
    ,再加上任何更具体的语言环境变量。我想要的是,一旦这些都定义好了,那么翻译器只需要更新
    fr\u CA
    ,并在堆栈中使用该区域设置和“在其下方”的区域设置之间的差异,在本例中为
    fr
    。通过在任何层下留下与更通用的语言环境没有什么不同的东西,我们可以根据需要进行更正/更新,而不会产生同步问题

    我认为,这种“堆叠”最终会在生成已编译MO文件的过程中得到解决


    有人知道我们如何做到这一点吗?

    Django确实在内部支持语言回退,这实际上依赖于,但据我所知,它没有为开发人员提供一种调整方法。查看下面摘自的代码片段


    现在看来,使用gettext的方法,唯一可能的解决方案是使用猴子补丁Django,调整
    \u add\u fallback
    调用
    self。根据您的需要多次添加\u fallback

    谢谢!这可能是一个开始!
    def _add_fallback(self, localedirs=None):
        """Sets the GNUTranslations() fallback with the default language."""
        # Don't set a fallback for the default language or any English variant
        # (as it's empty, so it'll ALWAYS fall back to the default language)
        if self.__language == settings.LANGUAGE_CODE or self.__language.startswith('en'):
            return
        if self.domain == 'django':
            # Get from cache
            default_translation = translation(settings.LANGUAGE_CODE)
        else:
            default_translation = DjangoTranslation(
                settings.LANGUAGE_CODE, domain=self.domain, localedirs=localedirs
            )
        self.add_fallback(default_translation)