2011-01-29 2 views
0

Обновление:CakePHP i18n/i10n Маршрутизация

Я использую общий CakePHP LIB через несколько приложений (со всеми вытекающими из них живет в субдоменов). Они не все вложены одинаково; так, например, в файловой системе я мог бы:

/foo 
    .htaccess 
    /1.0 (app) 
    /1.1 (app) 
    /1.2 (app) 
    ... 
/bar 
    .htaccess 
    /1.0 (app) 
    /1.1 (app) 
    /1.2 (app) 
    ... 

Если .htaccess в каждом только определяет, какие приложения по умолчанию, что запросы направляются в этой вложенной папке, в то время как они все еще доступны по прямой url (например, /foo/1.0/...).

Похоже, что если я использую прямой URL (например, не перезаписанный .htaccess), он правильно распознает маршруты, но если URL-адрес переписан на .htaccess, это не так; он будет вызывать AppError :: error404() с выходом в конце вопроса. Мне это не кажется правильным ... если у кого-то есть понимание, это было бы потрясающе.


Эй, ребята,

Я использую CakePHP 1.3 и имеющий проблемы маршрутизации. Суть концепции заключается в следующем:

  • Я хочу использовать «en_us» стиль i18n/i10n, а не просто «ан»
  • Я не использую встроенный в i18n из-за требований к иметь несколько языков отображение страниц с локализованными просмотрами (views/:i18n/...) и другими в общие взгляды с призывами __()

Итак, у меня есть маршруты, установленные вверх, как так:

$sI18nFormat = '/[a-z]{2}_[a-z]{2}/'; 
Router::connect('/:i18n/:controller/:action', 
    array('controller' => ':controller', 'action' => ':action', 'i18n' => ':i18n'), 
    array('i18n' => $sI18nFormat)); 
Router::connect('/:i18n/:controller', 
    array('controller' => ':controller', 'action' => 'index', 'i18n' => ':i18n'), 
    array('i18n' => $sI18nFormat)); 
Router::connect('/:controller/:action', 
    array('controller' => ':controller', 'action' => ':action', 'i18n' => 'en_us'), 
    array('i18n' => $sI18nFormat)); 
Router::connect('/:controller', 
    array('controller' => ':controller', 'action' => 'index', 'i18n' => 'en_us'), 
    array('i18n' => $sI18nFormat)); 

где о Очевидно, что маршруты зеркалируются, за исключением того, что один имеет динамический параметр i18n, а другой - статический.

Проблема возникает с использованием определенных значений для :i18n - например, en_us хорошо, но fr_fr кажется, Cake ищет FrController (не FrFrController) - по-видимому, потому, что он пытается работать немного магии с встроенным i18n fr префикс.

В качестве примера, вот что AppError::error404 Дано:

Array 
(
    [className] => FrController 
    [webroot] => /path/to/webroot 
    [url] => _fr 
    [base] => /path/to/webroot 
) 

Можно ли а) сделать торт это остановить, так что мои маршруты работают, как и ожидалось, или б) сказать торт, какой формат я хочу, чтобы мой i18n/i10n, поэтому он не пытается сделать это по-своему?

Любые мысли будут оценены.

+1

BTW, это «i18n» (eye-18-ru) и * «l10n» (ell-10-en) *. :) – deceze

+0

haha, тоже правда ... длинный день. ;) – mway

ответ

1

Вы не должны (нужно) ограничивать регулярное выражение, и также не должно быть необходимости заполнять параметр по умолчанию. Попробуйте следующее:

$sI18nFormat = '[a-z]{2}_[a-z]{2}'; 
Router::connect('/:i18n/:controller/:action', array(), array('i18n' => $sI18nFormat)); 

Возможно, это также не так, поскольку URL-адрес не соответствует полностью определенному маршруту. I.e., /fr_fr/foo не будет соответствовать указанному выше маршруту, так как он не содержит :action.Попробуйте также добавить более короткие варианты:

Router::connect('/:i18n/:controller', array('action' => 'index'), array('i18n' => $sI18nFormat)); 
Router::connect('/:i18n', array('controller' => 'foo', 'action' => 'index'), array('i18n' => $sI18nFormat)); 
+0

Это было определенно слишком многословно ... счастливо удалили ненужные биты. Вопрос: я думал, что только сам параметр сопоставлен с регулярным выражением, а не с полным URI? Если у меня есть определенный маршрут '/: i18n /: controller', который указывает на': action => index', почему это не соответствует '/ fr_fr/foo' (например)? – mway

+0

Поцарапайте это - после того, как я разрешил проблему .htaccess, все работает так, как ожидалось. Спасибо! – mway

1

Вы посмотрели p28n? http://bakery.cakephp.org/articles/p0windah/2007/09/12/p28n-the-top-to-bottom-persistent-internationalization-tutorial

Я обнаружил, что это сделало все это намного меньше.

+0

Я действительно изучал это раньше, и я был немного отключен необходимостью (эффективно) перенаправлять контроллер для переключения языков. Я хочу, чтобы язык контролировался URI, а не сеансом ... и кажется, что p28n ~ = инвентарь i18n в этом отношении ... если я не упустил что-то важное. Признай меня, если я! – mway

Смежные вопросы