So erstellen Sie eine mehrsprachige App: Eine Demo mit PHP und Gettext
Veröffentlicht: 2022-03-11Unabhängig davon, ob Sie eine Website oder eine vollwertige Webanwendung erstellen, um sie einem breiteren Publikum zugänglich zu machen, muss sie häufig in verschiedenen Sprachen und Gebietsschemas verfügbar sein.
Grundlegende Unterschiede zwischen den meisten menschlichen Sprachen machen dies alles andere als einfach. Die Unterschiede in Grammatikregeln, Sprachnuancen, Datumsformaten und mehr machen die Lokalisierung zu einer einzigartigen und gewaltigen Herausforderung.
Betrachten Sie dieses einfache Beispiel.
Die Pluralisierungsregeln im Englischen sind ziemlich einfach: Sie können eine Singularform eines Wortes oder eine Pluralform eines Wortes haben.
In anderen Sprachen hingegen – etwa in den slawischen Sprachen – gibt es neben dem Singular zwei Pluralformen. Möglicherweise finden Sie sogar Sprachen mit insgesamt vier, fünf oder sechs Pluralformen, wie z. B. Slowenisch, Irisch oder Arabisch.
Die Art und Weise, wie Ihr Code organisiert ist und wie Ihre Komponenten und Schnittstellen gestaltet sind, spielt eine wichtige Rolle dabei, wie einfach Sie Ihre Anwendung lokalisieren können.
Die Internationalisierung (i18n) Ihrer Codebasis trägt dazu bei, dass sie relativ einfach an verschiedene Sprachen oder Regionen angepasst werden kann. Die Internationalisierung wird in der Regel einmalig durchgeführt, vorzugsweise zu Beginn des Projekts, um später große Änderungen im Quellcode zu vermeiden.
Sobald Ihre Codebasis internationalisiert wurde, wird die Lokalisierung (l10n) zu einer Frage der Übersetzung des Inhalts Ihrer Anwendung in eine bestimmte Sprache/ein bestimmtes Gebietsschema.
Die Lokalisierung muss jedes Mal durchgeführt werden, wenn eine neue Sprache oder Region unterstützt werden muss. Außerdem wird immer dann, wenn ein Teil der Benutzeroberfläche (der Text enthält) aktualisiert wird, neuer Inhalt verfügbar – der dann in alle unterstützten Länder lokalisiert (dh übersetzt) werden muss.
In diesem Artikel erfahren Sie, wie Sie in PHP geschriebene Software internationalisieren und lokalisieren. Wir werden die verschiedenen Implementierungsoptionen und die verschiedenen Tools durchgehen, die uns zur Verfügung stehen, um den Prozess zu vereinfachen.
Werkzeuge für die Internationalisierung
Der einfachste Weg, PHP-Software zu internationalisieren, ist die Verwendung von Array-Dateien. Arrays werden mit übersetzten Zeichenfolgen gefüllt, die dann in Vorlagen nachgeschlagen werden können:
<h1><?=$TRANS['title_about_page']?></h1>
Dies ist jedoch kaum ein empfehlenswerter Weg für ernsthafte Projekte, da es später definitiv zu Wartungsproblemen führen wird. Einige Probleme können sogar ganz am Anfang auftreten, wie z. B. die fehlende Unterstützung für die variable Interpolation oder die Pluralisierung von Substantiven und so weiter.
Eines der klassischsten Tools (oft als Referenz für i18n und l10n verwendet) ist ein Unix-Tool namens Gettext.
Obwohl es auf das Jahr 1995 zurückgeht, ist es immer noch ein umfassendes Tool zum Übersetzen von Software, das auch einfach zu bedienen ist. Obwohl der Einstieg ziemlich einfach ist, verfügt es dennoch über leistungsstarke unterstützende Tools.
Gettext ist das, was wir in diesem Beitrag verwenden werden. Wir werden eine großartige GUI-Anwendung präsentieren, mit der Sie Ihre l10n-Quelldateien einfach aktualisieren können, wodurch Sie sich nicht mit der Befehlszeile befassen müssen.
Bibliotheken, um die Dinge einfach zu machen
Es gibt wichtige PHP-Web-Frameworks und -Bibliotheken, die Gettext und andere Implementierungen von i18n unterstützen. Einige sind einfacher zu installieren als andere, bieten zusätzliche Funktionen oder unterstützen verschiedene i18n-Dateiformate. Obwohl wir uns in diesem Dokument auf die Werkzeuge konzentrieren, die mit dem PHP-Kern bereitgestellt werden, finden Sie hier eine Liste mit einigen anderen, die es wert sind, erwähnt zu werden:
oscarotero/Gettext: Gettext-Unterstützung mit einer objektorientierten Schnittstelle; enthält verbesserte Hilfsfunktionen, leistungsstarke Extraktoren für mehrere Dateiformate (einige davon werden nicht nativ vom
gettext
-Befehl unterstützt). Kann auch in Formate exportieren, die über .mo/.po-Dateien hinausgehen, was nützlich sein kann, wenn Sie Ihre Übersetzungsdateien in andere Teile des Systems integrieren müssen, z. B. eine JavaScript-Schnittstelle.symfony/translation: Unterstützt viele verschiedene Formate, empfiehlt aber die Verwendung von ausführlichen XLIFFs. Enthält keine Hilfsfunktionen oder einen eingebauten Extraktor, unterstützt aber Platzhalter, die intern
strtr()
verwenden.zend/i18n: Unterstützt Array- und INI-Dateien oder Gettext-Formate. Implementiert eine Caching-Schicht, um zu vermeiden, dass das Dateisystem jedes Mal gelesen werden muss. Beinhaltet auch View-Helfer und gebietsschemaabhängige Eingabefilter und Validatoren. Es hat jedoch keinen Nachrichtenextraktor.
Andere Frameworks enthalten auch i18n-Module, aber diese sind außerhalb ihrer Codebasen nicht verfügbar:
Laravel: Unterstützt grundlegende Array-Dateien; hat keinen automatischen Extraktor, enthält aber einen
@lang
Helfer für Vorlagendateien.Yii: Unterstützt Array-, Gettext- und datenbankbasierte Übersetzung und enthält einen Nachrichtenextraktor. Unterstützt durch die
Intl
Erweiterung, die seit PHP 5.3 verfügbar ist und auf dem ICU-Projekt basiert. Dadurch kann Yii leistungsstarke Ersetzungen ausführen, z. B. das Buchstabieren von Zahlen, das Formatieren von Datumsangaben, Uhrzeiten, Intervallen, Währungen und Ordnungszahlen.
Wenn Sie sich für eine der Bibliotheken entscheiden, die keine Extraktoren bieten, möchten Sie vielleicht die Gettext-Formate verwenden, damit Sie die ursprüngliche Gettext-Toolchain (einschließlich Poedit) verwenden können, wie im Rest des Kapitels beschrieben.
Gettext installieren
Möglicherweise müssen Sie Gettext und die zugehörige PHP-Bibliothek mithilfe Ihres Paketmanagers wie apt-get oder yum installieren. Aktivieren Sie es nach der Installation, indem Sie extension=gettext.so
(Linux/Unix) oder extension=php_gettext.dll
(Windows) zu Ihrer php.ini
-Datei hinzufügen.
Hier werden wir auch Poedit verwenden, um Übersetzungsdateien zu erstellen. Sie finden es wahrscheinlich im Paketmanager Ihres Systems; Es ist für Unix, Mac und Windows verfügbar und kann auch kostenlos von seiner Website heruntergeladen werden.
Arten von Gettext-Dateien
Es gibt drei Dateitypen, mit denen Sie normalerweise zu tun haben, wenn Sie mit Gettext arbeiten.
Die wichtigsten sind PO- (Portable Object) und MO-Dateien (Machine Object), wobei die erste eine Liste lesbarer „übersetzter Objekte“ und die zweite die entsprechende Binärdatei ist (die von Gettext bei der Lokalisierung interpretiert wird). Es gibt auch eine POT-Datei (PO-Vorlage), die einfach alle vorhandenen Schlüssel aus Ihren Quelldateien enthält und als Richtlinie zum Generieren und Aktualisieren aller PO-Dateien verwendet werden kann.
Die Vorlagendateien sind nicht obligatorisch; Abhängig von dem Tool, das Sie für l10n verwenden, kommen Sie nur mit PO/MO-Dateien zurecht. Sie haben ein Paar PO/MO-Dateien pro Sprache und Region, aber nur einen POT pro Domain.
Domänen trennen
In großen Projekten gibt es einige Fälle, in denen Sie möglicherweise Übersetzungen trennen müssen, wenn dieselben Wörter in verschiedenen Kontexten unterschiedliche Bedeutungen haben.
In diesen Fällen müssen Sie sie in verschiedene „Domänen“ aufteilen, bei denen es sich im Grunde um benannte Gruppen von POT/PO/MO-Dateien handelt, wobei der Dateiname die besagte Übersetzungsdomäne ist .
Kleine und mittelgroße Projekte verwenden normalerweise der Einfachheit halber nur eine Domäne; Sein Name ist willkürlich, aber wir werden „main“ für unsere Codebeispiele verwenden.
In Symfony-Projekten werden beispielsweise Domains verwendet, um die Übersetzung für Validierungsnachrichten zu trennen.
Gebietsschemacode
Ein Gebietsschema ist einfach ein Code, der eine Version einer Sprache identifiziert. Es ist gemäß den Spezifikationen von ISO 639-1 und ISO 3166-1 alpha-2 definiert: zwei Kleinbuchstaben für die Sprache, optional gefolgt von einem Unterstrich und zwei Großbuchstaben, die den Länder- oder Regionalcode identifizieren.
Für seltene Sprachen werden drei Buchstaben verwendet.
Für einige Sprecher mag der Länderteil überflüssig erscheinen. Tatsächlich haben einige Sprachen Dialekte in verschiedenen Ländern, wie z. B. österreichisches Deutsch (de_AT) oder brasilianisches Portugiesisch (pt_BR). Der zweite Teil wird verwendet, um zwischen diesen Dialekten zu unterscheiden – wenn er nicht vorhanden ist, wird er als „generische“ oder „hybride“ Version der Sprache angesehen.
Verzeichnisaufbau
Um Gettext zu verwenden, müssen wir uns an eine bestimmte Ordnerstruktur halten.
Zuerst müssen Sie einen beliebigen Stamm für Ihre l10n-Dateien in Ihrem Quell-Repository auswählen. Darin haben Sie einen Ordner für jedes benötigte Gebietsschema und einen festen „LC_MESSAGES“-Ordner, der alle Ihre PO/MO-Paare enthält.
Plural Formen
Wie wir in der Einleitung gesagt haben, können verschiedene Sprachen unterschiedliche Pluralisierungsregeln aufweisen. Gettext erspart uns jedoch diese Mühe.
Wenn Sie eine neue .po-Datei erstellen, müssen Sie die Pluralisierungsregeln für diese Sprache deklarieren, und übersetzte Teile, die Plural berücksichtigen, haben für jede dieser Regeln eine andere Form.
Wenn Sie Gettext im Code aufrufen, müssen Sie eine Zahl angeben, die sich auf den Satz bezieht (z. B. für den Ausdruck „Sie haben n Nachrichten.“ müssen Sie den Wert von n angeben), und es wird die richtige Form ermitteln zu verwenden - bei Bedarf sogar mit String-Substitution.
Mehrere Regeln werden aus der Anzahl der erforderlichen Regeln mit einem booleschen Test für jede Regel zusammengesetzt (der Test für höchstens eine Regel kann weggelassen werden). Zum Beispiel:
Japanisch:
nplurals=1; plural=0;
nplurals=1; plural=0;
- Eine Regel: Es gibt keine PluralformenEnglisch:
nplurals=2; plural=(n != 1);
nplurals=2; plural=(n != 1);
- zwei Regeln: Verwenden Sie die Pluralform nur, wenn n nicht 1 ist, ansonsten verwenden Sie die Singularform.Brasilianisches Portugiesisch:
nplurals=2; plural=(n > 1);
nplurals=2; plural=(n > 1);
- zwei Regeln, Pluralform nur verwenden, wenn n größer als 1 ist, ansonsten Singularform verwenden.
Für eine tiefere Erklärung gibt es ein informatives LingoHub-Tutorial, das online verfügbar ist.
Gettext bestimmt anhand der angegebenen Nummer, welche Regel verwendet werden soll, und verwendet die richtige lokalisierte Version der Zeichenfolge. Für Zeichenfolgen, bei denen eine Pluralisierung gehandhabt werden muss, müssen Sie in die .po-Datei einen anderen Satz für jede definierte Pluralregel aufnehmen.
Beispielimplementierung
Lassen Sie uns nach all dieser Theorie ein wenig praktisch werden. Hier ist ein Auszug aus einer .po-Datei (machen Sie sich noch nicht zu viele Gedanken über die Syntax, sondern machen Sie sich nur ein Bild vom Gesamtinhalt):
msgid "" msgstr "" "Language: pt_BR\n" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "We're now translating some strings" msgstr "Nos estamos traduzindo algumas strings agora" msgid "Hello %1$s! Your last visit was on %2$s" msgstr "Ola %1$s! Sua ultima visita foi em %2$s" msgid "Only one unread message" msgid_plural "%d unread messages" msgstr[0] "So uma mensagem nao lida" msgstr[1] "%d mensagens nao lidas"
Der erste Abschnitt funktioniert wie ein Header, wobei msgid
und msgstr
leer sind.
Es beschreibt die Dateicodierung, Pluralformen und einige andere Dinge. Der zweite Abschnitt übersetzt eine einfache Zeichenfolge aus dem Englischen ins brasilianische Portugiesisch, und der dritte macht dasselbe, nutzt jedoch die Zeichenfolgenersetzung von sprintf
, sodass die Übersetzung den Benutzernamen und das Besuchsdatum enthalten kann.
Der letzte Abschnitt ist ein Beispiel für Pluralisierungsformen, die die Singular- und Pluralversion als msgid
auf Englisch und ihre entsprechenden Übersetzungen als msgstr
0 und 1 (nach der Zahl der Pluralregel) anzeigen.
Dort wird auch die Zeichenfolgenersetzung verwendet, sodass die Nummer direkt im Satz angezeigt wird, indem %d
verwendet wird. Die Pluralformen haben immer zwei msgid
(Singular und Plural), daher wird empfohlen, keine komplexe Sprache als Übersetzungsquelle zu verwenden.
Lokalisierungsschlüssel
Wie Sie vielleicht bemerkt haben, verwenden wir den tatsächlichen englischen Satz als Quell-ID. Diese msgid
wird in allen Ihren .po-Dateien verwendet, was bedeutet, dass andere Sprachen dasselbe Format und dieselben msgid
Felder, aber übersetzte msgstr
Zeilen haben.
Apropos Übersetzungsschlüssel, hier gibt es zwei „philosophische“ Standardansätze:
1. msgstr als echter Satz
Die Hauptvorteile dieses Ansatzes sind:
Wenn Teile der Software in einer bestimmten Sprache nicht übersetzt sind, behält der angezeigte Schlüssel immer noch eine gewisse Bedeutung. Wenn Sie beispielsweise wissen, wie man aus dem Englischen ins Spanische übersetzt, aber Hilfe bei der Übersetzung ins Französische benötigen, könnten Sie die neue Seite mit fehlenden französischen Sätzen veröffentlichen und Teile der Website würden stattdessen auf Englisch angezeigt.
Für den Übersetzer ist es viel einfacher zu verstehen, was vor sich geht, und anhand der
msgid
eine korrekte Übersetzung vorzunehmen.Es gibt Ihnen „kostenloses“ l10n für eine Sprache – die Ausgangssprache.
Andererseits besteht der Hauptnachteil darin, dass Sie, wenn Sie den eigentlichen Text ändern müssen, dieselbe msgid
in mehreren Sprachdateien ersetzen müssen.
2. msgid als eindeutiger, strukturierter Schlüssel
Dies würde die Satzrolle in der Anwendung auf strukturierte Weise beschreiben, einschließlich der Vorlage oder des Teils, in dem sich die Zeichenfolge anstelle ihres Inhalts befindet.
Dies ist eine großartige Möglichkeit, den Code zu organisieren und den Textinhalt von der Vorlagenlogik zu trennen. Dies könnte jedoch Probleme für den Übersetzer darstellen, der den Kontext verfehlen würde.
Als Grundlage für andere Übersetzungen wäre eine Ausgangssprachdatei erforderlich. Zum Beispiel hätte der Entwickler idealerweise eine „en.po“-Datei, die Übersetzer lesen würden, um zu verstehen, was in „fr.po“ zu schreiben ist.

