[英]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.