zoukankan      html  css  js  c++  java
  • 9、SpringBoot-CRUD国际化

    1)、编写国际化配置文件;

    2)、使用ResourceBundleMessageSource管理国际化资源文件
    3)、在页面使用fmt:message取出国际化内容

     步骤:

    1)、编写国际化配置文件,抽取页面需要显示的国际化

    文件内容:

    2)、使用thymeleaf的语法去引用(jsp是fmt)

    <form class="form-signin" action="dashboard.html">
       <img class="mb-4" src="asserts/img/bootstrap-solid.svg" alt="" width="72" height="72">
       <h1 class="h3 mb-3 font-weight-normal" th:text="#{index_top}">Please sign in</h1>
       <label class="sr-only">Username</label>
       <input type="text" class="form-control" th:placeholder="#{index_Username}" placeholder="Username" required="" autofocus="">
       <label class="sr-only">Password</label>
       <input type="password" class="form-control" th:placeholder="#{index_password}" placeholder="Password" required="">
       <div class="checkbox mb-3">
          <label>
            <input type="checkbox" value="remember-me"> [[#{index_rember}]]
          </label>
       </div>
       <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
       <p class="mt-5 mb-3 text-muted"2017-2018</p>
       <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
       <a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
    </form>

    效果是根据浏览器的语言设置进行国际化的显示

    3)运行查看

    系统为英文

    系统语言选择中文:

     

    SpringBoot自动配置好了管理国际化资源文件的组件

     

    @Configuration
    @ConditionalOnMissingBean(
        value = {MessageSource.class},
        search = SearchStrategy.CURRENT
    )
    @AutoConfigureOrder(-2147483648)
    @Conditional({MessageSourceAutoConfiguration.ResourceBundleCondition.class})
    @EnableConfigurationProperties
    public class MessageSourceAutoConfiguration {
        private static final Resource[] NO_RESOURCES = new Resource[0];
    
        public MessageSourceAutoConfiguration() {
        }
    
        @Bean
        @ConfigurationProperties(
            prefix = "spring.messages"
        )
        public MessageSourceProperties messageSourceProperties() {
            return new MessageSourceProperties();
        }
    
        @Bean
        public MessageSource messageSource(MessageSourceProperties properties) {
            //管理国际化的
            ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
            if (StringUtils.hasText(properties.getBasename())) {
                ////设置国际化资源文件的基础名(去掉语言国家代码的)
                messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
            }
    
            if (properties.getEncoding() != null) {
                messageSource.setDefaultEncoding(properties.getEncoding().name());
            }
    
            messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
            Duration cacheDuration = properties.getCacheDuration();
            if (cacheDuration != null) {
                messageSource.setCacheMillis(cacheDuration.toMillis());
            }
    
            messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
            messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
            return messageSource;
        }
    
        protected static class ResourceBundleCondition extends SpringBootCondition {
            private static ConcurrentReferenceHashMap<String, ConditionOutcome> cache = new ConcurrentReferenceHashMap();
    
            protected ResourceBundleCondition() {
            }
    
            public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
                ////我们的配置文件可以直接放在类路径下叫messages.properties
                String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");
                ConditionOutcome outcome = (ConditionOutcome)cache.get(basename);
                if (outcome == null) {
                    outcome = this.getMatchOutcomeForBasename(context, basename);
                    cache.put(basename, outcome);
                }
    
                return outcome;
            }
    
            private ConditionOutcome getMatchOutcomeForBasename(ConditionContext context, String basename) {
                Builder message = ConditionMessage.forCondition("ResourceBundle", new Object[0]);
                String[] var4 = StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(basename));
                int var5 = var4.length;
    
                for(int var6 = 0; var6 < var5; ++var6) {
                    String name = var4[var6];
                    Resource[] var8 = this.getResources(context.getClassLoader(), name);
                    int var9 = var8.length;
    
                    for(int var10 = 0; var10 < var9; ++var10) {
                        Resource resource = var8[var10];
                        if (resource.exists()) {
                            return ConditionOutcome.match(message.found("bundle").items(new Object[]{resource}));
                        }
                    }
                }
                return ConditionOutcome.noMatch(message.didNotFind("bundle with basename " + basename).atAll());
            }
            private Resource[] getResources(ClassLoader classLoader, String name) {
                String target = name.replace('.', '/');
    
                try {
                    return (new PathMatchingResourcePatternResolver(classLoader)).getResources("classpath*:" + target + ".properties");
                } catch (Exception var5) {
                    return MessageSourceAutoConfiguration.NO_RESOURCES;
                }
            }
        }
    }

     

    容器中没有就使用默认的

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(
        prefix = "spring.mvc",
        name = {"locale"}
    )
    public LocaleResolver localeResolver() {
        if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
            return new FixedLocaleResolver(this.mvcProperties.getLocale());
        } else {
            AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
            localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
            return localeResolver;
        }
    }

     原理:

    国际化的Local(区域信息对象);LocalResolver(获取区域信息对象)

    public class MyLocaleResolver implements LocaleResolver {
    
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            String l = request.getParameter("l");
            Locale locale = Locale.getDefault();
            if(!StringUtils.isEmpty(l)){
                String[] split = l.split("_");
                locale = new Locale(split[0],split[1]);
            }
            return locale;
        }
        @Override
        public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
            resolveLocale(httpServletRequest);
        }
    

    加入容器

    @Bean(name="localeResolver")
    public LocaleResolver MyLocaleResolver(){
        return  new MyLocaleResolver();
    }

     值得一说的是

    @Bean()
    public LocaleResolver localeResolver(){
        return  new MyLocaleResolver();
    }

     LocaleResolver 如果后面不跟localeResolver的话  就需在@Bean指定name

     

    点击即可进行切换

     

  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10340563.html
Copyright © 2011-2022 走看看