Lightweight Translation Manager

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Lightweight Translation Manager

Beitrag von compmgmt »

Guten Tag allerseits,

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


Quelltext

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.


Startet man das Beispielprogramm mit dem Parameter "--lang=de-de" kommt folgendes Ergebnis im Terminal:

Code: Alles auswählen

Deutsch (Deutschland)
Beispielprogramm
Farbe
Schließen


Parameter "--lang=de-ch":

Code: Alles auswählen

Deutsch (Schweiz)
Beispielprogramm
Farbe
Schliessen


Dieses Beispiel soll eine wichtige Funktion hervorheben: Vererbung. Man kann mit dem Schlüssel "$inherits" eine oder mehrere Sprachen angeben, welche genau wie bei der OOP eingebunden werden. Diese Funktion dient primär dazu zwei oder mehr beinahe identische Sprachen nicht doppelt eintragen zu müssen. Beispielhafte Verwendung sind dafür "ß" und "ss" zwischen Deutsch und Schweizerdeutsch oder auch die altbekannte "color" im US-Englisch und "colour" im UK-Englisch.

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

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Antworten