我需要创建用户友好的URL,这些URL被翻译,但指向与其他语言相同的控制器。
示例:
/ en / myCar / 100 - > / de / meinAuto / 100 - > / FR / monVoiture / 100
我尝试使用路线,但根据翻译的网址无法找到调用控制器的方法。
我应该从哪里开始提示?
答案 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',
]
如果您有(例如) , 会对其他规则执行相同的操作
2)想象一下,我们有3个目标:ru,en,kz。
所有控制器都扩展了 BehaviorsController.php (例如, 在 BehaviorsController.php 内创建 beforeAction()功能 3)在 config / params.php 内添加 langs 键到数组 4)就是这样。现在我们可以使用语言参数检查路径: <强> example.com/ru 强> 或 <强> example.com/en 强> [
'pattern' => '<controller>/<action>/<id:\w+>',
'route' => '<controller>/<action>',
'suffix' => ''
],
[
'pattern' => '<language:\w{2}>/<controller>/<action>/<id:\w+>',
'route' => '<controller>/<action>',
'suffix' => ''
],
class MainController extends BehaviorsController
)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
];
答案 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',
],