是否应该让 someRestController 与 LocaleResolver 一起接收 i18n 的 lang 参数?
Should someRestController be made for receiving lang parameter for i18n along with LocaleResolver?
我正在开发 Spring 引导应用程序,我需要使用 i18n。我看了很多教程,我实现了新的 class LocaleConfiguration
@Configuration
public class LocaleConfiguration implements WebMvcConfigurer {
/**
* * @return default Locale set by the user
*/
@Bean(name = "localeResolver")
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
/**
* an interceptor bean that will switch to a new locale based on the value of the language parameter appended to a request:
*
* @param registry
* @language should be the name of the request param i.e localhost:8010/api/get-greeting?language=fr
* <p>
* Note: All requests to the backend needing Internationalization should have the "language" request param
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
registry.addInterceptor(localeChangeInterceptor);
}
}
而且,我用适当的语言制作了几个 messages_code.propertie 文件。我设置 thymeleaf 模板只是为了查看是否一切正常并且没问题。前端开发人员只需要向我发送 lang 参数即可。但我的问题是,我应该制作一个新控制器来处理带有 lang 参数的调用,还是通过此 LocaleConfiguration class 以某种方式自动完成的所有操作?
因为我在 Postman/Browser:
中进行此调用时得到了正确的翻译
http://localhost:8080/?lang=fra
所以我的问题是,我需要制作新的控制器来处理它还是由 LocaleResolver 自动完成 class?
我先回答你的问题答案是LocaleResolver!
因为你有 LocaleResolver Bean,并且添加了 localeChangeInterceptor,而它的 class 层级是
LocaleChangeInterceptor 是一个拦截器。从源码得知,它是在请求到达RequestMapping之前执行的。它的作用很简单,就是从请求中获取请求参数(默认是locale),然后在LocaleResolver中设置当前的locale。
源代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
//Note here
**String newLocale = request.getParameter(getParamName());**
if (newLocale != null) {
if (checkHttpMethod(request.getMethod())) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException(
"No LocaleResolver found: not in a DispatcherServlet request?");
}
try {
localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
}
catch (IllegalArgumentException ex) {
if (isIgnoreInvalidLocale()) {
logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
}
else {
throw ex;
}
}
}
}
// Proceed in any case.
return true;
}
看到我必须发表评论。
String newLocale = request.getParameter(getParamName());
转会
/**
* Return the name of the parameter that contains a locale specification
* in a locale change request.
*/
public String getParamName() {
return this.paramName;
}
其中this.paramName是
/**
* Default name of the locale specification parameter: "locale".
*/
public static final String DEFAULT_PARAM_NAME = "locale";
那么你明白了吗
我正在开发 Spring 引导应用程序,我需要使用 i18n。我看了很多教程,我实现了新的 class LocaleConfiguration
@Configuration
public class LocaleConfiguration implements WebMvcConfigurer {
/**
* * @return default Locale set by the user
*/
@Bean(name = "localeResolver")
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
/**
* an interceptor bean that will switch to a new locale based on the value of the language parameter appended to a request:
*
* @param registry
* @language should be the name of the request param i.e localhost:8010/api/get-greeting?language=fr
* <p>
* Note: All requests to the backend needing Internationalization should have the "language" request param
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
registry.addInterceptor(localeChangeInterceptor);
}
}
而且,我用适当的语言制作了几个 messages_code.propertie 文件。我设置 thymeleaf 模板只是为了查看是否一切正常并且没问题。前端开发人员只需要向我发送 lang 参数即可。但我的问题是,我应该制作一个新控制器来处理带有 lang 参数的调用,还是通过此 LocaleConfiguration class 以某种方式自动完成的所有操作? 因为我在 Postman/Browser:
中进行此调用时得到了正确的翻译http://localhost:8080/?lang=fra
所以我的问题是,我需要制作新的控制器来处理它还是由 LocaleResolver 自动完成 class?
我先回答你的问题答案是LocaleResolver!
因为你有 LocaleResolver Bean,并且添加了 localeChangeInterceptor,而它的 class 层级是
LocaleChangeInterceptor 是一个拦截器。从源码得知,它是在请求到达RequestMapping之前执行的。它的作用很简单,就是从请求中获取请求参数(默认是locale),然后在LocaleResolver中设置当前的locale。
源代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
//Note here
**String newLocale = request.getParameter(getParamName());**
if (newLocale != null) {
if (checkHttpMethod(request.getMethod())) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException(
"No LocaleResolver found: not in a DispatcherServlet request?");
}
try {
localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
}
catch (IllegalArgumentException ex) {
if (isIgnoreInvalidLocale()) {
logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
}
else {
throw ex;
}
}
}
}
// Proceed in any case.
return true;
}
看到我必须发表评论。
String newLocale = request.getParameter(getParamName());
转会
/**
* Return the name of the parameter that contains a locale specification
* in a locale change request.
*/
public String getParamName() {
return this.paramName;
}
其中this.paramName是
/**
* Default name of the locale specification parameter: "locale".
*/
public static final String DEFAULT_PARAM_NAME = "locale";
那么你明白了吗