我正在使用故事板并且有一个视图,我已经将一些UITextViews子类化了。
我的问题是我使用ibtool --generate-strings-file
从故事板中提取字符串以进行本地化,然后在另一个故事板文件上使用ibtool -write
来应用翻译后的字符串。
当我使用ibtool
时,ibtool --generate-strings-file
命令会忽略任何已归属文本的UITextView,并从结果字符串文件中省略。
是否可以从故事板中提取属性文本以进行本地化?
答案 0 :(得分:18)
在Xcode 6.1上,最好的方法是将文本视图的属性文本复制到“BASE”RTF文本中(例如使用TextEdit或直接从XCode> New File> ressources> RTF)。
通过TextEdit方式,您需要将文本导入项目中。显然,如果你是通过Xcode完成的,那就无需导入。
然后只需使用utilies面板找到“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!!
}
答案 1 :(得分:5)
我最后得出的结论是,在目前的版本中无法使用ibtool
完成。
相反,我让Textview成为纯文本视图,并使用我的子类解析其text属性,以便我可以创建NSMutableAttributedString
并设置所需的属性。
这使我能够使用ibtool
来提取字符串并仍然具有属性textview。
答案 2 :(得分:4)
从故事板中本地化属性文本是没有意义的,因为您需要知道在翻译后应用属性的位置。单词顺序可能已经改变,你可能已经指定了一些蓝色粗体文本,例如可能不再有意义。
您当然可以通过代码执行此操作,您可以将字符串拆分为多个字符串并单独进行本地化。然后你可以指定setAttributes:range:这样你就知道正确的属性将始终应用在字符串的正确范围内。
答案 3 :(得分:-3)
这是一个我觉得非常有用的解决方法:只需使用翻译的TextView创建一个ViewController。详细信息(这里我只是将属性文本翻译成英文):
1)使用" New File"创建一个新的控制器。 - > " UIViewController与Xib"。将其命名为" AttributedTranslated"并使用Interface Builder将其填充为带有翻译的属性文本的TextView。
2)在主控制器.m文件中,记下以下方法:
- (BOOL)isEng {
return [[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"];
}
3)定义" AttributedTranslated"对象和.h文件中的视图
IBOutlet UIView *attrView;
AttributedTranslated *attr;
4)在主控制器的xib文件(或故事板)上,创建一个仅包含属性textView的视图(使用原始语言)并将其链接到" attrView"。
5)在viewDidLoad上执行以下操作:
if ([self isEng]) {
desc = [[Description alloc] init];
[attrView addSubview:attr.view];
}
也许它不是最好的方法,但它确实允许人们轻松地在Interface Builder中翻译属性文本!