Вы можете реализовать собственный обработчик запросов и разрешать язык для каждого запроса. Это та же идея, что и ваш "в каждом контроллере вызывать метод для установки языка" но код нужно писать только в одном месте - legacy GlobalSettings.onRequest
или new HttpRequestHandler.createAction
Существует очень хорошее описание реализации i18n в игре, основанное на части URL, единственное - это для 2.0.4, так что я полагаю, что вы должны использовать HttpRequestHandler.createAction
, но GlobalSettings.onRequest
.
Руководство: http://www.flowstopper.org/2013/01/i18n-play-framework-java-app-website.html
Руководство по миграции: https://www.playframework.com/documentation/2.4.x/GlobalSettings< /а>
Пользовательские обработчики запросов: https://www.playframework.com/documentation/2.4.x/JavaHttpRequestHandlers
Живые примеры из моего проекта (Play 2.4.3, Java)
application.conf
play.i18n.langs = [ "en", "de", "fr", "ua" ]
play.http.requestHandler = "plugins.RequestHandler"
маршруты
# Home page
GET /$lang<[a-z]{2}>/home controllers.Application.home(lang:String)
плагины/RequestHandler.java
package plugins;
import play.http.DefaultHttpRequestHandler;
import play.libs.F;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.Result;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.lang.reflect.Method;
public class RequestHandler extends DefaultHttpRequestHandler {
@Override
public Action createAction(Http.Request request, Method actionMethod) {
return new Action.Simple() {
@Override
public F.Promise<Result> call(Http.Context ctx) throws Throwable {
Path path = Paths.get(ctx.request().path());
String lang = path.getName(0).toString();
// we detect language only by URL path, cookies does not used
ctx.setTransientLang(lang);
return delegate.call(ctx);
}
};
}
}
контроллеры/Application.java
package controllers;
import play.*;
import play.mvc.*;
import play.i18n.Lang;
import views.html.*;
public class Application extends Controller {
public Result home(String lang){
return ok(ctx().lang().code());
}
}
Это приложение даст результаты
http://localhost:9000/de/home -> "de"
http://localhost:9000/en/home -> "en"
http://localhost:9000/dk/home -> "исключение: Язык не поддерживается в этом приложении: Lang(dk,) не в Lang.availables()"
Обратите внимание: Lang.defaultLang().language()
не возвращает текущий язык запроса. Вам нужно вызвать ctx().lang()
для возврата текущего языка запроса.
person
Andriy Kuba
schedule
23.09.2015