ro.nextreports.designer.util.I18NSupport.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.designer.util.I18NSupport.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 ro.nextreports.designer.util;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.PropertyResourceBundle;
import java.util.Locale;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URL;
import java.security.CodeSource;
import java.text.MessageFormat;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jdesktop.swingx.JXDatePicker;

import ro.nextreports.designer.action.tools.LanguageAction;

/**
 * Created by IntelliJ IDEA. User: mihai.panaitescu Date: Aug 27, 2008 Time:
 * 4:15:35 PM
 */
public class I18NSupport {

    private static final Log LOG = LogFactory.getLog(I18NSupport.class);

    private static ResourceBundle resBundle = PropertyResourceBundle.getBundle("i18n/next-ui",
            new Locale(LanguageAction.LANGUAGE_ENGLISH, LanguageAction.COUNTRY_ENGLISH));

    public static String getString(String propertyName, Object... params) {
        String value = resBundle.getString(propertyName);
        if (params.length > 0) {
            return MessageFormat.format(value, params);
        } else {
            return value;
        }
    }

    public static void changeLocale(Locale locale) {
        resBundle = PropertyResourceBundle.getBundle("i18n/next-ui", locale);
        Locale.setDefault(locale);
        // any third-party components with internationalization must change
        // locale
        JXDatePicker.setDefaultLocale(locale);
    }

    // get i18n files added by user
    // must have both language and country like next-ui_<lang>_<country>.properties
    public static List<String> getUserI18NFiles() {
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        final String dir = "i18n/";
        final String bundlename = "next-ui";
        URL url = loader.getResource(dir);

        List<String> result = new ArrayList<String>();
        File root = new File(url.getFile());

        // run from java ide (i18n folder is found in classpath)
        if (root.exists()) {
            File[] files = root.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.matches("^" + bundlename + "(_\\w{2}(_\\w{2})?)?\\.properties$");
                }
            });
            for (File file : files) {
                result.add(file.getName());
            }

            // run from jar   (i18n folder in inside jar)
        } else {
            // find the jar where i18n folder is located
            CodeSource src = I18NSupport.class.getProtectionDomain().getCodeSource();
            if (src != null) {
                URL jar = src.getLocation();
                try {
                    // look for all i18n files with both language and country specified
                    // (existing i18n files have only the language)
                    ZipInputStream zip = new ZipInputStream(jar.openStream());
                    ZipEntry entry = zip.getNextEntry();
                    while (entry != null) {
                        if (entry.getName().startsWith(dir + bundlename)) {
                            if (entry.getName().split("_").length == 3) {
                                result.add(entry.getName().substring(dir.length()));
                                LOG.info("I18NSupport found a new i18n file: "
                                        + entry.getName().substring(dir.length()));
                            }
                        }
                        zip.closeEntry();
                        entry = zip.getNextEntry();
                    }
                    zip.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                    LOG.error(ex.getMessage(), ex);
                }
            }
        }
        return result;
    }
}