4

状況: ユーザーがログイン時に言語を変更できるようにする必要がある vaadin-spring アプリケーションがあります。ログイン ページでコンボ ボックスを使用して、ロケールを切り替えます。春のロケールリゾルバーの実装は CookieLocaleResolver です。これは、次回の訪問のために選択したオプションを Cookie に保存したいためです。

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(new Locale("de", "DE"));
    localeResolver.setCookieName("locale");
    localeResolver.setCookieMaxAge( 60 * 60 * 24 * 31);
    return localeResolver;
}

意見:

@SpringView(name = "login")
public class LoginView implements View {
    @Autowired
    private HttpServletRequest request;

    @Autowired
    private HttpServletResponse response;

    @Autowired
    private LocaleResolver localeResolver;

    ComboBox<LanguageOption> languageField;
    // ...
    languageField.addValueChangeListener(option -> {
        localeResolver.setLocale(request, response, option.getValue().getLocale());
    });
    // ...
}

コンボボックスを変更すると、locale と呼ばれる Cookie が目的の言語ロケール (de_DE など) に設定されます。ロケール リゾルバのデフォルト言語は de_DE です。ログイン時に、de_DE と en_US の 2 つのオプションを切り替えることができます。

vaadin ビューのキャプションとテキストの翻訳は、Spring MessageSource によって行われます。

someCompoenent.setCaption(messageSource.getMessage("someComponent.caption", args, LocaleContextHolder.getLocale()));

Vaadin UI では、以下を呼び出して、セッションと UI でロケールを設定します。

public class MyUI extends UI implements ViewDisplay, ViewAccessControl {
    @Autowired
    private HttpServletRequest httpServletRequest;

    // ...
    @Override
    protected void init(VaadinRequest request) {
        // ...
        Locale currentLocale = localeResolver.resolveLocale(httpServletRequest);
        LocaleContextHolder.setLocale(currentLocale);

        setLocale(currentLocale);
        VaadinSession.getCurrent().setLocale(currentLocale);

        // ...
    }

}

私の問題は次のとおりです。ログイン ページの言語コンボボックスで de_DE ロケールを選択してログインすると、LocaleContextHolder.getLocale() は en_US を返し、UI は英語になります。しかし、ブラウザで F5 キーを押してページを更新すると、UI が de_DE になります。

なんで?

注: ログイン前とログイン後に、JSESSONID Cookie が変更されることに気付きました。ロケール Cookie が存在し、ログインの前後で同じである場合に、ロケールの解決に問題があるかどうかはわかりません。

4

2 に答える 2