Fehlende Übersetzungen würden bedeutungslose Schlüssel auf dem Bildschirm anzeigen („top_menu.welcome“ statt „Hallo, Benutzer!“ auf der besagten unübersetzten französischen Seite).
Das ist gut, da die Übersetzung vor der Veröffentlichung abgeschlossen werden müsste - aber schlecht, da Übersetzungsprobleme in der Benutzeroberfläche wirklich schrecklich wären. Einige Bibliotheken enthalten jedoch eine Option, um eine bestimmte Sprache als „Fallback“ anzugeben, was ein ähnliches Verhalten wie der andere Ansatz hat.
Das Gettext-Handbuch bevorzugt den ersten Ansatz, da es im Allgemeinen für Übersetzer und Benutzer bei Problemen einfacher ist. Das ist der Ansatz, den wir auch hier verwenden werden.
Es sollte jedoch beachtet werden, dass die Symfony-Dokumentation die schlüsselwortbasierte Übersetzung bevorzugt, um unabhängige Änderungen aller Übersetzungen zu ermöglichen, ohne auch die Vorlagen zu beeinträchtigen.
Alltagsnutzung
In einer gängigen Anwendung würden Sie einige Gettext-Funktionen verwenden, während Sie statischen Text in Ihre Seiten schreiben.
Diese Sätze würden dann in .po-Dateien erscheinen, übersetzt, in .mo-Dateien kompiliert und dann von Gettext beim Rendern der eigentlichen Benutzeroberfläche verwendet werden. Lassen Sie uns angesichts dessen das, was wir bisher besprochen haben, in einem Schritt-für-Schritt-Beispiel zusammenfassen:
1. Eine Mustervorlagendatei, einschließlich einiger verschiedener gettext-Aufrufe
<?php include 'i18n_setup.php' ?> <div> <h1><?=sprintf(gettext('Welcome, %s!'), $name)?></h1> <!-- code indented this way only for legibility → <?php if ($unread): ?> <h2> <?=sprintf( ngettext('Only one unread message', '%d unread messages', $unread), $unread )?> </h2> <?php endif ?> </div> <h1><?=gettext('Introduction')?></h1> <p><?=gettext('We\'re now translating some strings')?></p>
gettext()
übersetzt einfach einemsgid
in die entsprechendemsgstr
für eine gegebene Sprache. Es gibt auch die Kurzfunktion_()
, die auf die gleiche Weise funktioniertngettext()
macht dasselbe, aber mit PluralregelnEs gibt auch
dgettext()
unddngettext()
, mit denen Sie die Domäne für einen einzelnen Aufruf überschreiben können (mehr zur Domänenkonfiguration im nächsten Beispiel).
2. Eine Beispiel-Setup-Datei (i18n_setup.php wie oben verwendet), die das richtige Gebietsschema auswählt und Gettext konfiguriert
Die Verwendung von Gettext beinhaltet ein bisschen einen Boilerplate-Code, aber es geht hauptsächlich darum, das Gebietsschemaverzeichnis zu konfigurieren und geeignete Parameter (ein Gebietsschema und eine Domäne) auszuwählen.
<?php /** * Verifies if the given $locale is supported in the project * @param string $locale * @return bool */ function valid($locale) { return in_array($locale, ['en_US', 'en', 'pt_BR', 'pt', 'es_ES', 'es'); } //setting the source/default locale, for informational purposes $lang = 'en_US'; if (isset($_GET['lang']) && valid($_GET['lang'])) { // the locale can be changed through the query-string $lang = $_GET['lang']; //you should sanitize this! setcookie('lang', $lang); //it's stored in a cookie so it can be reused } elseif (isset($_COOKIE['lang']) && valid($_COOKIE['lang'])) { // if the cookie is present instead, let's just keep it $lang = $_COOKIE['lang']; //you should sanitize this! } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // default: look for the languages the browser says the user accepts $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ['-' => '_']); }); foreach ($langs as $browser_lang) { if (valid($browser_lang)) { $lang = $browser_lang; break; } } } // here we define the global system locale given the found language putenv("LANG=$lang"); // this might be useful for date functions (LC_TIME) or money formatting (LC_MONETARY), for instance setlocale(LC_ALL, $lang); // this will make Gettext look for ../locales/<lang>/LC_MESSAGES/main.mo bindtextdomain('main', '../locales'); // indicates in what encoding the file should be read bind_textdomain_codeset('main', 'UTF-8'); // if your application has additional domains, as cited before, you should bind them here as well bindtextdomain('forum', '../locales'); bind_textdomain_codeset('forum', 'UTF-8'); // here we indicate the default domain the gettext() calls will respond to textdomain('main'); // this would look for the string in forum.mo instead of main.mo // echo dgettext('forum', 'Welcome back!'); ?>
3. Vorbereitung der Übersetzung für den ersten Lauf
Einer der großen Vorteile von Gettext gegenüber benutzerdefinierten Framework-i18n-Paketen ist das umfangreiche und leistungsstarke Dateiformat.
Vielleicht denken Sie: „Oh Mann, das ist ziemlich schwer zu verstehen und von Hand zu bearbeiten, ein einfaches Array wäre einfacher!“ Lassen Sie sich nicht täuschen, Anwendungen wie Poedit sind hier, um zu helfen – sehr. Sie können das Programm von ihrer Website herunterladen, es ist kostenlos und für alle Plattformen verfügbar. Es ist ein ziemlich einfaches Werkzeug, an das man sich gewöhnen muss, und gleichzeitig ein sehr mächtiges - es nutzt alle Funktionen, die Gettext zur Verfügung stellt. Wir arbeiten hier mit der neusten Version, Poedit 1.8.
Beim ersten Durchlauf sollten Sie im Menü „Datei > Neu…“ auswählen. Sie werden nach der Sprache gefragt; Wählen/filtern Sie die Sprache, in die Sie übersetzen möchten, oder verwenden Sie das zuvor erwähnte Format, z. B. en_US
oder pt_BR
.
Speichern Sie nun die Datei - auch unter Verwendung der erwähnten Verzeichnisstruktur. Dann sollten Sie auf „Aus Quellen extrahieren“ klicken und hier verschiedene Einstellungen für die Extraktions- und Übersetzungsaufgaben konfigurieren. All dies finden Sie später über „Katalog > Eigenschaften“:
Quellpfade: Schließen Sie alle Ordner aus dem Projekt ein, in denen
gettext()
(und Geschwister) aufgerufen werden - dies sind normalerweise Ihre Vorlagen-/Ansichtsordner. Dies ist die einzige obligatorische Einstellung.Übersetzungseigenschaften:
- Projektname und -version, Team und E-Mail-Adresse des Teams: Nützliche Informationen, die in den Header der .po-Datei aufgenommen werden.
- Pluralformen: Dies sind die Regeln, die wir zuvor erwähnt haben. Sie können es die meiste Zeit bei der Standardoption belassen, da Poedit bereits eine praktische Datenbank mit Pluralregeln für viele Sprachen enthält.
- Zeichensätze: vorzugsweise UTF-8.
- Zeichensatz des Quellcodes: Der von Ihrer Codebasis verwendete Zeichensatz - wahrscheinlich auch UTF-8, oder?
Quellschlüsselwörter: Die zugrunde liegende Software weiß, wie
gettext()
und ähnliche Funktionsaufrufe in mehreren Programmiersprachen aussehen, aber Sie können genauso gut Ihre eigenen Übersetzungsfunktionen erstellen. Hier fügen Sie diese anderen Methoden hinzu. Dies wird später im Abschnitt „Tipps“ besprochen.
Nachdem Sie diese Eigenschaften festgelegt haben, führt Poedit einen Scan durch Ihre Quelldateien durch, um alle Lokalisierungsaufrufe zu finden. Nach jedem Scan zeigt Poedit eine Zusammenfassung dessen an, was gefunden und was aus den Quelldateien entfernt wurde. Neue Einträge in der Übersetzungstabelle sind leer, sodass Sie die lokalisierten Versionen dieser Zeichenfolgen eingeben können. Speichern Sie es und eine .mo-Datei wird in denselben Ordner (neu) kompiliert und schwupps, Ihr Projekt ist internationalisiert!
Poedit kann auch allgemeine Übersetzungen aus dem Internet und aus früheren Dateien vorschlagen. Es ist praktisch, dass Sie nur prüfen müssen, ob sie sinnvoll sind, und sie akzeptieren. Wenn Sie sich bei einer Übersetzung nicht sicher sind, können Sie sie als Fuzzy markieren und sie wird gelb angezeigt. Blaue Einträge sind diejenigen, die keine Übersetzung haben.
4. Übersetzen von Zeichenfolgen
Wie Sie vielleicht bemerkt haben, gibt es zwei Haupttypen lokalisierter Zeichenfolgen: einfache Zeichenfolgen und solche mit Pluralformen.
Einfache haben nur zwei Felder: Quelle und lokalisierte Zeichenfolge. Die Quellzeichenfolge kann nicht geändert werden, da Gettext/Poedit keine Möglichkeit bieten, Ihre Quelldateien zu ändern; Stattdessen müssen Sie die Quelle selbst ändern und die Dateien erneut scannen. ( Tipp: Wenn Sie mit der rechten Maustaste auf eine Übersetzungszeile klicken, wird ein Hinweis mit den Quelldateien und Zeilen angezeigt, in denen diese Zeichenfolge verwendet wird.)
Mehrere Formularzeichenfolgen enthalten zwei Felder zum Anzeigen der beiden Quellzeichenfolgen und Registerkarten, damit Sie die verschiedenen Endformen konfigurieren können.
Beispiel einer Zeichenfolge mit einer Pluralform auf Poedit, die für jede eine Übersetzungsregisterkarte anzeigt.
Wann immer Sie Ihre Quellcodedateien ändern und die Übersetzungen aktualisieren müssen, klicken Sie einfach auf Aktualisieren und Poedit wird den Code erneut scannen, nicht vorhandene Einträge entfernen, die geänderten zusammenführen und neue hinzufügen.
Poedit kann auch versuchen, einige Übersetzungen zu erraten, basierend auf anderen, die Sie gemacht haben. Diese Vermutungen und die geänderten Einträge erhalten eine „Fuzzy“-Markierung, die darauf hinweist, dass sie überprüft werden müssen, und die in der Liste gelb angezeigt wird.
Es ist auch nützlich, wenn Sie ein Übersetzungsteam haben und jemand versucht, etwas zu schreiben, bei dem er sich nicht sicher ist: Markieren Sie es einfach als Fuzzy und jemand anderes wird es später überprüfen.
Schließlich ist es ratsam, „Ansicht > zuerst unübersetzte Einträge“ markiert zu lassen, damit Sie keine Einträge vergessen. Über dieses Menü können Sie auch Teile der Benutzeroberfläche öffnen, mit denen Sie bei Bedarf Kontextinformationen für Übersetzer hinterlassen können.
Tipps
Webserver können Ihre .mo-Dateien zwischenspeichern.
Wenn Sie PHP als Modul auf Apache (mod_php) ausführen, treten möglicherweise Probleme mit der zwischengespeicherten .mo-Datei auf. Es passiert beim ersten Lesen, und dann müssen Sie möglicherweise den Server neu starten, um es zu aktualisieren.
Bei Nginx und PHP5 sind normalerweise nur ein paar Seitenaktualisierungen erforderlich, um den Übersetzungscache zu aktualisieren, und bei PHP7 ist dies selten erforderlich.
Bibliotheken bieten Hilfsfunktionen, um den Lokalisierungscode kurz zu halten.
Wie von vielen Leuten bevorzugt, ist es einfacher, _()
anstelle von gettext()
zu verwenden. Viele benutzerdefinierte i18n-Bibliotheken von Frameworks verwenden etwas Ähnliches wie t()
, um den übersetzten Code kürzer zu machen. Dies ist jedoch die einzige Funktion, die eine Verknüpfung aufweist.
Vielleicht möchten Sie Ihrem Projekt einige andere hinzufügen, wie z. B. __()
oder _n()
für ngettext()
, oder vielleicht ein schickes _r()
, das Aufrufe von gettext()
und sprintf()
. Andere Bibliotheken, wie Gettext von oscarotero, bieten ebenfalls Hilfsfunktionen wie diese.
In diesen Fällen müssen Sie das Gettext-Dienstprogramm anweisen, wie die Zeichenfolgen aus diesen neuen Funktionen extrahiert werden. Keine Angst, es ist ganz einfach. Es ist nur ein Feld in der .po-Datei oder ein Einstellungsbildschirm in Poedit (im Editor befindet sich diese Option unter „Katalog > Eigenschaften > Quellenstichwörter“).
Denken Sie daran: Gettext kennt bereits die Standardfunktionen für viele Sprachen, machen Sie sich also keine Sorgen, wenn diese Liste leer erscheint. Sie müssen in diese Liste die Spezifikationen der neuen Funktionen aufnehmen, die diesem spezifischen Format folgen:
Wenn Sie etwas wie
t()
erstellen, das einfach die Übersetzung für einen String zurückgibt, können Sie es alst
angeben. Gettext weiß, dass das einzige Funktionsargument der zu übersetzende String ist;Wenn die Funktion mehr als ein Argument hat, können Sie angeben, in welchem die erste Zeichenfolge ist, und bei Bedarf auch die Pluralform. Wenn unsere Funktionssignatur beispielsweise
__('one user', '%d users', $number)
lautet, wäre die Spezifikation__:1,2
, was bedeutet, dass die erste Form das erste Argument und die zweite Form das ist zweites Argument. Wenn Ihre Zahl stattdessen als erstes Argument kommt, wäre die Spezifikation__:2,3
, was darauf hinweist, dass die erste Form das zweite Argument ist, und so weiter.
Nachdem Sie diese neuen Regeln in die .po-Datei aufgenommen haben, bringt ein neuer Scan Ihre neuen Zeichenfolgen genauso einfach wie zuvor.
Machen Sie Ihre PHP-App mit Gettext mehrsprachig
Gettext ist ein sehr leistungsfähiges Tool zur Internationalisierung Ihres PHP-Projekts. Neben seiner Flexibilität, die eine große Anzahl menschlicher Sprachen unterstützt, ermöglicht Ihnen die Unterstützung von mehr als 20 Programmiersprachen, Ihr Wissen über die Verwendung mit PHP auf andere Sprachen wie Python, Java oder C# zu übertragen.
Darüber hinaus kann Poedit dabei helfen, den Weg zwischen Code und übersetzten Zeichenfolgen zu ebnen, wodurch der Prozess unkomplizierter und einfacher zu verfolgen ist. Mit seiner Crowdin-Integration kann es auch gemeinsame Übersetzungsbemühungen rationalisieren.
Berücksichtigen Sie nach Möglichkeit andere Sprachen, die Ihre Benutzer sprechen könnten. Dies ist vor allem für nicht-englische Projekte wichtig: Sie können Ihren Benutzerzugang verbessern, wenn Sie es zusätzlich zu Ihrer Muttersprache auch auf Englisch freigeben.
Natürlich müssen nicht alle Projekte internationalisiert werden, aber es ist viel einfacher, i18n in den Kinderschuhen eines Projekts zu starten, auch wenn es anfänglich nicht erforderlich ist, als es später zu tun, wenn es später eine Anforderung wird. Und mit Tools wie Gettext und Poedit ist es einfacher als je zuvor.