So erstellen Sie eine mehrsprachige App: Eine Demo mit PHP und Gettext

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.

Regeln der Pluralisierung in Englisch sind ziemlich einfach: Sie können eine Singularform eines Wortes oder eine Pluralform eines Wortes haben.

In anderen Sprachen, wie z.B. slawischen Sprachen, gibt es neben der Singularform zwei Pluralformen. Sie können sogar Sprachen mit insgesamt vier, fünf oder sechs Pluralformen finden, wie in 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 bei der Bestimmung, 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 erfolgt in der Regel einmal, vorzugsweise zu Beginn des Projekts, um große Änderungen im Quellcode zu vermeiden.

 So erstellen Sie eine mehrsprachige App: Eine Demo mit PHP und Gettext

Sobald Ihre Codebasis internationalisiert wurde, geht es bei der Lokalisierung (l10n) darum, den Inhalt Ihrer Anwendung in eine bestimmte Sprache / ein bestimmtes Gebietsschema zu übersetzen.

Die Lokalisierung muss jedes Mal durchgeführt werden, wenn eine neue Sprache oder Region unterstützt werden soll. Wenn ein Teil der Benutzeroberfläche (der Text enthält) aktualisiert wird, werden neue Inhalte verfügbar, die dann in alle unterstützten Gebietsschemas lokalisiert (dh übersetzt) werden müssen.

In diesem Artikel erfahren Sie, wie Sie in PHP geschriebene Software internationalisieren und lokalisieren. Wir werden die verschiedenen Implementierungsoptionen und die verschiedenen Tools, die uns zur Verfügung stehen, durchgehen, um den Prozess zu vereinfachen.

Tools 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?></h1>

Dies ist jedoch kaum ein empfohlener Weg für ernsthafte Projekte, da es auf jeden Fall Wartungsprobleme aufwerfen wird. Einige Probleme können sogar ganz am Anfang auftreten, z. B. die fehlende Unterstützung für variable Interpolation oder Pluralisierung von Substantiven usw.

Eines der klassischsten Tools (oft als Referenz für i18n und l10n verwendet) ist ein Unix-Tool namens Gettext.

Obwohl es aus dem Jahr 1995 stammt, ist es immer noch ein umfassendes Werkzeug zum Übersetzen von Software, das auch einfach zu bedienen ist. Obwohl es ziemlich einfach ist, damit zu beginnen, 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 vorstellen, mit der Sie Ihre l10n-Quelldateien einfach aktualisieren können, um die Notwendigkeit zu vermeiden, sich mit der Befehlszeile zu befassen.

Bibliotheken zur Vereinfachung

 Wichtige PHP-Webframeworks und -bibliotheken, die Gettext unterstützen

Es gibt wichtige PHP-Web-Frameworks und -Bibliotheken, die Gettext und andere Implementierungen von i18n unterstützen. Einige sind einfacher zu installieren als andere oder bieten zusätzliche Funktionen oder unterstützen verschiedene i18n-Dateiformate. Obwohl wir uns in diesem Dokument auf die mit dem PHP-Kern bereitgestellten Tools konzentrieren, finden Sie hier eine Liste einiger anderer erwähnenswerter Tools:

  • oscarotero/Gettext: Gettext-Unterstützung mit einer objektorientierten Schnittstelle; enthält verbesserte Hilfsfunktionen und leistungsstarke Extraktoren für verschiedene Dateiformate (einige davon werden vom Befehl gettext nicht nativ unterstützt). Dies kann nützlich sein, wenn Sie Ihre Übersetzungsdateien in andere Teile des Systems integrieren müssen, z. B. in eine JavaScript-Oberfläche.

  • symfony / translation: Unterstützt viele verschiedene Formate, empfiehlt jedoch die Verwendung ausführlicher XLIFFs. Enthält keine Hilfsfunktionen oder einen integrierten Extraktor, unterstützt jedoch Platzhalter, die intern strtr() .

  • zend/i18n: Unterstützt Array- und INI-Dateien oder Gettext-Formate. Implementiert eine Caching-Ebene, um zu vermeiden, dass das Dateisystem jedes Mal gelesen werden muss. Enthält auch Ansichtshelfer sowie gebietsschemaabhängige Eingabefilter und -validatoren. Es hat jedoch keinen Nachrichtenextraktor.

