0

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

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

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

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

我们已经为语言代码提供了可靠的翻译fr。但是,如果来自加拿大的贡献者出现并希望贡献fr_CA,由于以下情况,我们会突然感到维护头痛:

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

  2. 如果fr_CA翻译从 复制大量位fr,然后只是在这里和那里更改一些位以更好地匹配语言环境,然后,我们发现我们需要在基本fr翻译中更改某些内容,突然间,我们会遇到一个同步问题,而不是不说话的fr_CA贡献者很容易解决。

对我来说似乎更有意义的是,有某种形式的“覆盖”设置,我们可以“堆叠”这些语言。fr在基础上,然后fr_CA,然后是任何更具体的语言环境变体。我想要的是,一旦这些都被定义,那么翻译器只需要更新fr_CA该语言环境和堆栈中“下面”的语言环境之间的差异,在这种情况下fr。通过将与更一般的语言环境相比没有不同的内容保留在任何层下方,我们可以根据需要自由地进行更正/更新,而不会产生同步问题。

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

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

4

1 回答 1

0

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

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

于 2016-03-16T18:45:38.813 回答