In der Informatik ist gettext ein Internationalisierungs- und Lokalisierungssystem (i18n und l10n), das häufig zum Schreiben mehrsprachiger Programme auf Unix -ähnlichen Betriebssystemen verwendet wird . Einer der Hauptvorteile von gettext ist die Trennung von Programmierung und Übersetzung. [ 4 ] Die am häufigsten verwendete Implementierung von gettext ist GNU gettext [ 5 ] , das 1995 vom GNU-Projekt veröffentlicht wurde . Die Laufzeitbibliothek ist libintl . gettext bietet die Möglichkeit, für beliebig viele Pluralformen von Substantiven unterschiedliche Zeichenketten zu verwenden, unterstützt jedoch kein grammatikalisches Geschlecht . Die wichtigsten Dateinamenerweiterungen dieses Systems sind .POT (Portable Object Template), .PO (Portable Object) und .MO (Machine Object). [ 6 ]

Geschichte

Ursprünglich bot POSIX keine Möglichkeit zur Lokalisierung von Nachrichten. Ende der 1980er-Jahre wurden zwei Vorschläge unterbreitet: gettext von Uniforum (1988) und catgets von X/Open (1989, XPG-3 § 5). Sun Microsystems implementierte gettext erstmals 1993. [ 1 ] Die Unix- und POSIX-Entwickler konnten sich nie auf eine bestimmte Schnittstelle einigen (die Alternative waren die catgets von X/Open), weshalb viele C-Bibliotheken , darunter glibc , beide implementierten. [ 7 ] Im August 2019 wurde in der Austin Group noch immer diskutiert , ob gettext Teil von POSIX werden sollte, obwohl sein einstiger Konkurrent bereits außer Gebrauch war. Zu den geäußerten Bedenken zählten die Abhängigkeit von der Systemlokalisierung (einer globalen Variable, die Probleme mit Multithreading verursachen kann) und die Unterstützung neuerer C-Spracherweiterungen mit breiten Zeichenketten. [ 8 ]

Das GNU-Projekt entschied, dass der Ansatz von gettext, Nachrichten als Schlüssel zu verwenden, einfacher und benutzerfreundlicher ist. (Die meisten anderen Systeme, einschließlich catgets, erfordern, dass der Entwickler für jede Zeichenkette einen „Schlüssel“-Namen vergibt.) [ 9 ] Sie veröffentlichten 1995 GNU gettext, eine freie Software- Implementierung des Systems. [ 2 ] Gettext, ob GNU oder nicht, wurde seitdem in viele Programmiersprachen portiert. [ 10 ] Die Einfachheit von po und die breite Unterstützung durch Editoren führten sogar dazu, dass es auch außerhalb von Programmen für Textdokumente oder als Zwischenlösung zwischen anderen Lokalisierungsformaten eingesetzt wurde. Konverter wie po4a (po für alles) und das Translate Toolkit entstanden, um eine solche Brücke zu schlagen. [ 11 ] [ 12 ]

Betrieb

Programmierung

Typischer gettext-Workflow. Die de.po-Instanz links zeigt eine Aktualisierung der Übersetzungen mittels msgmerge.

Die grundlegende Schnittstelle von gettext ist die gettext(const char*)Funktion, die eine Zeichenkette akzeptiert , die der Benutzer in der Originalsprache, üblicherweise Englisch, sieht. Um Tippzeit zu sparen und den Code übersichtlicher zu gestalten, wird diese Funktion häufig als Alias ​​bezeichnet_ : [ 13 ]

printf ( gettext ( "Mein Name ist %s. \n " ), my_name ); printf ( _ ( "Mein Name ist %s. \n " ), my_name ); // dasselbe, aber kürzer

gettext() then uses the supplied strings as keys for looking up translations, and will return the original string when no translation is available. This is in contrast to POSIXcatgets(),[14]AmigaOSGetString(),[15] or Microsoft WindowsLoadString() where a programmatic ID (often an integer) is used. To handle the case where the same original-language text can have different meanings, gettext has functions like cgettext() that accept an additional "context" string.

xgettext is run on the sources to produce a .pot (Portable Object Template) file, which contains a list of all the translatable strings extracted from the sources. Comments starting with /// are used to give translators hints, although other prefixes are also configurable to further limit the scope. One such common prefix is TRANSLATORS:.

For example, an input file with a comment might look like:

/// TRANSLATORS: %s contains the user's name as specified in Preferencesprintf(_("My name is %s.\n"),my_name);

xgettext is run using the command:

xgettext -c / 

The resultant .pot file looks like this with the comment (note that xgettext recognizes the string as a C-language printf format string):

