使用播放框架上的按钮更改语言

时间:2014-09-02 22:36:52

标签: java web playframework frameworks playframework-2.0

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

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

我在页面顶部放了两个按钮,用户可以更改语言,但我无法抓住控制器上的值,我做了所有事情,但从未处理过。我是新玩的:(请帮忙...... !!

我认为这是:

<`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);
    }
}

但是当我试图抓住控制器上的值时,我总是收到这条消息:

[RuntimeException:无法识别的语言:值]

4 个答案:

答案 0 :(得分:0)

你的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

答案 1 :(得分:0)

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

路线:

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>

控制器:

public class LanguageController扩展Controller {

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)

答案 2 :(得分:0)

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

在application.conf中,有效的lang应该存在,如;

application.langs =&#34;恩,胚胎&#34;

如果在扩展Controller的任何类中都有这些,那么可以运行此方法;

changeLang(&#34; ES&#34);

但在你的情况下,你的函数中的成语似乎是&#34;值&#34; 因此,如果您可以将表单标题替换为;

&LT; form method="GET" action="/language"/&GT;

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

并将html输入的名称替换为&#34; idiom&#34; 所以你将传递正确的输入值。

答案 3 :(得分:0)

在播放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);

这会在整个会话的剩余时间内更改语言,因为播放会将语言存储在Cookie PLAY_SESSION中。如果只想更改一个特定请求,则必须更改请求对象而不是结果对象。

Reference here