1. Code
  2. PHP
  3. Yii

Cómo programar con Yii2: localización con I18n

En esta serie de Programación con Yii2, guío a los lectores en el uso del Framework Yii2 recientemente actualizado para PHP. En la primera parte, configuramos Yii2 localmente, creamos una aplicación Hello World, configuramos un servidor remoto y usamos Github para implementar nuestro código. En la parte dos, aprendimos acerca de la implementación de su arquitectura Model View Controller de Yii y cómo crear páginas web y formularios que recopilan y validan datos. En la parte tres, usamos la base de datos de Yii y las capacidades de registro activo para automatizar la generación de código para una aplicación web básica. Y, en la cuarta parte, aprendimos cómo integrar el registro de usuarios.
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

Spanish (Español) translation by Juan Pablo Diaz Cuartas (you can also view the original English article)

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

Si preguntas, "¿Qué es Yii?" echa un vistazo a mi tutorial anterior: Introducción al framework Yii, que revisa los beneficios de Yii e incluye una descripción general de las novedades de Yii 2.0, publicado el 12 de octubre de 2014.

En esta serie de Programación con Yii2, guío a los lectores en el uso del Framework Yii2 recientemente actualizado para PHP. En la primera parte, configuramos Yii2 localmente, creamos una aplicación Hello World, configuramos un servidor remoto y usamos Github para implementar nuestro código. En la parte dos, aprendimos acerca de la implementación de su arquitectura Model View Controller de Yii y cómo crear páginas web y formularios que recopilan y validan datos. En la parte tres, usamos la base de datos de Yii y las capacidades de registro activo para automatizar la generación de código para una aplicación web básica. Y, en la cuarta parte, aprendimos cómo integrar el registro de usuarios.

En este tutorial, voy a mostrar cómo utilizar el soporte de internacionalización I18n integrado de Yii para que su aplicación esté lista para la traducción a varios idiomas.

Para estos ejemplos, seguiremos imaginando que estamos creando un framework para publicar actualizaciones de estado simples, p. nuestro propio mini-Twitter.

¿Qué es I18n?

Según Wikipedia, I18n es un numerónimo de Internacionalización:

18 representa el número de letras entre la primera i y la última n en internacionalización, un uso acuñado en DEC en la década de 1970 u 80.

Con I18n, todas las cadenas de texto mostradas al usuario desde la aplicación son reemplazadas por llamadas a funciones que pueden cargar dinámicamente cadenas traducidas para cualquier idioma que el usuario seleccione.

Los objetivos de la internacionalización

Al construir una aplicación web, es útil pensar globalmente desde el principio. ¿Tu aplicación debe funcionar en otros idiomas para usuarios de diferentes países?  Si es así, implementar I18n desde el principio te ahorrará mucho tiempo y dolores de cabeza más adelante. 

En nuestro caso, el framework Yii proporciona soporte integrado para I18n por lo que es relativamente fácil crear soporte para I18n a medida que avanza.

Cómo funciona I18n

I18n opera reemplazando todas las referencias al texto mostrado al usuario con llamadas a función que proporcionan traducción cuando sea necesario.

Por ejemplo, aquí está el aspecto de los nombres de los campos de atributo en el modelo de Estado antes de I18n:

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
}

Proporcionar versiones traducidas del código sería muy complicado. Los traductores no técnicos tendrían que traducir el código en su lugar, probablemente rompiendo la sintaxis.

Así es como se ve el mismo código con I18n:

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() es una llamada a función que verifica qué idioma está seleccionado actualmente y muestra la cadena traducida apropiada. El parámetro 'app' se refiere a una sección de nuestra aplicación. Las traducciones se pueden organizar opcionalmente según diversas categorías. Pero, ¿dónde aparecen estas cadenas traducidas?

El idioma predeterminado, en este caso inglés, está escrito en el código, como se muestra arriba. Los archivos de recursos del idioma son listas de matrices de cadenas cuya clave es el texto del idioma predeterminado, p. 'Mensaje' o 'Permisos', y cada archivo proporciona valores de texto traducidos para su idioma apropiado.

Aquí hay un ejemplo de nuestro archivo de traducción al español completo, el código de idioma "es". La función Yii:t() usa este archivo para encontrar la traducción adecuada para mostrar:

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
];

Si bien esto lleva mucho tiempo, Yii proporciona scripts para automatizar la generación y organización de estas plantillas de archivos.

Al separar el texto del código, hacemos que sea más fácil para los expertos multilingües no técnicos traducir nuestras aplicaciones para nosotros, sin romper el código.

I18n también ofrece funciones especializadas para traducir el tiempo, la moneda, los plurales y otros. No entraré en detalles de estos en este tutorial.

Configurando el Soporte I18n

Desafortunadamente, la documentación de Yii2 para I18n aún no es muy descriptiva, y fue difícil encontrar ejemplos paso a paso que funcionen. Afortunadamente para ti, voy a guiarte a través de lo que he aprendido al recorrer los documentos y la web. Encontré útil el ejemplo I18n de The Code Ninja y la guía definitiva Yii2 en I18n, y el colaborador de Yii, Alexander Makarov, también me ofreció algo de ayuda.

Generando el archivo de configuración I18n

