Playframework 在URL概念中使用框架2语言代码?
关于i18n的手册很简短:还有什么可以解释处理用户语言选择的概念吗 我想实现的是许多其他网站所做的:将语言代码放入URLPlayframework 在URL概念中使用框架2语言代码?,playframework,playframework-2.4,Playframework,Playframework 2.4,关于i18n的手册很简短:还有什么可以解释处理用户语言选择的概念吗 我想实现的是许多其他网站所做的:将语言代码放入URL 然后,当调用(Java)Lang.defaultLang().language()或从Scala模板@Lang.language时,我希望得到该值。当然,对于通常的解析,它必须位于application.confplay.i18n.langs=[“en”,“de”] 我真的需要自己从URL上读吗 另外,在routes文件中,是否已经有了将其直接映射到语言的概念 另一
Lang.defaultLang().language()
或从Scala模板@Lang.language
时,我希望得到该值。当然,对于通常的解析,它必须位于application.confplay.i18n.langs=[“en”,“de”]
我真的需要自己从URL上读吗
另外,在routes文件中,是否已经有了将其直接映射到语言的概念
另一种选择是:
您可以在每个请求上实现自定义请求处理程序和解析语言。这与您的“在每个控制器中调用一个用于设置语言的方法”的想法相同,但您只需要在一个位置编写代码—legacy
GlobalSettings.onRequest
或newHttpRequestHandler.createAction
关于基于url部分的i18n实现,有一个非常好的描述,这是唯一的一件事——它适用于2.0.4,所以我想您应该使用HttpRequestHandler.createAction
但是GlobalSettings.onRequest
指南:
迁移指南:
自定义请求处理程序:
来自我的项目的实例(Play 2.4.3,Java)
application.conf
路线
这个应用程序会给出结果
->“德”
->“恩”
->“异常:此应用程序不支持语言:Lang(dk,)不在Lang.availables()中”
注意:
Lang.defaultLang().language()
将不会返回当前请求语言。您需要调用ctx().lang()
返回当前请求语言。您好,谢谢您的回答!我还必须注意,调用ctx().lang().code()和lang参数返回相同的结果,因此我认为可以使用其中任何一个。
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)
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);
}
};
}
}
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());
}
}