【问题标题】:Localized URLs in Play 2.0?Play 2.0 中的本地化 URL?
【发布时间】:2012-05-14 00:12:18
【问题描述】:

昨天我们在当地的JUG 进行了 Play 2.0 演示,但我们无法确定是否可以使用本地化 URL(用于 SEO 目的)。

例如 /help、/hilfe 等应该指向同一个控制器,但模板应该使用不同的语言内容呈现。

在 Play 2.0 中有什么方法可以做到这一点吗?

【问题讨论】:

    标签: url seo playframework-2.0


    【解决方案1】:

    我喜欢你的问题,因为它至少对我来说很有创意 :) 检查这种方法是否适合我:

    conf/routes:

    GET     /help     controllers.Application.helpIndex(lang = "en")
    GET     /hilfe    controllers.Application.helpIndex(lang = "de")
    
    GET     /help/:id     controllers.Application.helpTopic(lang = "en", id: Long)
    GET     /hilfe/:id    controllers.Application.helpTopic(lang = "de", id: Long)
    

    controllers/Application.java:

    public static Result helpIndex(String lang) {
        return ok("Display help's index in " + lang.toUpperCase());
    }
    
    public static Result helpTopic(String lang, Long id) {
        return ok("Display details of help topic no " + id + " in " + lang.toUpperCase());
    }
    

    views/someView.scala.html:

    <a href="@routes.Application.helpIndex("en")">Help index</a><br/>
    <a href="@routes.Application.helpIndex("de")">Hilfe index</a><br/>
    
    <a href="@routes.Application.helpTopic("en", 12)">Help topic no 12</a><br/>
    <a href="@routes.Application.helpTopic("de", 12)">Hilfe topic no 12</a>
    

    【讨论】:

      【解决方案2】:

      (这与previous answer 中的方法不同,因此单独添加)

      您还可以在 DB 中创建某种mapping table,您可以在其中存储具有不同参数的记录的完整路径:

      urlpath              record_id    lang
      /help/some-topic     12           en
      /hilfe/ein-topic     12           de
      

      在conf/routes 文件中,您需要使用允许您使用Dynamic parts spanning several / 的规则(参见routing doc),即:

      GET    /:topic    controller.Application.customDbRouter(topic:String)
      

      您也可以混合使用这两种 - 标准路由机制和自定义路由机制返回notFound()结果。

      【讨论】:

        【解决方案3】:

        您使用 from GlobalSettings.onHandlerNotFound() 并检查是否是 url 的翻译版本。然后,您可以进行重定向。然而,这以默认语言的 url 结尾。

        更简洁的是使用GlobalSettings.onRouteRequest,您可以在其中实现自己的逻辑来获取处理程序。

        此外,您还可以创建自己的路由器。在google-groups 与scala solution 进行了讨论。

        【讨论】:

          【解决方案4】:

          据我所知,在 Play 1.2.x 中是可能的,而不是在 2.x 中。我的意思是,如果不复制文件中的映射、为 EN 添加一个、为 DE 添加一个等,这是不可能的。

          一种更简单的 SEO 替代方法可能是“伪造”站点地图文件中的网址。

          所以你的 Routes 文件有

          GET  /action/:param/:seo-string   Controller.methodAction(param)
          

          所以seo-string 将在处理过程中被忽略,并且您会在站点地图文件中生成多个链接:

          /action/1/english-text
          /action/1/german-text
          

          这将设置搜索引擎。对于用户,他们可以看到正确语言的 URL,您可以使用 HTML 5 历史记录更改 URL。

          这是额外的工作,但如果你真的想要......

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-07-23
            • 2011-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-29
            • 1970-01-01
            • 2012-12-26
            相关资源
            最近更新 更多