| /* | |
| * Copyright 2008 Google Inc. | |
| * | |
| * Licensed 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. | |
| */ | |
| package com.google.gwt.i18n.client; | |
| import com.google.gwt.core.client.GWT; | |
| import com.google.gwt.i18n.client.constants.DateTimeConstants; | |
| import com.google.gwt.i18n.client.constants.NumberConstants; | |
| import com.google.gwt.i18n.client.impl.CldrImpl; | |
| import com.google.gwt.i18n.client.impl.LocaleInfoImpl; | |
| /** | |
| * Provides access to the currently-active locale and the list of available | |
| * locales. | |
| */ | |
| @SuppressWarnings("deprecation") | |
| public class LocaleInfo { | |
| /** | |
| * Currently we only support getting the currently running locale, so this | |
| * is a static. In the future, we would need a hash map from locale names | |
| * to LocaleInfo instances. | |
| */ | |
| private static LocaleInfo instance = new LocaleInfo( | |
| (LocaleInfoImpl) GWT.create(LocaleInfoImpl.class), | |
| (CldrImpl) GWT.create(CldrImpl.class)); | |
| /** | |
| * Returns an array of available locale names. | |
| */ | |
| public static final String[] getAvailableLocaleNames() { | |
| /* | |
| * The set of all locales is constant across all permutations, so this | |
| * is static. Ideally, the set of available locales would be generated | |
| * by a different GWT.create but that would slow the compilation process | |
| * unnecessarily. | |
| * | |
| * This is static, and accesses infoImpl this way, with an eye towards | |
| * when we implement static LocaleInfo getLocale(String localeName) as | |
| * you might want to get the list of available locales in order to create | |
| * instances of each of them. | |
| */ | |
| return instance.infoImpl.getAvailableLocaleNames(); | |
| } | |
| /** | |
| * Returns a LocaleInfo instance for the current locale. | |
| */ | |
| public static final LocaleInfo getCurrentLocale() { | |
| /* | |
| * In the future, we could make additional static methods which returned a | |
| * LocaleInfo instance for a specific locale (from the set of those the app | |
| * was compiled with), accessed via a method like: | |
| * public static LocaleInfo getLocale(String localeName) | |
| */ | |
| return instance; | |
| } | |
| /** | |
| * Returns the name of the name of the cookie holding the locale to use, | |
| * which is defined in the config property {@code locale.cookie}. | |
| * | |
| * @return locale cookie name, or null if none | |
| */ | |
| public static final String getLocaleCookieName() { | |
| return instance.infoImpl.getLocaleCookieName(); | |
| } | |
| /** | |
| * Returns the display name of the requested locale in its native locale, if | |
| * possible. If no native localization is available, the English name will | |
| * be returned, or as a last resort just the locale name will be returned. If | |
| * the locale name is unknown (including an user overrides) or is not a valid | |
| * locale property value, null is returned. | |
| * | |
| * If the I18N module has not been imported, this will always return null. | |
| * | |
| * @param localeName the name of the locale to lookup. | |
| * @return the name of the locale in its native locale | |
| */ | |
| public static String getLocaleNativeDisplayName(String localeName) { | |
| /* | |
| * See the comment from getAvailableLocaleNames() above. | |
| */ | |
| return instance.infoImpl.getLocaleNativeDisplayName(localeName); | |
| } | |
| /** | |
| * Returns the name of the query parameter holding the locale to use, which is | |
| * defined in the config property {@code locale.queryparam}. | |
| * | |
| * @return locale URL query parameter name, or null if none | |
| */ | |
| public static String getLocaleQueryParam() { | |
| return instance.infoImpl.getLocaleQueryParam(); | |
| } | |
| /** | |
| * Returns true if any locale supported by this build of the app is RTL. | |
| */ | |
| public static boolean hasAnyRTL() { | |
| return instance.infoImpl.hasAnyRTL(); | |
| } | |
| private final LocaleInfoImpl infoImpl; | |
| private final CldrImpl cldrImpl; | |
| private DateTimeConstants dateTimeConstants; | |
| private DateTimeFormatInfo dateTimeFormatInfo; | |
| private NumberConstants numberConstants; | |
| /** | |
| * Constructor to be used by subclasses, such as mock classes for testing. | |
| * Any such subclass should override all methods. | |
| */ | |
| protected LocaleInfo() { | |
| infoImpl = null; | |
| cldrImpl = null; | |
| } | |
| /** | |
| * Create a LocaleInfo instance, passing in the implementation classes. | |
| * | |
| * @param impl LocaleInfoImpl instance to use | |
| * @param cldr CldrImpl instance to use | |
| */ | |
| private LocaleInfo(LocaleInfoImpl impl, CldrImpl cldr) { | |
| this.infoImpl = impl; | |
| this.cldrImpl = cldr; | |
| } | |
| /** | |
| * Returns a DateTimeConstants instance for this locale. | |
| */ | |
| public final DateTimeConstants getDateTimeConstants() { | |
| ensureDateTimeConstants(); | |
| return dateTimeConstants; | |
| } | |
| /** | |
| * Returns a DateTimeConstants instance for this locale. | |
| */ | |
| public final DateTimeFormatInfo getDateTimeFormatInfo() { | |
| ensureDateTimeFormatInfo(); | |
| return dateTimeFormatInfo; | |
| } | |
| /** | |
| * Returns the name of this locale, such as "default, "en_US", etc. | |
| */ | |
| public final String getLocaleName() { | |
| return infoImpl.getLocaleName(); | |
| } | |
| /** | |
| * @return an implementation of {@link LocalizedNames} for this locale. | |
| */ | |
| public final LocalizedNames getLocalizedNames() { | |
| return infoImpl.getLocalizedNames(); | |
| } | |
| /** | |
| * Returns a NumberConstants instance for this locale. | |
| */ | |
| public final NumberConstants getNumberConstants() { | |
| ensureNumberConstants(); | |
| return numberConstants; | |
| } | |
| /** | |
| * Returns true if this locale is right-to-left instead of left-to-right. | |
| */ | |
| public final boolean isRTL() { | |
| return cldrImpl.isRTL(); | |
| } | |
| private void ensureDateTimeConstants() { | |
| if (dateTimeConstants == null) { | |
| ensureDateTimeFormatInfo(); | |
| dateTimeConstants = new DateTimeConstantsAdapter(dateTimeFormatInfo); | |
| } | |
| } | |
| private void ensureDateTimeFormatInfo() { | |
| if (dateTimeFormatInfo == null) { | |
| dateTimeFormatInfo = infoImpl.getDateTimeFormatInfo(); | |
| } | |
| } | |
| private void ensureNumberConstants() { | |
| if (numberConstants == null) { | |
| numberConstants = infoImpl.getNumberConstants(); | |
| } | |
| } | |
| } |