gpt4 book ai didi

Yii2 根据所选语言更改 Controller 和 Action 名称

转载 作者:行者123 更新时间:2023-12-04 02:10:53 25 4
gpt4 key购买 nike

是否可以使用当前选择的语言更改 Controller 名称和操作名称,例如:

如果当前语言是 en 那么 url shuold:

http://localhost/yii2app/site/index

如果当前语言是 da 那么 url 应该:

http://localhost/yii.../websted/indeks

It is what I have tried but it shows 404 not found:

前端/配置/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 论坛中的这段代码以适用于当前的框架版本。它需要进行测试,因为我很确定其中并未涵盖所有情况。

通用\组件\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));
}
}

网址管理器配置:

// ...
'components' => [
// ...
'urlManager' => [
'class' => 'common\components\UrlManager',
// ...
],
],

现在,对于 Yii:$app->language = 'eo';

  1. /site/test 调用带有 Action 测试的 Controller 站点。
  2. /ejo/testo 使用 Action 测试调用 Controller 站点。
  3. /ejo 使用操作索引调用 Controller 站点。
  4. /site/testo 使用 Action 测试调用 Controller 站点。

对于不同的语言,只有现有的路线才有效。您可以以正常方式将参数发送到操作。

关于Yii2 根据所选语言更改 Controller 和 Action 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38552583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com