CakePHP i18n / i10n Routing - PullRequest
       15

CakePHP i18n / i10n Routing

0 голосов
/ 29 января 2011

Обновление:

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

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

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

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


Привет, ребята,

Я использую CakePHP 1.3 и имею маршрутизациювопрос.Суть концепции такова:

  • Я хочу использовать стиль 'en_us' i18n / i10n, а не просто 'en'
  • Я не использую встроенный 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
)

Возможно ли: a) заставить Cake остановить это так, чтобы мои маршруты работали, как ожидалось, или b) сообщить Cake, какой формат мне нуженмой i18n / i10n, так что он не пытается сделать это по-своему?

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

Ответы [ 2 ]

1 голос
/ 30 января 2011

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

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

1 голос
/ 29 января 2011

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

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

Возможно, это также сбой, потому что URL не соответствует полностью определенному маршруту.То есть, /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));
...