2010-11-01 40 views
34

Tôi đang phát triển một ứng dụng cho khách hàng ở châu Âu. Tôi là người nói tiếng Anh ở Mỹ. Ứng dụng của chúng tôi sẽ hỗ trợ một số ngôn ngữ, nhưng không hỗ trợ tiếng Anh. Tôi có tất cả các chuỗi trong ứng dụng của chúng tôi trong các tệp Localized.strings đã dịch, được thiết lập chính xác cho các ngôn ngữ khác nhau và tất cả đều hoạt động tốt khi thiết bị được đặt thành ngôn ngữ chính xác (ngôn ngữ của thiết bị là German = app được bản địa hóa chính xác cho tiếng Đức) .Ngôn ngữ mặc định không phải tiếng Anh cho ứng dụng iOS?

Có sự cố khi thiết bị không được đặt thành một trong các ngôn ngữ chúng tôi hỗ trợ, ví dụ: trên điện thoại của tôi được đặt thành tiếng Anh. Chúng tôi muốn điện thoại quay trở lại tiếng Đức trong những trường hợp như thế này, nhưng điều đó không xảy ra. Những gì chúng ta đang thấy là điện thoại đang sử dụng ngôn ngữ xuất hiện cao nhất trong danh sách Ngôn ngữ trong phần Quốc tế của Cài đặt.app. Đối với điện thoại của tôi, ngôn ngữ không phải tiếng Anh cao nhất trong danh sách là tiếng Pháp, vì vậy khi tôi chạy ứng dụng, nó được bản địa hóa cho tiếng Pháp. Nếu tôi thay đổi điện thoại của tôi sang tiếng Đức và sau đó quay lại tiếng Anh (thay đổi thứ tự trong danh sách Ngôn ngữ), ứng dụng sẽ bản địa hóa sang tiếng Đức.

Làm cách nào để đảm bảo ứng dụng mặc định là tiếng Đức cho các ngôn ngữ không được hỗ trợ? Tôi đã sử dụng this tutorial để thiết lập ngôn ngữ cho dự án. Điều này bao gồm xóa ngôn ngữ mặc định "tiếng Anh" được tạo khi bạn lần đầu tiên bản địa hóa tệp. Trong hồ sơ dự án, tôi đã thêm:

developmentRegion = de; 

Ngoài ra, trong Info.plist, tôi có

<key>CFBundleDevelopmentRegion</key> 
<string>de</string> 

Với không thành công.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao!

Trả lời

42

Mặc định ngôn ngữ cụ thể không phải là điều bạn nên cố gắng thực hiện. Giả sử một người dùng tiếng Nhật sống ở Pháp và nói trôi chảy tiếng Pháp có điện thoại của anh ấy được đặt sang tiếng Nhật. Ứng dụng của bạn sẽ mặc định là tiếng Đức, mặc dù nó có bản dịch tiếng Pháp; Tôi đoán đó không phải là những gì bạn muốn và nó chắc chắn không phải là những gì người dùng muốn.

Vì lý do này, tôi khuyên bạn nên tôn trọng ưu tiên ngôn ngữ như được người dùng đặt.

Vì bạn không muốn hỗ trợ tiếng Anh nhưng đã phát triển ứng dụng bằng tiếng Anh, điều đơn giản nhất bạn có thể làm là chỉ cần loại bỏ en.lproj ngay sau khi biên dịch. Thao tác này sẽ chỉ rời khỏi ứng dụng bằng các ngôn ngữ bạn định hỗ trợ và iPhone sẽ chọn ngôn ngữ phù hợp nhất cho người dùng, như được đặt trong cài đặt mặc định của iPhone.


Có một giải pháp khá đơn giản để xóa nội địa hóa cụ thể:

Hãy Xcode xây dựng App với tất cả các tin cục bộ hiện tại và ngay trước khi mã ký đá trong xóa thư mục en.lproj và tất cả các địa phương các tệp cho ngôn ngữ đó đã biến mất. Bạn có thể dễ dàng làm điều này bằng cách thêm một Run Script xây dựng giai đoạn với mục tiêu, chứa một dòng mã này (đó là một Bash Script):

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj" 

