本地化app(二) Unicode和国际化支持

Android利用 ICU库 CLDR项目提供Unicode和其他国际化支持。本文档对Unicode和国际化支持的讨论分为两个部分:Android 6.0(API级别23)和更低版本,以及Android 7.0(API级别24)和更高版本。

通过Android 6.0支持Unicode和国际化(API级别23)

而Android平台使用ICU和CLDR实现各种类处理拉丁文和非拉丁文拼写法,揭露类,如LocaleCharacter和许多子类 java.text。一个应用程序,除了暴露的类之外的国际化功能,并通过Android 6.0(API级别23)定位平台版本,必须在其APK中包含ICU库。

版本

Android平台的连续版本对应于较新版本的ICU(以及相应的CLDR和Unicode版本)。表1显示了通过Android 6.0(API级别23)的这种对应关系。

表1.通过Android 6.0使用的ICU和CLDR版本(API级别23)。

平台(API级别)	ICU	CLDR	统一
Android 1.5-2.0(API级别3-7)	3.8	1.5	5
Android 2.2(API级别8)	4.2	1.7	5.1
Android 2.3-3.0(API级别9-13)	4.4	1.8	5.2
Android 4.0(API级别14-15)	4.6	1.9	6
Android 4.1(API级别16-17)	4.8	2.0	6
Android 4.3(API级别18)	50	22.1	6.2
Android 4.4(API级别19-20)	51	23	6.2
Android 5.0(API级别21-22)	53	25	6.3
Android 6.0(API级别23)	55.1	27.0.1	7

针对Android 7.0(API级别24)或更高级别的应用可以利用对Android框架公开的Unicode和国际化的更全面支持。本文档的下一部分提供了有关该支持的详细信息。

Android 7.0(API级别24)及更高版本中的Unicode和国际化支持

从Android 7.0(API级别24)开始,Android平台公开了ICU4J API的一个子集,供应用程序开发人员在该android.icu软件包下使用。ICU4J是一个开源的,广泛使用的Java库集,为软件应用程序提供Unicode和国际化支持。

ICU4J API使用设备上的本地化数据。因此,您可以通过不将ICU4J库编译到APK中来减少APK占用空间; 相反,你可以简单地在框架中呼唤他们。(在这种情况下,您可能希望提供 APK的多个版本,因此运行低于Android 7.0(API级别24)的Android版本的用户可以下载包含ICU4J库的应用程序版本。)

本文档首先提供有关支持这些库所需的最低Android API级别的一些基本信息。然后,它解释了您需要了解的有关ICU4J的Android特定实现的信息。最后,它告诉您如何在Android框架中使用ICU4J API。

Android上的ICU4J

Android通过android.icu软件包公开了ICU4J API的子集 ,而不是com.ibm.icu。Android框架可能会出于各种原因选择不公开ICU4J API:例如,因为API已弃用或未声明稳定。由于ICU团队将来会弃用API,Android也会将其标记为已弃用,但会继续包含它们。

以下是一些需要注意的重要事项:

  • ICU4J Android框架API不包含所有ICU4J API。
  • NDK不支持Android ICU4C。
  • Android框架中的API不会取代Android对资源本地化的支持 。
  • 在某些情况下,Android框架比ICU库支持更多字符。例如,android.text该类对表情符号的支持就是如此。

从com.ibm.icu迁移到android.icu包

如果您已在应用程序中使用ICU4J API,并且 android.icuAPI满足您的要求,则迁移到框架API需要您将Java导入更改com.ibm.icuandroid.icu。然后,您可以从APK中删除自己的ICU4J文件副本。

注意:ICU4J框架API使用android.icu 命名空间而不是com.ibm.icu。这是为了避免包含自己的com.ibm.icu库的APK中的命名空间冲突。

 

从其他Android SDK API迁移到android.icu API

javaandroid包 中的某些类与ICU4J中的类相同。但是,ICU4J通常会为标准和语言提供更广泛的支持。

表2显示了这些等效的一些示例,可帮助您入门:

表2. Android和Java ICU4J类

类	                                    备择方案
java.lang.Character	            android.icu.lang.UCharacter
java.text.BreakIterator	        android.icu.text.BreakIterator
java.text.DecimalFormat	        android.icu.text.DecimalFormat
java.util.Calendar	            android.icu.util.Calendar
android.text.BidiFormatter	    android.icu.text.Bidi
android.text.format.DateFormat	android.icu.text.DateFormat
android.text.format.DateUtils	android.icu.text.DateFormat                                                        ,                              android.icu.text.RelativeDateTimeFormatter

版本

Android平台的连续版本对应于较新版本的ICU(以及相应的CLDR和Unicode版本)。表3显示了从Android 7.0(API级别24)开始的这种对应关系。

表3. Android 7.0(API级别24)及更高版本中使用的ICU和CLDR版本。

平台(API级别) ICU CLDR 统一
Android 7.0 - 7.1(API级别24 - 25) 56 28 8
Android 8.0 - 8.1(API级别26 - 27) 58.2 30.0.3 9
Android 9(API级别28) 60.2 32.0.1 10.0

24小时/ 12小时时间格式设置

Android上的ICU没有观察用户的24小时/ 12小时时间格式设置(从中获取 )。为了观察设置,使用 或 时间格式化方法或使用ICU时间格式化模式和适当的小时模式符号('h'表示12h,'H'表示24h)以获得不同的返回值。例如,此代码将生成一个当前时间的字符串,该字符串将观察用户的12h / 24h设置:DateFormat.is24HourFormat()DateFormatDateUtilsis24HourFormat()

String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm";
String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());

许可

CU4J根据ICU许可证发布。有关详细信息,请参阅“ ICU用户指南”。

猜你喜欢

转载自blog.csdn.net/Mr_theSun/article/details/82077656
今日推荐