國際化(通常縮寫為 i18n)是指設計和準備軟體以輕鬆適應各種語言、地區和文化,而不需要對程式碼進行工程變更。接下來通常是在地化(通常縮寫為 l10n),其中涉及使國際化軟體適應特定的語言環境,包括翻譯文本、調整本地約定以及修改其他特定於語言環境的元素。
我們的目標是透過將核心邏輯與特定於語言環境的元素(如語言和文化約定)分開,使軟體足夠靈活以支援多種語言環境。
使用程式語言提供的 ResourceBundle 類別在普通 Java 程式中本地化文字訊息有點簡單。 ResourceBundle 類別可以輕鬆載入屬性檔案中定義的特定於區域設定的鍵值屬性。這些屬性檔稱為資源包。
ResourceBundle resources = ResourceBundle.getBundle("messages", Locale.FRANCE); String greeting = resources.getString("greeting.hello"); assertEquals("Bonjour le monde", greeting); String greetingUsername = MessageFormat.format(resources.getString("greeting.username"), "Ayo"); assertEquals("Bonjour Ayo", greetingUsername);
在 Java 程式中本地化文字訊息的另一種方法是使用第三方函式庫。 i18n-resource-bundle 就是這類函式庫之一。該庫是前面討論的 ResourceBundle 的實作。
如果您使用 Maven,請在 pom.xml 中新增以下相依性
<dependency> <groupId>io.github.jelilio</groupId> <artifactId>i18n-resource-bundle</artifactId> <version>0.0.2</version> </dependency>
如果您喜歡 Gradle,請使用它;
implementation 'io.github.jelilio:i18n-resource-bundle:0.0.2'
i8n-resource-bundle 提供了 MessageSource 接口,它定義了幾種解析訊息的方法。它有兩個實現,ResourceBundleMessageSource 和 ReloadableResourceBundleMessageSource。兩種實作都使用類似於 Java ResourceBundle 的指定基本名稱來存取資源包。 ResourceBundleMessageSource 依賴 Java 的 ResourceBundle 實作結合 MessageFormat 來解析不同語言環境的資源包中的消息。
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); String greeting = messageSource .getMessage("greeting.hello", null, Locale.FRANCE); assertEquals("Bonjour le monde", greeting); String greetingUsername = messageSource .getMessage("greeting.username", new String[]{"Ayo"}, Locale.FRANCE); assertEquals("Bonjour Ayo", greetingUsername);
與ResourceBundleMessageSource不同,ReloadableResourceBundleMessageSource使用Java的Properties實例作為訊息的自訂資料結構,使用不同的策略載入它們,允許根據時間戳更改和特定字元編碼重新載入屬性文件,而無需重新啟動應用程式。
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasenames("messages"); String greeting = messageSource .getMessage("greeting.hello", null, Locale.FRANCE); assertEquals("Bonjour le monde", greeting); String greetingUsername = messageSource .getMessage("greeting.username", new String[]{"Ayo"}, Locale.US); assertEquals("Bonjour Ayo", greetingUsername);
在本簡短指南中,我們學習了使用 ResourceBundle 和 i18n-resource-bundle 在 Java 應用程式中實現國際化 (i18n)。我們了解如何根據提供的區域設定名稱解析資源包,並看到了一個實際範例。
以上是Java 的國際化的詳細內容。更多資訊請關注PHP中文網其他相關文章!