Estamos utilizando la plantilla de aplicación básica Yii2 para nuestra aplicación de demostración. Esto coloca nuestra base de código debajo del directorio raíz /hello. Los archivos de configuración de Yii en /hello/config/* se cargan siempre que se realizan solicitudes de página. Utilizaremos los scripts de mensaje I18n de Yii para construir un archivo de configuración para I18n en la ruta common/config.

Desde nuestra raíz de código base, ejecutaremos el script Yii message/config:

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

Esto genera la siguiente plantilla de archivo que podemos personalizar:

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
];

Estoy personalizando el archivo de la siguiente manera. Muevo messagePath a la parte superior y personalizo sourcePath  y messagePath. También estoy especificando los idiomas que deseo que mi aplicación sea compatible además del inglés, en este caso español (es), alemán (de), italiano (it) y japonés (ja). Aquí hay una lista de todos los códigos de idioma I18n.

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',

En el próximo paso, ejecutaremos el script de extracción de Yii que escaneará todo el código en el árbol sourcePath para generar archivos de cadena predeterminados para todas las etiquetas utilizadas en nuestro código. Estoy personalizando sourcePath para escanear todo el árbol de códigos. Estoy personalizando messagePath para generar los archivos resultantes en common/messages.

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

Verás que Yii escanea todos tus archivos de código:

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...

Cuando se complete, verás algo como esto en tu código base:

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

Activando I18n y seleccionando un idioma

En el archivo de configuración común, /hello/config/web.php, le diremos a Yii sobre nuestro nuevo soporte de idiomas. Haré que el español sea mi idioma predeterminado:

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' => [

Pero todavía hay más por hacer. Tenemos que hacer que nuestro código I18n sea consciente.

Usando el generador de código Gii de Yii con I18n

En la tercera parte de esta serie, utilizamos la base de datos de Yii y las capacidades de registro activo para automatizar la generación de código. Pero no activamos I18n, por lo que todo nuestro código tenía cadenas de texto incrustadas. Vamos a rehacer esto.

Regresamos a Gii, probablemente http://localhost:8888/hello/gii en su navegador, y volvemos a ejecutar el modelo y los generadores de controladores con I18n activado.

Aquí hay un ejemplo de generación del código del modelo de reunión con I18n activado. Tenga en cuenta que especificamos "aplicación" para nuestra Categoría de mensaje. Estamos colocando todas nuestras cadenas de texto en un archivo de categoría de aplicación.

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

Hagamos lo mismo para la generación CRUD para controladores y vistas:

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

Si explora el código generado en modelos, controladores y vistas, verá las cadenas de texto reemplazadas por la función Yii:t('app', ...):

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>

Realización de vistas estáticas I18n Ready

Como generamos varias vistas en nuestra aplicación a mano o en HTML, tenemos que convertirlas manualmente para usar I18n. Por ejemplo, nuestra barra de navegación en /views/layouts/main.php y nuestra página de inicio en /views/site/index.php deben editarse a mano.

Aquí está la barra de navegación antes de 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();

Aquí está la barra de navegación después de 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();

Aquí hay un fragmento del contenido de la página de inicio de index.php después de I18n: gran parte del HTML ha sido reemplazado por llamadas PHP a Yii::t():

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>

Traduciendo tus archivos de mensajes

Eche un vistazo a nuestro archivo de mensajes en español, /common/messages/es/frontend.php. Es una larga lista de valores de matriz vacíos:

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

Para los fines de completar nuestras traducciones en español para este tutorial, usaré Google Translate. Tricky, ¿eh?

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

Luego, haremos un corte y pegar con esas traducciones nuevamente en el archivo de mensajes.

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',

Cuando visitamos la página de inicio de la aplicación, verás la versión en español. Bien, ¿eh?

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

Aquí está el formulario Crear Estado:

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

Si quiero volver al inglés, simplemente cambio el archivo de configuración, /config/web.php, a inglés:

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' => [

También notará a medida que proceda que el reemplazo de cadenas en JavaScript tiene sus propias complejidades. No lo he explorado yo mismo, pero la extensión Yii 1.x JsTrans puede proporcionar una guía útil para apoyar esto.

Continuando con I18n

En última instancia, es posible que deseemos traducir nuestra aplicación a varios idiomas. He escrito un nuevo tutorial llamado Usar la API de Google Translate para localizar su aplicación I18n (Tuts +) que traduce automáticamente su aplicación a una variedad de idiomas. Si aún no se ha publicado, se publicará pronto (consulte la página de mi instructor). Por supuesto, esto solo proporciona traducciones de base. Es posible que desee contratar traductores profesionales para afinar los archivos posteriormente.

Algunas aplicaciones permiten a los usuarios seleccionar su idioma nativo para que cuando inicien sesión, la interfaz de usuario las traduzca automáticamente. En Yii, configurar la variable de $app->idioma hace esto:

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

Otras aplicaciones, como JScrambler.com a continuación, aprovechan la ruta de la URL para cambiar de idioma. El usuario simplemente hace clic en el prefijo de idioma que desea, p. "FR", y la aplicación se traduce automáticamente:

JScrambler Dynamic Language PathsJScrambler Dynamic Language PathsJScrambler Dynamic Language Paths

Nota: Lea mi introducción reciente a JScrambler para obtener más información: -es un servicio bastante útil.

El administrador de URL de Yii también puede proporcionar este tipo de funcionalidad. Probablemente implementaré estas características en un tutorial futuro en esta serie Yii2 cuando me centre en Ruteo.

¿Que sigue?

Espero que estés entusiasmado con el poder de I18n y los beneficios de usar el Marco Yii sobre PHP vano. Mire los próximos tutoriales en nuestra serie Programación con Yii2.

Si desea saber cuándo llegará el siguiente tutorial de Yii2, síganme @reifman en Twitter o consulte la página de mi instructor. La página de mi instructor incluirá todos los artículos de esta serie tan pronto como se publiquen. También puede enviarme un correo electrónico a mi sitio web de Lookahead Consulting.

enlaces relacionados