Da ich zu 98% bei allen Aufträgen mit mehrsprachigen Projekten zu tun habe und auch beim Einsatz des Yii2 Frameworks eben genau solches benötige, war dies auch einer mit der ersten Teile des Frameworks womit ich mich intensiver auseinander setzte. Dabei benutze ich zu 100% bei allen Projekten immer Gettext und somit sog. .po / .mo Dateien, da eben die Quellen durch den Kunden sehr einfach mit PoEdit selbst in anderen Sprachen übersetzt werden kann. Wie man nun aber richtig die Internationalisierung im Yii2 einsetzt, erkläre ich in diesem Artikel.
Die Quellen
Yii2 benutzt sog. Message Categories, weshalb auch schon bei den Quellen darauf geachtet werden muss, dass man diese auch entsprechend einsetzt. Standardmäßig benutzt Yii2 im Beispiel die Kategorie „app“, man kann dies aber sehr simpel selbst viel sauberer kategorisieren, muss dies dann aber bei der Übersetzungs-Ausgabe beachten. Aber beginnen wir bei der Kategorisierung in den Quellen.
Die Gettext Übersetzung beginnt man in der Regel mit einer .pot Datei. Diese legt man in der Yii2 Basic App unter /messages/de_DE/messages.pot im Yii-Root ab (in der Advanced App jeweils unter /backend/messages/de_DE/messages.pot bzw. /frontend/messages/de_DE/messages.pot). Der Aufbau der messages.pot ist dann je Übersetzungs-String:
msgid ""
msgstr ""
msgctxt "app" # Die Kategorisierung
msgid "This is the original english string, {first_name}"
msgstr "Das ist der original deutsche String, {first_name}"
Wie man hier bereits sieht, muss man in der .pot Datei zusätzlich immer mit „msgctxt“ die Kategorie mit angegeben werden.
Verwendung der Internationalisierung in Yii2
Um die Internationalisierung im Yii2 Projekt benutzen zu können, muss die Translation-Engine mit in der /config/web.php (Advanced App: /backend/config/main.php bzw. /frontend/config/main.php) wie folgt aktiviert werden:
'components' => [
// ... andere Einstellungen
'i18n' => [
'translations' => [
'app*' => [
'class' => 'yii\i18n\GettextMessageSource',
'basePath' => '@app\messages', // @app zeigt auf Yii2-Base
'sourceLanguage' => 'en_US', // Standardsprache der Strings im Projekt
],
],
],
]
Um nun z.B. englische Original Strings im Projekt mit der deutschen Internationalisierung zu benutzen, muss man nun noch die aktiv genutzte Sprache instanzieren.
Ich mache dies in meinem BaseController, der von jedem Controller im Projekt abgeleitet wird. Mein BaseController sieht (einfach) wie folgt aus:
<?php
namespace components;
use Yii;
use yii\web\Controller;
class BaseController extends Controller
{
public function init()
{
parent::init();
\Yii::$app->language = 'de_DE';
// Natürlich muss dies hier in einem Live-Projekt noch mit einer
// Browser-Sprach-Weiche ersetzt werden. Aber dazu später.
}
}
Übrigens, wird die entsprechende Sprachdatei nicht gefunden, gibt es keine Fehlermeldung und das Projekt wird in der Quellsprache angezeigt. Hat man den Yii Debugger aktiviert, sieht man aber sehr wohl den Versuch die entsprechende Sprachdatei zu laden und den voraussichtlichen Fehlschlag inkl. Begründung im Log des Debuggers.
Sprach-Variablen in der View
In den View-Files kann man die Sprach-Variablen dann mittels der Kategorisierung auch wie folgt nutzen:
<?= Yii::t(
'app',
'This is the original english String, {first_name}',
['first_name' =&gt; $fist_name='Stefan']
);
?>
Das Array im dritten Parameter bezieht sich auf die Ersetzung von {first_name} zu den übergebenen Namen im String $first_name. Der erste Paramater „app“ bezieht sich auf die Kategorie und der zweite mittlere Teil ist der Original-String, welcher übersetzt werden soll. Ich benutze wie in der Standard-Installation von Yii den kurzen Parameter <?= für direkte Ausgabe, was aber ebenso auch mit <?php echo funktioniert.
Browserweiche implementieren
Da ich in jedem Projekt immer mit einem BaseController arbeite, von dem ich bei jedem Controller ableite, macht es auch durchaus Sinn, die Browserweiche für die Feststellung der Browsersprache dort hineinzupacken. Zudem definiere ich in den Params (Basic: config/params.php oder Advanced: common/config/params.php) die benutzte Standardsprache, die als Fallback ausgegeben werden sollen:
return [
'default_language' => 'de',
'available_languages' => ['de','en'],
];
Der BaseController sieht nun wie folgt aus (Basic: components/BaseController.php oder Advanced: common/componens/BaseController.php):
<?php
namespace components;
use Yii;
use yii\web\Controller;
class BaseController extends Controller
{
public function init() {
parent::init();
$this->_getBrowserLanguage();
}
private function _getBrowserLanguage() {
$preferredLang = Yii::$app->request->getPreferredLanguage(Yii::$app->params['available_languages']);
Yii::$app->language = !empty($preferredLang) ? $preferredLang : Yii::$app->params['default_language'];
}
}
Mit diesen simplen Implementierungen ist ein Yii2 Projekt sehr einfach Internationalisiert und mehrsprachig gemacht. Sicherlich gibt es noch detailliertere Implementierungen, mit diesem Artikel möchte ich allerdings eine grundsätzliche Übersicht über Internationalisierung von Yii2 Applikationen erklären, wozu dies vollkommen ausreicht.
In einem der nächsten Artikel erkläre ich, wie man ein eigenes Sprach-Umschalter Widget erstellt und einsetzen kann, damit der Besucher auch manuell die Sprache umstellen kann.
Wenn du Sprachdateien übersetzen willst, kannst du sehr einfach diese Lokalisierungsplattform benutzen: https://poeditor.com/
Hey super, danke für den Tipp!