Yii2は、選択した言語に応じてコントローラーとアクション名を変更します

ムハンマド・シャザド

次のように、現在選択されている言語でコントローラー名とアクション名を変更することは可能ですか?

現在の言語が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';

  1. / site / testは、アクションTestを使用してコントローラーSiteを呼び出します。
  2. / ejo / testoは、アクションTestを使用してコントローラーサイトを呼び出します。
  3. / ejoは、アクションインデックスを使用してコントローラーサイトを呼び出します。
  4. / site / testoは、アクションTestを使用してコントローラーSiteを呼び出します。

異なる言語では、既存のルートのみが機能します。通常の方法でパラメータをアクションに送信できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Yii2は、ログインするためにすべてのコントローラーとアクションを必要とします

分類Dev

Yii2は、ログインするためにすべてのコントローラーとアクションを必要とします

分類Dev

選択ドロップダウンリストからクリックしたオプションに応じてマーカーを変更します

分類Dev

ブラウザの言語またはプロジェクトの言語を変更して、ローカリゼーションをテストします

分類Dev

日付ピッカーの選択日と月に応じて、2つのドロップダウン選択オプションを変更します

分類Dev

yii2でコントローラー名とアクション名を非表示にする方法

分類Dev

yii2コントローラーで選択したドロップダウンオプションの値を取得します

分類Dev

Yii2:同じコントローラー内の特定のアクションに異なるAccessRuleフィルターを適用します

分類Dev

言語ドロップダウンメニューはリンクを変更しますが、選択した言語に留まりません

分類Dev

選択したプラグイン:値に応じてオプションの背景を変更します

分類Dev

別のタブを選択するときにフラグメントを使用してアクションバーを変更すると、アクションバーは[アクションバー]タブの上部に表示されます。

分類Dev

InnoSetupで選択した言語に応じたコマンドラインパラメーターのショートカットの作成

分類Dev

yii2コントローラーアクションインジェクションはどのように機能しますか

分類Dev

Yii2:「$ this-> goBack()」から特定のコントローラーアクションを除外します

分類Dev

PHPは言語選択を通じてウェブサイトのコンテンツを変更します

分類Dev

Visual Studio Codeは、プロジェクトに応じて言語モードを変更します

分類Dev

選択フォームの変更に応じてリンクパラメータを変更します

分類Dev

Yii2タイムゾーン:日付列は形式に応じて値を変更します

分類Dev

Meteor SelectBox-データコンテキストに応じてオプションを選択済みとしてマークします

分類Dev

セクションに応じて、スクロール中にクラスの下部要素を変更します

分類Dev

選択したアイテムに応じて、BottomNavigationViewにフラグメントをロードする方法は?

分類Dev

ImageSharpのサイズ変更を使用した後、MVCコントローラーアクションを介して画像を返そうとしています

分類Dev

action()を介してYii2コントローラーでアクションの要求動詞を指定します

分類Dev

選択したオプションに応じてボタンのURLを変更します

分類Dev

選択オプションに応じて属性を変更します

分類Dev

コントローラーは最初に選択したオプションのみを認識します

分類Dev

getパラメーターのみを使用したYii2ルーティング(非表示のコントローラーとアクション)

分類Dev

フラッタークイックアクションは、選択した下部ナビゲーションバーアイテムを変更します

分類Dev

yii2でステータスを変更するためのコントローラーアクション

Related 関連記事

  1. 1

    Yii2は、ログインするためにすべてのコントローラーとアクションを必要とします

  2. 2

    Yii2は、ログインするためにすべてのコントローラーとアクションを必要とします

  3. 3

    選択ドロップダウンリストからクリックしたオプションに応じてマーカーを変更します

  4. 4

    ブラウザの言語またはプロジェクトの言語を変更して、ローカリゼーションをテストします

  5. 5

    日付ピッカーの選択日と月に応じて、2つのドロップダウン選択オプションを変更します

  6. 6

    yii2でコントローラー名とアクション名を非表示にする方法

  7. 7

    yii2コントローラーで選択したドロップダウンオプションの値を取得します

  8. 8

    Yii2:同じコントローラー内の特定のアクションに異なるAccessRuleフィルターを適用します

  9. 9

    言語ドロップダウンメニューはリンクを変更しますが、選択した言語に留まりません

  10. 10

    選択したプラグイン:値に応じてオプションの背景を変更します

  11. 11

    別のタブを選択するときにフラグメントを使用してアクションバーを変更すると、アクションバーは[アクションバー]タブの上部に表示されます。

  12. 12

    InnoSetupで選択した言語に応じたコマンドラインパラメーターのショートカットの作成

  13. 13

    yii2コントローラーアクションインジェクションはどのように機能しますか

  14. 14

    Yii2:「$ this-> goBack()」から特定のコントローラーアクションを除外します

  15. 15

    PHPは言語選択を通じてウェブサイトのコンテンツを変更します

  16. 16

    Visual Studio Codeは、プロジェクトに応じて言語モードを変更します

  17. 17

    選択フォームの変更に応じてリンクパラメータを変更します

  18. 18

    Yii2タイムゾーン:日付列は形式に応じて値を変更します

  19. 19

    Meteor SelectBox-データコンテキストに応じてオプションを選択済みとしてマークします

  20. 20

    セクションに応じて、スクロール中にクラスの下部要素を変更します

  21. 21

    選択したアイテムに応じて、BottomNavigationViewにフラグメントをロードする方法は?

  22. 22

    ImageSharpのサイズ変更を使用した後、MVCコントローラーアクションを介して画像を返そうとしています

  23. 23

    action()を介してYii2コントローラーでアクションの要求動詞を指定します

  24. 24

    選択したオプションに応じてボタンのURLを変更します

  25. 25

    選択オプションに応じて属性を変更します

  26. 26

    コントローラーは最初に選択したオプションのみを認識します

  27. 27

    getパラメーターのみを使用したYii2ルーティング(非表示のコントローラーとアクション)

  28. 28

    フラッタークイックアクションは、選択した下部ナビゲーションバーアイテムを変更します

  29. 29

    yii2でステータスを変更するためのコントローラーアクション

ホットタグ

アーカイブ