2015-01-10 7 views
10

グローバルにユーザーのCookieに基づいて言語を設定できますか?yii2グローバル言語の値を設定する

ドキュメントでは、私は\Yii::$app->language = '';を見つけましたが、正しい方法で言語を変更するためにロジックを書くことができますか?

私はyiiで新しいです、私はいくつかのコンポーネントクラスや何か、おそらく要求クラスを再宣言すると思いますか?

答えて

11

あなたは、すべてのコントローラに親である、コントローラ内部で

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

を使用する必要があります。 親クラスは、コンポーネントのフォルダ内にある必要があり、

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

のようなものを持つコンポーネントを作成するよりも、利用できない場合、あなたはすべてのあなたのコントローラが新しく作成されたMyControllerを拡張する代わりにことを確認する必要があり元のもの。

私はそれが役に立ちそうです。

0

ローマンの場合は、メインの設定ファイルまたはパラメータを使用して目標を達成できます。 $sitelang = 'UK_ua';のような変数を作成してからYii::$app->params['sitelang']

17

設定ファイルで基本言語を設定することができます。基本的なアプリケーションでは、デフォルトの場所は/config/web.phpで、詳細はapplication-name/config/main.phpapplication-name/config/main-local.phpです。

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

YII2の基本テンプレートでは動作しません - サイトで表示される言語は 'en'のままです –

3

の構成を経由して、両方の(受け入れ答えは非常に良いものですが、念のために何かをしたい「さらにグローバルな」あなたは、ブートストラップ機能を使用することができ、または「beforeAction上」機能をトリガします):

ブートストラップ:

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

あなたはその後、例えば、そのコンポーネントのinit() -functionを使用することができます。 「beforeactionの」

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

言語をグローバルに設定するコードの完全な例を提供してください。それはすべてのメンバーにとって役に立つでしょう。 –

-1

私は、これは古いです知っているが、私は答えを探したが、私はこの質問を見つけました。私はまた、以下の素晴らしいガイド、リンクを見つける。

のようなので、コンポーネントを作成するためにそれを行うと、それをブートストラップする方法の1つに:

たとえば、内のファイルを作成し、共通/コンポーネント/ 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; 
    } 
} 

私は高度なアプリテンプレートを使用して、必要に応じてファイルの場所と名前空間を調整できます。

そうのように続いて、あなたの設定ファイルで、あなたは、あなたがデバッグのような別のコンポーネントを追加しているだけのように、このコンポーネントを追加、またはコンポーネントをログに記録する必要があります。

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

はまた、あなたがこのコンポーネントを追加する必要がありますお使いの設定ファイルのブートストラップのコンポーネントに:

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

このアプローチクッキーに依存していないが、それは、クライアントブラウザの言語に依存しています。また、下のページでは、嗜好に基づく言語選択を達成する方法の例を見つけることができます。しかし基本的には、languageSelectorコンポーネントで、Cookieから値を取得し、それに応じて言語を変更する必要があります。ユーザーのブラウザにクッキーが存在しない場合は、ブラウザの言語にフォールバックすることができます。

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

0

は、あなたのロジックに応じて、あなたの質問に多くの答えがあります。あなたは、静的なルールがある場合 は:

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

を使用すると、通常のHTTPコンテンツネゴシエーションを実装したい場合は、専用のコンポーネントを持ってhttp://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#configuration

を参照してください:

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

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

を参照してください。

さらに複雑なネゴシエーションが必要な場合は、ブートストラップコンポーネント。 ここでは、ログインしたユーザーのユーザー設定から言語を取得したり、ゲストのためにネゴシエートしたりした例を示します。サポートされている言語をデータベースから取得するなど、複雑な操作でアプリケーションをオーバーロードすることができます。

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

このトピックについて、ここで良い読書あります:https://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

0

Goが[メイン/ config.phpのか、バックエンド/メイン/ config.phpの

$ CONFIG =アプリケーション構成ファイルのフロントエンド/へ'language' => 'ru-RU']

関連する問題