从Storyboard本地化属性UITextView

18

我正在使用Storyboard,并且有一个视图,其中我已经子类化了一些UITextView。

我的问题是,我正在使用ibtool --generate-strings-file从Storyboard提取字符串进行本地化,然后在另一个Storyboard文件上使用ibtool -write应用翻译后的字符串。

当我使用ibtool时,任何具有属性文本的UITextView都会被ibtool --generate-strings-file命令忽略,并从生成的字符串文件中省略。

是否可能从Storyboard中提取带属性文本的内容以进行本地化?

4个回答

19

在Xcode 6.1上,最好的方法是将文本视图的属性文本复制到“BASE” RTF文本中(例如使用TextEdit或直接从XCode > 新文件 > 资源 > RTF)。

如果你选择使用TextEdit方式,请将你的文本导入项目。如果已经通过Xcode完成,则无需导入。

然后,在实用程序面板中找到“本地化…”按钮,它会为你完成此操作。

要导入正确的版本,只需执行以下操作(例如,在viewWillAppear中):

 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!!        
}

这是正确的做法!!无瑕疵 - Jan
这是一个很好的方法。它允许您轻松地本地化富文本,而不必使用带有 NSLocalizedString 和 NSAttributedString 的其他东西进行修改。更加简洁! - dustinrwh
这应该是被接受的答案。感谢分享! - Toastor

5

我最终得出结论,使用目前的版本的 ibtool 是无法完成这个任务的。

相反,我让文本视图成为一个纯文本视图,并使用我的子类解析其文本属性,以便我可以创建一个 NSMutableAttributedString 并设置所需属性。

这使得我能够使用 ibtool 提取字符串并仍然拥有一个带属性的文本视图。


我遇到了同样的问题。我已向苹果提交了一个错误报告。 - Scott Berrevoets
1
还没有解决这个问题吗?难以相信这样的漏洞存在了这么长时间。 - Ronny Webers
这是一个旧的帖子,但我认为仍然值得澄清。@ScottBerrevoets,但这真的是一个错误吗?请看我的回答。 - m.y

4

从 storyboard 中本地化带属性的文本是没有意义的,因为在翻译之后需要知道在哪里应用这些属性。单词顺序可能已经改变,在某些情况下你之前指定的蓝色粗体文本可能再也不合适了。

当然,你仍然可以通过代码来进行本地化,将字符串拆分成多个部分并逐个进行本地化。然后,你可以使用 setAttributes:range: 方法来确保正确的属性始终被应用于字符串的正确范围内。


-3
这里有一个我觉得非常有用的解决方法:只需创建一个带有翻译TextView的ViewController。具体步骤如下(这里我只是将属性文本翻译成了英语):
1)使用“新建文件”-〉“带有Xib的UIViewController”创建一个名为“AttributedTranslated”的新控制器,并在其中添加一个仅包含已翻译属性文本的TextView,使用Interface Builder进行设置。
2)在您的主控制器.m文件中,编写以下方法:
- (BOOL)isEng {
    return [[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"];
}

3) 在你的 .h 文件中定义一个 "AttributedTranslated" 对象和一个视图

IBOutlet UIView            *attrView;    
AttributedTranslated       *attr;

4) 在您的主控制器的xib文件(或故事板)上,创建一个仅包含属性化textView(以原始语言)的视图,并将其链接到“attrView”。

5) 在您的viewDidLoad中执行以下操作:

if ([self isEng]) {

    desc = [[Description alloc] init];
    [attrView addSubview:attr.view];
}

也许这不是最好的方式,但它确实可以轻松地在Interface Builder中翻译属性文本!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接