Yii2 como agregar otro idioma

Yii2 como agregar otro idioma


Ultima modificación de artículo: 02-Septiembre-2022

En este post explica de manera rápida como agregar otro idioma a tu sitio web.

Para ésta práctica se requiere que tengas una versión de yii-basic instalado, no doy detalle en este artículo sobre la plantilla avanzado pero también podria aplicarse ó puedes implementarla directamente en tu proyecto, o lo que mas te convenga.

La primera vez que lo implementé tenia muchas preguntas, que tratare de explicar aquí.

Lo primero que se tiene que hacer es agregar una configuracion que usualmente en el yii-basic no viene habilitada.

1. Configurando el /config/web.php

Y esto es en el archivo: /config/web.php

Agregar estas lineas dentro del arreglo ó propiedades del método 'component' , tener cuidado de meterlo en el lugar  correcto. 

Dentro de la opcion:



$config = [
..........


  'language' => 'de',
  'sourceLanguage' => 'en',
...
...
...
    'components' => [
.....
        'i18n' => [
            'translations' => [
                'app*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    //'basePath' => '@app/messages',
                    //'sourceLanguage' => 'en-US',
                    'fileMap' => [
                        'app' => 'app.php',
                        'app/error' => 'error.php',
                    ],
                ],
            ],
        ],

......

....]

 

Aquí estamos activando el uso de  'i18n'.

La primera linea:

'language' => 'de',

Esta linea define el idioma por defecto, es decir que si lo deseas cambiar manualmente debes cambiar éste parámetro para que la primera vez que entras tome dicho lenguaje por defecto.

Paso 2. Creando carpetas de idiomas

Crear una carpeta donde irán todas las traducciones. Por default  esta configurado para usar la carpeta "/messages/" en raíz del proyecto, aquí deberás agregar una carpeta por cada idioma, ejemplo:


Para cada idioma agrega una carpeta con el  prefijo del idioma por ejemplo para alemán /de/ y dentro de esa carpeta crea un  archivo que se llame 'app.php' donde pondrémos un arreglo como el siguiente ejemplo; 

/messages/de/app.php

Para traducir de inglés al Alemán.



    return [
        "Congratulations" => "Glückwünsche"
    ];

 
Del lado izquierdo debe ir el idioma el cual se desea hacer la traducción y del lado derecho corresponde a la traducción, observe que es importante que usted defina un idioma base el cual debe de ir en todas las etiquetas, el idioma base puede ser cualquier idioma solo considere que antes de cambiarlo deberia de cambiar el idioma de todas las etiquetas.

Si coloca una carpeta de traducción del idioma base estaria haciendo un proceso inverso y podria crear una confusion.

3. Agregar configuracion en "/config/params.php"


Agregar en el archivo de configuración "/config/params.php" las siguientes lineas.



    return [
      .................
        'languages' => [
        'en'=>'English',    
        'de'=>'Deucht',
        'es'=>'Español'    
        ]    
     ...............

    ]

 

4. Agregar etiquetas de traducción

Para la implementación deberas usar la funcion Yii:t() en todas tus vistas, el segundo parámetro de la función debe de estar en el idioma base configurado previamente.

 
Ejemplo:


  <h1><?=Yii::t('app','Congratulations')?></h1>

 

Hasta aqui debe funcionar de manera estática, para que puedas cambiar entre idiomas necesitar agregar lo siguiente.

5. Crear formulario para cambio de lenguaje


Crea un formulario como sigue:



    <?= Html::beginForm(['language']) ?>    
    <?= Html::dropDownList('language', Yii::$app->language, ['en_US' => 'English', 'de' => 'Deucht']) ?>
    <?= Html::submitButton('Change') ?>
    <?= Html::endForm() ?>  

 

Lo ideal es que esté visible en todas las páginas por lo que lo pudes agregar en "views/layouts/main.php" o tu vista general del proyecto.

6. Crear componente para selección de lenguaje


Crea una carpeta que se llame "/components/" y crea la siguiente clase que se llame "LanguageSelector.php".

Observa que como la carpeta se llama "/components/" se debe argrear el "namespace" con la ruta "app\components".



namespace app\components;
use yii\base\BootstrapInterface;

class LanguageSelector implements BootstrapInterface
{
    public $supportedLanguages = [];

    public function bootstrap($app)
    {
        $preferredLanguage = isset($app->request->cookies['language']) ? (string)$app->request->cookies['language'] : null;
        // or in case of database:
        // $preferredLanguage = $app->user->language;

        if (empty($preferredLanguage)) {
            $preferredLanguage = $app->request->getPreferredLanguage($this->supportedLanguages);
        }

        $app->language = $preferredLanguage;
    }
}

 
Lo que hace este componente es que sobre escribe el metodo "LanguageSelector" y maneja la lógica pára lograr cambiar el idioma de manera utilizando las cookies, si quieres saber más respecto a este codigo puedes consultar la documentación del vendor en el siguiente link: 


Tienes que dar de alta el componente en agregando estas lineas en el archivo  "/config/web.php".



    'bootstrap' => [
        [
            'class' => 'app\components\LanguageSelector',
            'supportedLanguages' => ['en_US', 'de'],
        ],
    ],

 

7. Crear acción para crear cookie

Y por ultimo crea un action en el "controller/siteContolller.php", el cual es el que manda llamar desde el formulario antes mencionado. 

Para esta prueba solo te funcionara en el /index, si deseas que este en todas las paginas deberas cambiar el action del formulario.



    public function actionLanguage(){
        $language = Yii::$app->request->post('language');

        Yii::$app->language = $language;        
        $languageCookie = new \yii\web\Cookie([
            'name' => 'language',
            'value' => $language,
            'expire' => time() + 60 * 60 * 24 * 30, //30 dias
        ]);                
        Yii::$app->response->cookies->add($languageCookie);
    } 


 

8. Implementación

Como se mencionó antes se tiene que usar la función 

Yii::t('app','Congratulations');


9. Configuración en el diccionario de traducción

El diccionario de traducción como se menciona se encuentra en la carpeta '/messages/' + 'idioma', en un ejemplo de la traduccion a inglés el archivo seria


'/messages/en/app.php'


Dentro de dicho archivo agrega un arreglo con todas las traducciones, por ejemplo:


    
    [
        'Congratulations' => 'Felicidades',
        'Hello' => 'Hola',
        'Esta es un nuevo sitio' => 'This is a new site',
    ]

 


Nota importante: La traducción es sensible a minúsculas por lo que "Hola" no es igual a "hola" en este caso si no encuentra la traducción simplemente no lo traduce.


10. Traducciones avanzadas

Seguramente te encontraras con algunas preguntas aquí algunos tips.


Posición de sustantivos y  pronombres.

Por ejemplo si quieres traducir del inglés al español, puedes usar el la siguiente forma.

En la vista:

Yii::t('app/view', 'Detalles de {establecimiento}',['establecimiento'=>$model->nombre]) 

En el archivo de traducción:

[
...
'Detalles de {establecimiento}' => '{establecimiento} Details',
..
]

Si observas el movimiento se hace realmente dentro de la traducción agregando los corchetes.



Referencias:

https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/
http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#locale-language











Comentarios

Publicar un comentario

Aprende Yii2


Lo más Visto

Cómo instalar RBAC

Select dependientes en cascada

Tutorial de implementación de calendario de rango de fechas con Karkit en gridView

Cómo enviar correos con Yii2

Creación de PDF con kartik\mpdf\Pdf

hostinger

ventana bienvenida