SpringBoot如何集成i18n(多语言)
作者:@幻影忍者
这篇文章主要介绍了SpringBoot如何集成i18n(多语言)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
SpringBoot集成i18n(多语言)
配置文件
spring: messages: basename: il8n/messages # 配置国际化资源文件路径 fallback-to-system-locale: true # 是否使用系统默认的语言环境作为备选项
国际化配置
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; /** * 国际化配置 */ @Configuration public class I18nlocaleConfig implements WebMvcConfigurer{ /** * 默认解析器 其中locale表示默认语言 */ @Bean public LocaleResolver localeResolver() { return new MyLocaleResolver(); } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("Accept-Language"); return localeChangeInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); } }
参数解析
import org.apache.commons.lang3.StringUtils; import org.springframework.web.servlet.LocaleResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; /** * 参数解析 */ public class MyLocaleResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { // 从 request 域中读取传过来的参数 String l = request.getHeader("Accept-Language"); // 声明 Locale 为默认语言显示 Locale locale = Locale.getDefault(); // 判断传入参数是否为空 if (!StringUtils.isEmpty(language) && StringUtils.contains(language,"_")){ // 将传过来的参数,通过下划线分割,获取到地区(zh)即代码(CN) String[] split = l.split("_"); // 进行赋值 locale = new Locale(split[0],split[1]); } // 返回 return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { } }
ApplicationEvent
import com.zzdy.recharge.il8n.utils.MessageUtils; import org.springframework.context.ApplicationListener; import org.springframework.context.MessageSource; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component public class ApplicationEvent implements ApplicationListener<ContextRefreshedEvent> { @Resource protected MessageSource messageSource; @Override public void onApplicationEvent(ContextRefreshedEvent event) { MessageUtils.setMessageSource(messageSource); } }
MessageUtils
import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.support.ResourceBundleMessageSource; public class MessageUtils extends ResourceBundleMessageSource { private static MessageSource messageSource; public static void setMessageSource(MessageSource source){ messageSource=source; } public MessageUtils() { super(); } /** * 获取单个国际化翻译值 */ public static String get(String pvsKey) { try { return messageSource.getMessage(pvsKey, null, LocaleContextHolder.getLocale()); } catch (Exception e) { return pvsKey; } } /** * 获取单个国际化翻译值 */ public static String get(String pvsKey,Object ... pvParams) { try { return messageSource.getMessage(pvsKey, pvParams, LocaleContextHolder.getLocale()); } catch (Exception e) { return pvsKey; } } }
运行
import com.zzdy.recharge.il8n.utils.MessageUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("recharge/i18n") public class GreetingController { @GetMapping("/greeting") public String greeting() { return MessageUtils.get("not.null"); } }
运行截图
- 中文
- 英文
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。