
The branch, master has been updated via 979578bc208c3ab05206285354845e318fa1bff9 (commit) from 809f61077f605b6b8a2e9b3e3cb7eeca37306b0b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://git.qos.ch/gitweb/?p=cal10n.git;a=commit;h=979578bc208c3ab05206285354... http://github.com/ceki/cal10n/commit/979578bc208c3ab05206285354845e318fa1bff... commit 979578bc208c3ab05206285354845e318fa1bff9 Author: Ceki Gulcu <ceki@qos.ch> Date: Wed Sep 2 19:41:54 2009 +0200 - defined a simplified bundle lookup procedure diff --git a/cal10n-api/src/main/java/ch/qos/cal10n/MessageConveyor.java b/cal10n-api/src/main/java/ch/qos/cal10n/MessageConveyor.java index 6f682ae..17069e2 100644 --- a/cal10n-api/src/main/java/ch/qos/cal10n/MessageConveyor.java +++ b/cal10n-api/src/main/java/ch/qos/cal10n/MessageConveyor.java @@ -27,6 +27,7 @@ import java.util.Locale; import java.util.ResourceBundle; import ch.qos.cal10n.util.AnnotationExtractor; +import ch.qos.cal10n.util.PropertyResourceBundleFinder; /** * The default implementation for {@link IMessageConveyor} based on resource @@ -55,9 +56,9 @@ public class MessageConveyor implements IMessageConveyor { * corresponding internationalized. * * <p> - * The name of the resource bundle is defined via the - * {@link BaseName} annotation whereas the locale is specified in - * this MessageConveyor instance's constructor. + * The name of the resource bundle is defined via the {@link BaseName} + * annotation whereas the locale is specified in this MessageConveyor + * instance's constructor. * * @param key * an enum instance used as message key @@ -66,14 +67,16 @@ public class MessageConveyor implements IMessageConveyor { public <E extends Enum<?>> String getMessage(E key, Object... args) { String keyAsStr = key.toString(); - String resouceBundleName = AnnotationExtractor.getBaseName(key - .getDeclaringClass()); - if (resouceBundleName == null) { + String baseName = AnnotationExtractor.getBaseName(key.getDeclaringClass()); + if (baseName == null) { throw new IllegalArgumentException( - "Missing @BaseName annotation in enum type [" + key.getClass().getName() - + "]. See also " + Cal10nConstants.MISSING_BN_ANNOTATION_URL); + "Missing @BaseName annotation in enum type [" + + key.getClass().getName() + "]. See also " + + Cal10nConstants.MISSING_BN_ANNOTATION_URL); } - ResourceBundle rb = ResourceBundle.getBundle(resouceBundleName, locale); + + ResourceBundle rb = PropertyResourceBundleFinder.getBundle(this.getClass() + .getClassLoader(), baseName, locale); String value = rb.getString(keyAsStr); if (value == null) { diff --git a/cal10n-api/src/test/java/ch/qos/cal10n/sample/WithDefaultTest.java b/cal10n-api/src/main/java/ch/qos/cal10n/util/CAL10NPropertyResourceBundle.java similarity index 72% copy from cal10n-api/src/test/java/ch/qos/cal10n/sample/WithDefaultTest.java copy to cal10n-api/src/main/java/ch/qos/cal10n/util/CAL10NPropertyResourceBundle.java index b2da013..b708cee 100644 --- a/cal10n-api/src/test/java/ch/qos/cal10n/sample/WithDefaultTest.java +++ b/cal10n-api/src/main/java/ch/qos/cal10n/util/CAL10NPropertyResourceBundle.java @@ -19,26 +19,21 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package ch.qos.cal10n.sample; +package ch.qos.cal10n.util; -import static org.junit.Assert.assertEquals; +import java.io.IOException; +import java.io.InputStream; +import java.util.PropertyResourceBundle; +import java.util.ResourceBundle; -import java.util.Locale; +public class CAL10NPropertyResourceBundle extends PropertyResourceBundle { -import org.junit.Test; - -import ch.qos.cal10n.MessageConveyor; - - -public class WithDefaultTest { - - @Test - public void smoke() { - MessageConveyor mc = new MessageConveyor(Locale.UK); - String val; - - val = mc.getMessage(Furnitures.TABLE); - assertEquals("the table", val); + public CAL10NPropertyResourceBundle(InputStream is) throws IOException { + super(is); + } + public void setParent(ResourceBundle parent) { + super.setParent(parent); } + } diff --git a/cal10n-api/src/main/java/ch/qos/cal10n/util/PropertyResourceBundleFinder.java b/cal10n-api/src/main/java/ch/qos/cal10n/util/PropertyResourceBundleFinder.java new file mode 100644 index 0000000..7ecdf89 --- /dev/null +++ b/cal10n-api/src/main/java/ch/qos/cal10n/util/PropertyResourceBundleFinder.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2009 QOS.ch All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package ch.qos.cal10n.util; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Locale; +import java.util.ResourceBundle; + +public class PropertyResourceBundleFinder { + + public static ResourceBundle getBundle(ClassLoader classLoader, String baseName, + Locale locale) { + + // same as the JDK convention + // + // It generates a path name from the candidate bundle name by replacing all "." + // characters with "/" and appending the string ".properties". + /// see also http: // tinyurl.com/ldgej8 + baseName = baseName.replace('.', '/'); + + String languageAndCountryCandidate = computeLanguageAndCountryCandidate( + baseName, locale); + String languageOnlyCandidate = computeLanguageOnlyCandidate(baseName, + locale); + + CAL10NPropertyResourceBundle cprbLanguageOnly = makePropertyResourceBundle( + classLoader, languageOnlyCandidate); + CAL10NPropertyResourceBundle cprbLanguageAndCountry = null; + + if (languageAndCountryCandidate != null) { + cprbLanguageAndCountry = makePropertyResourceBundle(classLoader, + languageAndCountryCandidate); + } + + if (cprbLanguageAndCountry != null) { + cprbLanguageAndCountry.setParent(cprbLanguageOnly); + return cprbLanguageAndCountry; + } + return cprbLanguageOnly; + } + + private static CAL10NPropertyResourceBundle makePropertyResourceBundle( + ClassLoader classLoader, String resourceCandiate) { + + CAL10NPropertyResourceBundle prb = null; + + URL url = classLoader.getResource(resourceCandiate); + if (url != null) { + try { + InputStream in = openConnectionForUrl(url); + prb = new CAL10NPropertyResourceBundle(in); + in.close(); + } catch (IOException e) { + } + } + return prb; + } + + private static String computeLanguageAndCountryCandidate(String baseName, + Locale locale) { + String language = locale.getLanguage(); + String country = locale.getCountry(); + if (country != null && country.length() > 0) { + return baseName + "_" + language + "_" + country + ".properties"; + } else { + return null; + } + } + + private static String computeLanguageOnlyCandidate(String baseName, Locale locale) { + String language = locale.getLanguage(); + return baseName + "_" + language + ".properties"; + } + + private static InputStream openConnectionForUrl(URL url) throws IOException { + URLConnection urlConnection = url.openConnection(); + urlConnection.setDefaultUseCaches(false); + InputStream in = urlConnection.getInputStream(); + return in; + } +} diff --git a/cal10n-api/src/test/java/ch/qos/cal10n/sample/WithDefaultTest.java b/cal10n-api/src/main/java/ch/qos/cal10n/util/StringToLocale.java similarity index 74% rename from cal10n-api/src/test/java/ch/qos/cal10n/sample/WithDefaultTest.java rename to cal10n-api/src/main/java/ch/qos/cal10n/util/StringToLocale.java index b2da013..1e70cf8 100644 --- a/cal10n-api/src/test/java/ch/qos/cal10n/sample/WithDefaultTest.java +++ b/cal10n-api/src/main/java/ch/qos/cal10n/util/StringToLocale.java @@ -19,26 +19,21 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package ch.qos.cal10n.sample; - -import static org.junit.Assert.assertEquals; +package ch.qos.cal10n.util; import java.util.Locale; -import org.junit.Test; - -import ch.qos.cal10n.MessageConveyor; - - -public class WithDefaultTest { - - @Test - public void smoke() { - MessageConveyor mc = new MessageConveyor(Locale.UK); - String val; +public class StringToLocale { - val = mc.getMessage(Furnitures.TABLE); - assertEquals("the table", val); + public static Locale toLocale(String localeName) { + if (localeName == null) { + } + if (localeName.contains("_")) { + String[] array = localeName.split("_"); + return new Locale(array[0], array[1]); + } else { + return new Locale(localeName); + } } } diff --git a/cal10n-api/src/main/java/ch/qos/cal10n/verifier/Cal10nError.java b/cal10n-api/src/main/java/ch/qos/cal10n/verifier/Cal10nError.java index 6ea790b..be8e7c2 100644 --- a/cal10n-api/src/main/java/ch/qos/cal10n/verifier/Cal10nError.java +++ b/cal10n-api/src/main/java/ch/qos/cal10n/verifier/Cal10nError.java @@ -43,16 +43,16 @@ public class Cal10nError { final Locale locale; final Class<?> enumClass; final String enumClassName; - final String resouceBundleName; + final String baseName; Cal10nError(ErrorType errorType, String key, Class<?> enumClass, - Locale locale, String resourceBundleName) { + Locale locale, String baseName) { this.errorType = errorType; this.key = key; this.enumClass = enumClass; this.enumClassName = enumClass.getName(); this.locale = locale; - this.resouceBundleName = resourceBundleName; + this.baseName = baseName; } public ErrorType getErrorType() { @@ -82,21 +82,21 @@ public class Cal10nError { // enumClassName // + "]"; case FAILED_TO_FIND_RB: - return "Failed to locate resource bundle [" + resouceBundleName - + "]for locale [" + locale + "] for enum type [" + enumClassName + return "Failed to locate resource bundle [" + baseName + + "] for locale [" + locale + "] for enum type [" + enumClassName + "]"; case EMPTY_RB: - return "Empty resource bundle named [" + resouceBundleName + return "Empty resource bundle named [" + baseName + "] for locale [" + locale + "]"; case EMPTY_ENUM: return "Empty enum type [" + enumClassName + "]"; case ABSENT_IN_ENUM: return "Key [" + key + "] present in resource bundle named [" - + resouceBundleName + "] for locale [" + locale + + baseName + "] for locale [" + locale + "] but absent in enum type [" + enumClassName + "]"; case ABSENT_IN_RB: return "Key [" + key + "] present in enum type [" + enumClassName - + "] but absent in resource bundle named [" + resouceBundleName + + "] but absent in resource bundle named [" + baseName + "] for locale [" + locale + "]"; default: throw new IllegalStateException("Impossible to reach here"); diff --git a/cal10n-api/src/main/java/ch/qos/cal10n/verifier/IMessageKeyVerifier.java b/cal10n-api/src/main/java/ch/qos/cal10n/verifier/IMessageKeyVerifier.java index ae4b89b..14cf610 100644 --- a/cal10n-api/src/main/java/ch/qos/cal10n/verifier/IMessageKeyVerifier.java +++ b/cal10n-api/src/main/java/ch/qos/cal10n/verifier/IMessageKeyVerifier.java @@ -15,9 +15,10 @@ import java.util.Locale; */ public interface IMessageKeyVerifier { + // WARNING: // WARNING: The name of this class is referenced in String form // to do class loader tricks. Do not change the name of this class - // without looking at the maven-plugin. + // without looking at the maven-cal10n-plugin. /** * Get the of enum type that this verifier is related to to. diff --git a/cal10n-api/src/main/java/ch/qos/cal10n/verifier/MessageKeyVerifier.java b/cal10n-api/src/main/java/ch/qos/cal10n/verifier/MessageKeyVerifier.java index ce31ace..8b78912 100644 --- a/cal10n-api/src/main/java/ch/qos/cal10n/verifier/MessageKeyVerifier.java +++ b/cal10n-api/src/main/java/ch/qos/cal10n/verifier/MessageKeyVerifier.java @@ -31,6 +31,8 @@ import java.util.ResourceBundle; import java.util.Set; import ch.qos.cal10n.util.AnnotationExtractor; +import ch.qos.cal10n.util.PropertyResourceBundleFinder; +import ch.qos.cal10n.util.StringToLocale; import ch.qos.cal10n.verifier.Cal10nError.ErrorType; /** @@ -73,27 +75,28 @@ public class MessageKeyVerifier implements IMessageKeyVerifier { public List<Cal10nError> verify(Locale locale) { List<Cal10nError> errorList = new ArrayList<Cal10nError>(); - String resouceBundleName = AnnotationExtractor - .getBaseName(enumType); + String baseName = AnnotationExtractor.getBaseName(enumType); - if (resouceBundleName == null) { + if (baseName == null) { errorList.add(new Cal10nError(ErrorType.MISSING_BN_ANNOTATION, "", enumType, locale, "")); // no point in continuing return errorList; } - ResourceBundle rb = ResourceBundle.getBundle(resouceBundleName, locale); + ResourceBundle rb = PropertyResourceBundleFinder.getBundle(this.getClass() + .getClassLoader(), baseName, locale); - ErrorFactory errorFactory = new ErrorFactory(enumType, locale, - resouceBundleName); + ErrorFactory errorFactory = new ErrorFactory(enumType, locale, baseName); if (rb == null) { errorList.add(errorFactory.buildError(ErrorType.FAILED_TO_FIND_RB, "")); + // no point in continuing + return errorList; } - - Set<String> rbKeySet = buildKeySetFromEnumeration(rb.getKeys()); + Set<String> rbKeySet = buildKeySetFromEnumeration(rb.getKeys()); + if (rbKeySet.size() == 0) { errorList.add(errorFactory.buildError(ErrorType.EMPTY_RB, "")); } @@ -123,14 +126,14 @@ public class MessageKeyVerifier implements IMessageKeyVerifier { } private Set<String> buildKeySetFromEnumeration(Enumeration<String> e) { - Set<String> set = new HashSet<String>(); - while(e.hasMoreElements()) { + Set<String> set = new HashSet<String>(); + while (e.hasMoreElements()) { String s = e.nextElement(); set.add(s); } return set; } - + public List<String> typeIsolatedVerify(Locale locale) { List<Cal10nError> errorList = verify(locale); List<String> strList = new ArrayList<String>(); @@ -154,7 +157,8 @@ public class MessageKeyVerifier implements IMessageKeyVerifier { throw new IllegalStateException(errMsg); } for (String localeName : localeNameArray) { - Locale locale = new Locale(localeName); + Locale locale = StringToLocale.toLocale(localeName); + System.out.println(locale); List<Cal10nError> tmpList = verify(locale); errorList.addAll(tmpList); } diff --git a/cal10n-api/src/test/java/ch/qos/cal10n/sample/Colors.java b/cal10n-api/src/test/java/ch/qos/cal10n/sample/Colors.java index bb5e4a0..8c026bb 100644 --- a/cal10n-api/src/test/java/ch/qos/cal10n/sample/Colors.java +++ b/cal10n-api/src/test/java/ch/qos/cal10n/sample/Colors.java @@ -28,6 +28,7 @@ import ch.qos.cal10n.BaseName; @BaseName("colors") @LocaleNames({"en_UK", "fr"}) public enum Colors { + // sub-class for testing purposes RED { }, diff --git a/cal10n-api/src/test/java/ch/qos/cal10n/sample/MyAllInOneColorVerificationTest.java b/cal10n-api/src/test/java/ch/qos/cal10n/sample/MyAllInOneColorVerificationTest.java index 5f5014a..5af05d3 100644 --- a/cal10n-api/src/test/java/ch/qos/cal10n/sample/MyAllInOneColorVerificationTest.java +++ b/cal10n-api/src/test/java/ch/qos/cal10n/sample/MyAllInOneColorVerificationTest.java @@ -44,6 +44,7 @@ public class MyAllInOneColorVerificationTest { public void all() { IMessageKeyVerifier mcv = new MessageKeyVerifier(Colors.class); List<Cal10nError> errorList = mcv.verifyAllLocales(); + System.out.println(errorList); assertEquals(0, errorList.size()); } diff --git a/cal10n-api/src/test/java/ch/qos/cal10n/sample/PackageTest.java b/cal10n-api/src/test/java/ch/qos/cal10n/sample/PackageTest.java index 6df62ba..ca1f4e2 100644 --- a/cal10n-api/src/test/java/ch/qos/cal10n/sample/PackageTest.java +++ b/cal10n-api/src/test/java/ch/qos/cal10n/sample/PackageTest.java @@ -27,6 +27,7 @@ import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) -@SuiteClasses( { MessageKeyVerifierTest.class, MessageConveyorTest.class, WithDefaultTest.class }) +@SuiteClasses( { MessageKeyVerifierTest.class, MessageConveyorTest.class, + MyColorVerificationTest.class, MyAllInOneColorVerificationTest.class }) public class PackageTest { } diff --git a/cal10n-api/src/test/java/ch/qos/cal10n/util/PropertyResourceBundleFinderTest.java b/cal10n-api/src/test/java/ch/qos/cal10n/util/PropertyResourceBundleFinderTest.java new file mode 100644 index 0000000..323f4d2 --- /dev/null +++ b/cal10n-api/src/test/java/ch/qos/cal10n/util/PropertyResourceBundleFinderTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2009 QOS.ch All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package ch.qos.cal10n.util; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.Locale; +import java.util.ResourceBundle; + +import org.junit.Test; + +public class PropertyResourceBundleFinderTest { + ResourceBundle rb; + + @Test + public void smoke() throws IOException { + rb = PropertyResourceBundleFinder.getBundle(this.getClass().getClassLoader(), + "colors", Locale.FRENCH); + assertEquals("les roses sont rouges", rb.getString("RED")); + } + + @Test + public void withCountry() throws IOException { + rb = PropertyResourceBundleFinder.getBundle(this.getClass().getClassLoader(), + "colors", Locale.FRENCH); + assertEquals("les roses sont rouges", rb.getString("RED")); + + rb = PropertyResourceBundleFinder.getBundle(this.getClass().getClassLoader(), + "colors", Locale.FRANCE); + assertEquals("les roses sont rouges, et alors?", rb.getString("RED")); + } + + @Test + public void inDirectory() throws IOException { + rb = PropertyResourceBundleFinder.getBundle(this.getClass().getClassLoader(), + "foobar/sample", Locale.ENGLISH); + assertEquals("A is the first letter of the alphabet", rb.getString("A")); + + rb = PropertyResourceBundleFinder.getBundle(this.getClass().getClassLoader(), + "foobar.sample", Locale.ENGLISH); + assertEquals("A is the first letter of the alphabet", rb.getString("A")); + } +} diff --git a/cal10n-api/src/test/resources/colors.properties b/cal10n-api/src/test/resources/colors.properties new file mode 100644 index 0000000..6eb4378 --- /dev/null +++ b/cal10n-api/src/test/resources/colors.properties @@ -0,0 +1,4 @@ +# this bundle should be ignored +BLUE=BBBBBBB +RED=RRRRRRRRRRR +GREEN=GGGGGGGGG \ No newline at end of file diff --git a/cal10n-api/src/test/resources/colors_fr_FR.properties b/cal10n-api/src/test/resources/colors_fr_FR.properties new file mode 100644 index 0000000..8a57918 --- /dev/null +++ b/cal10n-api/src/test/resources/colors_fr_FR.properties @@ -0,0 +1 @@ +RED=les roses sont rouges, et alors? \ No newline at end of file diff --git a/cal10n-api/src/test/resources/foobar/sample_en.properties b/cal10n-api/src/test/resources/foobar/sample_en.properties new file mode 100644 index 0000000..a705e87 --- /dev/null +++ b/cal10n-api/src/test/resources/foobar/sample_en.properties @@ -0,0 +1 @@ +A=A is the first letter of the alphabet \ No newline at end of file diff --git a/cal10n-api/src/test/resources/foobar/sample_fr.properties b/cal10n-api/src/test/resources/foobar/sample_fr.properties new file mode 100644 index 0000000..401665b --- /dev/null +++ b/cal10n-api/src/test/resources/foobar/sample_fr.properties @@ -0,0 +1 @@ +A=A est la premiere letter de l'alphabet \ No newline at end of file diff --git a/cal10n-site/src/site/pages/manual.html b/cal10n-site/src/site/pages/manual.html index 685a471..e180c46 100644 --- a/cal10n-site/src/site/pages/manual.html +++ b/cal10n-site/src/site/pages/manual.html @@ -152,8 +152,55 @@ String blue = mc.getMessage(Colors.BLUE); </pre> comes with additional tooling support. </p> + <h2><a name="simplifiedLookup" href="#simplifiedLookup">Simplified + bundle lookup procedure</a></h2> + + <p>The <code>ResourceBundle</code> class defines a rather involved + <a + href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/ResourceBundle.html#getBundle%28java.lang.String,%20java.util.Locale,%20java.lang.ClassLoader%29">lookup + procedure</a> for finding resource bundles. While formally this + procedure is deterministic, it is too error-prone for our taste. In + CAL10N, we thus took the bold initiative to define a simplified bundle look + up procedure. + </p> + + <p>Given a locale, the simplified look up procedure only takes into + account that locale, ignoring the default locale and the resource + bundle corresponding to the naked base name, i.e. the default + resource bundle. However, if the locale has both a language + <b>and</b> a country, and corresponding bundle files exist, then + CAL10N will take into account both bundles, establishing the same + parent child relationship as the JDK <code>ResourceBundle</code> + class. + </p> + + <p>For example, for base name "colors" if the following bundles + exist on the class path: + </p> + + <pre class="source">colors.properties +colors_en_US.properties +colors_en.properties +colors_fr_FR.properties</pre> + + + <p>and the system's default locale is "fr_FR", when CAL10N is asked + to find resource bundles corresponding to the "en_US" locale, it + will ignore the <em>colors.properties</em> (~ default bundle) and + <em>colors_fr_FR.properties</em> (~ default locale), while + combining the <em>colors_en_US.properties</em> and + <em>colors_en.properties</em> bundles in the usual parent-child + relationship. + </p> + + <p>We hope that the simplified lookup procedeue, while deviating + from the conventions of the Java platform as defined in the + <code>ResourceBundle</code> class, will still cause <a + href="http://en.wikipedia.org/wiki/Principle_of_least_astonishment"> + less suprises</a>.</p> - <h2><a name="deferred" href="#deferred">Deferred localization</a></h2> + <h2><a name="deferred" href="#deferred">Deferred + localization</a></h2> <p>Under certain circumstances, the appropriate locale is <em>unknown</em> at the time or place where the message key and diff --git a/cal10n-site/src/site/pages/news.html b/cal10n-site/src/site/pages/news.html index 0e42b24..488a47f 100644 --- a/cal10n-site/src/site/pages/news.html +++ b/cal10n-site/src/site/pages/news.html @@ -29,13 +29,17 @@ <hr width="80%" align="center" /> - <h3>x of September 2009 - Release of CAL10N version 0.5.2</h3> + <h3>2nd of September 2009 - Release of CAL10N version 0.6</h3> <p>Fixed issue <a href="http://jira.qos.ch/browse/CAL-1">CAL-1</a> as reported by Takeshi Kondo. <code>MessageConveyor</code> will now correctly handle enums which are nested within other classes or enums which are nested within another enum.</p> + <p>CAI10N now uses a <a + href="manual.html#simplifiedLookup">simplifed bundle lookup + procedure</a>.</p> + <hr width="80%" align="center" /> <h3>1st of September 2009 - Release of CAL10N version 0.5.1</h3> ----------------------------------------------------------------------- Summary of changes: .../main/java/ch/qos/cal10n/MessageConveyor.java | 21 +++-- .../cal10n/util/CAL10NPropertyResourceBundle.java} | 21 +++-- .../cal10n/util/PropertyResourceBundleFinder.java | 103 ++++++++++++++++++++ .../java/ch/qos/cal10n/util/StringToLocale.java} | 27 ++--- .../java/ch/qos/cal10n/verifier/Cal10nError.java | 16 ++-- .../qos/cal10n/verifier/IMessageKeyVerifier.java | 3 +- .../ch/qos/cal10n/verifier/MessageKeyVerifier.java | 28 +++--- .../src/test/java/ch/qos/cal10n/sample/Colors.java | 1 + .../sample/MyAllInOneColorVerificationTest.java | 1 + .../java/ch/qos/cal10n/sample/PackageTest.java | 3 +- .../util/PropertyResourceBundleFinderTest.java | 63 ++++++++++++ cal10n-api/src/test/resources/colors.properties | 4 + .../src/test/resources/colors_fr_FR.properties | 1 + .../src/test/resources/foobar/sample_en.properties | 1 + .../src/test/resources/foobar/sample_fr.properties | 1 + cal10n-site/src/site/pages/manual.html | 49 +++++++++- cal10n-site/src/site/pages/news.html | 6 +- 17 files changed, 293 insertions(+), 56 deletions(-) copy cal10n-api/src/{test/java/ch/qos/cal10n/util/PackageTest.java => main/java/ch/qos/cal10n/util/CAL10NPropertyResourceBundle.java} (73%) create mode 100644 cal10n-api/src/main/java/ch/qos/cal10n/util/PropertyResourceBundleFinder.java rename cal10n-api/src/{test/java/ch/qos/cal10n/sample/WithDefaultTest.java => main/java/ch/qos/cal10n/util/StringToLocale.java} (74%) create mode 100644 cal10n-api/src/test/java/ch/qos/cal10n/util/PropertyResourceBundleFinderTest.java create mode 100644 cal10n-api/src/test/resources/colors.properties create mode 100644 cal10n-api/src/test/resources/colors_fr_FR.properties create mode 100644 cal10n-api/src/test/resources/foobar/sample_en.properties create mode 100644 cal10n-api/src/test/resources/foobar/sample_fr.properties hooks/post-receive -- Compiler assisted localization library
participants (1)
-
git-noreply@pixie.qos.ch