Mã Ký luôn đá trong sau khi tất cả xây dựng giai đoạn đã hoàn thành, vì vậy chỉ cần đặt giai đoạn xây dựng đó vào cuối giai đoạn hiện tại của bạn.

Lưu ý điều này làm tăng thời gian xây dựng vì Xcode tạo lại tất cả các tệp tiếng Anh, vì vậy bạn có thể muốn tắt bước này trong khi thử nghiệm.

Tôi hy vọng đó là giải pháp khả thi cho bạn.


Về "ứng dụng phải rơi trở lại Đức trong trường hợp đó một địa hóa phù hợp không tồn tại":

Câu hỏi là gì là một địa hóa phù hợp? Nếu lựa chọn thứ ba của người dùng là tiếng Pháp (sau 2 ngôn ngữ không được hỗ trợ), giải pháp này sẽ làm cho ứng dụng quay trở lại tiếng Pháp, trong đó bản địa hóa thích hợp. Thích hợp hơn là thiết lập lựa chọn thứ năm của người dùng, tiếng Đức, bằng tay. Điều này xảy ra khi ứng dụng khởi chạy rất đơn giản: Hệ điều hành sẽ hạ xuống danh sách ngôn ngữ người dùng, như được đặt trong Tùy chọn, cho đến khi nó tìm thấy bản địa hóa phù hợp và sử dụng ngôn ngữ này. Lý do nhiều ứng dụng mặc định bằng tiếng Anh chứ không phải tiếng Đức đơn giản chỉ vì tiếng Anh xuất hiện trên hầu hết các danh sách ngôn ngữ của người dùng phía trên tiếng Đức. Không có tùy chọn ngôn ngữ vốn có nào cho hệ thống. Nếu bạn xóa bản dịch tiếng Anh, chỉ những ngôn ngữ bạn muốn hỗ trợ ở đó, và những ngôn ngữ này cao hơn trong danh sách của người dùng được lấy.

+0

Pascal có câu trả lời đúng: Ứng dụng này sẽ rơi trở lại vào nội địa hợp lý nhất tiếp theo; điều này là do thiết kế và là cách tất cả các ứng dụng trên iOS và Mac OS X được cho là hoạt động. Ứng dụng của bạn không phải là đặc biệt. –

+2

Tôi vẫn đang cân nhắc câu trả lời này. Trong khi điều này rõ ràng là một phản ứng tốt được suy nghĩ, vào cuối ngày, yêu cầu kinh doanh vẫn là ứng dụng phải quay trở lại Đức trong trường hợp một nội địa hóa thích hợp không tồn tại; điều này là không thể thương lượng với khách hàng. Điều thú vị, và những gì tôi ám chỉ trong tiêu đề câu hỏi của tôi, là nếu thư mục English.lproj được lưu giữ trong dự án, nó được sử dụng như là sự sụp đổ khi không có bản địa hóa khác có sẵn.Nếu tôi không thể tìm ra bất cứ thứ gì khác, tôi sẽ chỉ giữ thư mục đó xung quanh và sao chép tài sản "de" trong đó. –

+2

Không, tiếng Anh cũng không phải là mặc định của hệ thống. Nó đơn giản, hệ điều hành có một danh sách các bản địa hóa, như được thiết lập trong các sở thích. Khi bắt đầu một ứng dụng, nó sẽ tìm kiếm các thư mục * .lproj tương ứng và sử dụng thư mục đầu tiên khớp với một ngôn ngữ từ danh sách. Đó là lý do tại sao nó sử dụng tiếng Anh khi không có gì khác xung quanh. ;) Nhưng tôi biết một mẹo khác, sẽ xây dựng một câu trả lời mới ... – Pascal

13

Tôi không thích đăng câu trả lời này vì nó chạy chống lại Hướng dẫn giao diện người dùng táo. Bản địa hóa là thứ mà người dùng nên đặt, chứ không phải thứ gì đó mà quản lý nên quyết định, vì vậy người quản lý yêu cầu ngôn ngữ mặc định nhất định không hiểu gì và nên thay đổi doanh nghiệp.

