Kapitel 8. I18N und L10N

# Kapitel 8. I18N und L10N

Multilingualisation (M17N) oder native Sprachunterstützung (die Anpassung eines Software-Produkts zur Unterstützung mehrerer Sprachen) besteht aus zwei Schritten:

- Internationalisierung (I18N): eine Software so einrichten, dass sie grundsätzlich verschiedene Gebietsschemata (Locales) unterstützt.

- Lokalisierung (L10N): eine Software für die Unterstützung eines bestimmten Gebietsschemas anpassen.

| Tipp
Bei den englischen Begriffen Multilingualization, Internationalization und Localization befinden sich 17, 18 bzw. 10 Buchstaben zwischen dem ersten und letzten Buchstaben ("m" und "n", "i" und "n" bzw. "l" und "n"), was M17N, I18N und L10N ergibt. Weitere Details finden Sie unter Internationalization and localization (englisch).

## 8.1. Das Gebietsschema (Locale)

Das Verhalten von Programmen, die Internationalisierung unterstützen, wird bestimmt durch die Umgebungsvariable "`$LANG`". Die Unterstützung von Locale-abhängigen Funktionalitäten erfordert die Installation von `locales`-Paketen oder dem Paket `locales-all`. Die `locales`-Pakete müssen korrekt eingerichtet sein.

Wenn weder irgendwelche `locales`-Pakete noch `locales-all` installiert sind, gibt es keine Locale-spezifischen Funktionalitäten und das System nutzt Meldungen in amerikanischem Englisch; Daten werden als ASCII behandelt. Dieses Verhalten ist dasselbe, wie wenn "`$LANG`" auf "`LANG=`", "`LANG=C`" oder "`LANG=POSIX`" gesetzt ist.

Moderne Software wie GNOME oder KDE ist für die Unterstützung verschiedener Sprachen ausgerüstet. Sie ist mittels UTF-8 internationalisiert und über übersetzte Texte mittels gettext(1)-Infrastruktur lokalisiert. Übersetzte Texte werden teilweise als separate Lokalisierungspakete bereitgestellt.

Das aktuelle grafische Arbeitsplatzsystem in Debian setzt das Gebietsschema normalerweise in grafischen GUI-Umgebungen auf "`LANG=xx_YY.UTF-8`". Hierbei entspricht "`xx`" dem Sprachcode gemäß ISO 639 und "`YY`" dem Ländercode gemäß ISO 3166. Diese Werte werden über den Konfigurationsdialog der jeweiligen Arbeitsplatzumgebung gesetzt und haben entsprechenden Einfluß auf die Programme. Näheres dazu finden Sie in Abschnitt 1.5.2, „Die "`$LANG`"-Variable“.

### 8.1.1. Argumentation für UTF-8-Gebietsschemata

Die einfachste Art von Textdaten ist ASCII, was passend ist für Englisch und weniger als 127 Zeichen enthält (welche in 7 Bits dargestellt werden können).

Sogar reiner Text in Englisch kann nicht-ASCII-Zeichen enthalten, so sind z.B. die leicht geschweiften rechten und linken Anführungszeichen in ASCII nicht enthalten:

    “double quoted text” is not "double quoted ASCII"
    ‘single quoted text’ is not 'single quoted ASCII'

Um mehr Zeichen zu unterstützen, wurden weitere Zeichensätze und Zeichenkodierungen entwickelt, um eine Vielzahl von Sprachen unterstützen zu können (siehe Tabelle 11.2, „Liste von Werten für die Zeichenkodierung und deren Verwendung“).

Der Unicode-Zeichensatz kann nahezu alle dem Menschen bekannten Zeichen mit Codepunkten aus einem Bereich von 21 Bits (dies entspricht 0 bis 10FFFF in hexadezimaler Darstellung) abbilden.

Das Zeichenkodierungssystem UTF-8 passt Unicode-Codepunkte in einen 8 Bit breiten Datenstrom ein, der überwiegend zum ASCII-Datenverarbeitungssystem kompatibel ist. Das macht UTF-8 zur modernen und bevorzugten Zeichenkodierung. UTF steht dabei für Unicode Transformation Format. Wenn reiner ASCII-Text in UTF-8 konvertiert wird, hat er exakt den gleichen Inhalt und die gleiche Größe wie der originale ASCII-Text. Sie verlieren also nichts, wenn Sie ein UTF-8-Gebietsschema nutzen.

