是否应该让 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";

那么你明白了吗