Hỗ trợ Unicode và quốc tế hoá

Android tận dụng thư viện ICUdự án CLDR để cung cấp dịch vụ hỗ trợ của Unicode và các quy trình quốc tế hoá khác. Nội dung thảo luận trên trang này về hỗ trợ Unicode và quốc tế hoá được chia thành hai phần: Android 6.0 (API cấp 23) trở xuống và Android 7.0 (API cấp 24) trở lên.

Hỗ trợ Unicode và quốc tế hoá qua Android 6.0 (API cấp 23)

Nền tảng Android sử dụng ICU và CLDR để triển khai nhiều lớp cho việc xử lý cả các ngôn ngữ chính thống Latinh và không phải La tinh, hiển thị các lớp như Locale, Character và nhiều lớp con của java.text . Một ứng dụng yêu cầu chức năng quốc tế hoá ngoài các lớp hiển thị và nhắm mục tiêu các phiên bản của nền tảng thông qua Android 6.0 (API cấp 23), phải bao gồm thư viện ICU.

Lập phiên bản

Các bản phát hành tiếp theo của nền tảng Android tương ứng với các phiên bản ICU mới hơn và các phiên bản CLDR và Unicode tương ứng. Bảng 1 cho thấy sự tương ứng này thông qua Android 6.0 (API cấp 23).

Bảng 1. Các phiên bản ICU và CLDR được sử dụng thông qua Android 6.0 (API cấp 23).

Nền tảng (cấp độ API) ICU CLDR Unicode
Android 1.5–2.0 (API cấp 3–7) 3.8 1.5 5.0
Android 2.2 (API cấp 8) 4.2 1.7 5.1
Android 2.3–3.0 (API cấp 9–13) 4.4 1.8 5.2
Android 4.0 (API cấp 14–15) 4.6 1.9 6.0
Android 4.1 (API cấp 16–17) 4.8 2.0 6.0
Android 4.3 (API cấp 18) 50 22.1 6.2
Android 4.4 (API cấp 19–20) 51 23 6.2
Android 5.0 (API cấp 21–22) 53 25 6.3
Android 6.0 (API level 23) 55.1 27.0.1 7.0

Khung Android cung cấp sự hỗ trợ toàn diện hơn cho Unicode và quốc tế hoá cho các ứng dụng nhắm đến Android 7.0 (API cấp 24) trở lên. Phần tiếp theo của trang này sẽ cung cấp thông tin chi tiết về sự hỗ trợ đó.

Hỗ trợ Unicode và quốc tế hoá trong Android 7.0 (API cấp 24) trở lên

Đối với Android 7.0 (API cấp 24) trở lên, nền tảng Android sẽ hiển thị một tập hợp con các API ICU4J để các nhà phát triển ứng dụng dùng trong gói android.icu. ICU4J là một nhóm thư viện Java nguồn mở, được sử dụng rộng rãi đồng thời cung cấp hỗ trợ Unicode và quốc tế hoá cho các ứng dụng phần mềm.

API ICU4J sử dụng dữ liệu bản địa hoá có trên thiết bị. Do đó, bạn có thể giảm dấu vết của ứng dụng bằng cách không biên dịch các thư viện ICU4J vào ứng dụng của mình. Thay vào đó, bạn có thể gọi các thư viện này trong khung. Nếu làm như vậy, bạn nên cung cấp nhiều phiên bản APK để người dùng sử dụng các phiên bản Android thấp hơn Android 7.0 (API cấp 24) có thể tải phiên bản ứng dụng chứa các thư viện ICU4J.

Mở đầu phần này là một số thông tin cơ bản về các cấp API Android tối thiểu cần có để hỗ trợ các thư viện này. Sau đó, tài liệu này giải thích những điều bạn cần biết về cách triển khai ICU4J dành riêng cho Android. Cuối cùng, tài liệu này sẽ hướng dẫn bạn cách sử dụng các API ICU4J trong khung Android.

ICU4J trên Android

Android sẽ hiển thị một tập hợp con các API ICU4J thông qua gói android.icu thay vì com.ibm.icu. Một số API ICU4J không được khung Android hiển thị vì các lý do như các API không được dùng nữa hoặc không được khai báo là ổn định. Vì nhóm ICU sẽ ngừng sử dụng các API trong tương lai nên Android cũng đánh dấu các API đó là không được dùng nữa, nhưng vẫn tiếp tục đưa các API đó vào.

