i18n的原理是什么,spring整合i18n
i18n的原理是什么
在 Spring 中整合国际化(i18n)可以通过以下步骤实现。Spring 提供了一套强大的机制来处理多语言支持,以下是常见的配置方法:
在 Spring 中整合国际化(i18n)可以通过以下步骤实现。Spring 提供了一套强大的机制来处理多语言支持,以下是常见的配置方法:
1. 配置国际化资源文件
创建不同语言的资源文件,通常命名为 messages_{locale}.properties
,例如:
messages_en.properties
(英文)messages_zh.properties
(中文)messages_es.properties
(西班牙语)
内容示例(messages_en.properties
):
greeting=Hello
farewell=Goodbye
内容示例(messages_zh.properties
):
greeting=你好
farewell=再见
2. 配置 MessageSource
Bean
在 Spring 的配置类中,配置 MessageSource
来加载国际化资源文件。
使用 Java 配置:
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
@Configuration
public class AppConfig {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8"); // 避免中文乱码
return messageSource;
}
}
使用 XML 配置:
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
3. 配置 LocaleResolver
使用 CookieLocaleResolver
:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import java.util.Locale;
@Configuration
public class LocaleConfig {
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver resolver = new CookieLocaleResolver();
resolver.setDefaultLocale(Locale.ENGLISH); // 设置默认语言
return resolver;
}
}
使用 SessionLocaleResolver
:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;
@Configuration
public class LocaleConfig {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocale(Locale.ENGLISH); // 设置默认语言
return resolver;
}
}
4. 配置 LocaleChangeInterceptor
用于拦截并切换语言参数。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 请求参数名,如 ?lang=zh
registry.addInterceptor(interceptor);
}
}
5. 在代码中使用国际化消息
通过 MessageSource
获取消息:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;
import java.util.Locale;
@Service
public class GreetingService {
@Autowired
private MessageSource messageSource;
public String getGreeting(String lang) {
Locale locale = new Locale(lang);
return messageSource.getMessage("greeting", null, locale);
}
}
6. 在视图中使用国际化消息
使用 Spring 的 spring:message
标签:
在 JSP 文件中:
<spring:message code="greeting" />
在 Thymeleaf 中:
<p th:text="#{greeting}"></p>
7. 测试国际化
启动应用程序,访问以下 URL:
http://localhost:8080?lang=en
(英文)http://localhost:8080?lang=zh
(中文)