Routes yii2创建已翻译的URL
我需要创建用户友好的URL,这些URL被翻译,但指向与其他语言相同的控制器 例如: /en/myCar/100->/de/meinAuto/100->/fr/monVoiture/100 我尝试使用路由,但找不到根据翻译后的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: /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',
],