インドをベースにしたアプリケーションがあり、Cultureを次のように設定しています。
_Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");
_
上記のコードは、Window.InitializeComponent()
メソッドが呼び出される前に呼び出されます。
それでも、これはすべてのTextBoxで_$
_をCurrencySymbolとして表示しています。
次のようにTextBoxをバインドすると、CurrencySymbolとして_Rs.
_が表示されます。
_Text="{Binding Salary,Mode=TwoWay,StringFormat=C,ConvertCulture=en-IN}".
_
以下を追加する必要があると思います。
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-IN");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
もっと読む:
http://www.west-wind.com/weblog/posts/2009/Jun/14/WPF-Bindings-and-CurrentCulture-Formatting
例を挙げれば、これはユーザー設定に基づいてプログラムでカルチャーを初期化する方法ですが、UserSettings.DefaultCulture
およびUserSettings.Default.UICultrue
希望するカルチャーで。
private static void InitializeCultures()
{
if (!String.IsNullOrEmpty(UserSettings.Default.Culture))
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(UserSettings.Default.Culture);
}
if (!String.IsNullOrEmpty(UserSettings.Default.UICulture))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserSettings.Default.UICulture);
}
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}
私にとっては機能しますが、このコードをOnStartupオーバーライドメソッドに配置すると、次のようになります。
public partial class App : Application
{
public App()
{
}
protected override void OnStartup(StartupEventArgs e)
{
var vCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentCulture = vCulture;
Thread.CurrentThread.CurrentUICulture = vCulture;
CultureInfo.DefaultThreadCurrentCulture = vCulture;
CultureInfo.DefaultThreadCurrentUICulture = vCulture;
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
base.OnStartup(e);
}
}
Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.GetCultureInfo("en-IN");
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
これにより、アプリケーション全体のデフォルト言語が切り替わります。この設定はアプリケーションごとに1回だけ適用できるため、スタートアップコードでのみ使用することをお勧めします。以下のように、必要に応じて個々のフォームをオーバーライドすることもできます
this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);
すべてのWPF要素には、割り当て可能な言語プロパティが含まれており、書式設定に使用されるカルチャを決定します。
私にはこれはうまくいきましたが、ToString
を解決してアプリ全体で機能させるには、サービスコンテナを設定する前に、OnStartup
などではなく、コンストラクタに追加することが重要ですそれ以外の場合、後続のスレッドでは機能せず、CultureInfo.CurrentUICulture
はデフォルトのシステムCultureInfo
に解決されます。
public class App : Application
{
public App()
{
var culture = new CultureInfo("en-IN");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
// should be before all this
var Host = Host
.CreateDefaultBuilder()
.ConfigureServices(ConfigureServices)
...;
}
}