Настройка культуры (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)));