2010-08-10 2 views
56

Я попытался использовать переменную в качестве входного параметра для NSLocalizedString, но все, что я возвращаю, это входной параметр. Что я делаю не так? Можно ли использовать переменную строковое значение в качестве индекса для строки NSLocalized?Можно использовать переменные и/или параметры с помощью NSLocalizedString?

Например, у меня есть некоторые строки, которые я хочу, чтобы отображались локализованные версии. Однако я хотел бы использовать переменную как параметр для NSLocalizedString, а не константную строку. Аналогично, я хотел бы включить элементы форматирования в параметр для NSLocalizedString, поэтому я смог бы получить локализованную версию строки с теми же параметрами форматирования. Могу ли я сделать следующее:

Случай 1: Переменный NSLocalizedString:

NSString *varStr = @"Index1"; 
NSString *string1 = NSLocalizedString(varStr,@""); 

Случай 2: форматированном NSLocalizedString:

NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"]; 

(Пожалуйста, обратите внимание, что переменная может содержать что-либо, а не только фиксированный набор строк.)

Спасибо!

ответ

4

Оказалось, что недостающая целевая запись виновата. Просто проверяя, что моя текущая цель сборки включает файл Localizable.string, решила проблему!

115

Если то, что вы хотите, чтобы вернуть локализованную версию «Это Apple/Orange/все», вы хотите:

NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil); 

(Т.е., вложенность NSLocalizedString() и [NSString stringWithFormat:] перепутаны.)

Если то, что вы хотите, это формат быть локализован, но не замещенный в значение, сделайте следующее:

NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"]; 

и в вашем Localizable.strings:

SomeFormat = "This is an %@"; 
+0

Да, но переменная может содержать что угодно, а не только «яблоки» или «апельсины». Поэтому мне нужно поддерживать гибкость. – futureelite7

+1

Позвольте мне добавить свой ответ на всякий случай. – Wevah

+0

Большое спасибо; добавленный ответ - это то, что я искал, - и я надеюсь, что вы скоро установите флажок «принять». – RonLugge

0

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

4

Если у вас есть более одной переменной в локализованной строки вы можете использовать это решение:

В Localizable.strings

"winpopup" = "#name# wins a #type# and get #points# points(s)"; 

И использовать stringByReplacingOccurrencesOfString для вставки значения

NSString *string = NSLocalizedString(@"winpopup", nil); //"#name# wins a #type# and get #points# points(s)" 
NSString *foo = [string stringByReplacingOccurrencesOfString:@"#name#" withString:gameLayer.turn]; 
NSString *fooo = [foo stringByReplacingOccurrencesOfString:@"#type#" withString:winMode]; 
NSString *msg = [fooo stringByReplacingOccurrencesOfString:@"#points#" withString:[NSString stringWithFormat:@"%i", pkt]]; 
NSLog(@"%@", msg); 
+0

очень полезно! спасибо – david

+41

это кажется очень сложным. вы можете просто использовать пронумерованные заполнители: '" exampleKey "="% 1 $ @ купил% 3 $ d яблок и% 2 $ d апельсинов. "' '[NSString stringWithFormat: NSLocalizedString (@" exampleKey ", nil) @ «Markus», 4, 3] ' Это вывело бы:« Маркус купил 3 яблока и 4 апельсина ». – denbec

+7

А чем пойти и объяснить эти типы криптографических строк вашим переводчикам по всему миру. – zeiteisen

21

Я просто хочу добавить одно очень полезное определение, которое я использую во многих своих проектах.

Вдохновленный андроидов возможностью, я добавил эту функцию в моей header prefix файл:

#define NSLocalizedFormatString(fmt, ...) [NSString stringWithFormat:NSLocalizedString(fmt, nil), __VA_ARGS__] 

Это позволяет определить локализованную строку вроде следующего:

"ExampleScreenAuthorizationDescriptionLbl"= "I authorize the payment of %@ to %@."; 

и это может быть используется через:

self.labelAuthorizationText.text = NSLocalizedFormatString(@"ExampleScreenAuthorizationDescriptionLbl", self.formattedAmount, self.companyQualifier); 
4

Для быстрого:

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount) 
Смежные вопросы