/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.core.locale; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import javax.annotation.Resource; import org.apache.commons.lang3.LocaleUtils; import org.orcid.core.manager.CountryManager; import org.orcid.jaxb.model.message.OrcidProfile; import org.orcid.persistence.jpa.entities.CountryIsoEntity; import org.orcid.utils.FunctionsOverCollections; import org.orcid.utils.OrcidStringUtils; import org.orcid.utils.UTF8Control; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; public class LocaleManagerImpl implements LocaleManager { private MessageSource messageSource; @Resource protected CountryManager countryManager; @Autowired public void setMessageSource(MessageSource messageSource) { this.messageSource = messageSource; } @Override public Locale getLocale() { return LocaleContextHolder.getLocale(); } @Override public Locale getLocaleFromOrcidProfile(OrcidProfile orcidProfile) { Locale locale = null; if (orcidProfile.getOrcidPreferences() != null && orcidProfile.getOrcidPreferences().getLocale() != null) { orcidProfile.getOrcidPreferences().getLocale().value(); locale = LocaleUtils.toLocale(orcidProfile.getOrcidPreferences().getLocale().value()); } else { locale = LocaleUtils.toLocale("en"); } return locale; } @Override public String resolveMessage(String messageCode, Object... messageParams) { return messageSource.getMessage(messageCode, messageParams, getLocale()); } @Override public String resolveMessage(String messageCode, Locale locale, Object... messageParams) { return messageSource.getMessage(messageCode, messageParams, locale); } @Cacheable(value = "locale-messages", key = "#locale.toString().concat('-javascript')") public org.orcid.pojo.Local getJavascriptMessages(Locale locale) { org.orcid.pojo.Local lPojo = new org.orcid.pojo.Local(); lPojo.setLocale(locale.toString()); ResourceBundle resource = ResourceBundle.getBundle("i18n/javascript", locale, new UTF8Control()); lPojo.setMessages(OrcidStringUtils.resourceBundleToMap(resource)); return lPojo; } /* * Get country names from i18n files */ @Cacheable(value = "locale-messages", key = "#locale.toString().concat('-countries-map')") public Map<String, String> getCountries(Locale locale) { ResourceBundle resource = ResourceBundle.getBundle("i18n/messages", locale, new UTF8Control()); Map<String, String> dbCountries = countryManager.retrieveCountriesAndIsoCodes(); Map<String, String> countries = new LinkedHashMap<String, String>(); for (String key : dbCountries.keySet()) { countries.put(key, resource.getString(buildInternationalizationKey(CountryIsoEntity.class, key))); } FunctionsOverCollections.sortMapsByValues(countries); return countries; } @SuppressWarnings("rawtypes") public static String buildInternationalizationKey(Class theClass, String key) { return theClass.getName() + '.' + key; } }