Mehrsprachige Anwendung -> Sprache ändern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von GerhardW.

    Mehrsprachige Anwendung -> Sprache ändern

    Juten Abend allerseits,

    ich glaube, ich werde langsam aber sicher verrückt.

    Ich sitze jetzt schon Stunden an dieses Problem bekomme es einfach nicht hin, die Sprache meiner Anwendung zu ändern und es gibt auch nirgendwo eine wirkliche Erklärung, wie zum Teufel es funktioniert. :)
    Alle Webseiten schreiben dasselbe, und zwar immer dasselbe alte Zeug aus schon Jahre alten Informationen, die einfach nicht funktionieren wollen.

    Was habe ich bisher gemacht?

    Ich habe bereits in mehreren Formen verschiedene Sprachen erstellt, was dank Visual Studio ja schon sehr leicht funktioniert:



    Und diese lassen sich in Visual Studio auch wunderbar umschalten, wenn ich in der jeweiligen Form auch die Sprache auswähle:



    Im Projekt Ordner unter BIN/Debug befinden sich ebenfalls die Ordner "de-DE" und "en-US" mit den jeweiligen NAME.resources.dll.
    Genutzte Framework Version ist 4.6.

    Warum gibt es jetzt also keine Möglichkeit, in der Anwendung die Sprache automatisch einstellen zu lassen oder einfach per Klick umstellen zu lassen, wenn ich doch alles nötige bereits habe?
    Wenn ich meine Anwendung auf einem Computer mit andere Sprache & Region ausführe, wird trotzdem immer die deutsche Version angezeigt.


    Ich lese ständig was davon, dass noch irgendwelche Ressourcen Dateien im Projekt Order erstellt/kopiert werden müssen aber warum denn?
    Warum wird es so derartig kompliziert gemacht oder erzählt?

    Oder ist es das gar nicht und es gibt einfach keine Gescheite Anleitung dafür?
    Ich habe doch bereits die fertige Übersetzung!
    Warum gibt es also keine Möglichkeit, zwischen diese 2 bereits fertigen Übersetzungen zu switchen?

    Ich habe auch auf der Microsoft Seite direkt geschaut, wie das mit der Lokalisierung funktionieren soll, aber selbst da verstehe ich nur die Hälfte und die andere Hälfte wird gar nicht erst erwähnt...

    Und die Änderung via Thread.CurrentThread.CurrentCulture bewirkt ebenfalls rein gar nichts.

    Auch diesen Thread habe ich gelesen, wo aber auch die Beschreibung m.E. nach ehr mager ist.
    Der dort erwähnte Code:

    Quellcode

    1. Dim Culture As System.Globalization.CultureInfo
    2. Culture = New System.Globalization.CultureInfo("en-US")
    3. System.Threading.Thread.CurrentThread.CurrentUICulture = Culture


    Funktioniert ebenfalls nichts.
    Der Thread ist wahrscheinlich auch schon zu alt, aber versuchen wollte ich es dennoch mal.


    Also, hat jemand vielleicht eine Lösung dafür? :)
    Bin ich Blind und übersehe ich evtl. etwas?

    Ich setze die CultureInfo in einem Submain, also bevor die erste Form geladen wird, auf en-US.
    en-US Ordner und resx zu den entsprechenden Formen sind, wie oben in den Bildern zu sehen, ja bereits vorhanden.


    Folgendes habe ich alles ausprobiert:

    Quellcode

    1. System.Threading.Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("en-US")
    2. System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
    3. CultureInfo.DefaultThreadCurrentCulture = New CultureInfo("en-US")
    4. CultureInfo.CurrentCulture = New CultureInfo("en-US")
    5. My.Application.ChangeCulture("en-US")
    6. My.Application.ChangeUICulture("en-US")


    In der Form1 zeigt mir eine Messagebox für CultureInfo.CurrentCulture.Name sogar "en-US" an, aber alle Steuerelemente sind immer noch in deutsch.
    Ob die Ressourcen nicht gefunden werden?


    Verzeiht mir meine Groben Aussagen, aber es gibt nichts schlimmeres als Webseiten, die nur die Hälfte erklären und diverse Informationen oder Zwischenschritte "vergessen".
    Nicht zu vergessen die Hobby Blogger, die Copy & Paste machen aber selbst nicht verstehen, was was bewirkt.


    Ich danke euch schonmal für die Hilfe.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „IfYesThanNo“ ()

    @IfYesThanNo Willkommen im Forum. :thumbup:
    Erstell eine kleine Demo-Anwendung mit einem Button und zwei Labels z.B. und das in Deinen Sprachen.
    Bereinige dieses Projekt (keine obj, bin und vs-Ordner, zippe das Projekt und hänge es an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    petaod schrieb:

    Auch den dort verlinkten Thread für dynamische Umstellung?
    Application.Restart() nach Sprachumschaltung


    Dort wird die Sprache ja ebenfalls mit System.Threading.Thread.CurrentThread.CurrentUICulture gesetzt, aber es will bei mir nicht funktionieren.
    Es passiert einfach nichts.


    Edit:
    Selbst, wenn ich den Programmcode und Einstellungen 1:1 übernehme, funktioniert es bei meiner Anwendung nicht.
    Es bleibt alles in deutsch. Da wird man echt verrückt bei. 8|



    RodFromGermany schrieb:

    @IfYesThanNo Willkommen im Forum. :thumbup:
    Erstell eine kleine Demo-Anwendung mit einem Button und zwei Labels z.B. und das in Deinen Sprachen.
    Bereinige dieses Projekt (keine obj, bin und vs-Ordner, zippe das Projekt und hänge es an.


    Danke, hier mal eine kleine Anwendung mit 2 Label und 1 Button.WindowsApp2.rar

    Ich habe, wie in meiner Anwendung, die neutrale Sprache in den Assemblys in Englisch (USA) gestellt, Localizable in Form 1 auf True, Language in Form 1 auf Standard.



    Liebe Grüße

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „IfYesThanNo“ ()

    IfYesThanNo schrieb:

    Language in Form 1 auf Standard.
    ist für die dargestellte Sprache ausschließlich im Designer relevant.
    ====
    Du hast das Prinzip nicht verstanden.
    In den Projekteigenschaften wird die neutrale Sprache vorgegeben, bei Dir: "en-US".
    Das bedeutet insbesondere, dass keine Ressource-DLL mit "en-US" vorkommt, denn die ist ja im Programm selbst eincompiliert.
    Deine neutrale Sprache in Deiner resx-Datei ist "de-DE".
    ====
    Ich habe auf der Basis Deines Projekts ein neues Projekt erstellt, welches sich insoweit korrekt verhält (Start mit vorhandenen Ressourcen in deutsch, andernfalls in englisch):
    Localizing.zip
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke Dir, werd's mir direkt mal anschauen.


    RodFromGermany schrieb:

    ist für die dargestellte Sprache ausschließlich im Designer relevant.


    Danke für die Info, auch das habe ich nämlich nirgends lesen können und war mir nicht ganz so sicher.


    RodFromGermany schrieb:

    Du hast das Prinzip nicht verstanden.


    Ganz offenkundig nicht, denn die Tutorials, die man im Netz findet, sind m.E. nach alle nicht gut erklärt. ^^
    Ich bin ja nicht ganz auf dem Kopf gefallen aber wenn man einen Bereich macht, den man zuvor noch nicht gemacht hat, kann man als Tutor nicht einfach diverse Sachen auslassen, nur weil einem selbst gewisse Schritte als "Das muss ja eh jeder Wissen" vorkommen.


    RodFromGermany schrieb:

    In den Projekteigenschaften wird die neutrale Sprache vorgegeben, bei Dir: "en-US".
    Das bedeutet insbesondere, dass keine Ressource-DLL mit "en-US" vorkommt, denn die ist ja im Programm selbst eincompiliert.


    Da bräuchte ich eine etwas präzisere Erläuterung von "im Programm selbst eincompiliert".
    Soll das heißen, dass ich Programme immer in englisch anfangen muss und optional eine deutsche Sprache dazu? ?(
    Wenn ja, wäre das eine unschöne Sache, denn mein Programm ist in deutsch gemacht, nicht gerade klein und enthält sehr sehr sehr viele Texte. :/

    Und wozu dient dann überhaupt die Einstellung der neutralen Sprache in den Assemblys?
    Wie ich sehe, hast Du diese ja auf "Keine" gestellt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „IfYesThanNo“ ()

    IfYesThanNo schrieb:

    "im Programm selbst eincompiliert"
    Alle Ressourcen der neutralen Sprache werden im Quelltext in Dateien mit der ausschließlichen Endung "*.resx" abgelegt und in die betreffende exe bzw. dll eincompiliert. Bei alle weiteren Sprachen ist die Endung "*.aa-BB.resx", die Compilate landen in Ressource-DLLs im Unterverzeichnis namens "aa-BB" neben der Exe.
    Dort werden auch die Ressource-DLLs von zum Projekt gehörenden DLLs abgelegt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich fass es nicht...

    Ich habe in meinem Programm jetzt nur die neutrale Sprache in den Assemblys auf "Keine" geändert und nun funktioniert es... 8|
    Ich teste es gerade in einer virtuellen Umgebung.
    Entferne ich den en-US Ordner, ist mein Programm natürlich in deutsch, aber mit dem Ordner, startet mein Programm in englisch.
    Und dafür habe ich Stunden verschwendet. ;( :D

    Jetzt müsste ich nur noch eine Funktion dazu schreiben, die bei einer nicht deutschen Umgebung immer auf English umstellt und dann wars das. :thumbsup:
    Oder kann man die englische Sprache irgendwie anders als mit einer Submain bevorzugen?
    Also wenn die Umgebung nicht de-DE ist, dann immer in en-US umstellen.

    IfYesThanNo schrieb:

    Jetzt müsste ich nur noch eine Funktion dazu schreiben, die bei einer nicht deutschen Umgebung immer auf English umstellt
    Genau das passiert bei meinem Beispiel.
    Die neutrale Sprache wird immer dann verwendet, wenn keine Lokalisierung der vorgefundenen Sprache vorhanden ist:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    IfYesThanNo schrieb:

    Jetzt müsste ich nur noch eine Funktion dazu schreiben, die bei einer nicht deutschen Umgebung immer auf English umstellt
    Genau das passiert bei meinem Beispiel.
    Die neutrale Sprache wird immer dann verwendet, wenn keine Lokalisierung der vorgefundenen Sprache vorhanden ist:
    vb-paradise.de/index.php/Attac…79552b3d5a6bd1545a75e6dfb



    Jetzt ist aber wieder das Problem, dass wenn ich die neutrale Sprache auf Englisch (USA) stelle, mein Programm in einer nicht deutschen Umgebung, trotzdem auf deutsch bleibt...
    Das verstehe ich eben nicht.
    Sollte dann nicht die Ressourcen aus dem en-US Ordner genommen werden?
    Deswegen auch die Frage, ob ein Programm generell in englisch erstellt werden und erst nachträglich übersetzt werden muss.
    @IfYesThanNo Ändere mal in meinem Projekt die neutrale Sprache entsprechend des Bildes in Post #11, das hatte ich vergessen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @IfYesThanNo Ändere mal in meinem Projekt die neutrale Sprache entsprechend des Bildes in Post #11, das hatte ich vergessen.



    Das funktioniert.

    Aber hier haben wir ja jetzt einen Unterschied.
    Dein Programm ist standardmäßig in englisch und die Deutsche Ressourcen sind optional.

    Bei meinem Programm ist es in deutsch und englisch optional.
    Macht das einen Unterschied?

    IfYesThanNo schrieb:

    Macht das einen Unterschied?
    Auf einem chinesischen Rechner würde dann das Programm in Deutsch kommen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    IfYesThanNo schrieb:

    Macht das einen Unterschied?
    Auf einem chinesischen Rechner würde dann das Programm in Deutsch kommen.



    Genau, und das soll es ja nicht.
    Es soll nur auf deutsch sein, wenn die Umgebung auch deutsch ist, andernfalls die englische Ressource nehmen.
    @IfYesThanNo Dann nimm mein wie oben beschriebenes modifiziertes Projekt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @IfYesThanNo Dann nimm mein wie oben beschriebenes modifiziertes Projekt.


    Ich kann 10.000 Zeilen Code nicht einfach übern Haufen werfen. :P

    Ich nehme an, Du hast zu meiner Frager oben:

    IfYesThanNo schrieb:

    Bei meinem Programm ist es in deutsch und englisch optional.
    Macht das einen Unterschied?

    Auch keine Antwort? :P

    Es wäre echt blöd, wenn ich nochmal alles ins englische und nochmal ins deutsche übersetzen muss, nur damit die Standard Sprache englisch ist.





    Edit:

    Okay, habe nun eine andere funktionierende Lösung gebastelt.

    Da es nur über Submain funktioniert, muss ich halt etwas umfrickeln (Splashscreen etc.).

    Folgende Konfiguration:



    Die neutrale Sprache unter "Assemblyinformationen..." steht jetzt auf "Keine".


    Und das Modul sieht so aus:

    Quellcode

    1. Imports System.Threading
    2. Module Program
    3. Public Sub Main()
    4. If Not CultureInfo.CurrentCulture.Name = "de-DE" Then
    5. Thread.CurrentThread.CurrentUICulture = New System.Globalization.CultureInfo("en-US")
    6. Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("en-US")
    7. End If
    8. Application.EnableVisualStyles()
    9. Application.SetCompatibleTextRenderingDefault(False)
    10. Application.Run(New Form1)
    11. End Sub
    12. End Module



    Simpel und einfach.
    Wenn die Umgebung nicht deutsch ist, dann auf englisch wechseln.
    Eben ausprobiert, es funktioniert und ich muss nicht nochmal alles übersetzen oder sonstwas. :thumbsup:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „IfYesThanNo“ ()

    IfYesThanNo schrieb:

    Es wäre echt blöd, wenn ich nochmal alles ins englische und nochmal ins deutsche übersetzen muss, nur damit die Standard Sprache englisch ist.
    Die Ressourcen umzubenennen funktioniert nicht, das habe ich probiert.
    Du kannst aber die Inhalte umkopieren.
    Alle Dateien anzeigen, da bekommstg Du die resx-Dateien angezeigt:

    Doppelklicke auf beide und schiebe sie rechts und links in den Editor,
    tausche die unten markierten Bereiche. Block-Copy, nutze das Notepad++ als Zwischenspeicher.
    Bilder
    • Ressourcen.jpg

      101,93 kB, 1.198×608, 47 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!