Kể từ Android 7.0 (API cấp 24), Android đã hỗ trợ nâng cao cho người dùng đa ngôn ngữ, cho phép người dùng chọn nhiều ngôn ngữ trong phần cài đặt. Android cung cấp chức năng này bằng cách mở rộng đáng kể số lượng ngôn ngữ được hỗ trợ và thay đổi cách hệ thống phân giải tài nguyên.
Tài liệu này bắt đầu bằng cách giải thích chiến lược phân giải tài nguyên trong các phiên bản Android thấp hơn 7.0 (API cấp 24). Tiếp theo, tài liệu này mô tả chiến lược phân giải tài nguyên được cải thiện trong Android 7.0. Cuối cùng, tài liệu này giải thích cách tận dụng số lượng ngôn ngữ mở rộng để hỗ trợ nhiều người dùng đa ngôn ngữ hơn.
Những thách thức trong việc giải quyết các tài nguyên ngôn ngữ
Trước Android 7.0, không phải lúc nào Android cũng khớp thành công các ngôn ngữ ứng dụng và ngôn ngữ hệ thống.
Ví dụ giả sử bạn rơi vào trường hợp sau:
- Ngôn ngữ mặc định của ứng dụng là
en_US
(tiếng Anh-Mỹ), và ngôn ngữ này cũng có các chuỗi tiếng Tây Ban Nha được bản địa hoá trong tệp tài nguyênes_ES
. - Một thiết bị được đặt thành
es_MX
Khi mã Java tham chiếu đến các chuỗi, hệ thống sẽ tải các chuỗi từ tệp tài nguyên (en_US
) mặc định, ngay cả khi ứng dụng có tài nguyên tiếng Tây Ban Nha được bản địa hoá theo es_ES
. Điều này là do khi không thể tìm thấy kết quả khớp chính xác, hệ thống sẽ tiếp tục tìm kiếm tài nguyên bằng cách loại bỏ mã quốc gia đó khỏi ngôn ngữ. Cuối cùng, nếu không tìm thấy kết quả trùng khớp, hệ thống sẽ chuyển về giá trị mặc định là en_US
.
Hệ thống cũng sẽ mặc định sử dụng en_US
nếu người dùng chọn ngôn ngữ mà ứng dụng hoàn toàn không hỗ trợ, chẳng hạn như tiếng Pháp. Ví dụ:
Cài đặt người dùng | Tài nguyên cho ứng dụng | Độ phân giải tài nguyên |
---|---|---|
fr_CH |
mặc định (en) de_DE es_ES fr_FR it_IT |
Thử fr_CH => Không thành công Thử fr => Không thành công Sử dụng mặc định (en) |
Trong ví dụ này, hệ thống hiển thị các chuỗi bằng tiếng Anh mà không cần biết người dùng có thể hiểu được tiếng Anh hay không. Hành vi này hiện khá phổ biến.
Cải tiến chiến lược phân giải tài nguyên
Android 7.0 (API cấp 24) mang lại khả năng phân giải tài nguyên mạnh mẽ hơn và tự động tìm các kết nối dự phòng tốt hơn.
Tuy nhiên, để tăng tốc độ phân giải và cải thiện khả năng bảo trì, bạn nên lưu trữ tài nguyên bằng phương ngữ mẹ phổ biến nhất.
Ví dụ: nếu trước đây bạn đã lưu trữ các tài nguyên tiếng Tây Ban Nha trong thư mục values-es-rUS
, hãy chuyển các tài nguyên đó vào thư mục values-b+es+419
chứa các tài nguyên tiếng Tây Ban Nha (châu Mỹ Latinh).
Tương tự như vậy, nếu bạn có các chuỗi tài nguyên trong một thư mục có tên values-en-rGB
, hãy đổi tên thư mục đó thành values-b+en+001
(Tiếng Anh quốc tế), vì thành phần mẹ phổ biến nhất cho chuỗi en-GB
là en-001
.
Các ví dụ sau đây giải thích lý do những phương pháp này giúp cải thiện hiệu suất và độ tin cậy của việc phân giải tài nguyên.
Ví dụ về phân giải tài nguyên
Với các phiên bản Android lớn hơn 7.0, trường hợp được mô tả trong Bảng 1 sẽ được giải quyết theo cách khác:
Cài đặt người dùng | Tài nguyên cho ứng dụng | Độ phân giải tài nguyên |
---|---|---|
|
mặc định (en) de_DE es_ES fr_FR it_IT |
Thử fr_CH => Không thành công Thử fr => Không thành công Thử phần tử con của fr => fr_FR Sử dụng fr_FR |
Người dùng hiện sẽ thấy các tài nguyên bằng tiếng Pháp thay vì tiếng Anh. Ví dụ này cũng cho biết lý do bạn nên lưu trữ các chuỗi bằng tiếng Pháp trong fr
thay vì fr_FR
đối với Android 7.0 trở lên. Đây là quá trình thao tác để khớp với phương ngữ mẹ gần nhất, giúp việc phân giải nhanh hơn và dễ dự đoán hơn.
Ngoài logic phân giải được cải thiện này, Android hiện còn cung cấp nhiều ngôn ngữ hơn để người dùng lựa chọn. Hãy thử lại ví dụ trên bằng tiếng Ý được chỉ định làm ngôn ngữ bổ sung cho người dùng, nhưng không có ứng dụng hỗ trợ tiếng Pháp.
Cài đặt người dùng | Tài nguyên cho ứng dụng | Độ phân giải tài nguyên |
---|---|---|
|
mặc định (en) de_DE es_ES it_IT |
Thử fr_CH => Không thành công Thử fr => Không thành công Thử phần tử con của fr => Không thành công Thử it_CH => Không thành công Thử it => Không thành công Thử phần tử con của it => it_IT Sử dụng it_IT |
Người dùng vẫn nhận được ngôn ngữ họ hiểu, mặc dù ứng dụng không hỗ trợ tiếng Pháp.
Thiết kế ứng dụng để hỗ trợ thêm ngôn ngữ
Android cung cấp các công cụ giúp bản địa hoá nội dung ứng dụng và thu hút người dùng bằng các ngôn ngữ ưu tiên của họ một cách dễ dàng hơn. Bạn nên sử dụng các kỹ thuật sau để định cấu hình ứng dụng nhằm hỗ trợ nhiều ngôn ngữ và quy ước định dạng theo cách có thể mở rộng.
Chỉ định các ngôn ngữ được ứng dụng của bạn hỗ trợ
Để đảm bảo ngôn ngữ được phân giải chính xác, hãy chỉ định những ngôn ngữ mà ứng dụng hỗ trợ bằng cách sử dụng thuộc tính resConfigs
trong tệp build.gradle
cấp mô-đun.
Mã mẫu sau đây cho biết cách sử dụng resConfigs
để biểu thị các ngôn ngữ được hỗ trợ.
Trong ví dụ này, ứng dụng hỗ trợ cả tiếng Anh lẫn tiếng Tây Ban Nha.
Groovy
android { defaultConfig { ... resConfigs "en", "es" } }
Kotlin
android { defaultConfig { ... resConfigs("en", "es") } }
API LocaleList
Kể từ Android 7.0 (API cấp 24), Android sẽ hiển thị API LocaleList.getDefault()
để cho phép các ứng dụng truy vấn trực tiếp danh sách các ngôn ngữ mà người dùng đã chỉ định. API này cho phép bạn tạo hành vi phức tạp hơn cho ứng dụng và hiển thị nội dung được tối ưu hoá tốt hơn. Ví dụ: tính năng Tìm kiếm có thể hiển thị kết quả bằng nhiều ngôn ngữ dựa trên chế độ cài đặt của người dùng. Các ứng dụng trình duyệt có thể tránh đề xuất việc dịch trang bằng một ngôn ngữ mà người dùng đã biết, ngoài ra ứng dụng bàn phím có thể tự động bật tất cả các bố cục phù hợp.
Bộ định dạng
Android chỉ hỗ trợ một hoặc hai ngôn ngữ miền bản địa (locale) cho nhiều ngôn ngữ phổ biến (en, es, ar, fr, ru) lên đến Android 6.0 (API cấp 23). Do chỉ có một vài biến thể của mỗi ngôn ngữ nên ứng dụng có thể không cần lưu trữ một vài số và ngày dưới dạng chuỗi được mã hoá cứng trong tệp tài nguyên. Tuy nhiên, với nhóm ngôn ngữ được hỗ trợ mở rộng của Android, có thể có sự khác biệt đáng kể về định dạng ngày, giờ, đơn vị tiền tệ và thông tin tương tự ngay cả trong một ngôn ngữ duy nhất. Việc mã hoá cứng các định dạng có thể tạo ra trải nghiệm khó hiểu cho người dùng cuối. Do đó, khi phát triển cho phiên bản Android 7.0 trở lên, hãy đảm bảo sử dụng bộ định dạng thay vì chuỗi số và ngày mã hoá cứng.
Ví dụ: Android 7.0 trở lên có hỗ trợ 27 ngôn ngữ đã bản địa hoá của tiếng Ả Rập. Các ngôn ngữ này có thể dùng chung hầu hết các tài nguyên, nhưng một số ngôn ngữ ưu tiên các chữ số ASCII hơn, trong khi một số khác lại ưu tiên các chữ số gốc. Ví dụ: khi bạn muốn tạo một câu có biến dạng chữ số, chẳng hạn như "Chọn một mã pin có 4 chữ số", hãy sử dụng bộ định dạng như sau:
format(locale, "Choose a %d-digit PIN", 4)