java - 可读取 xml 文件的本地化菜单

标签 java xml xslt localization menu

我有下一个问题。对于我的 Java 网络应用程序,我为导师和学生使用 2 种菜单变体。之后,根据登录用户的角色,我将 xml 文件转换为 html 并包含在页面中。这意味着我应该使用 4 个 xml 文件和 4 个 html 文件(如果我想使用本地化 2 个语言环境和多线程应用程序),获取当前语言环境并选择文件源和结果进行转换,还是存在其他方法来做到这一点?

最佳答案

如果我理解正确的话,你有两种不同的观点,每种观点都有两种可能的语言:

  • 导师查看(页面)
    • 英语
    • 使用第二语言
  • 供学生查看
    • 英语
    • 使用第二语言

据我所知,没有标准实用程序可以为同一页面定义不同的 View (对于您的案例中的导师和学生),因为这在很大程度上取决于应用程序。所以你可以使用任何方法。您使用不同 XML 源的方法听起来不错。

对于区域设置,标准方法是使用 Java Resource Bundles 。还有其他用于国际化的实用程序,例如 cosmopolitan等。使用此功能将为您带来将 XML 文件与语言翻译分离的优势,因此您只需要 2 个 XML 文件。这也意味着,如果您将 XML 文件更改为英语,则无需将 XML 文件更改为第二种语言。

但是,您需要避免在 XML 文件中存储可本地化的文本,而是存储将用于获取当前区域设置的正确文本的特殊

例如:

<page>
  <title>${title}</title>
  <body>
    <heading>${heading}</heading>

    ${introduction}

    Copyright (c) 2012
  </body>
</page>

然后,您可以在属性文件中定义可本地化部分(例如 ${title}${heading})的翻译:

#In Translations_en.properties file
title=Page for tutors
heading=Introduction
introduction=Welcome to the tutors page!

#In Translations_<yourlanguage>.properties file
title=...
heading=...
introduction=...

然后修改您的 XML -> HTML 转换过程,以提取 ${key} 中的键,并将其替换为基于以下内容的 .properties 文件之一的值:当前区域设置。

编辑:

你可以试试这个:

1) 从 XML 模板开始(让我们稍微简化一下):

<!-- tutor.xml -->
<page>
  <title>${title}</title>
</page>

2) 创建并应用预处理器,将模板转换为每种语言的本地化模板。输出应如下所示:

<!-- tutor_en.xml -->
<page>
  <title>Title</title>
</page>

<!-- tutor_ru.xml -->
<page>
  <title>Название</title>
</page>

3) 在运行时转换并加载适当的模板。粗略地说,您的代码将如下所示:

// Get xml template name based on current locale
String getLocalisedTemplate(String baseName){
  return baseName + "_" + Locale.getDefault().getLanguage() + ".xml";
}

public String renderPage(){
  if(currentUser.isTutor()){
    //This will be tutor_en.xml or tutor_ru.xml
    String templateFile = getLocalisedTemplate("tutor");

    //Return localised and transformed HTML
    return applyXslt("tutor.xslt", templateFile);
  } else if (currentUser.isStudent()){
    // same as above replacing tutor with student
  }
}

我使用 Locale.getDefault() 进行说明,在您的应用程序中,您可能会采用不同的方式来确定当前用户区域设置(可能来自用户设置)。

本质上,上述方法与您最初的提案非常相似。唯一的区别是本地化 XML 文件是在步骤 2 中从 XML 模板自动生成的,因此您不必手动管理它们。

对于用户同时使用,用户之间的观点不应发生冲突。这将取决于您如何部署界面:桌面 Java 应用程序、小程序、基于 Web 的应用程序等。无论您采用哪种方法,每个用户都应该拥有他/她自己的 JVM 实例或自己的 session ,并且是解耦的来自其他用户。

关于java - 可读取 xml 文件的本地化菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10757068/

相关文章:

xslt - 测试参数是否是 XSLT 中的几个值之一

java - Spring Boot - 字符串到枚举的转换接受枚举的值和索引。如何拒绝数字输入并仅接受枚举值?

java - Java 发明了接口(interface)吗?

python - 在 Python 中将命名空间放入不同的 XML 标签中

javascript - onmousedown 在动态生成的 html 元素上

android - 在 Android 中使用 XSLT 转换 XML 文件

java - 过滤涉及安全约束的请求

java - 我必须在应用程序退出时手动关闭 Executor 吗?

objective-c - 解析 XML CDATA block

xml - 将节点的文本字符串添加到其 previous sibling 节点的子文本字符串中