2011-12-09 10 views
2

私は以下のような名前のリストを含む文字列を持っています: "Johnは新年の計画についてKim、Kelly、LeeとBobに尋ねました"。リスト内の名前の数は非常に多いことがあります。 これをJavaでローカライズするにはどうすればよいですか? 私はResourceBundleとMessageFormatについて考えています。これのためのパターンをMessageFormatにどのように記述しますか? より良いアプローチはありますか?名前のリストを含む文字列をローカライズ

+0

異なるローカライゼーションで文字列がどのように見えるかの例を挙げることはできますか? –

+0

私の問題は、書式設定(ローカライズされた文字列パターンに名前を動的に挿入する)と関連しています。 '{1}のようなものが新年の計画について{2}と{3}を尋ねました。' –

答えて

2

あなたが好きな何かができる:0は最初の名前であり、1は他の名前のカンマ区切りリストです

"{0} asked {1} about the new year plans" 

これが役に立ちます。

+0

{1}はコンマで区切ったリストにすることはできません。また、 'と'をローカライズする必要があります。 –

+1

人数に基づいて別のフォーマッタによって構築された "1"を持つ必要があります:1人しか存在しない場合は "{0}"(またはフォーマットなし)、 "{0}および{1}"複数ある場合は0が最後の人以外のすべてのカンマ区切りリストになり、1が最後の人になります。 – cjstehno

1

ローカライゼーションでは、外部の言語パックを使用します。ファイルには、表示するテキストが含まれています。各テキストに名前/キーを割り当て、キーでプログラムにテキストを読み込みます。

0
あなたは(名前のプレースホルダを置き換えるために)のMessageFormatで(I18Nのために)あなたのResourceBundleを組み合わせることができ

:「{0}尋ね{1}、新しい年の計画について」

それがするのはあなた次第だろうしかし、事前に名前を準備してください。

2

私は答えがすでに受け入れられているのを見ましたが、これを代替としてここに追加しています。コードは、ハードデータ値を符号化しているが、唯一の洗練させることができるアイデア提示することを意味する:

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番目の引数のコンマ区切り文字列の作成はサンプルには表示されませんが、使用したハードコード値を使用する代わりに簡単に行うことができます。

11

(インライン)リストをローカライズするだけでは、 "and"という言葉を翻訳するだけではありません.CLDRはフォーマットリストの問題を扱い、page on listsをチェックします。 ICUはこれをまだサポートしていないのではないかと心配しています。そのため、ICUは個別にコードを作成する必要があります。

もう1つの問題は、このような文章で名前を使用できることを期待できないことです。多くの言語では、オブジェクトが傾斜した形になることが必要です。フィンランド語では、あなたのサンプル文章は "John kysyiKimiltä、Kellyltä、Leeltäja Bobilta uudenvuoden suunnitelmista"と読み替えることになります。さらに、使用する言語にラテンアルファベットが含まれていない場合は、字体の字体が必要です(アラビア語、ヨハネなど)。他にも問題があります。ロシア語では、「尋ねられる」に対応する動詞は主題の性別によって異なります(例:спросилаvs.спросил)。

これは複雑ですが、ローカリゼーションはしばしば複雑です。限られた言語セットのみをターゲットにすると、作業がはるかに簡単になる可能性があります。目標を定義することが重要です。文法的に不正確な表現につながるような単純化を受け入れます。しかし、広範囲の言語をカバーするローカリゼーションでは、生成関数をローカライズする必要があります。つまり、各言語について、名前のリストを引数として受け取り、その名前を表す情報(字形、異なる傾きの形式、性別)を含むリソースファイルを使用して、文を表す文字列を返す関数を持つことができます。現れる。

場合によっては、英語で文章を生成し、それをオンライン翻訳者に送信することも考えられます。たとえば、Google Translatorは、私が言及したいくつかの問題に対処することができます。確かに誤った翻訳がたくさん出ますが、文法的に非常に単純な構造の文では、ある程度の誤りを受け入れることができれば、実用的な解決策になるかもしれません。これを試すことを検討する場合は、自動翻訳者が使用する特定の文章をどのように処理できるかを十分にテストしてください。文を再定式化することで結果を改善することがよくあります。ある文章を複数の文節に分割することは、しばしば役に立ちます。しかし、あなたの単純な文章でさえ、自動翻訳で問題を引き起こします。

文構造を再構成することができれば、いくつかの複雑さを避けることができます。すべての名詞が件名に表示され、「新年の計画」のような「詰め込まれた」表現は避けてください。たとえば、「Johnは、新年のKim、Kelly、Lee、Bobの計画にもっと簡単です自動翻訳とパターンベースのローカリゼーションの両方を可能にします。

+2

ICUのバージョン50以降では、この(ListFormatter)用のAPIが提供されています。 http://site.icu-project.org/download/50を参照してください: "Java util.ListFormatをtext.ListFormatterおよびその他の更新に変更し、CLDRデータ(#9369、#9420)、ポートをC++(#7168)"に変更する – Fredrik

+0

@Fredrik、ListFormatterは、リスト内の句読点(例えば "A、B、C"対 "A、B、C")と "and"の句読点を処理するためのものです。問題のような文のローカライズには他にも多くの問題があります。 –

+0

私はそれが何をしているか知っています。私のコメントは、「私はICUにはまだこれがサポートされていないのではないか」との明確な説明でした。 ListFormatterは、あなたが言及したCLDRデータ用のAPIです。 – Fredrik

関連する問題