Package kameleon.gui.language

Source Code of kameleon.gui.language.SwitchLanguage

/*
* Copyright (c) 2012, Fromentin Xavier, Schnell Michaël, Dervin Cyrielle, Brabant Quentin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*      * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*      * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*      * The names of its contributors may not be used to endorse or promote products
*       derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL Fromentin Xavier, Schnell Michaël, Dervin Cyrielle OR Brabant Quentin
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package kameleon.gui.language ;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import kameleon.exception.KameleonException;
import kameleon.gui.exception.InvalidLanguageException;
import kameleon.gui.exception.UnknownKeyException;
import kameleon.gui.util.FileConstants;
import kameleon.gui.util.LanguageConstants;

/**
* Utility class used to load the text parts from the language files.
*
* @author    Schnell Michaël
* @version    1.0
*/
public class SwitchLanguage implements FileConstants {

  /**
   * Default language (English) used by the graphical interface.
   */
  private static final GuiLanguage DEFAULT_LANGUAGE =
      GuiLanguage.ENGLISH ;
 
  /**
   * Text value used to return the given text.
   */
  private static final String IDENTITY = "%s" ; //$NON-NLS-1$

  /**
   * Only instance of this class.
   */
  private static SwitchLanguage instance ;

  /**
   * Base name of the language file.
   */
  protected String languageFileName ;

  /**
   * Current bundle.
   */
  protected ResourceBundle bundle ;

  /**
   * {@code ClassLoader} used to load the bundles.
   */
  protected ClassLoader loader ;

  /**
   * Current display language.
   */
  protected GuiLanguage currentLanguage ;

  /**
   * Builds an instance with the given language file name and
   * {@code ClassLoader} using the default language.
   *
   * @param  languageFileName
   *       base name of the language files
   *
   * @param  loader
   *       {@code ClassLoader} used to load the resource bundles
   */
  protected SwitchLanguage(String languageFileName, ClassLoader loader) {
    this.languageFileName = languageFileName ;
    this.currentLanguage = DEFAULT_LANGUAGE ;
    ResourceBundle.clearCache() ;
    this.loader = loader ;
    this.bundle = ResourceBundle.getBundle(
        languageFileName,
        this.currentLanguage.getLanguage(),
        this.loader) ;
  }// SwitchLanguage(String, ClassLoader)

  /**
   * Returns the sole instance of this class.
   *
   * @return  Sole instance of this class
   */
  public static SwitchLanguage getInstance() {
    return instance ;
  }// getInstance()

  /**
   * Initializes the sole instance of this class.
   *
   * @throws   KameleonException
   *       if an error occurred while initializing
   */
  public static void initialize() throws KameleonException {
    try {
      URL[] urls = new URL[]{
          new File(LANGUAGE_FOLDER).toURI().toURL()} ;
      instance = new SwitchLanguage(LANGUAGE_FILE_NAME,
          new URLClassLoader(urls)) ;
    } catch (MalformedURLException e) {
      //TODO Add exception ?
      throw new KameleonException(
          "Error while initializing SwitchLanguage", //$NON-NLS-1$
          e) ;
    }// try
  }// initialize()

  /**
   * Returns the text part in the current language for the given key.
   * {@link LanguageConstants} contains the list of valid keys for
   * the language files.
   *
   * @param   key
   *       key of the requested text part
   *
   * @return  text part in the given language associated with the given
   *       key
   *
   * @throws   UnknownKeyException
   *       if the given key was not found in the current language
   *       file
   */
  public synchronized String getText(String key)
      throws UnknownKeyException {
    if (key == null) {
      return IDENTITY ;
    }// if
    if (this.bundle.containsKey(key)) {
      return this.bundle.getString(key) ;
    }// if
    throw new UnknownKeyException(key, this.currentLanguage) ;
  }// getText(String)

  /**
   * Returns the text part in the current language for the given key
   * and formats it using the given arguments.
   * This is a convenience function for the call <pre>
   * String.format(this.getText(key), args) ;
   * </pre>
   *
   * @param   key
   *       key of the requested text part
   *
   * @param  args
   *       arguments used to format the requested text
   *
   * @return  text part in the given language associated with the given
   *       key
   *
   * @throws   UnknownKeyException
   *       if the given key was not found in the current language
   *       file
   *
   * @see    String#format(String, Object...)
   */
  public synchronized String getText(String key, Object... args)
      throws UnknownKeyException {
    return String.format(this.getText(key), args) ;
  }// getText(String, Object...)

  /**
   * Returns the current language.
   *
   * @return  Current language
   *
   * @see    GuiLanguage
   */
  public GuiLanguage getCurrentLanguage() {
    return this.currentLanguage ;
  }// getCurrentLanguage()

  /**
   * Sets the display language.
   *
   * @param   lang
   *       new display language
   *
   * @throws  InvalidLanguageException
   *      if no language file exists for the requested language
   */
  public void changeLang(GuiLanguage lang)
      throws InvalidLanguageException {
    GuiLanguage previousLang = this.currentLanguage ;
    this.currentLanguage = lang ;
    ResourceBundle.clearCache() ;
    ResourceBundle tmpBundle = null ;
    try {
      tmpBundle = ResourceBundle.getBundle(
          this.languageFileName,
          this.currentLanguage.getLanguage(),
          this.loader) ;
      this.bundle = tmpBundle ;
    } catch(MissingResourceException mre) {
      this.currentLanguage = previousLang ;
      throw new InvalidLanguageException(lang, mre) ;
    }// try
  }// changeLang(GuiLanguage)

}// class SwitchLanguage
TOP

Related Classes of kameleon.gui.language.SwitchLanguage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.