当我通过编程方式分配文本时,我可以使用NSLocalizedString(...),但是如果我直接在IB中编写文本(例如对于UILabel),该如何进行本地化?
一个解决方案是创建多个本地化的nib文件。如果您的本地化需求非常简单,并且只是在开发结束时将资源交给专业软件本地化人员,那么这可能是最好的选择。
如果您正在开发过程中进行本地化,并且UI正在快速更改,则重复的nib文件可能会带来很大的麻烦,因为每次UI调整都必须在每个本地版本的nib中进行复制。为了避免这种情况,在您的视图控制器中需要编写一些代码来处理设置本地化字符串,通常是在视图控制器的-viewDidLoad
方法中。确保每个具有本地化文本的控件都是IBOutlet
,并在IB中将它们连接到您的视图控制器。然后,您的视图控制器的-viewDidLoad
会看起来像这样:
- (void)viewDidLoad {
[super viewDidLoad];
hello.text = NSLocalizedString(@"Hello", @"Hello label");
world.text = NSLocalizedString(@"world", @"world label");
// ... etc
}
你需要在 -viewDidLoad
中完成此类型的视图设置,因为你的nib中的对象直到在-init
方法运行之后才完全创建。 -viewDidLoad
在-init
方法运行之后但在视图变为可见之前运行。
"MyKeyValue" = "Localized display label";
现在你可以使用如下代码进行键值本地化:NSLocalizedString(aKeyValue,nil)。
在标签中,你没有发现任何处理NSLocalizedString的值转换器。 因此,我创建了一个名为KeyToLocalizedStringTransformer的类来将键值转换为本地化字符串:
@interface KeyToLocalizedStringTransformer : NSValueTransformer {}
@implementation KeyToLocalizedStringTransformer
+ (Class)transformedValueClass
{
return [NSString class];
}
+ (BOOL)allowsReverseTransformation
{
return NO;
}
- (id)transformedValue:(id)aValue
{
NSString *NLString = [NSString stringWithString:NSLocalizedString(aValue,nil)];
return NLString;
}
准备的最后一步是在 +initialize: 中注册转换器,例如:
NSValueTransformer *transformer = [[KeyToLocalizedStringTransformer alloc] init];
[NSValueTransformer setValueTransformer:transformer forName:@"KeyToLocalizedStringTransformer"];