Spring 如果语言环境无效,mvc 从请求中获取默认语言环境
Spring mvc get default locale from request if locale is invalid
我已经在我的 Spring MVC 应用程序(localeInterceptor 等)中配置了 i18n。
支持两种语言(英语和波兰语)。 PL 是默认的。 I18n 当然有效。
我的情况是获取当前语言环境并将其传递给模型。这很简单,但是当我传递无效的语言环境参数时(比如 localhost:8080/?language=asd),我得到 "asd" 而不是默认的 "pl"。
值得一提的是整个 i18n 工作完美,我的意思是在这种情况下使用 messages_pl.properties。
我尝试了以下方法但没有成功:
@RequestMapping(...)
public String home(Locale locale,..)
localeResolver.resolveLocale(request);
RequestContextUtils.getLocale(request);
LocaleContextHolder.getLocale();
每一个都给我 "asd" 而不是 "pl"。
Atm 我有一个有点混乱的解决方法:
if (!supportedLocaleService.isLocaleSupported(locale)) {//myservice
locale = new Locale("pl");
}
您可以覆盖 LocaleChangeInterceptor
public class SupportedLocaleAwareLocaleChangeInterceptor extends LocaleChangeInterceptor {
private List<String>supportedLocales = Arrays.asList("pl",....);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newLocale = request.getParameter(this.paramName);
//if (newLocale != null) {
if (newLocale != null && supportedLocales.contains(newLocale )) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
}
localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
}
// Proceed in any case.
return true;
}
}
还有一种方法。
public class CustomCookieLocaleResolver extends CookieLocaleResolver {
private final List<String> permittedLanguages = Arrays.asList("sk", "en");
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = (Locale) request.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME);
if (locale != null && !permittedLanguages.contains(locale.getLanguage())) {
locale = determineDefaultLocale(request);
}
return locale;
}
@Override
public LocaleContext resolveLocaleContext(HttpServletRequest request) {
try {
LocaleContext context = super.resolveLocaleContext(request);
return context;
} catch (Exception e) {
}
final Locale defaultLocale = determineDefaultLocale(request);
TimeZone defaultTimeZone2 = determineDefaultTimeZone(request);
return new TimeZoneAwareLocaleContext() {
@Override
@Nullable
public Locale getLocale() {
return defaultLocale;
}
@Override
@Nullable
public TimeZone getTimeZone() {
return defaultTimeZone2;
}
};
}
@Override
public void addCookie(HttpServletResponse response, String cookieValue) {
if (permittedLanguages.contains(cookieValue)) {
super.addCookie(response, cookieValue);
}
}
}
我已经在我的 Spring MVC 应用程序(localeInterceptor 等)中配置了 i18n。
支持两种语言(英语和波兰语)。 PL 是默认的。 I18n 当然有效。
我的情况是获取当前语言环境并将其传递给模型。这很简单,但是当我传递无效的语言环境参数时(比如 localhost:8080/?language=asd),我得到 "asd" 而不是默认的 "pl"。
值得一提的是整个 i18n 工作完美,我的意思是在这种情况下使用 messages_pl.properties。 我尝试了以下方法但没有成功:
@RequestMapping(...)
public String home(Locale locale,..)
localeResolver.resolveLocale(request);
RequestContextUtils.getLocale(request);
LocaleContextHolder.getLocale();
每一个都给我 "asd" 而不是 "pl"。
Atm 我有一个有点混乱的解决方法:
if (!supportedLocaleService.isLocaleSupported(locale)) {//myservice
locale = new Locale("pl");
}
您可以覆盖 LocaleChangeInterceptor
public class SupportedLocaleAwareLocaleChangeInterceptor extends LocaleChangeInterceptor {
private List<String>supportedLocales = Arrays.asList("pl",....);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newLocale = request.getParameter(this.paramName);
//if (newLocale != null) {
if (newLocale != null && supportedLocales.contains(newLocale )) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException("No LocaleResolver found: not in a DispatcherServlet request?");
}
localeResolver.setLocale(request, response, StringUtils.parseLocaleString(newLocale));
}
// Proceed in any case.
return true;
}
}
还有一种方法。
public class CustomCookieLocaleResolver extends CookieLocaleResolver {
private final List<String> permittedLanguages = Arrays.asList("sk", "en");
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = (Locale) request.getAttribute(LOCALE_REQUEST_ATTRIBUTE_NAME);
if (locale != null && !permittedLanguages.contains(locale.getLanguage())) {
locale = determineDefaultLocale(request);
}
return locale;
}
@Override
public LocaleContext resolveLocaleContext(HttpServletRequest request) {
try {
LocaleContext context = super.resolveLocaleContext(request);
return context;
} catch (Exception e) {
}
final Locale defaultLocale = determineDefaultLocale(request);
TimeZone defaultTimeZone2 = determineDefaultTimeZone(request);
return new TimeZoneAwareLocaleContext() {
@Override
@Nullable
public Locale getLocale() {
return defaultLocale;
}
@Override
@Nullable
public TimeZone getTimeZone() {
return defaultTimeZone2;
}
};
}
@Override
public void addCookie(HttpServletResponse response, String cookieValue) {
if (permittedLanguages.contains(cookieValue)) {
super.addCookie(response, cookieValue);
}
}
}