StringFormat Проблемы с локализацией в wpf

В WPF 3.5SP1 я использую последнюю функцию StringFormat в DataBindings:

 <TextBlock Text="{Binding Path=Model.SelectedNoteBook.OriginalDate, StringFormat='f'}"
                                   FontSize="20"
                                   TextTrimming="CharacterEllipsis" />

Проблема, с которой я сталкиваюсь, заключается в том, что дата всегда форматируется на английском языке ... хотя моя система на французском? Как заставить дату следовать системной дате?

101 голос | спросил jonathan 6 FebruaryEurope/MoscowbFri, 06 Feb 2009 15:28:27 +0300000000pmFri, 06 Feb 2009 15:28:27 +030009 2009, 15:28:27

10 ответов


0
// Ensure the current culture passed into bindings is the OS culture.
// By default, WPF uses en-US as the culture, regardless of the system settings.
FrameworkElement.LanguageProperty.OverrideMetadata(
      typeof(FrameworkElement),
      new FrameworkPropertyMetadata(
          XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

Из создания интернационализированного мастера в WPF

ответил loraderon 6 FebruaryEurope/MoscowbFri, 06 Feb 2009 16:45:54 +0300000000pmFri, 06 Feb 2009 16:45:54 +030009 2009, 16:45:54
0

Определите следующее пространство имен xml:

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"

Теперь вот это фантастическое исправление:

<TextBlock Text="{Binding Path=Model.SelectedNoteBook.OriginalDate, StringFormat='f', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}" FontSize="20"TextTrimming="CharacterEllipsis" />

Я хорошо знаю, что это не глобальное исправление, и вам потребуется его для каждой привязки, но, конечно, это просто хороший XAML? Насколько я знаю, при следующем обновлении привязки будет использоваться правильный CultureInfo.CurrentCulture или что-то еще, что вы предоставили.

Это решение немедленно обновит ваши привязки с правильными значениями , но кажется, что для такого редкого и безобидного кода много кода.

ответил Gusdor 21 J0000006Europe/Moscow 2011, 13:30:17
0

Просто вставьте ярлык культуры в тег верхнего уровня:

xml:lang="de-DE"

например:.

<Window x:Class="MyApp"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xml:lang="de-DE"
    Title="MyApp" Height="309" Width="497" Loaded="Window_Loaded">....</Window>
ответил Gerrit Horeis 2 52012vEurope/Moscow11bEurope/MoscowFri, 02 Nov 2012 19:16:36 +0400 2012, 19:16:36
0

Если вам нужно изменить язык во время работы программы, вы можете просто изменить свойство Language вашего корневого элемента (я не уверен, что это дает мгновенный эффект, или если подэлемент необходимо воссоздать, в моем случае это работает по крайней мере)

element.Language = System.Windows.Markup.XmlLanguage.GetLanguage(culture.IetfLanguageTag);
ответил Peter 2 MarpmWed, 02 Mar 2011 17:39:26 +03002011-03-02T17:39:26+03:0005 2011, 17:39:26
0

Я просто хотел добавить, что ответ loraderon отлично работает в большинстве случаев. Когда я добавляю следующую строку кода в мой файл App.xaml.cs, даты в моих текстовых блоках форматируются в правильной культуре.

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

Я говорю «в большинстве случаев». Например, это будет работать из коробки:

 <TextBlock Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}}" />
--> "16 mei 2013" (this is in Dutch)

... но при использовании Run в TextBlock DateTime форматируется в культуре по умолчанию.

 <TextBlock>
  <Run Text="Datum: " />
  <Run Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}, Mode=OneWay}" />
</TextBlock>
--> "Datum: 16 may 2013" (this is in English, notice the
    name of the month "may" vs. "mei")

Чтобы это работало, мне понадобился ответ Gusdor , а именно добавление ConverterCulture = {x: Static gl: CultureInfo.CurrentCulture} в привязку.

 <TextBlock>
  <Run Text="Datum: " />
  <Run Text="{Binding Path=Date, StringFormat={}{0:d MMMM yyyy}, ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}, Mode=OneWay}" />
</TextBlock>
--> "Datum: 16 mei 2013" (=Dutch)

Надеюсь, этот дополнительный ответ кому-нибудь пригодится.

ответил Daniël Teunkens 16 Maypm13 2013, 12:02:17
0

Как уже говорилось, по умолчанию в XAML используется инвариантная культура (en-US), и вы можете использовать

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

для установки культуры на культуру по умолчанию для языка текущей культуры. Но комментарий неправильный; это не использует текущую культуру, так как вы не увидите никаких настроек, которые мог сделать пользователь, это всегда будет языком по умолчанию.

Чтобы фактически использовать текущую культуру с настройками, вам нужно установить ConverterCulture вместе с StringFormat, как в

Text="{Binding Day, StringFormat='d', ConverterCulture={x:Static gl:CultureInfo.CurrentCulture}}"

с gl, определенным как глобальное пространство имен в вашем корневом элементе

xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"
ответил KZeise 6 FebruaryEurope/MoscowbFri, 06 Feb 2015 15:50:56 +0300000000pmFri, 06 Feb 2015 15:50:56 +030015 2015, 15:50:56
0

Полный код для переключения локализации также в таких элементах, как <Run />:

 Private Shared Sub SetXamlBindingLanguage()

    '' For correct regional settings in WPF (e.g. system decimal / dot or comma) 
    Dim lang = System.Windows.Markup.XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(TextElement), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(DefinitionBase), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FixedDocument), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FixedDocumentSequence), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(FlowDocument), New FrameworkPropertyMetadata(lang))
    FrameworkContentElement.LanguageProperty.OverrideMetadata(GetType(TableColumn), New FrameworkPropertyMetadata(lang))
    FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(lang))

End Sub
ответил habakuk 28 J000000Monday14 2014, 15:54:53
0

Если вы хотите изменить информацию о культуре во время выполнения, вы можете использовать поведение (см. ниже)

  public class CultureBehavior<TControl> : Behavior<TControl>
    where TControl : FrameworkElement
{
    private readonly IEventAggregator _eventAggregator;
    private readonly Action<CultureInfo> _handler;

    public CultureBehavior()
    {
        _handler = (ci) => this.AssociatedObject.Language = XmlLanguage.GetLanguage(ci.IetfLanguageTag);
        _eventAggregator = IoC.Container.Resolve<IEventAggregator>();
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        _eventAggregator
            .GetEvent<LanguageChangedEvent>()
            .Subscribe(_handler);

        _handler.Invoke(CultureInfo.CurrentCulture);
    }

    protected override void OnDetaching()
    {
        _eventAggregator
            .GetEvent<LanguageChangedEvent>()
            .Unsubscribe(_handler);

        base.OnDetaching();
    }
}
ответил user3173620 7 MarpmFri, 07 Mar 2014 16:01:18 +04002014-03-07T16:01:18+04:0004 2014, 16:01:18
0

Если вы работаете с кодом, а не с XAML, вы можете установить ConverterCulture следующим образом:

binding.ConverterCulture = System.Globalization.CultureInfo.CurrentCulture;

Спасибо @KZeise за то, что он указал на тонкую разницу между использованием определения культуры по умолчанию и пользовательским определением культуры.

ответил Metalogic 29 Jam1000000amMon, 29 Jan 2018 07:41:27 +030018 2018, 07:41:27
0

Используйте ярлык (включая культуру), а не текстовый блок

ответил david 25 FebruaryEurope/MoscowbThu, 25 Feb 2010 13:31:50 +0300000000pmThu, 25 Feb 2010 13:31:50 +030010 2010, 13:31:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132