web-dev-qa-db-ja.com

Yii2アプリケーションでグローバル言語値を設定する

どこで(ユーザーのCookieに基づいて)言語をグローバルに設定できますか?アプリケーション全体(コントローラー、ビューなど)で機能させるには?

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

14
bxN5

あなたが使用する必要があります

\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を拡張することを確認する必要があります。

役に立てば幸いです。

14
Masiorama

構成ファイルで基本言語を設定できます。基本的なアプリケーションでは、デフォルトの場所は次のとおりです。/config/web.php、上級:application-name/config/main.phpおよびapplication-name/config/main-local.php

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

受け入れられた答えは非常に良いものですが、「さらにグローバルな」何かが必要な場合には、bootstrap機能、または「on beforeAction」を使用して関数をトリガーできます(両方とも構成):

ブートストラップ:

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

その後、たとえばそのコンポーネントのinit()- functionを使用できます。

「beforebeforeaction」:

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

あなたの論理に応じて、あなたの質問に対する多くの答えがあります。静的ルールがある場合:

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

http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#configuration を参照してください

通常のHTTPコンテンツネゴシエーションを実装する場合、専用のコンポーネントがあります。

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

http://www.yiiframework.com/doc-2.0/guide-structure-filters.html#content-negotiator を参照してください

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

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

1
Sergio

これは古いことは知っていますが、答えを探しているときにこの質問を見つけました。また、以下のリンクからニースガイドを見つけました。

コンポーネントを作成するための方法の1つで、bootstrap it、like so

たとえば、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;
    }
}

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

次に、次のように、デバッグやログコンポーネントなどの別のコンポーネントを追加するのと同じように、設定ファイルにこのコンポーネントを追加する必要があります。

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

また、構成ファイルのブートストラップされたコンポーネントにこのコンポーネントを追加する必要があります。

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

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

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

1
SercioSoydanov

アプリケーション構成ファイルfrontend/main/config.phpまたはbackend/main/config.phpに移動します

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

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

0
Riko