Mehrsprachige Programme erstellen

  • Wilkommen bei meinem ersten AutoIt Tutorial!
    Worum geht es hier?

    • Arbeiten und bearbeiten von INI-Dateien
    • Automatisches erkennen von verfügbaren Sprachen in INI-Dateien
    • Ändern der Sprache im Programm selbst ohne INI-Dateien
    • Die Systemsprache zur Standartsprache machen


    1.
    Arbeiten mit und bearbeiten von INI-Dateien


    Am Anfang ist es sinnvol zu klären was INI-Dateien sind und wie man mit ihnen Arbeitet. Solltest du bereits Vorwissen über INI-Dateien besitzen mach am besten direkt bei Punkt 2 - Automatisches erkennen von verfügbaren Sprachen in INI-Dateien weiter.


    Was ist eine INI-Datei?

    Quote

    Eine Initialisierungsdatei (kurz INI-Datei) ist eine Textdatei, die z. B. unter Windows zum Ablegen von Programmeinstellungen (z. B. Position des Programmfensters) verwendet wird. Bei erneutem Aufruf des Programms werden die Programmeinstellungen eingelesen, um den Zustand vor dem letzten Schließen wieder einzunehmen.
    INI-Dateien im Programm- oder Systemverzeichnis, wie es zum Beispiel unter Windows 3.1 noch üblich war, sind unter neueren Windowsversionen immer weniger gebräuchlich, da Programmeinstellungen meist in der Registry oder bei NT-basierten Versionen im Anwendungsdatenverzeichnis des Benutzerprofils abgelegt werden. Quelle:

    Kurzgefasst: eine INI-Datei ist ein Textdokument in dem Einstellungen gespeichert und geladen werden können.


    Wie sieht eine INI-Datei aus?


    Eine INI-Datei lässt sich in unterteilen in Sektionen, Schlüssel und Werte. Die Sektionen lassen sich mit Schubladen vergleichen, in einer bestimmten Schublade finden sich bestimmte Einstellungen. Die Schlüssel lassen sich mit Variablen vergleichen, sie haben nur einen Namen, können aber immer andere Werte enthalten. Die Werte sind dass, was letztendlich in AutoIt eingeladen wird.


    Ein Beispiel wie eine INI-Datei aussehen kann.


    Um eine solche INI-Datei zu erstellen verwenden wir in AutoIt den Befehl
    [autoit]IniWrite("filename", "section", "key", "value")[/autoit]
    "filename" - Der Pfad und Name der INI-Datei, wird kein Pfad angegeben wird das Skriptverzeichniss verwendet, existiert die INI-Datei nicht wird sie erstellt.
    "section" - Der Name der Sektion in die geschrieben werden soll, s.o.
    "key" - Der Schlüssel, dessen Wert in eine Variable gelesen wird, s.o.
    "value" - Der Wert des Schlüssel, welcher letzendlich verwendet wird, s.o.


    Wir speichern Einstellungen in einer INI-Datei ab

    Da ich das Tutorial nur ungern trocken und theoretisch halten würde, werden wir ab jetz in einer kleinen GUI weiterarbeiten. Ich kann euch nur empfehlen, alles was ich hier erkläre auch auszuprobieren, so prägt sich alles am leichtesten ein.


    [Tutorial] Mehrsprachige Programme (1. INI-Dateien).au3


    Um in diesem Programm eingegebene Daten abzuspeichern brauchen wir den Befehl
    [autoit]IniWrite("filename", "section", "key", "value")[/autoit]
    sowie den Befehl
    [autoit]GUICtrlRead(controlID)[/autoit]


    Zuerst werden die eingegebenen Werte mit GUICtrlRead in Variablen gespeichert. Dann erstellen wir eine INI-Datei in der innerhalb der Sektion "[Einstellungen]" die Inhalte der input Felder gespeichert werden sollen. Als Namen für die INI-Datei nehme ich einfach mal "settings.ini".


    Der Befehl GUICtrlRead liest Daten aus einem control aus. Also Beispielsweise welchen Text ein Label enthält, oder welche Eingabe ein input.


    Das ganze sieht in unserer GUI dann so aus:


    Gebt beliebige Daten ein und klickt auf den Button "Speichern", in dem Ordner in dem euer Skript liegt sollte eine Datei entstehen ("settings.ini").
    Öffnet diese Datei einmal mit einem Texteditor eurer Wahl. Eure INI-Datei sollte ähnlichkeit mit dem oben gezeigten Schema haben.


    Wir laden Einstellungen aus einer INI-Datei ein


    Um Einstellungen aus einer INI-Datei zu laden benötigen wir wieder 2 Befehle.
    [autoit]IniRead("filename", "section", "key", "default")[/autoit]
    und
    [autoit]GUICtrlSetData(controlID, "data")[/autoit]


    Ihr seht, dass IniRead dem IniWrite Befehl sehr ähnlich sieht. Der einzige unterschied ist das "default" Parameter. Dort tragt ihr ein was standartmäßig verwendet werden soll, wenn die INI-Datei, die Sektion oder der Schlüssel nicht existieren.
    Der IniRead Befehl gibt den Wert des angegebenen Schlüssels, innerhalb der angegebenen Sektion zurück.


    Der Befehl GUICtrlSetData ändert den Wert in einem control, es wird also zuerst der Name eines labels/inputs/edits etc. angegeben, dann welche Informationen dieses control enthalten soll.


    In unserer GUI sieht das ganze jetzt so aus:


    Was muss ich sonst noch wissen?


    Eigentlich nichts! Ihr habt bereits jetzt alles was ihr braucht um INI-Dateien zu erstellen in denen ihr die komplette Übersetzung eures Programms speichern und auch wieder laden könnt. Ihr werdet zwar meistens nicht wie in meinem Beispiel inputs mit Informationen füttern, wenn es um Sprache geht, aber das selbe Prinzip lässt sich 1:1 so auch auf Labels, Menüs und ähnliches anwenden.



    2. Automatisches erkennen von verfügbaren Sprachen in INI-Dateien


    Wenn euer Programm um verschiedene Sprachen erweiterbar sein soll, ist es sinnvoll wenn euer Programm selbstständig erkennt welche und wieviele Sprachen verfügbar sind. Dazu könnt ihr zwei Systeme anwenden.

  • 2.1 - Für jede Sprache eine INI-Datei verwenden


    Die erste Möglichkeit ist, jede Sprache um die euer Programm erweiterbar sein soll in eine neue INI-Datei zu speichern. Dann müsst ihr nur noch euren Skriptpfad (oder in welchem Ordner auch immer ihr eure INI-Dateien speichert) nach INI-Dateien suchen, und die Namen dieser Dateien als verfügbare Sprachen in eurer GUI ausgeben.


    Wie gewohnt machen wir das ganze mit einer kleinen GUI. In dieser GUI hier stehen einfach 4 Wörter die wir übersetzen werden.


    Um jetzt herauszufinden ob es INI-Dateien gibt und wenn ja welche, verwenden wir die Befehle
    [autoit]FileFindFirstFile("filename")[/autoit]
    und
    [autoit]FileFindNextFile(search)[/autoit]


    Was machen diese beiden Befehle?
    FileFindFirstFile gibt ein "Such-Handle" zurück, welches wir für FileFindNextFile benötigen. Das Parameter für unseren FindFileFirstFile Befehl lautet "*.ini", das "*" steht für 0 oder mehr Zeichen die dem .ini vorran gehen. Das "Such-Handle" welches wir dann erhalten verwenden wir im FindFileNextFile.


    FindFileNextFile gibt solange verschiedene Dateinamen zurück, bis keine weitere Datei existiert die den Suchkriterien entspricht. In diesem Fall wird @error auf 1 gesetzt. Wir müssen FindFileNextFile also solange durchlaufen lassen bis @error auf 1 gesetzt wird. Dabei speichern wir alle Dateinamen hintereinander, getrennt von "|" (kein i! Dieses Zeichen wird durch Alt Gr + < erzeugt) für die Combobox.


    Jetzt hätten wir allerdings einen String in dem überall ".ini" steht, wir wollen jedoch nur den Namen der Sprache angeben. Dies realisieren wir mit dem Befehl
    [autoit]StringTrimRight("string", count)[/autoit]
    StringTrimRight "schneidet" rechts von einem String eine Anzahl (count) von Zeichen weg. Da wir die 4 Zeichen ".ini" entfernen wollen, geben wir als "count" Parameter 4 an.


    Unser Skript sollte jetzt so aussehen:


    Nun müssen nur noch beim klick auf den "OK-Button" die verschiedenen Sprachen eingeladen und mit GUICtrlSetData angewendet werden. Ich denke das erfordert inzwischen keine Erklärungen mehr.


    Das fertige Skript sollte jetzt so aussehen:


    Wie ihr die INI-Dateien erstellt sollte inzwischen bekannt sein, zur Sicherheit hier aber noch 3 INI-Dateien mit Sprachen für das Skript.


    Espanol.ini

    Code
    1. [translate] tree=Árbol house=Casa cow=Vaca car=Coche language_info=Elija su idioma


    English.ini

    Code
    1. [translate] tree=Tree house=House cow=Cow car=Car language_info=Choose your language


    Deutsch.ini

    Code
    1. [translate]
    2. tree=Baum
    3. house=Haus
    4. cow=Kuh
    5. car=Auto
    6. language_info=Wähle deine Sprache


    Das verwenden von mehr als einer INI-Datei hat wie alles im Leben zwei Seiten.
    Einerseits ist es für den Benutzer besonders einfach neue Sprachen zu eurem Programm hinzuzufügen, er muss nur eine INI-Datei in den Ordner mit den Sprachen legen. Andererseits ist es allerdings wesentlich übersichtlicher (vorallem wenn man sehr viele Sprachen zur verfügung stellen möchte) wenn man seine Sprachen in nur einer INI-Datei abspeichert.

  • 2.2 - Mehrere Sprachen in einer INI-Datei


    An dieser Stelle können wir wieder mit der in 2.1 verwendeten GUI arbeiten und 4 Wörter in 3 Sprachen übersetzen. Diesmal allerdings mit nur einer INI-Datei. Innerhalb unserer INI bennen wir die Sektionen nach Sprachen. Die INI-Datei sollte in etwa so aussehen:


    language.ini


    Als erstes möchten wir in unserem Programm überprüfen welche Sprachen überhaupt vorhanden sind. Dazu verwenden wir am besten den Befehl
    [autoit]IniReadSectionNames("filename")[/autoit]
    Dieser Befehl gibt in einem Array die Namen sämtlicher Sektionen in einer INI-Datei zurück.


    Wir lassen wieder alle Sprachennamen hintereinander, getrennt von einem "|" für die Combobox, in eine Variable schreiben. Zu guter letzt muss nurnoch aus der Sektion gelesen und übersetzt werden, die gerade in der Combobox markiert ist. Das realisieren wir wieder über GUICtrlRead(controlID).


    Voilà! Das Programm bezieht mehrere mögliche Übersetzungen aus nur einer INI-Datei.


    Zum besseren Verständnis natürlich noch der Quellcode des fertigen Skripts:


    3. Ändern der Sprache im Programm selbst ohne INI-Dateien


    Nun, dazu gibt es nicht sehr viel zu sagen. Um die Sprache im Programm selbst ohne INI-Dateien zu ändern, muss man lediglich mit GUICtrlSetData die Texte der Labels/Menüs/Whatever ändern. Dies hat natürlich den gewaltigen Nachteil, dass das fertige Programm schwieriger um Sprachen zu erweitern ist und dass dein Programm alle Sprachen im vorhinein enthalten muss. Durch das verwenden von INI-Dateien kann der Benutzer des Skriptes selbst entscheiden welche Sprachen er nimmt, oder er kann sogar eigene Übersetzungen anfertigen.


    Naja und damit sind wir auch schon am Ende dieses Kapitels, aber ich nutze den Platz einfach um euch zu zeigen wie ihr eure INI-Dateien mit den Sprachoptionen in euer fertiges Programm intergrieren könnt.


    Hierfür verwenden wir den Befehl
    [autoit]FileInstal("source", "dest")[/autoit]
    Was macht dieser Befehl? FileInstall bindet eine Datei ("source") beim kompilieren in euer Skript ein und entpackt diese Datei beim ausführen des fertigen Programms in den Ordner "dest".


    Beispiel:
    Wir haben in unserem Skriptverzeichniss die Datei 'language.ini' und wollen das diese INI in das Skript eingebunden und später wieder entpackt und verwendet werden kann. Das ließe sich wie folgt realisieren:
    [autoit]FileInstall("language.ini", "language.ini")[/autoit]


    Auf diese weise könnt ihr beliebig viele INI-Datein in euer Skript einbinden und müsst die INI-Dateien nicht umständlich mit in den Download packen oder euer Skript die INIs anfertigen lassen.


    4. Die Systemsprache als Standartsprache auswählen


    Um die Standartsprache eines Programmes der Systemsprache anpassen zu können, müssen wir erstmal herausfinden welche die Systemsprache überhaupt ist. Dazu verwenden wir das Makro @OSLang. @OSLang enthält einen Code, welcher einer Sprache zuzuordnen ist. Eine Liste aller Sprachcodes findet ihr hier: @OSLang-Sprachcodes.


    Um zu überprüfen ob die Systemsprache beispielsweise Deutsch, Spanisch oder Englisch ist, kann man die Befehle
    [autoit]Select
    Case <expression>
    statement
    EndSelect[/autoit]
    und
    [autoit]StringInStr("string", "substring")[/autoit]
    benutzen. StringInStr überprüft ob ein String ("string") eine bestimmte Zeichenfolge ("substring") enthält.
    Select überprüft die expression hinter jedem Case auf Wahrheit und führt die statements aus, falls die expression wahr ist.


    Das ganze sieht als Skript dann so aus:


    Und dieses kleine Skript muss jetzt nurnoch sinnvoll in unser Programm integriert werden. Ich nehme als Beispiel das Skript aus 2.2 und zeige wie ein Skript aussehen kann, welches sich selbstständig auf die Systemsprache einstellt. Dazu wird einfach wieder aus der 'language.ini' gelesen, diesmal wird als Sektion aber die Variable $syslanguage verwendet.



    Und so kommt ihr ans Ende dieses kleinen Tutorials. Ich hoffe ich kann damit einigen Leuten weiterhelfen!


    Euch hat etwas gefehlt? Ihr habt etwas nicht verstanden? Ihr habt Fehler entdeckt? - Schreibt mir bitte eine Naricht damit ich mich darum kümmern kann.


    Feedback ist ausdrücklick erwünscht!

  • Wie schon einmal gesagt findeich das Tutorial sehr gut!
    Es beschreibt sehr genau für was es gut ist und vorallem wie man es richtig anwendet.


    Von mir gibts 4 Danke für dieses Tutorial. ;D


    MfG,
    Nestos.

    [b][align=center][img]http://i51.tinypic.com/j0d7wm.png[/img] [color=#660066]˜ [color=#9988FF]Masken[/color] ˜[/color][/align] E-Dollar [url=http://www.noshacks.de/news-ank%C3%BCndigungen-f2/faq-alles-rund-um-e-dollar-t882/p1.html][color=#4890ff][FAQ] Alles rund um E-Dollar[/color][/url] AutoIt [url=http://www.noshacks.de/autoit-f27/tutorial-guis-erstellen-verwalten-und-sinnvoll-einsetzen-t685/p1.html][color=#4890ff][Tut] GUIs erstellen, verwalten und sinnvoll einsetzen[/color][/url][/b]