私は以下のような名前のリストを含む文字列を持っています: "Johnは新年の計画についてKim、Kelly、LeeとBobに尋ねました"。リスト内の名前の数は非常に多いことがあります。 これをJavaでローカライズするにはどうすればよいですか? 私はResourceBundleとMessageFormatについて考えています。これのためのパターンをMessageFormatにどのように記述しますか? より良いアプローチはありますか?名前のリストを含む文字列をローカライズ
答えて
あなたが好きな何かができる:0は最初の名前であり、1は他の名前のカンマ区切りリストです
"{0} asked {1} about the new year plans"
。
これが役に立ちます。
{1}はコンマで区切ったリストにすることはできません。また、 'と'をローカライズする必要があります。 –
人数に基づいて別のフォーマッタによって構築された "1"を持つ必要があります:1人しか存在しない場合は "{0}"(またはフォーマットなし)、 "{0}および{1}"複数ある場合は0が最後の人以外のすべてのカンマ区切りリストになり、1が最後の人になります。 – cjstehno
ローカライゼーションでは、外部の言語パックを使用します。ファイルには、表示するテキストが含まれています。各テキストに名前/キーを割り当て、キーでプログラムにテキストを読み込みます。
:「{0}尋ね{1}、新しい年の計画について」
それがするのはあなた次第だろうしかし、事前に名前を準備してください。
私は答えがすでに受け入れられているのを見ましたが、これを代替としてここに追加しています。コードは、ハードデータ値を符号化しているが、唯一の洗練させることができるアイデア提示することを意味する:
John asked no one about the new year plans
John asked Kim about the new year plans
John asked Kim and Kelly about the new year plans
John asked Kim, Kelly, Lee, and Bob about the new year plans
使用される名前の数を決定する:これは以下の出力を
MessageFormat people = new MessageFormat("{0} asked {1,choice,0#no one|1#{2}|2#{2} and {3}|2<{2}, and {3}} about the new year plans");
String john = "John";
Object[][] parties = new Object[][] { {john, 0}, {john, 1, "Kim"}, {john, 2, "Kim", "Kelly}, {john, 4, "Kim, Kelly, Lee", "Bob"}};
for (final Object[] strings : parties) {
System.out.println(people.format(strings));
}
3番目の引数のコンマ区切り文字列の作成はサンプルには表示されませんが、使用したハードコード値を使用する代わりに簡単に行うことができます。
(インライン)リストをローカライズするだけでは、 "and"という言葉を翻訳するだけではありません.CLDRはフォーマットリストの問題を扱い、page on listsをチェックします。 ICUはこれをまだサポートしていないのではないかと心配しています。そのため、ICUは個別にコードを作成する必要があります。
もう1つの問題は、このような文章で名前を使用できることを期待できないことです。多くの言語では、オブジェクトが傾斜した形になることが必要です。フィンランド語では、あなたのサンプル文章は "John kysyiKimiltä、Kellyltä、Leeltäja Bobilta uudenvuoden suunnitelmista"と読み替えることになります。さらに、使用する言語にラテンアルファベットが含まれていない場合は、字体の字体が必要です(アラビア語、ヨハネなど)。他にも問題があります。ロシア語では、「尋ねられる」に対応する動詞は主題の性別によって異なります(例:спросилаvs.спросил)。
これは複雑ですが、ローカリゼーションはしばしば複雑です。限られた言語セットのみをターゲットにすると、作業がはるかに簡単になる可能性があります。目標を定義することが重要です。文法的に不正確な表現につながるような単純化を受け入れます。しかし、広範囲の言語をカバーするローカリゼーションでは、生成関数をローカライズする必要があります。つまり、各言語について、名前のリストを引数として受け取り、その名前を表す情報(字形、異なる傾きの形式、性別)を含むリソースファイルを使用して、文を表す文字列を返す関数を持つことができます。現れる。
場合によっては、英語で文章を生成し、それをオンライン翻訳者に送信することも考えられます。たとえば、Google Translatorは、私が言及したいくつかの問題に対処することができます。確かに誤った翻訳がたくさん出ますが、文法的に非常に単純な構造の文では、ある程度の誤りを受け入れることができれば、実用的な解決策になるかもしれません。これを試すことを検討する場合は、自動翻訳者が使用する特定の文章をどのように処理できるかを十分にテストしてください。文を再定式化することで結果を改善することがよくあります。ある文章を複数の文節に分割することは、しばしば役に立ちます。しかし、あなたの単純な文章でさえ、自動翻訳で問題を引き起こします。
文構造を再構成することができれば、いくつかの複雑さを避けることができます。すべての名詞が件名に表示され、「新年の計画」のような「詰め込まれた」表現は避けてください。たとえば、「Johnは、新年のKim、Kelly、Lee、Bobの計画にもっと簡単です自動翻訳とパターンベースのローカリゼーションの両方を可能にします。
ICUのバージョン50以降では、この(ListFormatter)用のAPIが提供されています。 http://site.icu-project.org/download/50を参照してください: "Java util.ListFormatをtext.ListFormatterおよびその他の更新に変更し、CLDRデータ(#9369、#9420)、ポートをC++(#7168)"に変更する – Fredrik
@Fredrik、ListFormatterは、リスト内の句読点(例えば "A、B、C"対 "A、B、C")と "and"の句読点を処理するためのものです。問題のような文のローカライズには他にも多くの問題があります。 –
私はそれが何をしているか知っています。私のコメントは、「私はICUにはまだこれがサポートされていないのではないか」との明確な説明でした。 ListFormatterは、あなたが言及したCLDRデータ用のAPIです。 – Fredrik
- 1. Power BIクエリエディタ:特定の文字列を含む列名のリスト
- 2. Linux - 文字列を含む名前のファイルを見つける
- 3. C#Linq。文字列のリストを含む
- 4. 文字を含む文字列を含む文字列
- 5. 名前に特定の文字列を含むMatlab FTPダウンロードファイル
- 6. はリストに文字列を含むパラメータを含む
- 7. 文字列とリストを含むタプルのリストをトラバースして、
- 8. 文字列を含むリストのリストを逆転する
- 9. 同じ名前の列を含むデータフレームのリスト
- 10. 特定の文字列を含むフォルダの名前を変更します。
- 11. パンダを返すリストから文字列を含む一連の文字列
- 12. 特殊文字を含む名前のCSS3属性フィルタリング
- 13. バックスラッシュを含む文字列
- 14. 文字列を含むsyslog?
- 15. dplyrに特殊文字を含む名前を選択
- 16. リストを含む文字列を分割する方法(文字列として)
- 17. 文字列と数値を含む列名を生成する
- 18. JSONオブジェクトのリストを含む文字列をロードする
- 19. リストから文字列を含むデータフレーム内の行を検索
- 20. 名前に応じて文字列のリストを注文する
- 21. 文字リストから文字列を含むdfの行を返す方法
- 22. 列名を含む連結文字列に変換する
- 23. 単語のリストを含む文字列の最短スニペット
- 24. バッチファイル名の文字列を含むファイルを検索
- 25. Luaの改行文字を含むパターンを含む文字列をgububbing
- 26. ナチュラルソートC - "数字と文字を含む文字列の配列"
- 27. c#テキストボックステキストを含むリストから文字列を検索する
- 28. データフレーム名の中に文字列を含むRループ
- 29. 2つ以上の文字列を含むSQL名
- 30. 特定の文字列を含むリストのリストのインデックスを返す
異なるローカライゼーションで文字列がどのように見えるかの例を挙げることはできますか? –
私の問題は、書式設定(ローカライズされた文字列パターンに名前を動的に挿入する)と関連しています。 '{1}のようなものが新年の計画について{2}と{3}を尋ねました。' –