Tổng quan về quá trình phân giải ngôn ngữ và ngôn ngữ bản địa (locale)

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ên es_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ụ:

Bảng 1. Việc phân giải tài nguyên không khớp chính xác với ngôn ngữ.

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-GBen-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:

Bảng 2. Chiến lược phân giải được cải thiện khi không có đối sánh ngôn ngữ chính xác.

Cài đặt người dùng Tài nguyên cho ứng dụng Độ phân giải tài nguyên
  1. 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
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.

Bảng 3. Việc phân giải tài nguyên khi ứng dụng chỉ khớp với chế độ cài đặt ngôn ngữ ưu tiên thứ hai của người dùng.

Cài đặt người dùng Tài nguyên cho ứng dụng Độ phân giải tài nguyên
  1. fr_CH
  2. it_CH
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")
    }
}
Do cách hệ thống xây dựng hợp nhất các tài nguyên từ ứng dụng của bạn và các phần phụ thuộc của ứng dụng đó, bạn phải chỉ định ngôn ngữ được hỗ trợ theo cách này để đảm bảo nhận được chế độ cài đặt ngôn ngữ của người dùng một cách chính xác.

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)