在Spring MVC中动态生成可用语言列表 [英] Dynamically generate a list of available languages in Spring MVC

查看:137
本文介绍了在Spring MVC中动态生成可用语言列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



有没有内置方法生成此列表?或者我必须诉诸检查文件所在的文件夹并解析它们?



谢谢!



Nacho

解决方案

好的,找到了两个解决方案。对于这两个,假定它们正在Spring MVC @Controller -annotated类中执行。每个都将产生一个HashMap(语言),其中的关键字是2个字母的ISO语言代码,并且值是语言名称(在当前语言环境中,在这些示例中是一个名为的静态变量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);

此解决方案要求您在每种语言的.properties文件中设置一个带有语言的条目(在上面的例子中,它将是'currentLanguage')。对于ecample,在messages_it.properties中,必须有如下条目:currentLanguage = Italiano



2.-原始方法,即直接访问文件夹/文件:假设文件语言在/ WEB-INF / languages中,并具有fr-messages的基本名称:

  
HashMap语言= new HashMap();
String languagesFolderPath = request.getSession()。getServletContext()。getRealPath(/ WEB-INF / languages);
文件夹=新文件(languagesFolderPath);
文件[] listOfFiles = folder.listFiles(); (int i = 0; i< listOfFiles.length; i ++){
String fileName = listOfFiles [i] .getName();


if(fileName.startsWith(fr-messages_)&& fileName.endsWith(。properties)){
//提取下划线和.properties扩展名之间的语言代码
String language = fileName.substring(12,fileName.indexOf(。properties));
Locale l = new Locale(language);
languages.put(language,l.getDisplayLanguage(HSConstants.currentLocale));
}
}
model.addAttribute(languages,languages);

然后,在您的JSP中,使用语言 map:

 < 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:当>
< c:否则>
< option value =$ {language.key}> $ {language.value}< / option>
< / c:否则>
< / c:choose>
< / c:forEach>
< / select>


I have set up i18n in Spring MVC 3, and it is working correctly. There are several files, each with its own language: messages_en.properties, messages_de.properties, etc.

In one of my JSPs, I need to show the users a combo with all available languages, and I would like this list to be dynamic i.e. generated on the fly from the existing language files in the server.

Is there any built-in method to generate this list? Or do I have to resort to check the folder where the language files reside and parse them?

Thanks!

Nacho

解决方案

Ok, two solutions found. For both, assume they are being executed inside a Spring MVC @Controller-annotated class. Each will produce a HashMap (languages) in which the key is the 2-letter ISO language code, and the value the language name (in the current Locale, which in these examples is a static variable called HSConstants.currentLocale)

1.- The one submitted by @millhouse (see above/below), which works after a bit of tweaking:


    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);  

This solution requires that, in each of your language .properties files, you set an entry with the language (in the example above, it would be 'currentLanguage'). For ecample, in messages_it.properties, there must be an entry like this: currentLanguage=Italiano

2.- Raw method, i.e. accesing the folder/files directly: assuming the files languages are in /WEB-INF/languages, and have a basename of 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);  

And then, in your JSP, render the select box using the languages map:

<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>

这篇关于在Spring MVC中动态生成可用语言列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