StringFormat स्थानीयकरण मुद्दों wpf में


112

WPF 3.5SP1 में मैं डेटाबिंडिंग में अंतिम सुविधा StringFormat का उपयोग करता हूं:

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

मेरे सामने समस्या यह है कि तारीख हमेशा अंग्रेजी में स्वरूपित होती है ... हालांकि मेरा सिस्टम फ्रेंच में है? मैं सिस्टम तिथि का पालन करने के लिए तारीख को कैसे मजबूर कर सकता हूं?


14
3 साल एक उच्च श्रेणी का प्रश्न लेकिन कोई जवाब नहीं चिह्नित! दुखद दौर का सामना करना पड़ता है।
गुसाडोर

जवाबों:


212
// 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 में एक अंतर्राष्ट्रीयकृत विज़ार्ड बनाने से


17
हाँ, यह काफी कष्टप्रद है। +1
सिजोन रोजगा 15

2
मेरे सिरदर्द को हल करने के लिए धन्यवाद।
Skurmedel

9
महान। लेकिन अगर आवेदन के जीवनचक्र के दौरान संस्कृति बदल जाती है तो क्या करें (जैसे उपयोगकर्ता सेटिंग्स संवाद में अपनी पसंदीदा संस्कृति को बदल सकता है)। दस्तावेज़ीकरण फ्रेमवर्क के अनुसार।
लैंग्वेजप्रोप्रोपरेटी। ऑवरराइडमाटाडेटा को

1
@ पेंगिबोट यह समाधान मेरे लिए काम करता है। मैं .net 4 / C # / WPF का उपयोग कर रहा हूं और मैंने कोड को ऑनस्टार्टअप विधि में डाल दिया है।
ब्योर्न

18
ध्यान दें कि रन एलिमेंट फ्रेमवर्क से विरासत में नहीं मिलता है , इसलिए यदि आप डेट आदि को एक रन से बांधते हैं तो आपको टाइपोफ के
Mat Fergusson

90

निम्नलिखित 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या जो भी आपने आपूर्ति की है उसका उपयोग करेगा ।

यह समाधान आपके Bindings को सही मानों के साथ तुरंत अपडेट कर देगा लेकिन ऐसा लगता है कि यह बहुत दुर्लभ और सहज ज्ञान युक्त चीज़ों के लिए बहुत सारे कोड जैसा है।


4
अति उत्कृष्ट! यह अद्भुत काम किया! मुझे इसे उन कुछ स्थानों पर जोड़ने में कोई समस्या नहीं है जहाँ इसकी आवश्यकता है। Btw अपने उदाहरण एक याद आ रही है
Johncl

3
उत्कृष्ट कार्य। यह इतना अजीब है कि वर्तमान संस्कृति के विपरीत, WPF यूएस-अंग्रेजी का उपयोग डिफ़ॉल्ट रूप से करता है।
क्रिश एडम्स

12

मैं सिर्फ उस लॉरडेरोन का जवाब जोड़ना चाहता हूं जो ज्यादातर मामलों में महान काम करता है। जब मैं अपने App.xaml.cs में कोड की निम्न पंक्ति डालता हूं, तो मेरे TextBlock में दिनांक सही संस्कृति में स्वरूपित हो जाते हैं।

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)

... लेकिन एक टेक्स्टब्लॉक में रन का उपयोग करते समय, डेटटाइम डिफ़ॉल्ट संस्कृति में स्वरूपित होता है।

<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 के जवाब की आवश्यकता थी , अर्थात् कन्वर्टरकल्चर = {x: स्टेटिक 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)

मुझे आशा है कि यह अतिरिक्त उत्तर किसी के काम आएगा।


दरअसल, Run फ्रेमवर्क से नहीं निकलता है। आप लॉरडेरॉन के जवाब को संशोधित करने की कोशिश कर सकते हैं ताकि रन (फ्रेमवर्ककंटेंटमेंट) के आधार के साथ-साथ फ्रेमवर्कफिल्म के लिए उसका कोड दोहराया जा सके।
नाथन फिलिप्स

उन लोगों के लिए जो आश्चर्यचकित कर सकते हैं: xmlns: gl = "clr-namespace: System.Globalization; असेंबली = mscorlib"
इगोर मेस्ज़्रोस

11

बस शीर्ष-स्तर टैग में संस्कृति शॉर्टकट डालें:

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>

5
लेकिन यह उतना ही बुरा है जितना कि यह माना जाता है कि एन-यूएस 'सही' संस्कृति है। यह उपयोगकर्ता की मशीन से सेटिंग्स लेना चाहिए।
मिसनोमर

बहुत बहुत धन्यवाद, यह वही था जिसकी मुझे तलाश थी! यदि WPF को लगता है कि किसी भी स्थिति के लिए en-EN सही संस्कृति है, तो क्या मैं अपने स्थानीयकरण के साथ कर सकता हूं। जैसा कि मैं एक प्रूफ-ऑफ-कॉन्सेप्ट एप्लिकेशन पर काम कर रहा हूं, जहां विकास की गति दिन का क्रम है, इसमें दर्जनों कोड लाइनों के साथ गड़बड़ करने का समय नहीं है, DatePickerयह काम करने के लिए एक एकल प्राप्त करने के लिए है , इसलिए यह आसान फिक्स मिला मुझे जल्दी से वापस ट्रैक पर!
M463

मेरे मामले के लिए सबसे अच्छा जवाब है, अंत में उम्र के लिए तलाश कर दिया गया :) और निश्चित रूप से यह सही है, या तो आप अपनी en-US मान या यह de-डे है ... लोगों को हमेशा सरल समाधान के साथ समस्या है -.-
MushyPeas

10

जैसा कि पहले ही कहा गया है, एक्सएएमएल आक्रमणकारी संस्कृति (एन-यूएस) में चूक करता है, और आप उपयोग कर सकते हैं

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"

यदि आप XAML के बजाय कोड के माध्यम से ऐसा कर रहे हैं, तो यह इस प्रकार है:binding.ConverterCulture = System.Globalization.CultureInfo.CurrentCulture;
Metalogic

8

यदि आपको प्रोग्राम चलाते समय भाषा बदलने की आवश्यकता है, तो आप अपने मूल तत्व पर भाषा की संपत्ति को बदल सकते हैं (यदि यह तत्काल प्रभाव है या यदि उप तत्व को फिर से बनाया जाना है, तो अनिश्चित है, मेरे मामले में यह कम से कम काम करता है)

element.Language = System.Windows.Markup.XmlLanguage.GetLanguage(culture.IetfLanguageTag);

यह तुरंत पुनर्मूल्यांकन करता है, लेकिन दुख की बात यह है कि प्रत्येक और हर रोस्टेलेमेंट (विंडो) अलग करना होगा
Firo

6

स्थानीयकरण को स्विच करने का पूरा कोड <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

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

0

यदि आप XAML के बजाय कोड पर काम कर रहे हैं, तो आप कन्वर्टर को इस प्रकार सेट कर सकते हैं:

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

डिफ़ॉल्ट संस्कृति की परिभाषा का उपयोग करने और उपयोगकर्ता की अनुकूलित संस्कृति परिभाषा का उपयोग करने के बीच सूक्ष्म अंतर को इंगित करने के लिए कुडोस @KZeise।


-3

लेबल (संस्कृति सहित) का उपयोग करें और टेक्सब्लॉक नहीं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.