在URL概念中玩框架2语言代码?

时间:2015-09-23 15:40:21

标签: playframework playframework-2.4

关于i18n的手册很简短:https://www.playframework.com/documentation/2.4.x/ScalaI18N还有什么可以解释处理用户语言选择的概念吗?

我想要实现的是其他许多网站所做的事情:将语言代码放入网址

然后,在调用(Java)Lang.defaultLang().language()或从Scala模板@lang.language调用时,我想获得该值。当然,通常的解决方法是,它必须位于application.conf play.i18n.langs = [ "en","de" ]

我真的需要自己从网址上阅读它吗?

此外,在路径文件中,是否已存在将其直接映射到语言解析的概念?

替代方案是:

  1. 按语言复制路径文件中的所有路由,或使用正则表达式来使用lang代码
  2. 在每个控制器中调用一种设置语言的方法

1 个答案:

答案 0 :(得分:3)

您可以在每个请求上实现自定义请求处理程序并解析语言。这与您的“在每个控制器中调用一种设置语言的方法”相同,但您只需要在一个地方编写代码 - 遗留GlobalSettings.onRequest或新HttpRequestHandler.createAction

基于url部分有一个关于实现i18n的非常好的描述,唯一一件事 - 它是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 - &gt; “去”

http://localhost:9000/en/home - &gt; “EN”

http://localhost:9000/dk/home - &gt; “异常:此应用程序不支持的语言:Lang(dk,)不在Lang.availablebles()”

请注意: Lang.defaultLang().language()不会返回当前的请求语言。您需要致电ctx().lang()以返回当前请求语言。