স্ট্রিংফর্ম্যাট স্থানীয়করণের সমস্যাগুলি ডাব্লুপিএফ-এ


112

WPF 3.5SP1 এ আমি ডেটাবাইন্ডিংয়ে সর্বশেষ বৈশিষ্ট্য স্ট্রিংফর্ম্যাটটি ব্যবহার করি:

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

ডব্লিউপিএফ-তে আন্তর্জাতিকীকরণ উইজার্ড তৈরি করা থেকে


17
হ্যাঁ এটি বেশ বিরক্তিকর। +1
সাইমন রোজগা

2
আমার মাথাব্যথা সমাধানের জন্য আপনাকে ধন্যবাদ।
স্কুরমেডেল

9
গ্রেট। তবে অ্যাপ্লিকেশনটির জীবনকাল চলাকালীন সংস্কৃতি পরিবর্তিত হলে কী করা উচিত (উদাহরণস্বরূপ ব্যবহারকারী সেটিংসের সংলাপে তার পছন্দের সংস্কৃতিটি পরিবর্তন করতে পারেন)। ডকুমেন্টেশন অনুযায়ী ফ্রেমওয়ার্কএলিমেন্ট.ল্যাঙ্গুয়েজপ্রোপার্টি.অভাররাইডমেটাডাটা একাধিকবার বলা যায় না (এটি একটি ব্যতিক্রম ছোঁড়ে)
টিজেকেজার

1
@pengibot এই সমাধানটি আমার পক্ষে কাজ করে। আমি .net 4 / C # / WPF ব্যবহার করছি এবং আমি কোডটি স্টার্টআপ পদ্ধতিতে রেখেছি।
বিজরন

18
নোট করুন যে রান উপাদানটি ফ্রেমওয়ার্ক এলিমেন্ট থেকে উত্তরাধিকারসূত্রে আসে না , সুতরাং আপনি যদি রানের সাথে তারিখ ইত্যাদি বেঁধে রাখেন তবে টাইপফোনের
মাদুর ফার্গুসন

90

নিম্নলিখিত এক্সএমএল নেমস্পেস সংজ্ঞা দিন:

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" />

আমি ভাল জানি যে এটি কোনও গ্লোবাল ফিক্স নয় এবং আপনার প্রতিটি বাইন্ডিংয়ের জন্য এটি প্রয়োজন হবে তবে অবশ্যই এটি ঠিক এক্সএএমএল? যতদূর আমি সচেতন, পরের বারের বাইন্ডিং আপডেটগুলি এটি সঠিক CultureInfo.CurrentCultureবা আপনি সরবরাহ করে যা ব্যবহার করবে ।

এই সমাধানটি তত্ক্ষণাত আপনার বাইনিংগুলিকে সঠিক মানগুলির সাথে আপডেট করবে তবে এটি বিরল এবং নিরীহ কোনও কিছুর জন্য অনেক কোডের মতো বলে মনে হচ্ছে।


4
অসাধারণ! এটি আশ্চর্যজনকভাবে কাজ করেছে! এটির প্রয়োজনীয় কয়েকটি জায়গায় এটি যুক্ত করতে আমার কোনও সমস্যা নেই। বিটিডব্লিউ আপনার উদাহরণটিতে একটি missing
জনচেল

3
চমৎকার কাজ. এটি এত অদ্ভুত যে ডাব্লুপিএফ বর্তমান সংস্কৃতির বিপরীতে ডিফল্টরূপে ইউএস-ইংরেজি ব্যবহার করে।
ক্রিস অ্যাডামস

12

আমি কেবল যুক্ত করতে চেয়েছিলাম যে loraderon এর উত্তর বেশিরভাগ ক্ষেত্রে দুর্দান্ত কাজ করে। আমি যখন আমার App.xaml.cs এ নিম্নলিখিত কোডের লাইনটি রাখি তখন আমার টেক্সটব্লকের তারিখগুলি সঠিক সংস্কৃতিতে ফর্ম্যাট হয়।

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

