Package ca.simplegames.micro.extensions.i18n

Source Code of ca.simplegames.micro.extensions.i18n.I18NExtension

/*
* Copyright (c)2012. Florin T.PATRASCU
*
* 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 ca.simplegames.micro.extensions.i18n;

import ca.simplegames.micro.Extension;
import ca.simplegames.micro.Filter;
import ca.simplegames.micro.Globals;
import ca.simplegames.micro.SiteContext;
import ca.simplegames.micro.filters.FilterManager;
import ca.simplegames.micro.utils.Assert;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.net.MalformedURLException;
import java.util.*;

/**
* @author <a href="mailto:florin.patrascu@gmail.com">Florin T.PATRASCU</a>
* @since $Revision$ (created: 2012-12-19 10:19 PM)
*/
@SuppressWarnings("unchecked")
public class I18NExtension implements Extension {
  private Logger log = LoggerFactory.getLogger(getClass());

  private static final String version = "0.1";
  private String intercept = "lang";
  private String scopesSrc = "context";
  private String[] scopes = {scopesSrc};
  private boolean fallbackToSystemLocale = true;
  private String defaultEncoding = "utf-8";
  private int resourceCacheRefreshInterval = 25;
  private String[] resourceBasePaths = new String[]{};
  private ReloadableResourceBundleMessageSource messageSource;
  public static final String DEFAULT_LANG = "en";
  private List<String> infoDetails = new ArrayList<String>();
  private String name = "i18N";

  public Extension register(String name, SiteContext site, Map<String, Object> locales) throws Exception {
    Assert.notNull(name, "The name of the extension must not be null!");
    this.name = StringUtils.defaultIfBlank(name, "i18N");

    if (locales != null) {
      Map interceptConfig = (Map<String, Object>) locales.get("intercept");

      if (interceptConfig != null) {
        intercept = StringUtils.defaultString((String) interceptConfig.get("parameter_name"), "lang");
        scopesSrc = StringUtils.defaultString((String) interceptConfig.get("scope"), "context");
        scopes = StringUtils.split(scopesSrc, ",");
      }

      defaultEncoding = StringUtils.defaultString((String) locales.get("default_encoding"), Globals.UTF8);
      fallbackToSystemLocale = locales.get("fallback_to_system_locale") != null ?
          (Boolean) locales.get("fallback_to_system_locale") : true;

      resourceCacheRefreshInterval = Integer.parseInt(
          StringUtils.defaultString((locales.get("resource_cache")).toString(), "10"));

      List<String> paths = (List<String>) locales.get("base_names");
      if (paths != null && !paths.isEmpty()) {
        List<String> absPaths = new ArrayList<String>();

        for (String path : paths) {
          File realPath = new File(path);
          if (!realPath.exists()) {
            realPath = new File(site.getWebInfPath().getAbsolutePath(), path);
          }

          try {
            absPaths.add(realPath.toURI().toURL().toString());
            //absPaths.add(pathConfig.getValue());
          } catch (MalformedURLException e) {
            e.printStackTrace();
          }
        }
        resourceBasePaths = absPaths.toArray(new String[absPaths.size()]);
      } else {
        resourceBasePaths = new String[]{"config/locales/messages"};
      }


      //Configure the i18n
      messageSource = new ReloadableResourceBundleMessageSource();
      messageSource.setDefaultEncoding(defaultEncoding);
      messageSource.setFallbackToSystemLocale(fallbackToSystemLocale);
      messageSource.setCacheSeconds(resourceCacheRefreshInterval);
      messageSource.setBasenames(resourceBasePaths);

      Filter i18N = new I18NFilter(this);
      final FilterManager filterManager = site.getFilterManager();

      filterManager.addFilter(i18N);
      // now make sure the i18N filter is always first (if present)
      Collections.swap(filterManager.getBeforeFilters(), 0, filterManager.getBeforeFilters().size() - 1);

      infoDetails.add(String.format("  default encoding ........: %s", defaultEncoding));
      infoDetails.add(String.format("  fallback to system locale: %s", fallbackToSystemLocale));
      infoDetails.add(String.format("  cache refresh ...........: %s", resourceCacheRefreshInterval));
      infoDetails.add(String.format("  resource bundle .........: %s", Arrays.toString(resourceBasePaths)));
      infoDetails.add(String.format("  Listening for ...........: '%s'", intercept));
      infoDetails.add(String.format("       in scope(s) ........: %s", scopesSrc));
    }

    return this;
  }

  public ReloadableResourceBundleMessageSource getMessageSource() {
    return messageSource;
  }

  public String[] getScopes() {
    return scopes;
  }

  public String getDefaultEncoding() {
    return defaultEncoding;
  }

  public String getIntercept() {
    return intercept;
  }

  public String getName() {
    return name;
  }

  @Override
  public void shutdown() {
    // all good, nothing to do
  }

  @Override
  public String toString() {
    return "I18NExtension{" +
        "infoDetails=" + infoDetails +
        '}';
  }
}
TOP

Related Classes of ca.simplegames.micro.extensions.i18n.I18NExtension

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.