从故事板本地化归因于UITextView

问题描述 投票:18回答:4

我正在使用故事板,并有一个视图,我已经将一些UITextViews子类化。

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

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

是否可以从故事板中提取属性文本以进行本地化?

ios xcode localization nsattributedstring
4个回答
18
投票

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

5
投票

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

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

这使我能够使用ibtool来提取字符串并仍然具有属性textview。


4
投票

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

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


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.