da ich in letzter Zeit eine universelle Übersetzungsfunktion einbauen wollte und mir i18n viel zu komplex ist dachte ich mir ich erstelle mal eine einfach zu verwendende Übersetzungsengine. Das ganze "Projekt" besteht nur aus einer einzigen Quelldatei sodass man kein Package installieren muss, sondern einfach die Quelldatei in das Projektverzeichnis ziehen muss und fertig. Wer möchte kann sich natürlich ein Package erstellen und somit dauerhaft zur Verfügung haben.
Folgende Funktionalitäten bietet meine Engine:
- Übersetzungen auf Ini-Basis (eine einzige Ini-Datei für alle Sprachen)
- Sehr einfach zu verwenden
- Vererbung für Sprachabwandlungen (dazu später mehr)
- Eine globale Instanz TransMgr vom Typ TLightweightTranslationManager wird im initialization erstellt und im finalization freigegeben
- Es kann auch TLTM statt TLightweightTranslationManager verwendet werden für Leute die ihren Code lieber kurz statt ausführlich halten
Einfaches Beispiel:
INI-Datei (lang.cfg)
Code: Alles auswählen
[en-us]
$name=English (United States)
foo.name=Example program
foo.close=Close
foo.color=Color
[en-gb]
$name=English (United Kingdom)
$inherits=en-us
foo.color=Colour
[de-de]
$name=Deutsch (Deutschland)
foo.name=Beispielprogramm
foo.close=Schließen
foo.color=Farbe
[de-ch]
$name=Deutsch (Schweiz)
$inherits=de-de
foo.close=Schliessen
Code: Alles auswählen
uses ..., LightweightTranslationManager;
...
begin
TransMgr.IniFile := ExtractFilePath(Application.ExeName) + 'lang.cfg';
TransMgr.Language := Application.GetOptionValue('lang');
WriteLn(TransMgr.LanguageName);
WriteLn(TransMgr.GetString('foo.name'));
WriteLn(TransMgr.GetString('foo.color'));
WriteLn(TransMgr.GetString('foo.close'));
end.
Code: Alles auswählen
Deutsch (Deutschland)
Beispielprogramm
Farbe
Schließen
Code: Alles auswählen
Deutsch (Schweiz)
Beispielprogramm
Farbe
Schliessen
Da eine Mehrfachvererbung möglich ist (z.B. "$inherits=lang1, lang2") gilt: Die Sprachen werden von links nach rechts gelesen und interpretiert. Sprachen die zuletzt angegeben werden überschreiben vorher angegebene Übersetzungen wenn diese doppelt existieren.
Hinweise:
- Schlüssel mit "$" am Anfang werden vom Parser ignoriert da sie Informationsschlüssel für den Parser sind (Name und Vererbung).
- Wird "GetString()" aufgerufen und es existiert ein Schlüssel nicht, wird "DefaultValue" zurückgegeben. Ist "DefaultValue" jedoch ein Leerstring wird der "KeyName" des Schlüssels zurückgegeben (z.B. "foo.name").
Das ganze steht unter der WTFPL-Lizenz. Mit anderen Worten: Macht damit was ihr wollt.
Download: http://patrick-lampke.de/download/lightweighttranslationmanager.pas