Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Routes yii2创建已翻译的URL_Routes_Translation_Yii2 - Fatal编程技术网

Routes yii2创建已翻译的URL

Routes yii2创建已翻译的URL,routes,translation,yii2,Routes,Translation,Yii2,我需要创建用户友好的URL,这些URL被翻译,但指向与其他语言相同的控制器 例如: /en/myCar/100->/de/meinAuto/100->/fr/monVoiture/100 我尝试使用路由,但找不到根据翻译后的URL调用控制器的方法 有什么提示我应该从哪里开始吗?使用内置功能很难做到这一点,但有人也有同样的需要,为此专门编写了一个包:。我想这可能就是你想要的: 通过此扩展,您可以使用包含以下语言代码的URL: /en/some/page /de/some/page 如果需要,还

我需要创建用户友好的URL,这些URL被翻译,但指向与其他语言相同的控制器

例如:

/en/myCar/100->/de/meinAuto/100->/fr/monVoiture/100

我尝试使用路由,但找不到根据翻译后的URL调用控制器的方法


有什么提示我应该从哪里开始吗?

使用内置功能很难做到这一点,但有人也有同样的需要,为此专门编写了一个包:。我想这可能就是你想要的:

通过此扩展,您可以使用包含以下语言代码的URL:

/en/some/page
/de/some/page

如果需要,还可以配置友好名称:


无论何时创建URL,语言代码都会自动添加,并在解析URL时回读。为获得最佳用户体验,如果URL中未使用任何语言,则会从浏览器设置中自动检测语言。不过,用户仍然可以访问其他语言,只需使用其他语言代码调用URL即可

最后请求的语言也会保存在用户会话和cookie中。因此,如果用户试图在URL中没有语言代码的情况下访问您的站点,他将被重定向到上次访问时使用的语言


好的,事实证明,规则非常简单(一些尝试和错误帮助):

'/meinAuto'=>“我的车/索引”,
“/monVoiture”=>“我的车/索引”
。。。等等


下面的回答是:语言代码不是问题所在,我刚才已经解决了这个问题。。。问题是,我需要用户语言的控制器部分

这是我的工作解决方案,通过使用addition和Yi2高级模板:

创建
frontend/components/i18nurlules.php

namespace frontend\components;
use Yii;
use yii\base\BootstrapInterface;
class i18nUrlRules implements BootstrapInterface
{
    public function bootstrap($app)
    {
        //Place here the translated UrlRules
        $i18nRules=[
            'myCar/index' => [
                'de' => 'meinAuto',
                'fr' => 'monVoiture',
                'en' => 'myCar',
            ],
            '...' => [
                ...
            ],
        ];
        $reqLang=explode("/",$_SERVER['REQUEST_URI'])[1];
        $languages = ['en','de','fr'];
        $reqLang=in_array($reqLang,$languages)?$reqLang:\Yii::$app->language; //If not in array, use the default language
        \Yii::$app->getUrlManager()->addRules(
            [ 
                $i18nRules['myCar/index'][$reqLang] =>'myCar/index',
                ...
            ],
        false);
    }
}
然后在
frontend/config/main.php上:

'bootstrap' => [
        'log',
        'frontend\components\i18nUrlRules',
    ],

因此,
/en/myCar
/de/meinAuto
/fr/monVoiture
将使用
myCar/index

规则

您可以在Yii2中轻松手动执行,无需任何扩展:

1) 在config/web.php中更改规则(例如)

到(为语言添加规则)

3) 在config/params.php内部向数组添加langs

return [
    ... // some params
    'langs' => ['RU' => 'ru','KZ' => 'kz','EN' => 'en'],    //allowed languages
];
4) 就这样。现在,我们可以使用语言参数检查路径:

example.com/ru


example.com/en

对于任何提出此问题的人, 请参阅此软件包:

由于此包没有新的提交,请使用

或者直接使用并复制到组件目录,然后执行如下url规则:

在AdvancedProject中,我在common/components目录中使用了它

'rules' => [
            [
                'class' => 'common\components\TranslatableUrlRule',
                'patterns' => [
                    'ar' => 'مرحبا',
                    'en' => 'hi',
                    'en' => 'Hola',
                ],
                'route' => '/main/hi',
            ],

谢谢-但这并不是我自己回答的问题。语言代码部分很容易实现…:)对,确实不是一回事。不管怎样,如果有人真的在寻找语言部分,我会留下答案。如果你有很多这样的URL,你可能想通过自己的URL规则求助于数据库,否则可能会成为一个非常大的列表…事实上,但对我来说,它只是3或4个URL,这应该是可行的:)然后你自己想出了最好的解决方案,我想:)答案不错,但最好使用yii2 localeurls,因为它有很多功能,你不需要再次实现现有的功能。。。
'rules' =>[
    [
        'pattern' => '',
        'route' => 'main/index',
        'suffix' => ''
    ],
    '<language:\w{2}>'=>'main/index',
]
[
    'pattern' => '<controller>/<action>/<id:\w+>',
    'route' => '<controller>/<action>',
    'suffix' => ''
],
[
    'pattern' => '<language:\w{2}>/<controller>/<action>/<id:\w+>',
    'route' => '<controller>/<action>',
    'suffix' => ''
],
public function beforeAction($action)
{       
    $language = Yii::$app->getRequest()->getQueryParam('language');
    if($language){
        if(in_array($language,Yii::$app->params['langs'])) Yii::$app->session->set('lang',$language);
        Yii::$app->language = $language;
    }
    return parent::beforeAction($action);
}
return [
    ... // some params
    'langs' => ['RU' => 'ru','KZ' => 'kz','EN' => 'en'],    //allowed languages
];
'rules' => [
            [
                'class' => 'common\components\TranslatableUrlRule',
                'patterns' => [
                    'ar' => 'مرحبا',
                    'en' => 'hi',
                    'en' => 'Hola',
                ],
                'route' => '/main/hi',
            ],