org.apache.xmlgraphics.util.i18n.LocalizableSupport Maven / Gradle / Ivy
Show all versions of xmlgraphics-commons Show documentation
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id: LocalizableSupport.java 1732018 2016-02-24 04:51:06Z gadams $ */
package org.apache.xmlgraphics.util.i18n;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
// CSOFF: InnerAssignment
/**
* This class provides a default implementation of the Localizable interface.
* You can use it as a base class or as a member field and delegates various
* work to it.
* For example, to implement Localizable, the following code can be used:
*
* package mypackage;
* ...
* public class MyClass implements Localizable {
* // This code fragment requires a file named
* // 'mypackage/resources/Messages.properties', or a
* // 'mypackage.resources.Messages' class which extends
* // java.util.ResourceBundle, accessible using the current
* // classpath.
* LocalizableSupport localizableSupport =
* new LocalizableSupport("mypackage.resources.Messages");
*
* public void setLocale(Locale l) {
* localizableSupport.setLocale(l);
* }
* public Local getLocale() {
* return localizableSupport.getLocale();
* }
* public String formatMessage(String key, Object[] args) {
* return localizableSupport.formatMessage(key, args);
* }
* }
*
* The algorithm for the Locale lookup in a LocalizableSupport object is:
*
* -
* if a Locale has been set by a call to setLocale(), use this Locale,
* else,
*
* -
* if a Locale has been set by a call to the setDefaultLocale() method
* of a LocalizableSupport object in the current LocaleGroup, use this
* Locale, else,
*
* -
* use the object returned by Locale.getDefault() (and set by
* Locale.setDefault()).
*
*
* This offers the possibility to have a different Locale for each object,
* a Locale for a group of object and/or a Locale for the JVM instance.
*
* Note: if no group is specified a LocalizableSupport object belongs to a
* default group common to each instance of LocalizableSupport.
*
* @version $Id: LocalizableSupport.java 1732018 2016-02-24 04:51:06Z gadams $
*
* Originally authored by Stephane Hillion.
*/
public class LocalizableSupport implements Localizable {
/**
* The locale group to which this object belongs.
*/
protected LocaleGroup localeGroup = LocaleGroup.DEFAULT;
/**
* The resource bundle classname.
*/
protected String bundleName;
/**
* The classloader to use to create the resource bundle.
*/
protected ClassLoader classLoader;
/**
* The current locale.
*/
protected Locale locale;
/**
* The locale in use.
*/
protected Locale usedLocale;
/**
* The resources
*/
protected ResourceBundle resourceBundle;
/**
* Same as LocalizableSupport(s, null).
*/
public LocalizableSupport(String s) {
this(s, null);
}
/**
* Creates a new Localizable object.
* The resource bundle class name is required allows the use of custom
* classes of resource bundles.
* @param s must be the name of the class to use to get the appropriate
* resource bundle given the current locale.
* @param cl is the classloader used to create the resource bundle,
* or null.
* @see java.util.ResourceBundle
*/
public LocalizableSupport(String s, ClassLoader cl) {
bundleName = s;
classLoader = cl;
}
/**
* Implements {@link org.apache.xmlgraphics.util.i18n.Localizable#setLocale(Locale)}.
*/
public void setLocale(Locale l) {
if (locale != l) {
locale = l;
resourceBundle = null;
}
}
/**
* Implements {@link org.apache.xmlgraphics.util.i18n.Localizable#getLocale()}.
*/
public Locale getLocale() {
return locale;
}
/**
* Implements {@link
* org.apache.xmlgraphics.util.i18n.ExtendedLocalizable#setLocaleGroup(LocaleGroup)}.
*/
public void setLocaleGroup(LocaleGroup lg) {
localeGroup = lg;
}
/**
* Implements {@link
* org.apache.xmlgraphics.util.i18n.ExtendedLocalizable#getLocaleGroup()}.
*/
public LocaleGroup getLocaleGroup() {
return localeGroup;
}
/**
* Implements {@link
* org.apache.xmlgraphics.util.i18n.ExtendedLocalizable#setDefaultLocale(Locale)}.
* Later invocations of the instance methods will lead to update the
* resource bundle used.
*/
public void setDefaultLocale(Locale l) {
localeGroup.setLocale(l);
}
/**
* Implements {@link
* org.apache.xmlgraphics.util.i18n.ExtendedLocalizable#getDefaultLocale()}.
*/
public Locale getDefaultLocale() {
return localeGroup.getLocale();
}
/**
* Implements {@link
* org.apache.xmlgraphics.util.i18n.Localizable#formatMessage(String,Object[])}.
*/
public String formatMessage(String key, Object[] args) {
getResourceBundle();
return MessageFormat.format(resourceBundle.getString(key), args);
}
/**
* Implements {@link
* org.apache.xmlgraphics.util.i18n.ExtendedLocalizable#getResourceBundle()}.
*/
public ResourceBundle getResourceBundle() {
Locale l;
if (resourceBundle == null) {
if (locale == null) {
if ((l = localeGroup.getLocale()) == null) {
usedLocale = Locale.getDefault();
} else {
usedLocale = l;
}
} else {
usedLocale = locale;
}
if (classLoader == null) {
resourceBundle = ResourceBundle.getBundle(bundleName,
usedLocale);
} else {
resourceBundle = ResourceBundle.getBundle(bundleName,
usedLocale,
classLoader);
}
} else if (locale == null) {
// Check for group Locale and JVM default locale changes.
if ((l = localeGroup.getLocale()) == null) {
if (usedLocale != (l = Locale.getDefault())) {
usedLocale = l;
if (classLoader == null) {
resourceBundle = ResourceBundle.getBundle(bundleName,
usedLocale);
} else {
resourceBundle = ResourceBundle.getBundle(bundleName,
usedLocale,
classLoader);
}
}
} else if (usedLocale != l) {
usedLocale = l;
if (classLoader == null) {
resourceBundle = ResourceBundle.getBundle(bundleName,
usedLocale);
} else {
resourceBundle = ResourceBundle.getBundle(bundleName,
usedLocale,
classLoader);
}
}
}
return resourceBundle;
}
}