Heim >Backend-Entwicklung >PHP-Tutorial >Verwalten von GetText -Übersetzungen beim gemeinsam genutzten Hosting

Verwalten von GetText -Übersetzungen beim gemeinsam genutzten Hosting

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-22 08:51:111019Durchsuche

Managing Gettext Translations on Shared Hosting

Kernpunkte

  • GetText ist eine beliebte Methode für die Übersetzungsverwaltung von PHP -Websites, hat jedoch einen erheblichen Nachteil: Apache Caches -Übersetzungen, was bedeutet, dass die Aktualisierungen der übersetzten Dateien nicht sichtbar sind, wenn die Engine nicht neu gestartet wird. Dies ist insbesondere beim gemeinsamen Hosting problematisch, da die Administratorrechte häufig nicht verfügbar sind.
  • Außero Shared getText ist eine PHP -Bibliothek, mit der Entwickler den Übersetzungscache von Apache über die Funktion getText () umgehen können. Die Bibliothek verwendet einen einfachen Trick, um eine gespiegelte Kopie der Übersetzungsdatei zu erstellen und Apache dazu zu bringen, sie als eine neue, irrelevante Übersetzung zu betrachten und so Probleme zu vermeiden.
  • Außero Shared GetText kann über Komponist, Git oder Herunterladen von Archiven aus dem Repository installiert werden. Nach der Installation können Entwickler den Autoloader des Komponisten verwenden, um Klassen dynamisch zu laden und Sharedgette -Instanzen zu erstellen.
  • Diese Bibliothek erfordert PHP 5.3 oder höher, da sie einen Namespace verwendet und unter der CC BY-NC 4.0-Lizenz veröffentlicht wird und kostenlos verfügbar ist. Die beiden Hauptmethoden sind Updatetranslation (), die eine gespiegelte Kopie der Übersetzungsdatei erstellen, und deleteArttranslations (), die alle Kopien im ausgewählten Übersetzungsordner mit Ausnahme der neuesten Spiegelkopie löscht.

Viele Unternehmen werden ihre Zielmärkte schließlich weltweit drehen. Dieses Ziel wird die Notwendigkeit bringen, eine Unternehmenswebsite in eine oder mehrere Sprachen zu übersetzen. Auch wenn Sie nicht für ein großes Unternehmen arbeiten, müssen Sie möglicherweise neue Dienste in Ihrer Muttersprache einführen (vorausgesetzt, Sie sind kein englischer Muttersprachler), um den lokalen Markt und den globalen Markt in englischer Sprache anzusprechen. Als Entwickler liegt es nicht in unserer Verantwortung, Text zu übersetzen, sondern die Website zur Unterstützung der Übersetzung vorzubereiten. In PHP ist die beliebteste Methode durch GetText. Dies ist ein großartiger Ansatz, da es die Trennung der Übersetzung von der Anwendung ermöglicht und so eine Parallelisierung des Prozesses ermöglicht. Das Problem ist, dass Apache Übersetzungen vornimmt. Wenn Sie also die Engine nicht neu starten können, werden Aktualisierungen der Übersetzungsdatei nicht angezeigt. Diese Tatsache ist besonders ärgerlich, wenn Sie an einem gemeinsamen Hosting arbeiten und keine Administratorrechte haben. In diesem Artikel werde ich dieses Problem im Detail beschreiben und die Lösung erläutern, die ich gefunden habe, um dieses Problem zu vermeiden.

Hinweis: Wenn Sie mit den Konzepten von i18n, Übersetzung und GetText nicht vertraut sind, empfehle ich Ihnen dringend, diese Serie zu lesen, bevor Sie diesen Artikel weiter untersuchen. Es gibt Ihnen detailliertere Informationen als den kurzen Überblick, den Sie hier finden, und helfen Ihnen, diese Themen besser zu verstehen.

Umgebungseinstellungen

