在 Spring MVC 中动态生成可用语言列表

npi*_*tos 5 list dynamic spring-mvc internationalization

我已经在 Spring MVC 3 中设置了 i18n,并且它工作正常。有几个文件,每个文件都有自己的语言:messages_en.properties、messages_de.properties 等。

在我的一个 JSP 中,我需要向用户展示一个包含所有可用语言的组合,我希望这个列表是动态的,即从服务器中的现有语言文件动态生成。

是否有任何内置方法来生成此列表?还是我必须求助于检查语言文件所在的文件夹并解析它们?

谢谢!

纳乔

npi*_*tos 0

好的,找到了两个解决方案。对于两者,假设它们在 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)