/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ package org.openmrs.web.filter.util; import java.util.Locale; import java.util.ResourceBundle; import org.apache.commons.lang.StringUtils; import org.apache.velocity.tools.config.DefaultKey; import org.apache.velocity.tools.generic.ResourceTool; import org.openmrs.util.LocaleUtility; /** * This class is intended for accessing {@link ResourceBundle} and formatting messages therein. */ @DefaultKey("l10n") public class LocalizationTool extends ResourceTool { /** * The default message resource bundle to use, this is english */ private static ResourceBundle defaultResourceBundle = null; /** * Its need to override base class method to be able to change its locale property outside the * class hierarchy * * @see org.apache.velocity.tools.generic.ResourceTool#setLocale(Locale locale) */ @Override public void setLocale(Locale locale) { super.setLocale(locale); } /** * @return the defaultResourceBundle */ public static ResourceBundle getDefaultResourceBundle() { if (defaultResourceBundle == null) { defaultResourceBundle = CustomResourceLoader.getInstance(null).getResourceBundle(Locale.ENGLISH); } return defaultResourceBundle; } /** * To be able to load resource bundles outside the class path we need to override this method * * @see org.apache.velocity.tools.generic.ResourceTool#getBundle(java.lang.String, * java.lang.Object) */ @Override protected ResourceBundle getBundle(String baseName, Object loc) { Locale locale = (loc == null) ? getLocale() : LocaleUtility.fromSpecification(String.valueOf(loc)); if (baseName == null || locale == null) { return null; } //This messages_XX.properties file doesn't exist, default to messages.properties ResourceBundle rb = CustomResourceLoader.getInstance(null).getResourceBundle(locale); if (rb == null) { rb = getDefaultResourceBundle(); } return rb; } /** * @see org.apache.velocity.tools.generic.ResourceTool#get(java.lang.Object, java.lang.String[], * java.lang.Object) */ @Override public Object get(Object code, String[] resourceNamePrefixes, Object locale) { Object msg = super.get(code, resourceNamePrefixes, locale); //if code's translation is blank, use the english equivalent if (msg == null || StringUtils.isBlank(msg.toString())) { msg = super.get(code, resourceNamePrefixes, Locale.ENGLISH.toString()); } return msg; } }