Xcode 4: Локализация платформы не работает - PullRequest
7 голосов
/ 22 мая 2011

Я разрабатываю свой собственный фреймворк с использованием Xcode 4 и использую его в двух примерах приложений (консольное и Mac OS X Cocoa).

Я пытаюсь добавить локализациюпоэтому я создал две версии файла Localizable.strings (версии en и fr), но каждый раз, когда я пытаюсь напечатать локализованную строку из примеров приложений, я получаю только ее техническое имя.Например, со следующей строкой внутри кода фреймворка:

NSLog(NSLocalizedString(@"LOC_TEST", nil));

В выводе отображается только "LOC_TEST" ...

Однако локализация отлично работает с самим приложением Cocoa (это означает, что локализованные строки приложения Какао отображаются соответствующим образом.)

После этой статьи я попытался добавить локализации в plist-файл фреймворка:

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>fr</string>
</array>

Но этоничего не изменилось ...

Что мне не хватает?

Ответы [ 4 ]

11 голосов
/ 31 октября 2012

Причина, по которой не выбирается правильный файл .strings структурой, находится в NSLocalizedString макросе:

#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

Местоположение Framework файла .strings не [NSBundle mainBundle], как указано в макросе.

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

4 голосов
/ 25 апреля 2016

Принятый ответ правильный, NSLocalizedString не будет работать, так как он использует [NSBundle mainBundle], поэтому я использую этот макрос в моей структуре

#define LOCALIZED_STRING(key) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil]
1 голос
/ 08 февраля 2017

пример:

поместите его в свой файл .m:

#ifndef NSFrameworkLocalizedStrings
#define NSFrameworkLocalizedStrings(key) \
NSLocalizedStringFromTableInBundle(key, @"YOUR_BUNDLE_NAME", [NSBundle bundleWithPath:[[[NSBundle frameworkBundle] resourcePath] stringByAppendingPathComponent:@"YOUR_BUNDLE_NAME.bundle"]], nil)
#endif

и используйте этот метод:

+ (NSBundle *)frameworkBundle   {
    static NSBundle* frameworkBundle = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        frameworkBundle = [NSBundle bundleForClass:[self class]];
    });

    //NSLog(@"frameworkBundle %@",frameworkBundle);
    return frameworkBundle;
}

Наслаждайтесь √ http://www.LegoTechApps.com(Загрузите Framework, который сэкономит ваше время )

1 голос
/ 17 мая 2012

«Техническое имя», как вы его называете, на самом деле является Ключом.Ваши файлы .strings будут выглядеть примерно так:

/ * без комментариев * / "LOC_TEST" = "LOC_TEST";

В en.lproj / Localizable.strings замените секунду LOC_TEST (тот, что после =) с вашей английской строкой.Сделайте то же самое в fr.lproj со своим французским текстом.

...