【问题标题】:Localizing attributed UITextView from storyboard从情节提要本地化属性 UITextView
【发布时间】:2013-01-22 13:36:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios xcode localization nsattributedstring


    【解决方案1】:

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

    【讨论】:

    • 这是正确的做法!!完美无瑕
    • 这是一个很好的方法。它允许您轻松本地化富文本,而无需仅使用 NSLocalizedString 和 NSAttributedString 破解其他内容。干净多了!
    • 这应该是公认的答案。谢谢分享!!
    【解决方案2】:

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

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

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

    【讨论】:

    • 我遇到了同样的问题。我已经向 Apple 提交了错误报告。
    • 仍然没有解决方案?不敢相信这样的bug存在这么久
    • 这是一个旧线程,但我想仍然值得澄清。 @ScottBerrevoets 这真的是一个错误吗?看我的回答。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这是一个我觉得非常有用的解决方法:只需使用翻译后的 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 中轻松翻译属性文本!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 2012-07-31
        • 2017-10-27
        相关资源
        最近更新 更多