UITextView在故事板中的本地化

所以我有一个应用程序与不同的button,标签和故事板中的一些文本视图,我直接在故事板中input文本。 我启用了基本的本地化,并添加了几种语言。

这为Base(英语)和其他语言生成了故事板,其中包含项目objectID列表。 我翻译了所有的东西,标签和button(所有的东西)都以我设置的语言工作和显示。

然而,文本字段不断显示最初的英文文本,无论我设置了哪种语言…是否有任何额外的步骤涉及到文本视图?

所以,我做了一些研究,似乎为了这个工作正常,UITextView的文本需要以编程方式设置。

来源: Devforums.apple

引用:

据我了解,像文本视图/字段的文本属性的string必须使用NSLocalizedString在代码中设置。 如果您有时间观看,则WWDC 2013video会议#219的第一个半小时即可涵盖此内容

因此,似乎解决方法(如果您不想以编程方式设置文本)是在发送应用程序之前将string文件转换为故事板。 这似乎按预期工作,并显示UITextView正确本地化。

编辑:发现另一个解决方法,允许保持.strings文件。

- (void)viewDidLoad

 for(UIView* v in self.view.subviews) { if([v isKindOfClass:[UITextView class]]) { UITextView* txv = (UITextView*)v; NSString *loctxt = [txv.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; txv.text = NSLocalizedString(loctxt, @""); } } 

这会从故事板内的任何内容生成一个百分比转义编码的string,如下所示:

 Hello%20World 

在您的Localizable.strings文件中,您使用上面的关键字,这将在运行时为所选语言环境生成应用程序中的本地化文本,如下所示:

 "Hello%20World" = "Hallo Welt"; 

转义百分比处理基本string中的所有转义字符。

如果任何人仍然感兴趣,我已经以不同的方式解决了这个问题,这将允许您仍然使用由Xcode生成的SAME .Strings文件作为故事板。

这个解决scheme有两个部分:

在您的视图的.m文件中添加以下代码:

 - (void)viewDidLoad { [super viewDidLoad]; for(UIView* view in self.view.subviews) { if([view isKindOfClass:[UITextView class]] && view.restorationIdentifier) { UITextView* textView = (UITextView*)view; NSString *textViewName = [NSString stringWithFormat:@"%@.text",textView.restorationIdentifier]; textView.text = NSLocalizedStringFromTable(textViewName, @"Main", nil); //change this to be the same as the name of your storyboard ^^^ } } // Do any additional setup after loading the view. } 

并在身份检查员的故事板中将“对象ID”复制到“恢复ID”字段。

这会将新的本地化文本应用于屏幕加载的所有UITextView,并允许您使用已经生成的string文件。

正如我对德米特里的答案的评论不能很好地格式化,我在这里重复这个答案。 他的解决scheme的Swift版本如下所示:

 override func viewDidLoad() { super.viewDidLoad() for view in self.view.subviews { if let tv = view as? UITextView, ident = view.restorationIdentifier { tv.text = NSLocalizedString("\(ident).text", tableName: "Main", comment: "") } } // Do any additional setup after loading the view. } 

(请注意,在Swift中, NSLocalizedStringreplace了几个Objective-Cmacros,其中之一是NSLocalizedStringFromTable

PS:不幸的是,在iOS 10中,这似乎不再适用。 相反,调用返回作为第一个参数提供的id(例如“ abc-xy-pqr.text ”)。 有任何想法吗?

我为组件创build了自己的类别。

例如,一个button:

 #import <UIKit/UIKit.h> @interface LocalizedButton : UIButton @end #import "LocalizedButton.h" @implementation LocalizedButton - (id)initWithCoder:(NSCoder *)aDecoder { NSLog(@"Loading LocalizedButton: initWithCoder"); if ((self = [super initWithCoder:aDecoder])){ [self localizeButton]; } return self; } - (id)initWithFrame:(CGRect)frame{ NSLog(@"Loading LocalizedButton: initWithFrame"); self = [super initWithFrame:frame]; if (self) { [self localizeButton]; } return self; } -(void) localizeButton{ self.titleLabel.adjustsFontSizeToFitWidth = YES; NSString* text = NSLocalizedString(self.titleLabel.text, nil); [self setTitle:text forState:UIControlStateNormal]; [self setTitle:text forState:UIControlStateHighlighted]; [self setTitle:text forState:UIControlStateDisabled]; [self setTitle:text forState:UIControlStateSelected]; } @end 

你可以select完整的代码: https : //github.com/exmo/equizmo-ios/blob/master/Quiz/LocalizedButton.m

Swift解决schemehttps://stackoverflow.com/users/1950945/stefan适用于iOS 10.2,当我用正确的id(例如“MainStoryboard”)replace引用本地化文件id.storyboard(例如“MainStoryboard.storyboard”)