2016-02-10 13 views
14

Tôi đang học cách bản địa hóa ứng dụng của mình sang tiếng Trung giản thể. Tôi đang theo dõi this tutorial về cách thực hiện việc này.Làm cách nào để định dạng chuỗi được bản địa hóa trong Swift?

Bởi vì các hướng dẫn dựa trên obj-C, chuỗi định dạng có thể được viết như thế này: "Bạn thích"

"Yesterday you sold %@ apps" = "Ayer le vendió %@ aplicaciones"; 

= "~ Es bueno? ~";

Nhưng tôi đang sử dụng Swift. Và trong Swift tôi không nghĩ rằng bạn có thể sử dụng %@ để chỉ ra rằng có một cái gì đó để được đặt ở đó. Chúng ta có nội suy chuỗi phải không?

Ứng dụng của tôi có liên quan đến toán học. Và tôi muốn hiển thị (các) đầu vào nào được sử dụng để tính toán kết quả trong một nhãn chi tiết của một ô xem bảng. Ví dụ:

-------------- 
1234.5678 
From x, y <---- Here is the detailed label 
-------------- 

Ở đây, From x, y có nghĩa là "Kết quả được tính từ x và y". Tôi muốn dịch này sang tiếng Trung:

从 x, y 得出 

Trước đây, tôi chỉ có thể sử dụng này:

"From \(someVariable)" 

với chuỗi file:

"From" = "从 得出"; 

Và đây là cách tôi sẽ sử dụng nó trong mã

"\(NSLocalizedString("From", comment: "")) \(someVariable)" 

Nhưng nếu điều này chúng tôi tái sử dụng trong phiên bản Trung Quốc, chuỗi cuối cùng sẽ được như thế này:

"从 得出 x, y" 

tôi có nghĩa là tôi có thể đặt 得出 trong hai mục khác nhau trong tập tin chuỗi. Nhưng có cách nào tốt hơn để làm điều đó không?

Trả lời

21

Bạn thể sử dụng %@ trong Swift String(format:...), nó có thể được thay thế bởi một Swift String hoặc bất kỳ trường hợp của một lớp con NSObject. Ví dụ, nếu các tập tin Localizable.strings chứa các định nghĩa

"From %@, %@" = "从 %@, %@ 得出"; 

sau đó

let x = 1.2 
let y = 2.4 
let text = String(format: NSLocalizedString("From %@, %@", comment: ""), "\(x)", "\(y)") 
// Or alternatively: 
let text = String(format: NSLocalizedString("From %@, %@", comment: ""), NSNumber(double: x), NSNumber(double: y)) 

sản xuất "从 1.2, 2.4 得出". Một lựa chọn khác là sử dụng các định dạng %f cho số dấu chấm động kép:

"From %f, %f" = "从 %f, %f 得出"; 

với

let text = String(format: NSLocalizedString("From %f, %f", comment: ""), x, y) 

Xem Niklas' answer cho một giải pháp tốt hơn mà localizes đại diện số là tốt.

+0

Có cách nào để xác định thứ tự của các tham số hoặc chèn một tham số duy nhất nhiều lần? Ở một số ngôn ngữ, thứ tự chèn có thể được đảo ngược. Android cho phép điều này bằng cách sử dụng '% 1' và'% 2' trước định dạng chỉ định. – Suragch

+0

Sử dụng '% @' tốt hơn '% s' (cho chuỗi)? – Suragch

+0

@Suragch: Có vấn đề về mã hóa với '% s', xem https://stackoverflow.com/a/23672885 để biết ví dụ. - Tôi nghĩ * rằng các tham số vị trí như '% 1 $ s' cũng hoạt động ở đây. –

-2

Trong C khách quan, nếu chúng ta muốn có được chuỗi bổ sung trong thời gian chạy như sau

John Appleseed là tên

YourLocalizable.strings

"theStringToDisplay" = "%@ is the name"; 

ViewController .m

NSString *username = @"John Appleseed"; 
NSString *messageBeforeFormat = NSLocalizedStringFromTable(@"theStringToDisplay", @"YourLocalizable", nil); 
NSString *messageAfterFormat = [NSString stringWithFormat:messageBeforeFormat, username ]; 

self.yourLabel.text = messageAfterFormat; 

giải thích thêm trong bài viết này đẹp

https://www.oneskyapp.com/academy/learn-ios-localization/2-format-strings-plurals/

7

Từ WWDC 2017:

let format = NSLocalizedString("%d popular languages", comment:"Number of popular languages") 
label.text = String.localizedStringWithFormat(format, popularLanguages.count) 
+0

Tôi tin rằng đây là câu trả lời tốt nhất vì String.localizedStringWithFormat (_, ...) sẽ bản địa hoá các chữ số thực của các số (và hoán đổi dấu phẩy và dấu chấm cho tiếng Đức), và String (format: ...) sẽ không phải. Bạn cũng có thể sử dụng 'String (format:"% f ", locale: Locale.current, number)'. –

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