<< AmigaBasic >> WindowPtr
HelloLocalWorld.c schreiben. Das
letztendliche Programm sieht dann ungefähr so aus:
#include "HelloLocalWorld_Cat.h"
#include <clib/exec_protos.h>
struct Library *LocaleBase;
void main(int argc, char *argv[])
{
/* Öffne die locale.library. (Kein Abbruch, wenn sie nicht
da ist, weil dann einfach die eingebauten Strings verwendet
werden. Aus diesem Grund auch keine Verwendung des
AutoOpening, auch wenn es der Compiler beherrscht.)
*/
LocaleBase = OpenLibrary("locale.library", 38);
OpenHelloLocalWorldCatalogs(NULL, NULL);
printf(GetString(MSG_Hello));
CloseHelloLocalWorldCatalog();
if (LocaleBase) CloseLibrary(LocaleBase);
}
Die Funktion GetString prüft, ob die gewünschten Kataloge vorhanden sind und liefert einen Zeiger auf einen String, entweder den eingebauten oder den Katalogstring. (In unserem Fall den deutschen String.)
Der Hauptunterschied zum gewohnten HelloWorld.c ist also (abgesehen von der minimalen Initialisierung und dem Gegenstück am Programmende, das bei den meisten modernen Programmiersprachen oder unter C mit Hilfe des FlexCat-Paketes sogar auch noch entfällt), Strings durch einen Funktionsaufruf zu ersetzen. Man braucht also eine Datei `HelloLocalWorld_Cat.c', die die Funktionen OpenHelloLocalWorld, GetString, CloseHelloLocalWorld_Cat.h und die eingebauten Strings enthält (dies könnte ein Array sein, das unter anderem
array[MSG_Hello] = "Hello, local world.\n";
enthält) und ein Includefile `HelloLocalWorld_Cat.h', das die
ID's wie MSG_Hello definiert. Es ist nicht nötig zu wissen, wie diese
Dateien intern arbeiten, insbesondere benötigt man auch keine Kenntnis
der locale.library!
Dazu gibt es verschiedene Kataloggeneratoren (im Folgenden KG), nämlich
`CatComp' (nur für Developer), KitCat (nur deutsche
Dokumentation, was hierzulande kein Problem ist), `MakeCat' (das ich
nicht kenne) und FlexCat (das ich empfehle, einerseits, weil
es sehr flexibel im erzeugten Source ist und z.B. Lokalisierung unter 2.0
sowie beliebige Programmiersprachen unterstützt, selbst Amiga-E, Cluster,
Pascal, ... und andererseits, weil es von mir ist ;-) ), die diese Dateien
sowie die Kataloge erzeugen. (Der obige Quelltext könnte je nach KG
leicht unterschiedlich aussehen.) Siehe Aminet, directory `dev/misc'.
Wie funktionieren diese KGs? Zunächst erzeugt man eine sogenannte
Katalogbeschreibung (Catalog description), die so aussehen
könnte:
; Mit einem Semikolon beginnende Zeilen sind Kommentare
# language english
; die Sprache der eingebauten Strings
# version 0
; die Katalogversion (0 = beliebig)
MSG_Hello (1/15/30)
Hello, local world
Jeder String wird durch zwei Zeilen wie die letzten beiden definiert:
MSG_Hello ist die String-ID, (1/15/30) gibt den Wert der ID sowie die
minimale und maximale Länge an. (Diese Argumente können auch weggelassen
werden, in welchem Fall einfach die nächste freie ID verwendet wird.)
Nun schreiben wir das Programm. Sobald es fertig ist, wird mit dem KG eine sogenannte Katalogübersetzung (eine für jede andere Sprache als die eingebaute) erzeugt, die so aussehen könnte:
; Mit einem Semikolon beginnende Zeilen sind Kommentare
## language deutsch
; the catalog language
## version $VER: Deutsch.catalog 1.0 (22.12.93)
; the catalog files version string
MSG_Hello
; Hello, local world
Beachten Sie die leere Zeile nach der String-ID! (Die Argumente von
## language und ## version wären vielleicht leer.) Hier müssten
jetzt die deutschen Strings eingesetzt werden. Mit dem KG wird daraus
dann der eigentliche Katalog erzeugt. (Beachten Sie auch, daß
hier die Angaben über String-ID und Stringlänge fehlen: Sie werden
aus der Katalogbeschreibung übernommen.
Wenn das Programm verändert wird (neue Strings, andere Längen) und die Katalogbeschreibung sich damit ebenfalls ändert, dann kann der KG analog benutzt werden, um auch die Katalogübersetzung und damit den Katalog auf den neuesten Stand zu bringen.
<< AmigaBasic >> WindowPtr