1. Code
  2. PHP
  3. Yii

Erstellen Sie Ihr Startup mit PHP: Lokalisierung mit I18n

Dies ist Teil vier der Erstellung Ihrer Startup mit PHP-Serie auf Tuts+. In dieser Serie führe ich Sie durch die Einführung eines Startups von der Idee zur Realität, indem ich meine Meeting Planner-App als ein Beispiel aus dem echten Leben benutze. Bei jedem Schritt veröffentlichen wir den Meeting-Planer-Code als Open-Source-Beispiele, von denen Sie lernen können. Wir werden auch start-up-geschäftliche Probleme behandeln, wie sie entstehen.
Scroll to top
This post is part of a series called Building Your Startup With PHP.
Building Your Startup With PHP: Geolocation and Google Places
Building Your Startup: Access Control, Active Record Relations and Slugs

German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Dies ist Teil vier der Erstellung Ihrer Startup mit PHP-Serie auf Tuts+. In dieser Serie führe ich Sie durch die Einführung eines Startups von der Idee zur Realität, indem ich meine Meeting Planner-App als ein Beispiel aus dem echten Leben benutze. Bei jedem Schritt veröffentlichen wir den Meeting-Planer-Code als Open-Source-Beispiele, von denen Sie lernen können. Wir werden auch start-up-geschäftliche Probleme behandeln, wie sie entstehen.

In diesem Tutorial wollte ich einen Schritt zurückgehen und der Internationalisierungsunterstützung I18n zu unserer Anwendung hinzufügen, bevor wir mehr und mehr Code erstellen. Laut Wikipedia ist I18n ein Numeronym:

18 steht für die Anzahl der Buchstaben zwischen dem ersten i und letzten n in der Internationalisierung, eine Verwendung, die bei DEC in den 1970er oder 80er Jahren geprägt wurde.

Mit I18n werden alle Textzeichenfolgen, die dem Benutzer aus der Anwendung angezeigt werden, durch Funktionsaufrufe ersetzt, die übersetzte Zeichenfolgen für jede Sprache, die der Benutzer auswählt, dynamisch laden können.

Der gesamte Code für Meeting Planner ist in das Yii2 Framework für PHP geschrieben, das integrierte Unterstützung für I18n bietet. Wenn du mehr über Yii2 erfahren möchtest, schau dir unsere Parallel-Serie Programmierung mit Yii2 bei Tuts + an.

Nur zur Erinnerung, ich nehme an den Kommentarthreads unten teil. Ich bin besonders interessiert, wenn Sie unterschiedliche Ansätze oder zusätzliche Ideen haben oder Themen für zukünftige Tutorials vorschlagen möchten.

Die Ziele der Internationalisierung

Beim Erstellen eines Startups ist es hilfreich, von Anfang an global zu denken - aber nicht immer. Alternativ kann es sinnvoll sein, sich nur auf den Aufbau für Ihren lokalen Markt zu konzentrieren. Muss Ihr minimal funktionsfähiges Produkt in anderen Sprachen für Benutzer aus verschiedenen Ländern funktionieren?

In unserem Fall bietet das Yii Framework eine integrierte Unterstützung für I18n, so dass es relativ einfach ist, Unterstützung für I18n von Anfang an aufzubauen - und zeitaufwändig, um es später hinzuzufügen.

Wie funktioniert I18n?

I18n arbeitet, indem er alle Verweise auf dem Benutzer angezeigten Text durch Funktionsaufrufe ersetzt, die bei Bedarf eine Übersetzung bereitstellen.

Im Folgenden sehen Sie beispielsweise, wie die Attributfeldnamen im Place-Modell vor I18n aussehen:

