我正在尝试将i18n设置到我的网站中。我做了以下所有配置: 公共/配置/ 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',
],
],
],
],
//...
目录:
- common
-messages
-en-EN
app.php
-ru-RU
app.php
ru-RU / app.php文件:
return [
'Bosh sahifa' => 'Домашная страница'
];
当我将\Yii::$app->language = 'ru-RU'
放入layouts / main.php文件时,它正在运行。但是,当我使用按钮来改变语言时,i18n无效。
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>
站点/郎:
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();
}
请帮忙!
答案 0 :(得分:2)
您没有在任何地方存储语言设置(对于给定的客户端)。事实上,只有在actionLang()
打开时才会更改语言,但它不会起作用,因为您使用$this->goBack()
(没有传递$ lang参数)立即重定向到上一页。
我建议您阅读有关语言检测的文档: Yii2 Cookbook - Selecting application language
简要说明:在Support selecting language manually部分,您会发现可以在用户Cookie或数据库中存储语言设置。在app bootstrap上,您可以获取语言首选项,并将其设置为应用程序。
打开应用程序配置并将以下代码添加到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']) ?>
请注意,它会在/fr/demo/action
这样的网址中显示语言,这对SEO非常有用