ホームページ  >  記事  >  Java  >  Java で国際化された基底クラス ResourceBundle を使用する方法

Java で国際化された基底クラス ResourceBundle を使用する方法

PHPz
PHPz転載
2023-05-04 14:22:06941ブラウズ

    Java 開発において、ResourceBundle はローカライズされたリソースを便利に管理するためのメカニズムです。これにより、プログラムは現在のシステム環境の言語および国/地域に応じて、対応するローカライズされたリソース ファイルを自動的にロードできるため、ハードコーディングが回避され、コードの繰り返しが削減されます。 ResourceBundle を使用するための基本的な手順は次のとおりです:

    1. リソース ファイルの準備

    ResourceBundle はリソース ファイルをロードすることでローカリゼーションを実装するため、言語および国/地域ごとに対応するリソースを準備する必要があります。書類。リソース ファイルには、.properties 形式のテキスト ファイル、.class ファイル、または .jar ファイルを使用できます。

    リソース ファイルでは、ローカライズする必要がある各文字列の属性名を指定し、各属性名の言語への翻訳を提供する必要があります。たとえば、messages.properties という名前のリソース ファイルの例を次に示します。

    greeting=Hello
    farewell=Goodbye

    異なる言語や国では、同じプロパティ名に対して異なる翻訳を提供できます。たとえば、次はmessages_fr.propertiesという名前のフランス語のリソース ファイルの例です:

    greeting=Bonjour
    farewell=Au revoir

    2. リソース ファイルのロード

    Java では、ResourceBundle クラスを使用してリソース ファイルをロードできます。 ResourceBundle クラスには、リソース ファイルをロードするためのいくつかの異なるコンストラクターが用意されています。例:

    ResourceBundle rb = ResourceBundle.getBundle("messages", Locale.getDefault());

    このステートメントは、現在のシステム環境のデフォルトの言語および国/地域に従って、messages という名前のリソース ファイルをロードします。システム環境が英語および米国の場合、このステートメントはmessages.propertiesリソース・ファイルをロードします。システム環境がフランス語の場合、このステートメントはmessages_fr.propertiesリソース・ファイルをロードします。

    指定した言語および国/地域でリソース ファイルを読み込む必要がある場合は、Locale パラメーターを指定して getBundle() メソッドを使用できます。例:

    Locale locale = new Locale("fr", "FR");
    ResourceBundle rb = ResourceBundle.getBundle("messages", locale);

    このステートメントは、messages_fr_FR.properties という名前のフランス語/フランス語リソース ファイルをロードします。

    3. ローカライズされた文字列を取得する

    リソース ファイルが正常にロードされたら、ResourceBundle の getString() メソッドを使用してローカライズされた文字列を取得できます。次に例を示します。

    String greeting = rb.getString("greeting");
    String farewell = rb.getString("farewell");

    これらのステートメントは、リソース ファイルから、greeting および welcome という名前の属性を含むローカライズされた文字列を取得し、それらをgreeting 変数と別れの変数にそれぞれ割り当てます。指定されたプロパティ名が見つからない場合、getString() メソッドは MissingResourceException をスローします。

    4. ResourceBundle を使用するためのヒント

    上記の基本的な手順に加えて、ResourceBundle を使用するための注目すべき機能とヒントがいくつかあります:

    4.1 適切なリソース ファイル形式を選択する

    ResourceBundle は、.properties、.xml、.class ファイルなどを含む複数のリソース ファイル形式をサポートします。単純なローカライズされた文字列の場合、.properties 形式が最も一般的に選択されます。これは、使用が簡単で、編集とローカライズが簡単であるためです。

    画像、サウンド、ビデオなど、より複雑なローカライズされたリソースの場合は、他の形式のリソース ファイルを使用する必要がある場合があります。たとえば、.class ファイルまたは .jar ファイルを使用して画像またはサウンド ファイルを組み込み、ResourceBundle の ClassLoader.getSystemClassLoader() メソッドを使用してこれらのファイルをロードできます。

    4.2 ローカライズされた文字列内の特殊文字の処理

    ローカライズされた文字列には、改行、タブ、Unicode 文字などのさまざまな特殊文字が含まれる場合があります。これらの文字をリソース ファイルに直接埋め込むと、無用なトラブルやエラーが発生する可能性があります。

    これらの問題を回避するために、Java エスケープ文字を使用してこれらの特殊文字を表すことができます。たとえば、「\n」を使用して改行文字を表し、「\t」を使用してタブ文字を表し、「\uXXXX」を使用して Unicode 文字を表すことができます。

    4.3 欠落しているローカライズされた文字列の処理

    場合によっては、特定の言語のローカライズされた文字列の翻訳が提供されないことがあります。プログラムでの MissingResourceException 例外を回避するために、リソース ファイル内でこれらの欠落文字列に対するデフォルトの翻訳 (英語翻訳など) を提供できます。たとえば、次はデフォルトの翻訳を含むmessages_fr.properties ファイルの例です:

    greeting=Bonjour
    farewell=Au revoir
    warning=Attention: This message has no translation in French. Please refer to the English version.

    このように、フランス語環境では、特定のプロパティ名のローカライズされた文字列が見つからない場合、ResourceBundle は属性名のデフォルトの翻訳を自動的に返すため、プログラム例外が回避されます。

    4.4 動的ローカリゼーション文字列の処理

    一部のローカリゼーション文字列には、時刻、日付、数値、通貨などの動的コンテンツが含まれる場合があります。これらの文字列を正しくローカライズするには、MessageFormat や NumberFormat などの Java の書式設定メカニズムを使用する必要があります。たとえば、次は MessageFormat を使用して動的文字列をローカライズする例です:

    String pattern = rb.getString("greeting");
    Object[] arguments = {"John"};
    String greeting = MessageFormat.format(pattern, arguments);

    この例では、パターンはプレースホルダー "{0}"、"{0}" を含むローカライズされた文字列です。場所を表します。これは動的コンテンツに置き換える必要があります。引数は実際の動的コンテンツを含む配列であり、「{0}」の位置を順番に置き換えます。最後に、MessageFormat.format() メソッドはローカライズされた文字列を返します。

    4.5 处理多个资源文件

    在一些情况下,可能需要使用多个资源文件来管理不同类型或不同用途的本地化资源。在这种情况下,可以使用ResourceBundle.Control类的方法来指定资源文件的搜索路径和加载顺序。

    例如,可以使用ResourceBundle.Control.getControl()方法来获取默认的ResourceBundle.Control实例,然后使用ResourceBundle.getBundle()方法来指定基础名称和Locale信息,以便查找合适的资源文件。例如,以下是一个使用多个资源文件来管理本地化字符串的示例:

    ResourceBundle.Control control = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_PROPERTIES);
    ResourceBundle messages = ResourceBundle.getBundle("Messages", new Locale("fr"), control);
    ResourceBundle errors = ResourceBundle.getBundle("Errors", new Locale("fr"), control);
    
    String greeting = messages.getString("greeting");
    String error = errors.getString("invalid_input");
    
    System.out.println(greeting); // Bonjour
    System.out.println(error); // Entrée invalide

    在这个示例中,我们使用ResourceBundle.Control.FORMAT_PROPERTIES指定了资源文件的格式为.properties文件,然后分别使用Messages和Errors作为基础名称来获取不同类型的资源文件。这样,我们就可以轻松地管理不同类型的本地化资源,从而使程序更加可读和易于维护。

    4.6 自定义资源加载器

    如果默认的资源加载机制无法满足需求,我们还可以自定义资源加载器来实现更高级的功能。自定义资源加载器需要继承java.util.ResourceBundle.Control类,并重写其中的方法来实现自定义逻辑。

    例如,以下是一个使用自定义资源加载器来加载本地化字符串的示例:

    public class MyResourceLoader extends ResourceBundle.Control {
        @Override
        public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
                throws IllegalAccessException, InstantiationException, IOException {
            String bundleName = toBundleName(baseName, locale);
            String resourceName = toResourceName(bundleName, "myproperties");
            InputStream stream = loader.getResourceAsStream(resourceName);
            if (stream != null) {
                try {
                    return new PropertyResourceBundle(stream);
                } finally {
                    stream.close();
                }
            } else {
                return super.newBundle(baseName, locale, format, loader, reload);
            }
        }
    }
    
    ResourceBundle.Control control = new MyResourceLoader();
    ResourceBundle messages = ResourceBundle.getBundle("Messages", new Locale("fr"), control);
    
    String greeting = messages.getString("greeting");
    
    System.out.println(greeting); // Bonjour

    在这个示例中,我们定义了一个名为MyResourceLoader的自定义资源加载器,并重写了其中的newBundle()方法来实现自定义资源加载逻辑。然后,我们使用这个自定义资源加载器来获取Messages资源文件中的本地化字符串。这样,我们就可以实现更高级的资源加载功能,从而满足更复杂的需求。

    4.7 动态更新资源文件

    有时候,在应用程序运行期间,可能需要动态地更新资源文件中的某些值。在Java中,我们可以使用PropertyResourceBundle类来实现这个功能。

    PropertyResourceBundle是ResourceBundle的一个子类,它可以读取.properties格式的资源文件,并将其转换为一个键值对的形式。然后,我们可以通过这个键值对来动态地更新资源文件中的值。

    例如,以下是一个使用PropertyResourceBundle来动态更新本地化字符串的示例:

    // 加载资源文件
    InputStream stream = new FileInputStream("Messages.properties");
    PropertyResourceBundle bundle = new PropertyResourceBundle(stream);
    
    // 动态更新本地化字符串
    bundle.handleKey("greeting", (key, value) -> "Hello");
    
    // 输出本地化字符串
    String greeting = bundle.getString("greeting");
    System.out.println(greeting); // Hello

    在这个示例中,我们首先使用FileInputStream来加载Messages.properties资源文件,然后将其转换为一个PropertyResourceBundle对象。然后,我们使用handleKey()方法来动态地更新greeting这个键对应的值。最后,我们使用getString()方法来获取更新后的本地化字符串。

    这种动态更新资源文件的方式可以使应用程序更加灵活,能够快速响应变化。但是需要注意的是,这种方式需要保证资源文件的正确性和一致性,否则可能会导致应用程序运行出错。

    以上がJava で国際化された基底クラス ResourceBundle を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。