page.title=Ngôn ngữ và Bản địa page.tags=androidn page.image=images/cards/card-nyc_2x.jpg @jd:body

Trong tài liệu này:

  1. Thử thách phân giải tài nguyên ngôn ngữ
  2. Các cải tiến đối với Chiến lược phân giải tài nguyên
  3. Thiết kế ứng dụng để hỗ trợ các bản địa bổ sung

Android N cung cấp hỗ trợ cải tiến cho người dùng sử dụng nhiều ngôn ngữ, cho phép họ chọn nhiều bản địa trong phần cài đặt. Android N cung cấp khả năng này bằng cách mở rộng số lượng lớn các bản địa được hỗ trợ và thay đổi cách hệ thống phân giải tài nguyên. Phương thức phân giải tài nguyên mới hoạt động mạnh mẽ hơn và được thiết kế để tương thích với các tệp APK có sẵn. Tuy nhiên bạn cần kiểm tra thêm để phát hiện mọi hành vi không mong muốn. Ví dụ, bạn cần kiểm thử để đảm bảo rằng ứng dụng của mình sẽ thiết lập mặc định cho ngôn ngữ mong muốn. Ngoài ra, nếu ứng dụng của bạn hỗ trợ đa ngôn ngữ thì bạn cần đảm bảo rằng việc hỗ trợ này hoạt động như dự kiến. Cuối cùng, bạn cần cố gắng đảm bảo rằng ứng dụng sẽ xử lý tinh tế những ngôn ngữ mà bạn không có ý định thiết kế ứng dụng để hỗ trợ.

Tài liệu này sẽ bắt đầu bằng việc giải thích về chiến lược phân giải tài nguyên trong phiên bản trước Android N. Tiếp theo, tài liệu sẽ mô tả chiến lược phân giải tài nguyên được cải tiến của Android N. Cuối cùng, tài liệu sẽ giải thích cách sử dụng số lượng các bản địa được mở rộng để hỗ trợ thêm nhiều người dùng đa ngữ.

Thử thách phân giải tài nguyên ngôn ngữ

Trước Android N, không phải lúc nào Android cũng có thể so khớp thành công ứng dụng với các bản địa của hệ thống. Ví dụ, giả sử ngôn ngữ mặc định của ứng dụng của bạn là Tiếng Anh (Mỹ) nhưng ứng dụng cũng có các xâu văn bản Tiếng Tây Ban Nha được bản địa hóa trong các tệp tài nguyên {@code es_ES} .

Khi mã nguồn Java tham chiếu đến các xâu đó thì nó sẽ phân giải các ngôn ngữ của xâu như sau:

Các vấn đề phân giải này phát sinh bởi vì hệ thống sẽ gỡ mã quốc gia khỏi bản địa nếu nó không tìm thấy sự trùng khớp tuyệt đối. Ví dụ:

Bảng 1. Phân giải tài nguyên không có trùng khớp bản địa tuyệt đối.

Cài đặt Người dùng Tài nguyên Ứ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 được
Thử fr => Không được
Sử dụng mặc định (en)

Trong ví dụ này, hệ thống hiển thị các xâu Tiếng Anh mà không xác định được liệu người dùng có biết Tiếng Anh hay không. Đây là hành vi khá phổ biến ngày nay. Android N cần phải giảm bớt đáng kể tần suất của những kết quả như vậy.

Các cải tiến đối với Chiến lược phân giải tài nguyên

Android N mang đến cách thức phân giải tài nguyên mạnh mẽ hơn, và tìm các giải pháp thay thế hiệu quả hơn một cách tự động. Tuy nhiên, để tăng tốc việc phân giải và nâng cao khả năng bảo trì, bạn cần lưu trữ các tài nguyên trong những nhánh ngôn ngữ mẹ phổ biến nhất. Ví dụ, nếu trước đây lưu tài nguyên Tiếng Tây Ban Nha trong thư mục {@code es-US} thì hãy chuyển chúng vào trong thư mục {@code es-419}, nơi chứa Tiếng Tây Ban Nha Mỹ La-tinh. Tương tự, nếu bạn có các xâu tài nguyên trong một thư mục có tên {@code en-GB} thì hãy đổi tên thư mục đó thành {@code en-001} (Tiếng Anh quốc tế) bởi vì nhánh mẹ phổ biến nhất cho chuỗi en-GB là {@code en-001}. Các ví dụ sau sẽ giải thích tại sao các thực hành này sẽ nâng cao hiệu năng và độ ổn định của việc phân giải tài nguyên.

