Mehrsprachig: zur laufzeit ändern (Localizable = True)

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Mehrsprachig: zur laufzeit ändern (Localizable = True)

    Hallo Comm,

    Ich benutze aktuell die Standard VB Übersetzung Funktion mit Localizable = True
    Und kann auch die Sprache ohne Probleme nach einen Neustart ändern indem ich MyApplication angepasst habe

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim ApplicationPath As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\TestApp"
    2. Dim ConfigurationFile As String = "config.json"
    3. ' Override Application.Designer.vb
    4. Protected Overrides Sub OnCreateMainForm()
    5. SetLanguage()
    6. Me.MainForm = Global.TestApp.MainForm
    7. End Sub
    8. ' Defines the program language
    9. Public Sub SetLanguage()
    10. Dim json As String = My.Computer.FileSystem.ReadAllText(String.Format("{0}\{1}", ApplicationPath, ConfigurationFile))
    11. ' Javascript serializer
    12. Dim jsonSerializer As New System.Web.Script.Serialization.JavaScriptSerializer
    13. ' Generically convert to json dictionary
    14. Dim dict1 As Dictionary(Of String, Object) = jsonSerializer.Deserialize(Of Dictionary(Of String, Object))(json)
    15. ' get system language
    16. Dim SysLanguageID As String = System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName
    17. Dim AppLanguageID As String
    18. AppLanguageID = CStr(dict1("language"))
    19. ' select shown language
    20. Dim Culture As System.Globalization.CultureInfo
    21. Try
    22. Culture = New System.Globalization.CultureInfo(AppLanguageID)
    23. If Culture Is Nothing Then
    24. AppLanguageID = "en"
    25. Culture = New System.Globalization.CultureInfo(AppLanguageID)
    26. End If
    27. Catch ex As Exception
    28. MessageBox.Show(String.Format("The selected language code '{0}' is invalid", AppLanguageID))
    29. AppLanguageID = "en"
    30. Culture = New System.Globalization.CultureInfo(SysLanguageID)
    31. End Try
    32. ' set shown language
    33. System.Threading.Thread.CurrentThread.CurrentUICulture = Culture
    34. End Sub


    Meine Frage ist jetzt, kann ich auch die Sprache zur Laufzeit so ändern das ich das Programm nicht neu starten muss?

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

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

    Ruerte schrieb:

    so ändern
    Du müsstest jedem laufenden Thread online die neue Sprache "unterjubeln" und dann jedes Control und jeden lokalosierten Text anfassen.
    Lass das sein.
    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,
    ist es denn wenigstens möglich nur in einer Form dies zu Ändern?
    Sprich das sich Optisch meine Einstellung Oberfläche dann schon auf English ändert und beim speichern kommt "sie müssen das Programm neu starten" ?

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ruerte schrieb:

    nur in einer Form
    Auch wenn dies möglich sein sollte, wirst Du da von mir keine Hilfe bekommen, weil ich mir nicht die Mühe mache, dies zu untersuchen. Sorry.
    Ich schalte die Sprache um wie hier beschrieben.
    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 danke für den link unter Programme mehrsprachig erstellen hab ich folgende Lösung gefunden! (nur für die aktuelle Form)

    Trade schrieb:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ChangeLanguage("es-ES")
    3. End Sub
    4. Private Sub ChangeLanguage(ByVal lang As String)
    5. For Each c As Control In Me.Controls
    6. Dim resources As ComponentResourceManager = New ComponentResourceManager(GetType(Form1))
    7. resources.ApplyResources(c, c.Name, New CultureInfo(lang))
    8. Next c
    9. End Sub


    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ruerte schrieb:

    (nur für die aktuelle Form)
    Wenn Du danach von dieser Form aus eine weitere Form aufrufst, in welcher Sprache kommt die?
    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!

    Ruerte schrieb:

    kann ich keine neu Aufrufen
    Klar.
    Mach einen Button drauf und ruf eine neue Instanz derselben Form auf.
    Besser wäre natürlich eine separate lokalisierte Form.
    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 das war auch eher so gemeint das ich daraus keine aufrufen wollte, sry falsch ausgedruckt.
    Sehe ich das richtig das ich bei einen TabControl dann folgendes in der ChangeLanguage brauche:

    VB.NET-Quellcode

    1. For Each t As TabPage In Me.TabControl1.TabPages
    2. For Each c As Control In t.Controls
    3. Dim resources As ComponentResourceManager = New ComponentResourceManager(GetType(Install))
    4. resources.ApplyResources(c, c.Name, New CultureInfo(lang))
    5. Next c
    6. Next


    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ruerte schrieb:

    noch allgemeiner
    Sieh einfach nach, welche Controls Child-Controls haben, also eine Item-Collection.
    Da brauchst Du nur eine Prozedur für alle Controls einer Form, deren Aufrufparameter eine Collection ist.
    Hat ein Control Child-Controls, rufst Du diese Prozedur rekursiv auf, ansonsten setzt Du die Sprache.
    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 IntelliSence gibt mir keine Fehler aus (Option Strict = On) jedoch haut er mir den Code um die Ohren.
    Kann es sein das ich was falsch verstehe?

    VB.NET-Quellcode

    1. For Each tMain As TabControl In Me.Controls
    2. For Each tPage As TabPage In tMain.TabPages
    3. For Each tItem As Control In tPage.Controls
    4. resources.ApplyResources(tItem, tItem.Name, New CultureInfo(lang))
    5. Next tItem
    6. Next tPage
    7. Next tMain

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ruerte schrieb:

    um die Ohren
    So was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ChangeLanguage("es-ES")
    3. End Sub
    4. Private Sub ChangeLanguage(ByVal lang As String)
    5. Dim resources As ComponentResourceManager = New ComponentResourceManager(GetType(Form1))
    6. Dim ci = New CultureInfo(lang)
    7. ChangeLanguage(resources, ci, Me.Controls)
    8. End Sub
    9. Private Sub ChangeLanguage(resources As ComponentResourceManager, ci As CultureInfo, cont As Control.ControlCollection)
    10. For Each c As Control In cont
    11. If c.Controls.Count > 0 Then
    12. resources.ApplyResources(c, c.Name, ci)
    13. Else
    14. ChangeLanguage(resources, ci, c.Controls)
    15. End If
    16. Next c
    17. End Sub

    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!
    Joa, da fliegt eine Exception, weil Du nicht einfach jedes Control in ein TabControl casten kannst, wenn es keines ist. Also musst Du Dir explizit die rausholen. Schaue Dir dazu die Linq-Extension OfType(Of T)() an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    ErfinderDesRades schrieb:

    deutsch
    Jou, hatten wir bereits im 2. Post.
    Wahrscheinlich will er unter visueller Kontrolle die Sprache ändern, bringt einfach nix, weil der Start-Thread nicht geändert wurde.
    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!

    ErfinderDesRades schrieb:

    Datumsen

    Also bitte... :>

    Naja, ich persönlich würde das sowieso komplett anders regeln. Das wäre dann über JSON-Serialisierung und co., aber gut. Insofern man eine CultureInfo hat, kann man doch sicher einfach die Daten ändern, oder? Ich denke schon, dass DateTime usw. da was anbieten, wäre ja sonst nutzlos.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    wäre ja sonst nutzlos
    Mit welchem (zu hohen) Aufwand in diesem Kontext?
    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!
    @ErfinderDesRades

    ErfinderDesRades schrieb:

    zB Datumsen bleibt nachwievor deutsch.
    Ich brauch das ganze so gesehen eh nur in 1 Form und beim beenden der Form wird der Benutzer gewarnt das man neu starten muss (der Übergang soll halt schon richtig dort stehen) :D

    Danke euch allen

    LG Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    @RodFromGermany Naja, wenn man bei DateTime keine Kultur angeben könnte, würde ja ein elementarer Teil fehlen.
    Aber geht ja: msdn.microsoft.com/en-us/library/5hh873ya(v=vs.90).aspx

    @ErfinderDesRades Wieso? Wenn ich die Kultur einstelle, dann sollte das doch passen, oder nicht?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: