Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, Hier werden die Vorteile von Yii erläutert und eine Übersicht über die Neuerungen in Yii 2.0, veröffentlicht am 12. Oktober 2014, gegeben.
In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des neu aktualisierten Yii2-Frameworks für PHP. Im ersten Teil haben wir Yii2 lokal eingerichtet, eine Hello World-Anwendung erstellt, einen Remote-Server eingerichtet und Github zur Bereitstellung unseres Codes verwendet. In Teil zwei haben wir erfahren, wie Yii seine Model View Controller-Architektur implementiert und wie Webseiten und Formulare erstellt werden, die Daten sammeln und validieren. In Teil drei haben wir die Datenbank- und Active Record-Funktionen von Yii verwendet, um die Codegenerierung für eine grundlegende Webanwendung zu automatisieren. Und in Teil vier haben wir gelernt, die Benutzerregistrierung zu integrieren.
In diesem Lernprogramm werde ich Ihnen zeigen, wie Sie die integrierte I18n-Internationalisierungsunterstützung von Yii verwenden können, um Ihre Anwendung für die Übersetzung in eine Reihe von Sprachen vorzubereiten.
Für diese Beispiele stellen wir uns weiterhin vor, dass wir ein Framework für die Veröffentlichung einfacher Statusaktualisierungen erstellen, z. unser eigenes Mini-Twitter.
Laut Wikipedia ist I18n ein Numeronym für Internationalisierung:
18 steht für die Anzahl der Buchstaben zwischen dem ersten ich und zuletzt n im Internationalisierung, eine an DEC in den 70er oder 80er Jahren geprägte Verwendung.
Bei I18n werden alle Textzeichenfolgen, die dem Benutzer aus der Anwendung angezeigt werden, durch Funktionsaufrufe ersetzt, die übersetzte Zeichenfolgen für jede vom Benutzer ausgewählte Sprache dynamisch laden können.
Beim Erstellen einer Webanwendung ist es hilfreich, von Anfang an global zu denken. Muss Ihre App für Benutzer aus verschiedenen Ländern in anderen Sprachen arbeiten? Wenn ja, wird die Implementierung von I18n von Anfang an später viel Zeit und Kopfschmerzen sparen.
In unserem Fall bietet das Yii Framework integrierte Unterstützung für I18n, sodass die Unterstützung für I18n relativ einfach ist.
I18n ersetzt alle Verweise auf Text, die dem Benutzer angezeigt werden, durch Funktionsaufrufe, die bei Bedarf eine Übersetzung bereitstellen.
Beispielsweise sehen die Attributfeldnamen im Statusmodell vor I18n aus:
public function attributeLabels () return ['id' => 'ID', 'message' => 'Message', 'permissions' => 'permissions', 'created_at' => 'Created At', 'updated_at' => 'Aktualisiert am', ];
Die Bereitstellung übersetzter Versionen des Codes würde sehr kompliziert werden. Nicht-technische Übersetzer müssten Code an Ort und Stelle übersetzen, was wahrscheinlich zu einer Brechung der Syntax führt.
So sieht der gleiche Code mit I18n aus:
public function attributeLabels () return ['id' => Yii :: t ('app', 'ID'), 'message' => Yii :: t ('app', 'Message'), 'permissions' = > Yii :: t ('app', 'Permissions'), 'created_at' => Yii :: t ('app', 'Created at'), 'updated_at' => Yii :: t ('app', ' Aktualisiert am'), ];
Yii: t ()
ist ein Funktionsaufruf, der die aktuell ausgewählte Sprache überprüft und die entsprechende übersetzte Zeichenfolge anzeigt. Das "App"
Parameter bezieht sich auf einen Abschnitt unserer Anwendung. Übersetzungen können optional nach verschiedenen Kategorien organisiert werden. Wo erscheinen diese übersetzten Zeichenketten??
Die Standardsprache, in diesem Fall Englisch, wird wie oben gezeigt in den Code geschrieben. Sprachressourcendateien sind Listen von Arrays von Strings, deren Schlüssel der Standardsprachentext ist, z. 'Botschaft'
oder "Berechtigungen"
-und jede Datei enthält übersetzte Textwerte für die entsprechende Sprache.
Hier ist ein Beispiel unserer vollständigen spanischen Übersetzungsdatei, Sprachcode "es". Das Yii: t ()
Funktion verwendet diese Datei, um die entsprechende anzuzeigende Übersetzung zu finden:
'Comience con Yii', 'Heading' => 'título', 'Meine Yii-Anwendung' => 'Mi aplicación Yii', 'Yii-Dokumentation' => 'Yii Documentación', 'Yii-Erweiterungen' => 'Extensiones Yii', 'Yii Forum' => 'Yii Foro', 'Möchten Sie dieses Element wirklich löschen?' => "Seguro que quieres borrar este artículo?", "Glückwunsch!" => '¡Enhorabuena!', 'Create' => 'Crear', 'Create modelClass' => 'Crear modelClass', 'Erstellt am' => 'Creado el', 'Delete' => 'Borrar ',' ID '=>' identificación ',' Lorem ipsum dolor sitzen amet, consectetur adipisicing elit, sed tun eiusmod tempor incididunt ut labore und dolore magna aliqua. Ut enim ad minim veniy, quis nostrud ausüben ullamco laboris nisi ut aliquip ex a commodo follat. Duis aute irure dolor in reprehenderit in voluptate veliss esse cillum dolore eu fugiat nulla pariatur. => 'Lorem ipsum dolor sitzen amet, consectetur adipisicing elit, hat keinen zeitlichen Einfluss auf das Leben und den Tod von Aliqua. Ut enim ad minim, nostrud quis ullamco Übung nisi ut laboris aliquip commodo ex ea follat. Duis Aute irre dolor en reprehenderit en voluptate und voluptate cillum dolore eu nulla fugiat pariatur. ',' Message '=>' mensaje ',' Permissions '=>' Permisos ',' Reset '=>' rejustar ',' Search '= > 'búsqueda', 'Status' => 'Los estados', 'Update' => 'actualización', 'Update modelClass:' => 'actualización modelClass:', 'Aktualisiert um' => 'Actualizado A ',' Sie haben Ihre Yii-basierte Anwendung erfolgreich erstellt. ' => 'Ha creado su aplicación Yii con alimentación.',];
Während dies zeitaufwändig erscheint, bietet Yii Skripts an, um die Erzeugung und Organisation dieser Dateivorlagen zu automatisieren.
Indem wir den Text vom Code trennen, erleichtern wir es nicht-technischen mehrsprachigen Experten, unsere Anwendungen für uns zu übersetzen, ohne den Code zu verletzen.
I18n bietet auch spezialisierte Funktionen zum Übersetzen von Zeit, Währung, Plurals ua an. Ich werde in diesem Tutorial nicht ins Detail gehen.
Leider ist die Yii2-Dokumentation für I18n noch nicht sehr beschreibend und es war schwierig, Schritt für Schritt funktionierende Beispiele zu finden. Zum Glück für Sie, ich werde Sie durch das führen, was ich durch das Durchsuchen der Dokumente und des Internets gelernt habe. Ich fand das I18n-Beispiel von The Code Ninja und den endgültigen Leitfaden für Yii2 auf I18n hilfreich, und Yii-Mitarbeiter Alexander Makarov bot mir auch Unterstützung an.
Wir verwenden die Yii2-Basisanwendungsvorlage für unsere Demonstrationsanwendung. Damit liegt unsere Codebasis unter der /Hallo
Wurzelverzeichnis. Yii's Konfigurationsdateien in / hallo / config / *
werden geladen, wenn Seitenanfragen gestellt werden. Wir werden Yiis I18n-Nachrichtenskripte verwenden, um eine Konfigurationsdatei für I18n im zu erstellen common / config
Pfad.
Von unserer Codebase-Wurzel aus werden wir die Yii ausführen Nachricht / Konfig
Skript:
./ yii message / config @ app / config / i18n.php
Dies erzeugt die folgende Dateivorlage, die wir anpassen können:
__DIR__, // Array, erforderlich, Liste der Sprachcodes, in die // die extrahierten Nachrichten übersetzt werden sollen. Zum Beispiel ['zh-CN', 'de']. 'languages' => ['de'], // string, der Name der Funktion zum Übersetzen von Nachrichten. // Standardeinstellung ist "Yii :: t". Dies wird als Markierung verwendet, um die // zu übersetzenden Nachrichten zu finden. Sie können eine Zeichenfolge für einen einzelnen Funktionsnamen oder ein Array für // mehrere Funktionsnamen verwenden. 'translator' => 'Yii :: t', // Boolean: Gibt an, ob Nachrichten beim Zusammenführen neuer Nachrichten nach Schlüsseln // mit den vorhandenen Nachrichten sortiert werden sollen. Der Standardwert ist false, dh die neuen (nicht übersetzten) // Nachrichten werden von den alten (übersetzten) Nachrichten getrennt. 'sort' => false, // boolean, ob Nachrichten entfernt werden sollen, die nicht mehr im Quellcode enthalten sind. // Der Standardwert ist "false". Dies bedeutet, dass jede dieser Nachrichten mit einem @ @ "- Paar versehen wird. 'removeUnused' => false, // Array, Liste der Muster, die angeben, welche Dateien / Verzeichnisse NICHT verarbeitet werden sollen. // Wenn leer oder nicht festgelegt, werden alle Dateien / Verzeichnisse verarbeitet. // Ein Pfad stimmt mit einem Muster überein, wenn er am Ende die Musterzeichenfolge enthält. // '/ a / b' z. B. passt zu allen Dateien und Verzeichnissen, die mit '/ a / b' enden. // Die '* .svn'-Datei stimmt mit allen Dateien und Verzeichnissen überein, deren Name mit' .svn 'endet. // und ".svn" werden mit allen Dateien und Verzeichnissen übereinstimmen, die genau ".svn" heißen. // Beachten Sie, dass die '/' - Zeichen in einem Muster mit '/' und '\' übereinstimmen. // Weitere Informationen zu Pattern-Matching-Regeln finden Sie unter Hilfe / FileHelper :: findFiles (). 'only' => ['* .php'], // Array, Liste der Muster, die angeben, welche Dateien (keine Verzeichnisse) verarbeitet werden sollen. // Wenn leer oder nicht festgelegt, werden alle Dateien verarbeitet. // Einzelheiten zu den Mustern finden Sie unter "außer". // Wenn eine Datei / ein Verzeichnis mit einem Muster in "nur" und "außer" übereinstimmt, wird es NICHT verarbeitet. 'except' => ['.svn', '.git', '.gitignore', '.gitkeep', '.hgignore', '.hgkeep', '/ messages' ']], //' php ' dient zum Speichern von Nachrichten in PHP-Dateien. 'format' => 'php', // Wurzelverzeichnis mit Nachrichtenkonvertierungen. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'messages', // boolean, ob die Nachrichtendatei mit den zusammengeführten Nachrichten überschrieben werden soll 'overwrite' => true, / * // Das Ausgabeformat 'db' dient zum Speichern von Nachrichten in der Datenbank. 'format' => 'db', // zu verwendende Verbindungskomponente. Wahlweise. 'db' => 'db', // Benutzerdefinierte Quellnachrichtentabelle. Wahlweise. // 'sourceMessageTable' => '% source_message', // benutzerdefinierter Name für die Tabelle der Übersetzungsnachrichten. Wahlweise. // 'messageTable' => '% message', * / / * // Das Ausgabeformat 'po' dient zum Speichern von Nachrichten in gettext-po-Dateien. 'format' => 'po', // Wurzelverzeichnis mit Nachrichtenkonvertierungen. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR. 'messages', // Name der Datei, die für die Übersetzung verwendet wird. 'catalog' => 'messages', // boolean, ob die Nachrichtendatei mit den zusammengeführten Nachrichten überschrieben werden soll 'overwrite' => true, * /];
Ich passe die Datei wie folgt an. ich bewege messagePath
nach oben und anpassen Quellpfad
und messagePath
. Ich gebe auch die Sprachen an, die mein Antrag neben Englisch unterstützen soll - in diesem Fall Spanisch (es), Deutsch (de), Italienisch (it) und Japanisch (ja). Hier ist eine Liste aller I18n-Sprachcodes.
__DIR__. DIRECTORY_SEPARATOR. '…', // Wurzelverzeichnis mit Nachrichtenkonvertierungen. 'messagePath' => __DIR__. DIRECTORY_SEPARATOR '...'. DIRECTORY_SEPARATOR. 'messages', // array, required, Liste der Sprachcodes, in die // die extrahierten Nachrichten übersetzt werden sollen. Zum Beispiel ['zh-CN', 'de']. 'languages' => ['de', 'es', 'it', 'ja'], // string, der Name der Funktion zum Übersetzen von Nachrichten. // Standardeinstellung ist "Yii :: t". Dies wird als Markierung verwendet, um die // zu übersetzenden Nachrichten zu finden. Sie können eine Zeichenfolge für einen einzelnen Funktionsnamen oder ein Array für // mehrere Funktionsnamen verwenden. 'translator' => 'Yii :: t',
Im nächsten Schritt führen wir das Extraktionsskript von Yii aus, das den gesamten Code in der Quellpfad
Baum, um Standard-String-Dateien für alle in unserem Code verwendeten Labels zu generieren. Ich passe an Quellpfad
um den gesamten Codebaum zu scannen. Ich passe an messagePath
um die resultierenden Dateien in zu erzeugen common / messages
.
./ yii message / extract @ app / config / i18n.php
Sie werden sehen, wie Yii alle Ihre Codedateien überprüft:
Nachrichten aus /Users/Jeff/Sites/hello/views/layouts/main.php… extrahieren Nachrichten aus /Users/Jeff/Sites/hello/views/site/about.php… extrahieren Nachrichten aus / Users / Jeff / Sites / extrahieren hallo / views / site / contact.php… Nachrichten von /Users/Jeff/Sites/hello/views/site/error.php… extrahieren Nachrichten von /Users/Jeff/Sites/hello/views/site/index.php… extrahieren Nachrichten von /Users/Jeff/Sites/hello/views/site/login.php… extrahieren Nachrichten von /Users/Jeff/Sites/hello/views/site/say.php… extrahieren Nachrichten von / Users / Jeff / Sites / extrahieren hallo / views / status / _form.php… Extrahieren von Nachrichten aus /Users/Jeff/Sites/hello/views/status/_search.php… Extrahieren von Nachrichten aus /Users/Jeff/Sites/hello/views/status/create.php… Nachrichten aus /Users/Jeff/Sites/hello/views/status/index.php… extrahieren Nachrichten aus /Users/Jeff/Sites/hello/views/status/update.php… extrahieren Nachrichten aus / Users / Jeff / Sites / extrahieren hallo / views / status / view.php… Nachrichten aus / Users / Je extrahieren ff / Sites / hallo / web / index-test.php… Nachrichten aus /Users/Jeff/Sites/hello/web/index.php… extrahieren
Wenn der Vorgang abgeschlossen ist, sehen Sie in Ihrer Codebase etwas Ähnliches:
In der allgemeinen Konfigurationsdatei, /hello/config/web.php
, Wir werden Yii von unserer neuen Sprachunterstützung berichten. Ich werde Spanisch zu meiner Standardsprache machen:
'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log'], 'language' => 'es', // spanische 'components' => [
Aber es gibt noch mehr zu tun. Wir müssen unseren Code I18n darauf aufmerksam machen.
Im dritten Teil dieser Serie haben wir die Datenbank- und Aktiv-Record-Funktion von Yii verwendet, um die Codegenerierung zu automatisieren. Wir haben I18n jedoch nicht aktiviert, sodass in unserem gesamten Code Textzeichenfolgen eingebettet waren. Lass uns das nochmal wiederholen.
Wir kehren zu Gii zurück, wahrscheinlich http: // localhost: 8888 / hello / gii, und führen die Modell- und Controller-Generatoren mit aktiviertem I18n erneut aus.
Hier ein Beispiel zum Generieren des Meeting-Modellcodes mit aktiviertem I18n. Beachten Sie, dass wir angeben "app" für unsere Nachrichtenkategorie. Wir platzieren alle unsere Textzeichenfolgen in einer App-Kategoriedatei.
Machen wir dasselbe bei der CRUD-Generierung für Controller und Views:
Wenn Sie den generierten Code in Modellen, Controllern und Ansichten durchsuchen, werden die Textzeichenfolgen durch die ersetzt Yii: t ("app",…)
Funktion:
title = Yii :: t ('app', 'Status'); $ this-> params ['breadcrumbs'] [] = $ this-> title; ?>= Html::encode($this->Titel)?>
Rendern ('_ search', ['model' => $ searchModel]); ?>= Html::a(Yii::t('app', 'Create modelClass', [ 'modelClass' => 'Status',]), ['create'], ['class' => 'btn btn-success'])?>
= GridView::widget([ 'dataProvider' => $ dataProvider, 'filterModel' => $ searchModel, 'Spalten' => [['class' => 'yii \ grid \ SerialColumn'], 'id', 'message: ntext', 'permissions', 'created_at', 'updated_at', ['class' => 'yii \ grid \ ActionColumn'],],]); ?>
Da wir in unserer Anwendung eine Reihe von Ansichten manuell oder in HTML generieren, müssen Sie diese manuell in I18n konvertieren. Zum Beispiel unsere Navigationsleiste in /views/layouts/main.php
und unsere Homepage in /views/site/index.php
beide müssen von Hand bearbeitet werden.
Hier ist die Navigationsleiste vor I18n:
NavBar :: begin (['brandLabel' => 'Mein Unternehmen'), 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' => 'navbar-invers navbar-fixed-top ',],]); $ navItems = [['label' => 'Home', 'url' => ['/ site / index']], ['label' => 'Status', 'url' => ['/ status / index ']], [' label '=>' About ',' url '=> [' / site / about ']], [' label '=>' Kontakt ',' url '=> [' / site / contact ']]]; if (Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => 'Anmelden', 'url' => ['/ user / login']]], ['label' => 'Anmelden', 'url' => ['/ user / register']])); else array_push ($ navItems, ['label' => 'Logout ('. Yii :: $ app-> user-> identity-> benutzername. ')', 'url' => ['/ site / logout' ], 'linkOptions' => ['data-method' => 'post']]); echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: end ();
Hier ist die Navigationsleiste nach I18n:
NavBar :: begin (['brandLabel' => Yii :: t ('app', 'Mein Unternehmen')), 'brandUrl' => Yii :: $ app-> homeUrl, 'options' => ['class' = > 'navbar-invers navbar-fixed-top',],]); $ navItems = [['label' => Yii :: t ('app', 'Home'), 'url' => ['/ site / index']], ['label' => Yii :: t ( 'app', 'Status'), 'url' => ['/ status / index']], ['label' => Yii :: t ('app', 'About'), 'url' => [ '/ site / about']], ['label' => Yii :: t ('app', 'Contact'), 'url' => ['/ site / contact']]]]; if (Yii :: $ app-> user-> isGuest) array_push ($ navItems, ['label' => Yii :: t ('app', 'Anmelden')), 'url' => ['/ user / login ']], [' label '=> Yii :: t (' app ',' Anmelden '),' url '=> [' / user / register ']])); else array_push ($ navItems, ['label' => Yii :: t ('app', 'Logout'). '('. Yii :: $ app-> user-> identity-> Benutzername. ')' , 'url' => ['/ site / logout'], 'linkOptions' => ['data-method' => 'post']]); echo Nav :: widget (['options' => ['class' => 'navbar-nav navbar-right'], 'items' => $ navItems,]); NavBar :: end ();
Hier ist ein Fragment des Homepage-Inhalts aus index.php, nachdem I18n - ein Großteil des HTML-Codes durch PHP-Aufrufe ersetzt wurde Yii :: t ()
:
= Yii::t('app','Congratulations!'); ?>
= Yii::t('app','You have successfully created your Yii-powered application.'); ?>
= Yii::t('app','Get started with Yii'); ?>
= Yii::t('app','Heading'); ?>
= Yii::t('app','Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'); ?>
= Yii::t('app','Yii Documentation') ?> »
Ihre Nachrichtendateien übersetzen
Schauen Sie sich unsere spanische Nachrichtendatei an,
/common/messages/es/frontend.php
. Es ist eine lange Liste leerer Array-Werte:return ['Über' => ", 'Kontakt' =>", 'Startseite' => ", 'Logout' =>", 'Mein Unternehmen' =>, 'Anmelden' => ", 'Anmelden' => ", 'Status' =>",…Für das Ausfüllen unserer Übersetzungen in spanisch für dieses Tutorial benutze ich Google Translate. Trickig, huh?
Anschließend werden wir diese Übersetzungen zurückschneiden und in die Nachrichtendatei einfügen.
return ['Über' => 'Acerca de', 'Contact' => 'Contacto', 'Home' => 'Home', 'Logout' => 'Salir', 'Mein Unternehmen' => 'Mi Empresa', 'Anmelden' => 'Entrar', 'Anmelden' => 'Registrarse', 'Status' => 'Estado',Wenn wir die Anwendungshomepage besuchen, sehen Sie die spanische Version?
Hier ist das Formular "Status erstellen":
Wenn ich wieder auf Englisch wechseln möchte, ändere ich nur die Konfigurationsdatei,
/config/web.php
, zurück zu Englisch:'basic', 'basePath' => dirname (__ DIR__), 'bootstrap' => ['log'], 'language' => 'de', // zurück zu englischen 'components' => [Wenn Sie fortfahren, werden Sie auch feststellen, dass das Ersetzen von Zeichenfolgen in JavaScript seine eigenen Komplexitäten hat. Ich habe es selbst nicht erforscht, aber die JsTrans-Erweiterung von Yii 1.x kann eine nützliche Richtlinie dafür sein.
Mit I18n weiter
Letztendlich möchten wir vielleicht unsere Anwendung in eine Reihe von Sprachen übersetzen. Ich habe ein neues Tutorial namens "Google Translate API" zum Lokalisieren Ihrer I18n-App (Tuts +) geschrieben, das Ihre Anwendung automatisch in verschiedene Sprachen übersetzt. Wenn es noch nicht veröffentlicht ist, wird es bald veröffentlicht (siehe meine Ausbilderseite). Natürlich liefert dies nur Basisübersetzungen. Möglicherweise möchten Sie professionelle Übersetzer einstellen, um die Dateien anschließend anzupassen.
In einigen Anwendungen können Benutzer ihre Muttersprache auswählen, sodass die Benutzeroberfläche beim Anmelden automatisch für sie übersetzt wird. In Yii die Einstellung von
$ app-> Sprache
Variable macht das:\ Yii :: $ app-> language = 'es';
Andere Anwendungen wie JScrambler.com verwenden den URL-Pfad, um die Sprache zu wechseln. Der Benutzer klickt einfach das gewünschte Sprachpräfix an, z. "FR", und die App wird automatisch übersetzt:
Hinweis: Lesen Sie meine aktuelle Einführung zu JScrambler, um mehr zu erfahren-Es ist ein ziemlich nützlicher Dienst.
Yiis URL Manager kann diese Art von Funktionalität ebenfalls bereitstellen. Ich werde diese Funktionen wahrscheinlich in einem zukünftigen Tutorial dieser Yii2-Serie implementieren, wenn ich mich auf Routing konzentriere.
Was kommt als nächstes?
Ich hoffe, Sie sind begeistert von der Leistungsfähigkeit von I18n und den Vorteilen der Verwendung des Yii-Frameworks gegenüber Vanilla PHP. Achten Sie auf kommende Tutorials in unserer Programmierserie Yii2.
Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite. Meine Ausbilderseite enthält alle Artikel dieser Serie, sobald sie veröffentlicht sind. Sie können mich auch per E-Mail auf meiner Lookahead Consulting-Website senden.
ähnliche Links
- Yii Framework-Website
- Einführung in das Yii-Framework (Tuts +)
- Verwendung der Google Translate-API zur Lokalisierung Ihrer I18n-App (Tuts +)
- Aufbau Ihres Startups mit PHP: Lokalisierung mit I18n (Tuts +)
- Weitere kostenlose und Open Source Yii-Entwicklerbeispiele durch den Kursleiter