package org.ovirt.engine.core.sso.utils; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class LocalizationUtils { private static final Logger log = LoggerFactory.getLogger(LocalizationUtils.class); private String messageSource; private Locale defaultLocale; private ResourceBundle defaultResourceBundle; private Map<Locale, ResourceBundle> resourceBundlesByLocale; public LocalizationUtils(final String fileName) { log.info("Start initializing {}", getClass().getSimpleName()); messageSource = fileName.replaceAll("\\.properties$", ""); resourceBundlesByLocale = new ConcurrentHashMap<>(); defaultLocale = Locale.getDefault(); // Load default locale. defaultResourceBundle = loadResourceBundle(defaultLocale); // If default locale not found, load English US as default locale. if (defaultResourceBundle == null) { defaultLocale = Locale.US; defaultResourceBundle = loadResourceBundle(defaultLocale); } log.info("Finished initializing {}", getClass().getSimpleName()); } public String localize(final String errorMsg, final Locale requestLocale) { String localizedErrorMsg = errorMsg; ResourceBundle resourceBundle = getResourceBundle(requestLocale == null ? defaultLocale : requestLocale); if (resourceBundle != null && resourceBundle.containsKey(errorMsg)) { localizedErrorMsg = resourceBundle.getString(errorMsg); } return localizedErrorMsg; } private synchronized ResourceBundle getResourceBundle(Locale locale) { ResourceBundle resourceBundle = resourceBundlesByLocale.get(locale); if (resourceBundle == null) { resourceBundle = loadResourceBundle(locale); } return resourceBundle == null ? defaultResourceBundle : resourceBundle; } private synchronized ResourceBundle loadResourceBundle(Locale locale) { ResourceBundle resourceBundle = null; try { resourceBundle = ResourceBundle.getBundle(messageSource, locale); resourceBundlesByLocale.put(locale, resourceBundle); } catch (RuntimeException e) { log.error("File: '{}' could not be loaded: {}", messageSource, e.getMessage()); log.debug("Exception", e); } return resourceBundle; } }