5

Yesterday we had a Play 2.0 presentation at our local JUG but we couldn't figure out whether it is possible to have localized URLs (for SEO purposes).

For example /help, /hilfe etc should point to the same controller but the template should be rendered with different language content.

Is there any way to do this in Play 2.0?

4

4 回答 4

3

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

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>
于 2012-05-04T13:14:47.443 回答
1

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

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

此外,您可以创建自己的路由器。在google-groups有一个关于它的讨论,带有一个scala 解决方案

于 2012-05-09T10:25:42.333 回答
1

(这与以前的答案不同,因此作为单独的方法添加)

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

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

比在conf/routes文件中您需要使用允许您使用的规则Dynamic parts spanning several /(请参阅路由文档)即:

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

如果没有“静态”规则可用,您还可以将标准路由机制与自定义路由机制混合在一起,如果没有可用的“静态”规则,则将上述规则放在conf/routes文件末尾,然后它将尝试在映射表中找到它或返回notFound()结果。

于 2012-05-04T14:52:08.123 回答
0

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

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

所以你的 Routes 文件有

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

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

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

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

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

于 2012-05-04T13:21:57.847 回答