com.google.gwt.i18n.client.LocaleInfo.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.i18n.client.LocaleInfo.java

Source

/*
 * 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();
        }
    }
}