iOS: 在不重启的情况下更改本地化的 xib
iOS: Change Localized xib without restart
我知道有一些 pods 可以在不重新启动的情况下更改本地化字符串文件..就像 iOS-CustomLocalisator
但我的问题是我的项目严重依赖 xibs,它试图依赖服务器本地化而不是设备本地化。
希望有办法。
我目前在我的应用程序上这样做。
创建了一个 class 以访问所需语言的所需字符串。
#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
在视图中添加方法中的所有字符串。
- (void)loadStrings{
//Load all strings here
self.titleLabel = [RDLocalizedString localizedStringForKey:@"mainTitle"];
}
创建和观察者,当语言改变时将运行。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStrings) name:@"LANGUAGE_HAS_CHANGE" object:nil];
我认为您首先需要本地化所有 xib(通过单击文件检查器中的 "Localize..." 按钮)。选择您需要的语言,如果您也需要,请为 Localizable.strings 执行相同的操作。
然后在您的项目中导入 BundleLocalization 个文件。如果您需要更改语言,只需使用:
[[BundleLocalization sharedInstance] setLanguage:@"fr"];
它适用于 xib、storyboard 和 NSLocalizedString 函数。唯一的 "issue" 是您当前的视图控制器需要在设置语言时重新加载。如果您有 UINavigationController(使用 xib 或 stroyboard,这无关紧要),您可以使用以下方法:
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;
我知道有一些 pods 可以在不重新启动的情况下更改本地化字符串文件..就像 iOS-CustomLocalisator 但我的问题是我的项目严重依赖 xibs,它试图依赖服务器本地化而不是设备本地化。
希望有办法。
我目前在我的应用程序上这样做。
创建了一个 class 以访问所需语言的所需字符串。
#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
在视图中添加方法中的所有字符串。
- (void)loadStrings{ //Load all strings here self.titleLabel = [RDLocalizedString localizedStringForKey:@"mainTitle"]; }
创建和观察者,当语言改变时将运行。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStrings) name:@"LANGUAGE_HAS_CHANGE" object:nil];
我认为您首先需要本地化所有 xib(通过单击文件检查器中的 "Localize..." 按钮)。选择您需要的语言,如果您也需要,请为 Localizable.strings 执行相同的操作。
然后在您的项目中导入 BundleLocalization 个文件。如果您需要更改语言,只需使用:
[[BundleLocalization sharedInstance] setLanguage:@"fr"];
它适用于 xib、storyboard 和 NSLocalizedString 函数。唯一的 "issue" 是您当前的视图控制器需要在设置语言时重新加载。如果您有 UINavigationController(使用 xib 或 stroyboard,这无关紧要),您可以使用以下方法:
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;