【问题标题】:Play Framework 2 Language Code in URL Concept?在 URL 概念中播放框架 2 语言代码?
【发布时间】:2015-09-23 15:40:21
【问题描述】:

关于 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 中读取吗?

另外,在路由文件中,是否已经有将其直接映射到语言解析的概念?

替代方法是:

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

【问题讨论】:

    标签: playframework playframework-2.4


    【解决方案1】:

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

    基于 url 部分,有一个关于实现 i18n 的很好的描述,唯一的一件事 - 它适用于 2.0.4,所以我想你会使用HttpRequestHandler.createActionGlobalSettings.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);
                }
            };
        }
    }
    

    控制器/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 -> "zh"

    http://localhost:9000/dk/home -> “异常:此应用程序不支持语言:Lang(dk,) 不在 Lang.availables() 中”

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

    【讨论】:

    • 您好,谢谢您的回答!另外我必须注意调用 ctx().lang().code()lang 参数返回相同,所以我认为可以使用任何一个。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多