昨天我们在当地JUG播放了一个Play 2.0演示文稿,但我们无法确定是否可以使用本地化的URL(用于搜索引擎优化目的)。
例如/ help,/ hilfe等应指向同一个控制器,但模板应使用不同的语言内容呈现。
在Play 2.0中有没有办法做到这一点?
答案 0 :(得分: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>
答案 1 :(得分:1)
(这与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)
如果没有“静态”规则可用,你可以将标准路由机制与自定义路由机制放在conf/routes
文件的末尾,然后它会尝试在映射表中找到它或将返回notFound()
结果。
答案 2 :(得分:1)
您使用GlobalSettings.onHandlerNotFound()并检查它是否是网址的翻译版本。然后你可以进行重定向。但是,这会以默认语言的网址结束。
更干净的是使用GlobalSettings.onRouteRequest,您可以在其中实现自己的逻辑来获取处理程序。
此外,您可以创建自己的路由器。我在google-groups与scala solution进行了讨论。
答案 3 :(得分:0)
据我所知,它可以在Play 1.2.x中使用,而不是2.x.我的意思是,如果没有复制文件中的映射,为EN添加一个,为DE添加一个等,则不可能。
SEO的一个更简单的替代方案可能是&#34;假的&#34;站点地图文件中的网址。
所以你的Routes文件有
GET /action/:param/:seo-string Controller.methodAction(param)
因此在处理过程中会忽略seo-string
,并在Sitemaps文件中生成多个链接:
/action/1/english-text
/action/1/german-text
这会设置搜索引擎。对于用户,他们会以正确的语言查看网址,您可以使用HTML 5历史记录更改网址。
这是额外的工作,但如果你真的想要它......