none
.NET CORE WPF APP | Wie kann ich die Software lokalisieren (verschiedene Sprachen) in der GUI und im Programmcode (MessageBox) darstellen? RRS feed

  • Frage

  • Hallo zusammen,

    wie kann ich eine .NET CORE WPF APP lokalisieren also für andere Sprachen als Deutsch übersetzen. Die Übersetzung muss jedoch nicht nur in der GUI erfolgen sondern z. B. auch verschiedene MessageBox müssen dabei lokalisiert werden.

    Freue mich über jeden Vorschlag.

    Grüße
    Sven

    Montag, 8. Juni 2020 21:26

Antworten

  • Man braucht erstmal eine Klasse wie z.B. diese hier

    public class Text
        {
            public string Hello { get; set; }
        }


    und für jede Sprache eine Json Datei

    {
      "Hello": "Hallo"
    }
    

    Jetzt muss man nur noch rausfinden welche Sprache der User spricht um dann die entsprechende Datei zu laden. Dies mache ich direkt in der App.xaml.cs

    public partial class App : Application
    {
        public static I18n.Text Text;
    
        public App()
        {
            var cu = System.Globalization.CultureInfo.CurrentCulture.Name;
    
            string[] SupportLanguages = new string[] { "en", "de" };
            var f = cu.Split('-')[0];
            var ava = SupportLanguages.FirstOrDefault(a => a == f);
    
            //default language
            string culture = "en";
            if (ava != null)
                culture = f;
    
            var assembly = IntrospectionExtensions.GetTypeInfo(typeof(App).GetTypeInfo()).Assembly;
            var stream = assembly.GetManifestResourceStream($"WpfCoreAppMultilanguage.I18n.{culture}.json");
            using (var sr = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8))
            {
                var json = sr.ReadToEnd();
                Text = Newtonsoft.Json.JsonConvert.DeserializeObject<I18n.Text>(json);
            }
        }
    }

    Ich habe das Projekt auf Github nochmal aktualisiert 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    • Als Antwort markiert sm-a Sonntag, 21. Juni 2020 14:52
    Sonntag, 21. Juni 2020 12:40

