web-dev-qa-db-ja.com

CultureInfo.CreateSpecificCulture()とクラスのコンストラクターの違いは?

クラスCultureInfoは、2つの作成方法を提供します。

MSDNのドキュメントは、コンストラクターの「Windowsカルチャー」について言及し、2つについては少し異なります。しかし、それは本当に重要なのでしょうか?

2つのうちどちらか一方を優先しますか?

注:必要に応じて.NETバージョン3.5を使用しています。次のように使用します。

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

として この回答で説明されています。

33
Marcel

ファクトリーメソッドは、カルチャ情報の作成に失敗するとフォールバックします。

したがって、「en-XX」などの特定のカルチャを使用すると、カルチャ情報インスタンスを作成できず、例外がスローされ、ニュートラルカルチャ「en」での再試行が成功します。

ファクトリーメソッドの source の下

public static CultureInfo CreateSpecificCulture(string name)
{
    CultureInfo info;
    try
    {
        info = new CultureInfo(name);
    }
    catch (ArgumentException)
    {
        info = null;
        for (int i = 0; i < name.Length; i++)
        {
            if ('-' == name[i])
            {
                try
                {
                    info = new CultureInfo(name.Substring(0, i));
                    break;
                }
                catch (ArgumentException)
                {
                    throw;
                }
            }
        }
        if (info == null)
        {
            throw;
        }
    }
    if (!info.IsNeutralCulture)
    {
        return info;
    }
    return new CultureInfo(info.m_cultureData.SSPECIFICCULTURE);
}

だから私はファクトリーメソッドを好む。

28
Erwin

このスレッドは既に回答済みですが、CreateSpecificCulture APIのユニークな発見に出くわしました。そのため、このスレッドは私の発見にふさわしい場所であると考えました。私はこれに数日を費やしたので、他の人にも数時間または数日を節約することができるなら私の経験を共有することを考えました。

APIを使用する場合、pt(ポルトガル語の場合)またはde(ドイツ語の場合)などのカルチャ名のみを渡すと、このAPIはデフォルトロケールと呼ばれるロケールに対応する特定のカルチャを返しますその文化のために。このロケールは、行き詰まったように聞こえるので、それほど明白ではないかもしれません。ドイツ語の場合、de-DEドイツ語が話されているドイツ語は明らかです。イタリア語の場合、it-ITは、イタリアで話されているイタリア語であることが明らかです。

同様にpt-PTは、ポルトガル語で話されているポルトガル語で明らかです。残念ながらこれはそうではありません。正確な理由(人口、出身国、国語など)が不明な場合、文化IDから特定の文化を作成しようとしたときに、特定の文化のデフォルトロケールが決定されるグローバルな標準化(この場合、pt)。マイクロソフトは、次のリンクでリスト全体を文書化しています。

http://msdn.Microsoft.com/en-us/goglobal/bb896001.aspx

特定のカルチャまたは言語のデフォルトの国ロケールを知りたい場合は、上記のリンクの最後の列(Language Name Abbreviation)のコードと一致させてください。

ポルトガル語の場合、インバリアントカルチャ「Portuguese」の言語名の省略形は、PTBである「Portuguese(Brazil)」と一致します。ポルトガル語(ポルトガル)は異なるコードPTGを持っています。したがって、この場合、ポルトガル語(ブラジル)がポルトガル語のデフォルトロケールです

アプリケーションのロジックまたは要件が何らかの形でこのAPIのこの動作に依存している場合は、注意が必要です。多言語ウェブサイトのローカライズバージョンを表示している場合、市場のすべてのブラウザもこれらのガイドラインに従い、httpリクエストヘッダーで適切な情報を送信するため、この動作はウェブベースのアプリケーションでより重要になります。

[〜#〜] [〜#〜]の理由で、特定の国をデフォルトのロケールとして設定しない理由はまだありません。ポルトガル語の場合はとても明白に聞こえます。どんな情報やコメントも大歓迎です。

7
RBT

ファクトリメソッドとコンストラクタの間には、もう1つの顕著な違いがあります。コンストラクタは、オプションのブール値を追加で提供します。このブール値はデフォルトでtrueに設定されています。

> "plain" <cultureinfoが本当に必要な場合は、このブール値をfalseに設定する必要があります。理由は次のとおりです。特定のカルチャを要求している場合(例:de-DE)「ブール値をfalseに設定」しないと、ユーザーがControl-Panelを介してこのカルチャーをどのように変更したかによって、予期しない設定が含まれるカルチャー設定が常に表示されます。

ファクトリメソッドはこのブール値をサポートしていません!!!

このブール値にしたいときの最後の2つの考え:

  • true:UIの出力を生成しています-この出力は、ユーザーがコントロールパネルを介して選択した特定のカルチャー設定に従っている必要があります
  • false:データを(たとえば、XMLから)解析し、特定のXML-culture-settings(たとえば、カンマとしてのdecimal-separator)を知っている。この場合、plain de-DE-特別なコントロールパネル設定が干渉しないことを確認するための文化。
1
Rüdiger