Mit einem UTF-8-Gebietsschema und einer dazu kompatiblen Anwendung können Sie Textdaten in jeglicher fremden Sprache anzeigen und editieren, solange die entsprechenden Schriftarten und Eingabemethoden installiert und aktiviert sind. Wenn beispielsweise das Gebietsschema auf "`LANG=fr_FR.UTF-8`" gesetzt ist, kann mit gedit(1) (dem Texteditor der GNOME Arbeitsplatzumgebung) chinesischer Text dargestellt und bearbeitet werden, während das Menü in Französisch angezeigt wird.

| Tipp

Sowohl das neue (standardmäßige) "`en_US.UTF-8`" wie auch das alte "`C`"/"`POSIX`"-Gebietsschema nutzen US-Englisch für Meldungen, es gibt nur minimale Unterschiede bei der Sortierreihenfolge etc. Wenn Sie nicht nur ASCII-Zeichen anzeigen möchten, sondern auch UTF-8-kodierte Zeichen, und trotzdem das alte Verhalten der "`C`"-Locale bevorzugen, verwenden Sie das Gebietsschema "`C.UTF-8`" (kein Standard).

| Anmerkung
Einige Programme verbrauchen mehr Speicher, wenn sie I18N unterstützen. Das kommt daher, weil sie für die Unicode-Unterstützung intern UTF-32(UCS4) verwenden (zwecks Geschwindigkeitsoptimierung; dabei werden 4 Bytes für jedes ASCII-Zeichen genutzt, unabhängig vom gewählten Gebietsschema). Nochmals: Sie verlieren nichts, wenn Sie ein UTF-8-Gebietsschema einsetzen.

### 8.1.2. Die Neukonfiguration des Gebietsschemas (Locale)

Damit das System ein bestimmtes Gebietsschema verwenden kann, müssen die entsprechenden Locale-Daten aus der Datenbank kompiliert werden.

Das `locales`-Paket enthält all die verfügbaren Locale-Daten nicht bereits vorkompiliert. Sie müssen Sie also konfigurieren mittels:

    # dpkg-reconfigure locales

Dieser Prozess besteht aus zwei Schritten:

1. Auswahl der benötigten Locale-Daten, die in die binäre Form kompiliert werden sollen. (Stellen Sie bitte sicher, dass Sie mindestens ein UTF-8-Gebietsschema auswählen.)

2. Setzen des Werts für das systemweite Standard-Gebietsschema (mittels "`/etc/default/locale`"); dies wird von PAM genutzt (Näheres in Abschnitt 4.5, „PAM und NSS“).

Der Wert für das systemweite Standard-Gebietsschema (in "`/etc/default/locale`") kann von der Konfiguration für grafische GUI-Anwendungen überschrieben werden.

| Anmerkung
Das effektiv genutzte Kodierungssystem kann über "`/usr/share/i18n/SUPPORTED`" identifiziert werden. So ist "`LANG=en_US`" letztlich "`LANG=en_US.ISO-8859-1`".

Das Paket `locales-all` enthält alle Locale-Daten in vorkompilierter Form. Da es aber nicht "`/etc/default/locale`" erzeugt, müssen Sie eventuell trotzdem auch noch das `locales`-Paket installieren.

| Tipp
Das `locales`-Paket einiger Debian-Derivate enthält vorkompilierte Locale-Daten für alle Locales. Auf einem Debian-System müssen Sie sowohl das `locales`- wie auch das `locales-all`-Paket installieren, um solch eine Systemumgebung zu emulieren.

### 8.1.3. Dateinamenkodierung

Für den Datenaustausch über verschiedene Plattformen hinweg (Näheres in Abschnitt 10.1.7, „Wechseldatenträger“) müssen Sie unter Umständen beim Einbinden einiger Dateisysteme bestimmte Kodierungen vorwählen. Zum Beispiel wird beim Einbinden eines vfat-Dateisystems durch mount(8) die CP437-Kodierung genutzt, wenn nichts anderes angegeben ist. Sie müssen eine explizite mount-Option angeben, wenn UTF-8 oder CP932 als Kodierung für die Dateinamen genutzt werden soll.

