【问题标题】:Choosing routing.yml based on user culture?根据用户文化选择 routing.yml?
【发布时间】:2010-12-12 09:38:53
【问题描述】:

在我的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

其中“projects”是一个模块,类别“internal”和“project-name”存储在数据库中。

【问题讨论】:

  • @DR: 可能他想为英文网站提供英文 URL,为挪威对应的网站提供挪威 URL,例如"/very-good" 和 "/kjempe-fint" ;-)
  • @phidah:Fullstendig korrekt - 绝对正确! :)

标签: routing symfony1 culture


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!该插件似乎很有趣。我会调查的。
  • 请告诉我们调查的结果;)我们都想知道这个问题真的很有趣。
  • 大家好,事实证明 ysfDimensionsPlugin 需要 APC 并且(显然)只支持 Symfony 1.1。因此,我无法检查出来。将继续挖掘。
【解决方案2】:

我想实现同样的目标。在 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

它有效:)

【讨论】:

    【解决方案3】:

    如果不使用过滤器动态加载路由,可能无法做到这一点。您可以覆盖 sfPatternRouting 并编写自定义 loadConfiguration 函数,但是当路由类被实例化时,您需要了解用户的文化*。如果您使用过滤器路由,只需在过滤器链的前半部分加载正确的路由文件即可。

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

    【讨论】:

      【解决方案4】:

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

      看这里:http://www.symfony-project.org/book/1_2/13-I18n-and-L10n 并向下滚动到“URL 中的文化”框。它应该可以解决您的问题。

      【讨论】:

      • @FractalizeR:感谢您的回复。但是,我并不想以这种方式实现 i18n。为此,我使用 Symfony 内置的 i18n - 就数据库内容和“硬编码”值(例如存储在 xliff 中的标签等)而言。我希望能够拥有基于我的模块的静态网址。英语中的模块“projects”在挪威语中是“prosjekter”。一个例子:/en/projects/internal/project-name 变成 /no/prosjekter/interne/prosjektnavn 和 /fr/baguette/champs-elysee/foux-de-fafa
      【解决方案5】:

      我使用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 }
      

      我根据当前的文化采取蛞蝓。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-08
        • 2010-10-30
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多