Es gibt viele Möglichkeiten, Übersetzungen in PHP zu verwenden. Der einfachste Weg, an den ich mich erinnern kann, besteht darin, ein assoziatives Array mit allen übersetzten Zeichenfolgen zu haben und dann die Tasten zu verwenden, um die richtige Zeichenfolge abzurufen. Wie Sie vielleicht vermuten, ist diese Lösung nicht skalierbar und Sie sollten diese Lösung vermeiden, es sei denn, Sie arbeiten an einem sehr, sehr kleinen Projekt (möglicherweise nicht mehr als 5 Codezeilen). Für ernsthafte Übersetzungen können wir GetText verwenden. Dieser Ansatz ermöglicht es uns, für jede Zielsprache unterschiedliche Dateien zu haben, die dazu beitragen, die Trennung zwischen Geschäftslogik, Präsentationsschicht und Übersetzung aufrechtzuerhalten (die wir uns als Add-On für die Präsentationsschicht vorstellen können). Mit GetText können wir den Prozess parallelisieren, da bei der Verarbeitung bestimmter Funktionen der Website Übersetzer weiterhin Software wie Poedit verwenden können, um sie zu übersetzen.

Übersetzungen sollten in Pfaden mit festen Strukturen gespeichert werden. Zunächst werden wir einen Root -Ordner haben, der nach Ihren Vorlieben benannt wird (z. B. "Sprachen"). Darin müssen wir für jede Zielsprache einen Ordner erstellen, dessen Name dem ISO 3166 -Standard entsprechen muss. Daher können die gültigen Namen für italienische Übersetzungen "it_it" (italienisch Italienisch), "it_ch" (italienischer Schweizer), "en_us" (amerikanisches Englisch) und so weiter sein. In einem Ordner mit Sprachcode müssen wir einen Ordner namens "LC_Messages" haben, in dem wir die Übersetzungsdatei speichern.

poedit analysiert den Quellcode der Website und extrahiert den String, der auf einer oder mehreren Mustern übersetzt werden soll, die wir in der Software festlegen. Sie speichert die Zeichenfolge in einer einzelnen Datei mit der Erweiterung .PO (tragbares Objekt), die die Software (oder äquivalent) in eine binäre .mo -Datei kompiliert. Letzteres ist das Format, an dem wir an der Funktion von PHP interessiert sind. Die .MO -Datei ist eine Datei, die wir in das zuvor erstellte Verzeichnis "LC_Messages" platzieren müssen.

Der Beispielcode mit GetText () ist wie folgt (der Code wurde kommentiert, sodass Sie seine Funktion schnell verstehen können):

<code class="language-php"><?php
// 包含翻译文件的根文件夹的名称
$translationsPath = 'languages';
// 要翻译到的语言
$language = 'it_IT';
// 翻译文件的名称(在gettext中称为域)
$domain = 'audero';

// 指示此会话将使用哪种语言
putenv("LANG=" . $language);
setlocale(LC_ALL, $language);

// 设置当前域的路径
bindtextdomain($domain, $translationsPath);
// 指定字符编码
bind_textdomain_codeset($domain, 'UTF-8');

// 选择域
textdomain($domain);

// 调用gettext()函数(它有一个名为_()的别名)
echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD");
?></code>

Nachdem Sie den vorherigen Code auf der Seite gespeichert und im Browser geladen haben. Wenn GetText () die Übersetzungsdatei finden kann, sehen Sie die Übersetzung, die Sie auf dem Bildschirm erstellt haben.

Bisher lief alles gut. Die schlechte Nachricht ist, dass Apache, sobald die Übersetzung geladen ist, sie zwischen Apache richtet. Wenn wir die Engine nicht neu starten können, werden Aktualisierungen der Übersetzungsdatei nicht angezeigt. Dies ist besonders ärgerlich, wenn wir an einem gemeinsam genutzten Hosting arbeiten und keine Administratorrechte haben. Wie löst ich dieses Problem? Außero Shared GetText kommt, um zu retten!

Was ist Außero Shared getText

