【问题标题】:Change language with button on play framework使用播放框架上的按钮更改语言
【发布时间】:2014-10-27 07:32:15
【问题描述】:

首先对不起我的英语......

我正在搜索所有互联网,但找不到我的问题的答案。我尝试了所有方法,查看了文档、教程、视频等...

我在页面顶部放置了两个按钮,用户可以更改语言,但我无法在控制器上捕捉到值,我做了所有事情但始终无法处理。我是新手:(请帮忙...!!

我有这个观点:

<`form method="GET" action="@{Application.language("value")}"/`>
    <`input> name="language" type="submit" value="en" title="@Messages("button.en")" </`>
    <`input> name="language" type="submit" value="es" title="@Messages("button.es")" </`>
<`/form`>

这在我的控制器上:

public static void language(String idiom) {
    String key = null;
    key = idiom;

    if(key.isEmpty()){

    } else {
        Lang.apply(idiom);
    }
}

但是当我尝试在我的控制器上获取值时,我总是收到这条消息:

[运行时异常:无法识别的语言:值]

【问题讨论】:

    标签: java web playframework frameworks playframework-2.0


    【解决方案1】:

    在 play 2.8 中,Http.Context 已被弃用,这会导致与响应对象的交互发生变化。

    要更改语言,您需要执行以下操作:

    • 将 MessagesApi 实例注入控制器
    • 使用您打算使用的语言创建一个 Lang 对象的实例
    • 在结果对象上使用方法 .withLang(Locale locale, MessagesApi messagesApi)

    代码说明:

        private final MessagesApi messagesApi;
    
        @Inject
        public LoginController(MessagesApi messagesApi) {
            this.messagesApi = messagesApi;
        }
    
        // ... now in the method invoked by the router
    
        Lang lang = Lang.apply("en"); //english language
        return ok().withLang(lang.toLocale(), messagesApi);
    

    这会在会话的其余部分更改语言,因为 play 会将语言存储在 cookie PLAY_SESSION 中。如果您只想更改一个特定请求,则必须更改请求对象而不是结果对象。

    Reference here

    【讨论】:

      【解决方案2】:

      你在 conf 文件夹中有 messages.{lang}(比如 messages.es 或 messages.en)对吗?

      并且在 application.conf 中应该存在有效的语言;

      application.langs="en,es"

      如果你在任何扩展 Controller 的类中有这些,你可以运行这个方法;

      changeLang("es");

      但在你的情况下,你的函数中的习语的价值似乎是“价值” 因此,如果您觉得没问题,只需将表单标题替换为;

      form method="GET" action="/language"/>

      (假设 /language 将路由到您的方法)

      并将 html 输入的名称替换为“idiom” 所以你将传递正确的输入值。

      【讨论】:

        【解决方案3】:

        我在下面的评论中做了一些修改,这就是我现在的样子。

        路线:

        POST    /   @controllers.LanguageController.changeLanguage(language: String)
        

        查看:

        <form method="POST" action="changeLanguage("value")"/>
            <input name="language" type="submit" value="en" title="English" </>
            <input name="language" type="submit" value="es" title="Spanish" </>
        </form>
        

        控制器:

        公共类 LanguageController 扩展控制器{

        public Result changeLanguage(String language)
        {
            if(language != null && !language.isEmpty())
            {
                Lang.apply("en");
            } 
            else
            {
                String idiom = language;
                Lang.apply(idiom);
            }
            return ok(index.render(""));
        }
        

        现在我收到此消息错误:

        对于请求'POST /changeLanguage(value)'

        页面错误显示了 LanguageController 的路由:

        POST/@controllers.LanguageController@.changeLanguage(language:String)
        

        【讨论】:

          【解决方案4】:

          您的 HTML 看起来有点可疑,您可以清理它并与您的控制器和路由一起重新发布吗?

          与此同时,这大致是我希望看到的以确保您的参数正确传递:

          路线:

          GET     /language  @controllers.LanguageController.index(language: String)
          

          控制器:

          LanguageController {
          ...
            public Result index(String language) {
                  if(language != null && !language.isEmpty()){
                      Lang.apply(idiom);
                  }   
                  ... return
              }
           }
          

          要在 Play 2 中进行设置,请参阅此帖子 playframework 2.2 java: how to set language (i18n) from subdomain

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            • 1970-01-01
            • 2021-03-26
            • 2013-02-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多