2015-01-10 7 views
10

Dove posso impostare il linguaggio (basato sul cookie dell'utente) globale? Farlo funzionare in tutta l'applicazione (controllori, viste, ecc.)yii2 imposta il valore della lingua globale

Nella documentazione ho trovato \Yii::$app->language = ''; ma, dove posso scrivere la mia logica, per cambiare la lingua nel modo giusto?

Sono nuovo in yii, penso che dovrei ridichiarare qualche classe componente o qualcosa del genere, magari richiesta classe?

risposta

11

Si dovrebbe usare

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

all'interno del controller che è genitore per tutti i controller. La classe genitore deve essere all'interno della cartella componenti, e se non è disponibile che creare il componente con qualcosa come

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

Dopo di che, si deve essere sicuri che tutti i controller estende la vostra MyController appena creato al posto di quello originale

Spero che aiuti.

0

Roman, è possibile raggiungere il proprio obiettivo utilizzando un file di configurazione principale o param. È sufficiente creare una variabile come $sitelang = 'UK_ua';, quindi è possibile utilizzarla tramite Yii::$app->params['sitelang']

17

È possibile impostare la lingua di base nel file di configurazione. Nell'applicazione di base la posizione predefinita è: /config/web.php, in avanzato: application-name/config/main.php e application-name/config/main-local.php.

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

Questo non funziona per il modello base YII2 - la lingua visibile del sito rimane 'en' –

3

La risposta accettata è molto buona, ma solo nel caso in cui si desidera qualcosa di "ancora più globale", è possibile utilizzare la funzionalità di bootstrap, o "on beforeAction" per attivare una funzione (sia tramite la configurazione):

Bootstrap:

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

È possibile quindi utilizzare il init() -funzione di tale componente, per esempio.

"on beforeaction":

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

Può piacere fornire un esempio completo di codice per l'impostazione della lingua come globale. Sarà utile per tutti i membri. –

-1

So che questo è vecchio ma, ho trovato questa domanda mentre ero alla ricerca di una risposta. Trovo anche una bella guida, link qui sotto.

Uno dei modi per farlo per creare un componente e bootstrap che, in questo modo:

Creare un file, per esempio, comuni/componenti/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; 
    } 
} 

Sono utilizzando il modello di app avanzato, è possibile regolare la posizione del file e lo spazio dei nomi secondo necessità.

Poi, nel file di configurazione, è necessario aggiungere questo componente, proprio come si sta aggiungendo un altro componente, come il debug, o entra componenti, in questo modo:

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

Inoltre, è necessario aggiungere questo componente di componenti bootstrap nel file di configurazione:

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

Questo approccio non si basa su cookie tuttavia, si basa sulla lingua del browser client. Puoi anche trovare un esempio nella pagina seguente su come ottenere la selezione della lingua basata sulle preferenze. Ma in pratica quello che devi fare è, nel tuo componente languageSelector, ottenere il valore dal cookie e cambiare la lingua di conseguenza. Se non è presente un cookie nel browser dell'utente, è possibile eseguire il fallback nella lingua del browser.

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

0

Ci sono molte risposta alla tua domanda, a seconda della logica. Se si dispone di una regola statica:

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

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

Se si vuole implementare il ordinario contenuto HTTP negoziazione, si hanno una componente dedicata:

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

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

Se è necessaria una negoziazione più complessa, è possibile creare un componente bootstrap. Ecco un esempio in cui la lingua viene presa dalle preferenze dell'utente per un utente registrato o negoziata per gli ospiti. Tieni presente che puoi sovraccaricare la tua applicazione con operazioni complesse, come prendere le lingue supportate da un database.

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

C'è una buona lettura qui su questo argomento: https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

0

applicazione Preferiti file di configurazione frontend/main/config.php o backend/main/config.php

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