org.sakaiproject.jsf2.util.LocaleUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jsf2-widgets Show documentation
Show all versions of jsf2-widgets Show documentation
This is the Maven project for the custom JSF 2 widgets.
The widgets and the resources projects are closely tied together.
These widgets will be deployed as a jar file containing Sakai JSF 2 widgets
(components).
Web applications can include this jar in order to use the Sakai JSF 2 widgets in a JSF tool.
/**
* Copyright (c) 2003-2021 The Apereo Foundation
*
* Licensed under the Educational Community 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://opensource.org/licenses/ecl2
*
* 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.
*/
package org.sakaiproject.jsf2.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;
import lombok.extern.slf4j.Slf4j;
/**
* Instead of using standard methods of deciding which locale should be used
* when loading a resource, Sakai tools are requested to go through the Sakai-specific
* ResourceLoader class, which lets Sakai-specific settings such as site
* preferences be taken into account.
*
* Currently the ResourceLoader functionality is not behind an
* interface, and so direct references to the class will drag in dependencies
* on framework features. To keep the Sakai JSF tag library self-sufficient,
* this utility class uses JavaBean-style introspection to load and use
* the ResourceLoader class if it's available, or to fall back to the standard
* UIViewRoot "getLocale()" method.
*
* Note that we only use the "getLocale()" method in ResourceLoader.
* For details, see the comments to SAK-6886.
*/
@Slf4j
public class LocaleUtil {
private static Object sakaiResourceLoader = null;
private static Method sakaiResourceLoaderGetLocale;
private static Method sakaiResourceLoaderGetOrientation;
private static boolean isInitialized = false;
private static void init() {
if (!isInitialized) {
// Try to load the Sakai localization class.
try {
Class sakaiResourceLoaderClass = Class.forName("org.sakaiproject.util.ResourceLoader");
if (log.isDebugEnabled()) log.debug("Found Sakai ResourceLoader class");
Constructor sakaiResourceLoaderConstructor = sakaiResourceLoaderClass.getConstructor();
sakaiResourceLoaderGetLocale = sakaiResourceLoaderClass.getMethod("getLocale");
sakaiResourceLoaderGetOrientation = sakaiResourceLoaderClass.getMethod("getOrientation",new Class[]{Locale.class});
sakaiResourceLoader = sakaiResourceLoaderConstructor.newInstance();
} catch (ClassNotFoundException e) {
log.debug("Did not find Sakai ResourceLoader class; will use standard JSF localization");
} catch (SecurityException | NoSuchMethodException | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
log.error("Will use standard JSF localization", e);
}
isInitialized = true;
}
}
public static Locale getLocale(FacesContext context) {
Locale locale = null;
init();
if (sakaiResourceLoader != null) {
try {
locale = (Locale)sakaiResourceLoaderGetLocale.invoke(sakaiResourceLoader);
} catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
log.error(e.getMessage());
}
} else {
// Use standard JSF approach.
locale = context.getViewRoot().getLocale();
}
return locale;
}
public static String getLocalizedString(FacesContext context, String bundleName, String key) {
String localized = null;
Locale locale = getLocale(context);
ResourceBundle rb = ResourceBundle.getBundle(bundleName, locale);
if (log.isDebugEnabled()) log.debug("getLocalizedString; locale=" + locale.getDisplayName() + ", bundleName=" + bundleName + ", rb=" + rb.getLocale() + ", rb getCountry()=" + rb.getLocale().getCountry());
localized = rb.getString(key);
return localized;
}
public static String getOrientation(Locale loc) {
String orientation = "ltr";
init();
if (sakaiResourceLoader != null) {
try {
orientation = (String) sakaiResourceLoaderGetOrientation.invoke(sakaiResourceLoader, new Object[]{loc});
} catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
log.error(e.getMessage());
}
}
return orientation;
}
}