Setting Culture (en-IN) globally in WPF application

自作多情 提交于 2019-12-27 17:37:45

问题


I have an application, which is based for India, and I'm setting Culture as:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-IN");

The above code is called before the Window.InitializeComponent() method is called.

Still this is showing $ as CurrencySymbol in all TextBoxes.

If I bind a TextBox as following, it shows Rs. as CurrencySymbol:

Text="{Binding Salary,Mode=TwoWay,StringFormat=C,ConvertCulture=en-IN}".

回答1:


I think you will need to add the following.

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)));

Read more here:

http://www.west-wind.com/weblog/posts/2009/Jun/14/WPF-Bindings-and-CurrentCulture-Formatting

Just to give you an example, this is how I initialize the Culture in my program, based on the user setting, but you can simply replace UserSettings.DefaultCulture and UserSettings.Default.UICultrue with your wanted Culture.

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)));
}



回答2:


For me just works, if i put this code to the OnStartup overrided method:

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);
      }
}



回答3:


Thread.CurrentThread.CurrentCulture = 
    System.Globalization.CultureInfo.GetCultureInfo("en-IN");

FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement),
 new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

This will switch the default language for the entire application. You’ll want to use this only in startup code as this setting can be applied only once per application. You can still override individual forms when necessary as below

this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag);

All WPF elements include a Language property that can be assigned and determines the Culture that is used for formatting.

Reference




回答4:


To me just this worked, but in order to solve ToString and to make it work over the entire app, it's important to add it in constructor, not OnStartup etc, before you set up service container etc. otherwise it doesn't work in subsequent threads and CultureInfo.CurrentUICulture still resolves to the default system 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)
       ...;        
  }
}


来源:https://stackoverflow.com/questions/7454024/setting-culture-en-in-globally-in-wpf-application

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!