0

言語ごとに異なる URL を取得したい。

例えば:

http://www.example.com/en/users/create

http://www.example.com/es/usuarios/clear

g11nを有効にして、これを試しました:

Router::connect('/users/create',array('controller'=>'User','action'=>'add'));
Router::connect('/usuarios/crear',array('controller'=>'User','action'=>'add'));

しかし、...メニューコードがあるheader.html.phpで:

<ul id="nav">
<li class="menu-item ">
    <?php echo $this->html->link('New User','/user/add') ?>
</li>
</ul>

リンクを返す関数が必要です:

<a href="http://www.example.com/es/usuarios/crear">...</a>

現在の言語がスペイン語の場合。

また

<a href="http://www.example.com/en/users/create">...</a>

現在の言語が英語の場合。

私の英語でごめんなさい...

編集:

\lithium\template\helper\Html クラスをオーバーライドする問題を解決しました。

<?php

namespace app\extensions\helper;

use lithium\core\Environment;


function getLanguage($locale)
{
    $res = array_shift(explode('_', $locale));

    if(!$res)return '?';
    else return $res;
}

class CustomHtml extends \lithium\template\helper\Html {

    private static $_mapping = array(
                'Users' => array(
                    'Add' => array(
                        'es' => '/es/usuarios/crear',
                        'en' => '/en/users/create',
                        )
                    )
                );

    /**
     * Override Helper::link
     */
    public function link($title, $url = null, array $options = array()) {

        if(is_array($url))
        {
            if(key_exists('controller', $url))
            {
                $controller = $url['controller'];

                if(key_exists('action', $url))
                {
                    $action = $url['action'];

                    $locale = key_exists('locale', $url) ? $url['locale'] : getLanguage(Environment::get('locale'));

                    $new_url = $this->_matchUrl($controller, $action, $locale);

                    if($new_url)
                    {
                        return parent::link($title, $new_url,$options);
                    }
                    else
                    {
                        die('?');
                    }
                }
            }
        }

        return parent::link($title,$url,$options);
    }

    private function _matchUrl($controller, $action, $locale)
    {
        if(isset(self::$_mapping[$controller][$action][$locale]))
        {
            return self::$_mapping[$controller][$action][$locale];
        }

        return null;
    }
}

テンプレートで、この関数を使用して正しいリンクを取得できます。

<?php echo $this->CustomHtml->link('Create user',array('controller'=>'Users', 'action' => 'add')) ?>

それが最善の解決策ではないことは確かです。しかし、それは動作します...

4

1 に答える 1

0

ロケールベースのルーティングを含む例を次に示します: https://gist.github.com/nateabele/1512502

于 2013-06-18T18:27:23.633 に答える