根据用户文化选择routing.yml?

时间:2009-11-02 19:32:47

标签: routing symfony1 culture

在我的Symfony应用程序中,我想根据当前用户的文化选择routing.yml;

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

等等。

有关如何做到这一点的任何建议吗?

编辑:我尝试以这种方式执行i18n - 我使用Symfony的内置方法。我只想要“静态”网址来反映用户的语言:

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

“项目”是一个模块,“内部”和“项目名称”类别存储在数据库中。

5 个答案:

答案 0 :(得分:4)

我最近的一个网站遇到了同样的问题。但是,我找不到合适的解决方案,最终将所有网址都设为英文。

我认为你应该看看ysfDimensionsPlugin - 我没有看过它,但它可能对你有用。

答案 1 :(得分:3)

我想达到同样的目的。在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

它有效:)

答案 2 :(得分:1)

如果不使用过滤器动态加载路由,可能无法实现此目的。您可以覆盖sfPatternRouting并编写自定义loadConfiguration函数,但是当路由类实例化时,您需要知道用户的文化*。如果你进入过滤器路径,只需在过滤器链的前半部分加载正确的路由文件。

*如果你走这条路,请确保你也改变了factory.yml。

答案 3 :(得分:0)

我不确定这是实现i18n的正确方法。您希望通过此解决方案实现什么目标? Symfony内置了所有i18n工具,使用集成方式应该没有问题。

在此处查看:http://www.symfony-project.org/book/1_2/13-I18n-and-L10n并向下滚动到“网址中的文化”框。它应该可以解决你的问题。

答案 4 :(得分:0)

我使用this plugin。我的路线看起来像这样:

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 }

我把slu base基于当前的文化。