আমি 'বেশিরভাগ কেস' বলি example উদাহরণস্বরূপ, এটি বাক্সটির বাইরে কাজ করবে:

<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")

এটি কাজ করার জন্য, আমার গুডডরের জবাব দরকার, যথা: কনভার্টারক ल्চার = {x: স্ট্যাটিক গ্লো: কালচারআইফোন.কন্ট্রাল কালচার } বাইন্ডিংয়ে।

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

আমি আশা করি এই অতিরিক্ত উত্তর কারওর কাজে লাগবে।


প্রকৃতপক্ষে, রান ফ্রেমওয়ার্ক এলিমেন্ট থেকে প্রাপ্ত নয়। রান কোড (ফ্রেমওয়ার্ক কনটেন্টমেন্ট) এর বেস এবং ফ্রেমওয়ার্ক এলিমেন্টের জন্য তার কোডটি পুনরাবৃত্তি করতে আপনি লোরেডেরনের উত্তরটি সংশোধন করতে চেষ্টা করতে পারেন।
নাথান ফিলিপস

যারা ভাবতে পারেন: 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
তবে এটি ঠিক যেমন ধরে নেওয়া ঠিক তত খারাপ যে এন-ইউএস হ'ল 'সঠিক' সংস্কৃতি। পরিবর্তে ব্যবহারকারীর মেশিন থেকে সেটিংস নেওয়া উচিত।
মিসনোমার

আপনাকে অনেক ধন্যবাদ, আমি ঠিক তাই খুঁজছিলাম! যদি ডাব্লুপিএফ মনে করে যে কোনও পরিস্থিতিতে এন-এনই সঠিক সংস্কৃতি, তবে আমি নিজের স্থানীয়করণের সাথেও পারি। যেহেতু আমি একটি প্রুফ-অফ কনসেপ্ট অ্যাপ্লিকেশনটিতে কাজ করছি যেখানে বিকাশের গতি দিনের ক্রম হয় DatePicker, তাই কাজ করার জন্য একটি একক পেতে কয়েক ডজন কোড লাইন নিয়ে ঘোরাঘুরি করার সময় নেই , সুতরাং এই সহজ সমাধানটি পেয়ে গেল আমি দ্রুত ট্র্যাক ফিরে!
এম 463

আমার ক্ষেত্রে জন্য সর্বোত্তম উত্তর, অবশেষে বয়সের জন্য খুঁজছেন হয়েছে :) এবং অবশ্যই এটি সঠিক, হয় আপনি তার স্বীকারোক্তি-মার্কিন অনুমান বা এটি ডি-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;
মেটালজিক

8

প্রোগ্রামটি চলাকালীন আপনার যদি ভাষা পরিবর্তন করতে হয় তবে আপনি কেবলমাত্র আপনার মূল উপাদানটিতে ভাষা সম্পত্তি পরিবর্তন করতে পারেন (আমি নিশ্চিত না যে এটির তাত্ক্ষণিক প্রভাব থাকলে বা উপ-উপাদানটি পুনরায় তৈরি করতে হবে, আমার ক্ষেত্রে এটি কমপক্ষে কাজ করে)

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

এটি তাত্ক্ষণিকভাবে পুনরায় মূল্যায়ন করে তবে দুর্ভাগ্যক্রমে প্রতিটি রুটুলেট (উইন্ডো) পৃথক করে রাখতে হবে
ফিরো

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

আপনি যদি এক্সএএমএল এর পরিবর্তে কোডে কাজ করে থাকেন তবে আপনি নীচে রূপান্তরকারী সংস্কৃতি সেট করতে পারেন:

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

ডিফল্ট সংস্কৃতি সংজ্ঞা ব্যবহার এবং ব্যবহারকারীর অনুকূলিত সংস্কৃতি সংজ্ঞা ব্যবহারের মধ্যে সূক্ষ্ম পার্থক্য চিহ্নিত করার জন্য @ কেজেজেস-এ কুডোস।


-3

টেক্সব্লক নয় লেবেল (সংস্কৃতি সহ) ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.