在我的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
“项目”是一个模块,“内部”和“项目名称”类别存储在数据库中。
答案 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基于当前的文化。