Как изменить язык приложений 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, @"");
Ответ 7
попробуйте следующее:
object_setClass ([NSBundle mainBundle], [класс MyBundle]);
https://github.com/maximbilan/ios_language_manager/blob/master/README.md