yii2创建翻译的URL

时间:2015-06-03 12:40:49

标签: routes translation yii2

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

示例:

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

我尝试使用路线,但根据翻译的网址无法找到调用控制器的方法。

我应该从哪里开始提示?

5 个答案:

答案 0 :(得分:2)

使用内置功能无法轻松完成,但有人有同样的需求并专门为此编写了一个包:yii2-localeurls。我想这可能就是你要找的东西:

  

使用此扩展程序,您可以使用包含以下语言代码的网址:

     

/ EN /一些/页
  /德/一些/页
  http://www.example.com/en/some/page
  http://www.example.com/de/some/page

     

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

     

http://www.example.com/english/some/page
  http://www.example.com/deutsch/some/page

     

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

     

最后请求的语言也会在用户会话和Cookie中保留。因此,如果用户尝试访问您网站时没有网址中的语言代码,他将被重定向到他上次访问时使用的语言。

答案 1 :(得分:1)

这是我的工作解决方案,另外使用https://github.com/codemix/yii2-localeurls和yii2高级模板:

创建frontend/components/i18nUrlRules.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规则

答案 2 :(得分:0)

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

'<language:(de)>/meinAuto' => 'myCar/index',
'<language:(fr)>/monVoiture' => 'myCar/index'

......等等......

只是评论下面的答案:语言代码不是问题,我刚刚解决了这个问题......问题是,我需要用户语言中的控制器部分

答案 3 :(得分:0)

您可以在Yii2中手动轻松完成,无需任何扩展名:

1)在 config / web.php 内更改您的规则(例如)

'rules' =>[
    [
        'pattern' => '',
        'route' => 'main/index',
        'suffix' => ''
    ],
]

to(添加语言规则)

'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' => ''
],

2)想象一下,我们有3个目标:ru,en,kz。 所有控制器都扩展了 BehaviorsController.php (例如,class MainController extends BehaviorsController

BehaviorsController.php 内创建 beforeAction()功能

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);
}

3)在 config / params.php 内添加 langs 键到数组

return [
    ... // some params
    'langs' => ['RU' => 'ru','KZ' => 'kz','EN' => 'en'],    //allowed languages
];

4)就是这样。现在我们可以使用语言参数检查路径:

<强> example.com/ru

<强> example.com/en

答案 4 :(得分:0)

对于任何遇到此问题的人, 看到这个包:Yii2 TranslatableUrlRule

由于该软件包的提交不是新的,因此请使用Mohamed Amer

的此fork

或直接使用this class并将其复制到您的组件目录,然后执行如下的url规则:

在高级项目中,我在common / components目录中使用了它。

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