2011-02-03 2 views
36

Как локализовать строку, в которой у нее есть заполнители с NSLocalizedString?Как локализовать строку с помощью заполнителей форматирования?

Например:

[NSString stringWithFormat:@"You can afford %i at %@%li.",[kCash integerValue]/self.price, kYen, self.price] 

Как локализовать это? Я могу разбить строки на несколько локализованных строк? Как же я имею дело с различной структурой предложения и грамматикой?

ответ

19

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

Что-то вдоль этих линий:

[NSString stringWithFormat:NSLocalizedString(@"Foo %i", @"Foo %i"), 123] 
+0

Будет ли это работать, хотя? Будет ли NSLocalizedString знать о заполнителях и не считать их произвольным текстом? – Moshe

+3

Это будет работать для одного аргумента, но если у вас есть два аргумента, то на многих языках вы также захотите изменить порядок появления заполнителей. –

+18

-1 Этот код не работает для текста, чувствительного к порядку. Вместо этого следует использовать позиционные аргументы (например,% 1 $ @). Кроме того, второй параметр NSLocalizedString предназначен для комментариев переводчикам, чтобы лучше понять контекст переведенного текста. Повторение исходного текста бессмысленно, особенно с форматирующими строками. – rbrown

44

NSLocalizedString не изменит ваши заполнители, так stringWithFormat их можно использовать в обычном режиме. В вашем примере, используя пронумерованные заполнителей, вероятно, хорошая идея -

[NSString stringWithFormat:@"You can afford %1$i at %[email protected]%3$li.", 
           [kCash integerValue]/self.price, kYen, self.price] 

Больше информации здесь: Is there a way to specify argument position/index in NSString stringWithFormat?

5

Другой подход к это в вашем локализованный файл, вы можете иметь:

key = "String with %@ placeholder"; 

и в вашем исполнении:

[NSString stringWithFormat: NSLocalizedString(@"key", ""), @"string replacing placeholder"]; 

Вы можете сделать это с любым количеством аргументов, они просто должны быть согласованными в ваших файлах локализации.

1

Этот путь кажется более эффективным:

[NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"Key", @"Comment for localised string"), value]; 
Смежные вопросы