2010-03-17 26 views
10

Tôi quen với việc sử dụng NSLocalizedString() để bản địa hóa các chuỗi, nhưng vấn đề tôi có ngày hôm nay đòi hỏi phải khéo léo hơn một chút. tình hình của tôi là như thế này:Bản địa hóa các chuỗi được nối hoặc động

NSString *userName; //the users name, entered by the user. Does not need localized 
NSString *favoriteFood; //the users favorite food, also entered by user, and not needing localized 

NSString *summary = [NSString stringWithFormat:@"%@'s favorite food is %@", userName, favoriteFood]; 

này hoạt động tốt cho tiếng Anh, nhưng không phải mọi ngôn ngữ sử dụng thứ tự từ giống như tiếng Anh, ví dụ, một word-by-word dịch sentance cùng từ Nhật sang tiếng Anh sẽ đọc: pizza món ăn ưa thích

UserName là

chưa kể rằng 's là không làm một sở hữu trong mọi ngôn ngữ.

Kỹ thuật nào có sẵn để bản địa hóa loại câu ghép này?

CẬP NHẬT LỢI ÍCH CỦA CÁC LOẠI KHÁC: @Jon Reed đúng, định vị vị trí rất quan trọng đối với việc bản địa hóa. Tài liệu mà anh ta liên kết chỉ chứa một tham chiếu đến thực tế là chúng có thể được sử dụng với NSString, NSLog, một người khác, liên kết này thực sự không biết CÁCH sử dụng chúng.

Tôi tìm thấy this link, giải thích rõ điều đó. Nó cũng giải thích câu hỏi của tôi tốt hơn tôi. Từ liên kết:

Format chuỗi cho printf và sprintf (xem printf) trình bày một vấn đề đặc biệt cho bản dịch. Hãy xem xét các sau: 1

printf(_"String `%s' has %d characters\n", 
      string, length(string))) A possible German 

dịch cho điều này có thể là:

"%d Zeichen lang ist die Zeichenkette `%s'\n" The problem 

nên rõ ràng: thứ tự của các chi tiết kỹ thuật định dạng là khác nhau từ bản gốc! Mặc dù gettext có thể trả lại chuỗi đã dịch tại thời gian chạy là , nhưng không thể thay đổi đối số thứ tự trong lệnh gọi printf.

Để giải quyết vấn đề này, định dạng printf thông số có thể có thêm một phần tử tùy chọn , mà chúng tôi gọi là thông số định vị vị trí. Ví dụ:

"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the 

specifier vị trí bao gồm một số số nguyên, mà chỉ ra mà lập luận để sử dụng, và một ‘$’. Đếm là một lần và chuỗi định dạng không được bao gồm. Như vậy, trong ví dụ sau, 'string' là số đầu tiên và 'chiều dài (string)' được thứ hai:

$ gawk 'BEGIN { 
>  string = "Dont Panic" 
>  printf _"%2$d characters live in \"%1$s\"\n", 
>       string, length(string) 
> }' 
-| 10 characters live in "Dont Panic" 

Trả lời

27

Để chỉ định thứ tự thay thế, hãy sử dụng %[email protected]%[email protected] làm định dạng của bạn. Chuỗi định dạng được bản địa hóa có thể sử dụng chúng theo bất kỳ thứ tự nào. Ví dụ: giả sử khóa chuỗi của bạn là "FavoriteFood". Hãy gọi

NSString *summary = 
      [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
             userName, favoriteFood]; 

Địa phương hóa đặt định dạng thông số bất kỳ ở đâu hợp lý cho ngôn ngữ của nó. Ví dụ:

"FavoriteFood" = "%[email protected] is the favorite food of %[email protected]"; 

Xem String Format Specifiers

+0

Tôi đã theo liên kết của bạn và đọc Localizing String Resources (http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/StringsFiles.html). Tôi không thấy bất kỳ tham chiếu nào đến các thông số định dạng mà bạn đề cập (% 2 $ @) Bạn có thể giải thích một chút được không? – SooDesuNe

+1

Làm theo liên kết và tìm kiếm "specifiers positional". Ngoài ra, hãy thử. Đây là một công cụ cần thiết để bản địa hóa. –

+0

'% $ 1 @' phải là '% 1 $ @' ở cuối ví dụ của bạn. – bovine

-1

Áp dụng NSLocalizedString() vào chuỗi định dạng @"%@'s favorite food is %@" nên cho phép nó được thay thế với thứ tự từ thích hợp và sở hữu cho ngôn ngữ địa phương.

+0

Có lẽ tôi hiểu lầm NSLocalizedString. Làm thế nào nó cho phép thứ tự của các biến thay thế được thay đổi? – SooDesuNe

+0

@SooDesuNe, tôi không nghĩ vậy; nhưng ví dụ của bạn không có vấn đề đó. Có bất kỳ ngôn ngữ nào đặt đối tượng trước đối tượng không? Wikipedia nói với tôi có một vài ngôn ngữ bản địa của Brazil, và Klingon ... có lẽ nó không phải là một việc lớn như vậy? –

+0

@SooDesuNe: như trong câu trả lời của Jon Reid, bạn có thể sử dụng các chỉ định định dạng chuỗi vị trí cụ thể để xử lý vấn đề đặt hàng. – Isaac

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