Spring实现国际化与本地化的详细步骤
目录
- 一、核心概念:国际化(i18n)与本地化(l10n)
- 二、Spring 国际化实现步骤
- 1. 创建资源文件
- 2. 配置 MessageSource
- 3. 在代码中使用 MessageSource
- 三、本地化实现:处理日期、数字和货币
- 1. 配置日期格式化
- 2. 货币格式化
- 四、在 Web 应用中实现语言切换
- 1. 通过请求参数切换语言
- 2. 通过 Cookie 或 Session 切换语言
- 五、总结
一、核心概念:国际化(i18n)与本地化(l10n)
- 国际化(Internationalization):简称 i18n,指设计应用时使其能够适应不同语言和区域的过程。开发者需将应用中的固定文本(如提示信息、按钮标签)提取为可替换的资源,避免硬编码。
- 本地化(Localization):简称 l10n,是根据用户的语言、地区等偏好,将国际化后的应用内容显示为对应语言和格式(如日期、货币)的过程。例如,将英文界面切换为中文,或者根据地区显示不同格式的日期(美式 “MM/dd/yyyy” vs 中式 “yyyy-MM-dd”)。
二、Spring 国际化实现步骤
1. 创建资源文件
在src/main/resources
目录下创建以messages
为基础名,后跟语言代码和区域代码的属性文件。常见的语言代码如zh
(中文)、en
(英文),区域代码如CN
(中国)、US
(美国)。
messages.properties
:默认资源文件,用于未匹配到特定语言时的兜底显示。messages_zh_CN.properties
:简体中文资源文件。messages_en_US.properties
:美式英语资源文件。
示例内容:
messages.propertieshttp://www.devze.com
greeting=Hello!
messages_zh_CN.properties
greeting=你好!
messages_en_US.properties
greeting=Hello!
2. 配置 MessageSource
在 Spring 配置类(如@Configuration
类)或application.properties
中配置MessageSource
,用于加载和管理资源文件。
Java 配置方式
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; @Configuration public class AppConfig { @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("messages"); // 指定资源文件基础名 messageSource.setDefaultEncoding("UTF-8"); // 设置编码 return messageSource; } }
application.properties 配置方式
spring.messages.basename=messages spring.messages.encoding=UTF-8
3. 在代码中使用 MessageSource
通过注入MessageSource
,调用getMessage
方法获取对应语言的文本。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; @Component public class MessageService { private final MessageSource messageSource; @Autojswired public MessageService(MessageSource messageSource) { this.messageSource = messageSource; } public String getGreeting() { return messageSource.getMessage("greeting", null, LocaleContextHolder.getLocale()); } }
上述代码中,LocaleContextHolder.getLocale()
获取当前用户的区域设置,messageSource.getMessage
根据区域javascript设置查找对应的资源文件,返回相应的文本。
三、本地化实现:处理日期、数字和货币
Spring 通过DateFormat
、NumberFormat
等类实现不同区域的格式转换,结合@Bean
配置和@Autowired
注入使用。
1. 配置日期格式化
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframewopythonrk.web.servlet.config.annotation.WebMvcConfigurer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addFormatterForFieldType(Date.class, new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())); } }
上述配置将Date
类型数据格式化为 “yyyy-MM-dd”,并根据用户的区域设置动态调整。
2. 货币格式化
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.text.NumberFormat; import java.util.Currency; import java.util.Locale; @Configuration public class AppConfig { @Bean public NumberFormat currencyFormat() { Locale locale = Locale.getDefault(); Currency currency = Currency.getInstance(locale); return NumberFormat.getCurrencyInstance(locale).setCurrency(currency); } }
通过上述配置,在显示货币金额时,会根据用户区域自动使用对应货币符号和格式(如¥、$)。
四、在 Web 应用中实现语言切换
1. 通过请求参数切换语言
在 Controller 中接收lang
参数,设置Locale
。
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.support.RequestContextUtils; import javax.servlet.http.HttpServletRequest; import java.util.Locale; @RestController public class LanguageController { @GetMapping("/setLang") public String setLanguage(@RequestParam String lang, HttpServletRequest request) { LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request); if (localeResolver != null) { localeResolver.setLocale(request, new Locale(lang)); } return "Language set to: " + lang; } }
用户访问/setLang?lang=zh即可将语言切换为中文,访问/setLang?lang=en切换为英文。
2. 通过 Cookie 或 Session 切换语言
实现自定义的LocaleResolver,将用户选择的语言存储在 Cookie 或 Session 中,下次访问时自动应用。
import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.i18n.CookieLocaleResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Locale; public class CustomLocaleResolver extends CookieLocaleResolver { private static final String LANG_COOKIE_NAME = "myapp_lang"; @Override public Locale resolveLocale(HttpServletRequest request) { Locale locale = super.resolveLocale(request); if (locale == null) { // 从Cookie获取语言,若不存在则使用默认语言 String lang = request.getCookies() != null ? findCookieValue(request.getCookies(), LANG_COOKIE_NAME) : null; if (lang != null) { locale = new Locale(lang); } } return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { // 将语言存储到Cookie super.setLocale(request, response, locale); setCookie(response, LANG_COOKIE_NAME, locale.getLanguage()); } private String findCookieValue(javax.servlet.http.Cookie[] cookies, String cookieName) { for (javax.servlet.http.Cookie cookie : cookies) { if (cookie.getName().equals(cookieName)) { return cookie.getValue(); } } return null; } }
在 Spring 配置类中注册自定义LocaleResolver
:
import org.springfjavascriptramework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; @Configuration public class AppConfig { @Bean public LocaleResolver localeResolver() { return new CustomLocaleResolver(); } }
五、总结
Spring 的国际化与本地化功能通过资源文件管理、MessageSource配置和Locale设置,为开发者提供了一套完整的解决方案。通过合理配置和代码实现,能够轻松满足不同地区用户的语言和格式需求,提升应用的用户体验和全球化竞争力。在实际开发中,可根据项目需求灵活选择语言切换方式,并结合前端技术(如 vue、React)实现更流畅的多语言交互效果。
以上就是Spring实现国际化与本地化的详细步骤的详细内容,更多关于Spring国际化与本地化的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论