Laden...

wpf lokalisation problem

Erstellt von sindibad vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.322 Views
S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 11 Jahren
wpf lokalisation problem

Hallo,
Ich habe eine benutzergeführte wpf seite mit 5 Buttons und ein info-Textblock. bei bei jeden Button (Schritt) wird ein anderes info-text im Textblock angezeigt. der Benutzer klickt von einem Button zum nächsten und lässt eine aktion durchführen.
der Anzahl der InfoText ist gleich 5 für jede Sprache. ich habe momentan deutsch und englisch
die Texte habe ich einmal am Anfang (Im Konstruktur) aus der ressources geholt und weiter verwendet.
Ich habe jetzt eine runtime-spracheumschaltung über menus eingebaut und jetzt funktioniert die Sprachumschaltung für die InfoTexte nicht mehr. wie kann Ich dieses problem lösen?

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo sindibad,

wie genau hast du die Sprachumschaltung gelöst?
Theoretisch müsste das schon funktionieren.
Ich speichere meine Lokalisierungs-Strings immer in XAML-Resourcen. Und lade die Strings aus den Resourcen über die {DynamicResource MyString}.
Damit kann man zur Runtime einfach das ResourceFile austauschen und alle Strings im Programm werden automatisch aktualisiert.

Da gibt es aber viele Ansätze wobei jede ihre Vorteile und Nachteile hat.
Für mich (ein Einzelkämpfer) funktioniert die beschriebene Lösung jedenfalls mehr als zufriedenstelledn.

Hier ein Tutorial dazu: Gewusst wie: Verwalten lokalisierbarer Zeichenfolgenressourcen mit einem ResourceDictionary

PS: Zu deinem Problem. Wenn du es evtl etwas genauer Beschreiben (über ein Stück Code) kannst dann können wir besser helfen

Grüße
Michael

S
sindibad Themenstarter:in
110 Beiträge seit 2012
vor 11 Jahren

Ich poste jetzt Abschnitte aus dem Source code um das Problem zu verdeutlichen:

die Sprachumschaltung habe ich auch mit xaml ressourcen realisiert und ich lade die Strings über FindResource in Code behind datei.

die Spracheumschaltung:



        private void ChangeLanguage(string culture)
        {
            // List all our resources      
            List<ResourceDictionary> dictionaryList = new List<ResourceDictionary>();
            foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
            {
                dictionaryList.Add(dictionary);
            }
            // We want our specific culture      
            string requestedCulture = string.Format(@"Resources\Languages\StringResources.{0}.xaml", culture);
            ResourceDictionary resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
            if (resourceDictionary == null)
            {
                // If not found, we select our default language        
                requestedCulture = @"Resources\Languages\StringResources.xaml";
                resourceDictionary = dictionaryList.FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
            }

            // If we have the requested resource, remove it from the list and place at the end.\      
            // Then this language will be our string table to use.      
            if (resourceDictionary != null)
            {
                Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
                Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
            }

            if (CultureInfo.CurrentCulture.Name.Equals(culture))
                return;
            // Inform the threads of the new culture      
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);    

        
        }


<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                 <!-- Languages-->
                <ResourceDictionary Source="Resources\Languages\StringResources.de-DE.xaml" />
                <ResourceDictionary Source="Resources\Languages\StringResources.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

die Buttons-Callbacks


 private void step1Clicked(object sender, RoutedEventArgs e)
{
                                InformationTextBlock.Text = m_upDown.m_win.FindResource("uploadInfoStep2").ToString(); 

                    uploadStep1.IsEnabled = false;
                    uploadStep2.IsEnabled = true;
}

  private void step2Clicked(object sender, RoutedEventArgs e)
  {
                            InformationTextBlock.Text = m_upDown.m_win.FindResource("uploadInfoStep3").ToString();

                uploadStep2.IsEnabled = false;
                uploadStep3.IsEnabled = true;

                           
   }

....


in xaml


<TextBlock TextWrapping="Wrap" Name="InformationTextBlock" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="9"></TextBlock>

wenn Ich die Sprache ändere wird der textblock nicht gleich aktualisiert was auch logisch ist. erst wenn ich den nächsten Button klicke wird der Text in der richtige Sprache angezeigt.
wie kann so programmieren dass der Text automatisch in richtiger Sprache angezeigt wird wenn ich die Sprache ändere?

die Lokalaisierung der andere Texten in wpf xaml funktioniert einwandfrei mit DynamicResource

3.430 Beiträge seit 2007
vor 11 Jahren

Ah ok. Jetzt verstehe ich was dein Problem ist.
Du hast da also unterschiedliche Strings in den InformationTextBlock (abhängig von den aktuell geklickten Button) und möchtest dass auch dieser gewechselt wird wann die Sprache gewechselt wird.

Entweder du merkst dir den aktuellen Status und reagierst auf das ChangeLanguage. Dann kannst du darin den entsprechenden String der aktuellen Sprache festlegen.

Oder du löst das über einen ValueConverter. Dass du sozusagen nur einen Key in die TextBox schreibst. Über den Converter wird dann automatisch der passende Text aus den Resourcen geladen.
Dabei musst du aber darauf achten dass das Binding in WPF refresht wird wenn eine neue Sprache gewählt wird.

Hoffe das hilft dir etwas.
Viel Erfolg!

Grüße
Michael