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 に答える