Стандартное решение от :apple:Apple предлагает отталкиваться от выбранного языка на нашем устройстве. То есть, чтобы поменять язык в приложении, необходимо полностью поменять язык системы. Что делать, если хочется изменить язык на лету, не выходя из приложения и, тем более, не меняя полностью локаль на устройстве?

Один из вариантов – брать необходимый файл переводов и локализовать приложение на основе выставления своих настроек языка, сохраняя их например в UserDefaults.

Я подготовил менеджер который позволит без труда реализовать быстрое переключение языка в приложении. Проект можно скачать тут ALLocalizedManager.


Менеджер мультиязычноти

Чтобы все это дело заработало необходимо проинициализировать ALLocalizedManager :octocat: вызвав метод ALLocalizedInit (все методы менеджера сделаны макросами, для удобства) желательно поместить вызов в didFinishLaunchingWithOptions класса AppDelegate.

В момент инициализации проверяется установленый язык из UserDefaults, если настроек еще нет (например, при первом запуске приложения), то берем язык системы и записываем в UserDefaults. После этого, даже если поменять язык системы, в приложении сохранится тот язык, который был проинициалищирован при первом запуске приложения.


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

В момент установки новой локали необходимо разослать сообщение об этом изменении:

ALLocalizationSetLanguage(@"en");
ALLocalizationThrowNotification;

Так как необходимо переключать язык на лету надо отслеживать события измененя, поэтому подписываемся на событие ALLocalizedManagerChangeLangNotification:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(changeAppLanguage:)
               name:ALLocalizedManagerChangeLangNotification
             object:nil];

-(void) updateTitles:(NSNotification*) notify {
    NSLog(ALLocalizedString(@"Change_language", @"Изменить язык"));
                    forState:UIControlStateNormal ];
    NSLog(ALLocalizedString(@"Hello", @"Привет мир"));
    NSLog(ALLocalizedStringFromTable(@"Current_lang", @"Русский", @"examplePlist"));
}

После этого в методе обновления нужно обновить текстовки / картинки / ресурсы.


настройка языков

Логика выбора языка во время первого запуска приложения: берется язык системы и проверяется, есть ли он в определенном нами списке языков. Если системный язык отсутствует в словаре, берем тот, который отмечен ключом isDefault.

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

- (NSArray *) languageList {
    return @[@{@"ru": @"Русский", @"isDefault":@"YES"},
             @{@"en": @"English"},
             @{@"es": @"Spanish"}];
}

Также можно локализовать ресурсы и картинки (ALLocalizationResource, ALLocalizationImage)


методы

Все макросы для работы с менеджером:metal::


Pluralization (Числительные формы)

Для того чтобы добавить в проект числительные формы необходимо сделать слудующее:

  1. Добавить .strings файл LocalizablePlural
  2. Допишите в него числовых формы, например:
/* LocalizablePlural */
"%d Murloc (plural rule: one)" = "%d мурлок";
"%d Murloc (plural rule: few)" = "%d мурлока";
"%d Murloc (plural rule: many)" = "%d мурлоков";
"%d Murloc (plural rule: other)" = "%d мурлока";

// Использование в проекте
NSString *pluralString = ALLocalizedPluralString(@"Murloc", 4, nil);

Есть вопросы? Пишите сюда – @alobanov