Play 1.1のいくつかの古い変更ノートの解決策を見つけました: http://www.playframework.org/documentation/1.2/releasenotes-1.1(「グローバルルート引数」の下にあります)。奇妙なことに、他のどこにも言及されていません。
[全体の作業溶液含めるように編集] [EDIT2 - 問題を修正する]
私のルートは、このような外観をファイル:
# 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)
アノテーションを使用するか、コントローラーのスーパークラスを変更するかを選択する必要がありました。 @Withアノテーションを選択します。
私は満足しています、それは結局かなり簡単でした。 私は誰かが上記の恩恵を受けることを願っています。
チュートリアルでレンダリングするタスクを定義する方法と同様のものを試しましたか? 'POST/tasks /:id/delete controllers.Application.deleteTask(id:Long)'の行に何かがあります。 –
フレームワークのバージョン? – sdespolit
Dan:すべてのコントローラを変更する必要はありませんか?lang属性を受け入れるには? – DarkNeuron