mirror of
https://git.FreeBSD.org/doc.git
synced 2026-06-02 11:25:20 +00:00
379 lines
14 KiB
XML
379 lines
14 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!--
|
|
The FreeBSD Documentation Project
|
|
The FreeBSD German Documentation Project
|
|
|
|
$FreeBSD$
|
|
$FreeBSDde: de-docproj/books/developers-handbook/l10n/chapter.xml,v 1.15 2010/12/15 19:03:51 bcr Exp $
|
|
basiert auf: 1.14
|
|
-->
|
|
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="l10n">
|
|
<info><title>Lokalisierung und Internationalisierung - L10N und
|
|
I18N</title>
|
|
<authorgroup>
|
|
<author><personname><firstname>Jochen</firstname><surname>Neumeister</surname></personname><contrib>Übersetzt von </contrib></author>
|
|
</authorgroup>
|
|
</info>
|
|
|
|
|
|
|
|
<sect1 xml:id="l10n-programming">
|
|
<title>I18N-konforme Anwendungen programmieren</title>
|
|
|
|
<indexterm><primary>Qt</primary></indexterm>
|
|
<indexterm><primary>GTK</primary></indexterm>
|
|
|
|
<para>Um Ihre Anwendung verwendbarer für andere
|
|
Sprachen zu machen, hoffen wir, dass Sie I18N-konform
|
|
programmieren. Der GNU gcc-Compiler und Bibliotheken
|
|
für grafische Benutzeroberflächen wie QT und GTK
|
|
unterstützen I18N durch eine spezielle Verarbeitung von
|
|
Zeichenketten. Das Erstellen eines I18N-konformen Programms
|
|
ist sehr einfach und erlaubt anderen Mitwirkenden, Ihre
|
|
Programme leichter in andere Sprachen zu übersetzen.
|
|
Lesen Sie die Bibliothek-spezifischen I18N-Dokumentationen
|
|
für weitere Details.</para>
|
|
|
|
<para>Im Gegensatz zur allgemeinen Meinung ist I18N-konformer
|
|
Code einfach zu programmieren. Üblicherweise umfasst
|
|
dies nur das Einbetten Ihrer Zeichenketten in
|
|
Bibliothek-spezifische Funktionen. Stellen Sie außerdem
|
|
bitte sicher, dass Sie Unterstützung für Unicode- und
|
|
Multibyte-Zeichen vorsehen.</para>
|
|
|
|
<sect2>
|
|
<title>Ein Aufruf, die I18N-Bemühungen zu
|
|
vereinheitlichen</title>
|
|
|
|
<para>Wir sind darauf aufmerksam geworden, dass die
|
|
einzelnen I18N-/L10N-Bemühungen für jedes Land
|
|
wiederholt wurden. Viele von uns haben somit unproduktiverweise
|
|
das Rad immer wieder neu erfunden. Wir hoffen, dass die
|
|
verschiedenen großen Gruppen für I18N Ihre
|
|
Bemühungen in einer Gruppe vereinen können,
|
|
ähnlich der Zuständigkeit des Core-Teams.</para>
|
|
|
|
<para>Derzeit hoffen wir, dass wenn Sie I18N-konforme
|
|
Programme schreiben oder portieren, diese an die
|
|
betreffenden FreeBSD-Mailinglisten jedes Landes schicken, um
|
|
sie testen zu lassen. Wir hoffen in Zukunft, Anwendungen zu
|
|
entwickeln, die in allen Sprachen direkt und ohne unsaubere
|
|
Änderungen funktionieren.</para>
|
|
|
|
<para>Die &a.i18n;-Mailingliste ist eingerichtet worden. Wenn
|
|
Sie I18N-/L10N-Entwickler sind, schicken Sie bitte Ihre
|
|
Kommentare, Ideen, Fragen und alles, das Sie mit dem Thema in
|
|
Verbindung bringen, dorthin.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Perl und Python</title>
|
|
|
|
<indexterm>
|
|
<primary>Perl</primary>
|
|
</indexterm>
|
|
|
|
<indexterm>
|
|
<primary>Python</primary>
|
|
</indexterm>
|
|
|
|
<para>Perl und Python bieten Bibliotheken für I18N und zur
|
|
Behandlung von Unicode-Zeichen. Bitte nutzen Sie diese
|
|
für I18N-Konformität.</para>
|
|
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 xml:id="posix-nls">
|
|
<info><title>Lokalisierte Nachrichten mit POSIX.1 Native Language
|
|
Support (NLS)</title>
|
|
<authorgroup>
|
|
<author><personname><firstname>Gábor</firstname><surname>Kövesdán</surname></personname><contrib>Beigetragen von </contrib></author>
|
|
</authorgroup>
|
|
</info>
|
|
|
|
|
|
|
|
<para>Über die Basisfunktionen von I18N hinaus, wie das Bereitstellen
|
|
von verschiedenen Eingabecodierungen oder die diversen nationalen
|
|
Konventionen, zum Beispiel die verschiedenen Dezimalpunkte, ist es
|
|
auf einem höheren Level von I18N möglich, die Ausgabe
|
|
von Programmen zu lokalisieren. Ein Weg dies zu tun besteht in der
|
|
Nutzung der POSIX.1 NLS-Funktionen von &os;.</para>
|
|
|
|
<sect2 xml:id="nls-catalogs">
|
|
<title>Organisation von lokalisierten Mitteilungen in Katalog
|
|
Dateien</title>
|
|
|
|
<para>POSIX.1 NLS basiert auf Katalogdateien, welche die lokalisierten
|
|
Mitteilungen in der entsprechenden Codierung enthalten. Die
|
|
Mitteilungen sind in Sets organisiert und jede Mitteilung ist
|
|
durch eine eindeutige Zahl in dem jeweiligen Set identifiziert.
|
|
Die Katalogdateien werden nach der Lokale, von den jeweiligen
|
|
lokalisierten Mitteilungen, die sie enthalten, gefolgt von der
|
|
<literal>.msg</literal> Endung benannt. Zum Beispiel werden die
|
|
ungarischen Mitteilungen für das ISO8859-2 Encoding in
|
|
einer Datei mit dem Dateinamen <filename>hu_HU.ISO8859-2</filename>
|
|
gespeichert.</para>
|
|
|
|
<para>Diese Katalogdateien sind normale Textdateien, welche die
|
|
nummerierten Mitteilungen enthalten. Es ist möglich
|
|
Kommentare in die Dateien zu schreiben, indem Sie ein
|
|
<literal>$</literal>-Zeichen an den Anfang der Zeile setzen.
|
|
Das Setzen von Grenzen wird ebenfalls durch spezielle Kommentare
|
|
möglich wobei das Schlüsselwort <literal>set</literal>
|
|
direkt nach dem <literal>$</literal>-Zeichen folgen muss. Dem
|
|
Schlüsselwort <literal>set</literal> folgt dann die Set-Nummer.
|
|
Ein Beispiel:</para>
|
|
|
|
<programlisting>$set 1</programlisting>
|
|
|
|
<para>Der aktuelle Mitteilungseintrag startet mit der
|
|
Mitteilungsnummer gefolgt von der lokalisierten Nachricht. Die
|
|
bekannten Modifikatoren von &man.printf.3; werden akzeptiert:</para>
|
|
|
|
<programlisting>15 "File not found: %s\n"</programlisting>
|
|
|
|
<para>Die Katalogdateien müssen in binärer Form vorliegen,
|
|
bevor sie von einem Programm benutzt werden können. Dies wird
|
|
mit dem &man.gencat.1; Tool durchgeführt. Das erste Argument
|
|
ist der Dateiname des kompilierten Katalogs und die weiteren
|
|
Argumente sind die Eingabekataloge. Die lokalisierten
|
|
Mitteilungen können auf mehrere Katalogdateien aufgeteilt
|
|
sein. Danach werden dann alle auf einmal mit dem &man.gencat.1;
|
|
Tool kompiliert.</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 xml:id="nls-using">
|
|
<title>Nutzung der Katalogdateien im Quellcode</title>
|
|
|
|
<para>Das Benutzen der Katalogdateien ist einfach. Um die
|
|
relevante Funktion zu nutzen, muss <filename>nl_types.h</filename> in die Quelldatei
|
|
eingefügt werden. Bevor ein Katalog benutzt werden
|
|
kann, muss er mit &man.catopen.3; geöffnet werden.
|
|
Die Funktion hat 2 Argumente. Der erste Parameter ist der
|
|
Name des installierten und kompilierten Katalogs. Normalerweise
|
|
wird der Name des Programmes, zum Beispiel
|
|
<application>grep</application>, genutzt. Dieser Name wird
|
|
zum Suchen der kompilierten Katalogdatei benutzt. Der Aufruf
|
|
von &man.catopen.3; sucht nach dieser Datei in <filename>/usr/share/nls/locale/catname</filename>
|
|
und in <filename>/usr/local/share/nls/locale/catname</filename>,
|
|
wobei <literal>locale</literal> die gesetzte Lokale und
|
|
<literal>catname</literal> der Katalogname ist. Der zweite
|
|
Parameter ist eine Konstante, die zwei Werte haben kann:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
|
|
<para><literal>NL_CAT_LOCALE</literal>, hat die Bedeutung,
|
|
dass die benutzte Katalogdatei auf
|
|
<envar>LC_MESSAGES</envar> basiert.</para>
|
|
|
|
</listitem>
|
|
|
|
<listitem>
|
|
|
|
<para><literal>0</literal>, hat die Bedeutung, dass
|
|
<envar>LANG</envar> benutzt wird, um die Katalogdatei
|
|
zu öffnen.
|
|
</para>
|
|
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Der &man.catopen.3; Aufruf gibt einen Katalogidentifizierer
|
|
vom Type <literal>nl_catd</literal> zurück. Sehen Sie in der
|
|
Manualpage nach, um eine Liste mit möglichen Fehlercodes
|
|
zu erhalten.</para>
|
|
|
|
<para>Nach dem Öffnen eines Katalogs, kann &man.catgets.3;
|
|
benutzt werden, um Mitteilungen zu erhalten. Der erste
|
|
Parameter ist der Katalogidentifizierer, der von
|
|
&man.catopen.3; zurück gegeben wurde, das zweite ist die
|
|
Nummer des Sets, das dritte die Nummer der Mitteilung und das
|
|
vierte ist eine Fallbackmitteilung, die angezeigt wird,
|
|
falls die gewünschte Mitteilung in der Katalogdatei
|
|
nicht verfügbar ist.</para>
|
|
|
|
<para>Nach der Nutzung der Katalogdatei, muss sie mit dem
|
|
Kommando &man.catclose.3;, geschlossen werden. Es besitzt
|
|
ein Argument, die Katalog ID.</para>
|
|
|
|
</sect2>
|
|
|
|
<sect2 xml:id="nls-example">
|
|
<title>Ein Beispiel aus der Praxis</title>
|
|
|
|
<para>Das folgende Beispiel zeigt einen einfachen Weg wie man
|
|
NLS-Kataloge flexibel nutzen kann.</para>
|
|
|
|
<para>Die nachfolgenden Zeilen müssen in eine allgemeine
|
|
Headerdatei, die in allen Quelldateien vorhanden ist, die
|
|
lokalisierte Mitteilungen benutzen, eingefügt werden:</para>
|
|
|
|
<programlisting>
|
|
#ifdef WITHOUT_NLS
|
|
#define getstr(n) nlsstr[n]
|
|
#else
|
|
#include <nl_types.h>
|
|
|
|
extern nl_catd catalog;
|
|
#define getstr(n) catgets(catalog, 1, n, nlsstr[n])
|
|
#endif
|
|
|
|
extern char *nlsstr[];
|
|
</programlisting>
|
|
|
|
<para>Als nächstes fügen Sie die folgenden Zeilen
|
|
in den globalen Deklarationsteil der Hauptquelldatei ein:</para>
|
|
|
|
<programlisting>
|
|
#ifndef WITHOUT_NLS
|
|
#include <nl_types.h>
|
|
nl_catd catalog;
|
|
#endif
|
|
|
|
/*
|
|
* Default messages to use when NLS is disabled or no catalog
|
|
* is found.
|
|
*/
|
|
char *nlsstr[] = {
|
|
"",
|
|
/* 1*/ "some random message",
|
|
/* 2*/ "some other message"
|
|
};
|
|
</programlisting>
|
|
|
|
<para>Als nächstes kommt der Code der den Katalog
|
|
öffnet, liest und schließt:</para>
|
|
|
|
<programlisting>
|
|
#ifndef WITHOUT_NLS
|
|
catalog = catopen("myapp", NL_CAT_LOCALE);
|
|
#endif
|
|
|
|
...
|
|
|
|
printf(getstr(1));
|
|
|
|
...
|
|
|
|
#ifndef WITHOUT_NLS
|
|
catclose(catalog);
|
|
#endif
|
|
</programlisting>
|
|
|
|
<sect3>
|
|
<title>Reduzierung von zu lokalisierenden Zeichenketten</title>
|
|
|
|
<para>Es gibt einen guten Weg, Zeichenketten die lokaliesert
|
|
werden müssen, durch den Einsatz von
|
|
<application>libc</application>-Fehlermeldungen zu reduzieren.
|
|
Dadurch vermeidet man Duplikate und erstellt gleiche Meldungen
|
|
für häufige Fehlermeldungen, die bei vielen
|
|
Programmen auftreten können.</para>
|
|
|
|
<para>Als erstes ist hier ein Beispiel, dass keine
|
|
<application>libc</application>-Fehlermeldungen benutzt:</para>
|
|
|
|
<programlisting>
|
|
#include <err.h>
|
|
...
|
|
if (!S_ISDIR(st.st_mode))
|
|
err(1, "argument is not a directory");
|
|
</programlisting>
|
|
|
|
<para>Dies kann so abgeändert werden, dass eine
|
|
Fehlermeldung durch Auslesen der Variabel <varname>errno</varname>
|
|
ausgegeben wird. Die Fehlermeldung wird entsprechend dem Beispiel
|
|
ausgegeben:</para>
|
|
|
|
<programlisting>
|
|
#include <err.h>
|
|
#include <errno.h>
|
|
...
|
|
if (!S_ISDIR(st.st_mode)) {
|
|
errno = ENOTDIR;
|
|
err(1, NULL);
|
|
}
|
|
</programlisting>
|
|
|
|
<para>In diesem Beispiel wurde die benutzerdefinierte
|
|
Zeichenkette entfernt. Übersetzer haben weniger Arbeit,
|
|
wenn sie ein Programm lokalisieren und die Benutzer sehen die
|
|
übliche <quote>"Not a directory"</quote>
|
|
Fehlermeldung, wenn dieser Fehler auftritt. Diese Meldung wird
|
|
ihnen wahrscheinlich vertraut erscheinen. Bitte beachten Sie,
|
|
dass es notwendig ist,
|
|
<filename>errno.h</filename>
|
|
hinzuzufügen um einen direkten Zugriff auf
|
|
<varname>errno</varname> zu haben.</para>
|
|
|
|
<para>Es lohnt sich darauf hinzuweisen, dass es Fälle gibt,
|
|
in denen <varname>errno</varname> automatisch aufgerufen wird,
|
|
so dass es nicht notwendig ist, es explizit zu tun:</para>
|
|
|
|
<programlisting>
|
|
#include <err.h>
|
|
...
|
|
if ((p = malloc(size)) == NULL)
|
|
err(1, NULL);
|
|
</programlisting>
|
|
</sect3>
|
|
</sect2>
|
|
|
|
<sect2 xml:id="nls-mk">
|
|
<title>Benutzung von <filename>bsd.nls.mk</filename></title>
|
|
|
|
<para>Das Benutzen von Katalogdateien setzt einige sich
|
|
wiederholende Schritte, wie das kompilieren und installieren
|
|
der Kataloge, voraus. Um diese Schritte zu vereinfachen,
|
|
stellt <filename>bsd.nls.mk</filename> einige Makros zur
|
|
Verfügung. Es ist nicht notwendig
|
|
<filename>bsd.nls.mk</filename> explizit hinein zu kopieren,
|
|
es wird automatisch aus den allgemeinen Makefiles wie
|
|
<filename>bsd.prog.mk</filename> oder
|
|
<filename>bsd.lib.mk</filename> gezogen.</para>
|
|
|
|
<para>Normalerweise reicht es, <varname>NLSNAME</varname> zu
|
|
definieren, die den Namen des Kataloges als erstes
|
|
Argument von &man.catopen.3; enthalten sollte und die
|
|
Katalogdateien in <varname>NLS</varname> ohne ihre Endung
|
|
<literal>.msg</literal> auflistet. Hier ist ein Beispiel, das
|
|
es ermöglicht, NLS mit dem obigen Code zu deaktivieren.
|
|
Die <varname>WITHOUT_NLS</varname> Variable von &man.make.1;
|
|
muss so definiert werden, dass das Programm ohne
|
|
NLS-Unterstützung gebaut wird.</para>
|
|
|
|
<programlisting>
|
|
.if !defined(WITHOUT_NLS)
|
|
NLS= es_ES.ISO8859-1
|
|
NLS+= hu_HU.ISO8859-2
|
|
NLS+= pt_BR.ISO8859-1
|
|
.else
|
|
CFLAGS+= -DWITHOUT_NLS
|
|
.endif
|
|
</programlisting>
|
|
|
|
<para>Normalerweise werden die Katalogdateien in dem
|
|
<filename>nls</filename>-Unterverzeichnis
|
|
abgelegt. Dies ist der Standard von
|
|
<filename>bsd.nls.mk</filename>. Es ist möglich, mit der
|
|
<varname>NLSSRCDIR</varname>-Variablen von &man.make.1; diese zu
|
|
überschreiben. Der Standardname der vorkompilierten
|
|
Katalogdateien folgt den Namenskonventionen, wie oben beschrieben.
|
|
Er kann durch die <varname>NLSNAME</varname>-Variablen
|
|
überschrieben werden. Es gibt noch weitere Optionen, um
|
|
eine Feinabstimmung zur Verarbeitung der Katalogdateien
|
|
zu erreichen. Da sie nicht notwendig sind, werden sie hier
|
|
nicht weiter beschrieben. Weitere Informationen über
|
|
<filename>bsd.nls.mk</filename> finden Sie in der Datei selbst.
|
|
Der Text ist kurz und leicht zu verstehen.</para>
|
|
|
|
</sect2>
|
|
|
|
</sect1>
|
|
|
|
</chapter>
|