Außero Shared GetText ist eine PHP -Bibliothek (eigentlich nur eine Klasse, aber lassen Sie mich davon träumen), mit der Sie das Problem von Übersetzungen umgehen können, die durch die GetText () -Funktion geladen werden, die von Apache zwischengespeichert wird. Diese Bibliothek verfolgt einen einfachen und effektiven Ansatz, sodass Sie immer die neuesten Übersetzungen verwenden. Außero Shared GetText erfordert PHP 5.3 oder höher, da es Namespaces verwendet und im vorherigen Abschnitt eine Struktur beschrieben wird. Es verfügt über zwei Hauptmethoden: UpdatetRanslation () und Deleteoldtranslations (). Ersteres ist der Kern der Bibliothek und auch der Weg, um diese Technik zu implementieren. Aber was ist diese Technik? Schauen wir uns seinen Code an, um mehr zu erfahren. Um es vollständig zu verstehen, lohnt es sich zu betonen, dass der Konstruktor der Klasse den Weg zur Speicherung der Übersetzung, die zu übersetzende Sprache und den Namen (Domäne) der übersetzten Datei akzeptiert.

<code class="language-php"><?php
// 包含翻译文件的根文件夹的名称
$translationsPath = 'languages';
// 要翻译到的语言
$language = 'it_IT';
// 翻译文件的名称(在gettext中称为域)
$domain = 'audero';

// 指示此会话将使用哪种语言
putenv("LANG=" . $language);
setlocale(LC_ALL, $language);

// 设置当前域的路径
bindtextdomain($domain, $translationsPath);
// 指定字符编码
bind_textdomain_codeset($domain, 'UTF-8');

// 选择域
textdomain($domain);

// 调用gettext()函数(它有一个名为_()的别名)
echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD");
?></code>

Das erste, was diese Methode tun muss, ist zu testen, ob die ursprüngliche binäre Übersetzungsdatei (.MO -Datei) vorhanden ist. Wenn es nicht vorhanden ist, bringt die Methode eine Ausnahme aus. Anschließend berechnet es den vollständigen Pfad zur übersetzten Datei basierend auf den dem Konstruktor bereitgestellten Parametern und dem zuletzt geänderten Zeitstempel der Datei. Danach erstellt es eine neue Zeichenfolge, die die ursprüngliche Domäne mit dem zuvor berechneten Zeitstempel verkettet. Sobald Sie fertig sind, ist hier der Trick, der eine gespiegelte Kopie der Übersetzungsdatei erstellt. Wenn bereits eine Datei mit einem solchen Namen vorhanden ist, ist die Klasse klug genug, um dieses Kopieren zu vermeiden. Schließlich gibt es den neuen Namen zurück, der in BindTextDomain (), bind_textdomain_codeset () und textdomain () verwendet wird. Apache wird sehen, dass die Übersetzung so ist, als hätte sie nichts mit der ursprünglichen Übersetzung zu tun und so Probleme zu vermeiden. Wie gesagt, einfach und effektiv!

"Großartige Aurelio!" Aus diesem Grund habe ich Deleteoldtranslations () erstellt. Es löscht alle Spiegelkopien des ausgewählten Übersetzungsordners mit Ausnahme des letzten.

Jetzt, da Sie gelernt haben, was Außero geteilt hat, und was es für Sie tun kann, lassen Sie uns sehen, wie man es bekommt.

Installieren von Außero Shared getText

Sie können "Außero Shared getText" über Komponist erhalten und Ihrem Composer.json:

die folgenden Zeilen hinzufügen
<code class="language-php">/**
 * 创建翻译文件的镜像副本
 *
 * @return string 创建的翻译文件的名称(在gettext中称为域)
 *
 * @throws \Exception 如果找不到翻译文件
 */
