簡體   English   中英

yii2 創建翻譯后的 URL

[英]yii2 create translated URLs

我需要創建用戶友好的 URL,這些 URL 被翻譯,但指向與其他語言相同的控制器。

例子:

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

我嘗試使用路由,但找不到根據翻譯的 URL 調用控制器的方法。

我應該從哪里開始的任何提示?

使用內置功能無法輕松完成,但有人有同樣的需求並專門為此編寫了一個包: yii2-localeurls 我認為這可能是你正在尋找的:

使用此擴展程序,您可以使用包含語言代碼的 URL,例如:

/zh/某些/頁
/de/一些/頁
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 中。 因此,如果用戶試圖在 URL 中沒有語言代碼的情況下訪問您的站點,他將被重定向到他上次訪問時使用的語言。

這是我的工作解決方案,另外使用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規則

您可以在 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)就是這樣。 現在我們可以使用語言參數檢查路徑:

例子.com/ru

或者

example.com/en

好吧,事實證明,規則非常簡單(一些反復試驗有幫助):

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

... 等等...

只是為了評論下面的答案:語言代碼不是問題,我不久前解決了這個問題......問題是,我需要用戶語言中的控制器部分

對於遇到此問題的任何人,請參閱此包: Yii2 TranslatableUrlRule

因為不是這個包的新提交,請使用Mohamed Amer 的這個 fork

或直接使用此類並將其復制到您的組件目錄,然后執行如下 url 規則:

在高級項目中,我在 common/components 目錄中使用它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM