text: /*
   * Copyright 2017-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
   *
   * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
   * the License. A copy of the License is located at
   *
   *     http://aws.amazon.com/apache2.0/
   *
   * or in the "license" file accompanying this file. This file 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.
   */
  
  import { ConsoleLogger as Logger } from '../Common/Logger';
  
  const logger = new Logger('I18nClass');
  
  /**
   * Language transition class
   */
  class I18nClass {
      /**
       * @param {Object} options 
       */
      constructor(config) {
          this.configure(config);
  
          this._lang = this._config.language;
          if (!this._lang && typeof window !== 'undefined' && window.navigator) {
              this._lang = window.navigator.language;
          }
          logger.debug('language: ', this._lang);
  
          this._dict = {};
      }
  
      /**
       * Configure I18n part
       * @param {Object} config
       * @return {Object} - Current configuration
       */
      configure(config) {
          logger.debug('configure I18n');
          this._config = Object.assign({}, this._config, config ? config.I18n || config : null);
  
          return this._config;
      }
  
      /**
       * Explicitly setting language
       * @param {String} lang 
       */
      setLanguage(lang) {
          this._lang = lang;
      }
  
      /**
       * Get value
       * @param {String} key 
       * @param {String} [defVal] - Default value
       * @return {String} - value of the key
       */
      get(key, defVal = undefined) {
          if (!this._lang) {
              return typeof defVal !== 'undefined' ? defVal : key;
          }
  
          const lang = this._lang;
          let val = this.getByLanguage(key, lang);
          if (val) {
              return val;
          }
  
          if (lang.indexOf('-') > 0) {
              val = this.getByLanguage(key, lang.split('-')[0]);
          }
          if (val) {
              return val;
          }
  
          return typeof defVal !== 'undefined' ? defVal : key;
      }
  
      /**
       * Get value according to specified language
       * @param {String} key 
       * @param {String} language - Specified langurage to be used
       * @param {String} defVal - Default value
       * @return {String} - The corresponding value of the key from dictionary
       */
      getByLanguage(key, language, defVal = null) {
          if (!language) {
              return defVal;
          }
  
          const lang_dict = this._dict[language];
          if (!lang_dict) {
              return defVal;
          }
  
          return lang_dict[key];
      }
  
      /**
       * Add vocabularies for one language
       * @param {String} langurage - Language of the dictionary
       * @param {Object} vocabularies - Object that has key-value as dictionary entry
       */
      putVocabulariesForLanguage(language, vocabularies) {
          let lang_dict = this._dict[language];
          if (!lang_dict) {
              lang_dict = this._dict[language] = {};
          }
          Object.assign(lang_dict, vocabularies);
      }
  
      /**
       * Add vocabularies for one language
       * @param {Object} vocabularies - Object that has language as key,
       *                                vocabularies of each language as value
       */
      putVocabularies(vocabularies) {
          Object.keys(vocabularies).map(key => {
              this.putVocabulariesForLanguage(key, vocabularies[key]);
          });
      }
  }
  
  export default I18nClass;