Можно ли использовать переменные и / или параметры с NSLocalizedString? - PullRequest
59 голосов
/ 10 августа 2010

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

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

Случай 1: переменная NSLocalizedstring:

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

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

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

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

Спасибо!

Ответы [ 7 ]

119 голосов
/ 10 августа 2010

Если вы хотите вернуть локализованную версию «Это 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 %@";
21 голосов
/ 02 июня 2014

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

Вдохновленный возможностью androids, я добавил эту функцию в мой 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);
7 голосов
/ 13 апреля 2017

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

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)
4 голосов
/ 13 апреля 2012

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

In Localizable.strings

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

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

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);
4 голосов
/ 14 ноября 2010

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

1 голос
/ 13 ноября 2018
extension String {
    public var localizedString: String {
        return NSLocalizedString(self, comment: "")
    }

    public func localizedString(with arguments: [CVarArg]) -> String {
        return String(format: localizedString, arguments: arguments)
    }
}

Localizable.string:

"Alarm:Popup:DismissOperation:DeviceMessage" = "\"%@\" will send position updates on a regular basis again.";
"Global:Text:Ok" = "OK";

Использование:

let message = "Alarm:Popup:DismissOperation:DeviceMessage".localizedString(with: [name])

и

let title = "Global:Text:Ok".localizedString
0 голосов
/ 10 августа 2010

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

...