我按照此链接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或任何其他方式以便解决此问题。
答案 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>