yii2 - yii2 i18n not working with buttons
问题描述
I am trying to set i18n into my website. I did all configurations like following: common/config/main.php
'language' => 'uz-UZ',
'sourceLanguage' => 'en-US',
// ...
'components' => [
//...
'i18n' => [
'translations' => [
'app*' => [
'class' => 'yii\i18n\PhpMessageSource',
//'basePath' => '@app/messages',
//'sourceLanguage' => 'en-US',
'fileMap' => [
'app' => 'app.php',
'app/error' => 'error.php',
],
],
],
],
//...
Directories:
- common
-messages
-en-EN
app.php
-ru-RU
app.php
ru-RU/app.php file:
return [
'Bosh sahifa' => 'Домашная страница'
];
And when I put \Yii::$app->language = 'ru-RU'
into layouts/main.php file, it's working. But when I am using buttons to change language, i18n is not working.
code for buttons in layouts/main.php:
<div>
<a href="<?= Url::to(['site/lang', 'lang' => 'uz']) ?>">uz</a>
<a href="<?= Url::to(['site/lang', 'lang' => 'ru']) ?>">ru</a>
<a href="<?= Url::to(['site/lang', 'lang' => 'en']) ?>">en</a>
</div>
site/lang:
public function actionLang($lang)
{
switch ($lang) {
case "en":
\Yii::$app->language = "en-EN";
break;
case "ru":
\Yii::$app->language = "ru-RU";
break;
case "uz":
\Yii::$app->language = "uz-UZ";
break;
default:
\Yii::$app->language = "uz-UZ";
}
$this->goBack();
}
Please, help!
解决方案
您没有将语言设置(对于给定的客户端)存储在任何地方。事实上,只有在actionLang()
打开时才会更改语言,但它不起作用,因为您会立即使用重定向到上一页$this->goBack()
(其中没有传递 $lang 参数)。
我建议您阅读有关语言检测的文档: Yii2 Cookbook - 选择应用程序语言
简而言之:在支持手动选择语言部分,您会看到可以将语言设置存储在用户 cookie 或数据库中。在应用程序引导程序中,您获取语言首选项,并将其设置到应用程序中。
打开应用程序配置并将以下代码添加到您的boostrap
部分:
return [
'bootstrap' => [
[
'class' => 'app\components\LanguageSelector',
'supportedLanguages' => ['en_US', 'ru_RU'],
],
],
// ...
];
然后创建LanguageSelector
类并编写如下内容:namespace app\components;
use yii\base\BootstrapInterface;
class LanguageSelector implements BootstrapInterface
{
public $supportedLanguages = [];
public function bootstrap($app)
{
$preferredLanguage = isset($app->request->cookies['language']) ? (string)$app->request->cookies['language'] : null;
if (empty($preferredLanguage)) {
$preferredLanguage = $app->request->getPreferredLanguage($this->supportedLanguages);
}
$app->language = $preferredLanguage;
}
}
更新
您还可以查看yii2-localeurls扩展,它可以更轻松地在您的应用程序中管理语言。
您所要做的就是将扩展组件添加到您的配置文件中,您可以使用这种链接轻松更改应用程序语言:
<?= $url = Url::to(['demo/action', 'language' => 'fr']) ?>
<?= Html::a('Click', ['demo/action', 'language' => 'fr']) ?>
请注意,它会在 URL like 中显示语言/fr/demo/action
,这对 SEO 非常有用
推荐阅读
- neural-network - 错误设备类型 cuda 的预期对象,但在调用 _th_index_select 时获得了参数 #1 'self' 的设备类型 cpu
- html - CSS:有没有办法为另一个 div 中的一个 div 复制背景大小的“cover”属性?
- java - 使用 Streams 拼字游戏分数
- python - 数据框内的列上的功能
- pygame - 不能发射多于一个射弹
- youtube - Youtube 视频和播放列表选项卡未打开
- python - 当有前导空格时,为什么 Pandas series.str.contains 方法无法检测到匹配?
- c# - 为什么int的插值表达式会出现装箱?
- ffmpeg - Windows的FFMPEG批处理脚本删除前13秒和最后6秒
- php - 从 http 请求获取 php 文件中的数组