首页 > 其他分享 >当resource bundle 的多语言文件里包含引号'时

当resource bundle 的多语言文件里包含引号'时

时间:2022-11-23 00:24:30浏览次数:49  
标签:resource 引号 bundle properties getMessage zh hello 你好

背景

项目中使用Spring的ReloadableResourceBundleMessageSource这个类来实现多语言,有一次字符串里包含引号'时,解析时出了问题,一起来看一下吧

例子

resources下包含三个语言文件

分别是:
bundle_zh_CN.properties
hello=你好吗?{0}

bundle_zh_TW.properties
hello=你好嗎?{0}

bundle_en.properties
hello=how are you ? {0}
测试类:
public class Main {
    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println(getMessage("hello", new Object[] {"辉"}, Locale.CHINA));
        System.out.println(getMessage("hello", new Object[] {"輝"}, Locale.TRADITIONAL_CHINESE));
        System.out.println(getMessage("hello", new Object[] {"hui"}, Locale.ENGLISH));
    }

    public static String getMessage(String code, Object[] args, Locale locale) {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
        messageSource.setBasename("bundle");
        messageSource.setCacheSeconds(1800);
        return messageSource.getMessage(code, args, locale);
    }
}

输出:
你好吗?辉
你好嗎?輝
how are you ? hui

可以看出没什么问题

如果含有引号'

改成:
bundle_zh_CN.properties
hello=你好'吗?{0}

bundle_zh_TW.properties
hello=你好'嗎?{0}

bundle_en.properties
hello=how are' you ? {0}
输出结果:
你好吗?{0}
你好嗎?{0}
how are you ? {0}

可以看出如果含有引号',参数不起作用,而且引号'也没显示出来

原因

MessageFormat messageFormat = resolveCode(code, locale);
if (messageFormat != null) {
	synchronized (messageFormat) {
		return messageFormat.format(argsToUse);
	}
}

追踪源码,底层是由Java底层的MessageFormat来实现的

API中解释如下:
Within a String, a pair of single quotes can be used to quote any arbitrary characters except single quotes. 
For example, pattern string "'{0}'" represents string "{0}", not a FormatElement. 
A single quote itself must be represented by doubled single quotes '' throughout a String. 
For example, pattern string "'{''}'" is interpreted as a sequence of '{ (start of quoting and a left curly brace), '' (a single quote), and }' (a right curly brace and end of quoting), not '{' and '}' (quoted left and right curly braces): representing string "{'}", not "{}".

Any unmatched quote is treated as closed at the end of the given pattern. For example, pattern string "'{0}" is treated as pattern "'{0}'".

大概意思就是:
- 两个单引号里面的值保持不变,不会被格式化
- 如果想输出单引号,使用两个单引号'' 来输出单引号'
- 如果只有一个单引号,那么单引号后面的值就原封不动的输出来,即不会被格式化

修改

改成:
bundle_zh_CN.properties
hello=你好''吗?{0}

bundle_zh_TW.properties
hello=你好''嗎?{0}

bundle_en.properties
hello=how are'' you ? {0}

输出结果:
你好'吗?辉
你好'嗎?輝
how are' you ? hui
还有一点需要注意的就是:在没有参数的情况下,如果想输出引号,那就用一个引号即可,如下:
bundle_zh_CN.properties
hello=你好'吗?

bundle_zh_TW.properties
hello=你好'嗎?

bundle_en.properties
hello=how are' you ?
public static void main(String[] args) throws UnsupportedEncodingException {
    System.out.println(getMessage("hello", null, Locale.CHINA));
    System.out.println(getMessage("hello", null, Locale.TRADITIONAL_CHINESE));
    System.out.println(getMessage("hello", null, Locale.ENGLISH));
}

输出:
你好'吗?
你好'嗎?
how are' you ?

标签:resource,引号,bundle,properties,getMessage,zh,hello,你好
From: https://www.cnblogs.com/eaglelihh/p/16916945.html

相关文章

  • 【深入浅出 Yarn 架构与实现】4-1 ResourceManager 功能概述
    前面几篇文章对Yarn基本架构、程序基础库、应用设计方法等进行了介绍。之后几篇将开始对Yarn核心组件进行剖析。ResourceManager(RM)是Yarn的核心管理服务,负责集群管......
  • @Autowired和@Resource区别
    autowired和resource是什么?@Autowired是Spring中的注解importorg.springframework.beans.factory.annotation.Autowired;@Resource是java提供的注解importjavax......
  • 【unity】AssetBundle
    前言学xlua前应该要会打AB包。现在来补充一下有关AB包的使用。AssetBundle这里有一篇博客讲得很好,指路->【Unity框架】基于XLua框架搭建与AssetBundle的使用流程,不过仍......
  • Android错误之--Error retrieving parent for item: No resource found that matches
    改正错误(虽然内容较少,但是还是选择单独占用一篇)这个错误,可以说是困扰了我好久,然后就看到可以改变一下使用的Android版本,改成Android4.0,然后就去试了试,发现真的就好了耶!......
  • fastdfs上传图片后浏览器访问报错Failed to load resource: net::ERR_SSL_PROTOCOL_ER
      最近在学习fastdfs时遇到了一个困扰我数小时的问题,结果很感人,特在此记录下来,也是为了让其他小伙伴们避坑  (这里我的fastdfs运行环境是在docker中)事情是这样的,用......
  • nexus-2.14.2-01-bundle构建maven私服
    nexus-2.14.2-01-bundle构建maven私服一、下载nexus地址:​​https://sonatype-download.global.ssl.fastly.net/repository/repositoryManager/oss/nexus-2.14.8-01-bundle.......
  • 高级调度-Resourcequota-limitRange
    十二章:高级调度准入控制1.为什么生产一定要用ResourceQuota资源配额ResourceQuota2.1ResourceQuota配置#catresource.yaml==================================......
  • MAUI新生1.5-XAML语法基础:资源字典ResourceDictionary
    每个派生自VisualElement或Application的对象,都有一个Resources属性,属性值为Dictionary<string,object>类型的集合对象,这些集合对象可作为资源,提供给元素及其在控件树中的......
  • 使用try-with-resources来关闭资源
    接触JAVA比较久的朋友都知道,如果要关闭java类库中资源,需要手动调用close方法,比如InputStream,OutputStream,Connection等。自从JDK7开始,java提供了通过try-with-resources语......
  • NSBundle
    1、简介在iOS中提到的NSBundle是文件系统中的一个特殊位置,它存放的是应用可执行文件及相关资源文件。这个位置的所有文件在系统运行时只具有可读或者可执行的权限,不......