Как "сложить" языки в gettext

Возможно, ошибочное название, извините, но я надеюсь, что смогу объяснить лучше ниже.

Я являюсь частью популярного проекта с открытым исходным кодом, и мы хотели бы предоставить переводы для проекта для любого языкового кода, который пожелает наша аудитория. Все наши переводы предоставлены нашей пользовательской базой, и мы хотели бы поддержать все, что нужно этой группе сторонников / пользователей.

Проект написан на Python/Django, и мы используем gettext и, в конечном счете, Transifex для их замечательного сервиса для управления предложениями по переводу.

Проблема для нас возникает, когда кто-то хочет языковой вариант языка. Давайте предположим французский (фр) для этого вопроса.

У нас уже есть надежный перевод для языкового кода fr, Однако, если участник, скажем, из Канады, приходит и желает внести свой вклад fr_CAу нас внезапно возникает головная боль из-за следующих сценариев:

  1. fr_CA переводы не завершены. В этом случае gettext возвращается к "непереведенному", что в нашем проекте означает en,

  2. Если 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 несколько раз, в зависимости от ваших потребностей.

Другие вопросы по тегам