iOS: как сделать I18N / локализацию в приложении? - PullRequest
1 голос
/ 18 ноября 2011

Как я могу сделать I18N в своем приложении, не используя настройки языка устройства?

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

Есть ли простой способ установить языковые настройки в контексте приложений?Что-то вроде:

[[UIApplication sharedApplication] setLocale/setBundle/setLanguage]

Спасибо за любой совет.

РЕДАКТИРОВАТЬ

Хорошо, я добился определенного прогресса.Есть ли способ переопределить NSLocalizedString ()?Проблема в том, что установка NSUserDefaults на другой код языка будет распознаваться только после перезапуска приложения.Это, конечно, не вариант для меня.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

Я закончил с этим решением.Сначала я определяю статический класс, чтобы установить мой язык в приложении на:

@implementation I18NUtil

static NSBundle *_bundle;
static NSString *_language;

+ (id)alloc 
{
    [NSException raise:@"Cannot be instantiated!" format:@"Static class 'ClassName' cannot be instantiated!"];
    return nil;
}

+ (void)setLanguage:(NSString *)languageCode 
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:languageCode, nil] forKey:@"AppleLanguages"];

    NSString *path = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"];
    _bundle = [NSBundle bundleWithPath:path];
    _language = languageCode;
}

+ (NSString *)localizedString:(NSString *)key
{
   return [_bundle localizedStringForKey:key value:@"" table:nil];
}

@end

Теперь вы можете легко использовать:

[I18NUtil localizedString:@"myLocalizedString"]

во всем вашем проекте.

Но я обнаружил, что намного проще переопределить макрос NSLocalizedString и использовать i18n, как я к нему привык.Вы должны включить это в свой AppName-Prefix.pch:

#ifdef __OBJC__
    ...

    // Override native NSLocalizedString(key,message) to achieve in-app and on-the-fly i18n
    // Needs to be defined AFTER importing Foundation.h
    #import "I18NUtil.h"

    #ifdef NSLocalizedString
        #undef NSLocalizedString
    #endif

    #define NSLocalizedString(key, message) \
        [I18NUtil localizedString:(key)]
#endif

Веселитесь!

1 голос
/ 18 ноября 2011

Вы можете использовать файл произвольных строк с NSLocalizedStringFromTable.

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

localizable_buttons_english.strings
localizable_buttons_spanish.strings
...
localizable_errors_english.strings
localizable_errors_spanish.strings
...

Затем, используя выбранный пользователем язык в настройках вашего приложения, вы получите перевод на любой язык:

NSString *lang = <# read user prefs #> // Example: spanish
NSString *table = [NSString stringWithFormat:@"localizable_buttons_%@", lang];
NSString *text = NSLocalizedStringFromTable(@"SendButtonLabel", table, nil);
sendButton.titleLabel.text = text;

// localizable_buttons_english.strings
"SendButtonLabel" = "Send";

// localizable_buttons_spanish.strings
"SendButtonLabel" = "Enviar";

Локализация файлов NIB - это всего лишь вопрос загрузки NIB программным способом с использованием выбранного пользователем языка для создания имени NIB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...