| Anmerkung
When auto-mounting a hot-pluggable USB flash drive under modern desktop environment such as GNOME, you may provide such mount option by right clicking the icon on the desktop, click "Drive" tab, click to expand "Setting", and entering "utf8" to "Mount options:". The next time this USB flash drive is mounted, mount with UTF-8 is enabled.

| Anmerkung
Beim Hochrüsten eines Systems oder wenn Sie Laufwerke von älteren nicht-UTF-8-Systemen verwenden, könnten Dateinamen mit nicht-ASCII-Zeichen in historischen und überholten Kodierungen wie ISO-8859-1 oder eucJP kodiert sein. Bitte suchen Sie die Hilfe von Textkonvertierungswerkzeugen, um diese in UTF-8 zu konvertieren. Details hierzu finden Sie in Abschnitt 11.1, „Werkzeuge für Textkonvertierung“.

Samba verwendet für neuere Clients (Windows NT, 200x, XP und später) standardmäßig Unicode, aber bei älteren für DOS und Windows 9x/Me wird per Voreinstellung CP850 eingesetzt. Dieser Standard für ältere Clients kann mittels "`dos charset`" in der Datei "`/etc/samba/smb.conf`" geändert werden, CP932 zum Beispiel für Japanisch.

### 8.1.4. Lokalisierte Meldungen und übersetzte Dokumentation

Für viele Textmeldungen und Dokumente, die im Debian-System angezeigt werden, wie z.B. Fehlermeldungen, Standard-Programmausgaben, Menüs und Handbuchseiten, existieren Übersetzungen. Für die meisten Übersetzungsaktivitäten werden die GNU-gettext(1)-Werkzeuge als Backend-Programme im Hintergrund verwendet.

aptitude(8) bietet unter "Tasks" → "Lokalisierung" eine ausführliche Liste nützlicher Binärpakete, die lokalisierte Meldungen für Anwendungen und übersetzte Dokumentation enthalten.

So können Sie übersetzte Handbuchseiten (manpages) in Deutsch erhalten, indem Sie das `manpages-de`-Paket installieren. Um andererseits die italienische Handbuchseite für programmname aus "`/usr/share/man/it/`" zu lesen, führen Sie folgendes aus:

    LANG=it_IT.UTF-8 man programname

GNU gettext kann über die Umgebungsvariable `$LANGUAGE` eine priorisierte Liste von Übersetzungssprachen erstellen. Nutzen Sie dafür zum Beispiel:

     $ export LANGUAGE="pt:pt_BR:es:it:fr"

Bezüglich weiterer Infos lesen Sie `info gettext` und dort speziell den Abschnitt "The LANGUAGE variable".

### 8.1.5. Auswirkungen des Gebietsschemas

Die Sortierreihenfolge der Zeichen bei Befehlen wie sort(1) und ls(1) ist abhängig von der Locale. Das Exportieren der Variablen `LANG=en_US.UTF-8` führt zur Reihenfolge wie in einem Lexikon (`A->a->B->b...->Z->z`), während `LANG=C.UTF-8` eine Reihenfolge in ASCII-Binärform bewirkt (`A->B->...->Z->a->b...`).

Das Gebietsschema wirkt sich auch auf das Datumsformat von ls(1) aus (Näheres in Abschnitt 9.3.4, „Angepasste Anzeige von Datum und Uhrzeit“).

Das Datumsformat von date(1) ist abhängig von der Locale. Zum Beispiel:

     $ unset LC_ALL
     $ LANG=en_US.UTF-8 date
    Thu Dec 24 08:30:00 PM JST 2023
     $ LANG=en_GB.UTF-8 date
    Thu 24 Dec 20:30:10 JST 2023
     $ LANG=es_ES.UTF-8 date
    jue 24 dic 2023 20:30:20 JST
     $ LC_TIME=en_DK.UTF-8 date
    2023-12-24T20:30:30 JST

Die Zahlen-Interpunktion unterscheidet sich ebenfalls abhängig vom Gebietsschema. Zum Beispiel wird ein-tausend-komma-eins im englischen Gebietsschema "`1,000.1`" geschrieben, im deutschen hingegen "`1.000,1`". Sie können den Unterschied in einem Tabellenkalkulationsprogramm sehen.