Điều đó đang được nói, có một cách để buộc iOS sử dụng một số ngôn ngữ nhất định theo một thứ tự nhất định. Tôi chủ yếu sử dụng điều này để gỡ lỗi bản địa hóa mà không cần phải thiết lập ngôn ngữ thiết bị cho một cái gì đó khác, cho dù nó có thể sử dụng để giải quyết vấn đề không tồn tại trong câu hỏi này tôi không thể nói.

Có một khóa AppleLanguages trong mặc định người dùng quyết định thứ tự ngôn ngữ sẽ được sử dụng, thường được đặt theo thứ tự người dùng đặt trong tùy chọn của iOS. Nếu bạn thay đổi thứ tự này, ứng dụng sẽ cố gắng tìm các bản địa hóa theo thứ tự đó trước tiên. Những gì bạn có thể làm là đọc các tuỳ chọn ngôn ngữ hiện tại và quyết định để mặc định sang tiếng Đức như sau:

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil]; 
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"]; 

Lưu ý rằng bạn cần phải làm điều này trong main.m trước UIApplicationMain, nếu không bạn cần phải khởi động lại ứng dụng để thay đổi này mất hiệu ứng.

Tôi không thể nói đủ rằng không ai nên làm điều này trong ứng dụng thực, trừ khi bạn đi tất cả và thực hiện cài đặt tùy chọn cho phép người dùng thay đổi ngôn ngữ theo cách thủ công. Nếu bạn chỉ mặc định một ngôn ngữ cụ thể, người dùng không có tùy chọn để thay đổi lựa chọn của bạn.

+3

Chúng tôi có một ví dụ về thế giới thực không phá vỡ bất kỳ HIG hoặc bất kỳ thứ gì. Hơn nữa tôi cảm ơn Pascal để trả lời (mặc dù sau khi một exsuse). Tôi ghét khi mọi người trả lời với một gợi ý/tư vấn/hướng dẫn không phù hợp với câu hỏi công nghệ: hoặc là bạn trả lời, hoặc bạn không .. dù sao, trường hợp: chúng tôi đang phát triển một ứng dụng cho thị trường quốc tế (do đó, nó ở tiếng Anh) nhưng chúng tôi phải cung cấp một phiên bản tùy biến cho một khách hàng Ý. Các codebase là như nhau, và chúng tôi muốn ** lực ** (theo yêu cầu của khách hàng) phiên bản tùy biến bằng tiếng Ý. Bất kể thiết lập của người dùng (ví dụ trên iPad của tôi) – zontar

+1

Điều này rất hữu ích nhưng nếu tôi có màn hình khởi động giật gân với quốc tế, điều này không áp dụng đúng hình ảnh, ngay cả khi tôi đặt mã trên main.m, bạn có biết làm thế nào tôi có thể sửa chữa nó? Cảm ơn – JERC

+0

HIG là tập hợp các Nguyên tắc (không phải Quy tắc) vì một lý do. Trong trường hợp của tôi, ứng dụng là ứng dụng Doanh nghiệp điểm bán hàng và cần kinh doanh bằng loại tiền tệ của vị trí cửa hàng. Giá được lấy từ cơ sở dữ liệu máy chủ là IN Euro, USD, Yen hoặc bất kỳ thứ gì. Nếu người dùng đặt ngôn ngữ cho một cái gì đó khác, những điều xấu xảy ra. Rất tiếc, ứng dụng của tôi không thể nhận được miền địa phương (máy chủ a.k.a.) của cửa hàng cho đến khi chúng tôi hoạt động tốt. Tôi có tùy chọn nào khác ngoài việc so sánh ngôn ngữ của thiết bị với những gì cửa hàng yêu cầu và hiển thị cảnh báo không? –

-1

Hãy thử điều này trong didFinishLaunchingWithOptions của bạn() chức năng

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
int retVal = UIApplicationMain(argc, argv, nil, nil); 
Các vấn đề liên quan