2010-08-10 6 views
56

Tôi đã thử sử dụng một biến làm tham số đầu vào cho NSLocalizedString, nhưng tất cả những gì tôi nhận được là tham số đầu vào. Tôi đang làm gì sai? Có thể sử dụng giá trị chuỗi biến làm chỉ mục cho chuỗi NSLocalized không?Có thể sử dụng các biến và/hoặc tham số với NSLocalizedString không?

Ví dụ: tôi có một số chuỗi mà tôi muốn các phiên bản được bản địa hóa được hiển thị. Tuy nhiên, tôi muốn sử dụng một biến làm tham số cho NSLocalizedString, thay vì một chuỗi không đổi. Tương tự như vậy, tôi muốn bao gồm các phần tử định dạng trong tham số cho NSLocalizedString, vì vậy tôi có thể lấy ra một phiên bản được bản địa hóa của chuỗi có cùng các tham số định dạng. Tôi có thể làm như sau:

Trường hợp 1: Biến NSLocalizedstring:

NSString *varStr = @"Index1"; 
NSString *string1 = NSLocalizedString(varStr,@""); 

Trường hợp 2: Formatted NSLocalizedString:

NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"]; 

(Xin lưu ý rằng các biến thể chứa bất cứ điều gì, không chỉ là một cố định thiết lập các chuỗi.)

Cảm ơn!

Trả lời

4

Nó chỉ ra rằng mục nhập mục tiêu bị thiếu là để đổ lỗi. Chỉ cần kiểm tra rằng mục tiêu xây dựng hiện tại của tôi bao gồm tệp Localizable.string đã giải quyết được vấn đề!

115

Nếu những gì bạn muốn là để trở về phiên bản địa hoá của "Đây là một Apple/Orange/bất cứ điều gì", bạn muốn:

NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil); 

(Tức là, làm tổ của NSLocalizedString()[NSString stringWithFormat:] bị đảo ngược.)

Nếu những gì bạn muốn là định dạng có tính cục bộ, nhưng không phải là giá trị thay thế-in, làm điều này:

NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"]; 

Và trong số Localizable.strings:

SomeFormat = "This is an %@"; 
+0

Vâng, nhưng biến có thể chứa bất kỳ thứ gì, không chỉ là "quả táo" hoặc "cam". Vì vậy, tôi cần phải duy trì tính linh hoạt. – futureelite7

+1

Hãy để tôi nối thêm câu trả lời của tôi trong trường hợp. – Wevah

+0

Cảm ơn bạn rất nhiều; câu trả lời nối thêm là trong thực tế những gì tôi đang tìm kiếm - và tôi hy vọng bạn sẽ sớm nhận được một hộp kiểm 'chấp nhận'. – RonLugge

0

Ý tưởng của bạn sẽ hoạt động. Nhưng nếu bạn đang lấy lại tham số đầu vào, điều đó có nghĩa là tham số đầu vào không được tìm thấy như một khóa trong tệp Localizable.strings của bạn. Kiểm tra cú pháp và vị trí của tập tin đó.

4

Nếu bạn có nhiều hơn một biến trong chuỗi cục bộ của bạn, bạn có thể sử dụng giải pháp này:

Trong Localizable.strings

"winpopup" = "#name# wins a #type# and get #points# points(s)"; 

Và sử dụng stringByReplacingOccurrencesOfString để chèn các giá trị

NSString *string = NSLocalizedString(@"winpopup", nil); //"#name# wins a #type# and get #points# points(s)" 
NSString *foo = [string stringByReplacingOccurrencesOfString:@"#name#" withString:gameLayer.turn]; 
NSString *fooo = [foo stringByReplacingOccurrencesOfString:@"#type#" withString:winMode]; 
NSString *msg = [fooo stringByReplacingOccurrencesOfString:@"#points#" withString:[NSString stringWithFormat:@"%i", pkt]]; 
NSLog(@"%@", msg); 
+0

rất hữu ích! cảm ơn – david

+41

điều này có vẻ rất phức tạp. bạn chỉ có thể sử dụng trình giữ chỗ được đánh số: '" exampleKey "="% 1 $ @ đã mua% 3 $ d táo và% 2 $ d cam. "' '[Chuỗi gửi NSStringWormat: NSLocalizedString (@" exampleKey ", nil), @ "Markus", 4, 3] ' Điều này sẽ xuất ra: 'Markus đã mua 3 quả táo và 4 quả cam'. – denbec

+7

Và hơn là đi và giải thích các loại chuỗi mã hóa này cho người dịch của bạn trên khắp thế giới. – zeiteisen

21

Tôi chỉ muốn thêm một định nghĩa rất hữu ích mà tôi sử dụng trong nhiều dự án của mình.

Lấy cảm hứng từ android khả năng, tôi đã thêm chức năng này để header prefix tập tin của tôi:

#define NSLocalizedFormatString(fmt, ...) [NSString stringWithFormat:NSLocalizedString(fmt, nil), __VA_ARGS__] 

này cho phép bạn xác định một chuỗi cục bộ như sau:

"ExampleScreenAuthorizationDescriptionLbl"= "I authorize the payment of %@ to %@."; 

và nó có thể được sử dụng qua:

self.labelAuthorizationText.text = NSLocalizedFormatString(@"ExampleScreenAuthorizationDescriptionLbl", self.formattedAmount, self.companyQualifier); 
4

Cho nhanh:

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)