<< AmigaBasic
>> WindowPtr

Wie lokalisiere ich mein Programm?

Nehmen wir an, wir wollen ein 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