web-dev-qa-db-fra.com

Définir la valeur globale de la langue dans l'application Yii2

Où puis-je définir la langue (basée sur le cookie de l'utilisateur) globalement? Comment le faire fonctionner dans toute l'application (contrôleurs, vues, etc.)?

Dans la documentation, j'ai trouvé \Yii::$app->language = ''; mais, où puis-je écrire ma logique pour changer le langage correctement?

13
bxN5

Tu devrais utiliser 

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

à l'intérieur du contrôleur qui est le parent de tous vos contrôleurs . La classe parente doit être à l'intérieur du dossier composants, et s'il n'est pas disponible, créez le composant avec quelque chose comme

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

Ensuite, vous devez vous assurer que tous vos contrôleurs étendent votre MyController nouvellement créé à la place de celui d'origine.

J'espère que ça aide.

13
Masiorama

Vous pouvez définir votre langue de base dans le fichier de configuration. Dans l'application de base, son emplacement par défaut est: /config/web.php, à un stade avancé: application-name/config/main.php et application-name/config/main-local.php.

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

La réponse acceptée est très bonne, mais si vous voulez quelque chose de "encore plus global", vous pouvez utiliser la fonctionnalité d'amorçage, ou le "on beforeAction" pour déclencher une fonction (les deux via la configuration):

Bootstrap: 

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

Vous pouvez ensuite utiliser la fonction init()- de ce composant, par exemple.

"sur beforeaction":

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

Il y a beaucoup de réponses à votre question, en fonction de votre logique . Si vous avez une règle statique:

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

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

Si vous souhaitez implémenter la négociation de contenu HTTP ordinaire, vous disposez d'un composant dédié:

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

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

Si vous avez besoin d'une négociation plus complexe, vous pouvez créer un composant d'amorçage ..__ Voici un exemple où la langue est extraite des préférences de l'utilisateur pour un utilisateur connecté ou négociée pour des invités. Notez que vous pouvez surcharger votre application d'opérations complexes, telles que la prise en charge des langues prises en charge dans une base de données .

/**
 * 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;
        }
    }
}

Il existe une bonne lecture ici sur ce sujet: https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

1
Sergio

Accédez au fichier de configuration de l'application frontend/main/config.php ou backend/main/config.php.

$ config = ['language' => 'ru-RU']

Roman, vous pouvez atteindre votre objectif en utilisant un fichier de configuration principal ou un paramètre. Il suffit de créer une variable comme $sitelang = 'UK_ua'; pour pouvoir l’utiliser via Yii::$app->params['sitelang']

0
Riko