public function updateTranslation()
{
    if (!self::translationExists()) {
        throw new \Exception('在给定路径中找不到翻译文件。');
    }
    $originalTranslationPath = $this->getTranslationPath();
    $lastAccess = filemtime($originalTranslationPath);
    $newTranslationPath = str_replace(self::FILE_EXTENSION, $lastAccess . self::FILE_EXTENSION, $originalTranslationPath);

    if(!file_exists($newTranslationPath)) {
            copy($originalTranslationPath, $newTranslationPath);
    }

    return $this->domain . $lastAccess;
}</code>

Führen Sie den Befehl Installation aus, um die Abhängigkeiten zu analysieren und herunterzuladen:

<code class="language-json">"require": {
    "audero/audero-shared-gettext": "1.0.*"
}</code>

Composer installiert die Bibliothek in das Vendor/Auvero -Verzeichnis Ihres Projekts.

Wenn Sie keinen Komponisten verwenden möchten (Sie sollten es wirklich), können Sie den Audo -Shared GetText über Git erhalten, indem Sie den folgenden Befehl ausführen:

<code class="language-bash">php composer.phar install</code>

Die letzte Option, die Sie haben, besteht darin, auf das Repository zuzugreifen und als Archiv herunterzuladen.

So verwenden Sie Außero Shared getText

Angenommen, Sie erhalten Außero Shared GetText mit Composer, den Sie sich auf den Autoloader verlassen können, um die Klasse dynamisch zu laden. Dann müssen Sie eine Sharedgettex -Instanz erstellen und die von Ihnen benötigte Methode aufrufen. Sie können eine der oben genannten Methoden verwenden, wie im folgenden Beispiel gezeigt.

<code class="language-bash">git clone https://github.com/AurelioDeRosa/Audero-Shared-Gettext.git</code>

Schlussfolgerung

In diesem Artikel wird Auvero Shared GetText vorgestellt, eine einfache Bibliothek (gut ... Klasse), mit der Sie das Problem der Übersetzungen umgehen können, die über die Funktion von GetText () von Apache zwischengespeichert werden. Außero Shared GetText verfügt über eine umfangreiche Kompatibilität, da Sie mindestens Php 5.3 (für eine Weile freigegeben wurden) erforderlich sind, da es Namespaces verwendet. Verwenden Sie die im Repository enthaltenen Demos und Dateien. Wenn Sie ein Problem finden, senden Sie eine Pull -Anfrage und eine Frage. Ich habe den Außero Shared GetText unter der CC BY-NC 4.0-Lizenz veröffentlicht, damit er kostenlos verwendet werden kann.

Haben Sie dieses Problem gestoßen? Wie hast du es gelöst? Sei nicht schüchtern und poste deine Lösung in den Kommentaren!

