Язык переключения Symfony - PullRequest
1 голос
/ 19 июля 2011

Я использую Symfony 1.4.11. Пользователь может переключать язык, в моем макете у меня есть

<?php foreach (sfConfig::get('app_cultures_enabled') as $key => $lng): ?>
    <?php echo link_to_if($sf_user->getCulture() != $lng,
    "<img src=\"/images/flags/$lng.png\" alt=\"$lng\">", 
    preg_replace('/sf_culture=[a-z][a-z]/', 'sf_culture='.$lng, $sf_context->getRouting()->getCurrentInternalUri(true)))?>
  <?php endforeach ?>

Так что на каждой странице я генерирую ссылку, чтобы я мог переключать язык.Но у меня есть страница со следующим маршрутом:

page:
  url:   /:sf_culture/page/:slug
  param: { module: page, action: show}
  requirements: { sf_culture: (?:se|no|en), sf_method: GET }

И когда я захожу на эту страницу, у меня появляется ошибка, которая:

"/: sf_culture / page /: slug"В маршруте есть некоторые пропущенные обязательные параметры (: slug).

Я думаю, что проблема в

<?php echo link_to_if($sf_user->getCulture() != $lng,
        "<img src=\"/images/flags/$lng.png\" alt=\"$lng\">", 
        preg_replace('/sf_culture=[a-z][a-z]/', 'sf_culture='.$lng, $sf_context->getRouting()->getCurrentInternalUri(true)))?>

не может создать ссылку с slug, или ..

1 Ответ

2 голосов
/ 20 июля 2011

Если я правильно читаю, похоже, что вы пытаетесь имитировать переменную slug, используя $sf_context->getRouting()->getCurrentInternalUri(true).

Я никогда не делал ссылку на переключение языка таким образом, но в основном, если это работаетВам нужно передать его как переменную с именем «slug» в маршрутизацию.Где-то в этой магической функции link_to_if () вам нужно иметь:

'&slug=' . $slug // the slug!

..., учитывая, что slug - это именованный параметр, которого ожидает правило маршрутизации.

UPDATE:

Вот как я обычно меняю язык:

Я бы создал отдельное действие (например, changeLanguage) без шаблона, а затем создал бы ссылки на него с языком какпараметр:

mysite.com/change-language/fr/ (?lang=fr)
mysite.com/change-language/de/ (?lang=de)
mysite.com/change-language/es/ (?lang=es)

В этом действии я использую $this->getUser()->setCulture($lang), чтобы изменить язык и все, что я хочу сделать, и затем использую $this->redirect($request->getReferer()), чтобы перенаправить пользователя обратно на страницу, с которой он пришел.Если вашему приложению нужно использовать многоязычные URL-адреса, я бы позаботился о том, чтобы они отображались на своих страницах с помощью параметра URL (например, «slug»).И если вы делаете это с учетом SEO, все становится немного сложнее, потому что вы должны ссылаться непосредственно на разные языковые страницы вместо использования перенаправления и т. Д. (Для передачи ссылочного сока).

Надеюсь, чтопомогает.

...