我正在建立英语和阿拉伯语的多语言网站
我想将语言从任何页面完全切换到另一种语言的同一页面 所以我编写了如下代码。
$route = Yii::$app->controller->route;
$params = $_GET;
array_unshift($params, '/'.$route);
<?php if(Yii::$app->language == 'ar'){ ?>
<?= Html::a('English', [Yii::$app->urlManager->createUrl($params), 'language'=>'en']); ?>
<?php }else{?>
<?= Html::a('Arabic', [Yii::$app->urlManager->createUrl($params), 'language'=>'ar']); } ?>
我的网址生成如下
/multi/backend/web/en/multi/backend/web/ar/site/index?val=hii&net=good
不知道出了什么问题?
我正在使用 this 进行语言管理。
请检查我的 main.php 在 backend/config
<?php
$params = array_merge(
require(__DIR__ . '/../../common/config/params.php'),
require(__DIR__ . '/../../common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return [
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'backend\controllers',
'language' => 'en',
'sourceLanguage' => 'en_UK',
'bootstrap' => ['log'],
'modules' => [],
'components' => [
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'i18n' => [
'translations' => [
'app' => [
'class' => 'yii\i18n\DbMessageSource',
'sourceLanguage' => 'en_UK',
],
],
],
'urlManager' => [
'class' => 'codemix\localeurls\UrlManager',
'languages' => ['en', 'ar'],
'enableDefaultLanguageUrlCode' => false,
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
],
'params' => $params,
];
如果您按照示例进行操作,则必须在创建的每个链接上考虑这一点。这可以轻松实现自动化。
您可以使用配置文件中的 url-rule 来解决此问题,如下所示:
'<language:[\w]{2,2}>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
这将断言到您的控制器的正确路由,并在
language
变量中为您提供所需的语言。
您可以扩展
UrlManager
类并确保当前语言始终附加到参数中:
class MyUrlManager extends \yii\web\UrlManager
{
// ...
/**
* @inheritdoc
*/
public function createUrl($params)
{
if (!isset($params['language'])) {
$params['language'] = Yii::$app->language;
}
return parent::createUrl($params);
}
// ...
}
这将自动执行将语言添加到您创建的链接的过程。
现在您还应该覆盖
Application
类,并始终将语言设置为提供的语言或选择默认值(在本例中为 en
):
class MyApplication extends \yii\web\Application
{
// ...
/**
* @inheritdoc
*/
public function init()
{
parent::init();
$lang = Yii::$app->request->get('language', 'en');
Yii::$app->language = $lang;
}
// ...
}
现在您的语言将始终设置为默认值或通过上面指定的查询参数提供的语言。
这应该为您提供如何解决问题的基本想法。根据需要进行调整...尤其是最后一部分
Application
类以及如何检索 language
变量的值。我希望它有帮助!
如果您阅读扩展程序的文档,则会以不同的方式生成网址。它告诉您创建网址如下:
Url::to(['demo/action', 'language'=>'ar'])
您正在创建一个简单的链接标签并覆盖
$params
。试试这个:
echo Html::a('Arabic', Url::to(['site/index', 'language'=>'ar']));
要重定向到当前页面,只需将第一部分替换为当前路由即可。
经过多次尝试..我找到了解决方案..现在它对我有用。
$route = Yii::$app->controller->route;
if(Yii::$app->language == 'ar'){
$_GET['language'] = 'en';
}else{
$_GET['language'] = 'ar';
}
$params = $_GET;
array_unshift($params, '/'.$route);
<?php if(Yii::$app->language == 'ar'){ ?>
<?= Html::a('English', Yii::$app->urlManager->createUrl($params)); ?>
<?php }else{?>
<?= Html::a('Arabic', Yii::$app->urlManager->createUrl($params)); } ?>
它适用于像这样的网址
http://localhost/multi/backend/web/site/index?page=2&per-page=6
和