UiTextView使用xib字符串文件进行本地化

时间:2013-10-17 12:11:58

标签: ios internationalization

我在xCode中使用基础国际化来管理我的应用中的多种语言。

在xib文件中我有这个对象:

Xrj-9E-2VK it's an UITextView

在相应的字符串文件中:

"Xrj-9E-2VK.text" = "text translated in french"

但我的文字还是英文。

有任何建议吗?

12 个答案:

答案 0 :(得分:12)

我找到了以下解决方法,直到Apple修复了iOS 7中仍存在的这个(严重)错误:

您实际上需要将“基本本地化方法”(= Xcode 5和iOS 7的首选方法)与使用“Localizable.strings”文件的“较旧”方法“混合”

1)创建文件'Localizable.strings'(文件 - >新 - > iOS - >资源 - > .strings文件)

2)使用Xcode为您使用的每种语言创建此文件的本地化版本(选择文件'Localizable.strings',在'本地化'下的文件检查器中单击您使用的每种语言旁边的选择按钮)。 / p>

3)在你的viewController中为UITextField创建一个IBOutlet @property:

@property (weak, nonatomic) IBOutlet UITextView *localizedTextView;

4)在'viewDidLoad'下添加以下代码:

self.localizedTextView.text = NSLocalizedString(@"textFieldKey", @"comment for the translator");

5)在每个'Localizable.strings'文件中添加:

“textFieldKey”=“您希望将其放入textField中的翻译文本”;

应该这样做!

请记住,Apple可能会在不久的将来某处修复此错误,在这种情况下,翻译将取自“基本本地化故事板”(具有对象引用的那个,如“a8N-K9-eJb”) .text“=”一些翻译文本“。在这种情况下,您可以删除'Localization.strings'文件,并再次使用基本本地化为UITextField

答案 1 :(得分:8)

这仍然出现在Xcode 6& IOS 8,以前的答案并不能让我满意。

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

  1. 选择XIB,然后在文件检查器中
  2. 下面"本地化",找到不起作用的语言
  3. 更改"可本地化的字符串"到" Interface Builder Cocoa Touch XIB"
  4. XCODE XIB inspector file screenshot

    1. 运行应用程序,翻译现在应该没问题!
    2. 然后你可以回到" Localizable Strings"如果你更喜欢... 在这种情况下,请注意您必须使用" Interface Builder Cocoa Touch XIB至少运行一次应用程序。"选择了选项。

答案 2 :(得分:5)

您可以使用NSLocalizedStringFromTable来检索由xcode的IB生成的文本,如下所示:viewDidLoad:

self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");

其中2Vy-59-WN8.text是生成的密钥,您可以在UITextView的Main.strings中找到。

BTW:这是一个xcode / IB错误,而不是iOS错误。

答案 3 :(得分:2)

这是我的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的故事板中的恢复标识符。

答案 4 :(得分:1)

我使用Xcode 5.1.1和iOS7。

在左侧文件面板中选择要本地化的ViewController。 在右侧面板中,选择文件检查器。

您将看到"本地化..."按钮。点按按钮。您将看到一个可从中选择的语言下拉列表。选择Base,然后点击" Localize"。

在右侧面板中,本地化部分现在将具有" Base"选中,您的其他语言将被列出。选择您要支持的语言。离开" native"您的应用语言未选中。

肯定存在缓存问题。我发现只有在我从模拟器中删除应用程序并删除Xcode的派生数据后才会出现更改。

答案 5 :(得分:1)

提交Apple的错误。让他们知道这种情况正在发生,并导致你(和我)时间和挫折。这整个本地化系统不是让我们回到NSLocalizedString ..

答案 6 :(得分:1)

如果要使用现有的MainStoryboard.strings文件,可以使用localizedStringForKey以编程方式分配textview的文本:value:table:like this

[[NSBundle mainBundle] localizedStringForKey:@"abc-12-3ba.text" value:@"" table:@"MainStoryboard"]

答案 7 :(得分:0)

<强>更新

实际更改文本的最佳方法是直接使用UITextView中的setter。

如果您的文字格式为 NOT ,请使用:

[textView setText:NSLocalizedString(key, comment)];

如果您的文字 IS 已格式化,则必须使用:

[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];

您不再需要使用更新后的方法来解决此问题。

<强> WORKARROUND

为了能够实现这一点,我找到的最简单的解决方案是简单地添加一个额外的UITextView,其中翻译的文本与另一个完全相同并隐藏它。

要显示正确的视图,我在控制器的viewDidLoad方法中执行此操作:

NSString *language = [[NSLocale preferredLanguages] firstObject];
if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr"
    UITextView.hidden = YES;
    UITextViewFR.hidden = NO;
}

虽然这个解决方案绝对不优雅,但当你不必保留大量翻译时,它肯定是一个很好的解决方法。

话虽这么说,使用故事板本地化字符串是行不通的。添加IBOutlet并使用NSLocalizedString设置text属性也不起作用。我一直在寻找一个解决方案,似乎没有人能真正找到一个明确的答案。

答案 8 :(得分:0)

Xcode 7似乎还有错误...

在尝试任何复杂的事情之前,请尝试以下3个简单的步骤:

  1. 从设备(不是模拟器)中删除应用
  2. 产品 - &gt;清洁
  3. 在设备上运行
  4. 祝你好运。

答案 9 :(得分:0)

在Xcode 11.5中仍然会出现此问题。我决定改用UILabel,并且按预期方式提取了本地化的文本。当您在视图中保留静态文本时,这是一个简单的解决方法。只需记住将maxLines设置为更高的数字即可。

答案 10 :(得分:0)

我终于找到了原因。缺少其中一行的分号字符。我已经把分号和问题解决了

答案 11 :(得分:-1)

XIB文件没有自己的“.strings”文件。您可以使用ibtool从XIB生成“.strings”,然后在翻译后再次使用ibtool将翻译嵌入到本地化的XIB中。

如果您仍然只有一个英文XIB,则需要使用Xcode创建一个法语XIB,然后执行ibtool过程。

看看这里: https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/Articles/LocalizingInterfaces.html