NSLocalizedString извлекает только ключ, а не значение в Localizable.strings (IOS) - PullRequest
40 голосов
/ 12 февраля 2012

Я создал файл строк с именем «Localizable.strings» и добавил к нему два языка, например:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";

Я также преобразовал файлы в Unicode UTF-8 Однако, когда я создаю UIAlertView, как это:

 UIAlertView *myAlert = [[UIAlertView alloc]
 initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
 message:NSLocalizedString(@"CONNECTIONERROR",nil)                    
 delegate:self
 cancelButtonTitle:@"Ok"
 otherButtonTitles:nil];

в окне предупреждения отображается только текст ключа, а не значение. Это работает, если я, например, установил для текста UITextviews значение NSLocalizedString (@ "CONNECTIONERROR", nil), но в представлении предупреждений отображается только ключ. Кто-нибудь знает, что не так?

Ответы [ 29 ]

0 голосов
/ 14 сентября 2018

Я решил, используя этот подход.

Файл localize создан с именем main.Strings. Затем я открываю файлы main.Strings (для каждого добавленного языка) и переименовываю их вручную с именем localize.strings и добавляю их один за другим в свой проект, также я удалил main.strings.

Второе, что нужно оценить: проверить. В вашем файле все keys должны заканчиваться ; и быть уверенными, что все quotes правильно открыты и закрыты.

И вы можете использовать в swift 4 :

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
0 голосов
/ 05 июля 2018

Когда вы разрабатываете SDK. Вам нужна дополнительная операция.

1) создайте Localizable.strings как обычно в YourLocalizeDemoSDK.

2) создайте те же Localizable.strings в YourLocalizeDemo.

3) найдите свой путь к пакету из YourLocalizeDemoSDK.

Swift4

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self)) помогает найти пакет в YourLocalizeDemoSDK. Если вместо этого вы используете Bundle.main, вы получите неправильное значение (фактически это будет та же строка с ключом).

Но если вы хотите использовать расширение String, указанное в dr OX . Вам нужно сделать еще немного. Исходное расширение выглядит следующим образом.

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

Как мы знаем, мы разрабатываем SDK, Bundle.main получит комплект поставки YourLocalizeDemo. Это не то, что мы хотим. Нам нужен пакет в YourLocalizeDemoSDK. Это трюк, чтобы быстро его найти.

Запустите приведенный ниже код в экземпляре NSObject в YourLocalizeDemoSDK. И вы получите URL-адрес YourLocalizeDemoSDK.

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

Распечатав оба URL-адреса, вы обнаружите, что мы можем создать базу bundleURLofSDK на mainBundleURL. В этом случае это будет:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

И расширение String будет:

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

Надеюсь, это поможет.

0 голосов
/ 22 мая 2018

Swift 4:

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

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
0 голосов
/ 14 марта 2018

Для xcode 9.2 удаление файлов "Localizable.strings" из симуляторов проекта с помощью консоли решило это для меня. Вот команды для ленивых вроде меня;)

Не забудьте заменить YOUR_APP_NAME_HERE именем вашего проекта

Сценарий оболочки:

cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

Если у вас возникла проблема с модульными тестами, она будет работать в симуляторе;)

0 голосов
/ 22 декабря 2013

Первая строка файла локализации должна содержать сопоставление, иначе SDK не будет читать файл.

0 голосов
/ 05 сентября 2014

Сброс настроек симулятора у меня сработал.

Симулятор iOS> Сброс контента и настроек ...

0 голосов
/ 02 октября 2014

Обязательно не ставьте '@' перед вашим key или value, например так:

@"key" = @"value";

Это должно быть просто:

"key" = "value";

'@' идет только перед ключом при доступе к нему:

NSWebLocalizedString(@"key", @"label for coder");
0 голосов
/ 11 июля 2015

У меня все работало, когда внезапно локализация перестала переводить строки. Это означает, что файл каким-то образом не читается Xcode.

Это случилось со мной, потому что я вставил плохого персонажа в файл Localized.strings. Когда я удалил несколько строк с оскорбительным символом (не символом Юникода? Плохими кавычками? Не могу сказать), все вернулось на круги своя.

Чтобы найти ошибочные строки, я установил точку останова и вручную перевел строки в моем файле в отладчике, пока не нажму первую, которая не будет переводиться.

0 голосов
/ 30 апреля 2015

Вы пробовали очистить и восстановить проект?

...