在Spring Boot實現國際化的案例
將 I18N 新增到我們的 API 非常簡單。因此,如果您正在考慮建立供全球使用的 API(並且如果您還沒有這樣做),那麼將其新增到您的其他良好實踐(乾淨的程式碼、文件、測試……)中並不是一個壞主意。
I18N國際化是設計軟體應用程式的過程,以便它可以適應各種語言和地區,而無需進行工程更改。
整體流程
該過程包括四個步驟:
- 建立我們的訊息服務
- 為我們想要支援的所有語言新增資源包
- 將變數新增到應用程式屬性
- 開始使用我們的訊息服務
1. 建立服務
讓我們首先建立一個將用作訊息服務的類。
@Service public class MessageService { @Autowired private ResourceBundleMessageSource messageSource; @Value("${custom.app.locale}") private String systemLanguage; private Locale locale; @PostConstruct private void init() { locale = new Locale(systemLanguage); LocaleContextHolder.setDefaultLocale(locale); } public String getMessage(String prefix, String key){ return getMessage(prefix, key, ""); } public String getMessage(String prefix, String key, String value){ List<String> listOfValues = Collections.singletonList(value); return getMessage(prefix, key, listOfValues); } public String getMessage(String prefix, String key, List<String> args){ return messageSource.getMessage(concatPrefixAndKey(prefix, key), args.toArray(), locale); } public String getMessage(String prefix, String key, List<String> args, Locale requestedLocale){ if (requestedLocale == null){ return getMessage(prefix, key, args); } else { return messageSource.getMessage(concatPrefixAndKey(prefix, key), args.toArray(), requestedLocale); } } public String getRequestLocalizedMessage(String prefix, String key){ return getRequestLocalizedMessage(prefix, key, new ArrayList<>()); } public String getRequestLocalizedMessage(String prefix, String key, List<String> args){ return getMessage(prefix, key, args, LocaleContextHolder.getLocale()); } private String concatPrefixAndKey(String prefix, String key){ return prefix.concat(".").concat(key); } } |
2.新增訊息
現在,我們將在資原始檔夾中建立一個資源包,併為我們想要支援的每種語言新增一個屬性檔案。
messages.properties
## GENERIC MESSAGES generic.message.i18n=Hey, this is a message in english. |
messages_en.properties
## GENERIC MESSAGES generic.message.i18n=Hey, this is a message in english. |
messages_es.properties
## GENERIC MESSAGES generic.message.i18n=Hey, este es un mensaje en español. |
messages_fr.properties
## GENERIC MESSAGES generic.message.i18n=Salut, c'est un message en français. |
3.更新application.properties
在這裡,我們將新增兩個變數,一個用於預設語言,一個用於應用程式編碼。
# The default locale for our API custom.app.locale=fr # This sets the Spring boot encoding used for the API responses spring.messages.encoding=ISO-8859-1 |
4.使用服務
最後一步,我們需要連線我們的訊息服務並使用它。為此,我建立了一個呼叫getRequestLocalizedMessage方法的簡單控制器。該方法使用LocalContextHolder來檢測Accept-Language標頭。如果標頭存在,它將以請求的語言返回響應。如果不是,它會以預設語言返回訊息。
@RestController @RequestMapping("/test") public class TestController { @Autowired private MessageService messageService; private final String prefixKey = "generic.message"; @GetMapping(produces = {MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity<String> getTest(){ return ResponseEntity.status(HttpStatus.OK).body(messageService.getRequestLocalizedMessage(prefixKey, "i18n")); } } |
您可以使用 MessageService 中的其他方法來實現相同的目標。
// You can pass the Locale as an argument to the getMessage function to get the message in a specific language Locale requestedLocale = new Locale("es"); messageService.getMessage(prefixKey, "i18n", new ArrayList<>(), requestedLocale); // OR // You can use the getMessage without a specific locale to get the message in the default language messageService.getMessage(prefixKey, "i18n"); |
相關文章
- Spring-boot國際化Springboot
- Spring Boot應用的國際化與本地化支援Spring Boot
- 使用Spring Boot實現模組化Spring Boot
- 使用Spring Boot實現資料庫整合配置案例Spring Boot資料庫
- 在Spring Boot中實現WebSocket實時通訊Spring BootWeb
- Spring Boot實現DDD的貨運Cargo微服務案例原始碼Spring BootCargo微服務原始碼
- 使用Docker實現Spring Boot Restful Web服務案例原始碼DockerSpring BootRESTWeb原始碼
- 在Spring Boot中實現OAuth2.0認證Spring BootOAuth
- 在國外是如何用Spring Boot、Spring Cloud、Docker實現微服務系統架構Spring BootCloudDocker微服務架構
- Spring Webflux國際化SpringWebUX
- Java模組化的國際化實現- GunnarJava
- 使用Spring Boot實現的GraphQL示例Spring Boot
- 如何實現自己的Spring Boot StarterSpring Boot
- Spring Boot實現Web SocketSpring BootWeb
- Spring Boot實際專案用簡單的AOPSpring Boot
- 在Spring Boot中實現API閘道器與路由Spring BootAPI路由
- 小程式國際化實現方式
- 使用Spring Boot RowMapper結合JDK14的Java記錄實現案例 - zetcodeSpring BootAPPJDKJava
- Spring Boot 3中實現多種身份驗證方法開源案例Spring Boot
- 【spring 國際化】springMVC、springboot國際化處理詳解SpringMVCSpring Boot
- EVCache快取在 Spring Boot中的實戰快取Spring Boot
- Spring boot webflux 中實現 RequestContextHolderSpring BootWebUXContext
- Spring Boot中實現Thymeleaf通知Spring Boot
- 從原始碼MessageSource的三個實現出發實戰spring·i18n國際化原始碼Spring
- Spring Boot + MongoDB 應用的 Docker 化實踐Spring BootMongoDBDocker
- Spring Boot 整合 Spring Security 入門案例教程Spring Boot
- Spring Boot 外部化配置實戰解析Spring Boot
- # Spring Boot 外部化配置實戰解析Spring Boot
- Spring Boot外部化配置實戰解析Spring Boot
- 在微服務領域Spring Boot自動伸縮如何實現微服務Spring Boot
- 在Kubernetes上使用Spring Boot實現Hazelcast分散式快取 – PiotrSpring BootAST分散式快取
- 在spring boot中訊息推送系統設計與實現Spring Boot
- Spring Boot + GraphQL建立API的開源案例Spring BootAPI
- 利用Spring Boot實現微服務的配置中心Spring Boot微服務
- Spring Boot和EventStoreDB事件溯源案例Spring Boot事件
- Spring Boot整合MyBatis實現通用MapperSpring BootMyBatisAPP
- Spring Boot 實現非同步事件EventSpring Boot非同步事件
- 使用Spring Boot實現事務管理Spring Boot