Establecer el valor del idioma global en la aplicación Yii2

¿Dónde puedo configurar el idioma (según la cookie del usuario) globalmente? ¿Cómo hacer que funcione en toda la aplicación (controladores, vistas, etc.)?

En la documentación encontré \Yii::$app->language = ''; pero, ¿dónde puedo escribir mi lógica para cambiar el idioma de manera correcta?

Deberías usar

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

Dentro del controlador que es padre de todos sus controladores. La clase principal debe estar dentro de la carpeta de componentes, y si no está disponible, cree el componente con algo como

 use yii\web\Controller; class MyController extends Controller { public function init() { parent::init(); #add your logic: read the cookie and then set the language } } 

Después de eso, debe asegurarse de que todos sus controladores extiendan su MyController recién creado en lugar del original.

Espero que ayude.

Puede configurar su idioma base en el archivo de configuración. En la aplicación básica, su ubicación predeterminada es: /config/web.php , en avanzado: application-name/config/main.php y application-name/config/main-local.php .

 $config = [ 'id' => 'basic', 'language' => 'nl', // Set the language here 'basePath' => dirname( __DIR__ ), 'bootstrap' => ['log'], ... ]; 

La respuesta aceptada es muy buena, pero en caso de que quiera algo “aún más global”, puede usar la funcionalidad bootstrap, o “on beforeAction” para activar una función (ambas a través de la configuración):

Oreja:

 $config = [ ... 'bootstrap' => ['your\own\component'], ... ]; 

Luego puede usar la función init() de ese componente, por ejemplo.

“en acción anterior”:

 $config = [ 'on beforeAction' => function($event) { // set language } ]; 

Sé que esto es antiguo, pero encontré esta pregunta mientras buscaba una respuesta. También encuentro una buena guía, enlace a continuación.

Una de las formas de hacerlo para crear un componente y arrancarlo, así:

Cree un archivo en, por ejemplo, common / components / LanguageSelector.php

 < ?php namespace common\components; use yii\base\BootstrapInterface; class LanguageSelector implements \yii\base\BootstrapInterface { public $supportedLanguages = []; public function bootstrap($app) { $preferredLanguage = $app->request->getPreferredLanguage($this->supportedLanguages); $app->language = $preferredLanguage; } } 

Estoy usando una plantilla de aplicación avanzada, puede ajustar la ubicación del archivo y el espacio de nombres según sea necesario.

Luego, en su archivo de configuración, debe agregar este componente, al igual que está agregando otro componente como la depuración, o los componentes de registro, así:

 'components' => [ 'languageSelector' => [ 'class' => 'common\components\LanguageSelector', 'supportedLanguages' => ['en-US', 'tr-TR'], ], ], 

Además, debe agregar este componente a los componentes bootstrapped en su archivo de configuración:

 'bootstrap' => ['languageSelector', ...] 

Este enfoque no se basa en cookies, sin embargo, se basa en el idioma del navegador del cliente. También puede encontrar un ejemplo en la página siguiente sobre cómo lograr una selección de idioma basada en preferencias. Pero, básicamente, lo que debe hacer es, en su componente languageSelector, obtener el valor de la cookie y cambiar el idioma en consecuencia. Si no hay una cookie presente en el navegador del usuario, puede retroceder al idioma del navegador.

https://github.com/samdark/yii2-cookbook/blob/master/book/i18n-selecting-application-language.md

Hay muchas respuestas a tu pregunta, dependiendo de tu lógica. Si tienes una regla estática:

 return [ ... 'language' => 'it', ... ]; 

Consulte http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#configuration

Si desea implementar la negociación de contenido HTTP normal, tiene un componente dedicado:

 return [ ... 'components' => [ ... 'contentNegotiator' => [ 'class' => 'yii\filters\ContentNegotiator', 'languages' => ['en', 'it'], ], ... ], ]; 

Consulte http://www.yiiframework.com/doc-2.0/guide-structure-filters.html#content-negotiator

Si necesita una negociación más compleja, puede crear un componente bootstrap. Aquí hay un ejemplo en el que el idioma se toma de las preferencias del usuario para un usuario registrado o se negocia para los invitados. Tenga en cuenta que puede sobrecargar su aplicación con operaciones complejas, como tomar los idiomas compatibles de una base de datos.

 /** * Select a language from user preferences or content negotiation */ class LanguageSelector implements BootstrapInterface { public function bootstrap($app) { if (\Yii::$app->user->isGuest) { $supportedLanguages = (new \yii\db\Query()) ->select('iso639_1') ->from('language') ->orderBy(['priority' => SORT_ASC]) ->column(); $app->language = $app->request->getPreferredLanguage($supportedLanguages); } else { $app->language = Language::findOne(\Yii::$app->user->identity->language_id)->iso639_1; } } } 

Hay una buena lectura aquí sobre este tema: https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

Romano, puedes lograr tu objective usando un archivo de configuración principal o param. Simplemente haga una variable como $sitelang = 'UK_ua'; entonces puedes usarlo a través de Yii::$app->params['sitelang']

Vaya al archivo de configuración de la aplicación frontend / main / config.php o backend / main / config.php

$ config = [‘language’ => ‘ru-RU’]