Настройка культуры (en-IN) в глобальном масштабе в приложении WPF - PullRequest
23 голосов
/ 17 сентября 2011

У меня есть приложение, которое базируется на Индии, и я устанавливаю Культуру как:

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

Приведенный выше код устанавливается до вызова метода Window - InitializeComponent.

Тем не менее это показывает $ как CurrencySymbol во всем TextBox.

Если я связываю TextBox следующим образом, он показывает 'Rs.' как CurrencySymbol:

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

Ответы [ 3 ]

37 голосов
/ 17 сентября 2011

Я думаю, вам нужно будет добавить следующее.

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)));
}
9 голосов
/ 05 февраля 2018

Для меня просто работает, если я помещу этот код в переопределенный метод 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);
      }
}
5 голосов
/ 17 сентября 2011
Thread.CurrentThread.CurrentCulture = 
    System.Globalization.CultureInfo.GetCultureInfo("en-IN");

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

Это переключит язык по умолчанию для всего приложения.Вы захотите использовать это только в коде запуска, так как этот параметр может быть применен только один раз для каждого приложения.При необходимости вы все равно можете переопределить отдельные формы, как показано ниже:

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

Все элементы WPF включают свойство языка, которое можно назначить, и определяет язык, используемый для форматирования.1008 * Ссылка

...