<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java `ResourceBundle`教程 原文:http://zetcode.com/java/resourcebundle/ 在 Java `ResourceBundle`教程中,我們展示了如何在 Java 中使用`ResourceBundle`。 硬編碼特定于語言環境的數據不是要走的路。 諸如消息或標簽之類的值應放在單獨的文件中。 這樣,我們可以處理多個語言環境,而不必為每個語言環境編寫不同的代碼。 對于翻譯人員來說,這也很方便,因為它們僅處理可翻譯的文本,而不查看編程代碼。 ## Java `ResourceBundle` 資源包是 Java 屬性文件,其中包含特定于語言環境的數據。 通過使代碼與語言環境無關,這是使 Java 應用國際化的一種方式。 資源包捆綁到具有相同基本名稱的族中。 例如,如果我們有一個`words`基本名稱,則`words_sk`與斯洛伐克語的語言環境匹配。 如果不支持特定的語言環境,則使用默認資源束。 資源包還支持方言。 例如`words_es_AR`用于阿根廷使用的西班牙語,而玻利維亞使用`words_es_BO`。 `ResourceBundle`是一個抽象類,具有兩個子類:`PropertyResourceBundle`和`ListResourceBundle`。 `PropertyResourceBundle`從屬性文件加載數據。 屬性文件是包含可翻譯文本的純文本文件。 屬性文件不是 Java 源代碼的一部分,它們只能包含`String`值。 `ListResourceBundle`通過方便的列表管理資源; 它從類文件中獲取數據。 我們可以將任何特定于語言環境的對象存儲在`ListResourceBundle`中。 為了獲得適當的`ResourceBundle`,我們調用`ResourceBundle.getBundle()`方法。 這是一種尋找`ListResourceBundle`的工廠方法,如果找不到,將尋找`PropertyResourceBundle`。 如果找不到資源束,則拋出`MissingResourceException`。 ## Java `PropertyResourceBundle`示例 在第一個應用中,我們創建一個簡單的 Java 應用,該應用使用三個資源包:默認的英語,德語和斯洛伐克語。 ![NetBeans project structure](https://img.kancloud.cn/b7/03/b703ded731e860cc55ec29653d9278e0_265x229.jpg) 圖:NetBeans 項目結構 我們創建三個屬性文件,并將它們放置在`resources`目錄中。 `words.properties` ```java w1 = Earth w2 = ocean ``` 這是默認屬性文件。 它通常是英語。 文件中有兩個詞。 `words_de.properties` ```java w1 = Erde w2 = ozean ``` `words_de.properties`文件包含德語單詞。 `words_sk.properties` ```java w1 = Zem w2 = oceán ``` `words_de.properties`文件包含斯洛伐克語單詞。 `ResourceBundleEx.java` ```java package com.zetcode; import java.util.Locale; import java.util.ResourceBundle; public class ResourceBundleEx { static public void main(String[] args) { Locale[] locales = { Locale.GERMAN, new Locale("sk", "SK"), Locale.ENGLISH }; System.out.println("w1:"); for (Locale locale : locales) { getWord(locale, "w1"); } System.out.println("w2:"); for (Locale locale : locales) { getWord(locale, "w2"); } } static void getWord(Locale curLoc, String key) { ResourceBundle words = ResourceBundle.getBundle("resources/words", curLoc); String value = words.getString(key); System.out.printf("Locale: %s, Value: %s %n", curLoc.toString(), value); } } ``` 在代碼示例中,我們打印了三個資源包中使用的所有單詞。 ```java Locale[] locales = { Locale.GERMAN, new Locale("sk", "SK"), Locale.ENGLISH }; ``` 在示例中,我們有三種語言環境:德語,斯洛伐克語和英語。 ```java for (Locale locale : locales) { getWord(locale, "w1"); } ``` 我們遍歷語言環境并打印帶有`w1`鍵標記的單詞。 ```java ResourceBundle words = ResourceBundle.getBundle("resources/words", curLoc); ``` 使用`ResourceBundle.getBundle()`方法,可以獲得當前使用的語言環境的捆綁軟件。 由于我們尚未創建`ListResourceBundle`,因此該方法使用`PropertyResourceBundle`,從而從屬性文件加載數據。 ```java String value = words.getString(key); System.out.printf("Locale: %s, Value: %s %n", curLoc.toString(), value); ``` 我們獲取值并打印語言環境名稱,鍵和值。 ```java w1: Locale: de, Value: Erde Locale: sk_SK, Value: Zem Locale: en, Value: Earth w2: Locale: de, Value: ozean Locale: sk_SK, Value: oceán Locale: en, Value: ocean ``` 這是示例的輸出。 ## Java `ListResourceBundle`示例 在以下應用中,我們使用`ListResourceBundle`。 ![NetBeans project structure II](https://img.kancloud.cn/8a/ea/8aea108fa06865321822381f15539676_265x189.jpg) 圖:NetBeans 項目結構 II 我們為斯洛伐克語和捷克語創建語言環境資源。 `MyResources_sk.java` ```java package com.zetcode.myres; import java.util.ListResourceBundle; public class MyResources_sk extends ListResourceBundle { @Override protected Object[][] getContents() { return resources; } private final Object[][] resources = { { "Capital", "Bratislava" }, { "Area", 49035 }, { "Currency", "EUR" }, }; } ``` 在這里,我們為斯洛伐克語實現了`ListResourceBundle`的實現。 我們必須重寫`getContents()`方法。 該方法返回鍵/值對的數組。 `MyResources_cs_CZ.java` ```java package com.zetcode.myres; import java.util.ListResourceBundle; public class MyResources_cs_CZ extends ListResourceBundle { @Override protected Object[][] getContents() { return resources; } private final Object[][] resources = { { "Capital", "Praha" }, { "Area", 78866 }, { "Currency", "CZK" }, }; } ``` 這是捷克語的實現。 `ResourceBundleEx2.java` ```java package com.zetcode; import java.util.Locale; import java.util.ResourceBundle; public class ResourceBundleEx2 { public static void main(String[] args) { Locale sk_loc = new Locale("sk", "SK"); ResourceBundle bundle = ResourceBundle.getBundle("com.zetcode.myres.MyResources", sk_loc); System.out.println("Capital: " + bundle.getObject("Capital")); System.out.println("Area: " + bundle.getObject("Area")); System.out.println("Currency: " + bundle.getObject("Currency")); System.out.println(); Locale cz_loc = new Locale("cs", "CZ"); ResourceBundle bundle2 = ResourceBundle.getBundle("com.zetcode.myres.MyResources", cz_loc); System.out.println("Capital: " + bundle2.getObject("Capital")); System.out.println("Area: " + bundle2.getObject("Area")); System.out.println("Currency: " + bundle2.getObject("Currency")); } } ``` 該示例打印了斯洛伐克和捷克共和國的一些地理數據。 ```java Locale sk_loc = new Locale("sk", "SK"); ResourceBundle bundle = ResourceBundle.getBundle("com.zetcode.myres.MyResources", sk_loc); ``` 使用`ResourceBundle.getBundle()`方法,我們從`com.zetcode.myres.MyResources_sk.class`創建資源束。 ```java Capital: Bratislava Area: 49035 Currency: EUR Capital: Praha Area: 78866 Currency: CZK ``` This is the output of the example. ## Swing 應用 在第三個示例中,我們使用 Java Swing 創建了一個簡單的 GUI 應用。 該示例可以動態更改 UI 的語言。 該示例使用`ListResourceBundle`類。 對于不熟悉 Swing 的人,ZetCode 上有一個 [Java Swing 教程](http://zetcode.com/tutorials/javaswingtutorial/)。 源代碼和圖像可在作者的 [Github 倉庫](https://github.com/janbodnar/Java-ResourceBundle)中獲得。 `MyResources_sk.java` ```java package com.zetcode.myres; import java.util.ListResourceBundle; import javax.swing.ImageIcon; public class MyResources_sk extends ListResourceBundle { @Override protected Object[][] getContents() { return resources; } private final Object[][] resources = { {"name", "Slovensko"}, {"lang_menu", "Jazyk"}, {"lang_sk", "Sloven?ina"}, {"lang_hu", "Ma?ar?ina"}, {"flag", new ImageIcon("src/resources/slovakia.png")}, {"description", "Slovensko je vnútrozemsky ?tát v strednej Európe."} }; } ``` 這些是斯洛伐克語的資源。 我們有五個字符串和一個`ImageIcon`。 `MyResources_hu.java` ```java package com.zetcode.myres; import java.util.ListResourceBundle; import javax.swing.ImageIcon; public class MyResources_hu extends ListResourceBundle { @Override protected Object[][] getContents() { return resources; } private final Object[][] resources = { {"name", "Magyarország"}, {"lang_menu", "Nyelv"}, {"lang_sk", "Szlovák"}, {"lang_hu", "Magyar"}, {"flag", new ImageIcon("src/resources/hungary.png")}, {"description", "Magyarország k?zép-európai ország " + "a Kárpát-medencében."} }; } ``` 這些是匈牙利語的資源。 `ResourceBundleEx3.java` ```java package com.zetcode; import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.Locale; import java.util.ResourceBundle; import javax.swing.ButtonGroup; import javax.swing.GroupLayout; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JRadioButtonMenuItem; import javax.swing.LayoutStyle; /* * Java ResourceBundle tutorial * * This program uses a ResourceBundle in a * Java Swing application. * * Author: Jan Bodnar * Website: zetcode.com * Last modified: August 2016 */ public class ResourceBundleEx3 extends JFrame { private ResourceBundle bundle; private JLabel flag; private JLabel lbl; private JMenu langMenu; private JRadioButtonMenuItem skMenuItem; private JRadioButtonMenuItem huMenuItem; public ResourceBundleEx3() { initUI(); } private void initUI() { createMenuBar(); flag = new JLabel(); lbl = new JLabel(); updateLanguage(new Locale("sk", "SK")); createLayout(lbl, flag); pack(); setTitle(bundle.getString("name")); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private void updateLanguage(Locale locale) { bundle = ResourceBundle.getBundle("com.zetcode.myres.MyResources", locale); langMenu.setText(bundle.getString("lang_menu")); skMenuItem.setText(bundle.getString("lang_sk")); huMenuItem.setText(bundle.getString("lang_hu")); flag.setIcon((Icon) bundle.getObject("flag")); lbl.setText(bundle.getString("description")); setTitle(bundle.getString("name")); pack(); } private void createMenuBar() { JMenuBar menubar = new JMenuBar(); langMenu = new JMenu(); langMenu.setMnemonic(KeyEvent.VK_F); ButtonGroup btnGroup = new ButtonGroup(); skMenuItem = new JRadioButtonMenuItem("Slovak", true); btnGroup.add(skMenuItem); skMenuItem.addActionListener((ActionEvent e) -> { updateLanguage(new Locale("sk", "SK")); }); langMenu.add(skMenuItem); huMenuItem = new JRadioButtonMenuItem("Hungarian"); btnGroup.add(huMenuItem); huMenuItem.addActionListener((ActionEvent e) -> { updateLanguage(new Locale("hu", "HU")); }); langMenu.add(huMenuItem); menubar.add(langMenu); setJMenuBar(menubar); } private void createLayout(JComponent... arg) { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(arg[0]) .addComponent(arg[1]) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(arg[0]) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) .addComponent(arg[1]) ); } public static void main(String[] args) { EventQueue.invokeLater(() -> { ResourceBundleEx3 ex = new ResourceBundleEx3(); ex.setVisible(true); }); } } ``` 我們有一個菜單欄,其中的菜單包含兩個單選按鈕菜單項。 選擇單選按鈕菜單項會更改應用用戶界面的語言。 ```java private void updateLanguage(Locale locale) { bundle = ResourceBundle.getBundle("com.zetcode.myres.MyResources", locale); langMenu.setText(bundle.getString("lang_menu")); skMenuItem.setText(bundle.getString("lang_sk")); huMenuItem.setText(bundle.getString("lang_hu")); flag.setIcon((Icon) bundle.getObject("flag")); lbl.setText(bundle.getString("description")); setTitle(bundle.getString("name")); pack(); } ``` 當我們選擇單選按鈕菜單項時,將調用`updateLanguage()`方法。 它根據給定的語言環境創建一個新的`ResourceBundle`,并更新菜單,單選菜單項,圖像圖標,說明和框架標題。 ```java skMenuItem.addActionListener((ActionEvent e) -> { updateLanguage(new Locale("sk", "SK")); }); ``` 選擇斯洛伐克單選按鈕菜單項,我們調用`updateLanguage()`方法并傳遞斯洛伐克語言環境作為參數。 ![Swing application](https://img.kancloud.cn/b6/8f/b68f2561acf7713ca41d18d432017e89_385x192.jpg) 圖:Swing 應用 ## Spring Boot 應用 在下一個示例中,我們在 Spring Boot 應用中使用資源包。 Spring 是流行的 Java 應用框架。 Spring Boot 是一種新的解決方案,可以輕松創建基于生產級別的獨立 Spring 應用。 ![NetBeans project structure of a Spring Boot application](https://img.kancloud.cn/23/a8/23a84ac51a12d0d2f2581de354094c31_253x306.jpg) 圖:Spring Boot 應用的 NetBeans 項目結構 同樣,我們創建三個屬性文件,并將它們放置在`src/main/resources/messages`目錄中。 `words.properties` ```java w1 = Earth w2 = ocean ``` 這是默認屬性文件。 `words_de.properties` ```java w1 = Erde w2 = ozean ``` The `words_de.properties` file contains words in German language. `words_sk.properties` ```java w1 = Zem w2 = oceán ``` The `words_de.properties` file contains words in Slovak language. `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>SpringBootMessagesEx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <name>SpringBootMessagesEx</name> </project> ``` `pom.xml`文件包含 Spring Boot 框架的依賴項。 `Application.java` ```java package com.zetcode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.support.ResourceBundleMessageSource; @SpringBootApplication public class Application { @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource source = new ResourceBundleMessageSource(); source.setBasenames("messages/words"); source.setUseCodeAsDefaultMessage(true); return source; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` `Application`是主要的應用類。 我們設置了 Spring Boot 程序。 ```java @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource source = new ResourceBundleMessageSource(); source.setBasenames("messages/words"); source.setUseCodeAsDefaultMessage(true); return source; } ``` 使用`@Bean`注解,我們生成了一個`ResourceBundleMessageSource` bean,該 bean 由 Spring 容器管理。 `ResourceBundleMessageSource`是一種`MessageSource`實現,它使用指定的基本名稱訪問資源束。 此類依賴于基礎 JDK 的`ResourceBundle`實現。 `MyRunner.java` ```java package com.zetcode; import java.util.Locale; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; @Component public class MyRunner implements CommandLineRunner { @Autowired private MessageSource messageSource; @Override public void run(String... args) throws Exception { System.out.println(messageSource.getMessage("w1", null, Locale.GERMAN)); System.out.println(messageSource.getMessage("w1", null, Locale.ENGLISH)); System.out.println(messageSource.getMessage("w2", null, new Locale("sk", "SK"))); } } ``` `MyRunner`是 Spring Boot 應用的命令行運行程序。 ```java @Autowired private MessageSource messageSource; ``` 我們將`MessageSource`注入到該字段中。 ```java System.out.println(messageSource.getMessage("w1", null, Locale.GERMAN)); ``` 我們使用`getMessage()`方法在德語語言環境中得到單詞`w1`。 ```java ... Erde Earth oceán ... ``` 這是應用的輸出。 在本教程中,我們介紹了 Java `ResourceBundle`。 我們創建了兩個 Java 控制臺應用,一個 Swing 應用和一個 Spring Boot 應用。 您可能還需要查看相關的教程: [Spring `MessageSource`教程](/spring/messagesource/), [Java Swing 教程](/tutorials/javaswingtutorial/), [Java 教程](/lang/java/)或 [Java 圖像顯示教程](/java/displayimage/) 。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看