インターネットの発展に伴い、ますます多くの企業や個人がグローバル化のニーズに注目し始めています。この文脈では、多言語サポートが重要なトピックになります。Spring フレームワークは優れた Java 開発フレームワークとして、豊富な i18N サポートを提供しており、ブリックレイヤーが多言語アプリケーションを迅速に実装するのに役立ちます。
1. i18nの概要
国際化は、i18nとも呼ばれます。その出典は、英語の internationalization の最初と最後の文字 i と n であり、18 は中間の文字数です。ソフトウェアのリリースは複数の国を対象とする場合があるため、ソフトウェアをさまざまな国のユーザーにさまざまな言語で表示するプロセスが国際化です。一般に、ソフトウェアの国際化は設定ファイルによって実現されますが、2 つの言語をサポートする場合は、2 つのバージョンの設定ファイルが必要です。
2. Java の国際化
(1) Java 自体は国際化をサポートしており、java.util.Locale
現在のユーザーが属するロケールなどの情報を指定したり、java.util.ResourceBundle
バインディングに対応するリソース ファイルを検索したりするために使用されます。Locale にはlanguage
情報とcountry
、デフォルトのロケール オブジェクトを作成するために Locale によって使用される静的メソッドが含まれます。
/**
* This method must be called only for creating the Locale.*
* constants due to making shortcuts.
*/
private static Locale createConstant(String lang, String country) {
BaseLocale base = BaseLocale.createInstance(lang, country);
return getInstance(base, null);
}
(2)設定ファイルの命名規則
Spring i18N の中核はリソース ファイルであり、通常は.properties
または.yml
形式で保存され、アプリケーションで翻訳する必要があるテキスト情報を保存するために使用されます。リソース ファイル内のキーと値のペアは、特定の変換関係を表します。例えば:
test=Hello, world!
Java がファイルを認識するには、ファイルの命名basename_language_country.properties
規則に従う必要があります。このうち、ベース名は必須ですが、言語と国はオプションです。ここには優先順位の概念があり、2 つの設定ファイルが同時に提供された場合messages.properties
、messages_zh_CN.propertes
提供されたロケールが一致する場合en_CN
は最初に設定ファイルが検索されmessages_en_CN.propertes
、見つからない場合はmessages.properties
再度設定ファイルが検索されます。最後に、プロンプトの下で、すべての構成ファイルを配置する必要がありますclasspath
。通常はリソース ディレクトリに配置されます。
(3) 実験:Java国際化のデモンストレーション
最初の一歩
モジュール spring6-i18n を作成し、Spring の依存関係を導入します。
第二段階
リソース ディレクトリの下に 2 つの構成ファイルを作成しますmessages_zh_CN.propertes
。messages_en_GB.propertes
第三段階
テスト:
package com.example.spring6.javai18n;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.ResourceBundle;
public class Demo1 {
public static void main(String[] args) {
System.out.println(ResourceBundle.getBundle("messages",
new Locale("en","GB")).getString("test"));
System.out.println(ResourceBundle.getBundle("messages",
new Locale("zh","CN")).getString("test"));
}
}
3. Spring6 の国際化
3.1、メッセージソースインターフェイス
春の国際化はMessageSource
このインターフェースを通じてサポートされます
共通実装クラス
ResourceBundleMessageSource
:
これは Java ベースの ResourceBundle 基本クラスに基づいた実装であり、国際化されたリソースをリソース名によってのみロードできるようにします。指定されたリソース ファイル内のキーと値のペアをメッセージにマップできます。
例えば:
- messages.properties というリソース ファイルを作成し、いくつかのキーと値のペアをそれに追加します。
greeting=Hello, world!
- Spring 構成ファイルで ResourceBundleMessageSource を構成する
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:messages</value>
</list>
</property>
</bean>
- コードで ResourceBundleMessageSource を使用してメッセージを取得する
@Autowired
private ResourceBundleMessageSource messageSource;
public void sayHello() {
String greeting = messageSource.getMessage("greeting", null, LocaleContextHolder.getLocale());
System.out.println(greeting); // 输出 "Hello, world!"
}
@Autowired
まず、アノテーションを通じてResourceBundleMessageSource
現在のクラスにそれを注入します。次に、sayHello メソッドでmessageSource.getMessage
メソッドを呼び出して、「greeting」キーに対応する値を取得します。このメソッドの最初のパラメータは検索するキー名、2 番目のパラメータはオプションのパラメータ リスト、3 番目のパラメータは検索するロケールを示す Locale オブジェクトです。Locale オブジェクトが指定されていない場合は、現在のシステムの Locale がデフォルトで使用されます。
ReloadableResourceBundleMessageSource
:
この機能は、最初のクラスの機能に似ていますが、タイミング リフレッシュ機能が追加されており、システムを再起動せずにリソース情報を更新できます。
StaticMessageSource
:
プログラミングによって国際化情報を提供することができ、これを利用して国際化情報をdbに格納する機能を実現できます。
3.2、Spring6 国際化を使用
最初のステップはリソース ファイルを作成することです
国際化ファイルの命名形式:basename_ language_country.properties
{0}、{1} などの内容は動的パラメータです
(1) example_en_US.propertiesを作成する
www.example.com=welcome {0},时间:{1}
(2) example_zh_CN.propertiesを作成する
www.example.com=欢迎 {0},时间:{1}
2 番目のステップは、Spring 構成ファイルを作成し、MessageSource を構成することです。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>example</value>
</list>
</property>
<property name="defaultEncoding">
<value>utf-8</value>
</property>
</bean>
</beans>
3 番目のステップはテストクラスを作成することです
package com.example.spring6.javai18n;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Date;
import java.util.Locale;
public class Demo2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//传递动态参数,使用数组形式对应{0} {1}顺序
Object[] objs = new Object[]{
"example",new Date().toString()};
//www.example.com为资源文件的key值,
//objs为资源文件value值所需要的参数,Local.CHINA为国际化为语言
String str=context.getMessage("www.example.com", objs, Locale.CHINA);
System.out.println(str);
}
}