在 Yii2 应用程序中设置全局语言值
Set global language value in Yii2 application
在哪里可以设置全局语言(基于用户的 cookie)?如何让它在整个应用程序(控制器、视图等)中工作?
我在文档中找到 \Yii::$app->language = '';
但是,我可以在哪里编写我的逻辑以正确的方式更改语言?
你应该使用
\Yii::$app->language = '';
在所有控制器的父级控制器内。
父 class 应该在 components 文件夹中,如果它不可用,则使用
之类的东西创建组件
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 而不是原始控制器。
希望对您有所帮助。
Roman,您可以使用主配置文件或参数来实现您的目标。只需创建一个像 $sitelang = 'UK_ua';
这样的变量,然后您就可以通过 Yii::$app->params['sitelang']
使用它
您可以在配置文件中设置您的基本语言。在基本应用程序中,它的默认位置是:/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'],
...
];
接受的答案非常好,但以防万一您想要某些东西 "even more global" 您可以使用 bootstrap 功能或 "on beforeAction" 来触发一个函数(两者通过配置):
Bootstrap:
$config = [
...
'bootstrap' => ['your\own\component'],
...
];
然后您可以使用该组件的 init()
功能。
"on beforeaction":
$config = [
'on beforeAction' => function($event) {
// set language
}
];
我知道这是旧问题,但是我在搜索答案时发现了这个问题。我还找到了一个很好的指南,下面是 link。
其中一种方法是创建组件并 bootstrap 它,如下所示:
创建一个文件,例如 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'],
],
],
此外,您需要将此组件添加到配置文件中的 bootstrapped 组件:
'bootstrap' => ['languageSelector', ...]
此方法不依赖于 cookie,但它依赖于客户端浏览器的语言。您还可以在下页找到有关如何实现基于偏好的语言选择的示例。但基本上您需要做的是,在您的 languageSelector 组件中,从 cookie 中获取值并相应地更改语言。如果用户浏览器中不存在 cookie,您可以回退到浏览器语言。
https://github.com/samdark/yii2-cookbook/blob/master/book/i18n-selecting-application-language.md
根据您的逻辑,您的问题有很多答案。
如果您有静态规则:
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/
转到应用程序配置文件 frontend/main/config.php 或 backend/main/config.php
$config = ['language' => 'ru-RU']
在哪里可以设置全局语言(基于用户的 cookie)?如何让它在整个应用程序(控制器、视图等)中工作?
我在文档中找到 \Yii::$app->language = '';
但是,我可以在哪里编写我的逻辑以正确的方式更改语言?
你应该使用
\Yii::$app->language = '';
在所有控制器的父级控制器内。 父 class 应该在 components 文件夹中,如果它不可用,则使用
之类的东西创建组件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 而不是原始控制器。
希望对您有所帮助。
Roman,您可以使用主配置文件或参数来实现您的目标。只需创建一个像 $sitelang = 'UK_ua';
这样的变量,然后您就可以通过 Yii::$app->params['sitelang']
您可以在配置文件中设置您的基本语言。在基本应用程序中,它的默认位置是:/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'],
...
];
接受的答案非常好,但以防万一您想要某些东西 "even more global" 您可以使用 bootstrap 功能或 "on beforeAction" 来触发一个函数(两者通过配置):
Bootstrap:
$config = [
...
'bootstrap' => ['your\own\component'],
...
];
然后您可以使用该组件的 init()
功能。
"on beforeaction":
$config = [
'on beforeAction' => function($event) {
// set language
}
];
我知道这是旧问题,但是我在搜索答案时发现了这个问题。我还找到了一个很好的指南,下面是 link。
其中一种方法是创建组件并 bootstrap 它,如下所示:
创建一个文件,例如 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'],
],
],
此外,您需要将此组件添加到配置文件中的 bootstrapped 组件:
'bootstrap' => ['languageSelector', ...]
此方法不依赖于 cookie,但它依赖于客户端浏览器的语言。您还可以在下页找到有关如何实现基于偏好的语言选择的示例。但基本上您需要做的是,在您的 languageSelector 组件中,从 cookie 中获取值并相应地更改语言。如果用户浏览器中不存在 cookie,您可以回退到浏览器语言。
https://github.com/samdark/yii2-cookbook/blob/master/book/i18n-selecting-application-language.md
根据您的逻辑,您的问题有很多答案。 如果您有静态规则:
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/
转到应用程序配置文件 frontend/main/config.php 或 backend/main/config.php
$config = ['language' => 'ru-RU']