Andere Frameworks enthalten auch i18n-Module, die jedoch außerhalb ihrer Codebasen nicht verfügbar sind:

  • 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 Erweiterung Intl, die seit PHP 5.3 verfügbar ist und auf dem ICU-Projekt basiert. Auf diese Weise kann Yii leistungsstarke Ersetzungen ausführen, z. B. das Buchstabieren von Zahlen, das Formatieren von Datumsangaben, Zeiten, Intervallen, Währungen und Ordinalzahlen.

Wenn Sie sich für eine der Bibliotheken entscheiden, die keine Extraktoren bereitstellen, können Sie die Gettext-Formate verwenden, sodass 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 mit Ihrem Paketmanager 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 werden es wahrscheinlich im Paketmanager Ihres Systems finden; Es ist für Unix, Mac und Windows verfügbar und kann auch kostenlos auf der Website heruntergeladen werden.

Arten von Gettext-Dateien

Es gibt drei Dateitypen, mit denen Sie normalerweise bei der Arbeit mit Gettext umgehen.

Die wichtigsten sind PO- (Portable Object) und MO- (Machine Object) Dateien, wobei die erste eine Liste lesbarer „übersetzter Objekte“ und die zweite die entsprechende Binärdatei ist (die von Gettext bei der Lokalisierung interpretiert werden soll). Es gibt auch eine POT-Datei (PO Template), die einfach alle vorhandenen Schlüssel aus Ihren Quelldateien enthält und als Leitfaden 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, sind nur PO / MO-Dateien in Ordnung. Sie haben ein Paar PO / MO-Dateien pro Sprache und Region, aber nur einen POT pro Domain.

Domänentrennung

In großen Projekten gibt es 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, die im Grunde Gruppen von POT / PO / MO-Dateien genannt werden, wobei der Dateiname die genannte Übersetzungsdomäne ist.

Kleine und mittlere Projekte verwenden in der Regel der Einfachheit halber nur eine Domäne; Der Name ist willkürlich, aber wir werden „main“ für unsere Codebeispiele verwenden.

In Symfony-Projekten werden beispielsweise Domänen verwendet, um die Übersetzung für Validierungsnachrichten zu trennen.

Gebietsschemacode

Ein Gebietsschema ist einfach ein Code, der eine Version einer Sprache identifiziert. Es ist nach den Spezifikationen 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 zur Identifizierung des Landes- oder Regionalcodes.

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 ö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 verwendet.

Verzeichnisstruktur

Um Gettext zu verwenden, müssen wir uns an eine bestimmte Struktur von Ordnern 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 Ordner „LC_MESSAGES“, der alle Ihre PO / MO-Paare enthält.

 Ordner LC_MESSAGES

Pluralformen

Wie wir in der Einleitung sagten, können verschiedene Sprachen unterschiedliche Pluralisierungsregeln haben. Gettext erspart uns jedoch diese Probleme.

Beim Erstellen eines neuen .in der po-Datei müssen Sie die Pluralisierungsregeln für diese Sprache deklarieren, und übersetzte Teile, die pluralsensitiv sind, haben für jede dieser Regeln eine andere Form.

Wenn Sie Gettext im Code aufrufen, müssen Sie eine Nummer angeben, die sich auf den Satz bezieht (z. B. für die Phrase „Sie haben n Nachrichten.“ , müssen Sie den Wert von n angeben), und es wird die richtige Form zu verwenden – auch mit String-Substitution, wenn nötig.

