2012-05-18 29 views
23

Android tài liệu ở đây http://developer.android.com/guide/topics/resources/localization.html giải thích rằng bạn có thể nhận được bản địa hiện nay với phương pháp này:Tại sao Android có cách riêng để có được ngôn ngữ hiện tại?

context.getResources().getConfiguration().locale 

Dường như Java đã cung cấp thông tin này trong hình thức của phương pháp này:

java.util.Locale.getDefault() 

Vậy tại sao đã làm các nhà phát triển Android giới thiệu một cách khác để có được ngôn ngữ? Hai dòng mã trên có bao giờ tạo ra các kết quả khác nhau khi chạy song song cùng một lúc không?

Trả lời

27

Tôi đồng ý điều đó gây nhầm lẫn và trong khi tôi không tấn công hoặc tôi cũng không bảo vệ nó, tôi có thể thấy nó cho phép bạn làm một số việc.

Hãy bắt đầu lại từ đầu.

java.util.Locale.getDefault() được xác định theo thời gian chạy java. Đây là ngôn ngữ của điện thoại/thiết bị. Đó là những gì quyền hạn những thứ như DateFormats (tiêu chuẩn ISO Dateformat, US định dạng tiêu chuẩn, vv), NumberFormats (dấu phẩy hoặc số thập phân, nhóm 3 hoặc 4, vv) và CurrenyFormats (Nó trông giống như một $ hoặc một CAD) khi không có miền địa phương là được. Đối với những trường hợp này, tốt nhất nên chỉ định Locale cho các kiểu đối tượng này.

context.getResources().getConfiguration().locale là ngôn ngữ được đăng ký với gói tài nguyên hiện tại trong Ngữ cảnh đã cho. Nó có thể bao gồm giá trị miền địa phương mà tất cả nội dung tài nguyên sẽ tôn trọng cặp ngữ cảnh/tài nguyên hiện tại. Cấu hình có thể được sắp xếp giống như trạng thái hiện tại của thiết bị được lọc tốt nhất đối với tài nguyên hiện tại. Bạn không nhất thiết phải chỉ định bất kỳ nội dung nào thay đổi dựa trên ngôn ngữ, nhưng đó là một tùy chọn.

Tài nguyên sử dụng bộ phân biệt đối xử trong Cấu hình như định hướng, chiều rộng màn hình, ngôn ngữ, v.v. Trong ứng dụng của bạn, bạn có thể cho phép ghi đè Tài nguyên hiện tại() bằng cách thay đổi cấu hình ứng dụng miền địa phương sang ngôn ngữ khác. Chẳng hạn như, bạn đã tạo bố cục cho một địa chỉ. Bạn có thể muốn một số trường nhất định biến đổi tùy theo quốc gia được chọn. (Không nói đây là hành vi đúng cho một ứng dụng như vậy nhưng đó là điều đơn giản nhất để nghĩ đến ngay bây giờ). Nếu bạn phải chỉ đơn giản dựa vào Locale.getDefault(), nó sẽ làm cho một số cài đặt lại khó xử của các ứng dụng hệ thống và trạng thái khi bạn muốn làm điều gì đó như tôi vừa mô tả.

Về bản chất, bạn cần phải sửa đổi Ngôn ngữ cho toàn bộ thiết bị (điều này không nhất thiết phải an toàn, cũng không phải là bất kỳ thứ gì mà người dùng cũ sẽ thích). Ngay cả khi chúng tôi bỏ qua các vấn đề quản lý bảo mật sẽ được nhân bản bởi máy chủ lưu trữ vm; trên hầu hết các thiết bị có rất nhiều trạng thái được lưu trữ cho bộ công cụ quốc gia. Vì vậy, sẽ có độ trễ đáng kể và có lẽ rất nhiều bất ổn trong khi chuyển đổi giá trị này hơn (Nếu có ai đó có thể làm điều đó). Phương án thay thế khác sẽ luôn là chỉ định ngôn ngữ cho mọi thứ. Bạn có thể thấy khó chịu như thế nào. Vì vậy, nó nằm trong cấu hình của Context.

Vì vậy, trong khi nó khó xử, nó cung cấp thêm một mức độ tự do và bảo vệ, và thuận tiện. Hầu hết thời gian, nó sẽ là Locale.getDefault() kể từ khi ứng dụng của bạn được bắt đầu từ một tiến trình mà bối cảnh cơ sở đã được khởi tạo thành Locale.getDefault(). Nói chung tôi sẽ tránh xa việc sử dụng giá trị Locale.getDefault() quá nhiều. Không có quá nhiều lần trong phát triển ứng dụng của người tiêu dùng khi nó sẽ là thứ đáng tin cậy.

Một lần nữa không dựa trên thực tế vì tôi không phải là nhà phát triển hệ điều hành, chủ yếu dựa trên việc phân tích ưu và nhược điểm của hệ thống. Tôi nghĩ rằng địa phương trong cấu hình là hoàn toàn hợp lý.

+0

Sử dụng ngôn ngữ khác cho bố cục địa chỉ là ví dụ tuyệt vời về trường hợp sử dụng. – Wernight

+1

Vì 'getConfiguration(). Locale' không được chấp nhận (https://developer.android.com/reference/android/content/res/Configuration.html#locale) trong API cấp 24, cách được khuyến nghị [hiện tại dường như có nhiều chi tiết hơn] (http://stackoverflow.com/q/38267213/56285). – Jonik

Các vấn đề liên quan