Как форматировать локализованные строки в Swift?

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

Поскольку учебник основан на Obj-C, форматированные строки могут быть написаны следующим образом:

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

"Вам нравится?" = "~ Es bueno? ~";

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

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

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

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

从 x, y 得出

До этого я могу просто использовать это:

"From \(someVariable)"

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

"From" = "从 得出";

И вот как я буду использовать его в коде

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

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

"从 得出 x, y"

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

Ответ 1

Вы можете использовать %@ в Swift 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)

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

Ответ 2

От WWDC 2017:

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

Ответ 3

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

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/