Author: fdesbois Date: 2011-05-04 14:09:57 +0200 (Wed, 04 May 2011) New Revision: 1900 Url: http://nuiton.org/repositories/revision/i18n/1900 Log: #1498 : Add Charset encoding in I18nInitializer used for I18nLanguage to load properties. Added: trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest_ja_JP.properties Modified: trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/BundleMojo.java trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/TapestryBundleMojo.java trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nLanguage.java trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nStore.java trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/bundle/I18nBundleEntry.java trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/ClassPathI18nInitializer.java trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/DefaultI18nInitializer.java trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/I18nInitializer.java trunk/nuiton-i18n/src/test/java/org/nuiton/i18n/I18nTest.java trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest-definition.properties Modified: trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/BundleMojo.java =================================================================== --- trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/BundleMojo.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/BundleMojo.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -34,6 +34,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -130,6 +131,7 @@ } List<String> bundlesUrls = new ArrayList<String>(); + Charset loadEncoding = Charset.forName(srcEncoding); for (URL url : urls) { long t000 = System.nanoTime(); I18nBundleEntry bundleEntry = @@ -138,7 +140,7 @@ // If bundle are from other libs, maybe encoding could be uncompatible :/ // Generally those files are ISO Latin1 or UTF-8, reading in // UTF8 ISO Latin1 files will be Ok. - bundleEntry.load(propertiesOut, srcEncoding); + bundleEntry.load(propertiesOut, loadEncoding); String strPath = bundleEntry.getPath().toString(); int index = strPath.indexOf("i18n/"); Modified: trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/TapestryBundleMojo.java =================================================================== --- trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/TapestryBundleMojo.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/maven-i18n-plugin/src/main/java/org/nuiton/i18n/plugin/bundle/TapestryBundleMojo.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -33,6 +33,7 @@ import java.io.File; import java.io.IOException; import java.net.URL; +import java.nio.charset.Charset; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Locale; @@ -94,11 +95,12 @@ continue; } + Charset loadEncoding = Charset.forName(outEncoding); for (URL url : urls) { long t000 = System.nanoTime(); I18nBundleEntry bundleEntry = new I18nBundleEntry(url, locale, null); - bundleEntry.load(propertiesOut); + bundleEntry.load(propertiesOut, loadEncoding); String strPath = bundleEntry.getPath().toString(); int index = strPath.indexOf("i18n/"); Modified: trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nLanguage.java =================================================================== --- trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nLanguage.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nLanguage.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -29,7 +29,12 @@ import org.apache.commons.logging.LogFactory; import org.nuiton.i18n.bundle.I18nBundleEntry; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.Charset; import java.util.Enumeration; import java.util.Locale; import java.util.MissingResourceException; @@ -71,9 +76,25 @@ * fichiers de traduction. * * @param bundleEntries the used bundles entries to load + * @deprecated since 2.4 use {@link #load(I18nBundleEntry[], Charset)} instead, + * charset must be provided to avoid encoding problems */ + @Deprecated public void load(I18nBundleEntry[] bundleEntries) { + Charset encoding = Charset.forName(I18nUtil.ISO_8859_1_ENCONDING); + load(bundleEntries, encoding); + } + /** + * charge les traductions de la languea partir d'une liste donnee de + * fichiers de traduction. + * + * @param bundleEntries the used bundles entries to load + * @param encoding Charset to use for Properties loading + * @since 2.4 + */ + public void load(I18nBundleEntry[] bundleEntries, Charset encoding) { + // use a recursive properties // inspired from nuiton-utils:org.nuiton.util.RecursiveProperties // thanks to Arnaud Thimel @@ -119,7 +140,7 @@ try { for (I18nBundleEntry e : bundleEntries) { - e.load(resource); + e.load(resource, encoding); } } catch (IOException e) { throw new RuntimeException(e); Modified: trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nStore.java =================================================================== --- trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nStore.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/I18nStore.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -306,7 +306,7 @@ I18nLanguage result; result = new I18nLanguage(locale); I18nBundleEntry[] entries = getBundleEntries(locale); - result.load(entries); + result.load(entries, resolver.getEncoding()); if (log.isInfoEnabled()) { log.info(result + ", nbEntries: " + entries.length + Modified: trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/bundle/I18nBundleEntry.java =================================================================== --- trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/bundle/I18nBundleEntry.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/bundle/I18nBundleEntry.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -27,7 +27,10 @@ import org.nuiton.i18n.I18nUtil; -import java.io.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; import java.util.Locale; @@ -122,11 +125,12 @@ * * @param resource the save of resources already loaded * @throws IOException if any pb while reading resource file - * @deprecated since 2.4 use {@link #load(Properties, String)} instead, charset must be provided to avoid encoding problems + * @deprecated since 2.4 use {@link #load(Properties, Charset)} instead, + * charset must be provided to avoid encoding problems */ @Deprecated public void load(Properties resource) throws IOException { - String encoding = I18nUtil.ISO_8859_1_ENCONDING; + Charset encoding = Charset.forName(I18nUtil.ISO_8859_1_ENCONDING); load(resource, encoding); } @@ -136,11 +140,11 @@ * properties. It could be different from resulting properties store. * * @param resource the save of resources already loaded - * @param encoding Encoding used to store the properties + * @param encoding Charset used to store the properties * @throws IOException if any pb while reading resource file * @since 2.4 */ - public void load(Properties resource, String encoding) throws IOException { + public void load(Properties resource, Charset encoding) throws IOException { InputStream inputStream = null; StringBuilder sb = new StringBuilder(); try { Modified: trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/ClassPathI18nInitializer.java =================================================================== --- trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/ClassPathI18nInitializer.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/ClassPathI18nInitializer.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -33,6 +33,7 @@ import java.net.URL; import java.net.URLClassLoader; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; @@ -70,6 +71,11 @@ } public ClassPathI18nInitializer(ClassLoader loader, URL[] extraURLs) { + this(loader, extraURLs, null); + } + + public ClassPathI18nInitializer(ClassLoader loader, URL[] extraURLs, Charset encoding) { + super(encoding); this.loader = loader == null ? getClass().getClassLoader() : loader; this.extraURLs = extraURLs; } Modified: trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/DefaultI18nInitializer.java =================================================================== --- trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/DefaultI18nInitializer.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/DefaultI18nInitializer.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -32,7 +32,12 @@ import java.io.InputStream; import java.net.URL; -import java.util.*; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Properties; /** * Default implementation of a {@link I18nInitializer} using the default i18n @@ -84,6 +89,14 @@ public DefaultI18nInitializer(String bundleName, ClassLoader loader, String i18nPath) throws NullPointerException { + this(bundleName, loader, i18nPath, null); + } + + public DefaultI18nInitializer(String bundleName, + ClassLoader loader, + String i18nPath, + Charset encoding) throws NullPointerException { + super(encoding); if (bundleName == null) { throw new NullPointerException( "parameter 'bundleName' can not be null"); Modified: trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/I18nInitializer.java =================================================================== --- trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/I18nInitializer.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/main/java/org/nuiton/i18n/init/I18nInitializer.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -27,11 +27,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.i18n.I18nUtil; import org.nuiton.i18n.bundle.I18nBundle; import org.nuiton.i18n.bundle.I18nBundleEntry; import org.nuiton.i18n.bundle.I18nBundleUtil; import java.net.URL; +import java.nio.charset.Charset; import java.util.List; /** @@ -45,6 +47,17 @@ /** Logger */ private static final Log log = LogFactory.getLog(I18nInitializer.class); + protected Charset encoding; + + protected I18nInitializer() { + this(null); + } + + protected I18nInitializer(Charset encoding) { + Charset defaultEncoding = Charset.forName(I18nUtil.DEFAULT_ENCODING); + this.encoding = encoding == null ? defaultEncoding : encoding; + } + /** * Resolv the bundles. * @@ -71,4 +84,12 @@ return result; } + public Charset getEncoding() { + return encoding; + } + + public void setEncoding(Charset encoding) { + this.encoding = encoding; + } + } Modified: trunk/nuiton-i18n/src/test/java/org/nuiton/i18n/I18nTest.java =================================================================== --- trunk/nuiton-i18n/src/test/java/org/nuiton/i18n/I18nTest.java 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/test/java/org/nuiton/i18n/I18nTest.java 2011-05-04 12:09:57 UTC (rev 1900) @@ -29,7 +29,9 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.i18n.init.DefaultI18nInitializer; +import org.nuiton.i18n.init.I18nInitializer; +import java.nio.charset.Charset; import java.util.Locale; /** @@ -104,6 +106,20 @@ } @Test + public void testEncodingUTF8() { + + Charset utf8 = Charset.forName("utf-8"); + + I18nInitializer initializerUtf8 = new DefaultI18nInitializer( + I18nStoreTest.class.getSimpleName(), null, null, utf8); + + I18n.init(initializerUtf8, Locale.JAPAN); + + Assert.assertNotNull(I18n.store.resolver.getEncoding()); + Assert.assertEquals("最初の", I18n._("key.one")); + } + + @Test public void testSimple() { String expected; Modified: trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest-definition.properties =================================================================== --- trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest-definition.properties 2011-05-03 23:00:42 UTC (rev 1899) +++ trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest-definition.properties 2011-05-04 12:09:57 UTC (rev 1900) @@ -25,4 +25,5 @@ #Sun Mar 07 00:23:58 CET 2010 bundles.en_GB=bundleTest/I18nStoreTest_en_GB.properties bundles.fr_FR=bundleTest/I18nStoreTest_fr_FR.properties -locales=fr_FR,en_GB +bundles.ja_JP=bundleTest/I18nStoreTest_ja_JP.properties +locales=fr_FR,en_GB,ja_JP Added: trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest_ja_JP.properties =================================================================== --- trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest_ja_JP.properties (rev 0) +++ trunk/nuiton-i18n/src/test/resources/META-INF/I18nStoreTest_ja_JP.properties 2011-05-04 12:09:57 UTC (rev 1900) @@ -0,0 +1,27 @@ +### +# #%L +# I18n :: Api +# +# $Id: I18nStoreTest_fr_FR.properties 1882 2011-02-14 15:54:14Z tchemit $ +# $HeadURL: http://svn.nuiton.org/svn/i18n/trunk/nuiton-i18n/src/test/resources/META-INF... $ +# %% +# Copyright (C) 2004 - 2010 CodeLutin +# %% +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Lesser Public License for more details. +# +# You should have received a copy of the GNU General Lesser Public +# License along with this program. If not, see +# <http://www.gnu.org/licenses/lgpl-3.0.html>. +# #L% +### +key.one=最初の +key.two=2番目 +key.with.param=とキー %s