次のように、現在選択されている言語でコントローラー名とアクション名を変更することは可能ですか?
現在の言語がenの場合、url shuold:
http:// localhost / yii2app / site / index
現在の言語がdaの場合、URLは次のようになります。
http:// localhost / yii ... / websted / indeks
それは私が試したものですが、404が見つからないことを示しています:
フロントエンド/config/main.php
'urlManager' => [
'baseUrl' => $baseUrl,
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
Yii::t('app','site/index') => Yii::t('app','site/index'),
],
],
common / messages / da /app.phpで
return [
'site/index'=>'websted/indeks'
];
私のlayouts / main.phpで
<a href="<?= Yii::$app->urlManager
->createUrl([Yii::t('app','site/index')])?>">
<?= Yii::t('app','Home') ?>
</a>
現在のフレームワークバージョンで動作するように、Yiiフォーラムからこのコードを変更しました。すべてのケースがカバーされているわけではないと確信しているため、テストする必要があります。
common \ components \ UrlManager.php:
<?php
namespace common\components;
use Yii;
use yii\web\Request;
use yii\web\UrlManager as YiiUrlManager;
/**
* UrlManager
* Allows to translate urls dynamically.
*/
class UrlManager extends YiiUrlManager
{
public $enablePrettyUrl = true;
public $showScriptName = false;
public $language;
/**
* Translated controllers names.
* language code => [
* source name => translated name
* ]
* @var array
*/
public $languageControllers = [
'eo' => [
'site' => 'ejo',
'users' => 'uzantoj'
],
];
/**
* Translated actions names.
* language code => [
* source name => translated name
* ]
* @var array
*/
public $languageActions = [
'eo' => [
'contact' => 'kontakton',
'about' => 'pri-ni',
'test' => 'testo'
],
];
/**
* Initializes UrlManager.
*/
public function init()
{
parent::init();
if (empty($this->language)) {
$this->language = Yii::$app->language;
}
}
/**
* Creates translated url.
* @param array $params
* @return string the created URL
*/
public function createUrl($params)
{
$params = (array)$params;
$route = explode('/', trim($params[0], '/'));
if (isset($route[0]) && !empty($this->languageControllers[$this->language][$route[0]])) {
$route[0] = $this->languageControllers[$this->language][$route[0]];
}
if (isset($route[1]) && !empty($this->languageActions[$this->language][$route[1]])) {
$route[1] = $this->languageActions[$this->language][$route[1]];
}
$params[0] = implode('/', $route);
return parent::createUrl($params);
}
/**
* Translates the request back to the source one.
* @param Request $request the request component
* @return Request
*/
public function translateRequest($request)
{
if (empty($this->languageControllers[$this->language])) {
return $request;
}
$url = ltrim($request->getPathInfo(), '/');
$parts = explode('/', $url);
$controller = $parts[0];
$action = isset($parts[1]) ? $parts[1] : null;
foreach ($this->languageControllers[$this->language] as $default => $localized) {
if ($localized == $controller) {
$controller = $default;
break;
}
}
$parts[0] = $controller;
if ($action !== null) {
foreach ($this->languageActions[$this->language] as $default => $localized) {
if ($localized === substr($action, 0, mb_strlen($localized, 'UTF-8'))) {
$action = $default . substr($action, mb_strlen($localized, 'UTF-8'));
break;
}
}
$parts[1] = $action;
}
$request->setPathInfo(implode('/', $parts));
return $request;
}
/**
* Parses and translates the user request.
* @param Request $request the request component
* @return array|boolean the route and the associated parameters. The latter is always empty
* if [[enablePrettyUrl]] is false. False is returned if the current request cannot be successfully parsed.
*/
public function parseRequest($request)
{
return parent::parseRequest($this->translateRequest($request));
}
}
UrlManager構成:
// ...
'components' => [
// ...
'urlManager' => [
'class' => 'common\components\UrlManager',
// ...
],
],
さて、Yiiの場合:$ app-> language = 'eo';
異なる言語では、既存のルートのみが機能します。通常の方法でパラメータをアクションに送信できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加