Jegliches Detail der "`$LANG`"-Umgebungsvariable kann über das Setzen einer der "`$LC_*`"-Variablen überschrieben werden. Diese wiederum können über die "`$LC_ALL`"-Variable überschrieben werden. Details hierzu finden Sie in der locale(7)-Handbuchseite. Bitte versuchen Sie, dies alles zu vermeiden und nutzen Sie nur die Variable "`$LANG`", um eine der UTF-8-Locales zu setzen (außer Sie haben gute Gründe für die Erstellung einer komplizierten Konfiguration).

## 8.2. Die Tastatureingabe

The keyboard system can be configured at different layers of the system.

- Linux kernel: keyboard(5)

- X server: setxkbmap(1), xkeyboard-config(5), environment variable `XMODIFIERS`

- GUI desktop environment: Input Method framework: `ibus`, `fcitx5`

- Application: environment variables to set its input source: `GTK_IM_MODULE`, `QT_IM_MODULE`, `QT_IM_MODULES`, ...

Input method framework (IM) consists of:

- Input method engine (IME): Actual input method

- Configuration: Handles the configuration for IBus and other services such as IME plugins

- Panel: User interface such as language bar and candidate selection table

Multilingual input to the application is processed roughly as:

    Keyboard        UI panel    Configuration          Application
    |                  ^ |           |                        ^  ^
    v                  | v           v                        |  |
    Linux kernel -> Input method engine (IME) -+-> Gtk, Qt ---+  |
                       | ^                     |                 |
                       | |                     +-> X11, Wayland -+
                       v |
                    IME plugin (ibus-mozc, ...)

### 8.2.1. Tastatureingabe für die Linux-Konsole und X-Window

The Debian system can be configured to work with many international keyboard arrangements using the `keyboard-configuration` package.

    # dpkg-reconfigure keyboard-configuration

For the Linux console and the X Window system, this updates configuration parameters in "`/etc/default/keyboard`". Many non-ASCII characters including accented characters used by many European languages can be made available with dead key, AltGr key, and compose key.

| Anmerkung
Wenn ibus aktiv ist, könnte Ihre klassische X-Tastatur-Konfiguration (durchgeführt über `setxkbmap`) von `ibus` überschrieben werden, selbst wenn die klassische X-Arbeitsplatzumgebung läuft. Sie können `ibus` über `im-config` deaktivieren, indem Sie die Eingabemethode auf "Keine" einstellen. Weitere Informationen hierzu finden Sie im Debian-Wiki unter Keyboard.

### 8.2.2. Tastatureingabe für Wayland

Unlike the X Window protocol, the Wayland core protocol doesn't even support the input of accented characters. Popular Wayland Compositors, such as Mutter for GNOME or KWin for KDE, implement extension protocols such as the `text-input-unstable-v3` for the text input (see "current Wayland protocols and their support status").

The `text-input-unstable-v3` protocol works well with Input methods for Wayland (see "Wayland input method project post-mortem").

- Most GUI applications are built with GUI libraries such as GTK or Qt which support this `text-input-unstable-v3`.

- Popular Input Method Engines (IME), such as IBus or Fcitx (version 5), can work with this `text-input-unstable-v3`.

- IMEs support text input for many languages with plugins.

- Recent IMEs integrate "X Keyboard Extension (XKB)" functionalities such as `setxkbmap` previously provided by the X Window to support accented character text input for European languages for Wayland.

### 8.2.3. Unterstützung für die Eingabemethode mit IBus

For GNOME, "`ibus`" is the default IME which is automatically installed via its package dependency.

- Most multilingualized keyboard input features can be configured from "GNOME Settings" or "GNOME Tweaks".

- Some multilingualized keyboard input features may need to be configured from the ibus-setup(1) command.

- The emoji keyboard input is available by typing "`SUPER-.`" (Simultaneously type Windows and period keys) followed by a keyword for each emoji and SPACE-keys.

The list of IBus and its plugin packages are the following.

Tabelle 8.1. List of IBus and its plugin packages

