Play Framework 2.0 - 渲染视图中的问题

时间:2013-11-25 12:01:11

标签: javascript html playframework-2.0

我按照此链接https://github.com/julienrf/play-jsmessages/commit/3f67083e296edc039af6ed7fc0fe698a282d01b5在javascript中实现了i18N。

Application.java
===================
package controllers;

import java.util.HashMap;
import java.util.Map;
import play.i18n.Messages;
import play.i18n.Lang;
import play.*;
import play.mvc.*;
import jsmessages.JsMessages;

import views.html.*;

import models.Session;

public class Application extends Controller {

    private static Session session;
    final static JsMessages messages = new JsMessages(play.Play.application());

    /**
     * Loads the application
     * @return
     */
    public static Result index() {
        return load();
    }
    public static Result jsMessages() {
        System.out.println("in jsMessages");
        return ok(messages.generate("window.Messages")).as("application/javascript");
    }

    /**
     * Initial load function, clears all stored session data
     * @return Redirect to homepage.html
     */
    public static Result load() {
        System.out.println("in load1");
        session = new Session();
        changeLang("fr");
        jsMessages();
        return ok(mainpage.render(messages));
    }


    public static Result reset() {
        session = new Session();
        return ok();
    }

    public static Session getSession() {
        if(session == null) {
            session = new Session();
        }
        return session;
    }
}

HTML which is rendered properly if i don't include i18n code for javascripts
mainpage.scala.html
==========================
@(messages: jsmessages.JsMessages)
<html>
<head>
@messages.html("window.Messages")
</head>

//some code goes here

</html>


javascript loaded on rendering homepage.scala.html
Main.js
======
// some code goes here
alert(Messages('first'));
//some code goes here


If I am not including i18n code in Application.java , mainpage.scala.html and main.js , my application is working fine but after including i18n code , page is not getting loaded.

根据我的理解,问题在于渲染,因为从load()和jsMessages()返回了两个结果。请建议我如何渲染javascript和html或任何其他方式以便解决此问题。

2 个答案:

答案 0 :(得分:1)

您必须在文件(路线)中加载'jsMessages'或在模板中显示它们。

首先,您使用:

// Controller:
public static Result jsMessages() {
    System.out.println("in jsMessages");
    return ok(messages.generate("window.Messages")).as("application/javascript");
}

// Route file:
GET     /messages.js                controllers.Application.jsMessages()

// Template:
<script type="text/javascript" src="@routes.Application.jsMessages()"></script>

第二种情况,然后删除public static Result jsMessages()和:

// Controller
public static Result load() {
    System.out.println("in load1");
    session = new Session();
    changeLang("fr");
    return ok(mainpage.render(messages.generate("window.Messages")));
}

// Template:
@(messages: String)
<script type="text/javascript">@messages</script>

答案 1 :(得分:0)

注意:这不是您问题的直接答案,只是对其他方法的建议

您根本不需要使用Play的控制器,而是可以使用放置在公共资源中的纯JS文件。假设你有2种语言,其中一种是默认的(让我们假设是英语)在这种情况下你只需要声明一个带有翻译标签的对象和一些getter即:

<强> /public/i18n/messages.js

var messages_default = {
   'save': 'Save',
   'delete': 'Delete',
   'warning': 'You can\'t do that'
}

function jsMessage(key) {
    var translated = messages[key];
    if (typeof translated === "undefined") {
        translated = messages_default[key];
        if (typeof translated === "undefined") {
            translated = key;
        }
    }
    return translated;
}

所以你可以为每种语言创建一个新文件,只添加翻译(注意:没有_default后缀)

/public/i18n/messages_de.js 使用谷歌翻译作为'翻译,不要责怪我;)):

var messages = {
    'save': 'Sparen',
    'delete': 'Löschen',
    'warning': 'Sie können nicht tun'
}

在Play的本地化文件中(仅限非默认语言!在这种情况下为conf/messages.de)为其他语言JS文件的路径添加标签,即:

add_i18n = i18n/messages_de.js

所以最后你可以用德语版本包含它或者在简单条件下跳过默认语言(请记住,对于非现有标签,Play的Messages会返回键)

<script src='@routes.Assets.at("i18n/messages_default.js")'></script>
@if(Messages("add_i18n") != "add_i18n")){
    <script src='@routes.Assets.at(Messages("add_i18n"))'></script>
}

所以最后你可以在JS中使用它:

<script>
    alert( jsMessage('warning') );
</script>