2013-03-13 29 views
5

Tôi quan tâm đến việc cho phép người dùng chọn ngôn ngữ/ngôn ngữ mà ứng dụng của tôi xuất hiện. Tôi đã tìm ra cách tải đúng gói, chọn đúng các tệp chuỗi, v.v. Tuy nhiên, một số mục hệ thống mà tôi vẫn có vẻ không có quyền kiểm soát. Chuyển đổi điều khiển, ví dụ.iOS: Có cách nào để giả mạo ngôn ngữ của người dùng không?

Có cách nào để tôi thông báo cho hệ thống rằng ứng dụng này bây giờ sẽ hoạt động trong một ngôn ngữ cụ thể, thay vì cài đặt hệ thống hiện tại của người dùng không?

+1

Whoa-whoo. 'method_setImplementation (class_getInstanceMethod ([lớp NSLocale], @selector (currentLocale)), (IMP) spoofedImpl);'? –

+2

Bất kỳ cách nào để làm điều đó mà không bị vướng bận? – Mike

+0

Bạn đã thử tạo danh mục cho NSLocale để trả lại ngôn ngữ bạn chọn cho các phương thức lớp chưa? –

Trả lời

5

Cách ít hacky nhất là qua NSUserDefaults: Ngôn ngữ được xác định bởi AppleLocale (ID ngôn ngữ dưới dạng chuỗi) và ngôn ngữ được xác định theo kết quả trùng khớp đầu tiên trong AppleLanguages (một mảng ID ngôn ngữ); ứng dụng của bạn có thể ghi đè các giá trị mặc định này cho ứng dụng của bạn chỉ. Để kiểm tra xem ứng dụng của bạn có bị ghi đè hay không, bạn có thể sử dụng một cái gì đó như [defaults persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]] objectForKey:@"AppleLocale"]. Để xóa ghi đè, hãy sử dụng -removeObjectForKey:.

Dù bạn làm cách nào, bạn có thể sẽ phải relaunch the app khi thay đổi ngôn ngữ; Ứng dụng OS X và iOS không được thiết kế để thay đổi ngôn ngữ khi chạy (trên OS X, chỉ các ứng dụng mới được phát hành thấy thay đổi ngôn ngữ; trên iOS hệ thống sẽ giết tất cả ứng dụng để thay đổi ngôn ngữ).

Tôi đã thêm tính năng này để giúp việc chuyển đổi ngôn ngữ dễ dàng hơn cho việc phát triển/thử nghiệm; Tôi không biết liệu điều này có làm hỏng quá trình xem xét của App Store hay không.

+0

Cảm ơn @tc. Nghe có vẻ như đây có lẽ là một cái gì đó để tránh xa, nhưng tôi đánh giá cao các tùy chọn chi tiết. – Mike