2016-02-10 33 views
14

Sto imparando a localizzare la mia app in cinese semplificato. Sto seguendo this tutorial su come farlo.Come formattare le stringhe localizzate in Swift?

Poiché il tutorial è basato su Obj-C, le stringhe formattate può essere scritta in questo modo: "You Like"

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

= "~ Es bueno? ~";

Ma sto usando Swift. E in Swift non penso che tu possa usare %@ per indicare che c'è qualcosa da posizionare lì. Abbiamo un'interpolazione delle stringhe, giusto?

La mia app è legata alla matematica. E voglio mostrare quale input (s) è usato per calcolare il risultato in un'etichetta dettagliata di una cella vista tabella. Ad esempio

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

Qui, From x, y significa "Il risultato viene calcolato dalla xe y". Voglio tradurre questo al cinese:

从 x, y 得出 

Prima, posso solo usare questo:

"From \(someVariable)" 

con le stringhe di file:

"From" = "从 得出"; 

e questo è come vorrei usarlo nel codice

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

Ma se questo noi re utilizzato nella versione cinese, la stringa finale sarà simile a questo:

"从 得出 x, y" 

voglio dire che posso mettere la e 得出 in due diverse voci nel file stringhe. Ma c'è un modo migliore per farlo?

risposta

21

È può utilizzare %@ a Swift di String(format:...), esso può essere sostituito da un Swift String o qualsiasi istanza di una sottoclasse NSObject. Per esempio, se il file contiene la definizione Localizable.strings

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

poi

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)) 

produce "从 1.2, 2.4 得出". Un'altra opzione potrebbe essere quella di utilizzare il formato %f per i numeri in virgola mobile doppi:

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

con

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

Vedi Niklas' answer per una soluzione ancora migliore che localizza la rappresentazione numero pure.

+0

Esiste un modo per specificare l'ordine dei parametri o inserire un singolo parametro più volte? In alcune lingue l'ordine di inserzione potrebbe essere invertito. Android lo consente utilizzando '% 1' e'% 2' prima dello specificatore di formato. – Suragch

+0

Sta usando '% @' migliore di '% s' (per le stringhe)? – Suragch

+0

@Suragch: ci sono problemi di codifica con '% s', vedere https://stackoverflow.com/a/23672885 per un esempio. - I * penso * che anche qui i parametri posizionali come '% 1 $ s' funzionano. –

-2

in Objective C, se vogliamo ottenere le stringhe aggiunte in fase di esecuzione, come di seguito

John Appleseed è il nome

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; 

Ulteriori spiegazioni in questo bel post

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

7

Da WWDC 2017:

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

Credo che questa sia la risposta migliore perché String.localizedStringWithFormat (_, ...) localizzerà le cifre effettive dei numeri (e scambia virgole e punti per il tedesco, ad esempio) e String (formato: ...) non. Puoi anche usare 'String (formato:"% f ", locale: Locale.current, numero)'. –