(Folgendes ist der FAQ

FAQs (FAQ) zur Verwaltung der GetText -Übersetzung auf gemeinsamem Hosting

Wie installiere ich GetText auf meinem gemeinsamen Hosting?

Die Installation von GetText auf einem gemeinsam genutzten Hosting kann etwas schwierig sein, da Sie möglicherweise keinen Root -Zugriff haben. Sie können es jedoch weiterhin über CPANEL oder Plesk installieren. In CPanel finden Sie die Option, GetText unter dem Abschnitt PHP -Version auszuwählen. In der Plesk können Sie es unter dem Abschnitt "PHP -Einstellungen" aktivieren. Wenn Sie diese Optionen nicht finden können, müssen Sie sich möglicherweise an Ihren Hosting -Anbieter wenden, um Hilfe zu erhalten.

Warum funktioniert meine GetText -Übersetzung nicht?

Ihre GetText -Übersetzung funktioniert aus mehreren Gründen nicht. Ein häufiges Problem ist, dass die .mo -Datei nicht korrekt zusammengestellt wird oder der Dateipfad falsch ist. Stellen Sie sicher, dass sich die .mo -Datei im richtigen Verzeichnis befindet und der Dateipfad im Code korrekt ist. Ein weiteres Problem könnte sein, dass das von Ihnen verwendete Gebietsschema vom Server nicht unterstützt wird. Sie können dies mit dem Gebietsschema -A -Befehl überprüfen.

Wie kann GetText -Übersetzung debuggen?

Debugging -GetText -Übersetzung kann durchgeführt werden, indem Fehler in .PO- und .mo -Dateien überprüft werden. Sie können diese Dateien mit Tools wie Poedit öffnen und nach Syntaxfehlern überprüfen. Darüber hinaus können Sie die GetText -Funktion in Ihrem Code verwenden, um zu überprüfen, ob die Übersetzung korrekt abgerufen wird. Wenn die Funktion die ursprüngliche Zeichenfolge zurückgibt, kann die Übersetzung nicht gefunden werden.

Kann ich GetText in WordPress verwenden?

Ja, Sie können GetText in WordPress verwenden. WordPress verwendet GetText als Lokalisierungsrahmen. Sie können die Funktionen __ () und _e () in WordPress verwenden, um Übersetzungen zu erhalten. Diese Funktionen verwenden GetText im Hintergrund.

Wie aktualisiere ich meine GetText -Übersetzung?

Sie können Ihre GetText -Übersetzung aktualisieren, indem Sie die .PO -Datei aktualisieren und dann in eine .mo -Datei zusammenstellen. Eine .PO -Datei ist eine klare Textdatei, die Sie mit jedem Texteditor öffnen können. Sobald die Änderungen vorgenommen wurden, können Sie ein Tool wie Poedit verwenden, um die .PO -Datei in eine .mo -Datei zu kompilieren.

Warum erhalte ich den Fehler "Paket-Paket-Paket-Gettext kann nicht gefunden werden"?

Dieser Fehler tritt normalerweise auf, wenn das Paket im Repository, den Ihr Server verwendet, nicht verfügbar ist. Sie können versuchen, Ihre Paketliste mit dem Sudo APT-Get-Aktualisierungsbefehl zu aktualisieren. Wenn der Fehler bestehen bleibt, müssen Sie möglicherweise ein anderes Repository hinzufügen oder das Paket manuell installieren.

Wie kann man GetText in PHP verwenden?

Sie können GETText in PHP mithilfe der GetText -Funktion verwenden. Diese Funktion nimmt eine Zeichenfolge als Argument und gibt die übersetzte Zeichenfolge zurück. Bevor Sie diese Funktion verwenden können, müssen Sie die Lokalschemafunktion mithilfe der SetLocale -Funktion festlegen und den Pfad zur .mo -Datei mithilfe der BindTextDomain -Funktion angeben.

Kann ich GetText auf Ubuntu verwenden?

Ja, Sie können GetText auf Ubuntu verwenden. Sie können es mit dem Sudo APT-Get-Installations-GetText-Befehl installieren. Nach der Installation können Sie den Befehl getText in der Terminal verwenden, um .PO- und .mo -Dateien zu verarbeiten.

Wie erstelle ich .PO- und .mo -Dateien?

Sie können .PO- und .mo -Dateien mit Tools wie Poedit erstellen. Mit diesem Tool können Sie .PO -Dateien erstellen und bearbeiten und automatisch in .mo -Dateien kompilieren. Sie können auch .PO -Dateien mit einem Texteditor manuell erstellen, benötigen jedoch Tools wie Poedit oder MSGFMT, um sie in .mo -Dateien zu kompilieren.

Was ist der Unterschied zwischen.po- und .mo -Dateien?

.PO -Datei ist eine einfache Textdatei, die die ursprüngliche Zeichenfolge und ihre Übersetzung enthält. Sie können mit einem beliebigen Texteditor geöffnet und bearbeitet werden. Andererseits ist die .mo -Datei eine binäre Datei, die aus der .PO -Datei generiert wird. Sie werden von GetText verwendet, um Übersetzungen zur Laufzeit zu erhalten.

Das obige ist der detaillierte Inhalt vonVerwalten von GetText -Übersetzungen beim gemeinsam genutzten Hosting. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn