Yii - Localización

I18N (Internationalization)es el proceso de diseño de una aplicación que se puede adaptar a varios idiomas. Yii ofrece un espectro completo de funciones I18N.

La configuración regional es un conjunto de parámetros que especifican el idioma y el país de un usuario. Por ejemplo, en-US significa la configuración regional en inglés y los Estados Unidos. Yii proporciona dos tipos de idiomas: idioma de origen e idioma de destino. El idioma de origen es el idioma en el que están escritos todos los mensajes de texto de la aplicación. El idioma de destino es el idioma que se debe utilizar para mostrar contenido a los usuarios finales.

El componente de traducción de mensajes traduce los mensajes de texto del idioma de origen al idioma de destino. Para traducir el mensaje, el servicio de traducción de mensajes debe buscarlo en una fuente de mensajes.

Para utilizar el servicio de traducción de mensajes, debe:

  • Envuelva los mensajes de texto que desea traducir en el método Yii :: t ().
  • Configure las fuentes de los mensajes.
  • Almacene mensajes en la fuente del mensaje.

Step 1 - El método Yii :: t () se puede utilizar así.

echo \Yii::t('app', 'This is a message to translate!');

En el fragmento de código anterior, la 'aplicación' representa una categoría de mensaje.

Step 2 - Ahora, modifique el config/web.php archivo.

<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this
               //is required by cookie validation
            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'i18n' => [
            'translations' => [
               'app*' => [
                  'class' => 'yii\i18n\PhpMessageSource',
                  'fileMap' => [
                     'app' => 'app.php'
                  ],
               ],
            ],
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         'errorHandler' => [
            'errorAction' => 'site/error',
         ],
         'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
         ],
         'log' => [
            'flushInterval' => 1,
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
               [
                  'class' => 'yii\log\FileTarget',
                  'exportInterval' => 1,
                  'logVars' => [],
               ],
            ],
         ],
         'db' => require(__DIR__ . '/db.php'),
      ],
      // set target language to be Russian
      'language' => 'ru-RU',
      // set source language to be English
      'sourceLanguage' => 'en-US',
      'modules' => [
         'hello' => [
            'class' => 'app\modules\hello\Hello',
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>

En el código anterior, definimos el idioma de origen y el de destino. También especificamos una fuente de mensaje compatible conyii\i18n\PhpMessageSource. El patrón app * indica que todas las categorías de mensajes que comienzan con app deben traducirse utilizando esta fuente de mensajes en particular. En la configuración anterior, todas las traducciones al ruso se ubicarán en el archivo messages / ru-RU / app.php.

Step 3- Ahora, cree la estructura del directorio messages / ru-RU. Dentro de la carpeta ru-RU crea un archivo llamado app.php. Esto almacenará todas las traducciones EN → RU.

<?php
   return [
      'This is a string to translate!' => 'Эта строка для перевода!'
   ];
?>

Step 4 - Cree una función llamada actionTranslation () en SiteController.

public function actionTranslation() {
   echo \Yii::t('app', 'This is a string to translate!');
}

Step 5 - Ingrese la URL http://localhost:8080/index.php?r=site/translation en el navegador web, verá lo siguiente.

El mensaje se tradujo al ruso cuando establecimos el idioma de destino en ru-RU. Podemos cambiar dinámicamente el idioma de la aplicación.

Step 6 - Modificar el actionTranslation() método.

public function actionTranslation() {
   \Yii::$app->language = 'en-US';
   echo \Yii::t('app', 'This is a string to translate!');
}

Ahora, el mensaje se muestra en inglés:

Step 7 - En un mensaje traducido, puede insertar uno o varios parámetros.

public function actionTranslation() {
   $username = 'Vladimir';
   // display a translated message with username being "Vladimir"
   echo \Yii::t('app', 'Hello, {username}!', [
      'username' => $username,
   ]), "<br>";
   $username = 'John';
   // display a translated message with username being "John"
   echo \Yii::t('app', 'Hello, {username}!', [
      'username' => $username,
   ]), "<br>";
   $price = 150;
   $count = 3;
   $subtotal = 450;
   echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
}

Lo siguiente será la salida.

Puede traducir un script de vista completo, en lugar de traducir mensajes de texto individuales. Por ejemplo, si el idioma de destino es ru-RU y desea traducir el archivo de vista views / site / index.php, debe traducir la vista y guardarla en el directorio views / site / ru-RU.

Step 8- Cree la estructura del directorio views / site / ru-RU. Luego, dentro de la carpeta ru-RU crea un archivo llamado index.php con el siguiente código.

<?php
   /* @var $this yii\web\View */
   $this->title = 'My Yii Application';
?>

<div class = "site-index">
   <div class = "jumbotron">
      <h1>Добро пожаловать!</h1>
   </div>
</div>

Step 9 - El idioma de destino es ru-RU, por lo que si ingresa la URL http://localhost:8080/index.php?r=site/index, verá la página con la traducción al ruso.