#. TRANSLATORS: %s contains the user's name as specified in Preferences#, c-format#: src/name.c:36msgid"My name is %s.\n"msgstr""

In POSIX shell script, gettext provides a gettext.sh library one can include that provides the many same functions gettext provides in similar languages.[16]GNU bash also has a simplified construct $"msgid" for the simple gettext function, although it depends on the C library to provide a gettext() function.[17]

Translating

The translator derives a .po (Portable Object) file from the template using the msginit program, then fills out the translations.[18]msginit initializes the translations so, for instance, for a French language translation, the command to run would be:[6]

msginit --locale=fr --input=name.pot 

This will create fr.po. The translator then edits the resultant file, either by hand or with a translation tool like Poedit, or Emacs with its editing mode for .po files. An edited entry will look like:

#: src/name.c:36msgid"My name is %s.\n"msgstr"Je m'appelle %s.\n"

msgfmtSchließlich werden die .po-Dateien in Binärdateien (Machine Objects) kompiliert .mo. GNU gettext verwendet möglicherweise eine eigene Dateinamenerweiterung .gmoauf Systemen mit einer anderen gettext-Implementierung. [ 19 ] Diese Dateien können nun mit dem Softwarepaket verteilt werden.

GNU msgfmtkann auch einige Prüfungen durchführen, die für die von der Programmiersprache verwendete Formatzeichenkette relevant sind . Es ermöglicht auch die Ausgabe in sprachspezifische Formate außer MO; [ 20 ] das X/Open- Äquivalent ist gencat.

In späteren Phasen des Entwicklungsablaufs msgmergekann es verwendet werden, um eine alte Übersetzung auf eine neuere Vorlage zu aktualisieren. Es gibt auch ein Tool msgunfmtzum Rückkompilieren .movon Dateien sowie viele weitere Hilfsprogramme für die Stapelverarbeitung.

Läuft

Auf Unix -Systemen setzt der Benutzer die UmgebungsvariableLC_MESSAGES , und das Programm zeigt Zeichenketten in der ausgewählten Sprache an, sofern eine .moentsprechende Datei vorhanden ist.

Benutzer von GNU-Varianten können alternativ auch die Umgebungsvariable verwenden LANGUAGE. Der Hauptunterschied zur Unix-Variable besteht darin, dass sie mehrere, durch einen Doppelpunkt getrennte Sprachen als Fallback unterstützt. [ 21 ]

Pluralform

Die ngettext()Schnittstelle berücksichtigt die Anzahl der Nomen in der Zeichenkette. Wie bei der Konvention von gettext()wird sie N_in der Praxis oft als bezeichnet. Betrachten Sie das folgende Codebeispiel:

// Parameter: englischer Singular, englischer Plural, Anzahl der übersetzten Nachrichten printf ( ngettext ( "%d übersetzte Nachrichten" , "%d übersetzte Nachrichten" , n ), n );

Der Header im ""(leeren String-)Eintrag der PO-Datei speichert Metadaten, darunter die Pluralform der jeweiligen Sprache, die üblicherweise mit einem ternären Operator aus C angegeben wird. Angenommen, wir möchten ins Slowenische übersetzen :

msgid "" msgstr "" "..." " Sprache: sl\n" " Pluralformen: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"

Da es nun vier Pluralformen gibt, sähe die letzte Form wie folgt aus:

#: src/msgfmt.c:876 #, C-Format msgid „%d Translated Message“ msgid_plural „%d Translated Messages“ msgstr[ 0 ] „ %d Prevedenih Sporočil“ msgstr[ 1 ] „%d Prevedenih Sporočil“ msgstr[ 2 ] „%d Prevedeni Sporočili“ msgstr[ 3 ] „%d prevedena sporočila“

Die Regeln für die Pluralbildung von Sprachen werden vom Unicode-Konsortium bereitgestellt . [ 22 ] msginit fügt beim Erstellen einer Datei für eine bestimmte Sprache ebenfalls die entsprechende Regel automatisch hinzu. [ 18 ]

Implementierungen

Zusätzlich zu C verfügt gettext über die folgenden Implementierungen: C# sowohl für ASP.NET [ 23 ] [ 24 ] als auch für WPF , [ 25 ] Perl , [ 26 ] PHP , [ 27 ] Python , [ 28 ] R , [ 29 ] Scala , [ 30 ] und Node.js . [ 31 ]

GNU gettext bietet native Unterstützung für Objective-C, jedoch noch keine für die Programmiersprache Swift . Eine häufig verwendete gettext-Implementierung auf diesen Cocoa-Plattformen ist POLocalizedString. [ 32 ] Das Microsoft Outlook-Team für iOS stellt ebenfalls eine LocalizedStringsKit-Bibliothek mit einer gettext-ähnlichen API bereit. [ 33 ]

