我目前正在使用标准方法开发多语言Xpages驱动的应用程序,以通过内部.property
资源和resourceBundles
本地化静态和动态字符串。在应用程序中,用户可以选择他们喜欢的语言,该决定当前存储在用户配置文档中;我还计划将这些决定存储为浏览器Cookie。如果没有用户定义的首选项,则浏览器的默认语言将驱动应用程序内使用的语言环境。这对于所有服务器端元素都适用。
现在,我必须添加一些客户端脚本,并且还需要使用一些本地化的字符串。我必须承认我没有线索,这是最好的方法。
主要问题是:
编辑:我考虑过dojo i18n way,但我不知道如何实现这样的自定义插件。
最佳答案
一种替代方法是直接在浏览器中读取资源包,并在需要的地方使用JavaScript进行引用。因此,回答您的主要问题:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false">
<xp:this.resources>
<xp:bundle
src="/labels_en.properties"
var="translations">
</xp:bundle>
</xp:this.resources>
<xp:this.afterRenderResponse><![CDATA[#{javascript:
try {
var externalContext = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();
response.setContentType("application/json");
var jsonOutput = {};
var keys = translations.keySet();
for (var key in keys) {
jsonOutput[key] = translations[key];
}
writer.write( "var translations = " + toJson(jsonOutput) ) ;
writer.endDocument();
} catch (e) {
print(e);
}
}]]>
</xp:this.afterRenderResponse>
</xp:view>
translations
的全局JavaScript变量,因此您可以将其称为translations.key
,其中key
引用属性文件中的变量。 <xp:this.resources>
<xp:bundle var="translations">
<xp:this.src><![CDATA[#{javascript:
var language = "en"; //default language
switch (context.getLocaleString() ) {
case "nl":
language = "nl";
break;
}
return "/labels_" + language + ".properties";}]]></xp:this.src>
</xp:bundle>
</xp:this.resources>