Laden...

Muss ich bei einer multilingualen Applikation einen ResourceManager verwenden?

Erstellt von capk vor 6 Jahren Letzter Beitrag vor 5 Jahren 2.265 Views
C
capk Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren
Muss ich bei einer multilingualen Applikation einen ResourceManager verwenden?

Hallo alle miteinander,

ich weiß jetzt nicht ob dieser Thread in dieses Forum gehört aber da ich eine GUI habe .. 😃

ich weiß jetzt auch nicht wie ich mein Problem so genau erklären soll.
Also ich baue zz. an eine Applikation, die ich gerne multilingual gestalten würde, also quasi auf Deutsch / Englisch.

Dazu verwende ich die .resx Dateien.
Ich habe das jetzt so gemacht, dass ich eine Form erstelle mit Buttons, Labels, etc. und die Form auf "Localizable = True" setze, anschließend setze ich die "Language" auf Deutsch und benenne die Buttons, Labels, etc. Das gleiche mache ich auch für die Englische Sprache. Dabei werden ja dann automatisch die .resx Dateien angelegt.

Durch

Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture;

starte ich die Applikation mit der lokalen Spracheinstellung.

Ich habe vor einem halben Jahr mal eine VB.NET Applikation zum Spaß erstellt, mit der ich die einzelnen Strings in der .resx Datei wie folgend aufrufe:

    Public rm As Resources.ResourceManager
    Public ci As CultureInfo
    Public a As Assembly

        Private Sub getRes(ByVal ci As CultureInfo)
        a = Assembly.Load("InbetriebnahmeForm")
        rm = New ResourceManager("InbetriebnahmeForm.myRes", a)

        GroupBox1.Text = rm.GetString("grpKomm", ci)
        GroupBox2.Text = rm.GetString("grpStandort", ci)
        GroupBox4.Text = rm.GetString("grpLocal", ci)
        btnErstellen.Text = rm.GetString("btnCreate", ci)
        btnBeenden.Text = rm.GetString("btnCancel", ci)
        btnLocal.Text = rm.GetString("btnLocalPath", ci)
        btnChina.Text = rm.GetString("btnCHINA", ci)
        MaskedTextBox1.Text = rm.GetString("maskedTxt", ci)
        Me.Text = rm.GetString("txtProg", ci)
    End Sub

Oder auch:

         If Directory.Exists(sPathLocal & "\" & MaskedTextBox1.Text) Then
                    MessageBox.Show(rm.GetString("msgExists1", ci) & rm.GetString("msgExists2", ci) & _
                                    "( " & MaskedTextBox1.Text & " )" & _
                                    rm.GetString("msgExistsLocal", ci), _
                                    rm.GetString("msgWarning", ci), _
                                    MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    Return dirValue
                    Exit Function
                End If

Meine Frage ist jetzt: Muss ich einen ResourceManager verwenden ? Ist das obige Beispiel Best-Practice ?
Weil ich bei meiner jetzigen C# Applikation nicht wirklich sowas wie:

Public rm As Resources.ResourceManager

verwende. Ich benutze also auch nicht sowas wie:

btnErstellen.Text = rm.GetString("btnCreate", ci)

Die Form wird bei mir jetzt also quasi "automatisch" auf die benötigte Sprache geändert, da ich das ja in der Form quasi in der jeweiligen Language gecodet habe und ich rufe auch nicht wirklich die Variablen in der .resx Datei auf wie oben gezeigt.

Ich hoffe ihr versteht was meine Frage ist, weiß nicht ob/wie ich das jetzt besser rüberbringen kann. Ich bedanke mich schon mal für Eure Zeit!

Mit freundlichen Grüßen,
capk

4.942 Beiträge seit 2008
vor 6 Jahren

Hallo und willkommen,

lies dir mal [Tutorial] Lokalisierung von Texten in .NET durch.
Der ResourceManager übernimmt ja gerade die Aufgabe, die passende ".resx"-Assembly zu benutzen, d.h. für die vom Designer generierten Daten. Wenn du aber in deinem Code selber Texte multilingual darstellen möchtest, dann mußt du eben den ResourceManager - wie in dem VB-Code - aktiv benutzen (unter "Properties/Resources" kannst du dann im C#-Projekt diese Texte einpflegen).

C
capk Themenstarter:in
5 Beiträge seit 2017
vor 6 Jahren

Hi und danke sehr für die Antwort, habe das jetzt auch so gemacht wie im genannten Beispiel, die Ressourcen in den .resx Dateien werden über die Funktion GetString aufgerufen.

Klappt einwandfrei und läuft auch 😃

Vielen Dank

C
39 Beiträge seit 2018
vor 5 Jahren

Hab da mal eine Zusatzfrage:

Ich habe das wie der Threadersteller gemacht. Forms werden durch das Umschalten der Sprache in den Properties "übersetzt".

Wie bzw warum sollte man dieses Konzept mit den Satellite Assemblies verknüpfen?

Die Forms Resx Dateien haben ja auch Infos über zB die Breite eines Controls.
Die Satellite Assemblies NICHT.

F
10.010 Beiträge seit 2004
vor 5 Jahren

Das GetString und der Resourcemanager sind überhaupt nicht nötig, da man auch vollkommen Transparent auf die Strings zugreifen kann.

Wenn man selber in diese Resx Dateien Übersetzungen einträgt, kann man diese dann über den Namespace als statische Properties bekommen.

Und wer behauptet das Satelitenassemblies keine zusätzlichen Angaben beinhalten?
Genau das macht doch das umschalten der Sprache, eine der Satelitenassemblies aus den Sprachordnern benutzen.

4.942 Beiträge seit 2008
vor 5 Jahren

Doch, auch in den Satellite Assemblies (für die explizit ausgewählten Sprachen) werden die gegenüber der Standardsprache eingestellten veränderten Eigenschaften (wie Breite, Höhe, Farbe etc.) vom VS Designer abgespeichert.

Oder meinst du mit "Satellite Assemblies" nur die selbst erstellten?
Sinn machst dies z.B. bei MessageBox-Texten (da es dafür ja keine "Form.resx"-Datei gibt (okay. herbivore würde mir dazu sagen, daß man keine modalen Dialoge mehr verwenden soll 😉. Oder für Loggingtexte o.ä. (falls man diese in verschiedenen Sprachen ausgeben möchte)...

Edit:
@FZelle: Aber die erzeugten statische Properties greifen intern auch nur auf den ResourceManager zu.

C
39 Beiträge seit 2018
vor 5 Jahren

Ich möchte zum Beispiel so etwas:

Ein Form Button wird mit "Knopf" über die Form Resource beschriftet.

Ein anderes Form genauso. Jetzt steht in jeder Resource "Knopf".

Mein Chef kommt an und sagt, dass heisst nun aber "KnopfDelüxe". Dann müssen wir an jedes Form gehen und über aus "Knopf" -> "KnopfDelüxe" machen.

Ich möchte den Key für "Knopf" aus allen Form Resources löschen und dann soll sich meine App die Werte aus der eigenen Resource holen. zb in einen Projekt "LocalizerProj".

Ich weiss halt nicht, wie ich die eigenen Resources als Fallback angebe bzw wie ich es einrichte, dass die benutzt werden.

4.942 Beiträge seit 2008
vor 5 Jahren

Dann erstelle dir dafür Basisforms oder UserControls, so daß du den Text nur einmalig ändern mußt.