我正在使用英语和阿拉伯语构建多语言网站
我想将语言从任何页面切换到另一种语言的同一页面 所以我制作了如下代码。
$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']); } ?>
和我的网址生成如下
/多/后端/网络/ EN /多/后端/网络/ AR /站点/索引VAL = HII&安培;净=好
不知道出了什么问题?
我正在使用this进行语言管理。
请检查backend / config
下的 main.php <?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,
];
答案 0 :(得分:3)
如果您在示例中执行此操作,则必须在您创建的每个链接上考虑它。这可以很容易地自动化。
您可以在配置文件中使用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
- var的值。我希望它有所帮助!
如果您阅读了扩展程序的文档,则会生成不同的网址。它告诉您按如下方式创建URL:
Url::to(['demo/action', 'language'=>'ar'])
您正在创建一个简单的链接标记并覆盖$params
。试试这个:
echo Html::a('Arabic', Url::to(['site/index', 'language'=>'ar']));
要重定向到当前页面,只需用当前路径替换第一部分。
答案 1 :(得分:1)
$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
和