java----程序国际化
主程序
package com.zy; import java.text.MessageFormat; import java.util.Locale; import java.util.ResourceBundle; import java.util.Scanner; public class Demo { public static void main(String[] args) { //创建一个本地语言环境 Locale locale_CN = new Locale("zh","CN"); Locale locale_US= new Locale("en","US"); //根据操作系统默认选择语言环境 //Locale locale_default= Locale.getDefault(); //如果后面不加参数,找系统默认的语言的配置文件(info_zh_CN) ,ResourceBundle只能读取配置文件,不能写入 ResourceBundle r = ResourceBundle.getBundle("com.property.info"); //找英语中的配置文件(info_en_US) //ResourceBundle r = ResourceBundle.getBundle("com.property.info",locale_US); //通过配置文件字段(key)读取的value //System.out.println(r.getString("input.username")); //示例 System.out.println(r.getString("System.name")); Scanner input = new Scanner(System.in); System.out.println(r.getString("input.username")); String username = input.nextLine(); System.out.println(r.getString("input.password")); String password = input.next(); if("admin".equals(username)&&"111".equals(password)){ System.out.println(r.getString("login.success")); //动态文本格式化 String s = r.getString("welcom"); s = MessageFormat.format(s, username); System.out.println(s); }else{ System.out.println(r.getString("login.error")); } } }
新建一个包(com.property),里面放入配置文件(语言数据)
在该包下新建一个文件info_zh_CN.properties
System.name=\u5458\u5DE5\u7BA1\u7406\u7CFB\u7EDF input.username=\u8BF7\u8F93\u5165\u7528\u6237\u540D\uFF1A input.password=\u8BF7\u8F93\u5165\u5BC6\u7801\uFF1A login.success=\u767B\u5F55\u6210\u529F login.error=\u767B\u5F55\u5931\u8D25 welcom=\u6B22\u8FCE\u4F60\uFF0C{0}
在该包下新建一个文件info_en_US.properties
System.name = EMP Manage System input.username = Input UserName: input.password = Input PassWord: login.success = Login Success login.error = Login Error welcom=WelCom,{0}
spring MVC配置程序国际化
如果需要配置程序国际化(此时是根据浏览器设置的语言,来进行匹配的)
1、配置
1.1、在resource目录下添加 info_zh_CN.properties、info_en_US.properties。等等。
1.2、在spring-MVC.xml中添加
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="info"></property> </bean>
2、获取国际胡中的值
在java代码中使用
@Autowired //自动注入 private ResourceBundleMessageSource messageSource; @RequestMapping(value = "/languagetest",method = RequestMethod.GET) public String Languagetest(Locale locale){ System.out.println(locale);//zh_CN,根据浏览器获得 String message = messageSource.getMessage("input.password",null,locale);//null:args System.out.println(message); return "login"; }
在html中使用:(JSTL格式化标签用来格式化并输出文本),此时用IE浏览器打开,设置不同的语言,显示的文本是不一样的
<fmt:message key="input.password"></fmt:message>
3、如果需要配置程序国际化(此时手动(需要传入语言参数)进行中英文切换)
方式1、如果不需要配置spring-MVC.xml
@RequestMapping(value = "/languagetest",method = RequestMethod.GET) public String Languagetest(Locale locale){} //请求参数需要有locale
url需要带上locale,指定语言
http://localhost:8080/languagetest?locale=zh_CH //中文 http://localhost:8080/languagetest?locale=en_US //英文
方式2、配置spring-MVC.xml
此时就不需要在参数定一个 Locale locale
<!--配置SessionLocaleResolver--> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean> <!--配置拦截器--> <mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean> </mvc:interceptors>
url需要带上locale,指定语言
http://localhost:8080/languagetest?locale=zh_CH //中文 http://localhost:8080/languagetest?locale=en_US //英文
工作原理
测试
1、配置info_en_US.properties和info_en_US.properties
2、html(我们使用html来获取配置文件数据)
<fmt:message key="input.username"></fmt:message>
spring boot 配置国际化
可以查看 MessageSourceAutoConfiguration这个类的源码,理解spring boot帮我们自动配置了spring mvc中需要配置的 ResourceBundleMessageSource,
1、配置
1、先在resource目录创建i18n目录,在该目录下添加 info_zh_CN.properties、info_en_US.properties、可以添加一个info.properties(表示默认)等等。
2、application.properties配置路径(默认的basename是message,所以我们也可以在resources下直接创建message.properties)
spring.messages.basename=i18n.info
3、编写国际资源文件(快捷)
2、获取国际化的值
1、在html页面上使用
[(#{email})] //[()]、[[]] //直接输出值是thymeleaf语法,#{}获取国际话的值 <input type="email" class="form-control" placeholder="email" th:placeholder="#{email}"> //使用th:xx 来替换值
3、中英文切换
方式1;注意该类名只能是 LocaleResolver,此时注册到容器中的 id = localeResolver
@Component public class LocaleResolver implements org.springframework.web.servlet.LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { String str_locale = request.getParameter("locale"); Locale locale = Locale.getDefault(); //注意设置了,这个所以我们即使在浏览器中设置语言,也没有效果了,如果需要有效果,可以在请求头中获取语言信息,设置到locale中; if (str_locale!=null){ String[] s = str_locale.split("_"); locale = new Locale(s[0],s[1]); } return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { } }
方式2;类名可以任意
public class MyLocaleResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { String str_locale = request.getParameter("locale"); Locale locale = Locale.getDefault(); if (str_locale!=null){ String[] s = str_locale.split("_"); locale = new Locale(s[0],s[1]); } return locale; } @Override public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) { } }
方法名必须是localeResolver
@Configuration public class MyMvcConfig implements WebMvcConfigurer { @Bean public LocaleResolver localeResolver(){ return new MyLocaleResolver(); } }
测试:每一个url后面都需要加上参数,每一个页面才都可以中英文切换
http://localhost:8080/login?locale=en_US