我目前正在使用标准方法开发多语言Xpages驱动的应用程序,以通过内部.property资源和resourceBundles本地化静态和动态字符串。在应用程序中,用户可以选择他们喜欢的语言,该决定当前存储在用户配置文档中;我还计划将这些决定存储为浏览器Cookie。如果没有用户定义的首选项,则浏览器的默认语言将驱动应用程序内使用的语言环境。这对于所有服务器端元素都适用。

现在,我必须添加一些客户端脚本,并且还需要使用一些本地化的字符串。我必须承认我没有线索,这是最好的方法。

主要问题是:

  • 我可以以某种方式使用现有文件资源/资源包吗?
  • 如果是这样:如何从脚本代码中引用那些资源?
  • 如果不是:组织和引用我自己的文件资源的最佳方法是什么?
  • 最后:如果我必须自己做所有事情:如何确定用户首选的语言环境?如果设置了cookie(参见上文),那很容易,但是如果我需要引用浏览器的首选项和/或如果用户不允许使用cookie,该怎么办?

  • 编辑:我考虑过dojo i18n way,但我不知道如何实现这样的自定义插件。

    最佳答案

    一种替代方法是直接在浏览器中读取资源包,并在需要的地方使用JavaScript进行引用。因此,回答您的主要问题:

  • 是的,但是如果直接从NSF加载它,则还不能真正使用。我建议创建一个XPage以将其作为JSON对象输出给您:
    <?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>
    
  • 您需要包含来自1.的XPage作为页面上的客户端JavaScript库。我从1开始在XPage中创建了一个名为translations的全局JavaScript变量,因此您可以将其称为translations.key,其中key引用属性文件中的变量。
  • 不需要答案...
  • 在答案1的XPage中,您可以根据用户的语言环境(浏览器语言设置)加载适当的资源包:
    <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>
    
  • 10-08 17:01