Issue
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
Solution
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>
Answered By - npintos