Java国际化:概述
对Java应用程序进行国际化通常意味着使该应用程序能够处理多种语言,数字格式,日期格式等。本文为我们提供了这些方面的概述。
基本上,应用程序应该能够处理国际输入,输出和操作。换句话说,应用程序应该能够适应特定于不同位置和用户首选项的输入,输出和操作。
输入和输出是应用程序需要处理的粗粒度分类。以下是应用程序需要涵盖的一些问题:
处理国际输入
输入是应用程序直接从用户界面接收,通过服务调用(例如SOAP或者REST调用)发送给用户,从文件等导入的所有信息。输入包括:
- 表单输入,包括文本(语言+字符编码)
- 数字格式
- 日期和时间格式及计算
- 收到文件
- 接到服务电话
处理国际输出
输出是应用程序在安装过程中或者常规使用过程中显示或者发送给用户的所有内容。输出包括:
- 文字(语言+字符编码)
- 数字和货币格式
- 日期和时间格式与计算
- 字符比较
- 字符串比较
应用程序需要能够处理多少个方面取决于应用程序。
请记住,如果用户可以让应用程序以他们自己的语言向他们显示文本等,他们可能还希望支持,发送给他们的电子邮件,论坛,帮助文本等都以他们自己的语言显示。
适应运营
除了适应输入和输出,应用程序可能还需要根据用户的位置和偏好来适应某些内部操作。例如,根据买家所居住的国家/地区,网上商店可能需要向销售中添加不同数量的增值税。投资计算器可能必须考虑不同的法律和税率等。
需要的用户信息
为了将应用程序正确地本地化为用户,我们可能需要以下一项或者多项:
- 首选语言
- 居住国家
- 当前位置
- 首选时区
用户应该能够说出他或者她更喜欢该应用程序使用的语言。不要仅仅假设居住在给定国家/地区的用户想要将应用程序本地化为该语言。例如,我来自丹麦,但我更喜欢应用程序使用英语,因此我可以与世界各地的人们讨论其函数,而无需翻译函数名称等。让用户自行决定。
用户的居住国家/地区可能会影响用户可以使用哪些函数以及这些函数的工作方式。例如,YouTube禁止任何人成为YouTube合作伙伴。只有居住在某些国家/地区的用户才能加入该计划。
对于某些应用程序,尤其是对于所有基于位置的应用程序,当前位置可能很有趣。该应用可以基于用户位置采取行动。
某些应用程序(例如共享日历)可能需要知道用户的时区才能正常工作。使用者所在国家/地区的几点钟是几点?例如,在该时区的几点钟是应用服务器正在运行?用户是否暂时不在该国家/地区并且需要在该临时位置的时区中显示所有约会?
应用程序国际化层
为了处理输入和输出的国际化,应用程序将具有一种国际化层。
国际化层负责在用户语言和格式以及应用程序内部使用的语言和格式之间进行转换。例如,字符串以UTF-16的形式保存在JVM的内存中。国际化层应将输入的任何字符编码(ascii,UTF-8等)转换为UTF-16.
国际化层可能看起来不像位于应用程序内部和外部组件之间的抽象层。相反,它很可能是对能够进行转换和翻译的国际化组件的一组API调用。应用程序中接收输入数据的层将调用此国际化API,并将转换后的值传递给核心操作。
为了正确转换输入数据,国际化层必须收集有关用户的必要信息。即,输入数据的语言,字符编码,数字格式,日期格式,时区转换等。
当应用程序需要输出数据时,该过程是相似的。应用程序决定要输出的内容,并调用国际化层以将输出转换为适合用户的格式。这又包括语言,字符编码,数字格式,日期格式,时区转换等。
发生的事情是这样的:
- 输入(事件或者请求)到达应用程序中的输入处理程序(事件处理程序/请求处理程序)。
- 输入处理程序确定本地化所需的用户设置。
- 输入处理程序调用I18n组件以获得本地化的文本,数字,日期等。
- 输入处理程序调用应用程序操作。如果需要用户首选项来执行操作,则将它们传递给应用程序操作。
应用程序的国际化可能与此有所不同。不用担心。这里没有对与错的设计。
为什么要使用国际化组件?
我们拥有国际化层或者组件的原因是要将国际化代码与应用程序的其余部分分开。我们可以选择使用Java的内置国际化函数,也可以使用ICU4J之类的其他API。通过将国际化代码封装在" I18n"组件中,我们可以更改其中使用的API,而不会影响应用程序的其余部分。
Java的国际化类
Java具有一组内置类,可以处理应用程序的国际化。这些类是:
类 | 描述 |
Locale | Locale类代表一种语言以及一个国家或者地区。 Locale也可能代表某种类型的格式,例如日期或者数字格式。 |
ResourceBundle | ResourceBundle 类可以包含本地化的文本或者组件(对象)。我们可以为特定的“语言环境”获取“ ResourceBundle” ,从而获得本地化为该“语言环境”的文本或者对象。 |
NumberFormat | NumberFormat 类用于根据特定的Locale 格式化数字。 |
DecimalFormat | |
DateFormat | DateFormat 类用于根据特定的Locale 格式化日期。 |
SimpleDateFormat | SimpleDateFormat 类用于根据自定义格式模式解析日期并设置日期格式。这些模式也对“语言环境”敏感。 |