iOS:更改本地化的xib而不重新启动

我知道,有一些改变本地化的string文件没有重新启动的豆荚。就像iOS-CustomLocalisator但我的问题是我的项目很大程度上依赖于xibs,它试图依靠服务器本地化而不是设备本地化..

希望有一个办法。

我想你首先需要本地化所有的xib(通过点击文件检查器中的“Localize …”button)。 select您需要的语言,并对Localizable.strings也做同样的事情。

然后在您的项目中导入BundleLocalization文件。 如果您需要更改语言,只需使用:

[[BundleLocalization sharedInstance] setLanguage:@"fr"]; 

它将用于xib,storyboard和NSLocalizedString函数。 唯一的“问题”是当你设置语言时,你当前的视图控制器需要重新加载。 如果你有一个UINavigationController(有一个xib或者一个游戏板,它没有问题),你可以使用下面的方法:

 UINavigationController *navController = self.navigationController; UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"currentViewControllerId"]; NSMutableArray *viewControllersArray = [[NSMutableArray alloc] initWithArray:navController.viewControllers]; [viewControllersArray replaceObjectAtIndex:([navController.viewControllers count] - 1) withObject:vc]; navController.viewControllers = viewControllersArray; 

我目前在我的应用程序上这样做。

  1. 创build一个类来访问你想要的语言所需的string。

     #import <Foundation/Foundation.h> @interface RDLocalizedString : NSObject + (NSString*)localizedStringForKey:(NSString*)key; @end #import "RDLocalizedString.h" @implementation WMLocalizedString + (NSString*)localizedStringForKey:(NSString*)key{ //This method will return the name of the string file. my string files are all (en.strings, fr.strings, es.strings ,etc) NSString *tableName = [[LanguageManager sharedManager] getCurrentlanguageKey]; NSString* str = [[NSBundle mainBundle] localizedStringForKey:key value:@"#NA#" table:tableName]; //if no string is found use the english pne if ([str isEqualToString:@"#NA#"]) { str = [[NSBundle mainBundle] localizedStringForKey:key value:@"#NA#" table:@"en"]; } return str; } @end 
  2. 在视图上添加一个方法的所有string。

     - (void)loadStrings{ //Load all strings here self.titleLabel = [RDLocalizedString localizedStringForKey:@"mainTitle"]; } 
  3. 创build和观察者将在语言改变时运行。

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStrings) name:@"LANGUAGE_HAS_CHANGE" object:nil];