Выбор маршрутизации.yml на основе пользовательской культуры? - PullRequest
4 голосов
/ 02 ноября 2009

В моем приложении Symfony я хотел бы выбрать routing.yml на основе культуры текущего пользователя;

'en' => routing.en.yml
'no' => routing.no.yml

и пр.

Есть предложения, как это можно сделать?

Edit: я не пытаюсь сделать i18n таким образом - я использую для этого встроенные методы Symfony . Я просто хочу, чтобы «статические» URL отражали язык пользователя:

/en/projects/internal/project-name
/no/prosjekter/interne/prosjektnavn
/fr/baguette/champs-elysee/foux-de-fafa

Если «проекты» - это модуль, категории «внутренние» и «имя проекта» хранятся в базе данных.

Ответы [ 5 ]

4 голосов
/ 03 ноября 2009

У меня была та же проблема с недавним сайтом, что и я. Я, однако, не нашел правильного решения и в итоге сделал все URL-адреса английскими.

Я думаю, вам стоит взглянуть на ysfDimensionsPlugin - я не проверял его, но он может быть вам полезен.

3 голосов
/ 01 апреля 2012

Я хотел добиться того же. В Symfony 1.4 вот что я сделал:

Создан домен => карта культуры в app.yml

all:
  languages:
    domain_map:
      www.example.com: en
      www.example.it: it
      www.example.es: es

Создан класс myPatternRouting, расширяющий sfPatternRouting

class myPatternRouting extends sfPatternRouting
{
    public function getConfigFileName()
    {
        $domain_map = sfConfig::get('app_languages_domain_map');
        $domain     = $_SERVER['SERVER_NAME'];
        $culture    = isset($domain_map[$domain]) ? $domain_map[$domain] : 'en';
        $routing    = sprintf('config/routing.%s.yml', $culture);

        return sfContext::getInstance()->getConfigCache()->checkConfig($routing, true);
    }
}

Изменил завод для маршрутизации в factories.yml

all:
  routing:
    class: myPatternRouting

Создана запись обработчика конфигурации для нового шаблона файлов routing.yml в config_handlers.yml

config/routing.*.yml:
  class:    sfRoutingConfigHandler

А затем создал файлы маршрутизации как routing.[culture].yml

И это работает :) 1023 *

1 голос
/ 03 ноября 2009

Не может быть способа сделать это без динамической загрузки маршрутизации с использованием фильтра. Вы можете переопределить sfPatternRouting и написать пользовательскую функцию loadConfiguration, но вам нужно знать культуру пользователя, когда создается экземпляр класса маршрутизации *. Если вы идете по маршруту фильтра, просто загрузите соответствующий файл маршрутизации в первой половине цепочки фильтров.

* Если вы идете по этому пути, убедитесь, что вы также изменили factories.yml.

0 голосов
/ 07 ноября 2009

я использую этот плагин . Мои маршруты выглядят так:

news_ro:
  url:   /ro/stiri/:slug
  requirements: { sf_culture: (?:ro),  page: \d+  }
  param: { module: news, action: index, page: 1, sf_culture: ro}


news_en:
  url:   /en/news/:slug
  requirements: { sf_culture: (?:en),  page: \d+  }
  param: { module: news, action: index, page: 1, sf_culture: en }

Я беру слизняка на основании нынешней культуры.

0 голосов
/ 03 ноября 2009

Я не уверен, что это правильный способ реализации i18n. Какую цель вы пытаетесь достичь с помощью этого решения? Symfony имеет все встроенные инструменты i18n, и у вас не должно возникнуть проблем с использованием интегрированных способов.

Посмотрите здесь: http://www.symfony -project.org / book / 1_2 / 13-I18n-and-L10n и прокрутите вниз до поля «Культура в URL». Это должно решить вашу проблему.

...