(ユーザーの Cookie に基づいて) 言語をグローバルに設定できる場所はどこですか? アプリケーション全体 (コントローラー、ビューなど) で動作させるにはどうすればよいですか?
ドキュメントで見つけまし \Yii::$app->language = '';
たが、言語を正しい方法で変更するためのロジックをどこに書くことができますか?
(ユーザーの Cookie に基づいて) 言語をグローバルに設定できる場所はどこですか? アプリケーション全体 (コントローラー、ビューなど) で動作させるにはどうすればよいですか?
ドキュメントで見つけまし \Yii::$app->language = '';
たが、言語を正しい方法で変更するためのロジックをどこに書くことができますか?
構成ファイルでベース言語を設定できます。基本的なアプリケーションでは、デフォルトの場所は次のとおりです: /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'],
...
];
使用する必要があります
\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 を拡張していることを確認する必要があります。
お役に立てば幸いです。
受け入れられた答えは非常に良いものですが、「さらにグローバル」なものが必要な場合に備えて、ブートストラップ機能または「on beforeAction」を使用して関数をトリガーできます(両方とも構成を介して):
ブートストラップ:
$config = [
...
'bootstrap' => ['your\own\component'],
...
];
init()
たとえば、そのコンポーネントの -function を使用できます。
「アクション前」:
$config = [
'on beforeAction' => function($event) {
// set language
}
];
これは古いことは知っていますが、答えを探しているときにこの質問を見つけました。また、下のリンクにある素敵なガイドも見つけました。
次のように、コンポーネントを作成してブートストラップする方法の 1 つです。
たとえば、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
ローマン、メイン構成ファイルまたはパラメーターを使用して目標を達成できます。次のように変数を作成するだけで、$sitelang = 'UK_ua';
それを使用できますYii::$app->params['sitelang']