1. Code
  2. PHP
  3. Yii

Programmieren mit Yii2: Lokalisierung mit I18n

Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, das die Vorteile von Yii beschreibt und einen Überblick über die Neuerungen in Yii 2.0 enthält, das am 12. Oktober 2014 veröffentlicht wurde.
Scroll to top
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Integrating User Registration
How to Program With Yii2: User Access Controls

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

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

Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, das die Vorteile von Yii beschreibt und einen Überblick über die Neuerungen in Yii 2.0 enthält, das am 12. Oktober 2014 veröffentlicht wurde.

In dieser Programmierung mit Yii2-Serie führe ich die Leser in die Verwendung des neu aktualisierten Yii2-Frameworks für PHP ein. Im ersten Teil haben wir Yii2 lokal eingerichtet, eine Hello World-Anwendung erstellt, einen Remote-Server eingerichtet und Github zum Bereitstellen unseres Codes verwendet. In Teil zwei erfuhren wir, wie Yii die Model View Controller-Architektur implementiert und wie Webseiten und Formulare erstellt werden, mit denen Daten gesammelt und validiert werden. In Teil drei haben wir die Datenbank- und aktiven Aufzeichnungsfunktionen von Yii verwendet, um die Codegenerierung für eine grundlegende Webanwendung zu automatisieren. Im vierten Teil haben wir gelernt, wie man die Benutzerregistrierung integriert.

In diesem Tutorial werde ich Ihnen zeigen, wie Sie die integrierte I18n-Internationalisierungsunterstützung von Yii nutzen können, um Ihre Anwendung für die Übersetzung in eine Reihe von Sprachen vorzubereiten.

In diesen Beispielen stellen wir uns weiterhin vor, dass wir ein Framework für die Veröffentlichung einfacher Statusaktualisierungen erstellen, z. unser eigenes Mini-Twitter.

Was ist I18n?

Laut Wikipedia ist I18n ein Numeronym für Internationalisierung:

18 steht für die Anzahl der Buchstaben zwischen dem ersten i und dem 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, mit denen übersetzte Zeichenfolgen für jede vom Benutzer ausgewählte Sprache dynamisch geladen werden können.

Die Ziele der Internationalisierung

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 funktionieren? Wenn ja, spart Ihnen die Implementierung von I18n von Anfang an viel Zeit und später Kopfschmerzen.

In unserem Fall bietet das Yii-Framework eine integrierte Unterstützung für I18n, sodass es relativ einfach ist, die Unterstützung für I18n im Laufe der Zeit einzubauen.

Wie I18n funktioniert

I18n ersetzt alle Verweise auf Text, die dem Benutzer angezeigt werden, durch Funktionsaufrufe, die bei Bedarf eine Übersetzung bereitstellen.

So sehen beispielsweise die Attributfeldnamen im Statusmodell vor I18n aus:

1
public function attributeLabels()
2
{
3
    return [
4
      'id' => 'ID',
5
      'message' => 'Message',
6
      'permissions' => 'Permissions',
7
      'created_at' => 'Created At',
8
      'updated_at' => 'Updated At',        ];
9
}

Das Bereitstellen von den übersetzten Versionen des Codes würde sehr kompliziert werden. Nicht-technische Übersetzer müssten Code an Ort und Stelle übersetzen, was wahrscheinlich gegen die Syntax verstößt.

So sieht der gleiche Code mit I18n aus:

1
public function attributeLabels()
2
{
3
    return [
4
      'id' => Yii::t('app', 'ID'),
5
      'message' => Yii::t('app', 'Message'),
6
      'permissions' => Yii::t('app', 'Permissions'),
7
      'created_at' => Yii::t('app', 'Created At'),
8
      'updated_at' => Yii::t('app', 'Updated At'),        ];
9
}

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

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

Hier ist ein Beispiel unserer vollständigen spanischen Übersetzungsdatei, Sprachcode "es". Die Funktion Yii:t() verwendet diese Datei, um die entsprechende Übersetzung für die Anzeige zu finden:

1
<?php
2
/**

3
* Message translations.

4
*

5
* This file is automatically generated by 'yii translate' 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
    'Get started with Yii' => 'Comience con Yii',
21
    'Heading' => 'título',
22
    'My Yii Application' => 'Mi aplicación Yii',
23
    'Yii Documentation' => 'Yii Documentación',
24
    'Yii Extensions' => 'Extensiones Yii',
25
    'Yii Forum' => 'Yii Foro',
26
    'Are you sure you want to delete this item?' => '¿Seguro que quieres borrar este artículo?',
27
    'Congratulations!' => '¡Enhorabuena!',
28
    'Create' => 'crear',
29
    'Create {modelClass}' => 'crear {modelClass}',
30
    'Created At' => 'Creado el',
31
    'Delete' => 'borrar',
32
    'ID' => 'identificación',
33
    '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.' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit , sed no tempor eiusmod ut labore et dolore incididunt magna aliqua . Ut enim ad minim veniam , nostrud quis ullamco exercitation nisi ut laboris aliquip commodo ex ea consequat . Duis Aute Irure dolor en reprehenderit en voluptate velita esse cillum dolore eu nulla fugiat pariatur .',
34
    'Message' => 'mensaje',
35
    'Permissions' => 'Permisos',
36
    'Reset' => 'reajustar',
37
    'Search' => 'búsqueda',
38
    'Statuses' => 'Los estados',
39
    'Update' => 'actualización',
40
    'Update {modelClass}: ' => 'actualización {modelClass} :',
41
    'Updated At' => 'Actualizado A',
42
    'You have successfully created your Yii-powered application.' => 'Ha creado su aplicación Yii con alimentación.',
43
];

Während dies zeitaufwändig erscheint, stellt Yii Skripte zur Verfügung, um die Generierung und Organisation dieser Dateivorlagen zu automatisieren.

Indem wir den Text vom Code trennen, erleichtern wir nicht-technischen mehrsprachigen Experten die Übersetzung unserer Anwendungen für uns - ohne den Code zu beschädigen.

I18n bietet auch spezielle Funktionen für die Übersetzung von Zeit, Währung, Plural und anderen. Ich werde in diesem Tutorial nicht auf die Details eingehen.

I18n-Unterstützung konfigurieren

Leider ist die Yii2-Dokumentation für I18n noch nicht sehr aussagekräftig, und es war schwierig, schrittweise Beispiele zu finden. Zum Glück werde ich Sie durch das führen, was ich durch das Durchsuchen der Dokumente und des Webs gelernt habe. Ich fand das I18n-Beispiel von The Code Ninja und den Yii2 Definitive Guide für I18n hilfreich, und der Yii-Mitarbeiter Alexander Makarov bot mir ebenfalls Unterstützung an.

Generieren der I18n-Konfigurationsdatei

Wir verwenden die Yii2-Basisanwendungsvorlage für unsere Demonstrationsanwendung. Dadurch wird unsere Codebasis unter dem Stammverzeichnis /hello platziert. Die Konfigurationsdateien von Yii in /hello/config/* werden immer dann geladen, wenn Seitenanforderungen gestellt werden. Wir werden die I18n-Nachrichtenskripte von Yii verwenden, um eine Konfigurationsdatei für I18n im Pfad common/config zu erstellen.

In unserem Codebasis-Stammverzeichnis führen wir das Yii-message/config-Skript aus:

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

Dadurch wird die folgende Dateivorlage generiert, 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 die Datei an. Ich verschiebe messagePath nach oben und passe sourcePath und messagePath an. Ich gebe neben Englisch auch die Sprachen an, die meine Anwendung unterstützen soll - in diesem Fall Spanisch (es), Deutsch (de), Italienisch (it) und Japanisch (ja). Hier ist eine Liste aller I18n-Sprachcodes.

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

5
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR .'..',
6
    // Root directory containing message translations.

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

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

10
    'languages' => ['de','es','it','ja'],
11
    // string, the name of the function for translating messages.

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

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

14
    // multiple function names.

15
    'translator' => 'Yii::t',

Im nächsten Schritt führen wir das Extraktionsskript von Yii aus, das den gesamten Code im sourcePath-Baum scannt, um Standardzeichenfolgendateien für alle in unserem Code verwendeten Beschriftungen 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 @app/config/i18n.php

Sie werden sehen, wie Yii alle Ihre Codedateien scannt:

1
Extracting messages from /Users/Jeff/Sites/hello/views/layouts/main.php...
2
Extracting messages from /Users/Jeff/Sites/hello/views/site/about.php...
3
Extracting messages from /Users/Jeff/Sites/hello/views/site/contact.php...
4
Extracting messages from /Users/Jeff/Sites/hello/views/site/error.php...
5
Extracting messages from /Users/Jeff/Sites/hello/views/site/index.php...
6
Extracting messages from /Users/Jeff/Sites/hello/views/site/login.php...
7
Extracting messages from /Users/Jeff/Sites/hello/views/site/say.php...
8
Extracting messages from /Users/Jeff/Sites/hello/views/status/_form.php...
9
Extracting messages from /Users/Jeff/Sites/hello/views/status/_search.php...
10
Extracting messages from /Users/Jeff/Sites/hello/views/status/create.php...
11
Extracting messages from /Users/Jeff/Sites/hello/views/status/index.php...
12
Extracting messages from /Users/Jeff/Sites/hello/views/status/update.php...
13
Extracting messages from /Users/Jeff/Sites/hello/views/status/view.php...
14
Extracting messages from /Users/Jeff/Sites/hello/web/index-test.php...
15
Extracting messages from /Users/Jeff/Sites/hello/web/index.php...

Wenn der Vorgang abgeschlossen ist, wird in Ihrer Codebasis Folgendes angezeigt:

Yii2 Localization with I18n Directory PathsYii2 Localization with I18n Directory PathsYii2 Localization with I18n Directory Paths

I18n aktivieren und Sprache auswählen

In der allgemeinen Konfigurationsdatei /hello/config/web.php werden wir Yii über unsere neue Sprachunterstützung informieren. Ich werde Spanisch zu meiner Standardsprache machen:

1
<?php
2
3
$params = require(__DIR__ . '/params.php');
4
5
$config = [
6
    'id' => 'basic',
7
    'basePath' => dirname(__DIR__),
8
    'bootstrap' => ['log'],
9
    'language'=>'es', // spanish

10
    'components' => [

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

Verwenden des Gii-Code-Generators von Yii mit I18n

In Teil drei dieser Serie haben wir die Datenbank- und aktiven Aufzeichnungsfunktionen von Yii verwendet, um die Codegenerierung zu automatisieren. Wir haben I18n jedoch nicht aktiviert, sodass in unseren gesamten Code Textzeichenfolgen eingebettet waren. Lassen Sie uns das wiederholen.

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

Hier ist ein Beispiel für das Generieren des Meeting-Modellcodes bei aktiviertem I18n. Beachten Sie, dass wir "app" für unsere Nachrichtenkategorie angeben. Wir platzieren alle unsere Textzeichenfolgen in einer App-Kategoriedatei.

Yii2 Gii Code Generator Status Model for I18nYii2 Gii Code Generator Status Model for I18nYii2 Gii Code Generator Status Model for I18n

Machen wir dasselbe für die CRUD-Generierung für Controller und Ansichten:

Yii2 Gii Code Generator for Status CRUD With I18nYii2 Gii Code Generator for Status CRUD With I18nYii2 Gii Code Generator for Status CRUD With I18n

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

1
<?php
2
3
use yii\helpers\Html;
4
use yii\grid\GridView;
5
6
/* @var $this yii\web\View */
7
/* @var $searchModel app\models\StatusSearch */
8
/* @var $dataProvider yii\data\ActiveDataProvider */
9
10
$this->title = Yii::t('app', 'Statuses');
11
$this->params['breadcrumbs'][] = $this->title;
12
?>
13
<div class="status-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('app', 'Create {modelClass}', [
20
    'modelClass' => 'Status',
21
]), ['create'], ['class' => 'btn btn-success']) ?>
22
    </p>
23
24
    <?= GridView::widget([
25
        'dataProvider' => $dataProvider,
26
        'filterModel' => $searchModel,
27
        'columns' => [
28
            ['class' => 'yii\grid\SerialColumn'],
29
30
            'id',
31
            'message:ntext',
32
            'permissions',
33
            'created_at',
34
            'updated_at',
35
36
            ['class' => 'yii\grid\ActionColumn'],
37
        ],
38
    ]); ?>
39
40
</div>

Statische Ansichten I18n bereit machen

Da wir in unserer Anwendung eine Reihe von Ansichten von Hand oder in HTML generieren, müssen wir diese manuell konvertieren, um I18n zu verwenden. Beispielsweise müssen unsere Navigationsleiste in /views/layouts/main.php und unsere Homepage in /views/site/index.php von Hand bearbeitet werden.

Hier ist die Navigationsleiste vor I18n:

1
NavBar::begin([
2
                'brandLabel' => 'My Company',
3
                'brandUrl' => Yii::$app->homeUrl,
4
                'options' => [
5
                    'class' => 'navbar-inverse navbar-fixed-top',
6
                ],
7
            ]);
8
            $navItems=[
9
                ['label' => 'Home', 'url' => ['/site/index']],
10
                ['label' => 'Status', 'url' => ['/status/index']],
11
                ['label' => 'About', 'url' => ['/site/about']],
12
                ['label' => 'Contact', 'url' => ['/site/contact']]
13
              ];
14
              if (Yii::$app->user->isGuest) {
15
                array_push($navItems,['label' => 'Sign In', 'url' => ['/user/login']],['label' => 'Sign Up', 'url' => ['/user/register']]);
16
              } else {
17
                array_push($navItems,['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
18
                    'url' => ['/site/logout'],
19
                    'linkOptions' => ['data-method' => 'post']]
20
                );
21
              }
22
            echo Nav::widget([
23
                'options' => ['class' => 'navbar-nav navbar-right'],
24
                'items' => $navItems,
25
            ]);
26
            NavBar::end();

Hier ist die Navigationsleiste nach I18n:

1
NavBar::begin([
2
    'brandLabel' => Yii::t('app', 'My Company'),
3
    'brandUrl' => Yii::$app->homeUrl,
4
    'options' => [
5
        'class' => 'navbar-inverse navbar-fixed-top',
6
    ],
7
]);
8
$navItems=[
9
    ['label' =>  Yii::t('app', 'Home'), 'url' => ['/site/index']],
10
    ['label' => Yii::t('app','Status'), 'url' => ['/status/index']],
11
    ['label' => Yii::t('app','About'), 'url' => ['/site/about']],
12
    ['label' => Yii::t('app','Contact'), 'url' => ['/site/contact']]
13
  ];
14
  if (Yii::$app->user->isGuest) {
15
    array_push($navItems,['label' => Yii::t('app','Sign In'), 'url' => ['/user/login']],['label' => Yii::t('app','Sign Up'), 'url' => ['/user/register']]);
16
  } else {
17
    array_push($navItems,['label' => Yii::t('app','Logout').' (' . Yii::$app->user->identity->username . ')',
18
        'url' => ['/site/logout'],
19
        'linkOptions' => ['data-method' => 'post']]
20
    );
21
  }
22
echo Nav::widget([
23
    'options' => ['class' => 'navbar-nav navbar-right'],
24
    'items' => $navItems,
25
]);
26
NavBar::end();

Hier ist ein Fragment des Homepage-Inhalts von index.php nach I18n - ein Großteil des HTML-Codes wurde durch PHP-Aufrufe von Yii::t() ersetzt:

1
<div class="jumbotron">
2
        <h1><?= Yii::t('app','Congratulations!'); ?></h1>
3
4
        <p class="lead"><?= Yii::t('app','You have successfully created your Yii-powered application.'); ?></p>
5
6
        <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com"><?= Yii::t('app','Get started with Yii'); ?></a></p>
7
    </div>
8
9
    <div class="body-content">
10
11
        <div class="row">
12
            <div class="col-lg-4">
13
                <h2><?= Yii::t('app','Heading'); ?></h2>
14
15
                <p><?= 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.'); ?></p>
16
17
                <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/"><?= Yii::t('app','Yii Documentation') ?> &raquo;</a></p>
18
            </div>

Übersetzen Ihrer Nachrichtendateien

Schauen Sie sich unsere spanische Nachrichtendatei /common/messages/es/frontend.php an. Es ist eine lange Liste leerer Array-Werte:

1
return [
2
    'About' => '',
3
    'Contact' => '',
4
    'Home' => '',
5
    'Logout' => '',
6
    'My Company' => '',
7
    'Sign In' => '',
8
    'Sign Up' => '',
9
    'Status' => '',
10
    ...

Um unsere Übersetzungen in spanischer Sprache für dieses Tutorial auszufüllen, verwende ich Google Translate. Tricky, nicht wahr?

Yii2 I18n Using Google Translator to Fill Message FilesYii2 I18n Using Google Translator to Fill Message FilesYii2 I18n Using Google Translator to Fill Message Files

Dann werden wir diese Übersetzungen ausschneiden und wieder in die Nachrichtendatei einfügen.

1
return [
2
    'About' => 'Acerca de',
3
    'Contact' => 'Contacto',
4
    'Home' => 'Home',
5
    'Logout' => 'Salir',
6
    'My Company' => 'Mi Empresa',
7
    'Sign In' => 'Entrar',
8
    'Sign Up' => 'Registrarse',
9
    'Status' => 'Estado',

Wenn wir die Homepage der Anwendung besuchen, sehen Sie die spanische Version - schön, oder?

Yii2 I18n Our App Home Page in SpanishYii2 I18n Our App Home Page in SpanishYii2 I18n Our App Home Page in Spanish

Hier ist das Formular "Status erstellen":

Yii2 I18n Create a Status Update in Spanish FormYii2 I18n Create a Status Update in Spanish FormYii2 I18n Create a Status Update in Spanish Form

Wenn ich wieder auf Englisch wechseln möchte, ändere ich einfach die Konfigurationsdatei /config/web.php wieder auf Englisch:

1
<?php
2
3
$params = require(__DIR__ . '/params.php');
4
5
$config = [
6
    'id' => 'basic',
7
    'basePath' => dirname(__DIR__),
8
    'bootstrap' => ['log'],
9
    'language'=>'en', // back to English

10
    'components' => [

Sie werden auch feststellen, dass das Ersetzen von Zeichenfolgen in JavaScript seine eigene Komplexität hat. Ich habe es selbst nicht untersucht, aber die Yii 1.x JsTrans-Erweiterung bietet möglicherweise eine nützliche Richtlinie, um dies zu unterstützen.

Mit I18n weiter gehen

Letztendlich möchten wir unsere Anwendung möglicherweise in eine Reihe von Sprachen übersetzen. Ich habe ein neues Tutorial mit dem Titel Verwenden der Google Übersetzer-API zum Lokalisieren Ihrer I18n-App (Tuts+) geschrieben, das Ihre Anwendung automatisch in eine Vielzahl von Sprachen übersetzt. Wenn es noch nicht veröffentlicht wurde, wird es bald veröffentlicht (siehe meine Lehrerseite). Dies bietet natürlich nur Basisübersetzungen. Möglicherweise möchten Sie professionelle Übersetzer beauftragen, um die Dateien anschließend zu optimieren.

In einigen Anwendungen können Benutzer ihre Muttersprache auswählen, sodass die Benutzeroberfläche beim Anmelden automatisch für sie übersetzt. In Yii bewirkt das Festlegen der Sprachvariablen $app->language:

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 Sprachpräfix, z. "FR" und die App wird automatisch übersetzt:

JScrambler Dynamic Language PathsJScrambler Dynamic Language PathsJScrambler Dynamic Language Paths

Hinweis: Lesen Sie meine jüngste Einführung in JScrambler, um mehr zu erfahren - es ist ein ziemlich nützlicher Dienst.

Der URL-Manager von Yii kann diese Art von Funktionalität ebenfalls bereitstellen. Ich werde diese Funktionen wahrscheinlich in einem zukünftigen Tutorial in dieser Yii2-Serie implementieren, wenn ich mich auf das Routing konzentriere.

Was kommt als nächstes?

Ich hoffe, Sie sind begeistert von der Leistung von I18n und den Vorteilen der Verwendung des Yii-Frameworks gegenüber Vanille-PHP. Achten Sie auf kommende Tutorials in unserer Programming With Yii2-Reihe.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial eintrifft, folgen Sie mir auf Twitter unter @reifman oder besuchen Sie meine Lehrerseite. Meine Lehrerseite enthält alle Artikel aus dieser Reihe, sobald sie veröffentlicht werden. Sie können mir auch eine E-Mail an meine Lookahead Consulting-Website senden.

ähnliche Links