2013-08-07 3 views
2

Я хочу изменить язык приложения внутри приложения без перезагрузки.Как изменить язык приложения внутри приложения?

Файлы Localizable.strings для обоих языков. Все мои XIB и главная раскадровка тоже.

Те ниже кода можно изменить язык только после перезапуска приложения

main.m:

int main(int argc, char *argv[]) 
{ 
    NSString *currLang = [[NSUserDefaults standardUserDefaults] stringForKey:@"Lang"]; 

    if (!currLang) { 
     NSString *languageCode = [[NSLocale preferredLanguages] objectAtIndex:0]; 
     if ([languageCode isEqualToString:@"ru"]) { 
      [[NSUserDefaults standardUserDefaults] setValue:languageCode forKey:@"Lang"]; 
     } 
     else [[NSUserDefaults standardUserDefaults] setValue:@"en" forKey:@"Lang"]; 

     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 

    currLang = nil; 
    currLang = [[NSUserDefaults standardUserDefaults] stringForKey:@"Lang"]; 
    if ([currLang isEqualToString:@"ru"]) { 
     [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"ru", @"en", nil] 
                forKey:@"AppleLanguages"]; 
    } 
    else 
     [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"ru", nil] 
               forKey:@"AppleLanguages"]; 

    [[NSUserDefaults standardUserDefaults] synchronize]; 

    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

Есть 2 кнопки (Eng & Ru) муравей метод:

- (IBAction)changeLang:(UIButton *)sender 
{ 
    if ([sender isEqual:btnSetRuLang]) { 
     if ([[userDefaults stringForKey:@"Lang"] isEqualToString:@"ru"]) { 
      return; 
     } 
     [userDefaults setValue:@"ru" forKey:@"Lang"]; 
     [userDefaults synchronize]; 
    } 
    else { 
     if ([[userDefaults stringForKey:@"Lang"] isEqualToString:@"en"]) { 
      return; 
     } 
     [userDefaults setValue:@"en" forKey:@"Lang"]; 
     [userDefaults synchronize]; 
    } 

    NSString *currLang = [userDefaults stringForKey:@"Lang"]; 
    NSString *alertBody; 
    if ([currLang isEqualToString:@"ru"]) { 
     [userDefaults setObject:[NSArray arrayWithObjects:@"ru", @"en", nil] 
                forKey:@"AppleLanguages"]; 
     alertBody = @"Перезапустите приложение для смены языка"; 
    } 
    else { 
     [userDefaults setObject:[NSArray arrayWithObjects:@"en", @"ru", nil] 
                forKey:@"AppleLanguages"]; 
     alertBody = @"Restart application for change language"; 
    } 

    [userDefaults synchronize]; 

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Hom" message:alertBody delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
    [alertView show]; 

} 

Итак, как мне изменить lang без перезапуска приложения?

спасибо.

+0

Возможный дубликат [Изменить язык приложения iOS на лету] (http://stackoverflow.com/questions/6150576/change-ios-apps-language-on-the-fly) – Raptor

+0

У вас есть en.strings & ru.strings в вашем проекте? Глядя на код, который вы опубликовали выше, не похоже, что вы делаете локализацию правильно. –

+0

@EvolGate: У меня есть Localizable.strings (English) и Localizable.strings (русский) – Romowski

ответ

1

Я сделал то же самое в одном из своих приложений. Когда пользователь меняет язык, я сделал то же самое и перезагрузил все мои контроллеры View, которые находятся в стеке навигации, вызвав setNeedsDisplay, который снова отображает представление с новыми языковыми настройками.

EDIT

для каждого экземпляра вашего зрения контроллера вызова [self setNeedsDisplay] или вы можете заменить себя экземпляром контроллера представления.

+0

можете ли вы разместить несколько примеров? – Romowski

+0

Я отредактировал ответ, сейчас проверяйте –

+0

У меня есть более 10 контроллеров, которые необходимо перезагрузить ... Есть ли способ перезагрузить их все? – Romowski

1

Я хотел бы предложить вам использовать

NSLocalizedStringFromTable(key, tbl, comment) 

вместо NSLocalizedString(key, comment)

Таким образом, все, что вам нужно сделать, это сохранить переменную имени таблицы. Вместо Localizable.strings используйте en.strings и ru.strings файлы и при изменении языка передать имя таблицы ан или ру

Кроме того, как следует @Parser, вы должны обновить ваш Просмотры.

+0

Спасибо! Оно работает!! Но что мне делать с XIB и Storyboard? – Romowski

+0

вы также можете локализовать XIBs и раскадровки. Посмотрите на это http://www.youtube.com/watch?v=cF1Rf02QvZQ –

+0

Но как обновить XIBs и раскадровки? – Romowski

Смежные вопросы