在Spring MVC中动态生成可用语言列表 [英] Dynamically generate a list of available languages in Spring MVC
问题描述
有几个文件,每个都有自己的语言: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屋!