Paket | Popcon | Größe | unterstütztes Gebietsschema
--- | --- | --- | ---
ibus | V:213, I:252 | 1828 | Eingabemethoden-Rahmenwerk, das dbus verwendet
ibus-mozc | V:2.1, I:3.8 | 978 | Japanisch
ibus-anthy | V:0.5, I:1.2 | 8958 | Japanisch
ibus-skk | V:0.04, I:0.14 | 242 | Japanisch
ibus-kkc | V:0.03, I:0.18 | 211 | Japanisch
ibus-libpinyin | V:1.2, I:5.1 | 2767 | Chinesisch (für zh_CN)
ibus-chewing | V:0.19, I:0.90 | 288 | Chinese (for zh_TW)
ibus-libzhuyin | V:0.00, I:0.11 | 41009 | Chinese (for zh_TW)
ibus-rime | V:0.26, I:0.49 | 78 | Chinese (for zh_CN/zh_TW)
ibus-cangjie | V:0.02, I:0.12 | 235 | Chinese (for zh_HK)
ibus-hangul | V:0.3, I:2.0 | 264 | Koreanisch
ibus-libthai | V:0.00, I:0.05 | 84 | Thailändisch
ibus-table-thai | I:0.05 | 59 | Thailändisch
ibus-unikey | V:0.20, I:0.43 | 286 | Vietnamesisch
keyman | I:0.10 | 507 | Multilingual: Keyman plugin for over 2000 languages
ibus-table | V:0.08, I:1.00 | 2271 | table plugin for IBus
ibus-m17n | V:0.3, I:2.0 | 373 | Multilingual: Indisch, Arabisch und andere

### 8.2.4. The input method support with Fcitx

The Fcitx (version 5) input method framework is popular with Chinese users and compatible with "`ibus`".

The list of "`fcitx5`" and its plugin packages are the following.

Tabelle 8.2. List of Fcitx5 and its plugin packages

Paket | Popcon | Größe | unterstütztes Gebietsschema
--- | --- | --- | ---
fcitx5 | V:7, I:12 | 761 | input method framework compatible with "`ibus`"
fcitx5-mozc | V:1.0, I:1.6 | 1260 | Japanisch
fcitx5-anthy | V:0.06, I:0.20 | 808 | Japanisch
fcitx5-skk | V:0.05, I:0.14 | 369 | Japanisch
fcitx5-kkc | V:0.00, I:0.06 | 416 | Japanisch
fcitx5-chinese-addons | I:9.0 | 17 | Chinese (metapackage for zh_*)
fcitx5-pinyin | V:3.8, I:9.4 | 1044 | Chinesisch (für zh_CN)
fcitx5-chewing | V:0.2, I:1.0 | 217 | Chinese (for zh_TW)
fcitx5-zhuyin | I:0.06 | 41051 | Chinese (for zh_TW)
fcitx5-rime | V:0.44, I:0.84 | 371 | Chinese (for zh_CN/zh_TW)
fcitx5-table-cangjie-large | I:0.12 | 1292 | Chinese (for zh_HK)
fcitx5-hangul | V:0.09, I:0.23 | 235 | Koreanisch
fcitx5-libthai | I:0.05 | 119 | Thailändisch
fcitx5-table-thai | I:0.08 | 34 | Thailändisch
fcitx5-unikey | V:0.08, I:0.20 | 588 | Vietnamesisch
fcitx5-m17n | V:0.12, I:0.51 | 259 | Multilingual: Indisch, Arabisch und andere
fcitx5-table | V:0.4, I:9.2 | 520 | table plugin for fcitx5
fcitx5-keyman | V:0.03, I:0.04 | 235 | Multilingual: Keyman plugin for over 2000 languages

### 8.2.5. Ein Beispiel für Japanisch

I find the Japanese input method started under English environment ("`en_US.UTF-8`") very useful. Here is how I did this with IBus:

1. Install the Japanese input tool package `ibus-mozc` (or `ibus-anthy`).

2. - Generic: Execute ibus-setup(1) → select "Input Method" → click "`Add`" → "Japanese" → "Mozc (or Anthy)" → click "Add"

   - GNOME: Select "Settings" → "Keyboard" → "Input Sources" → click "`+`" in "Input Sources" → "Japanese" → "Mozc (or Anthy)" → click "Add"

