26

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

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

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

在相应的字符串文件中:

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

但我的文字仍然是英文的。

有什么建议吗?

4

12 回答 12

12

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

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

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

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

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 使用基本本地化

于 2014-02-02T16:38:09.877 回答
7

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

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

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

XCODE XIB 检查器文件截图

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

然后,如果您愿意,您可以返回“可本地化的字符串”……在这种情况下,请注意,您必须使用“Interface Builder Cocoa Touch XIB”至少运行一次应用程序。选择的选项。

于 2014-10-06T17:41:18.633 回答
6

您可以使用 NSLocalizedStringFromTable 在 vi​​ewDidLoad 中检索由 xcode 的 IB 生成的文本,如下所示:

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

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

顺便说一句:这是一个 xcode/IB 错误,而不是 iOS 错误。

于 2015-02-22T18:04:05.383 回答
3

如果您想使用现有的 MainStoryboard.strings 文件,您可以使用本地化StringForKey:value:table: 像这样以编程方式分配文本视图的文本

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

于 2017-12-08T21:52:37.460 回答
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 的恢复标识符。

于 2015-12-24T12:14:05.300 回答
1

我让它与 Xcode 5.1.1 和 iOS7 一起工作。

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

您将看到一个“本地化...”按钮。点击按钮。您将看到一个可供选择的语言的下拉列表。选择基地,然后点击“本地化”。

在右侧面板中,本地化部分现在将选择“基础”,并且将列出您的其他语言。选择您要支持的语言。不选中您的应用程序的“本地”语言。

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

于 2014-05-29T16:20:18.637 回答
1

向 Apple 提交错误。让他们知道这正在发生,并给你(和我)带来时间和挫败感。整个本地化系统不是让我们回退到 NSLocalizedString..

于 2015-02-22T17:38:10.063 回答
0

更新

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

如果您的文本未格式化,只需使用:

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

如果您的文本格式化,则必须使用:

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

您不再需要通过更新的方法使用解决方法。

解决方法

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

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

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

尽管此解决方案绝对不优雅,但当您不必保留大量翻译时,它无疑是一个很好的解决方法。

话虽如此,使用情节提要本地化字符串不起作用。添加 IBOutlet 并使用 NSLocalizedString 设置文本属性也不起作用。我环顾四周寻找解决方案,似乎没有人真正能够找到一个明确的答案。

于 2014-07-15T22:16:13.787 回答
0

Xcode 7 似乎仍然有问题...

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

  1. 从设备中删除应用程序(不是模拟器)
  2. 产品 -> 清洁
  3. 在设备上运行

祝你好运。

于 2016-06-14T05:49:32.453 回答
0

这个问题在 Xcode 11.5 中仍然存在。我决定改用 UILabel 并且本地化文本正在按预期获取。当您在视图中保留静态文本时,这是一个简单的解决方法。请记住将 maxLines 设置为更高的数字。

于 2020-07-12T10:41:03.890 回答
0

我终于找到了原因。其中一行缺少分号字符。我已经把那个分号和问题修复了

于 2020-08-28T14:48:42.927 回答
-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

于 2013-10-17T12:52:48.743 回答