- The
LanguageConfigclass defines a list of supported locales, in this case "en" and "vi".
@Configuration
public class LanguageConfig {
public static final List<Locale> LOCALES = Arrays.asList(
new Locale("en"),
new Locale("vi")
);
}- The
MyLocaleResolverclass implements theLocaleResolverinterface, which is used to determine the current locale for a request. TheresolveLocalemethod checks the "Accept-Language" header of the request, and if it is present, it attempts to match it to one of the supported locales defined in theLanguageConfigclass. If a match is found, the corresponding locale is returned. If the header is not present or doesn't match any of the supported locales, the default locale "vi" is returned.
@Component
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
String language = request.getHeader("Accept-Language");
if (language == null || language.isEmpty()) {
return Locale.forLanguageTag("vi");
}
Locale locale = Locale.forLanguageTag(language);
if (LanguageConfig.LOCALES.contains(locale))
return locale;
}
// return vi if not found
return Locale.forLanguageTag("vi");
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
throw new UnsupportedOperationException("Cannot change locale - use a different locale resolution strategy");
}
}- The
MessageConfigurationclass defines a bean for aResourceBundleMessageSourcewhich is used to load message properties files. The files are expected to be named "messages_[locale].properties" and are stored in the classpath.
@Configuration
public class MessageConfiguration {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}- The
TestServiceclass is an example of a service that uses theMyLocaleResolverandMessageSourcebeans to return localized messages. Themessagemethod retrieves the current locale for the request and uses themessageSource.getMessagemethod to get the localized message for the key "greeting".
@GetMapping("/message")
public String message(HttpServletRequest request) {
return testService.message(request);
}
@Service
public class TestService {
@Autowired
private MessageSource messageSource;
@Autowired
private MyLocaleResolver myLocaleResolver;
public String message(HttpServletRequest request) {
throw new ApiError(400, messageSource.getMessage("greeting", null, myLocaleResolver.resolveLocale(request)));
}
}// messages_en.properties
greeting=hello
// messages_fr.properties
greeting=bonjour
// messages_vi.properties
greeting=xin chào