2012-05-04 21 views
5

昨天我们在当地的JUG上有一个Play 2.0演示文稿,但我们无法弄清楚是否有可能有本地化的URL(用于SEO目的)。Play 2.0中的本地化网址?

例如/ 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> 
0

很可能在播放1.2.x的,而不是在2.X据我所知。我的意思是,如果没有复制文件中的映射,不可能添加一个EN,一个DE等。

SEO更简单的替代方法可能是在您的Sitemaps文件中“伪造”URL。

所以你的路由文件有

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

所以seo-string将在处理被忽略,你生成你的站点地图文件的几个环节:

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

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

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

1

(这比previous answer不同的方法,因此添加单独的一个)

您还可以创建在DB某种mapping table在这里你可以存储与不同PARAMS完整路径记录:

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文件的末尾上面的规则将自定义一个标准的路由mechanismus如果没有“静态”的规则将是可用的,那么它会尝试找到它在映射表中或将返回notFound()结果。