Unterschied zwischen Gebietsschema-Archiv- und Maschinenobjektdateien im Verzeichnis / usr / share / locale / <Lokalverzeichnis> / LC_MESSAGES /?

8

Soweit ich weiß, locale-gengeneriert das Dienstprogramm eine /usr/lib/locale/locale-archiveDatenbank basierend auf Einträgen in /etc/locale.genDatei- und Gebietsschemavorlagen- / Konfigurationsdateien in /usr/share/i18n/locales/. Darüber hinaus speichern Dienstprogramme ihre Übersetzungsdateien im Maschinenobjektformat im /usr/share/locale/<locale_dir>/LC_MESSAGES/Verzeichnis. Zum Beispiel:

# dpkg -L wget | grep nl
/usr/share/locale/nl
/usr/share/locale/nl/LC_MESSAGES
/usr/share/locale/nl/LC_MESSAGES/wget.mo
#

Wenn ich zum Beispiel ausführe strace -e open wget, kann ich sehen, dass sowohl /usr/lib/locale/locale-archiveals auch /usr/share/locale/nl/LC_MESSAGES/wget.moDateien geöffnet sind.

Welche Lokalisierungsdaten werden in Dateien im /usr/share/locale/<locale_dir>/LC_MESSAGES/Verzeichnis gespeichert und in welchen Lokalisierungsdaten /usr/lib/locale/locale-archive?

Martin
quelle

Antworten:

3

Obwohl ich im Voraus fast nichts über die Implementierung der Lokalisierung unter Linux wusste, versuchte ich mein Bestes, um mich damit vertraut zu machen.

Kurze Beschreibung

/ usr / lib / locale / locale-archive

locale-archiveist eine Speicherzuordnungsdatei, die durch locale-gen(8)Aufrufen generiert wird localedef(1). Speicherzuordnung bedeutet, dass sie nach dem Erstellen und Aufrufen durch ein Programm nur einmal in den Speicher geladen wird.
Da alle in definierten /etc/locale.genSprachsätze vordefiniert sind und das Archiv selbst sehr statisch ist, muss es nicht mehrmals im Speicher gespeichert werden. Jedes Mal, wenn es von einem anderen Programm aufgerufen wird, wird der Prozess auf das bereits im Speicher geladene Archiv verwiesen, sodass nur der virtuelle Speicher des Programms addiert wird. Auf diese Weise wird nicht nur der physische Speicherbedarf des Prozesses verringert, sondern auch jedes System zur Lokalisierung beschleunigt. (Keine zusätzlichen Festplatten-E / A erforderlich!)

Außerdem scheint es als eine Art Failback-Gebietsschemadatei zu funktionieren, die alle systemweiten Sprachen enthält. Darüber hinaus wird das Archiv häufig von mit glibc geschriebener Software verwendet.


/usr/share/locale/$LOCALE_DIR/LC_MESSAGES/$PROGRAM.mo

Die Internationalisierung ( i18n, 18 chars between 'i' and 'n') von Software unter Linux kann mithilfe von GNU-gettext erreicht werden.

  1. Wenn ein Programm geschrieben wird, wird jede Druckanweisung angepasst, um die GNU- gettext()Funktion zu verwenden, die die Zeichenfolge umschließt, die gedruckt werden muss.
  2. Anschließend wird xgettext(1)die Quelle durchlaufen und .pot (Portable Object Template Files)auf ihrem Weg erstellt.
  3. Der menschliche Übersetzer kann es dann verwenden msginit(1), um es in .po (Portable Object)Dateien zu analysieren , die im Allgemeinen einen Nachrichtenkatalog darstellen. Dann werden alle Zeichenfolgen von Hand übersetzt.
  4. Danach msgfmt(1)wird die bearbeitete .poDatei in Binärdateien kompiliert .mo (Message Object). Diese können zusammen mit dem Softwarepaket geliefert werden.

Wird bei der Installation eines Pakets auf einem System /usr/share/locale/<locale_dir>/LC_MESSAGES/mit $PROGRAM.moDateien gefüllt. Wenn Sie beispielsweise wget aufrufen, zeigt Ihre LANGenv-Variable wgetauf die Verwendung Ihrer aktuellen Gebietsschemaeinstellung, was dazu führt, dass wgetdie richtigen vorkompilierten Übersetzungen über Zeiger in den Lesevorgang aufgenommen werden .mo binary.

Zusätzliche Details und Quellen

Für das Gebietsschema-Archiv:

Speicherzuordnung: CentOS-Mailing-Listen-
Methoden I18N-Unterverpackung: Fedora-Dokumentation zu verschiedenen Gebietsschema-Archiv-Kompilierungen

Berücksichtigen Sie auch Manpages für locale(1), localedef(1)und locale-gen(8).

Für .moDateien:

Prozess der Erstellung von .moDateien: Wikipedia auf Gettext
GNU MO Dateiformat: Erklärung und Binärformat

Berücksichtigen Sie auch Manpages für xgettext(1), msginit(1)und msgfmt(1).

Schauen Sie sich auch die ENV-Variablen LC_MESSAGEund an LOCPATH.


Ich bin sicher, das hat nur die Oberfläche dieses riesigen Themas zerkratzt. Trotzdem hoffe ich, dass dies ausreicht, um Ihnen den Einstieg zu erleichtern.

pidi
quelle