Java/JSP界面实现多国语言支持,支持插入变量,还要考虑名词单复数

在Java/JSP中,通常使用.properties文件定义各语言的文本,里面可以用{0},{1},{2}表示待插入的变量值(之所以用数字,不用%s、%d等占位符,是因为不同语言的语序不同)。
用java.util.ResourceBundle类的ResourceBundle.getBundle方法读取.properties文件。
用java.text.MessageFormat类替换{0},{1},{2}等占位符。在字符串中,{和}字符本身用'{和'}表示(在前面加单引号),单引号本身用双单引号''表示。
用java.text.ChoiceFormat实现名词单复数的功能。中文没有名词的数的概念,但英语分单复数,阿拉伯语的名词还分为单数、双数和复数。
默认情况下,Java里面中文数字是有千分隔符的,但我们中国人的真实习惯是不显示千分隔符。需要在NumberFormat类里面用setGroupingUsed(false)关闭千分隔符的显示。
这几个类都是Java默认支持的类,不需要额外导入其他jar包。

第一节 在文本中替换变量占位符,并处理名词单复数

import java.text.ChoiceFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class Test {

	public static void main(String[] args) {
		test(getChineseMessage());
		test(getEnglishMessage());
	}
	
	public static MessageFormat getChineseMessage() {
		// 中文没有单复数
		MessageFormat msgfmt = new MessageFormat("{1}有{0}个文件。");
		NumberFormat nf = NumberFormat.getInstance(Locale.SIMPLIFIED_CHINESE);
		nf.setGroupingUsed(false); // 显示数字时不显示千分隔符
		msgfmt.setFormatByArgumentIndex(0, nf);
		return msgfmt;
	}
	
	public static MessageFormat getEnglishMessage() {
		// 英文有单复数之分
		double[] pluralRule = {0, 1, ChoiceFormat.nextDouble(1)};
		String[] choices = {"are no files", "is one file", "are {0} files"};
		
		MessageFormat msgfmt = new MessageFormat("There {0} on {1}.");
		ChoiceFormat cf = new ChoiceFormat(pluralRule, choices);
		msgfmt.setFormatByArgumentIndex(0, cf);
		return msgfmt;
	}
	
	public static void test(MessageFormat msgfmt) {
		Object[] values = {1, "A"};
		String str = msgfmt.format(values);
		System.out.println(str);
		
		values = new Object[] {1.01, "B"};
		str = msgfmt.format(values);
		System.out.println(str);
		
		values[0] = 12345;
		str = msgfmt.format(values);
		System.out.println(str);
		
		values[0] = 0;
		str = msgfmt.format(values);
		System.out.println(str);
		
		values[0] = -1;
		str = msgfmt.format(values);
		System.out.println(str);
	}

}

程序运行结果:

A有1个文件。
B有1.01个文件。
B有12345个文件。
B有0个文件。
B有-1个文件。
There is one file on A.
There are 1.01 files on B.
There are 12,345 files on B.
There are no files on B.
There are no files on B.

第二节 从.properties文件中读取多语言文本

新建两个.properties文件:haha_en_US.properties和haha_zh_CN.properties。
这两个文件要放到src文件夹里面。

haha_en_US.properties:

test.msg = There {0} on {1}.
test.msg.c00 = are no files
test.msg.c01 = is one file
test.msg.c02 = are {0} files

haha_zh_CN.properties:

请注意在.properties文件里面,所有的汉字都需要ISO-8859-1转义。

test.msg = {1}\u6709{0}\u4E2A\u6587\u4EF6\u3002

测试代码:

import java.text.ChoiceFormat;
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.ResourceBundle;

public class Test2 {

