iOS:无需重启即可更改本地化的xib

时间:2015-08-12 08:49:47

标签: ios objective-c localization localizable.strings

我知道有一些pod可以在不重新启动的情况下更改本地化的字符串文件..就像iOS-CustomLocalisator一样 但我的问题是我的项目严重依赖于xibs,它试图依赖服务器本地化而不是设备本地化。

希望有办法解决这个问题。

2 个答案:

答案 0 :(得分:6)

我认为您首先需要本地化所有xib(通过单击文件检查器中的“Localize ...”按钮)。选择您需要的语言,如果您需要,也可以对Localizable.strings执行相同的操作。

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

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

它适用于xib,storyboard和NSLocalizedString函数。唯一的“问题”是您在设置语言时需要重新加载当前视图控制器。如果你有一个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;

答案 1 :(得分:1)

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

  1. 创建了一个类,用于访问所需语言的所需字符串。

    #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. 在视图上添加方法上的所有字符串。

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

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