1
public function attributeLabels()
2
{
3
    return [
4
      'id' => 'ID',
5
       'name' => 'Name',
6
       'place_type' => 'Place Type',
7
       ...

Die Bereitstellung übersetzter Versionen des Codes würde sehr kompliziert werden. Nicht-technische Übersetzer müssten Code an Ort und Stelle umsetzen, was wahrscheinlich die Syntax sprengt.

Hier ist, wie der gleiche Code mit I18n aussieht:

1
public function attributeLabels()
2
    {
3
        return [
4
          'id' => Yii::t('frontend', 'ID'),
5
           'name' => Yii::t('frontend', 'Name'),
6
           'place_type' => Yii::t('frontend', 'Place Type'),

Yii:t() ist ein Funktionsaufruf, der prüft, welche Sprache gerade ausgewählt ist und die entsprechende übersetzte Zeichenfolge anzeigt. "frontend" bezieht sich auf einen Abschnitt unserer Anwendung. Übersetzungen können optional nach verschiedenen Kategorien organisiert werden. Aber wo erscheinen diese übersetzten Strings?

Die Standardsprache, in diesem Fall Englisch, wird in den Code geschrieben, wie oben gezeigt. Sprachressourcendateien sind Listen von Arrays von Strings, deren Schlüssel der Standardsprachentext ist, z. "Ortstyp" - und jede Datei enthält übersetzte Textwerte für die entsprechende Sprache.

Hier ist ein Beispiel für unsere fertiggestellte spanische Übersetzungsdatei, Sprachcode "es". Die Yii:t() - Funktion verwendet diese Datei, um die passende anzuzeigende Übersetzung zu finden:

1
<?php
2
/**

3
 * Message translations.

4
 *

5
 * This file is automatically generated by 'yii message' command.

6
 * It contains the localizable messages extracted from source code.

7
 * You may modify this file by translating the extracted messages.

8
 *

9
 * Each array element represents the translation (value) of a message (key).

10
 * If the value is empty, the message is considered as not translated.

11
 * Messages that no longer need translation will have their translations

12
 * enclosed between a pair of '@@' marks.

13
 *

14
 * Message string can be used with plural forms format. Check i18n section

15
 * of the guide for details.

16
 *

17
 * NOTE: this file must be saved in UTF-8 encoding.

18
 */
19
return [
20
    'Add Current Location' => 'Agregar ubicación actual',
21
    'Add a Google {modelClass}' => 'Añadir un Google {modelClass}',
22
    'Created By' => 'Creado por',
23
    'Full Address' => 'Dirección completa',
24
    'Google Place ID' => 'Google Place ID',
25
    'Name' => 'Nombre',
26
    'Notes' => 'Notas',
27
    'Place Type' => 'Place Tipo',
28
    'Places' => 'Lugares',

Obwohl dies zeitaufwändig erscheint, stellt Yii Skripte zur Verfügung, um die Erstellung und Organisation dieser Dateien zu automatisieren.

Indem wir den Text vom Code trennen, erleichtern wir es nichttechnischen mehrsprachigen Experten, unsere Anwendungen für uns zu übersetzen - ohne den Code zu brechen.

I18n bietet auch spezielle Funktionen für die Übersetzung von Zeit, Währung, Plural und andere. Ich werde in diesem Tutorial nicht ins Detail gehen.

I18n-Unterstützung konfigurieren

Leider ist die Yii2-Dokumentation für I18n noch nicht sehr deskriptiv - und es war schwierig, funktionierende Schritt-für-Schritt-Beispiele zu finden. Zum Glück für Sie, ich werde Sie durch das, was ich gelernt habe, führen, indem ich die Dokumente und das Internet durchforste. Ich fand das I18n-Beispiel des Code Ninjas und den Yii2 Definitive Guide auf I18n hilfreich, und Yi-Mitarbeiter Alexander Makarov bot mir ebenfalls Hilfe an.

Generieren der I18n-Konfigurationsdatei

Wir verwenden die erweiterte Vorlage Yii2 für Meeting Planner. Dies erzeugt zwei Yii-Anwendungen in unserer Codebasis, Frontend und Backend. Und es schafft einen gemeinsamen Bereich für Modelle, die von beiden Anwendungen gemeinsam genutzt werden. Die Yii-Konfigurationsdateien werden immer dann geladen, wenn Seitenanforderungen gestellt werden. Wir werden die I18n-Nachrichtenskripte von Yii verwenden, um eine Konfigurationsdatei für I18n im common/config-Pfad zu erstellen.

Von unserem Codebasisstamm aus führen wir das Yii-Skript message/config aus:

1
 ./yii message/config @common/config/i18n.php

Dies erzeugt die folgende Dateivorlage, die wir anpassen können:

1
<?php
2
3
return [
4
    // string, required, root directory of all source files

5
    'sourcePath' => __DIR__,
6
    // array, required, list of language codes that the extracted messages

7
    // should be translated to. For example, ['zh-CN', 'de'].

8
    'languages' => ['de'],
9
    // string, the name of the function for translating messages.

10
    // Defaults to 'Yii::t'. This is used as a mark to find the messages to be

11
    // translated. You may use a string for single function name or an array for

12
    // multiple function names.

13
    'translator' => 'Yii::t',
14
    // boolean, whether to sort messages by keys when merging new messages

15
    // with the existing ones. Defaults to false, which means the new (untranslated)

16
    // messages will be separated from the old (translated) ones.

17
    'sort' => false,
18
    // boolean, whether to remove messages that no longer appear in the source code.

19
    // Defaults to false, which means each of these messages will be enclosed with a pair of '@@' marks.

20
    'removeUnused' => false,
21
    // array, list of patterns that specify which files/directories should NOT be processed.

22
    // If empty or not set, all files/directories will be processed.

23
    // A path matches a pattern if it contains the pattern string at its end. For example,

24
    // '/a/b' will match all files and directories ending with '/a/b';

25
    // the '*.svn' will match all files and directories whose name ends with '.svn'.

26
    // and the '.svn' will match all files and directories named exactly '.svn'.

27
    // Note, the '/' characters in a pattern matches both '/' and '\'.

28
    // See helpers/FileHelper::findFiles() description for more details on pattern matching rules.

29
    'only' => ['*.php'],
30
    // array, list of patterns that specify which files (not directories) should be processed.

31
    // If empty or not set, all files will be processed.

32
    // Please refer to "except" for details about the patterns.

33
    // If a file/directory matches both a pattern in "only" and "except", it will NOT be processed.

34
    'except' => [
35
        '.svn',
36
        '.git',
37
        '.gitignore',
38
        '.gitkeep',
39
        '.hgignore',
40
        '.hgkeep',
41
        '/messages',
42
    ],
43
44
    // 'php' output format is for saving messages to php files.

45
    'format' => 'php',
46
    // Root directory containing message translations.

47
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages',
48
    // boolean, whether the message file should be overwritten with the merged messages

49
    'overwrite' => true,
50
51
52
    /*

53
    // 'db' output format is for saving messages to database.

54
    'format' => 'db',

55
    // Connection component to use. Optional.

56
    'db' => 'db',

57
    // Custom source message table. Optional.

58
    // 'sourceMessageTable' => '{{%source_message}}',

59
    // Custom name for translation message table. Optional.

60
    // 'messageTable' => '{{%message}}',

61
    */
62
63
    /*

64
    // 'po' output format is for saving messages to gettext po files.

65
    'format' => 'po',

66
    // Root directory containing message translations.

67
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages',

68
    // Name of the file that will be used for translations.

69
    'catalog' => 'messages',

70
    // boolean, whether the message file should be overwritten with the merged messages

71
    'overwrite' => true,

72
    */
73
];

Ich passe meine Datei an. Ich verschiebe den messagePath nach oben und passe sourcePath und messagePath an. Ich gebe auch die Sprachen an, die meine Bewerbung neben Englisch unterstützen soll - in diesem Fall Spanisch und Deutsch, es und de. Hier ist eine Liste aller I18n Sprachcodes.

1
return [
2
    // string, required, root directory of all source files

3
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
4
    // Root directory containing message translations.

5
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages',
6
    // array, required, list of language codes that the extracted messages

7
    // should be translated to. For example, ['zh-CN', 'de'].

8
    'languages' => ['es','de'],

Im nächsten Schritt führen wir das Yi-Extrakt-Skript aus, das den gesamten Code in der sourcePath-Struktur scannt, um Standard-String-Dateien für alle in unserem Code verwendeten Labels zu generieren. Ich passe SourcePath an, um den gesamten Codebaum zu scannen. Ich passe messagePath an, um die resultierenden Dateien in common/messages zu generieren.

1
 ./yii message/extract @common/config/i18n.php

Sie sehen, dass Yii alle Ihre Code-Dateien scannt:

1
Extracting messages from /Users/Jeff/Sites/mp/frontend/models/Place.php...
2
Extracting messages from /Users/Jeff/Sites/mp/frontend/models/PlaceGPS.php...
3
Extracting messages from /Users/Jeff/Sites/mp/frontend/models/PlaceSearch.php...
4
Extracting messages from /Users/Jeff/Sites/mp/frontend/models/ResetPasswordForm.php...
5
Extracting messages from /Users/Jeff/Sites/mp/frontend/models/SignupForm.php...
6
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/layouts/main.php...
7
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/_form.php...
8
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/_search.php...
9
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/create.php...
10
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/index.php...
11
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/update.php...
12
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/view.php...
13
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_form.php...
14
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_formGeolocate.php...
15
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_formPlaceGoogle.php...
16
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_search.php...
17
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/create.php...
18
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/create_geo.php...
19
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/create_place_google.php...
20
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/index.php...
21
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/locate.php...
22
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/update.php...
23
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/view.php...
24
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/about.php...
25
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/contact.php...
26
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/error.php...
27
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/index.php...
28
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/login.php...
29
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/requestPasswordResetToken.php...
30
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/resetPassword.php...
31
Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/signup.php...
32
Extracting messages from /Users/Jeff/Sites/mp/frontend/web/index-test.php...
33
Extracting messages from /Users/Jeff/Sites/mp/frontend/web/index.php...
34
Extracting messages from /Users/Jeff/Sites/mp/frontend/widgets/Alert.php...

Wenn dies abgeschlossen ist, sehen Sie in Ihrer Codebasis Folgendes:

Meeting Planner I18n Message Files and PathsMeeting Planner I18n Message Files and PathsMeeting Planner I18n Message Files and Paths

Aktivieren von I18n und Auswählen einer Sprache

In der allgemeinen Konfigurationsdatei, common/config/main.php, werden wir Sie über unsere neue Sprachunterstützung informieren. Ich werde Spanisch zu meiner Standardsprache machen:

1
<?php
2
return [
3
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
4
    'language' => 'es', // spanish

5
    'components' => [
6
        'cache' => [
7
            'class' => 'yii\caching\FileCache',
8
        ],
9
        'i18n' => [
10
            'translations' => [
11
                'frontend*' => [
12
                    'class' => 'yii\i18n\PhpMessageSource',
13
                    'basePath' => '@common/messages',
14
                ],
15
                'backend*' => [
16
                    'class' => 'yii\i18n\PhpMessageSource',
17
                    'basePath' => '@common/messages',
18
                ],
19
            ],
20
        ],        
21
    ],
22
];

Aber es gibt noch mehr zu tun. Wir müssen unseren Code I18n bewusst machen.

Verwenden von Yii's Gii-Code-Generator mit I18n

Im zweiten Teil dieser Serie, Erstellen Sie Ihr Startup mit PHP: Featureanforderungen und Datenbankdesign, verwendeten wir den genialen Code-Generator Gii von Yii, um unsere Modelle, Controller und Ansichten zu generieren. Aber wir haben I18n nicht aktiviert, also alle unsere Code-eingebetteten Textstrings. Lass uns das wiederholen.

Wir kehren zu Gii, wahrscheinlich http://localhost:8888/mp/gii, in Ihrem Browser zurück und führen die Modell- und Controller-Generatoren mit aktiviertem I18n erneut aus.

Hinweis: Wenn Sie mit Teil drei unserer Serie Schritt gehalten haben, müssen Sie möglicherweise die Unterschiede zu jeder Datei beachten und den Code manuell verschieben. Oder es kann am einfachsten sein, den Code durch das Github-Repository für dieses Tutorial zu ersetzen, das oben rechts verlinkt ist.

Hier sehen Sie ein Beispiel für die Generierung des Meeting-Modellcodes mit aktiviertem I18n. Beachten Sie, dass wir "Frontend" für unsere Nachrichtenkategorie angeben. Wir platzieren alle unsere Frontend-Texte in einer Frontend-Kategorie.

Meeting Planner I18n Gii Model GeneratorMeeting Planner I18n Gii Model GeneratorMeeting Planner I18n Gii Model Generator

Lassen Sie uns dasselbe für die CRUD-Generierung für Controller und Views machen:

Meeting Planner I18n Message CRUD Generator with GiiMeeting Planner I18n Message CRUD Generator with GiiMeeting Planner I18n Message CRUD Generator with Gii

Wenn Sie den generierten Code in Modellen, Controllern und Ansichten durchsuchen, werden die Textstrings durch die Funktion Yii:t('frontend',...) ersetzt:

1
<?php
2
3
use yii\helpers\Html;
4
use yii\grid\GridView;
5
6
/* @var $this yii\web\View */
7
/* @var $searchModel frontend\models\PlaceSearch */
8
/* @var $dataProvider yii\data\ActiveDataProvider */
9
10
$this->title = Yii::t('frontend', 'Places');
11
$this->params['breadcrumbs'][] = $this->title;
12
?>
13
<div class="place-index">
14
15
    <h1><?= Html::encode($this->title) ?></h1>
16
    <?php // echo $this->render('_search', ['model' => $searchModel]); ?>

17
18
    <p>
19
         <?= Html::a(Yii::t('frontend', 'Create {modelClass}', [
20
           'modelClass' => 'Place',
21
        ]), ['create'], ['class' => 'btn btn-success']) ?>
22
        
23
        <?= Html::a(Yii::t('frontend','Add Current Location'), ['create_geo'], ['class' => 'btn btn-success']) ?> 
24
        <?= Html::a(Yii::t('frontend','Add a Google {modelClass}',[
25
           'modelClass' => 'Place'
26
        ]), ['create_place_google'], ['class' => 'btn btn-success']) ?> 
27
    </p>

Übersetzen Sie Ihre Nachrichtendateien

Sehen Sie sich unsere spanische Nachrichtendatei /common/messages/es/frontend.php an. Es ist eine lange Liste von leeren Array-Werten:

1
return [
2
    'Add Current Location' => '',
3
    'Add a Google {modelClass}' => '',
4
    'Are you sure you want to delete this item?' => '',
5
    'Create' => '',
6
    'Create {modelClass}' => '',
7
    'Created At' => '',
8
    'Created By' => '',
9
    'Delete' => '',
10
    'Full Address' => '',
11
    'Google Place ID' => '',
12
    'ID' => '',
13
    'Meeting Type' => '',
14
    'Meetings' => '',
15
    'Message' => '',
16
    'Name' => '',
17
    'Notes' => '',
18
    'Owner ID' => '',
19
    'Place Type' => '',
20
    'Places' => '',
21
    'Reset' => '',
22
    'Search' => '',
23
    'Slug' => '',
24
    'Status' => '',
25
    'Update' => '',
26
    'Update {modelClass}: ' => '',
27
    'Updated At' => '',
28
    'Vicinity' => '',
29
    'Website' => '',
30
];

Zum Ausfüllen unserer Übersetzungen in Spanisch für dieses Tutorial verwende ich Google Übersetzer. Tricky, nicht wahr?

Meeting Planner I18n Using Google Translator to Fill Message FilesMeeting Planner I18n Using Google Translator to Fill Message FilesMeeting Planner I18n Using Google Translator to Fill Message Files

Dann werden wir einige Ausschnitte mit diesen Übersetzungen in die Nachrichtendatei einfügen.

1
return [
2
    'Add Current Location' => 'Agregar ubicación actual',
3
    'Add a Google {modelClass}' => 'Añadir un Google {modelClass}',
4
    'Created By' => 'Creado por',
5
    'Full Address' => 'Dirección completa',
6
    'Google Place ID' => 'Google Place ID',
7
    'Name' => 'Nombre',
8
    'Notes' => 'Notas',
9
    'Place Type' => 'Place Tipo',
10
    'Places' => 'Lugares',
11
    'Slug' => 'Slug',
12
    'Vicinity' => 'Alrededores',
13
    'Website' => 'Sitio Web',
14
    'Are you sure you want to delete this item?' => '¿Estás seguro que quieres borrar este elemento?',
15
    'Create' => 'Crear',
16
    'Create {modelClass}' => 'Crear Lugar',
17
    'Created At' => 'Creado El',
18
    'Delete' => 'Eliminar',
19
    'ID' => 'ID',
20
    'Meeting Type' => 'Tipo de Reunión',
21
    'Meetings' => 'Encuentros',
22
    'Message' => 'Mensaje',
23
    'Owner ID' => 'Propietario ID',
24
    'Reset' => 'Reset',
25
    'Search' => 'Buscar',
26
    'Status' => 'Estado',
27
    'Update' => 'Actualizar',
28
    'Update {modelClass}: ' => 'Actualizar Lugar',
29
    'Updated At' => 'Actualización A',
30
];

Wenn wir die Place-Indexseite besuchen, sehen Sie die spanische Version - nett, oder?

Meeting Planner I18n Spanish Places Index PageMeeting Planner I18n Spanish Places Index PageMeeting Planner I18n Spanish Places Index Page

Beachten Sie, dass die Navigationsleiste auf Englisch bleibt. Dies liegt daran, dass das Nachrichten / Extrahieren-Skript die Bootstrap-Navigationsfelddefinitionen nicht übernommen und in Yii:t() konvertiert hat. Wir werden das mit der Hand machen. Beachten Sie auch, dass der Home- und Paging-Text automatisch übersetzt wurde. Die Codebasis von Yii enthält Sprachübersetzungen für diese Standardzeichenfolgen.

Hier ist das Create A Place-Formular:

Meeting Planner I18n Spanish Create a Place FormMeeting Planner I18n Spanish Create a Place FormMeeting Planner I18n Spanish Create a Place Form

Wenn ich zurück zu Englisch wechseln möchte, ändere ich einfach die Konfigurationsdatei, /common/main.php, zurück auf Englisch:

1
<?php
2
return [
3
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
4
    'language' => 'en', // english

5
//    'language' => 'es', // spanish
Meeting Planner Create a Place in EnglishMeeting Planner Create a Place in EnglishMeeting Planner Create a Place in English

Sie werden auch feststellen, dass das Ersetzen von Zeichenfolgen in JavaScript eine eigene Komplexität aufweist. Ich habe es selbst nicht erforscht, aber die Ysi 1.x JsTrans Erweiterung kann eine nützliche Richtlinie zur Unterstützung dieses liefern.

Mit I18n weiter gehen

Letztendlich möchten wir vielleicht unsere Anwendung in eine Reihe von Sprachen übersetzen. Ich habe eine Yii-Feature-Anfrage gesendet, um das Skript Nachricht/Extrahieren zu erweitern und die Google Translate-API zu verwenden, um diesen Prozess zu automatisieren. Ich habe Tuts + auch gebeten, mir ein Tutorial darüber schreiben zu lassen, also bleibt dran. Natürlich bietet dies nur eine Basisübersetzung. Vielleicht möchten Sie professionelle Übersetzer einstellen, um die Dateien anschließend abzustimmen.

Bei einigen Anwendungen können Benutzer ihre Muttersprache auswählen, sodass die Benutzeroberfläche bei der Anmeldung automatisch für sie übersetzt wird. In Yii wird die $app->language wie folgt gesetzt:

1
\Yii::$app->language = 'es';

Andere Anwendungen, wie JScrambler.com unten, nutzen den URL-Pfad, um die Sprache zu wechseln. Der Benutzer klickt einfach auf das gewünschte Sprachenpräfix, z. "FR", und die App wird automatisch übersetzt:

JScrambler Dynamic Language PathsJScrambler Dynamic Language PathsJScrambler Dynamic Language Paths

Hinweis: Sehen Sie sich meine Tuts+ Instructor-Seite für ein kommendes Tutorial über JScrambler an - es ist ein ziemlich nützlicher Service. Es könnte bereits erschienen sein, wenn Sie das lesen.

Yiis URL Manager kann diese Art von Funktionalität auch bereitstellen. Ich werde diese Funktionen für Meeting Planner wahrscheinlich in einem zukünftigen Tutorial implementieren.

Was kommt als nächstes?

Ich hoffe, Sie haben mit diesem Tutorial etwas Neues gelernt. Ich hatte früher I18n mit Rails benutzt - aber das war das erste Mal, dass ich es mit PHP implementiert habe. Achten Sie auf kommende Tutorials in unserer Building Your Startup With PHP-Reihe - es gibt viele lustige Features.

Fühlen Sie bitte sich frei, fügen Sie Ihre Fragen und Kommentare unten hinzu; Ich nehme generell an den Diskussionen teil. Sie können mich auch auf Twitter @reifman erreichen oder mir direkt eine E-Mail schicken.

verwandte Links