parent
864dcf67d8
commit
0a7a53af6d
|
|
@ -29,10 +29,12 @@ import org.springframework.lang.Nullable;
|
|||
* Extension of {@link LocaleResolver} that adds support for a rich locale context
|
||||
* (potentially including locale and time zone information).
|
||||
*
|
||||
* <p>Also provides pre-implemented versions of {@link #resolveLocale} and {@link #setLocale},
|
||||
* delegating to {@link #resolveLocaleContext} and {@link #setLocaleContext}.
|
||||
* <p>Also provides {@code default} implementations of {@link #resolveLocale} and
|
||||
* {@link #setLocale} which delegate to {@link #resolveLocaleContext} and
|
||||
* {@link #setLocaleContext}, respectively.
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @author Sam Brannen
|
||||
* @since 4.0
|
||||
* @see org.springframework.context.i18n.LocaleContext
|
||||
* @see org.springframework.context.i18n.TimeZoneAwareLocaleContext
|
||||
|
|
@ -77,12 +79,32 @@ public interface LocaleContextResolver extends LocaleResolver {
|
|||
void setLocaleContext(HttpServletRequest request, @Nullable HttpServletResponse response,
|
||||
@Nullable LocaleContext localeContext);
|
||||
|
||||
/**
|
||||
* Default implementation of {@link LocaleResolver#resolveLocale(HttpServletRequest)}
|
||||
* that delegates to {@link #resolveLocaleContext(HttpServletRequest)}, falling
|
||||
* back to {@link HttpServletRequest#getLocale()} if necessary.
|
||||
* @param request the request to resolve the locale for
|
||||
* @return the current locale (never {@code null})
|
||||
* @since 6.0
|
||||
*/
|
||||
@Override
|
||||
default Locale resolveLocale(HttpServletRequest request) {
|
||||
Locale locale = resolveLocaleContext(request).getLocale();
|
||||
return (locale != null ? locale : request.getLocale());
|
||||
}
|
||||
|
||||
/**
|
||||
* Default implementation of {@link LocaleResolver#setLocale(HttpServletRequest,
|
||||
* HttpServletResponse, Locale)} that delegates to
|
||||
* {@link #setLocaleContext(HttpServletRequest, HttpServletResponse, LocaleContext)},
|
||||
* using a {@link SimpleLocaleContext}.
|
||||
* @param request the request to be used for locale modification
|
||||
* @param response the response to be used for locale modification
|
||||
* @param locale the new locale, or {@code null} to clear the locale
|
||||
* @throws UnsupportedOperationException if the LocaleResolver implementation
|
||||
* does not support dynamic changing of the locale
|
||||
* @since 6.0
|
||||
*/
|
||||
@Override
|
||||
default void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {
|
||||
setLocaleContext(request, response, (locale != null ? new SimpleLocaleContext(locale) : null));
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ import org.springframework.web.servlet.LocaleContextResolver;
|
|||
/**
|
||||
* Abstract base class for {@link LocaleContextResolver} implementations.
|
||||
*
|
||||
* <p>Provides support for a {@linkplain #setDefaultLocale(Locale) default locale}
|
||||
* and a {@linkplain #setDefaultTimeZone(TimeZone) default time zone}.
|
||||
* <p>Provides support for a {@linkplain #setDefaultLocale(java.util.Locale) default
|
||||
* locale} and a {@linkplain #setDefaultTimeZone(TimeZone) default time zone}.
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @since 4.0
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ import org.springframework.web.util.WebUtils;
|
|||
* @author Juergen Hoeller
|
||||
* @author Jean-Pierre Pawlak
|
||||
* @author Vedran Pavic
|
||||
* @author Sam Brannen
|
||||
* @since 27.02.2003
|
||||
* @see #setDefaultLocale
|
||||
* @see #setDefaultTimeZone
|
||||
|
|
@ -98,10 +99,7 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||
|
||||
private Function<HttpServletRequest, Locale> defaultLocaleFunction = request -> {
|
||||
Locale defaultLocale = getDefaultLocale();
|
||||
if (defaultLocale == null) {
|
||||
defaultLocale = request.getLocale();
|
||||
}
|
||||
return defaultLocale;
|
||||
return (defaultLocale != null ? defaultLocale : request.getLocale());
|
||||
};
|
||||
|
||||
private Function<HttpServletRequest, TimeZone> defaultTimeZoneFunction = request -> getDefaultTimeZone();
|
||||
|
|
@ -199,9 +197,11 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||
|
||||
/**
|
||||
* Set the function used to determine the default locale for the given request,
|
||||
* called if no {@link Locale} session attribute has been found.
|
||||
* <p>The default implementation returns the specified default locale,
|
||||
* if any, else falls back to the request's accept-header locale.
|
||||
* called if no locale cookie has been found.
|
||||
* <p>The default implementation returns the configured
|
||||
* {@linkplain #setDefaultLocale(Locale) default locale}, if any, and otherwise
|
||||
* falls back to the request's {@code Accept-Language} header locale or the
|
||||
* default locale for the server.
|
||||
* @param defaultLocaleFunction the function used to determine the default locale
|
||||
* @since 6.0
|
||||
* @see #setDefaultLocale
|
||||
|
|
@ -214,8 +214,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||
|
||||
/**
|
||||
* Set the function used to determine the default time zone for the given request,
|
||||
* called if no {@link TimeZone} session attribute has been found.
|
||||
* <p>The default implementation returns the specified default time zone,
|
||||
* called if no locale cookie has been found.
|
||||
* <p>The default implementation returns the configured default time zone,
|
||||
* if any, or {@code null} otherwise.
|
||||
* @param defaultTimeZoneFunction the function used to determine the default time zone
|
||||
* @since 6.0
|
||||
|
|
@ -321,8 +321,8 @@ public class CookieLocaleResolver extends CookieGenerator implements LocaleConte
|
|||
TimeZone timeZone = null;
|
||||
if (localeContext != null) {
|
||||
locale = localeContext.getLocale();
|
||||
if (localeContext instanceof TimeZoneAwareLocaleContext) {
|
||||
timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
|
||||
if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) {
|
||||
timeZone = timeZoneAwareLocaleContext.getTimeZone();
|
||||
}
|
||||
addCookie(response,
|
||||
(locale != null ? toLocaleValue(locale) : "-") + (timeZone != null ? '/' + timeZone.getID() : ""));
|
||||
|
|
|
|||
|
|
@ -90,10 +90,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
|
|||
|
||||
private Function<HttpServletRequest, Locale> defaultLocaleFunction = request -> {
|
||||
Locale defaultLocale = getDefaultLocale();
|
||||
if (defaultLocale == null) {
|
||||
defaultLocale = request.getLocale();
|
||||
}
|
||||
return defaultLocale;
|
||||
return (defaultLocale != null ? defaultLocale : request.getLocale());
|
||||
};
|
||||
|
||||
private Function<HttpServletRequest, TimeZone> defaultTimeZoneFunction = request -> getDefaultTimeZone();
|
||||
|
|
@ -121,8 +118,10 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
|
|||
/**
|
||||
* Set the function used to determine the default locale for the given request,
|
||||
* called if no {@link Locale} session attribute has been found.
|
||||
* <p>The default implementation returns the specified default locale,
|
||||
* if any, else falls back to the request's accept-header locale.
|
||||
* <p>The default implementation returns the configured
|
||||
* {@linkplain #setDefaultLocale(Locale) default locale}, if any, and otherwise
|
||||
* falls back to the request's {@code Accept-Language} header locale or the
|
||||
* default locale for the server.
|
||||
* @param defaultLocaleFunction the function used to determine the default locale
|
||||
* @since 6.0
|
||||
* @see #setDefaultLocale
|
||||
|
|
@ -136,7 +135,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
|
|||
/**
|
||||
* Set the function used to determine the default time zone for the given request,
|
||||
* called if no {@link TimeZone} session attribute has been found.
|
||||
* <p>The default implementation returns the specified default time zone,
|
||||
* <p>The default implementation returns the configured default time zone,
|
||||
* if any, or {@code null} otherwise.
|
||||
* @param defaultTimeZoneFunction the function used to determine the default time zone
|
||||
* @since 6.0
|
||||
|
|
@ -163,7 +162,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
|
|||
public Locale getLocale() {
|
||||
Locale locale = (Locale) WebUtils.getSessionAttribute(request, localeAttributeName);
|
||||
if (locale == null) {
|
||||
locale = SessionLocaleResolver.this.defaultLocaleFunction.apply(request);
|
||||
locale = defaultLocaleFunction.apply(request);
|
||||
}
|
||||
return locale;
|
||||
}
|
||||
|
|
@ -172,7 +171,7 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
|
|||
public TimeZone getTimeZone() {
|
||||
TimeZone timeZone = (TimeZone) WebUtils.getSessionAttribute(request, timeZoneAttributeName);
|
||||
if (timeZone == null) {
|
||||
timeZone = SessionLocaleResolver.this.defaultTimeZoneFunction.apply(request);
|
||||
timeZone = defaultTimeZoneFunction.apply(request);
|
||||
}
|
||||
return timeZone;
|
||||
}
|
||||
|
|
@ -187,8 +186,8 @@ public class SessionLocaleResolver extends AbstractLocaleContextResolver {
|
|||
TimeZone timeZone = null;
|
||||
if (localeContext != null) {
|
||||
locale = localeContext.getLocale();
|
||||
if (localeContext instanceof TimeZoneAwareLocaleContext) {
|
||||
timeZone = ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
|
||||
if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) {
|
||||
timeZone = timeZoneAwareLocaleContext.getTimeZone();
|
||||
}
|
||||
}
|
||||
WebUtils.setSessionAttribute(request, this.localeAttributeName, locale);
|
||||
|
|
|
|||
|
|
@ -171,10 +171,10 @@ public abstract class RequestContextUtils {
|
|||
@Nullable
|
||||
public static TimeZone getTimeZone(HttpServletRequest request) {
|
||||
LocaleResolver localeResolver = getLocaleResolver(request);
|
||||
if (localeResolver instanceof LocaleContextResolver) {
|
||||
LocaleContext localeContext = ((LocaleContextResolver) localeResolver).resolveLocaleContext(request);
|
||||
if (localeContext instanceof TimeZoneAwareLocaleContext) {
|
||||
return ((TimeZoneAwareLocaleContext) localeContext).getTimeZone();
|
||||
if (localeResolver instanceof LocaleContextResolver localeContextResolver) {
|
||||
LocaleContext localeContext = localeContextResolver.resolveLocaleContext(request);
|
||||
if (localeContext instanceof TimeZoneAwareLocaleContext timeZoneAwareLocaleContext) {
|
||||
return timeZoneAwareLocaleContext.getTimeZone();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -412,7 +412,7 @@ class CookieLocaleResolverTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testCustomDefaultLocaleFunction() {
|
||||
void customDefaultLocaleFunction() {
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
resolver.setDefaultLocaleFunction(request -> Locale.GERMAN);
|
||||
|
|
@ -421,7 +421,7 @@ class CookieLocaleResolverTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testCustomDefaultTimeZoneFunction() {
|
||||
void customDefaultTimeZoneFunction() {
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));
|
||||
|
|
|
|||
|
|
@ -98,17 +98,16 @@ class SessionLocaleResolverTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
void testCustomDefaultLocaleFunction() {
|
||||
void customDefaultLocaleFunction() {
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
SessionLocaleResolver resolver = new SessionLocaleResolver();
|
||||
resolver.setDefaultLocaleFunction(request -> Locale.GERMAN);
|
||||
|
||||
assertThat(resolver.resolveLocale(request)).isEqualTo(Locale.GERMAN);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testCustomDefaultTimeZoneFunction() {
|
||||
void customDefaultTimeZoneFunction() {
|
||||
request.addPreferredLocale(Locale.TAIWAN);
|
||||
|
||||
resolver.setDefaultTimeZoneFunction(request -> TimeZone.getTimeZone("GMT+1"));
|
||||
|
|
|
|||
Loading…
Reference in New Issue