SpringBoot實(shí)現(xiàn)國際化的操作步驟
什么是國際化
國際化(Internationalization) 是指為了適應(yīng)不同語言、文化和地區(qū)的用戶,使軟件能夠方便地進(jìn)行本地化修改的過程。 國際化(Internationalization) 簡稱i18n,其中 “i” 是Internationalization的首字母 ,“n” 是最后一個(gè)字母 , “18” 代表了中間省略的18個(gè)字母。
SpringBoot 國際化
SpringBoot也提供了國際化的功能,在Spring Boot中,國際化通常涉及以下幾個(gè)關(guān)鍵組件:
資源文件(Properties文件):這些文件包含了不同語言的文本消息,每個(gè)語言對(duì)應(yīng)一個(gè)資源文件。通常,資源文件的命名采用
messages_語言代碼.properties
的格式,例如messages_en.properties
(英語)、messages_zh_CN.properties
(簡體中文)等。MessageSource接口:這是Spring框架提供的一個(gè)核心接口,定義了獲取文本消息的方法。它的實(shí)現(xiàn)類負(fù)責(zé)加載并解析資源文件,并根據(jù)語言和代碼來返回相應(yīng)的消息。
LocaleResolver接口:這是Spring框架提供的另一個(gè)接口,用于解析用戶的語言偏好。根據(jù)用戶的設(shè)置,LocaleResolver可以確定要使用哪個(gè)語言。
組件中使用的文本消息:在應(yīng)用程序的界面和代碼中,您可以使用特定的消息代碼來引用資源文件中的文本消息。Spring Boot會(huì)根據(jù)用戶的語言偏好選擇合適的消息進(jìn)行顯示。
通過配置MessageSource和LocaleResolver,以及在應(yīng)用程序中使用相應(yīng)的消息代碼,就可以實(shí)現(xiàn)Spring Boot的國際化功能。
實(shí)踐出真知
話不多說,上代碼。
新建Properties文件
先Resource目錄下新建Properties文件
- 中文properties文件 messages_zh_CN.properties :
hello=你好 welcome=歡迎關(guān)注公眾號(hào), {0}!
- 英文properties文件 messages_en.properties:
hello=hi welcome=Welcome to follow WeChat Public Number, {0}!
創(chuàng)建完文件idea會(huì)自動(dòng)將國際化文件歸類到Resource Bundle中
修改配置文件
application.properties:
測試
@Resource private MessageSource messageSource; @Test void testMessageSource() { Locale china = Locale.CHINA; System.out.println("\n中文環(huán)境"); //中文語言 String hello_zh = messageSource.getMessage("hello", null, china); System.out.println(hello_zh); // 占位符替換 String welcome_zh = messageSource.getMessage("welcome", new String[]{"索碼理"}, china); System.out.println(welcome_zh); //英文語言 Locale english = Locale.ENGLISH; System.out.println("\n英文環(huán)境"); String hello_en = messageSource.getMessage("hello", null, english); System.out.println(hello_en); String welcome_en = messageSource.getMessage("welcome", new String[]{"suncodernote"}, english); System.out.println(welcome_en); System.out.println("\n沒有對(duì)應(yīng)語言的國際化屬性,返回code"); //沒有對(duì)應(yīng)語言的國際化屬性,返回code String hello_test = messageSource.getMessage("hello-test", null, china); System.out.println(hello_test); System.out.println("\n沒有對(duì)應(yīng)語言的國際化區(qū)域時(shí),返回默認(rèn)語言"); //沒有對(duì)應(yīng)語言的國際化區(qū)域時(shí),返回默認(rèn) String hello_fr = messageSource.getMessage("hello", null, Locale.FRANCE); System.out.println(hello_fr); }
測試結(jié)果:
中文環(huán)境
你好
歡迎關(guān)注公眾號(hào), 索碼理!英文環(huán)境
你好
歡迎關(guān)注公眾號(hào), suncodernote!沒有對(duì)應(yīng)語言的國際化屬性,返回code
hello-test沒有對(duì)應(yīng)語言的國際化區(qū)域時(shí),返回默認(rèn)語言
你好
獲取所有國際化資源
上面的測試我們都是只能根據(jù)一個(gè)code獲取一個(gè)國際化信息,我們在切換語言使用國際化時(shí),總不能每次進(jìn)行國際化的時(shí)候都調(diào)用一次接口吧,這肯定是不行的。 下面是獲取指定語言的所有的國際化信息的代碼示例。
定義一個(gè)I18nService 接口:
public interface I18nService { /** * 獲取指定語言所有國際化信息 * @param locale * @return */ Map<String, String> getAllMessages(Locale locale); }
I18nService 接口實(shí)現(xiàn)類
@Service public class I18nServiceImpl implements I18nService{ @Autowired private MessageSource messageSource; @Override public Map<String, String> getAllMessages(Locale locale) { if (locale == null) { locale = Locale.getDefault(); } //存放所有message Map<String, String> messages = new HashMap<>(); ResourceBundleMessageSource bundleMessageSource = (ResourceBundleMessageSource) messageSource; String[] basenames = bundleMessageSource.getBasenameSet().toArray(new String[0]); for (String basename : basenames) { //從緩存中獲取資源文件 ResourceBundle resourceBundle = ResourceBundle.getBundle(basename, locale); //獲取資源文件的所有code Set<String> keys = resourceBundle.keySet(); for (String key : keys) { //根據(jù)code獲取對(duì)應(yīng)的message String message = messageSource.getMessage(key, null, locale); messages.put(key, message); } } return messages; } }
在getAllMessages
方法中,拿到了指定資源文件的所有code,有了code再做一些操作就很方便了。比如獲取以xxx開頭的code。
I18nController:
@RequestMapping("/i18n") @RestController public class I18nController { @Resource private I18nService i18nService; @RequestMapping("/messages") public Map<String, String> getAllMessages(@RequestHeader(name = "Accept-Language" , required = false) Locale locale) { return i18nService.getAllMessages(locale); } }
通過postman調(diào)用接口,將請求頭 Accept-Language 設(shè)置為 zh 獲取中文國際化環(huán)境,測試結(jié)果如下圖所示:
以上就是SpringBoot 國際化一個(gè)簡單的實(shí)現(xiàn)的操作步驟,感興趣的可以動(dòng)手試試。
總結(jié)
本文介紹了SpringBoot 國際化功能的簡單使用,通過在資源文件中配置國際化字段,然后獲取對(duì)應(yīng)區(qū)域的國際化信息。這些操作都是靜態(tài)的,要預(yù)先配置好國際化信息才能進(jìn)行一系列的操作,不夠靈活。
以上就是SpringBoot實(shí)現(xiàn)國際化的操作步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot國際化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java使用Flyway實(shí)現(xiàn)數(shù)據(jù)庫版本控制的技術(shù)指南
在現(xiàn)代應(yīng)用開發(fā)中,數(shù)據(jù)庫結(jié)構(gòu)經(jīng)常隨著業(yè)務(wù)需求不斷演變,使用手動(dòng)SQL腳本管理數(shù)據(jù)庫版本,不僅容易出現(xiàn)錯(cuò)誤,還難以跟蹤和回滾,Flyway是一個(gè)強(qiáng)大的數(shù)據(jù)庫遷移工具,能夠幫助開發(fā)者高效管理和自動(dòng)化數(shù)據(jù)庫的版本控制,本文將介紹Flyway的基本功能及其在SpringBoot項(xiàng)目中的實(shí)踐2025-02-02Java數(shù)據(jù)庫存儲(chǔ)數(shù)組的方法小結(jié)
在現(xiàn)代軟件開發(fā)中,數(shù)組是常用的數(shù)據(jù)結(jié)構(gòu)之一,然而,在關(guān)系數(shù)據(jù)庫中直接存儲(chǔ)數(shù)組并不是一個(gè)簡單的任務(wù),本文將詳細(xì)介紹幾種在Java中將數(shù)組存儲(chǔ)到數(shù)據(jù)庫的方法,包括使用JPA、JSON、XML、以及關(guān)系型數(shù)據(jù)庫的數(shù)組類型等,需要的朋友可以參考下2024-09-09關(guān)于IDEA2020.1新建項(xiàng)目maven PKIX 報(bào)錯(cuò)問題解決方法
這篇文章主要介紹了關(guān)于IDEA2020.1新建項(xiàng)目maven PKIX 報(bào)錯(cuò)問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Java中instanceof關(guān)鍵字的用法總結(jié)
instanceof是Java的一個(gè)二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留關(guān)鍵字。它的作用是測試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回boolean類型的數(shù)據(jù)2013-10-10spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用
這篇文章主要給大家介紹了關(guān)于spring源碼學(xué)習(xí)之bean的初始化以及循環(huán)引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10springboot集成redis實(shí)現(xiàn)簡單秒殺系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了springboot集成redis實(shí)現(xiàn)簡單秒殺系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12IDEA中Git版本回退的兩種實(shí)現(xiàn)方案
作為開發(fā)者,代碼版本回退是日常高頻操作,IntelliJ IDEA集成了強(qiáng)大的Git工具鏈,但面對(duì)reset和revert兩種核心回退方案,許多開發(fā)者仍存在選擇困惑,本文將解析Reset與Revert兩種方案的操作細(xì)節(jié)及避坑指南,需要的朋友可以參考下2025-03-03java實(shí)戰(zhàn)CPU占用過高問題的排查及解決
這篇文章給大家分享了java實(shí)戰(zhàn)CPU占用過高問題的排查及解決方法,有需要的朋友們可以學(xué)習(xí)下。2018-08-08