用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下,以前的答案不满足我。

这是我简单而快速的解决方法:

  1. selectXIB,然后在文件检查器中
  2. 在“本地化”下方,find不起作用的语言
  3. 将“Localizable Strings”更改为“Interface Builder Cocoa Touch XIB”

XCODE XIB检查器文件截图

  1. 运行应用程序,翻译应该现在就可以了!

如果您愿意,可以返回到“可本地化的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个简单步

  1. 从设备上删除应用程序(不是模拟器)
  2. 产品 – >清洁
  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