2016-02-10 3 views
14

Я учу локализовать свое приложение на упрощенном китайском языке. Я следую this tutorial о том, как это сделать.Как форматировать локализованные строки в Swift?

Поскольку учебник основан на Obj-C, отформатированные строки можно записать так: «Вам нравится»

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

= "~ Es bueno? ~";

Но я использую Swift. И в Swift я не думаю, что вы можете использовать %@, чтобы указать, что там что-то есть. У нас есть правильная интерполяция строк?

Мое приложение относится к математике. И я хочу показать, какие входные данные используются для вычисления результата в подробной метке ячейки представления таблицы. Например

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

Здесь From x, y означает «Результат вычисляется из й и у». Я хочу, чтобы перевести это на китайском языке:

从 x, y 得出 

Прежде, я могу просто использовать это:

"From \(someVariable)" 

со строками файла:

"From" = "从 得出"; 

И это, как я хотел бы использовать его в коде

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

Но если это мы повторно используется в китайской версии, окончательная строка будет выглядеть следующим образом:

"从 得出 x, y" 

Я имею в виду, я могу поставить и 得出 в двух различных записей в файле строк. Но есть ли лучший способ сделать это?

ответ

21

Вы можете использовать %@ в Свифта String(format:...), он может быть замещен посредством Swift String или любого экземпляра подкласса NSObject. Например, если файл Localizable.strings содержит определение

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

затем

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

производит "从 1.2, 2.4 得出". Другим вариантом было бы использовать формат %f для чисел с плавающей точкой двойной:

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

с

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

Niklas' answer См для еще лучшего решения, которое локализует представление числа , а также.

+0

Есть ли способ, чтобы определить порядок параметров или вставки одного параметра несколько раз? На некоторых языках порядок вставки может быть отменен. Android позволяет использовать это с помощью '% 1' и'% 2' перед спецификатором формата. – Suragch

+0

Использует '% @' лучше, чем '% s' (для строк)? – Suragch

+0

@Suragch: Существуют проблемы с кодировкой '% s', см. Https://stackoverflow.com/a/23672885 для примера. - Я думаю, что здесь также работают позиционные параметры, такие как '% 1 $ s'. –

-2

В объективном С, если мы хотим получить строки, добавленные во время выполнения, как показано ниже

John Appleseed это имя

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; 

Дальнейшее объяснение в этом хороший пост

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

7

От WWDC 2017:

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

Я считаю, что это лучший ответ, потому что String.localizedStringWithFormat (_, ...) будет локализовать фактические цифры чисел (например, запятые и запятые запятые и периоды для немецкого языка), а String (format: ...) не. Вы также можете использовать 'String (формат:«% f », locale: Locale.current, number)'. –

Смежные вопросы