Web フォーム (asp.net) でコーディングされた Web アプリケーションをローカライズしようとしています。問題を説明すると: 「私の名前はジョニーで、私は 12 歳です」のような文を翻訳する場合、名前と年齢が動的に取得されると仮定すると、名前とターゲット言語で文法的に正しくなるように、翻訳の年齢を変更します。string.Format を使用して {0} と {1} をリソース ファイルに入れ、翻訳者に任せればよいと考えていました。しかし、これを達成するためのより良いアプローチがあるかどうか知りたいですか? これは非常に頻繁に出てくると確信しています。
2 に答える
私は多くの Microsoft ソフトウェアのローカリゼーションに携わるという不運に見舞われましたが、これは当たり前のことだと言えます。ローカライザーはプレースホルダー付きの文字列を見ることに慣れており、あなたの例 (「私の名前は {0} で、私は {1} 歳です」) では、理解するのは難しくありません。値が 0 または 1 の場合、年の s は正しくないため、singular のバリアントを追加する必要があります (ただし、これは単なる例であることはわかっています)。
大企業は、個々の文字列のルールを定義および検証する独自のソフトウェアさえ持っており、これを使用して、翻訳者が不正な形式のプレースホルダーや文字列を許容範囲を超えて作成するなどのバグを導入しないようにします。
プレースホルダー文字列については、コメント機能を使用する (つまり、Visual Studio リソース エディターの [コメント] 列に入力する) ことをお勧めします。これにより、ローカライザーにプレースホルダーについて伝え、例を示すことができます。その後、必要に応じてプレースホルダーを並べ替えることができます。ただし、これを行ったとしても、ローカライザーは間違いやすい (そして時間に対して十分な報酬が得られない) ため、プレースホルダーに関してはバグが一般的であることに注意してください。実際の例としては、印刷ページの下部に表示される「{1} の {0}」という文字列があります (ページ数に関連する「1 of 3」など)。最も一般的なフランス語の翻訳は、直訳の「{0} de {1}」です。これは、ページ数の特定のコンテキストでは正しくありません。このコンテキストでは、「{0} sur {1}」のはずです。しかし、印刷を行うほとんどのアプリケーションでは、これがフランス語で間違って翻訳されています。また、文字列がどのように使用されるかを翻訳者が知らなくても、翻訳者を責めることはできません。
Clafouからの良い答え。実際にはさらに複雑になります。
JA: あなたは車を獲得しました。=> {0} を獲得しました
そして今、あなたはそこにボート、休日など何でも入れることができると思います.
残念ながら、他の言語では記事が常に同じとは限りません。
DE: Sie haben ein Auto gewonnen.
しかし
Sie haben Ferien gewonnen (記事なし) またはSie haben eine Gurke gewonnen . (別記事)。イタリア語やその他の言語についても同様です。したがって、記事を変数に含める必要があります。