	public static void main(String[] args) {
		// 定义参数
		Object[] values = {12345678, "A"};
		
		// 显示简体中文文本
		ResourceBundle res = ResourceBundle.getBundle("haha", Locale.SIMPLIFIED_CHINESE);
		String fmt = res.getString("test.msg");
		MessageFormat mfmt = new MessageFormat(fmt);
		NumberFormat nf = NumberFormat.getInstance(Locale.SIMPLIFIED_CHINESE);
		nf.setGroupingUsed(false); // 显示数字时不显示千分隔符
		mfmt.setFormatByArgumentIndex(0, nf);
		String str = mfmt.format(values);
		System.out.println(str);
		
		// 显示英语(美国)文本
		res = ResourceBundle.getBundle("haha", Locale.US);
		fmt = res.getString("test.msg");
		mfmt = new MessageFormat(fmt);
		double[] pluralRule = {0, 1, ChoiceFormat.nextDouble(1)}; // 0、单数、复数判定方法
		String[] fmtList0 = new String[3]; // 0、单数、复数对应的文本
		fmtList0[0] = res.getString("test.msg.c00");
		fmtList0[1] = res.getString("test.msg.c01");
		fmtList0[2] = res.getString("test.msg.c02");
		ChoiceFormat cf = new ChoiceFormat(pluralRule, fmtList0);
		mfmt.setFormatByArgumentIndex(0, cf);
		str = mfmt.format(values);
		System.out.println(str);
	}

}

程序运行结果:

A有12345678个文件。
There are 12,345,678 files on A.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/490938.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javaWeb教务查询系统

一、简介 在教育管理领域,教务管理系统是一个至关重要的工具,它能够有效地协调学校、教师和学生之间的各种活动。我设计了一个基于JavaWeb的教务管理系统,该系统包括三个角色:管理员、教师和学生。管理员拥有课程管理、学生管理、…

深度理解文件操作

