• Spring 国际化:i18n


    i18n概述

    国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配置文件。

    Java国际化

    1)Java自身是支持国际化的,java.util.Locale用于指定当前用户所属的语言环境等信息,java.util.ResourceBundle用于查找绑定对应的资源文件。Locale包含了language信息和country信息,Locale创建默认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);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    (2)配置文件命名规则:
    basename_language_country.properties
    必须遵循以上的命名规则,java才会识别。其中,basename是必须的,语言和国家是可选的。这里存在一个优先级概念,如果同时提供了messages.properties和messages_zh_CN.propertes两个配置文件,如果提供的locale符合en_CN,那么优先查找messages_en_CN.propertes配置文件,如果没查找到,再查找messages.properties配置文件。最后,提示下,所有的配置文件必须放在classpath中,一般放在resources目录下
    (3)实验:演示Java国际化

    第一步 引入spring依赖
    第二步 在resource目录下创建两个配置文件:messages_zh_CN.propertes和messages_en_GB.propertes

    在这里插入图片描述
    第三步 测试

    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"));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Spring6国际化

    MessageSource接口

    spring中国际化是通过MessageSource这个接口来支持的

    常见实现类

    ResourceBundleMessageSource

    这个是基于Java的ResourceBundle基础类实现,允许仅通过资源名加载国际化资源

    ReloadableResourceBundleMessageSource

    这个功能和第一个类的功能类似,多了定时刷新功能,允许在不重启系统的情况下,更新资源的信息

    StaticMessageSource

    它允许通过编程的方式提供国际化信息,一会我们可以通过这个来实现db中存储国际化信息的功能。

    使用Spring6国际化

    第一步 创建资源文件

    国际化文件命名格式:基本名称 _ 语言 _ 国家.properties

    {0},{1}这样内容,就是动态参数

    在这里插入图片描述

    (1)创建test_en_US.properties

    www.test.com=welcome {0},时间:{1}
    
    • 1

    (2)创建test_zh_CN.properties

    www.test.com=欢迎 {0},时间:{1}
    
    • 1

    第二步 创建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>test</value>
                </list>
            </property>
            <property name="defaultEncoding">
                <value>utf-8</value>
            </property>
        </bean>
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    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[]{"atguigu",new Date().toString()};
    
            //www.test.com为资源文件的key值,
            //objs为资源文件value值所需要的参数,Local.CHINA为国际化为语言
            String str=context.getMessage("www.test.com", objs, Locale.CHINA);
            System.out.println(str);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
  • 相关阅读:
    MySQL双主一从高可用
    【SpringCloud负载均衡】【源码+图解】【一】LoadBalancer的HelloWorld体验
    latex公式写法
    爬虫ip给数据抓取带来了哪些便利?
    Openpyxl笔记
    elasticsearch es explain 用法,分析得分 score 情况
    设备管理团队如何做好停机维护工作_基于PreMaint设备数字化平台
    26.Xaml Menu控件---->菜单控件 (手动创建菜单,命令,Icon,快捷键)
    海康Visionmaster-全局脚本:通过全局脚本获取通讯输 入的参数并赋值给全局变量
    npm私有云
  • 原文地址:https://blog.csdn.net/Don_t_always_ail/article/details/133918045