Siehe auch

Referenzen

  1. ^ a b „Über gettext“ . gnu.org . Abgerufen am 9. Mai 2024 .
  2. ^ a b „Geschichte von gettext() et al? - comp.unix.solaris“ . Compgroups.net . Archiviert vom Original am 23. März 2012. Abgerufen am 3. April 2016 .
  3. ^ Bruno Haible (29. Januar 2026). „gettext-1.0 veröffentlicht [stabil]“ . Abgerufen am 29. Januar 2026 .
  4. ^ Martindale, Linda (1. November 2002). „Überbrückung der digitalen Kluft in Südafrika | Linux Journal“ . linuxjournal.com . Linux Journal . Abgerufen am 17. September 2019 .{{cite web}}CS1-Wartung: Veralteter Archivierungsdienst ( Link )
  5. ^ Tykhomyrov, Olexiy Ye (1. November 2002). „Einführung in die Internationalisierungsprogrammierung | Linux Journal“ . linuxjournal.com . Linux Journal . Abgerufen am 17. September 2019 .{{cite web}}CS1-Wartung: Veralteter Archivierungsdienst ( Link )
  6. ^ a b „Wie man mit GetText PO- und POT-Dateien übersetzt“ . Icanlocalize.com . Abgerufen am 3. April 2016 .
  7. ^ „Nachrichtenübersetzung“ . Die GNU C-Bibliothek .
  8. ^ "0001122: POSIX sollte gettext() und ähnliche Funktionen einbeziehen - Austin Group Defect Tracker" . Austin Group Defect Tracker .
  9. ^ „Die Sicht des Programmierers“ . gettext 0.10.35 . 30. April 1998.
  10. ^ "GNU gettext-Dienstprogramme: Liste der Programmiersprachen" .
  11. ^ "po4a" . po4a.org .
  12. ^ „Das unverzichtbare Werkzeugset für Lokalisierungsingenieure“ . Translate Toolkit .
  13. ^ „GNU gettext-Dienstprogramme: Wie Markierungen in Quelltexten erscheinen“ . www.gnu.org . Archiviert vom Original am 25. März 2024. Abgerufen am 3. April 2024 .
  14. ^ „Über Katzengets“ . gnu.org . Abgerufen am 24. Oktober 2017 .
  15. ^ „AmigaOS-Handbuch: Python-Module und -Pakete – AmigaOS-Dokumentations-Wiki“ . wiki.amigaos.net . Abgerufen am 9. Juli 2023 .
  16. ^ "GNU gettext-Dienstprogramme: sh" .
  17. ^ "GNU gettext-Dienstprogramme: bash" .
  18. ^ a b „GNU gettext utilities: PO Files“ . Gnu.org . Abgerufen am 3. April 2016 .
  19. ^ „Dateien mit Übersetzungen“ . Gnu.org . Abgerufen am 22. April 2014 .
  20. ^ "msgfmt-Aufruf" . GNU gettext-Dienstprogramme .
  21. ^ „GNU gettext utilities: Locale Environment Variables“ . Gnu.org . Abgerufen am 3. April 2016 .
  22. ^"Language Plural Rules". unicode.org.
  23. ^"Google Code Archive - Long-term storage for Google Code Project Hosting". Code.google.com. Retrieved 3 April 2016.
  24. ^"turquoiseowl/i18n: Smart internationalization for ASP.NET". GitHub.com. Retrieved 3 April 2016.
  25. ^"NGettext.Wpf - Proper internationalization support for WPF (via NGettext)". GitHub. 16 August 2019.
  26. ^"libintl-perl - An Internationalization Library for Perl That Aims To Be Compatible With the Uniforum Message Translations System as Implemented For Example in GNU Gettext". github.com. Retrieved 14 September 2017.
  27. ^"Gettext". php.net. Retrieved 24 October 2017.
  28. ^"gettext – Multilingual internationalization services – Python 3.7.0 documentation". docs.python.org. Retrieved 21 September 2018.
  29. ^"gettext: Translate Text Messages". rdrr.io. Retrieved 13 November 2021.
  30. ^"makkarpov/scalingua: A simple gettext-like internationalization library for Scala". github.com. Retrieved 28 April 2016.
  31. ^"DanielBaulig/node-gettext: An adaption of Joshua I. Miller's Javascript Gettext library for node.js". GitHub.com. Retrieved 3 April 2016.
  32. ^"hulab/POLocalizedString: gettext for iOS/OS X/watchOS/tvOS". GitHub. hulab. 19 September 2019.
  33. ^"microsoft/LocalizedStringKit: Generate .strings files directly from your code". GitHub. Microsoft. 12 February 2020.