Các khái niệm và cách triển khai Jetpack Compose
Android chạy trên nhiều thiết bị ở nhiều khu vực. Để tiếp cận được nhiều người dùng nhất, hãy đảm bảo ứng dụng của bạn xử lý văn bản, tệp âm thanh, số, đơn vị tiền tệ và đồ hoạ theo những cách phù hợp với ngôn ngữ mà người dùng ứng dụng sử dụng.
Trang này mô tả một số phương pháp hay nhất để bản địa hoá ứng dụng Android.
Bạn cần có kiến thức cơ bản về ngôn ngữ lập trình Kotlin hoặc Java, đồng thời nắm rõ hoạt động tải tài nguyên Android, khai báo các phần tử giao diện người dùng trong XML, các điểm cần cân nhắc khi phát triển (chẳng hạn như vòng đời của activity) và các nguyên tắc chung về quốc tế hoá và bản địa hoá.
Bạn nên sử dụng khung tài nguyên Android để tách biệt các khía cạnh đã bản địa hoá của ứng dụng khỏi chức năng cốt lõi của ứng dụng càng nhiều càng tốt.
- Đặt hầu hết hoặc tất cả nội dung trên giao diện người dùng của ứng dụng vào các tệp tài nguyên, như mô tả trên trang này và trong phần Tổng quan về tài nguyên ứng dụng.
- Mặt khác, hành vi của giao diện người dùng được điều khiển bằng mã dựa trên Kotlin hoặc Java. Ví dụ: nếu người dùng nhập dữ liệu cần được định dạng hoặc sắp xếp khác nhau tuỳ theo ngôn ngữ, thì bạn sẽ sử dụng Kotlin hoặc ngôn ngữ lập trình Java để xử lý dữ liệu theo phương thức lập trình. Trang này không đề cập đến cách bản địa hoá mã dựa trên Kotlin hoặc Java.
Để được hướng dẫn ngắn gọn về cách bản địa hoá các chuỗi trong ứng dụng, hãy xem phần Hỗ trợ nhiều ngôn ngữ và văn hoá.
Sử dụng tài nguyên để bản địa hoá
Phần này trình bày cách tạo tài nguyên mặc định cũng như các tài nguyên thay thế. Ngoài ra, cách tài nguyên được chỉ định mức độ ưu tiên và cách bạn tham chiếu đến tài nguyên trong mã cũng được diễn giải trong phần này.
Tạo các tài nguyên mặc định
Đặt văn bản mặc định của ứng dụng trong res/values/strings.xml. Đối với những chuỗi này, hãy sử dụng ngôn ngữ mặc định – ngôn ngữ mà bạn dự kiến hầu hết người dùng ứng dụng đều sử dụng.
Tập hợp tài nguyên mặc định cũng bao gồm mọi bố cục cũng như đối tượng có thể vẽ mặc định, đồng thời có thể bao gồm các loại tài nguyên khác như ảnh động. Những tài nguyên này nằm trong các thư mục sau:
res/drawable/: thư mục bắt buộc chứa ít nhất một tệp đồ hoạ cho biểu tượng của ứng dụng trên Google Playres/layout/: thư mục bắt buộc chứa tệp XML xác định bố cục mặc địnhres/anim/: bắt buộc nếu bạn có bất kỳ thư mụcres/anim-<qualifiers>nàores/xml/: bắt buộc nếu bạn có bất kỳ thư mụcres/xml-<qualifiers>nàores/raw/: bắt buộc nếu bạn có bất kỳ thư mụcres/raw-<qualifiers>nào
Mẹo: Trong mã của bạn, hãy kiểm tra từng tệp tham chiếu đến một tài nguyên Android. Hãy đảm bảo là bạn đã xác định tài nguyên mặc định cho mỗi tài nguyên. Ngoài ra, hãy đảm bảo tệp chuỗi mặc định đã hoàn chỉnh: tệp chuỗi được bản địa hoá có thể chứa một tập hợp con gồm các chuỗi, nhưng tệp chuỗi mặc định phải chứa tất cả các chuỗi.
Mẹo bản địa hoá
Hãy làm theo các mẹo sau đây khi bản địa hoá ứng dụng.
Thiết kế bố cục linh hoạt
Nếu cần sắp xếp lại bố cục để phù hợp với một ngôn ngữ nhất định, bạn có thể tạo một bố cục thay thế cho ngôn ngữ đó, chẳng hạn như res/layout-de/main.xml cho bố cục tiếng Đức. Tuy nhiên, việc này có thể khiến ứng dụng của bạn khó duy trì hơn. Bạn nên tạo một bố cục linh hoạt hơn.
Một tình huống điển hình khác là ngôn ngữ yêu cầu bố cục khác. Ví dụ: bạn có thể có một biểu mẫu liên hệ, trong đó bao gồm 2 trường tên khi ứng dụng chạy bằng tiếng Nhật, nhưng gồm 3 trường tên khi ứng dụng chạy bằng một số ngôn ngữ khác. Bạn có thể xử lý vấn đề này bằng một trong hai cách sau:
- Tạo một bố cục có trường mà bạn có thể bật hoặc tắt theo cách lập trình, dựa trên ngôn ngữ.
- Có bố cục chính bao gồm một bố cục khác có trường có thể thay đổi. Bố cục thứ hai có thể có cấu hình tuỳ theo ngôn ngữ.
Dùng đối tượng Ngữ cảnh Android để tra cứu ngôn ngữ theo cách thủ công
Bạn có thể tra cứu ngôn ngữ bằng cách sử dụng đối tượng Context mà Android cung cấp, như trong ví dụ sau:
Kotlin
val primaryLocale: Locale = context.resources.configuration.locales[0] val locale: String = primaryLocale.displayName
Java
Locale primaryLocale = context.getResources().getConfiguration().getLocales().get(0); String locale = primaryLocale.getDisplayName();