Các ví dụ về phân giải tài nguyên

Với Android N, trường hợp được mô tả trong Bảng 1 được phân giải theo cách khác:

Bảng 2. Một chiến lược phân giải cải tiến khi không có trùng khớp bản địa tuyệt đối.

Cài đặt Người dùng Tài nguyên Ứ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 được
Thử fr => Không được
Thử nhánh con của fr => fr_FR
Sử dụng fr_FR

Bây giờ thì người dùng sẽ nhận được tài nguyên Tiếng Pháp thay vì Tiếng Anh. Ví dụ này cũng cho thấy lý do bạn nên lưu trữ các xâu Tiếng Pháp trong {@code fr} thay vì {@code fr_FR} cho Android N. Phương pháp ở đây là ghép nhánh ngôn ngữ mẹ gần nhất, giúp cho việc phân giải nhanh hơn và dễ dự đoán hơn.

Ngoài lôgic phân giải được cải tiến này, Android giờ đây cung cấp thêm nhiều ngôn ngữ cho người dùng lựa chọn. Chúng ta hãy thử lại ví dụ trên với Tiếng Ý được xác định là một ngôn ngữ người dùng bổ sung nhưng không được ứng dụng hỗ trợ cho Tiếng Pháp.

Bảng 3. Phân giải tài nguyên khi ứng dụng chỉ khớp với cài đặt bản địa được ưu tiên thứ hai của người dùng.

Cài đặt Người dùng Tài nguyên Ứ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 được
Thử fr => Không được
Thử nhánh con của fr => Không được
Thử it_CH => Không được
Thử it => Không được
Thử nhánh con của it => it_IT
Sử dụng it_IT

Người dùng vẫn nhận được ngôn ngữ họ biết mặc dù ứng dụng không hỗ trợ Tiếng Pháp.

Thiết kế ứng dụng để hỗ trợ các bản địa bổ sung

API LocaleList

Android N bổ sung thêm một API {@code LocaleList.GetDefault()} mới 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 ứng dụng phức tạp hơn và hiển thị nội dung được tối ưu hóa tốt hơn. Ví dụ, Tìm kiếm có thể hiển thị các kết quả bằng nhiều ngôn ngữ dựa trên cài đặt của người dùng. Các ứng dụng trình duyệt có thể tránh đề nghị dịch trang web sang một ngôn ngữ mà người dùng đó đã biết, và các ứng dụng bàn phím có thể tự động bật tất cả các bố trí phù hợp.

Bộ định dạng

Tính tới Android 6.0 (API mức 23), Android 6.0 chỉ hỗ trợ một hoặc hai bản địa cho nhiều ngôn ngữ phổ biến (en, es, ar, fr, ru). Bởi vì chỉ có một vài biến thể của từng ngôn ngữ, các ứng dụng không gặp vấn đề gì với việc lưu trữ một số chữ số và ngày tháng dưới dạng xâu được chèn trực tiếp khi viết mã trong các tệp tài nguyên. Tuy nhiên, với tập hợp mở rộng các bản địa được hỗ trợ bởi Android, có thể có nhiều khác biệt lớn về các định dạng ngày tháng, thời gian, tiền tệ và thông tin tương tự ngay cả trong một bản địa. Chèn trực tiếp các định dạng có thể khiến người dùng cuối bối rối. Do đó, khi phát triển cho Android N hãy đảm bảo sử dụng các bộ định dạng thay vì các xâu chữ số và ngày tháng được chèn trực tiếp khi viết mã.

Một ví dụ điển hình là Tiếng Ả-rập với được Android N hỗ trợ mở rộng từ một {@code ar_EG} tới 27 bản địa Tiếng Ả-rập. Các bản địa này có thể chia sẻ hầu hết các tài nguyên, nhưng một số bản địa ưu tiên chữ số ASCII trong khi những bản địa khác lại ưu tiên con số truyền thống. Ví dụ, khi bạn muốn soạn một câu có biến bằng số, như "Choose a 4 digit pin" thì bạn hãy sử dụng bộ định dạng như sau:

 format(locale, "Choose a %d-digit PIN", 4)