Python 如何";堆栈";gettext中的语言
可能是一个错误的标题,对不起,但我希望我能在下面更好地解释 我是一个受欢迎的开源项目的一部分,我们希望为该项目提供我们的观众想要的任何语言代码的翻译。我们的翻译都是由我们的用户群提供的,我们愿意支持这群支持者/用户所需要的任何东西 该项目是用Python/Django编写的,我们使用gettext和Transifex提供管理翻译建议的出色服务 当有人想要语言的地区变体时,我们的问题就来了。让我们假设这个问题是法语(fr) 我们已经为语言代码Python 如何";堆栈";gettext中的语言,python,django,gettext,transifex,Python,Django,Gettext,Transifex,可能是一个错误的标题,对不起,但我希望我能在下面更好地解释 我是一个受欢迎的开源项目的一部分,我们希望为该项目提供我们的观众想要的任何语言代码的翻译。我们的翻译都是由我们的用户群提供的,我们愿意支持这群支持者/用户所需要的任何东西 该项目是用Python/Django编写的,我们使用gettext和Transifex提供管理翻译建议的出色服务 当有人想要语言的地区变体时,我们的问题就来了。让我们假设这个问题是法语(fr) 我们已经为语言代码fr提供了可靠的翻译。但是,如果来自(比如)加拿大的投稿
fr
提供了可靠的翻译。但是,如果来自(比如)加拿大的投稿人出现并希望投稿fr\u CA
,由于以下情况,我们会突然遇到维护难题:
fr\u CA
翻译不完整。在本例中,gettext返回到“untranslated”,在我们的项目中,它的意思是en
fr\u CA
翻译从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)