【问题标题】:Symfony2 host url translationSymfony2 主机 url 翻译
【发布时间】:2015-08-07 13:51:26
【问题描述】:

我是 Symfony2 的新手(使用 2.7,因为它是一个现有项目)。我必须为一个网站创建翻译后的 url,该网站的区域设置在 url 的主机名中。

为了更清楚,我将举这些例子:

en.mywebsite.com/hello 适用于美国/英语版本 或者 fr.mywebsite.com/bonjour 法语版

我有我的 routing.yml 文件,但它当然不起作用。

helloRoute:
   host: "{locale}.mywebsite.com"
   path: I don't know the correct input, it can be "/hello" or "/bonjour"
   defaults: {_controller: MyWebSiteBundle:Front:viewHello}
   requirements:
      locale: fr|en

这是我的 Nginx 配置:

server {
   listen                               80;
   server_name                          ~^(?<region>\.|en|fr)\.\mywebsite.com;
    root                                /Applications/MAMP/htdocs/web/web;

    rewrite                             ^/app_dev\.php/?(.*)$ /$1 permanent;

    location / {
        index                           app_dev.php;
        try_files                       $uri @rewriteapp;
    }
    ...
}

这个 Nginx 配置没问题,可以。

我检查了很多文档,但我无法做到这一点。 Symfony 文档对此并不十分详细。

我需要翻译 url,这取决于主机名区域设置。也许使用 Symfony 是不可能的。

提前谢谢你。

【问题讨论】:

    标签: php symfony translation yaml host


    【解决方案1】:

    我会创建两条路线:

    英语

    helloRoute:
       host: "{_locale}.mywebsite.com"
       path: "/hello"
       defaults: {_controller: MyWebSiteBundle:Front:viewHello}
       requirements:
          locale: en
    

    法语

    bonjourRoute:
       host: "{_locale}.mywebsite.com"
       path: "/bonjour"
       defaults: {_controller: MyWebSiteBundle:Front:viewHello}
       requirements:
          locale: fr
    

    *请注意,您在语言环境变量中获得了前导下划线。

    您可以将两个路由发送到同一个控制器并根据语言环境有条件地呈现。

    【讨论】:

    • 好的,页面正在显示。但我认为还有一个更复杂的问题。基于这个网址:en.mywebsite.com/hello 如果我在浏览器中修改它并将“hello”替换为“bonjour”,我希望主机也更改 fr.mywebsite.com/bonjour 我该怎么做?
    • 只有当你的语言环境改变时它才会改变。要进行测试,您必须更改浏览器中的 lacale 设置
    • 好的,我明白了,我的语言环境没有改变,但是 url 已经改变了。我想向路由器指定主机中的语言环境也取决于 url 集。 (/bonjour or /hello),举止不正常。
    • 在我看来,必须复制所有已翻译的路线会很麻烦(想象一下,如果您有 3 或 4 种语言..),您不觉得吗?
    【解决方案2】:

    更一般地说,为了能够使用 Symfony 2 轻松处理 URL 中的国际化,您可以使用 BeSimple/BeSimpleI18nRoutingBundle

    然后,如示例所示,您可以执行以下操作:

    helloRoute:
       host: "{locale}.mywebsite.com"
       locales:  { en: "/hello", fr: "/bonjour" }
       defaults: {_controller: MyWebSiteBundle:Front:viewHello}
       requirements:
          locale: fr|en
    

    【讨论】:

    • 我正在搜索这个 Bundle。尝试后,我在页面渲染中收到一条错误消息:“找不到带有 URL www.mywebsite.com/bonjour 的“GET /bonjour”的路由
    • 难道你不应该只使用en.mywebsite.comfr.mywebsite.com 中指定的requirements: 吗?您可以手动处理从www 到正确前缀的重定向,例如使用Listener
    • 对不起,我想用 fr 而不是 www。所以它仍然不起作用,同样的错误消息。
    • 您是否包含be_simple_i18n 路由?虽然我刚刚注意到这个捆绑包已经一年没有更新了,所以可能会有一些问题..
    • 是的,我在 routing.yml 文件中包含了名为 i18n.yml 的 be_simple_i18n 文件。
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2012-06-09
    相关资源
    最近更新 更多