blob: 385496dd01b94accccdf96276ae76106b45abb54 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.stem.ui;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.ResourceBundle;
import org.eclipse.core.runtime.Platform;
/**
* Support class that implements internal handlers for dynamic switching
* of the current NL in use by STEM.
*
*/
public class NLS
{
/**
* represents the locale coded in plugin.properties
*/
public static final String DEFAULT_LOCALE = "en"; // $NON-NLS$
/**
* System property to persist the original (first-start) NL
*/
public static final String SYSTEM_LOCALE_PROPERTY = "stem.system.nl"; // $NON-NLS$
/**
* Current locale
*/
private static String CURRENT_LOCALE = null;
/**
* System locale
*/
private static String SYSTEM_LOCALE = null;
/**
* Locales available to the system
*/
private static Collection<String> AVAILABLE_LOCALES = null;
private NLS()
{
}
/**
* @return The default locale
*/
public static String getDefaultLocale()
{
return DEFAULT_LOCALE;
}
/**
* Returns all super-locales for the given locale
* @param locale Locale to break down
* @return The super-locale fragments
*/
private static List<String> getLocaleFragments(String locale)
{
String[] localeFragments = locale.split("_");
List<String> possibleLocales = new ArrayList<String>();
StringBuilder fragment = new StringBuilder();
fragment.append(localeFragments[0]);
possibleLocales.add(fragment.toString());
if (localeFragments.length > 1) {
for (int i=1; i<localeFragments.length; i++) {
fragment.append("_");
fragment.append(localeFragments[i]);
possibleLocales.add(fragment.toString());
}
}
Collections.reverse(possibleLocales);
return possibleLocales;
}
/**
* @return The current locale
*/
public static String getCurrentLocale()
{
if (CURRENT_LOCALE == null) {
String platformLocale = Platform.getNL();
List<String> fragments = getLocaleFragments(platformLocale);
Collection<String> locales = getAvailableLocales();
for (String fragment : fragments) {
if (locales.contains(fragment)) {
CURRENT_LOCALE = fragment;
break;
}
}
if (CURRENT_LOCALE == null) {
CURRENT_LOCALE = getDefaultLocale();
}
}
return CURRENT_LOCALE;
}
/**
* Gets the system locale. If your system's locale is a supported STEM
* locale, then it returns that. Otherwise, it returns the default locale.
* @return The locale for the system
*/
public static String getSystemLocale()
{
if (SYSTEM_LOCALE == null) {
String systemLocale = System.getProperty(SYSTEM_LOCALE_PROPERTY);
if (systemLocale == null) {
systemLocale = Platform.getNL();
}
if (systemLocale != null) {
List<String> fragments = getLocaleFragments(systemLocale);
Collection<String> locales = getAvailableLocales();
for (String fragment : fragments) {
if (locales.contains(fragment)) {
SYSTEM_LOCALE = fragment;
break;
}
}
}
if (SYSTEM_LOCALE == null) {
SYSTEM_LOCALE = getDefaultLocale();
}
}
return SYSTEM_LOCALE;
}
/**
* Gets the list of available locales
* @return
*/
public synchronized static Collection<String> getAvailableLocales()
{
if (AVAILABLE_LOCALES == null) {
List<String> locales = new ArrayList<String>();
Enumeration<URL> paths = Activator.getDefault().getBundle().findEntries("/", "plugin*.properties", false);
locales.add(DEFAULT_LOCALE);
while (paths.hasMoreElements()) {
String url = paths.nextElement().toString();
int firstPart = url.indexOf('_');
int lastPart = url.lastIndexOf(".properties");
if (firstPart != -1 && lastPart != -1) {
String locale = url.substring(firstPart+1, lastPart);
if (!locales.contains(locale)) {
locales.add(locale);
}
}
}
Collections.sort(locales);
AVAILABLE_LOCALES = Collections.unmodifiableCollection(locales);
}
return AVAILABLE_LOCALES;
}
/**
* Get the human-readable display name for the locale. Uses the syntax
* "locale_[localeName]" to query the plugin.properties file for the
* string. If this key is not found, then it returns the original string.
* @param locale
* @return
*/
public static String getLocaleDisplayName(String locale)
{
final String resourceKeyName = "locale_"+ locale;
ResourceBundle rb = Platform.getResourceBundle(Activator.getDefault().getBundle());
String displayName = null;
try {
displayName = rb.getString(resourceKeyName);
} catch (Exception e) {
}
if (displayName == null || "".equals(displayName)) {
displayName = locale;
}
if (resourceKeyName.equals(displayName)) {
displayName = locale;
}
return displayName;
}
/**
* Returns whether the given locale is the 'current' locale
* @param locale The locale to check
* @return Whether it's the current locale
*/
public static boolean isCurrentLocale(String locale)
{
return locale.equals(getCurrentLocale());
}
/**
* Returns whether the given locale is the 'default' locale
* @param locale The locale to check
* @return Whether it's the default locale
*/
public static boolean isDefaultLocale(String locale)
{
return locale.equals(getSystemLocale());
}
}