目录 文件 文件名: 标准流 文件指针 文件的打开和关闭 文件的顺序读写: 使用部分 文件的打开和关闭 文件 文件分两种,第一种是程序文件,后一种是数据文件。 程序文件:包括源程序文件(后缀为.c&…

Web APIs 学习知识总结

渲染学成在线案例 html文件: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Com…

聊聊k8s服务发现的优缺点

序 本文主要研究一下使用k8s服务发现的优缺点 spring cloud vs kubernetes 这里有张spring cloud与kubernetes的对比&#xff0c;如果将微服务部署到kubernetes上面&#xff0c;二者有不少功能是重复的&#xff0c;可否精简。 这里主要是讲述一下如果不使用独立的服务发现&am…

代码学习记录28----贪心算法

随想录日记part28 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.26 主要内容&#xff1a;今天深入学习贪心算法&#xff0c;接下来是针对题目的讲解&#xff1a;1.柠檬水找零 &#xff1b;2. 根据身高重建队列&#xff1b;3.用最少数量的箭引爆气球 860.柠…

Jmeter压测实战:Jmeter二次开发之自定义函数

1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具&#xff0c;具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数&#xff0c;方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函数…

数据结构与算法分析引论1

1.解决问题的算法有很多&#xff0c;但是在输入不同的情况下&#xff0c;不同算法之间的差异也很大&#xff0c;我们总是追求一个更快、更有效的方法。比如说普通的依次查找和二分查找&#xff0c;两者的差异就很大。我们使用大O表示法来表示算法的速度。依次查找就是O(n)&…

vs右键在浏览器中查看报错

vs右键在浏览器中查看报错Visual studio 右键在浏览器中查看报错HTTP错误500.30——ANCM进程内启动失败——.NET Core HTTP Error 500.30 - ANCM In-Process Start Failure - .NET Core HTTP Error 500.30 - ANCM In-Process Start Failure Common solutions to this issue: …

Android Studio 因JDK版本导致编译报错问题处理

一、报错问题提示 Cause: com/android/tools/idea/gradle/run/OutputBuildAction has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 二、处理方…

论文阅读笔记——Rethinking Pointer Reasoning in Symbolic Execution

文章目录 前言Rethinking Pointer Reasoning in Symbolic Execution12.1、基本情况概述12.2、摘要12.3、引言12.4、方法12.4.1、基本版本12.4.1.1、内存加载和存储12.4.1.2、状态合并 12.4.2、改进12.4.2.1、地址范围选择12.4.2.2、内存清理12.4.2.3、符号化的未初始化内存12.4…

从汇编以及栈帧层面理解内联函数的原理

宏太复杂&#xff0c;所以弄出内联&#xff0c;内联适合小函数&#xff0c;把函数连到程序里面&#xff0c;这样就直接用&#xff0c;不需要调用&#xff0c;但是它占用空间。 C推荐 const和enum替代宏常量 inline去替代宏函数 宏缺点&#xff1a; 1、不能调试 2、没有类型安…

RHCE实验-建立NFS服务器,使的客户端顺序共享数据

第一步&#xff1a;服务端及客户端的准备工作 # 恢复快照[rootserver ~]# setenforce 0​[rootserver ~]# systemctl stop firewalld​[rootserver ~]# yum install nfs-utils -y # 服务端及客户端都安装 第二步&#xff1a;服务端建立共享文件目录&#xff0c;并设置权限…

ClickHouse06-ClickHouse中基础的增删改查

使用数据库&#xff0c;最基础的学习都是增、删、改、查&#xff0c;然后才会去了解基础函数和高阶函数&#xff0c;今天就来看看大火的 ClickHouse 中简单的增删改查怎么写&#xff1f; 创建数据库&#xff1a;create database创建表格&#xff1a;create table修改表格&…

反射率光纤光谱仪检测汽车后视镜反射率

反射率光纤光谱仪是一种用于测量材料表面反射率的精密仪器&#xff0c;它通过光纤传输光信号&#xff0c;并利用光谱仪进行分析&#xff0c;以确定材料的光学特性。反射率光纤光谱仪的工作原理基于相对反射率的计算&#xff0c;它涉及到光源、光纤、光谱仪等关键组件。 后视镜能…

深入了解服务器硬件:从基础知识到实际应用

在当今数字化的社会中&#xff0c;服务器扮演着至关重要的角色&#xff0c;它们是支撑互联网、云计算、大数据等技术发展的基石。而理解服务器硬件的基础知识对于从事IT领域的人员来说至关重要。本文将从服务器硬件的基础知识出发&#xff0c;介绍服务器硬件的组成、作用及其在…

【笔记】OpenHarmony设备开发:搭建开发环境(Ubuntu 20.04,VirtualBox 7.0.14)

参考&#xff1a;搭建开发环境&#xff08;HarmonyOS Device&#xff09; Note&#xff1a;Windows系统虚拟机中Ubuntu系统安装完成后&#xff0c;根据指导完成Ubuntu20.04基础环境配置&#xff08;HarmonyOS Connect 开发工具系列课&#xff09; 系统要求 Windows系统要求&…

刷题日记——济南大学机试

折戟厦大&#xff0c;考虑调剂济南大学&#xff0c;但是更想去的是杭师大&#xff0c;还是刷题&#xff0c;济南大学比厦门大学题目简单很多&#xff0c;因此一篇文章不多分析&#xff0c;直接给出代码&#xff0c;全部采用纯C语言编写并且AC&#xff0c;不用C的stl库。 争取今…

CentOS Stream 8系统配置阿里云YUM源

Linux运维工具-ywtool 目录 一.系统环境二.修改yum文件2.1 CentOS-Stream-AppStream.repo2.2 CentOS-Stream-BaseOS.repo2.3 CentOS-Stream-Extras.repo 三.只有一个配置文件四.其他知识4.1 如果想要启用其他源,修改文件配置:enabled14.2 国内源链接 一.系统环境 CentOS Strea…

DevSecOps平台架构系列-微软云Azure DevSecOps平台架构

目录 一、概述 二、Azure DevOps和黄金管道 2.1 概述 2.2 Azure DevOps架构说明 2.2.1 架构及管道流程图 2.2.2 架构内容 2.2.2.1 Azure Boards 2.2.2.2 Azure Repos 2.2.2.3 Azure Test Plans 2.2.2.4 Azure Pipelines 2.2.2.5 Azure Application Insights 2.2.2.6…

论文阅读---VITC----Early Convolutions Help Transformers See Better

论文题目&#xff1a;Early Convolutions Help Transformers See Better 早期的卷积网络帮助transformers性能提升 vit 存在不合格的可优化性&#xff0c;它们对优化器的选择很敏感。相反现代卷积神经网络更容易优化。 vit对优化器的选择[40](AdamW [27] vs. SGD)&#xff0…