18

我正在使用情节提要并有一个视图,其中我对一些 UITextViews 进行了子类化。

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

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

是否可以从情节提要中提取属性文本以进行本地化?

4

4 回答 4

18

在 Xcode 6.1 上,最好的方法是将文本视图的属性文本复制到“BASE”RTF 文本中(例如使用 TextEdit 或直接从 XCode > New File > ressources > 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!!        
}
于 2014-12-01T10:38:12.367 回答
5

ibtool我最终得出结论,在当前版本中无法使用它。

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

这使我能够ibtool用来提取字符串并仍然具有属性的文本视图。

于 2013-02-01T13:03:18.080 回答
4

本地化故事板中的属性文本是没有意义的,因为您需要知道在翻译后在哪里应用属性。词序可能已经改变,例如,您在哪里指定了一些蓝色粗体文本可能不再有意义。

当然,您仍然可以通过代码来执行此操作,您可以将字符串拆分为多个字符串并单独本地化它们。然后您可以指定 setAttributes:range: 以便您知道正确的属性将始终应用于字符串的正确范围。

于 2014-08-07T10:23:35.257 回答
-3

这是一个我觉得非常有用的解决方法:只需使用翻译后的 TextView 创建一个 ViewController。详细说明(这里我只是将属性文本翻译成英文):

1) 使用“新文件”->“带有 Xib 的 UIViewController”创建一个新控制器。将其命名为“AttributedTranslated”,并使用 Interface Builder 仅用 TextView 填充正在翻译的属性文本。

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 中轻松翻译属性文本!

于 2014-08-26T11:55:53.160 回答