14

現在、次のようなすべてのタイムゾーンのリストを取得しています。

var TheListOfAllTimezones = TimeZoneInfo.GetSystemTimeZones();

たとえば、パリのタイムゾーンには。のDisplayNameプロパティがありW. Europe Standard Timeます。このリストを別の言語で取得するにはどうすればよいですか?たとえば、フランスのユーザーの場合、を表示したいと思いますHeure Europe de l'Ouest

ありがとう。

ここに画像の説明を入力してください

4

4 に答える 4

6

CurrentCulture情報はレジストリ(XP)または多言語ユーザーインターフェイス(MUI)DLL(Vista、Windows 7)から取得されるため、の変更は機能しません。

VistaまたはWindows7では、他の言語をインストールして表示言語を変更できます( [地域と言語] ->[キーボードと言語] ->[表示言語])。再起動が必要です。これ、そしてこれだけが、で使用される言語を実際に変更しTimeZoneInfoます。

Windows 7では、UltimateとEnterpriseのみが、多言語ユーザーインターフェイスパックをインストールすることにより、他の言語のインストールを許可します。

他の言語をインストールすると、system32フォルダーでDLLを見つけて(を探してtzres)、VisualStudioでリソースをエクスポートできるようになります。

信頼できる/公式の情報源について-BCLチームのmsdnに関する記事はどうですか

...表示文字列は、Multilingual User Interface(MUI)DLL、tzres.dllから、またはMUIサポートが利用できない場合はレジストリから直接ロードされます。Windows VistaなどのMUI対応のオペレーティングシステムには、、、およびキーが含まれMUI_DisplayMUI_StdMUI_Dltます。これらは、オペレーティングシステムの地域設定によって間接的に制御されます。WindowsXPやWindowsServer2003などの下位レベルのプラットフォームでは、、、、およびキーのみDisplayStd存在Dltします。、、、およびキーの値はDisplay、 オペレーティングシステムのデフォルト言語でのみローカライズされます。StdDlt

それで彼らは何について書いたのCurrentUICultureですか?

Windowsのタイムゾーンレジストリアーキテクチャにより、 CurrentUICulture設定はこれらのTimeZoneInfoプロパティの値に影響を与えません

于 2012-11-02T20:43:27.103 に答える
1

スレッドのCurrentCultureがフランス語( "fr-FR")であり、その言語がWindowsバージョンで「ネイティブ」である場合、プロパティStandardNameDaylightNameはフランス語になります。

編集:

CurrentCultureスレッドの変更が役立つようには見えません。タイムゾーンはすべてレジストリから取得され(パスについてはJim Mischelの回答を参照)、Windowsインストールの言語が値を決定しているように見えます。ID(レジストリパスのキー)は常に英語ですが、他のプロパティはWindowsの言語に依存します。

次のコードの出力は何ですか。

Console.WriteLine(CultureInfo.InstalledUICulture.DisplayName);

var tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
Console.WriteLine(tzi.Id);              // always English
Console.WriteLine(tzi.DisplayName);     // localized
Console.WriteLine(tzi.StandardName);    // localized
Console.WriteLine(tzi.DaylightName);    // localized
于 2012-10-31T17:25:14.193 に答える
0

ドキュメントから:

このメソッドによって返されるコレクションは、現在のカルチャを使用して表示名でソートされます。

リストを取得する前に、現在のカルチャをユーザーのカルチャに変更してみましたか?

それはうまくいかないかもしれません。使用可能な表示名は、インストールされているWindowsバージョンの表示名のみである可能性があります。つまり、米国英語バージョンのWindowsを使用している場合、フランス語の表示名が表示されない可能性があります。レジストリ(HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones)を見ると、英語の名前しかわかりません。

于 2012-10-31T17:22:36.290 に答える
0

ToLocolizedStringのような名前の静的メソッドを持つ「TimeZoneInfoExtension」のようなクラスを作成するのはどうですか。

public static class TimeZoneInfoExtensions
{
    public static string ToLocalizedString(this TimeZoneInfo timeZone)
    {
        switch (timeZone.Id)
        {
            case "Dateline Standard Time":
                return i18n.DatelineStandardTime;

            case "UTC-11":
                return i18n.UTC11;

            case "Hawaiian Standard Time":
                return i18n.HawaiianStandardTime;

            case "Alaskan Standard Time":
                return i18n.AlaskanStandardTime;

            ....

            default:
                throw new NotImplementedException();
        }
    }
}

ここで、i18nはリソースを持つクラスです。そして、はい、あなたは手動で翻訳を記入しなければなりません。しかし、私は翻訳を生成するために、さまざまなシステム言語でこのようなものを使用しました。

Regex rgx = new Regex("[ +-]");
foreach (var timeZone in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine("  <data name=\"{0}\" xml:space=\"preserve\">", rgx.Replace(timeZone.Id, string.Empty));
    Console.WriteLine("    <value>{0}</value>", timeZone.DisplayName);
    Console.WriteLine("  </data>");
}

そして、次のようにCurrentCultureに応じて使用できます。

foreach (var timeZoneInfo in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine(timeZoneInfo.ToLocalizedString());
}
于 2014-07-01T06:37:26.710 に答える