如何在运行时更改iPhone应用程序语言?

有没有办法在运行时更改应用程序的语言?

所以,更改后NSLocalizedString立即返回新语言的string。

我现在正在做的是使用下面的代码来改变语言:

 - (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); } 

语言将改变,但只有重新启动应用程序后。

我怀疑你可以做到这一点,即使设置应用程序无法做到这一点。

(当您在设置应用程序中更改语言时,屏幕会变黑,并显示“设置语言…”和一个进度轮。经过漫长的等待,您将重新回到Springboard中,看起来电话重启。

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

从应用程序中select使用特定语言的技巧是强制NSLocalizedString根据所选语言使用特定的包,

这里是我写这篇http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

这里是一个示例应用程序的代码https://github.com/object2dot0/Advance-Localization-in-ios-apps

你能行的 。 这是http://aggressive-mediocrity.blogspot.com/2010/03/custom-localization-system-for-your.html

  1. 简介下载并添加2个文件到项目中

    http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.h

    http://dl.dropbox.com/u/2917666/LocalizationSystem/LocalizationSystem.m

2
#import "LocalizationSystem.h"

3

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

4如上所述设置语言后

 AMLocalizedString(@"Key", nil) 

就是这样

我想出了一个解决scheme,允许您使用NSLocalizedString 。 我创build了一个类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 

只要将导入NSBundle+RunTimeLanguage.h添加到使用NSLocalizedString的文件。

正如你所看到的,我将我的languageCode存储在AppDelegate的属性中。 这可以存储在任何你想要的地方。

我唯一不喜欢的是一个警告, NSLocalizedString marco重新定义。 也许有人可以帮我解决这个问题。

只需添加这些行:

  #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, @""); 

试试这个:object_setClass([NSBundle mainBundle],[MyBundle class]);

https://github.com/maximbilan/ios_language_manager/blob/master/README.md