Post by Jens KallupHallo,
Hauptziel ist es, eine Alternative zu poedit zu gestalten
blöde Frage, was ist oder macht poedit?
wenn Du mit den *nix Tools GNU C/C++ Compiler oder dem FPC,
dem Free Pascal Compiler (der Grundlage von Lazarus ist)
programmierst - vor allem dann in mehreren Sprachen, stehst
Du vor dem Problem, wie man denn nun verschiedene Sprachen
der verschiedensten LÀnder auf der Erde in einen einzigen
Programm unterbring, ohne dabei rekursiven Code zu schreiben.
Rekursive im Sinne von "Mehrdeutig" oder "Doppeltes Lottchen".
Also dem Problem, das man in den Quellcode, alle möglichen
LÀndersprachen zur Lokaliesierung die unterstÌtzt werden bzw.
sollen in eine EXE unterbringt.
Freilich kann man sagen, das dies nicht weiter schlimm ist.
Gerade in Zeiten des Ãberflusses an Speicher.
Man hat sich aber schon sehr frÌh mit diesen Problem beschÀftigt,
um so den Code mit Design-Daten zu trennen.
Herausgekommen ist eine Art Protokoll, die das Programm versteht,
bzw. verstehen muss, um Locales zu nutzen.
Man schreibt also erstmal seinen Code, und ÃŒberlegt sich schon
in der Planungsphase des Programmes, wo und wie Meldungen fÃŒr
den Benutzer auftauchen sollen.
Als einfachstes Beispiel wÀre:
if MemorySize < 1 then showmessage(LC_NoMoreMemory) else
showmessage(LC_LowMemory); ...
man setzt also Marken/Platzhalter fÃŒr den Text, der angezeigt werden
soll.
Diese Marken werden dann in eine Map gespeichert.
Eine Map - oder eine TStringList Klasse - wird mit einen Key, also
der Quellsprache initiaziert.
Dann wird der Text in dieser Map als Value-Wert fÃŒr die Ãbersetzung
festgehalten/gespeichert.
Unter C++ wÀre zum Beispiel folgendes möglich:
std::map< std::string, std::string > LocaleDEU;
...
// der setter:
LocaleDEU['LC_NoMoreMemory'] = "kein Speicher vorhanden !";
// der getter:
std::cout << LocalesDEU['LC_NoMoreMemory'] << std::endl;
Da die meisten Programme sich bis in wenigen Merkmalen meist Àhnlich
sind (also der Kontext auf Meldungen), hat man sich gedacht, Wörter-
bÃŒcher einzusetzen, die dann bei jeden Programm beigelegt und auch
erweitert werden können.
Diese WörterbÌcher sind von einen Tool/Compiler erzeugte de_DE.mo
Dateien, die in einer Query-Sprach-Datei namens:
"original.po"
als Quellsource Text datei vorliegt.
*.mo Dateien bilden einen StringHash, also eine kleine Datenbank
mit einen Index auf Gruppen, Blöcke oder einzelne EintrÀge darstellt.
Hashes sind ja dafÌr bekannt, das sie Àhnlich wie eine Map funktion-
ieren - nur halt ein klein wenig schneller.
Hat man also nun ein solches Wörterbuch angelegt und als Datei vor
sich auf den Computer zur VerfÃŒgung hat, kann man das Kommando-Zeilen
Programm "msgfmt.exe" nutzen, um binÀre *.mo Dateien zu erzeugen.
Da das Programm von OpenSource Leuten programmiert wurde, ist es auch
bei Einhaltung einer kleinen Lizenz kostenlos nutzbar und auch dann
wieder distrubute-able (mit den Eigenen Programm - ob das nun in
binÀrer (compilierter), oder Quellcode (Textdatei) Form vorliegt spielt
hierbei erstmal keine Rolle (so lange Du kein Profit machen willst ! ).
Das *.po Dateiformat, das die Grundlage von *.mo Dateien ist hat in
etwa folgenden Aufbau:
# kommentar oder Sterungszeile
msgid "Message ID"
msgstr "Dies ist der Ãbersetzte Text"
...
man muss hierbei nicht unbedingt darauf achten, das man einen Datenbank
Index folgt (wie groÃe Datenbankensysteme verlangen).
Dadurch sind diese Dateien und Tools sehr schnell.
die "msgid" gibt als String die Marke im Quelltext des Programmes an,
die ÃŒbersetzt werden soll.
Der ÃŒbersetzte Text wird dann eine Zeile tiefer mit "msgstr" angegeben.
Delphi 7 bietet sowas Àhnliches mit "RESOURCESTRiNG".
Hierbei werden im laufenden Programmierprozeà - also letzendens im
Quellcode wieder konstante Marken als Resource Typus String in einer
sprachbezogener LÀnder/Locales Datei gespeichert/compiliert.
Diese Dateien haben dann zum Beispiel die Erweiterung:
*.DEU fÃŒr Deutsch
*.ENG fÃŒr English (British)
*.ENU fÃŒr English (USA)
Ein Nachteil hierbei ist aber, das bei Ãnderungen des Quellcode eines
Projektes/Programms die gesamten Resourcen Dateien mit den Programm
kompiliert werden mÃŒssen.
Schon alleine das birgt hohe Gefahren, weil Delphi 7 die Eigenart hat,
manches zu verschlucken oder einfach zu löschen - kann man ja auch
schön daran sehen, wenn ein Event-Handler im Inspektor angelegt wird,
und anschlieÃend STRG + F9 gedrÃŒckt wird - dann wird dieser Code, der
eigentlich leer ist, einfach gelöscht.
Also ich bin da meist recht pessimistisch, weil mich das mal in einer
Anwendung 2 Tage Arbeit zunichte gemacht hat.
Man hat also dann eine EXE als Hauptprogramm, und mindestenz zwei
Ressource Dateien, die dann den Speicher volldonnern.
Mit *.mo Dateien, die extern behandelt werden (ja die *nix waren und
sind ja schlaue Menschen) in den Speicher geladen und wieder aus diesen
entladen werden können.
Zudem sind *.mo Dateien dann reichlich schlanker als die Resourcen
Dateien, die Delphi anlegt.
Ich will Delphi nicht kaput schreiben oder schwÀtzen.
Ich nutze es ja fast jeden Tag.
Nur sind mir dabei ein paar Punkte in den Sinn gekommen, die dann sind
- wie haben die das gemacht
- wie kann man das besser machen
- wie kann man Speicher, und vor allem
- wie kann man einen groÃen Nutzerkreis erschlieÃen, indem man
dem Benutzer des Programmes spezifisch auf sein Land und/oder Region
eine SprachunterstÃŒtzung hinzu gibt.
Kurz: *.mo Dateien sind einfach nur Dateien, die zuvor im Speicher als
Hashes vorgelegen haben, und dann in eine Datei gepuffert, mit
einer bestimmten (meist festen) Struktur/(beschreibender Record)
vorliegen.
Jetzt kommt POEDIT ins Spiel.
Dieses Programm kann kostenlos vom Internet bezogen werden.
Hat aber den Nachteil, das dort ein Abo gekauft werden muss, wenn man
Premium Funktionen nutzen möchte.
Man muss sich auch Registieren, um einen Key als Registrierung eingeben.
Was ich als Tool, welches ich auch kostenlos per Hand auf der Konsole
steuern kann etwas ÃŒbertrieben.
Ich habe mal recherciert im Internet, und Àhnliche Programme gefunden.
Allerdings wird meist auf cloud oder Google Services verwiesen, die
dann eine Kostenfalle darstellen können.
Das ist zum Beispiel einer der GrÃŒnde meiner Motivationen ein Eigenes,
und kostengÃŒnstigeres Tool zu erstellen - mit den Gedanken, das es auch
irgendwer und irgendwann auch der Eine oder Andere fÃŒr sich einsetzt
und ggf. nicht entlastet (also den Geldbeutel).
Das natÃŒrlich kein kapitalistisches Manager denken...
Aber ich denke, das ich durch die Entbehrungen, die Andere mit mir haben
dadurch entgegen komme, und kostenlos Programme anbiete.
So nach dem Motto: Eine Hand wÀscht die Andere.
In diesen Sinne, Jens