Как изменить язык приложений iPhone во время выполнения?

Есть ли способ изменить язык приложения во время выполнения?

Итак, после изменения NSLocalizedString сразу возвращается строка для нового языка.

Теперь я меняю язык, используя следующий код:

- (void)onChangeLanguage: (id)sender 
{
    NSArray *lang = [NSArray arrayWithObjects:((InfoWhatever *)sender).language, nil];
    [[NSUserDefaults standardUserDefaults] setObject:lang forKey:@"AppleLanguages"];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
    NSString *currentLanguage = [languages objectAtIndex:0];

    NSLog(@"Current language: %@", currentLanguage);
}

Язык изменится, но только после перезапуска приложения.

Ответ 1

Я сомневаюсь, что вы можете это сделать, даже приложение Settings не может этого сделать.

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

Ответ 2

NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
[languages insertObject:@"de" atIndex:0]; // ISO639-1
[[NSUserDefaults standardUserDefaults] synchronize];

Ответ 3

Трюк для использования определенного языка, выбрав его из приложения, - заставить NSLocalizedString использовать конкретный пакет в зависимости от выбранного языка,

вот сообщение, которое я написал для этого http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

и вот код одного примера приложения https://github.com/object2dot0/Advance-Localization-in-ios-apps

Ответ 4

Вы можете это сделать. Вот путь http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html

2
   #import "LocalizationSystem.h"

3

- (IBAction)btnEnglishClicked:(id)sender {
     LocalizationSetLanguage(@"en");
}

4 После того, как вы установили язык выше,

AMLocalizedString(@"Key", nil)

Это он.

Ответ 5

Я придумал решение, которое позволяет использовать NSLocalizedString. Я создаю категорию вызова NSBundle NSBundle+RunTimeLanguage. Интерфейс подобен этому.

// NSBundle+RunTimeLanguage.h
#import <Foundation/Foundation.h>
@interface NSBundle (RunTimeLanguage)
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil]
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
@end

Реализация такая.

// NSBundle+RunTimeLanguage.m
#import "NSBundle+RunTimeLanguage.h"
#import "AppDelegate.h"

@implementation NSBundle (RunTimeLanguage)

- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"];
    NSBundle *languageBundle = [NSBundle bundleWithPath:path];
    NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil];
    return localizedString;
}
@end

Вместо добавления import NSBundle+RunTimeLanguage.h в файлы, которые используют NSLocalizedString.

Как вы можете видеть, я сохраняю свой код языка в свойстве AppDelegate. Это можно сохранить в любом месте.

Это единственное, что мне не нравится в этом: Предупреждение, что NSLocalizedString marco переопределено. Возможно, кто-то может помочь мне исправить эту часть.

Ответ 6

Просто добавьте следующие строки:

 #define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]   


 1. NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
            [defaults setObject:@[@"en"] forKey:@"AppleLanguages"];  [defaults
            synchronize];

 2. _label.text = NSLocalizedStringFromTableInBundle(@"Key", nil, currentLanguageBundle, @"");