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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

Для меня просто работает, если я помещу этот код в переопределенный метод 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);
      }
}

Ответ 3

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 включают свойство Language, которое может быть назначено и определяет культуру, которая используется для форматирования.

Ссылка

Ответ 4

Это работает для меня, добавьте это в ваш файл app.xaml.cs startupmethod

Thread.CurrentThread.CurrentCulture =
            System.Globalization.CultureInfo.GetCultureInfo("en-IN");
            FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), 
            new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));