ReloadableResourceBundleMessageSource correctly calculates filenames for locales with variant but without country now (SPR-5716)

This commit is contained in:
Juergen Hoeller 2009-05-07 09:24:34 +00:00
parent 7d4da0085c
commit 4ccb352aac
2 changed files with 49 additions and 18 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -89,7 +89,7 @@ import org.springframework.util.StringUtils;
* @see java.util.ResourceBundle
*/
public class ReloadableResourceBundleMessageSource extends AbstractMessageSource
implements ResourceLoaderAware {
implements ResourceLoaderAware {
private static final String PROPERTIES_SUFFIX = ".properties";
@ -127,10 +127,8 @@ public class ReloadableResourceBundleMessageSource extends AbstractMessageSource
* {@link ResourceBundleMessageSource} referring to a Spring resource location:
* e.g. "WEB-INF/messages" for "WEB-INF/messages.properties",
* "WEB-INF/messages_en.properties", etc.
* <p>As of Spring 1.2.2, XML properties files are also supported:
* e.g. "WEB-INF/messages" will find and load "WEB-INF/messages.xml",
* "WEB-INF/messages_en.xml", etc as well. Note that this will only
* work on JDK 1.5+.
* <p>XML properties files are also supported: .g. "WEB-INF/messages" will find
* and load "WEB-INF/messages.xml", "WEB-INF/messages_en.xml", etc as well.
* @param basename the single basename
* @see #setBasenames
* @see org.springframework.core.io.ResourceEditor
@ -146,14 +144,11 @@ public class ReloadableResourceBundleMessageSource extends AbstractMessageSource
* {@link ResourceBundleMessageSource} referring to a Spring resource location:
* e.g. "WEB-INF/messages" for "WEB-INF/messages.properties",
* "WEB-INF/messages_en.properties", etc.
* <p>As of Spring 1.2.2, XML properties files are also supported:
* e.g. "WEB-INF/messages" will find and load "WEB-INF/messages.xml",
* "WEB-INF/messages_en.xml", etc as well. Note that this will only
* work on JDK 1.5+.
* <p>The associated resource bundles will be checked sequentially
* when resolving a message code. Note that message definitions in a
* <i>previous</i> resource bundle will override ones in a later bundle,
* due to the sequential lookup.
* <p>XML properties files are also supported: .g. "WEB-INF/messages" will find
* and load "WEB-INF/messages.xml", "WEB-INF/messages_en.xml", etc as well.
* <p>The associated resource bundles will be checked sequentially when resolving
* a message code. Note that message definitions in a <i>previous</i> resource
* bundle will override ones in a later bundle, due to the sequential lookup.
* @param basenames an array of basenames
* @see #setBasename
* @see java.util.ResourceBundle
@ -393,6 +388,7 @@ public class ReloadableResourceBundleMessageSource extends AbstractMessageSource
* appending language code, country code, and variant code.
* E.g.: basename "messages", Locale "de_AT_oo" -> "messages_de_AT_OO",
* "messages_de_AT", "messages_de".
* <p>Follows the rules defined by {@link java.util.Locale#toString()}.
* @param basename the basename of the bundle
* @param locale the locale
* @return the List of filenames to check
@ -404,17 +400,19 @@ public class ReloadableResourceBundleMessageSource extends AbstractMessageSource
String variant = locale.getVariant();
StringBuilder temp = new StringBuilder(basename);
temp.append('_');
if (language.length() > 0) {
temp.append('_').append(language);
temp.append(language);
result.add(0, temp.toString());
}
temp.append('_');
if (country.length() > 0) {
temp.append('_').append(country);
temp.append(country);
result.add(0, temp.toString());
}
if (variant.length() > 0) {
if (variant.length() > 0 && (language.length() > 0 || country.length() > 0)) {
temp.append('_').append(variant);
result.add(0, temp.toString());
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 the original author or authors.
* Copyright 2002-2009 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,6 +16,7 @@
package org.springframework.context.support;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
@ -267,4 +268,36 @@ public class ResourceBundleMessageSourceTests extends TestCase {
assertEquals("message2", ms.getMessage("code2", null, Locale.GERMAN));
}
public void testReloadableResourceBundleMessageSourceFileNameCalculation() {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
List<String> filenames = ms.calculateFilenamesForLocale("messages", Locale.ENGLISH);
assertEquals(1, filenames.size());
assertEquals("messages_en", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", Locale.UK);
assertEquals(2, filenames.size());
assertEquals("messages_en", filenames.get(1));
assertEquals("messages_en_GB", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("en", "GB", "POSIX"));
assertEquals(3, filenames.size());
assertEquals("messages_en", filenames.get(2));
assertEquals("messages_en_GB", filenames.get(1));
assertEquals("messages_en_GB_POSIX", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("en", "", "POSIX"));
assertEquals(2, filenames.size());
assertEquals("messages_en", filenames.get(1));
assertEquals("messages_en__POSIX", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("", "UK", "POSIX"));
assertEquals(2, filenames.size());
assertEquals("messages__UK", filenames.get(1));
assertEquals("messages__UK_POSIX", filenames.get(0));
filenames = ms.calculateFilenamesForLocale("messages", new Locale("", "", "POSIX"));
assertEquals(0, filenames.size());
}
}