Pluralregeln setzen sich aus der Anzahl der Regeln zusammen, die mit einem booleschen Test für jede Regel erforderlich sind (Test für höchstens eine Regel kann weggelassen werden). Zum Beispiel:

  • Japanisch: nplurals=1; plural=0; – eine Regel: Es gibt keine Pluralformen

  • Englisch: nplurals=2; plural=(n != 1); – zwei Regeln: Verwenden Sie nur die Pluralform, wenn n nicht 1 ist, andernfalls verwenden Sie die Singularform.

  • Brasilianisches Portugiesisch: nplurals=2; plural=(n > 1); – zwei Regeln, verwenden Sie die Pluralform nur, wenn n größer als 1 ist, andernfalls verwenden Sie die Singularform.

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 korrekte lokalisierte Version der Zeichenfolge. Für Zeichenfolgen, bei denen Pluralisierung behandelt werden muss, müssen Sie in die .po Datei einen anderen Satz für jede Pluralregel definiert.

Beispielimplementierung

Nach all dieser Theorie wollen wir ein wenig praktisch werden. Hier ein Auszug von a.po-Datei (mach dir noch nicht zu viele Sorgen um die Syntax, sondern bekomme nur ein Gefühl für den 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 "Nós estamos traduzindo algumas strings agora"msgid "Hello %1$s! Your last visit was on %2$s"msgstr "Olá %1$s! Sua última visita foi em %2$s"msgid "Only one unread message"msgid_plural "%d unread messages"msgstr "Só uma mensagem não lida"msgstr "%d mensagens não 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 vom Englischen ins brasilianische Portugiesisch, und der dritte macht dasselbe, nutzt jedoch die Zeichenfolgenersetzung von sprintf , sodass die Übersetzung den Benutzernamen und das Besuchsdatum enthält.

Der letzte Abschnitt ist eine Auswahl von Pluralisierungsformen, die die Singular- und Pluralversion als msgid in Englisch und ihre entsprechenden Übersetzungen als msgstr 0 und 1 (nach der durch die Pluralregel angegebenen Zahl) anzeigen.

Dort wird auch die Zeichenfolgenersetzung verwendet, sodass die Zahl direkt im Satz mit %d angezeigt werden kann. 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. Das msgid ist das gleiche in allen verwendet Ihre .po-Dateien, dh andere Sprachen haben das gleiche Format und die gleichen msgid -Felder, aber übersetzte msgstr -Zeilen.

Apropos Übersetzungsschlüssel, hier gibt es zwei „philosophische“ Standardansätze:

1. msgstr als realer Satz

Die Hauptvorteile dieses Ansatzes sind:

  • Wenn Teile der Software in einer bestimmten Sprache nicht übersetzt sind, behält der angezeigte Schlüssel dennoch eine gewisse Bedeutung. Wenn Sie beispielsweise wissen, wie man vom Englischen ins Spanische übersetzt, aber Hilfe beim Übersetzen ins Französische benötigen, können Sie die neue Seite mit fehlenden französischen Sätzen veröffentlichen, und Teile der Website werden stattdessen in englischer Sprache angezeigt.

  • Für den Übersetzer ist es viel einfacher zu verstehen, was vor sich geht, und eine korrekte Übersetzung basierend auf msgid vorzunehmen.

  • Es gibt Ihnen „free“ l10n für eine Sprache – die Quelle ein.

Andererseits besteht der Hauptnachteil darin, dass Sie, wenn Sie den tatsächlichen Text ändern müssen, denselben msgid in mehreren Sprachdateien ersetzen müssen.

2. msgstr 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 übersehen würde.

Eine Quellsprachendatei würde als Grundlage für andere Übersetzungen benötigt. Zum Beispiel hätte der Entwickler idealerweise ein „en.po“-Datei, die Übersetzer lesen würden, um zu verstehen, was in „fr.po“.

Fehlende Übersetzungen würden sinnlose Tasten auf dem Bildschirm anzeigen („top_menu.willkommen“ statt „Hallo, Benutzer!“ auf der besagten nicht übersetzten französischen Seite).

Das ist gut, da es die Übersetzung zwingen würde, vor der Veröffentlichung vollständig zu sein – aber schlecht, da Übersetzungsprobleme in der Benutzeroberfläche wirklich schrecklich wären. Einige Bibliotheken enthalten jedoch eine Option zum Angeben einer bestimmten Sprache als „Fallback“ mit einem ähnlichen Verhalten wie der andere Ansatz.

Das Gettext-Handbuch bevorzugt den ersten Ansatz, da es im Allgemeinen für Übersetzer und Benutzer im Falle von Problemen einfacher ist. Das ist der Ansatz, den wir auch hier verwenden werden.

Es sollte jedoch beachtet werden, dass die Symfony-Dokumentation eine schlüsselwortbasierte Übersetzung bevorzugt, um unabhängige Änderungen aller Übersetzungen zu ermöglichen, ohne auch Vorlagen zu beeinflussen.

Alltägliche Verwendung

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 erscheinen .po-Dateien übersetzt, in .mo-Dateien kompiliert und dann von Gettext beim Rendern der eigentlichen Schnittstelle verwendet. Lassen Sie uns das, was wir bisher besprochen haben, in einem Schritt-für-Schritt-Beispiel zusammenfassen:

1. Eine Beispielvorlagendatei, 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 ein msgid in das entsprechende msgstr für eine bestimmte Sprache. Es gibt auch die Kurzschriftfunktion _(), die genauso funktioniert

  • ngettext() macht das gleiche, aber mit Pluralregeln

  • Es gibt auch dgettext() und dngettext() , 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 Auswahl des richtigen Gebietsschemas und die Konfiguration von Gettext

Die Verwendung von Gettext erfordert ein wenig Code, aber es geht hauptsächlich darum, das Gebietsschemaverzeichnis zu konfigurieren und geeignete Parameter auszuwählen (ein Gebietsschema und eine Domäne).

<?php/** * Verifies if the given $locale is supported in the project * @param string $locale * @return bool */function valid($locale) { return in_array($locale, ) && valid($_GET)) { // the locale can be changed through the query-string $lang = $_GET; //you should sanitize this! setcookie('lang', $lang); //it's stored in a cookie so it can be reused} elseif (isset($_COOKIE) && valid($_COOKIE)) { // if the cookie is present instead, let's just keep it $lang = $_COOKIE; //you should sanitize this!} elseif (isset($_SERVER)) { // default: look for the languages the browser says the user accepts $langs = explode(',', $_SERVER); 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 languageputenv("LANG=$lang");// this might be useful for date functions (LC_TIME) or money formatting (LC_MONETARY), for instancesetlocale(LC_ALL, $lang);// this will make Gettext look for ../locales/<lang>/LC_MESSAGES/main.mobindtextdomain('main', '../locales');// indicates in what encoding the file should be readbind_textdomain_codeset('main', 'UTF-8');// if your application has additional domains, as cited before, you should bind them here as wellbindtextdomain('forum', '../locales');bind_textdomain_codeset('forum', 'UTF-8');// here we indicate the default domain the gettext() calls will respond totextdomain('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 denkst du „Oh Mann, das ist ziemlich schwer zu verstehen und von Hand zu bearbeiten, ein einfaches Array wäre einfacher!“ Machen Sie keinen Fehler, Anwendungen wie Poedit sind hier, um zu helfen – viel. Sie können das Programm von ihrer Website erhalten, es ist kostenlos und für alle Plattformen verfügbar. Es ist ein ziemlich einfaches Werkzeug zu gewöhnen, und ein sehr leistungsfähiges zugleich – mit allen Funktionen Gettext zur Verfügung hat. Wir arbeiten hier mit der neuesten Version, Poedit 1.8.

 Blick ins Innere von Poedit.

Im ersten Lauf sollten Sie „Datei > Neu …“ aus dem Menü 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.

 Auswahl der Sprache.

Speichern Sie nun die Datei – verwenden Sie auch die von uns erwähnte Verzeichnisstruktur. Dann sollten Sie auf „Aus Quellen extrahieren“ klicken und hier verschiedene Einstellungen für die Extraktions- und Übersetzungsaufgaben konfigurieren. Sie können alle diese später über „Katalog > Eigenschaften“ finden“:

  • Quellpfade: Fügen Sie alle Ordner aus dem Projekt hinzu, 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 der geht .po-Datei-Header.
    • Pluralformen: Dies sind die Regeln, die wir zuvor erwähnt haben. Sie können es die meiste Zeit mit der Standardoption belassen, da Poedit bereits eine praktische Datenbank mit Pluralregeln für viele Sprachen enthält.
    • Zeichensätze: UTF-8, vorzugsweise.
    • Quellcode-Zeichensatz: Der Zeichensatz, der von Ihrer Codebasis verwendet wird – 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 auch Ihre eigenen Übersetzungsfunktionen erstellen. Hier werden Sie diese anderen Methoden hinzufügen. Dies wird später im Abschnitt „Tipps“ besprochen.

Nachdem Sie diese Eigenschaften festgelegt haben, führt Poedit einen Scan Ihrer 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 werden in die Übersetzungstabelle eingefügt, sodass Sie die lokalisierten Versionen dieser Zeichenfolgen eingeben können. Speichern Sie es und eine .mo-Datei wird (neu) in denselben Ordner kompiliert und, presto! Ihr Projekt ist internationalisiert!

 Projekt internationalisiert.

Poedit kann auch gängige Übersetzungen aus dem Web und aus früheren Dateien vorschlagen. Es ist praktisch, so dass Sie nur überprüfen müssen, ob sie Sinn machen, und sie akzeptieren. Wenn Sie sich bei einer Übersetzung nicht sicher sind, können Sie sie als unscharf markieren und sie wird gelb angezeigt. Blaue Einträge sind diejenigen, die keine Übersetzung haben.

4. Strings übersetzen

Wie Sie vielleicht bemerkt haben, gibt es zwei Haupttypen lokalisierter Strings: einfache und solche mit Pluralformen.

Einfache haben nur zwei Felder: source und localized string . Die Quellzeichenfolge kann nicht geändert werden, da Gettext / Poedit nicht die Möglichkeit bietet, Ihre Quelldateien zu ändern. (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.)

Pluralformenzeichenfolgen enthalten zwei Felder zum Anzeigen der beiden Quellzeichenfolgen und Registerkarten zum Konfigurieren der verschiedenen endgültigen Formen.

 Konfigurieren der endgültigen Formulare.

Beispiel für eine Zeichenkette mit einer Pluralform auf Poedit, die für jede eine Übersetzungsregisterkarte anzeigt.

Wenn Sie Ihre Quellcodedateien ändern und die Übersetzungen aktualisieren müssen, klicken Sie einfach auf Aktualisieren und Poedit scannt den Code erneut, entfernt nicht vorhandene Einträge, führt die geänderten zusammen und fügt neue hinzu.

Poedit kann auch versuchen, einige Übersetzungen zu erraten, basierend auf anderen, die Sie getan haben. Diese Vermutungen und die geänderten Einträge erhalten eine „unscharfe“ Markierung, die anzeigt, dass sie überprüft werden müssen, die in der Liste gelb angezeigt wird.

Es ist auch nützlich, wenn Sie ein Übersetzungsteam haben und jemand versucht, etwas zu schreiben, über das er sich nicht sicher ist: markieren Sie es einfach unscharf und jemand anderes wird es später überprüfen.

Schließlich wird empfohlen, „View > Untranslated entries first“ markiert zu lassen, da Sie so vermeiden können, Einträge zu vergessen. In diesem Menü können Sie auch Teile der Benutzeroberfläche öffnen, in denen Sie bei Bedarf Kontextinformationen für Übersetzer hinterlassen können.

Tipps & Tricks

Webserver können Ihre .mo-Dateien zwischenspeichern.

Wenn Sie PHP als Modul unter Apache (mod_php) ausführen, treten möglicherweise Probleme mit der zwischengespeicherten .mo-Datei auf. Es passiert das erste Mal, wenn es gelesen wird, und dann, um es zu aktualisieren, müssen Sie möglicherweise den Server neu starten.

Auf Nginx und PHP5 dauert es normalerweise nur ein paar Seitenaktualisierungen, um den Übersetzungscache zu aktualisieren, und auf PHP7 wird es selten benötigt.

Bibliotheken bieten Hilfsfunktionen, um Lokalisierungscode kurz zu halten.

Wie von vielen Menschen bevorzugt, ist es einfacher, _() anstelle von gettext() zu verwenden. Viele benutzerdefinierte i18n-Bibliotheken von Frameworks verwenden ebenfalls etwas Ähnliches wie t() , um den übersetzten Code zu verkürzen. Dies ist jedoch die einzige Funktion, die eine Verknüpfung bietet.

Möglicherweise möchten Sie Ihrem Projekt einige andere hinzufügen, z. B. __() oder _n() für ngettext() oder ein ausgefallenes _r() , das gettext() und sprintf() Aufrufen beitreten würde. Andere Bibliotheken wie oscaroteros Gettext bieten ebenfalls Hilfsfunktionen wie diese.

In diesen Fällen müssen Sie das Dienstprogramm Gettext anweisen, die Zeichenfolgen aus diesen neuen Funktionen zu extrahieren. Hab keine Angst, es ist sehr einfach. Es ist nur ein Feld in der .po-Datei oder einen Einstellungsbildschirm in Poedit (im Editor befindet sich diese Option in „Catalog > Properties > Sources keywords“).

Merken: Gettext kennt bereits die Standardfunktionen für viele Sprachen, also machen Sie sich 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 eine Zeichenfolge zurückgibt, können Sie es als t angeben. Gettext weiß, dass das einzige Funktionsargument die zu übersetzende Zeichenfolge ist;

  • Wenn die Funktion mehr als ein Argument hat, können Sie angeben, in welchem der erste String ist und, falls erforderlich, auch die Pluralform. Wenn unsere Funktionssignatur beispielsweise __('one user', '%d users', $number) ist, lautet die Spezifikation __:1,2 , was bedeutet, dass das erste Formular das erste Argument und das zweite Formular das zweite Argument ist. Wenn Ihre Zahl stattdessen als erstes Argument angegeben wird, lautet die Spezifikation __:2,3 , was darauf hinweist, dass das erste Formular das zweite Argument ist, und so weiter.

Nachdem diese neuen Regeln in die aufgenommen wurden.po-Datei, Ein neuer Scan bringt Ihre neuen Zeichenfolgen genauso einfach wie zuvor.

Machen Sie Ihre PHP-App mehrsprachig mit Gettext

Gettext ist ein sehr leistungsfähiges Werkzeug zur Internationalisierung Ihres PHP-Projekts. Abgesehen von der Flexibilität, die die Unterstützung einer großen Anzahl menschlicher Sprachen ermöglicht, können Sie mit der Unterstützung von mehr als 20 Programmiersprachen Ihr Wissen über die Verwendung mit PHP problemlos auf andere Sprachen wie Python, Java oder C # übertragen.

Darüber hinaus kann Poedit dazu beitragen, den Pfad zwischen Code und übersetzten Zeichenfolgen zu glätten, wodurch der Prozess einfacher und einfacher zu verfolgen ist. Es kann auch gemeinsame Übersetzungsbemühungen mit seiner Crowdin-Integration rationalisieren.

Berücksichtigen Sie nach Möglichkeit andere Sprachen, die Ihre Benutzer möglicherweise sprechen. Dies ist vor allem für nicht-englische Projekte wichtig: Sie können Ihren Benutzerzugriff verbessern, wenn Sie ihn sowohl in Englisch als auch in Ihrer Muttersprache 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 zunächst nicht benötigt wird, als es später zu tun, falls es später erforderlich wird. Und mit Tools wie Gettext und Poedit ist es einfacher als je zuvor.

Related: Einführung in PHP 7: Was ist neu und was ist weg

Leave a Reply

Deine E-Mail-Adresse wird nicht veröffentlicht.