Sau đây là một vài lưu ý:

  • API khung Android ICU4J không bao gồm tất cả các API ICU4J.
  • Các API trong khung Android không thay thế khả năng hỗ trợ của Android để bản địa hoá tài nguyên.
  • Trong một số trường hợp, khung Android hỗ trợ nhiều ký tự hơn các thư viện ICU. Ví dụ: điều này xảy ra trong trường hợp lớp android.text hỗ trợ biểu tượng cảm xúc.

Di chuyển sang gói android.icu từ com.ibm.icu

Nếu bạn đang sử dụng API ICU4J trong ứng dụng và API android.icu đáp ứng các yêu cầu của bạn, thì việc di chuyển sang API khung sẽ yêu cầu bạn thay đổi dữ liệu nhập Java từ com.ibm.icu sang android.icu. Sau đó, bạn có thể xoá bản sao tệp ICU4J của riêng mình khỏi ứng dụng.

Lưu ý: API khung ICU4J sử dụng không gian tên android.icu thay vì com.ibm.icu. Điều này nhằm tránh xung đột không gian tên trong các ứng dụng chứa thư viện com.ibm.icu của riêng ứng dụng đó.

Di chuyển sang API android.icu từ các API SDK Android khác

Một số lớp trong gói javaandroid có các lớp tương đương với các lớp được tìm thấy trong ICU4J. Tuy nhiên, phạm vi hỗ trợ của ICU4J cho các tiêu chuẩn và ngôn ngữ thường rộng hơn.

Bảng 2 cho thấy một số ví dụ về những trường hợp tương đương để giúp bạn có thể bắt đầu làm quen:

Bảng 2.Các lớp ICU4J của Android và Java

Lớp Lựa chọn thay thế
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

ICU4C trên Android

Android hiển thị một tập hợp con các API ICU4C thông qua thư viện libicu.so thay vì libicuuc.so hoặc libicui18n.so. Các API này có sẵn kể từ Android 12 (API cấp 31). Các tiêu đề NDK có sẵn kể từ bản phát hành NDK r22b. Không có API C++ nào được hiển thị trên Android NDK. Một số API C chưa có.

Lập phiên bản

Các bản phát hành tiếp theo của nền tảng Android tương ứng với các phiên bản ICU mới hơn và các phiên bản CLDR và Unicode tương ứng. Bảng 3 cho thấy sự tương ứng này từ Android 7.0 (API cấp 24).

Bảng 3. Các phiên bản ICU và CLDR được sử dụng trong Android 7.0 (API cấp 24) trở lên.

Nền tảng (cấp độ API) ICU CLDR Unicode
Android 7.0 - 7.1 (API cấp 24 - 25) 56 28 8.0
Android 8.0 - 8.1 (API cấp 26 - 27) 58.2 30.0.3 9.0
Android 9 (API cấp 28) 60.2 32.0.1 10.0
Android 10 (API cấp 29) 63.2 34 11.0
Android 11 (API cấp 30) 66.1 36 13.0
Android 12 (API cấp 31) 68.2 38.1 13.0

Chế độ cài đặt định dạng thời gian 24h/12h

ICU trên Android không tuân theo chế độ cài đặt định dạng thời gian 24h/12h của người dùng, lấy từ DateFormat.is24HourFormat(). Để tuân theo chế độ cài đặt này, hãy sử dụng các phương thức định dạng thời gian DateFormat hoặc DateUtils, hoặc sử dụng các mẫu định dạng thời gian ICU với biểu tượng mẫu giờ thích hợp ("h" cho 12 giờ, "H" cho 24 giờ) cho các giá trị trả về is24HourFormat() khác nhau. Ví dụ: mã này tạo ra một chuỗi có thời gian hiện tại tuân theo chế độ cài đặt 12h/24h của người dùng:

Kotlin

val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm"
val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton(
        skeleton,
        Locale.getDefault()).format(Date()
)

Java

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

Tính ổn định của bộ chuyển tự

Kể từ Android 10 (API cấp 29),Transliterator sẽ được cung cấp để chuyển văn bản từ định dạng này sang định dạng khác. Bộ mã chuyển tự có sẵn không ổn định trên các bản phát hành và thiết bị Android. Nhà sản xuất thiết bị có thể thêm mã chuyển tự bổ sung. Nhà phát triển phải kiểm tra các mã nhận dạng có sẵn, lấy từ Transliterator.getAvailableIDs() trước khi chuyển văn bản.

Cấp phép

ICU4J được phát hành theo giấy phép ICU. Để biết thông tin chi tiết, hãy xem Hướng dẫn sử dụng ICU.