Как "сложить" языки в gettext
Возможно, ошибочное название, извините, но я надеюсь, что смогу объяснить лучше ниже.
Я являюсь частью популярного проекта с открытым исходным кодом, и мы хотели бы предоставить переводы для проекта для любого языкового кода, который пожелает наша аудитория. Все наши переводы предоставлены нашей пользовательской базой, и мы хотели бы поддержать все, что нужно этой группе сторонников / пользователей.
Проект написан на Python/Django, и мы используем gettext и, в конечном счете, Transifex для их замечательного сервиса для управления предложениями по переводу.
Проблема для нас возникает, когда кто-то хочет языковой вариант языка. Давайте предположим французский (фр) для этого вопроса.
У нас уже есть надежный перевод для языкового кода fr
, Однако, если участник, скажем, из Канады, приходит и желает внести свой вклад fr_CA
у нас внезапно возникает головная боль из-за следующих сценариев:
fr_CA
переводы не завершены. В этом случае gettext возвращается к "непереведенному", что в нашем проекте означаетen
,Если
fr_CA
переводы копируют обильные биты изfr
затем просто изменяем некоторые биты здесь и там, чтобы лучше соответствовать локали, затем мы обнаруживаем, что нам нужно что-то изменить в базеfr
перевод, внезапно, у нас возникнет проблема синхронизации, которая не может быть легко решенаfr_CA
говорящие участники.
Мне кажется, что имеет больше смысла в том, что существует некоторая форма "наложения", где мы можем "складывать" языки. fr
на базе, то fr_CA
, а затем любые еще более конкретные варианты локали. Я хотел бы, чтобы после того, как все они определены, переводчику нужно только обновить fr_CA
с различиями между этим языком и языком "под" в стеке, в данном случае fr
, Оставляя вещи, которые не отличаются от более общего языкового стандарта под любым слоем, мы можем вносить исправления / обновления по мере необходимости, не вызывая проблемы синхронизации.
Я бы подумал, что этот вид "стекирования" будет в конечном итоге решен в процессе создания соответствующих MO-файлов.
Кто-нибудь знает, как мы могли бы сделать это?
1 ответ
Django поддерживает внутреннюю поддержку откатов языков, которая на самом деле опирается на поддержку gettext, но, насколько я могу судить, она не предоставляет разработчикам способа ее настройки. Посмотрите на фрагмент ниже, взятый из кода Джанго.
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
несколько раз, в зависимости от ваших потребностей.