用xibstring文件本地化的UiTextView
我在xCode中使用基本国际化来pipe理我的应用中的多种语言。
在一个xib文件中我有这个对象:
Xrj-9E-2VK it's an UITextView
在相应的string文件中:
"Xrj-9E-2VK.text" = "text translated in french"
但是我的文本仍然是英文的。
任何build议?
我发现了以下解决方法,直到Apple修复了iOS 7中仍然存在的这个(严重)错误:
实际上,您需要将“基本本地化方法”(= Xcode 5和iOS 7的首选方法)与使用“Localizable.strings”文件的“旧”方法“混合”
1)创build文件“Localizable.strings”(文件 – >新build – > iOS – >资源 – > .strings文件)
2)使用Xcode为您使用的每种语言创build本文件的本地化版本(在“本地化”下的文件检查器中select文件“Localizable.strings”,单击您使用的每种语言旁边的selectbutton)。
3)在你的viewController为UITextField创build一个IBOutlet @property:
@property (weak, nonatomic) IBOutlet UITextView *localizedTextView;
4)在'viewDidLoad'下添加下面的代码:
self.localizedTextView.text = NSLocalizedString(@"textFieldKey", @"comment for the translator");
5)在每个“Localizable.strings”文件中添加:
“textFieldKey”=“你想放在textField中的翻译文本”;
这应该做到这一点!
请记住,苹果公司可能会在不久的将来修复这个bug,那么这个翻译将会从“基础本地化故事板”(带有对象引用的那个,例如“a8N-K9-eJb.text” =“some translation text”。在这种情况下,您可以删除“Localization.strings”文件,并再次使用基本本地化的UITextField
这仍然出现在Xcode 6和IOS 8下,以前的答案不满足我。
这是我简单而快速的解决方法:
- selectXIB,然后在文件检查器中
- 在“本地化”下方,find不起作用的语言
- 将“Localizable Strings”更改为“Interface Builder Cocoa Touch XIB”
- 运行应用程序,翻译应该现在就可以了!
如果您愿意,可以返回到“可本地化的string”。在这种情况下请注意,您必须至less运行一次“Interface Builder Cocoa Touch XIB”应用程序。 选项。
您可以使用NSLocalizedStringFromTable检索由xcode的IB生成的文本,如下所示,在viewDidLoad中:
self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");
其中2Vy-59-WN8.text是生成的密钥,你可以在Mainstrings中findUITextView。
顺便说一句:这是一个Xcode / IB错误,而不是iOS的错误。
我得到这个与Xcode 5.1.1和iOS7的工作。
在左边的文件面板中select你想要本地化的ViewController。 在右侧面板中select文件检查器。
你会看到一个“本地化…”button。 点击button。 您将看到可从中select的语言下拉列表。 select基地,然后点击“本地化”。
在右侧面板中,“本地化”部分现在将select“基本”,并列出您的其他语言。 select您想要支持的语言。 保持您的应用程序的“本地”语言不被选中。
肯定有caching问题。 我发现只有在我从模拟器中删除应用程序,并删除Xcode的派生数据后才会出现更改。
提交Apple的一个错误。 让他们知道这是发生的,并造成你(和我)的时间和挫折。 这整个本地化系统是不是有我们回落到NSLocalizedString ..
这是我的Swift 2的答案:
我们不想在每个UIViewController中重复修复,所以让我们从一个扩展开始:
import UIKit extension UIViewController { // if the property "Selectable" = NO it will reset the font and fontcolor when setText is used. // So turn Selectable ON func localizeUITextViewsFromStoryboard(storyboardName: String) { for view in self.view.subviews { if let textView = view as? UITextView, let restorationIdentifier = textView.restorationIdentifier { let key = "\(restorationIdentifier).text" let localizedText = NSLocalizedString(key, tableName: storyboardName, comment: "") if localizedText != key { textView.text = localizedText } } } } }
在每个需要此修复的UIViewController中,我们编写
override func viewDidLoad() { super.viewDidLoad() self.localizeUITextViewsFromStoryboard("Main") }
此代码使用UITextViews的恢复ID。 这意味着我们需要将对象ID复制到每个UITextView的故事板中的恢复标识符。
UPDATE
实际改变文本的最好方法是直接从UITextView中使用setter。
如果您的文本没有格式化,只需使用:
[textView setText:NSLocalizedString(key, comment)];
如果你的文本格式化,你必须使用:
[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];
您不需要使用已更新方法的解决方法。
WORKARROUND
为了达到这个目的,我find的最简单的解决scheme就是简单地在翻译文本的另一个地方添加一个额外的UITextView并隐藏它。
为了显示正确的视图,我在控制器的viewDidLoad方法中执行此操作:
NSString *language = [[NSLocale preferredLanguages] firstObject]; if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr" UITextView.hidden = YES; UITextViewFR.hidden = NO; }
虽然这个解决scheme绝对不是优雅的,但是当你不需要保留大量的翻译时,这当然是一个很好的解决方法。
这就是说,使用故事板本地化的string不工作。 添加一个IBOutlet并设置文本属性与NSLocalizedString不工作太。 我已经四处寻找解决scheme,似乎没有人真的能够find一个明确的答案。
Xcode 7仍然似乎越野车…
在尝试任何复杂的尝试之前,请尝试以下3个简单步
- 从设备上删除应用程序(不是模拟器)
- 产品 – >清洁
- 在设备上运行
祝你好运。
如果你想使用现有的MainStoryboard.strings文件,你可以使用localizedStringForKey以编程方式分配文本视图的文本:value:table:像这样
[[NSBundle mainBundle] localizedStringForKey:@"abc-12-3ba.text" value:@"" table:@"MainStoryboard"]
XIB文件没有自己的“.strings”文件。 您可以使用ibtool从XIB生成“.strings”,然后在翻译之后再次使用ibtool将翻译embedded到本地化的XIB中。
如果您还只有一个英文XIB,则需要使用Xcode创build法文XIB,然后执行ibtool进程。
看看这里: https : //developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/Articles/LocalizingInterfaces.html