Gui in 2 Sprachen darstellen - Wie?

  • Hallo,
    da ich gerade in Thailand als Austaschschüler bin und zu Hause kein Internet habe, habe ich weider angefangen zu programmieren^^.
    So jetzt habe ich mir einiges nützliches gemacht, unteranderem für die Schule hier, weil die Lehrer es nicht auf die Reihe bekommen, etwas mit dem Computer, der schon 10 Jahre in ihrem Department steht, etwas zu staden zu bringen, bzw Programme sogar zu öffnen :huh:
    So nun habe ich halt eine schöne Oberfläche etc. erstellt nur ist mir nun aufgefallen, dass hier nicht alle englisch können. Ich kann aber Thai sprechen, lesen und teilweise schreiben. Ich würde das jetzt alles gerne in Thai übersetzen, aber hätte es lieber wenn man dann zwischen 2 Sprachen wechseln könnte.
    Also einfach einen Button mit dem man zwischen den Sprachen herspringen kann.
    Übger die Suche habe ich nur _LoginBox gefunden, weil da ja auch Sprachen eingebaut sind.
    Das verstehe ich allerdings nicht wirklich und ich kann das Programm auch nicht richtig ausführen.
    Bitte nicht wundern, dass ich das hier um 4 Uhr schreibe^^ Ist hier schon 9...

    Ludgerf321

  • Mit dem Thema Mehrsprachigkeit setze ich mich gerade auch auseinander. Habe keinen Bock, für jede Sprache ein extra Skript zu machen. Das ist nämlich sehr Änderungs-aufwändig.
    Ich stelle mir vor, in den GUI-Anweisungen keine konstanten Textstrings, sondern Variablen anzugeben. Diesen werden die einzelnen Inhalte zuvor je nach Sprachwahl des Users zugewiesen. 8)

    MfG ThPfund

    "Es könnte alles so einfach sein..."

  • Stimmt gute Idee :)

    Frage am Anfang, ob Sprache 1 oder 2.
    $lang = 1 (oder 2)
    Einen Titel z.B:

    [autoit]


    $GUI = GUICreate($titlelang, 630, 451, 407, 267)

    [/autoit]

    Dann hier:

    [autoit]


    if ($lang = 1) then
    $titlelang = "Beispiel"
    EndIf

    [/autoit][autoit][/autoit][autoit]

    if ($lang = 2) then
    $titlelang = "Example"
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Hier mal ein Ausschnitt, aus einem Programm von mir. Hier wird der deutsche Text verwendet, sofern die vom OS verwendete Sprache eine der deutschen ist. Anderenfalls kommt der englische Text zum Einsatz. Dazu hinterlege ich alle Texte in einem 2D-Array und greife über den Index ($iLang) auf deutsch oder englisch zu:

    Spoiler anzeigen
    [autoit]

    Global $iLang=1
    If StringInStr("0407 0807 0c07 1007 1407", @OSLang) Then $iLang = 0
    Global $aText[18][2] = [ _
    ["Schließen","Close"],['FEHLER','ERROR'], _
    ["Die Datei 'xyz.exe' konnte nicht gefunden werden.","File 'xyz.exe' couldn't found."], _
    ['Das Programm wird beendet.','The program will close.'], _
    ["Ferneinstellungssoftware ","Remotesoftware "],["Hilfe","Help"],["Über","About"], _
    ["Neues Fenster","New Instance"],['Raum|Notiz|Status','Room|Note|State'],["Notiz","Note"], _
    ["COM-Port wählen","Choose COM-Port"],["Bett ","Bed "],["Notiz eintragen","Set Note"], _
    ["Geben Sie hier den neuen Titel ein: ","Set here new title: "],[" aktuelles Fenster:"," current window:"], _
    ["Starte Fernbedienung","Run Remote"],["Dieser Fenstername existiert bereits.","This window title always exists."], _
    ["Verbindung besteht bereits.","Connection always exists."]]

    [/autoit]
  • Habe in der Zwischenzeit mal ein kleines ausführbares Beispiel gebastelt.
    Das liese sich dann natürlich noch um die Vorschläge mit INI und Array ergänzen... :thumbup:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Dim $language = "G" ; gewählte Sprache Default=German
    Dim $Form1, $ButtonG, $ButtonE, $select_G, $select_E ; für GUI

    [/autoit] [autoit][/autoit] [autoit]

    _SprachZuweis() ; Initialsierung mit Default-Sprache Deutsch

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Test", 410, 260, 193, 115)
    $ButtonG = GUICtrlCreateButton($select_G, 216, 96, 105, 49)
    $ButtonE = GUICtrlCreateButton($select_E, 72, 96, 105, 49)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ButtonG ; Button Deutsch/German gedrückt
    $language = "G"
    _SprachZuweis()
    Case $ButtonE ; ; Button Englisch/English gedrückt
    $language = "E"
    _SprachZuweis()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _SprachZuweis()
    If $language = "G" Then
    $select_G = "Sprache Deutsch"
    $select_E = "Sprache Englisch"
    Else
    $select_G = "Language German"
    $select_E = "Language English"
    EndIf
    GUICtrlSetData($ButtonG, $select_G)
    GUICtrlSetData($ButtonE, $select_E)
    EndFunc

    [/autoit]

    MfG ThPfund

    "Es könnte alles so einfach sein..."

  • Ich habe das ganze bisher immer mit einer *.ini Datei gemacht:

    language_de.ini

    Code
    [gui]
    title=skript titel
    ....

    Dann im Skript sowas zum Beispiel:

    [autoit]


    ....
    $languagefile = "language_de.ini"

    [/autoit][autoit][/autoit][autoit]

    $notfound="???"
    ;GUI
    $l_guititle = IniRead($languagefile, "gui", "title", $notfound)

    [/autoit]

    Der Aufruf im Skript dann zum Bleistift:

    [autoit]

    GUICreate($l_guititle,700,700)

    [/autoit]
  • Hallo,
    Zufälle gibts^^, habe gerade eins meiner Scripte mehrsprachig gemacht. Dabei ist mir aufgefallen, daß ich einige einfache Phrasen auch direkt von einem Onlineübersetzer (Google usw.) hätte machen lassen können.
    Daher werde ich genau dafür ein Script schreiben. Es wird folgendermaßen funktionieren.
    - Lesen des Quelltextes und separieren bzw filtern der "Texte",
    - Zuordnung von zusammenhängendem Text zu einer Variablen, mehrfach vorkommende Texte bekommen auch nur eine Variable
    - Gui mit Vorschlag "Text", Variablenname und Übersetzung (Onlineunterstützung durch z.B. Google). GGf noch Anzeige des Codesegmentes, um eine Art Schwellwert für die Länge des Übersetzungstextes festzulegen.
    - Speichern von Text und Variablennamen in einer INI-Datei

    Code
    [Sprache]
    variablenname="Text" aus dem Quellcode

    - Ersetzen der übersetzten Texte im Quellcode durch die Variablennamen
    - Anhängen einer Funktion an den Quelltext, welche die Variablennamen mit den Übersetzten Texten füttert
    - Erstellen einer Sprachauswahl im Traymenu.

    Wenn das Programm in eine Sprache "übersetzt" ist, d.h. in der INI-Datei 2 Sprachen stehen, dann ist es ziemlich einfach, eine weitere Sprache hinzuzufügen.
    - Für "von Hand"-Übersetzer: Variablenblock in der INI-Datei kopieren und die einzelnen Zeilen übersetzen, oder

    Script:
    - Lesen des Variablenblocks einer Sprache (oder ggf auch mehrere Sprachen) aus der INI
    - Ersetzen der zu übersetzenden Textstellen per Google oder anderen Übersetzern
    - Block speichern....fertig

    Das Problem bei dieser Methode (Text im Quellcode durch Variablen ersetzen) ist eindeutig die "schwerere" Lesbarkeit des Quellcodes, jedenfalls für mich. Wenn das Script aber die "Beta" verlassen hat, d.h. wahrscheinlich nicht mehr sonderlich viel ergänzt/erweitert werden muss, dann ist diese Variante m.E. optimal.

  • Zitat

    Google Übersetzer

    wenn man das als einzige Quelle nimmt, dann hat man genauso verloren wie die "steht aber so in Wikipedia"-Schreier! Aber wo ist das Problem 5 der Übersetzer anzufragen und dann einfach aus den 5 Ergebnissen eine feine Eigene Übersetzung zu basteln?
    Thai wäre garnicht mein Ding^^, dann schon eher koreanisch. Wenn man absolut keinen Plan hat, dann sollte man auch nicht übersetzen!

  • Hi liebe AutoIt-ler,
    ich glaube zwar, dass dieses Thema schon beantwortet ist, dennoch wollte ich mal mein Sprachen-GUI-Beispiel zeigen.


    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)
    #Region ### START Koda GUI section ### Form=
    Global $Sprache[5][2] = [ _
    ["MsgBox öffnen", "Open MsgBox"], _
    ["Sprache: Deutsch", "language: English"], _
    ["Deutsch", "English"], _
    ["Beispiel, das ist ein bisschen Text", "Example, this is some text"], _
    ["Sprachen-Beispiel", "languages-example"]]
    Global $i = 0
    Global $Form = GUICreate($Sprache[4][0], 410, 187, 192, 124)
    Global $Group1 = GUICtrlCreateGroup("Sprachen/languages", 40, 16, 153, 65)
    Global $Radio_Deutsch = GUICtrlCreateRadio("Deutsch", 48, 32, 129, 17, 1)
    GUICtrlSetState($Radio_Deutsch, $GUI_CHECKED)
    Global $Radio_English = GUICtrlCreateRadio("English", 48, 56, 137, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    Global $Button_MsgBox = GUICtrlCreateButton($Sprache[0][0], 256, 40, 89, 33, $WS_GROUP)
    Global $Label1 = GUICtrlCreateLabel($Sprache[1][0], 32, 96, 171, 17)
    Global $Progress1 = GUICtrlCreateProgress(16, 128, 361, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    Func Exits()
    Exit
    EndFunc ;==>Exits
    Func Deutsch()
    $i = $i + 100
    GUICtrlSetData($Progress1, $i)
    GUICtrlSetData($Button_MsgBox, $Sprache[0][0])
    GUICtrlSetData($Label1, $Sprache[1][0])
    ControlSetText($Form, "", $Form, $Sprache[4][0])
    EndFunc ;==>Deutsch
    Func English()
    $i = $i + 100
    GUICtrlSetData($Progress1, $i)
    GUICtrlSetData($Button_MsgBox, $Sprache[0][1])
    GUICtrlSetData($Label1, $Sprache[1][1])
    ControlSetText($Form, "", $Form, $Sprache[4][1])
    EndFunc ;==>English
    Func MsgBoxs()
    If GUICtrlRead($Radio_Deutsch) = 1 Then
    $i = $i + 100
    GUICtrlSetData($Progress1, $i)
    MsgBox(0, $Sprache[2][0], $Sprache[3][0])
    ElseIf GUICtrlRead($Radio_English) = 1 Then
    $i = $i + 100
    GUICtrlSetData($Progress1, $i)
    MsgBox(0, $Sprache[2][1], $Sprache[3][1])
    EndIf
    EndFunc ;==>MsgBoxs

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "Exits");Damit bei einem Klick auf "X", die GUI auch geschlossen wird.
    GUICtrlSetOnEvent($Radio_Deutsch, "Deutsch")
    GUICtrlSetOnEvent($Radio_English, "English")
    GUICtrlSetOnEvent($Button_MsgBox, "MsgBoxs")
    While 1
    Sleep(10)
    If $i = 100 Then
    Sleep(750)
    $i = 0
    GUICtrlSetData($Progress1, $i)
    EndIf
    WEnd

    [/autoit]


    PS: Ich progge erst seit 2 1/2 Monaten.
    PPS: Kritik erwünscht, solange diese konstruktiv ist. :S

    4 Mal editiert, zuletzt von Ealendil (11. Januar 2010 um 03:57)

  • Hallo Ealendil,

    leider lässt lies sich das Skript nicht kompilieren. Fehlermeldungen::

    Spoiler anzeigen


    Scheint sich beim Posten ein Leerzeichen in Zeile 42 eingeschlichen zu haben, nach entfernen aus $Fo rm wird $Form läuft es problemlos. Vom Konzept her erinnert es mich an Oscars Loginbox. Schöne Arbeit, weiter so :thumbup: und herzlich willkommen im Forum,

    mfg (Auto)Bert

  • Hi,

    vielen Dank, hab den Fehler eben mal schnell editiert.

    PS: Kannte Oscars LoginBox noch nicht, hab sie aber gerade gefunden. Nice Work kann ich da nur sagen.

    Einmal editiert, zuletzt von Ealendil (11. Januar 2010 um 04:28)