Alle Antworten

  • Hallo,

    das lokalisieren ist mehr als nur die Übersetzung der Sprachen. Schau dir dazu die Doku an Übersicht über WPF-Globalisierung und -Lokalisierung

    Auch in .NET Core kann man weiter hin die Ressources zum Verwalten der Sprachen nutzen. Dazu gibt es viele Anleitungen die man im Internet finden kann wie z.B. WPF Localization for Dummies


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Dienstag, 9. Juni 2020 06:36
  • Hallo Thomas,

    leider habe ich keinen Erfolg egal was ich probiere da anscheinend eine .NET CORE WPF App ein wenig unterschiedlich ist. Wenn ich eine Resource Datei zu dem Projekt hinzufüge erhalte ich eine Fehlermeldung dass es bereits eine Resource Datei gibt. Ich sehe nur keine.

    Vielen Dank für Deine Zeit.

    Gruß
    Sven

    Sonntag, 14. Juni 2020 13:12
  • Der einzige unterschied der mir aufgefallen ist, ist der das die Bindung mit x:Static nicht funktioniert. Ich habe das aber mit einem ValueConverter gelöst.

    Lege einen Ordner mit dem Namen I18n an

    Erstelle deine genwünschten resx Dateien und eine Klasse mit dem Namen I18nConverter.cs. Diese Klasse hat diesen Inhalt 

    namespace WpfCoreAppMultilanguage.I18n
    {
        public class I18nConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                return Resource.ResourceManager.GetString(parameter.ToString());
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }

    Öffne die App.xaml Datei und füge die Verweise zu I18n hinzu und lege den Converter an

    <Application x:Class="WpfCoreAppMultilanguage.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfCoreAppMultilanguage"
                 xmlns:i18n="clr-namespace:WpfCoreAppMultilanguage.I18n"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <i18n:I18nConverter x:Key="i18nConverter" />
        </Application.Resources>
    </Application>

    Abrufen eine Textes geht nun wie folgt

    Mit C#

    WpfCoreAppMultilanguage.I18n.Resource.ResourceManager.GetString("Hello");

    In Xaml

    <Window x:Class="WpfCoreAppMultilanguage.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfCoreAppMultilanguage"
            mc:Ignorable="d"
            Title="Win" Height="450" Width="800">
        
        <Grid>
            <Label Content="{Binding ConverterParameter=Hello, Converter={StaticResource i18nConverter}}" />
        </Grid>
    </Window>

    Sicherlich könnte man das ganze auch anders lösen.

    Ich persönlich nutze die resx Datei nicht. Ich erstelle mit eine Klassen und zudem eine Json Datei für jede Sprache. Bei start der Anwendung lese ich die Json Datei für die entsprechend Sprache ein. Die Json Datei kann ich in vielen unterschiedlichen Projekten nutzen 

    In XAML Projekten stelle ich dann die Klasse über ein ViewModel zur Verfügung 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Sonntag, 14. Juni 2020 14:33
  • Hallo Thomas,

    leider funktioniert es nicht. Ich bekomme folgende Fehlermeldung.

    Severity	Code	Description	Project	File	Line	Suppression State
    Error	CS0103	The name 'Resource' does not exist in the current context	myapp	C:\Users\test\source\repos\myapp\myapp\I18n\I18n.cs	13	Active

    und diese Fehlermeldung:

    Severity	Code	Description	Project	File	Line	Suppression State
    Error	XDG0008	The name "I18nConverter" does not exist in the namespace "clr-namespace:myapp.I18n".	myapp	App.xaml	16	

    Dieses sind meine using statements:

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Text;
    using System.Windows.Data;

    Habe ich ein using statement vergessen?

    Würde mich freuen wenn Du oder jemand anderes eine Lösung dafür habt.

    Gruß
    Sven


    • Bearbeitet sm-a Sonntag, 14. Juni 2020 17:30
    Sonntag, 14. Juni 2020 17:26
  • Ich habe dir das Projekt auf Github hochgeladen. Dort kannst Du es dir ansehen, klonen und mit deinem Projekt vergleichen

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Sonntag, 14. Juni 2020 23:05
  • Danke Thomas das Du mir sogar Sonntags geantwortet hast.

    Durch eine Softwarelizenzierungssoftware sind "ResourceDictionary" Einträge vorhanden die das Problem verursachen (CS0103 The name 'Resource' does not exist in the current context). Wenn ich diese folgenden Einträge lösche und nur Ihren Code verwende dann funktioniert es. Das Problem ist jedoch dass die Softwarelizenzierungssoftware dann nicht mehr funktioniert.

    Hier nun der Code:

        <Application.Resources>
            <i18n:I18nConverter x:Key="i18nConverter" />
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="ControlStyles.xaml" />
                    <ResourceDictionary Source="Activation\BusyAnimationStyle.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>

    Unter folgender URL finden Sie das original Projekt von der Lizenzierungsverwaltungssoftware:

    https://github.com/SoftwarePotential/samples/blob/master/Licensing/FullFramework/Standalone/DemoApp/App.xaml

    Wäre schön wenn es auch mit der Lizenzierungssoftware funktioniert.

    Ich hoffe jemand hat eine Lösung hierfür.

    Gruß
    Sven

    Dienstag, 16. Juni 2020 10:45
  • Ich schaue mir das Morgen Abend an habe grade viel um die Ohren

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Mittwoch, 17. Juni 2020 18:42
  • Der Converter muss innerhalb von ResourceDirectory stehen

    <Application.Resources>
            <ResourceDictionary>
                <i18n:I18nConverter x:Key="i18nConverter" />
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="ControlStyles.xaml" />
                    <ResourceDictionary Source="Activation\BusyAnimationStyle.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>

    Zudem ist ein Verweis erforderlich xmlns:i18n="clr-namespace:{Der Name dienes Projektes}.I18n"

    Das Projekt welche Du verlinkt hast ist aber auch WPF/Net-Framework nicht .NET Core. Um es mit .NET Core zur verwenden muss man es erst portieren. 

    Ob und wie das geht, solltest Du die Entwickler der Software fragen. Einen ersten überblick kannst Du dir in der Doku der Software verschaffen. Den Link dorthin findest Du im Github Projekt.

    Sry aber ich werde mich mit dieser Software nicht beschäftigen


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Donnerstag, 18. Juni 2020 16:11
  • Hallo Thomas,

    es funktioniert immer noch nicht. Es kommt immer noch der folgende Fehler:
    CS0103 The name 'Resource' does not exist in the current context

    Könntest Du das näher erklären am besten mit Beispielen was Du geschrieben hast (das klingt interessant und würde mein Problem lösen):

    Ich persönlich nutze die resx Datei nicht. Ich erstelle mit eine Klassen und zudem
    eine Json Datei für jede Sprache. Bei start der Anwendung lese ich die Json Datei
    für die entsprechend Sprache ein. Die Json Datei kann ich in vielen unterschiedlichen
    Projekten nutzen In XAML Projekten stelle ich dann die Klasse über ein ViewModel zur Verfügung 

    Ansonsten werde ich einfach zwei Anwendungen warten. Eine in deutsch und eine in englisch.

    Wäre schon wenn Du mir Deine Lösung genauer erklären würdest.
    Danke im Voraus.

    Gruß
    Sven

    Samstag, 20. Juni 2020 19:06
  • Man braucht erstmal eine Klasse wie z.B. diese hier

    public class Text
        {
            public string Hello { get; set; }
        }


    und für jede Sprache eine Json Datei

    {
      "Hello": "Hallo"
    }
    

    Jetzt muss man nur noch rausfinden welche Sprache der User spricht um dann die entsprechende Datei zu laden. Dies mache ich direkt in der App.xaml.cs

    public partial class App : Application
    {
        public static I18n.Text Text;
    
        public App()
        {
            var cu = System.Globalization.CultureInfo.CurrentCulture.Name;
    
            string[] SupportLanguages = new string[] { "en", "de" };
            var f = cu.Split('-')[0];
            var ava = SupportLanguages.FirstOrDefault(a => a == f);
    
            //default language
            string culture = "en";
            if (ava != null)
                culture = f;
    
            var assembly = IntrospectionExtensions.GetTypeInfo(typeof(App).GetTypeInfo()).Assembly;
            var stream = assembly.GetManifestResourceStream($"WpfCoreAppMultilanguage.I18n.{culture}.json");
            using (var sr = new System.IO.StreamReader(stream, System.Text.Encoding.UTF8))
            {
                var json = sr.ReadToEnd();
                Text = Newtonsoft.Json.JsonConvert.DeserializeObject<I18n.Text>(json);
            }
        }
    }

    Ich habe das Projekt auf Github nochmal aktualisiert 


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    • Als Antwort markiert sm-a Sonntag, 21. Juni 2020 14:52
    Sonntag, 21. Juni 2020 12:40
  • Hallo Thomas,

    vielen vielen Dank. Es funktioniert fehlerfrei. Ich wünschte ich hätte Dein Wissen.

    Gruß
    Sven

    Sonntag, 21. Juni 2020 14:52