npi*_*tos 5 list dynamic spring-mvc internationalization
我已经在 Spring MVC 3 中设置了 i18n,并且它工作正常。有几个文件,每个文件都有自己的语言:messages_en.properties、messages_de.properties 等。
在我的一个 JSP 中,我需要向用户展示一个包含所有可用语言的组合,我希望这个列表是动态的,即从服务器中的现有语言文件动态生成。
是否有任何内置方法来生成此列表?还是我必须求助于检查语言文件所在的文件夹并解析它们?
谢谢!
纳乔
好的,找到了两个解决方案。对于两者,假设它们在 Spring MVC 带注释的类中执行@Controller。每个都会生成一个 HashMap ( languages),其中键是 2 个字母的 ISO 语言代码,值是语言名称(在当前的 Locale 中,在这些示例中是一个名为 的静态变量HSConstants.currentLocale)
1.- 由 @millhouse 提交的(见上文/下文),经过一些调整后即可工作:
HashMap languages = new HashMap();
final String defaultMessage = "NOT FOUND";
HashMap availableLocales = new HashMap();
for (Locale locale : Locale.getAvailableLocales()) {
String msg = rrbms.getMessage("currentLanguage", null, defaultMessage, locale);
if (!defaultMessage.equals(msg) && !availableLocales.containsKey(locale.getLanguage())){
availableLocales.put(locale.getLanguage(), locale);
}
}
for (String c : availableLocales.keySet()){
languages.put(c, availableLocales.get(c).getDisplayLanguage(HSConstants.currentLocale));
}
model.addAttribute("languages", languages);
Run Code Online (Sandbox Code Playgroud)
此解决方案要求在每个语言 .properties 文件中设置该语言的条目(在上面的示例中,该条目为“currentLanguage”)。例如,在 messages_it.properties 中,必须有一个像这样的条目:currentLanguage=Italiano
2.- 原始方法,即直接访问文件夹/文件:假设文件语言位于 /WEB-INF/languages 中,并且具有 fr-messages 的基本名称:
HashMap languages = new HashMap();
String languagesFolderPath = request.getSession().getServletContext().getRealPath("/WEB-INF/languages");
File folder = new File(languagesFolderPath);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++){
String fileName = listOfFiles[i].getName();
if (fileName.startsWith("fr-messages_") && fileName.endsWith(".properties")){
// Extract the language code, which is between the underscore and the .properties extension
String language = fileName.substring(12, fileName.indexOf(".properties"));
Locale l = new Locale(language);
languages.put(language, l.getDisplayLanguage(HSConstants.currentLocale));
}
}
model.addAttribute("languages", languages);
Run Code Online (Sandbox Code Playgroud)
然后,在 JSP 中,使用languages地图呈现选择框:
<select name="language">
<c:forEach items="${languages}" var="language">
<c:choose>
<c:when test="${platform.language == language.key}">
<option value="${language.key}" selected="SELECTED">${language.value}</option>
</c:when>
<c:otherwise>
<option value="${language.key}">${language.value}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
Run Code Online (Sandbox Code Playgroud)