URL 概念中的 Play Framework 2 语言代码?
Play Framework 2 Language Code in URL Concept?
关于 i18n 的手册很短:https://www.playframework.com/documentation/2.4.x/ScalaI18N是否有更多解释处理用户语言选择的概念?
我想要实现的是许多其他网站所做的:将语言代码放入 URL
然后,当调用 (Java) Lang.defaultLang().language()
或从 Scala 模板 @lang.language
时,我想获取该值。当然用通常的解析,它必须在 application.conf play.i18n.langs = [ "en","de" ]
我真的需要从 URL 自己阅读它吗?
另外,在routes文件中,不是已经有了直接映射到语言解析的概念吗?
备选方案是:
- 复制路由文件中每种语言的所有路由,或对语言代码使用正则表达式
- 在每个控制器中调用一个设置语言的方法
您可以实施自定义请求处理程序并为每个请求解析语言。这与您的 "in each controller call a method for setting the language" 的想法相同,但您只需在一个地方编写代码 - 旧版 GlobalSettings.onRequest
或新版 HttpRequestHandler.createAction
基于 url 部分,有一个关于 realization i18n in play 的非常好的描述,唯一的一件事 - 它适用于 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)
plugins/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);
}
};
}
}
controllers/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 -> "exception: Language not supported in this application: Lang(dk,) not in Lang.availables()"
注意:
Lang.defaultLang().language()
不会 return 当前请求语言。您需要调用 ctx().lang()
以获得 return 当前请求语言。
关于 i18n 的手册很短:https://www.playframework.com/documentation/2.4.x/ScalaI18N是否有更多解释处理用户语言选择的概念?
我想要实现的是许多其他网站所做的:将语言代码放入 URL
然后,当调用 (Java) Lang.defaultLang().language()
或从 Scala 模板 @lang.language
时,我想获取该值。当然用通常的解析,它必须在 application.conf play.i18n.langs = [ "en","de" ]
我真的需要从 URL 自己阅读它吗?
另外,在routes文件中,不是已经有了直接映射到语言解析的概念吗?
备选方案是:
- 复制路由文件中每种语言的所有路由,或对语言代码使用正则表达式
- 在每个控制器中调用一个设置语言的方法
您可以实施自定义请求处理程序并为每个请求解析语言。这与您的 "in each controller call a method for setting the language" 的想法相同,但您只需在一个地方编写代码 - 旧版 GlobalSettings.onRequest
或新版 HttpRequestHandler.createAction
基于 url 部分,有一个关于 realization i18n in play 的非常好的描述,唯一的一件事 - 它适用于 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)
plugins/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);
}
};
}
}
controllers/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 -> "exception: Language not supported in this application: Lang(dk,) not in Lang.availables()"
注意:
Lang.defaultLang().language()
不会 return 当前请求语言。您需要调用 ctx().lang()
以获得 return 当前请求语言。