从故事板本地化归因于UITextView
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从故事板本地化归因于UITextView相关的知识,希望对你有一定的参考价值。
我正在使用故事板,并有一个视图,我已经将一些UITextViews子类化。
我的问题是我使用ibtool --generate-strings-file
从故事板中提取字符串进行本地化,然后在另一个故事板文件上使用ibtool -write
来应用翻译的字符串。
当我使用ibtool
时,任何具有属性文本的UITextViews都会被ibtool --generate-strings-file
命令忽略,并从生成的字符串文件中省略。
是否可以从故事板中提取属性文本以进行本地化?
在Xcode 6.1上,最好的方法是将文本视图的属性文本复制到“BASE”RTF文本中(例如使用TextEdit或直接从XCode> New File> ressources> RTF)。
通过TextEdit方式,您需要将文本导入项目。显然,如果你是通过Xcode完成的,那么无需导入。
然后只需使用实用工具面板找到“localize ...”按钮,它将为您完成这项工作。
要导入正确的版本(在viewWillAppear中为ex。),
NSURL *url = [[NSBundle mainBundle] URLForResource:[fileName stringByDeletingPathExtension] withExtension:[fileName pathExtension]];
NSError *error;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithFileURL:url
options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType}
documentAttributes:nil
error:&error];
[_originalMessage setAttributedText:attributedString];
Swift 4的更新:
var attrString: NSAttributedString?
let fileUrl: URL = Bundle.main.url(forResource: "mytextfile", withExtension: ".rtf")!
do {
attrString = try NSAttributedString(url: fileUrl, options: [.documentType:NSAttributedString.DocumentType.rtf], documentAttributes: nil)
} catch {
// Somebody do something!!
}
我最后得出的结论是,在当前版本中无法使用ibtool
完成。
相反,我让Textview成为纯文本视图,并使用我的子类解析其text属性,以便我可以创建一个NSMutableAttributedString
并设置所需的属性。
这使我能够使用ibtool
来提取字符串并仍然具有属性textview。
从故事板本地化属性文本是没有意义的,因为您需要知道在翻译后应用属性的位置。单词顺序可能已经改变,例如,您可能已经指定了一些蓝色粗体文本可能不再有意义。
您当然可以通过代码执行此操作,您可以将字符串拆分为多个字符串并单独进行本地化。然后,您可以指定setAttributes:range:这样您就知道正确的属性将始终应用于字符串的正确范围。
这是一个我觉得非常有用的解决方法:只需使用翻译的TextView创建一个ViewController。详细信息(这里我只是将属性文本翻译成英文):
1)使用“新文件” - >“带Xib的UIViewController”创建一个新的控制器。将其命名为“AttributedTranslated”,并使用Interface Builder将其填充为带有要翻译的属性文本的TextView。
2)在主控制器.m文件中,记下以下方法:
- (BOOL)isEng {
return [[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"];
}
3)在.h文件中定义“AttributedTranslated”对象和View
IBOutlet UIView *attrView;
AttributedTranslated *attr;
4)在主控制器的xib文件(或故事板)上,创建一个仅包含属性textView(以原始语言)的视图,并将其链接到“attrView”。
5)在viewDidLoad上执行以下操作:
if ([self isEng]) {
desc = [[Description alloc] init];
[attrView addSubview:attr.view];
}
也许这不是最好的方法,但它确实允许人们轻松地在Interface Builder中翻译属性文本!
以上是关于从故事板本地化归因于UITextView的主要内容,如果未能解决你的问题,请参考以下文章
使用故事板、自动布局和 Swift 的多行 UILabel 和 UITextView
故事板混乱:UITextView 和 UIView 不可见,UITextFields 不可编辑?