package org.akaza.openclinica.i18n.core; import org.akaza.openclinica.i18n.util.ResourceBundleProvider; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Enumeration; import java.util.Locale; import java.util.ResourceBundle; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * Customize Locale. * * @since Jan. 2012 */ // @author ywang public final class LocaleResolver { private final static Locale DEFAULT_LOCALE = new Locale("en"); private final static String LOCALE_SESSION_ATTRIBUTE_NAME = SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME; /** * Find Locale basing on order of accept languages and availability of i18n properties files. * * @param request * @return */ public final static Locale resolveLocale(HttpServletRequest request) { if(request != null) { for(@SuppressWarnings("unchecked") Enumeration<Locale> locales = request.getLocales(); locales.hasMoreElements();) { Locale locale = locales.nextElement(); ResourceBundleProvider.updateLocale(locale); if(isQualifiedLocale(locale)) { locale = ResourceBundleProvider.getFormatBundle(locale).getLocale(); return locale; } else if(getDefaultLocale().getLanguage().equalsIgnoreCase(locale.getLanguage())) { break; } } } return getDefaultLocale(); } /** * Get Locale from session first. If it is null, will call resolveLocale method. * @param request * @return */ public final static Locale getLocale(HttpServletRequest request) { Locale locale = getLocaleInSession(request.getSession(false)); if(locale == null) { return resolveLocale(request); } return locale; } /* * Null will be returned if HttpSession is null or no Locale attribute exists * @param session * @return */ private final static Locale getLocaleInSession(HttpSession session) { if(session != null) { return (Locale)session.getAttribute(getLocaleSessionAttributeName()); } return null; } /* * A locale is qualified only if all ResourceBundles' Locales are available */ private static boolean isQualifiedLocale(Locale locale) { ResourceBundle rb = ResourceBundleProvider.getAdminBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getAuditEventsBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getExceptionsBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getFormatBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getPageMessagesBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getTermsBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getTextsBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getWordsBundle(locale); if(isAvailable(rb, locale)) { rb = ResourceBundleProvider.getWorkflowBundle(locale); return isAvailable(rb, locale); } } } } } } } } return false; } private static boolean isAvailable(ResourceBundle rb, Locale locale) { if(rb != null ) { Locale loc = rb.getLocale(); return loc != null && loc.toString().length()>0 && loc.getLanguage().equals(locale.getLanguage()); } return false; } public final static String getLocaleSessionAttributeName() { return LocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME; } public static Locale getDefaultLocale() { return LocaleResolver.DEFAULT_LOCALE; } }