Сама ваша локализованная строка должна быть шаблоном формата:
"ValueAndStringFMT" = "Value %1$d and string %2$@";
И в вашем коде:
textLabel.text = [NSString
stringWithFormat:NSLocalizedString(@"ValueAndStringFMT"),
value, str
];
Почему %1$d
, а не только %d
? Таким образом, вы можете изменить порядок. Например. на каком-то языке вы можете поменять порядок местами:
"ValueAndStringFMT" = "Cadena %2$@ y valor %1$d";
Конечно, это несколько опасно, поскольку, если кто-то использует больше заполнителей, чем предлагает ваш строковый вызов, или использует неправильные типы, ваше приложение может аварийно завершить работу. Если вы хотите быть в безопасности, вместо этого вы выполняете поиск и замену:
"ValueAndStringFMT" = "Value [[VALUE]] and string [[STRING]]";
И в вашем коде:
NSString * string = NSLocalizedString(@"ValueAndStringFMT");
string = [string stringByReplacingOccurrencesOfString:@"[[VALUE]]"
withString:@(value).stringValue
];
string = [string stringByReplacingOccurrencesOfString:@"[[STRING]]"
withString:str
];
textLabel.text = string;
Таким образом, в худшем случае заполнитель не раскрывается, то есть заполнитель отображается на экране, но, по крайней мере, ваше приложение не рухнет из-за того, что кто-то испортил файл строк локализации.
Если вам нужно локализовать одну из переменных формата, вам нужно сделать это сначала на собственном шаге:
NSString * str = NSLocalizedString(@"hello");
10.01.2018