Подтвердить что ты не робот

Как изменить язык приложений 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);
}

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

4b9b3361

Ответ 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, @"");