2011-01-08 11 views
22

私はすべての私のresourcebundleの値をテーブルに持っていて、requirement.iに従って書式設定されています。ページ上部にドロップダウンしたユーザーの選択に基づいてウェブサイトの言語を変更する必要があります。言語コードをen_USとして使用すると、正常に動作します。もし私が言語コードとしてen-Usを使用していれば、それは動作しません。何が問題なのでしょうか。何が正しい?米国はJavaでは3166
で指定された国コードがある一方でen-USとen_USのロケールの作成の違いは何ですか?

答えて

17

「en」がISO 639で指定された言語コードがあり、Localeオブジェクトは、languageCode_countryCode(例えばen_USの)としてではなく、languageCode-などの言語を認識し、 countryCode

21

「en-US」はIETF language tagです。 Java'a Localeクラスは明らかにIETF言語タグに基づいていましたが、ハイフンの代わりにハイフンの代わりに国コード(およびバリアント)からアンダースコアが使用されています。をLocaleで呼び出すとen_USとなります。

Java 7では、Locale.forLanguageTag(String)toLanguageTag()を使用すると、言語タグとLocaleオブジェクトを変換できます。

文字列をLocaleオブジェクトに変換する場合、ハイフンとアンダースコアでコンポーネントを分割し、最初のコンポーネント(言語コード)を小文字にし、2番目のコンポーネント(国コード)を大文字にして正規化することをお勧めします。

+0

この回答はJavaコードで何をすべきかに最適です。他の言語/フレームワークではなく、それほど多くはありません。異なる規約を持つフレームワーク間で呼び出しを行うときは、変換が必要であることを知る必要があるコーダーの「大問題」があります。呼び出し元のフレームワークの規約を使用することをお勧めします。別のフレームワークを呼び出すときは、変換を行う "プロキシ"を用意してください。どうして?呼び出されたフレームワークが異なる規約を使用していることを知る必要がなくなります。コントリビューターは、それを使って1つの大会のみを見て、その大事な出来事を避けるでしょう。 – DaBlick

6

Locale us = Locale.forLanguageTag("en-US")us.toLanguageTag()を使用すると、エラーが発生しやすい独自の実装を作成せずに変換を実行できます。

1

Java 8以降 ロケールの初期化は、言語タグ "en-US" Locale.forLanguageTag( "en-US")。toString();を使用して行う必要があります。 en_US

Locale.forLanguageTag( "en_US")は、必要なロケールを作成しません。デフォルトではシステムロケールになります。 Locale.forLanguageTag( "en_US")。toString()はnullを返します。

関連する問題