3. Sie können weitere Eingabequellen wählen.

4. Melden Sie sich am Benutzerkonto neu an.

5. Richten Sie jede Eingabequelle durch einen Rechtsklick auf das Icon in der GUI-Werkzeugleiste ein.

6. Wählen Sie zwischen den installierten Eingabequellen mittels SUPERTASTE+LEERTASTE (die SUPERTASTE ist normalerweise die Windows-Taste).

| Tipp

Wenn Sie mit Ihrer japanischen Tastatur Zugriff auf eine Tastaturumgebung mit alphabetischen Zeichen wünschen, bei der Umschalt-`2` das doppelte Anführungszeichen (`"`) ausgibt, sollten Sie in der obigen Prozedur "Japanisch" auswählen. Auch können Sie Japanisch über "Japanisch mozc (oder anthy)" mit einer physikalischen "US"-Tastatur eingeben, dabei wird dann über Umschalt-`2` das `@`-Zeichen ausgegeben.

- For Wayland:

  - The `im-config` package does nothing and can be removed safely.

  - You probably don't need to set environment variables except for the backward compatibility etc.

  - If you need to set environment variables, create a file such as "`~/.config/environment.d/50-input-method.conf` "to set them.

- For X Window:

  - Install the `im-config` package.

  - Der Eintrag für im-config(8) im GUI-Menü ist "Eingabemethode"; starten Sie es jetzt.

  - Alternativ führen Sie jetzt "`im-config`" über eine Benutzer-Shell aus.

  - im-config(8) verhält sich unterschiedlich abhängig davon, ob es von root ausgeführt wurde oder nicht.

  - im-config(8) aktiviert standardmäßig ohne weiteres Zutun des Benutzers die beste Eingabemethode auf dem System.

## 8.3. Die Bildschirmausgabe

Die Linux-Konsole kann nur einen beschränkten Bereich von Zeichen anzeigen. (Sie benötigen ein spezielles Terminal-Programm wie jfbterm(1), um nicht-europäische Sprachen in der Konsole außerhalb der grafischen Umgebung anzuzeigen.)

Die grafische Umgebung (Kapitel 7, GUI-System) kann jegliche Zeichen in UTF-8 anzeigen, sofern die benötigten Schriften installiert und aktiviert sind. (Die Kodierung der Original-Schriftdaten wird für den Benutzer transparent erledigt.)

### 8.3.1. Die Terminal-Konfiguration

The Debian system can be configured to work with many international console arrangements using the `console-setup` package.

    # dpkg-reconfigure console-setup

For the Linux console and the X Window system, this updates configuration parameters in "`/etc/default/console-setup`" to display many non-ASCII characters including accented characters used by many European languages can be made available.

Es existieren mehrere Komponenten zur Konfiguration von Systemfunktionalitäten für textbasierte Konsolen und ncurses(3):

- die Datei "`/etc/terminfo/*/*`" (terminfo(5));

- die Umgebungsvariable "`$TERM`" (term(7));

- setterm(1), stty(1), tic(1) und toe(1).

Falls bei Anmeldung von fern auf einem Debian-System mit einem Debian-fremden `xterm`der `terminfo`-Eintrag für `xterm` nicht funktioniert, ändern Sie den Terminaltyp ("`$TERM`") von "`xterm`" auf eine der funktionseingeschränkten Versionen wie "`xterm-r6`". Näheres dazu finden Sie in "`/usr/share/doc/libncurses5/FAQ`". "`dumb`" ist der kleinste gemeinsame Nenner für "`$TERM`".

### 8.3.2. Unbekannte Zeichenbreite bei ostasiatischen Zeichen

Under the East Asian locale, the box drawing, Greek, and Cyrillic characters may be displayed wider than your desired width to cause the unaligned terminal output (see Unicode Standard Annex #11, 4.2 Ambiguous Characters).

Sie können dies Problem jedoch umgehen:

- `gnome-terminal`: Einstellungen → Profile → Profilname → Kompatibilität → Zeichen mit unbekannter Breite → Schmal

- `ncurses`: Setzen einer Umgebungsvariablen mit `export NCURSES_NO_UTF8_ACS=0`.

Kapitel 7. GUI-System |  | Kapitel 9. Systemtipps