简短版本:是否有一种有吸引力的,简单的方法来实现特定于语言的url结构,ala。 Play 1.2.5中的host.com/en/或host.com/pt/?
我正在寻找一种不需要更改所有控制器的解决方案,并且最好只对路由文件进行更改,因为我不需要两组冗余视图 - 每种语言一个。
我已经有了message.pt和message.en,我有办法在两者之间切换,但在路由方面我是个新手。
我意识到路由文件可以包含如下路由:“/(en | pt)/”但我有点卡在这里。
如果问题有点含糊,我会表示同意。 如果有需要,我很乐意澄清。
答案 0 :(得分:1)
我认为没有办法解决这个问题,你必须对你的控制器做点什么。
我没有对此进行过测试,但这样的事情应该有效:
public static class LanguageParams extends Controller
{
@Before
static void addLanguageParam(String language)
{
renderArgs.put("lang", language);
}
}
您需要将@With添加到每个控制器中,如下所示:
@With(LanguageParams.class)
public class Foo extends Controller
{
....
}
...在你的路线中你会有这样的事情:
GET foo/{<en|pt>language>}/whatever Foo.index()
在写这篇文章时,我想到你可以用插件做到这一点,请参阅:http://www.playframework.org/documentation/api/1.2/play/PlayPlugin.html#beforeActionInvocation(java.lang.reflect.Method)
答案 1 :(得分:1)
我在Play 1.1的一些旧版更改说明中找到了解决方案: http://www.playframework.org/documentation/1.2/releasenotes-1.1(在“全球路线论证”下)。奇怪的是,在其他任何地方都没有提到它。
[编辑包含整个工作解决方案] [编辑2 - 修正了问题]
我的路线文件如下所示:
# Home page
GET /{lang}/? Application.index
GET / Application.redirect
GET /{lang}/woops/? Application.underConstruction
语言控制器看起来像这样atm:
public class Language extends Controller {
@Before
static void detectLangInURL() {
String url = request.url;
if (url.length() > 2 && isSupported(getFromUrl(url)))
{
String lang = getFromUrl(url);
if (!Lang.get().equals(lang)) {
Lang.change(lang);
response.setCookie("lang", lang, "60d");
}
renderArgs.put("lang", Lang.get());
routeArgs.put("lang", Lang.get());
}
}
private static String getFromUrl(String url) {
String[] s = url.split("[/]");
if (s.length > 1)
return s[1];
else return "";
}
private static boolean isSupported(String lang) {
if (lang.length() == 0)
return false;
String[] langList = Play.configuration.get("application.langs").toString().split(",");
for (int i = 0; i < langList.length; i++) {
if (langList[i].compareToIgnoreCase(lang) == 0)
return true;
}
return false;
}
}
重定向方法如下所示:
public static void redirect() {
Cookie lang = request.current().cookies.get("lang");
if (lang != null && !lang.value.isEmpty())
Lang.change(lang.value);
redirect(Lang.get() + "/");
}
我必须在使用@With(Language.class)
注释或更改Controller超类之间进行选择。我选择@With注释。
我很高兴,结果很简单。 我希望有人能从中受益。