繁体   English   中英

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

[英]UiTextView localized with xib strings file

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

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

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

在相应的字符串文件中:

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

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

有什么建议吗?

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

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

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

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

XCODE XIB 检查器文件截图

  1. 运行应用程序,现在翻译应该没问题了!

如果您愿意,您可以返回到“Localizable Strings”...在这种情况下,请注意您必须至少运行一次带有“Interface Builder Cocoa Touch XIB”的应用程序。 选择了选项。

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

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

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

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

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

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

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

我让它与 Xcode 5.1.1 和 iOS7 一起使用。

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

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

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

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

向 Apple 提交错误。 让他们知道这正在发生,并导致您(和我)时间和沮丧。 整个本地化系统并不是为了让我们回到 NSLocalizedString..

更新

实际更改文本的最佳方法是直接使用 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 设置文本属性也不起作用。 我四处寻找解决方案,似乎没有人真正能够找到明确的答案。

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

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

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

祝你好运。

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

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

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

如果你还只有一个英文的XIB,你需要用Xcode创建一个法文的XIB,然后做ibtool的过程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM