如何在gettext中“堆叠”语言

时间:2016-03-16 01:00:55

标签: python django gettext transifex

可能是一个错误的标题,抱歉,但我希望我可以在下面更好地解释。

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

该项目是用Python / Django编写的,我们使用gettext和最终的Transifex来管理翻译建议。

当有人想要一种语言的语言环境变体时,问题就出现了。让我们假设这个问题的法语(fr)。

我们已经为语言代码fr提供了可靠的翻译。但是,如果来自加拿大的贡献者出现并希望提供fr_CA,那么由于这些情况,我们突然遇到维护问题:

  1. fr_CA翻译不完整。在这种情况下,gettext会回退到“未翻译”,在我们的项目中意味着en

  2. 如果fr_CA翻译从fr复制了大量的内容,那么只需更改一些位以更好地匹配区域设置,然后,我们发现我们需要更改内容基本的fr翻译,突然之间,我们会遇到一个同步问题,非fr_CA说话的贡献者无法解决这个问题。

  3. 对我来说更有意义的是,有一种形式的“叠加”设置,我们可以“堆叠”语言。 fr位于基础,然后是fr_CA,然后是任何更具体的区域设置变体。我想要的是,一旦这些都被定义,那么翻译者只需要更新fr_CA,区别于该语言环境和堆栈中“下方”的语言环境,在本例中为fr。通过保留与任何层下面的更一般的语言环境相比没有什么不同的东西,我们可以根据需要自由地进行更正/更新,而不会产生同步问题。

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

    有谁知道我们如何才能做到这一点?

1 个答案:

答案 0 :(得分:0)

Django确实在内部支持语言回退,这实际上依赖于gettext support,但据我所知,它并没有为开发人员提供一种调整方式。查看以下从Django's code获取的代码段。

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)

现在看来,使用gettext的方法,现在唯一可行的解​​决办法是修补Django,调整_add_fallback多次调用self.add_fallback,具体取决于你的需求。