Playframework 在URL概念中使用框架2语言代码?

Playframework 在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文件中,是否已经有了将其直接映射到语言的概念 另一

关于i18n的手册很简短:还有什么可以解释处理用户语言选择的概念吗

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

然后,当调用(Java)
Lang.defaultLang().language()
或从Scala模板
@Lang.language
时,我希望得到该值。当然,对于通常的解析,它必须位于application.conf
play.i18n.langs=[“en”,“de”]

我真的需要自己从URL上读吗

另外,在routes文件中,是否已经有了将其直接映射到语言的概念

另一种选择是:

  • 按语言复制routes文件中的所有routes,或对lang代码使用正则表达式
  • 在每个控制器中调用一个用于设置语言的方法

  • 您可以在每个请求上实现自定义请求处理程序和解析语言。这与您的“在每个控制器中调用一个用于设置语言的方法”的想法相同,但您只需要在一个位置编写代码—legacy
    GlobalSettings.onRequest
    或new
    HttpRequestHandler.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());
        }
    
    }