17

谷歌搜索但没有找到解决方案:

基本上,我有一个 Localizable.strings 设置,我在我的代码中使用它。但是,如果我也能以某种方式在我的 XIB 中引用这些值,那就太好了,这样我就可以避免必须为每种语言创建一个烦人的 XIB...

这可能吗?

4

9 回答 9

18

您可以实现 UILabel 的子类,并让它在从 nib 初始化时自动提取本地化值。然后,在 XIB 中,您只需设置标记(如果您愿意,也可以设置英文文本)并让 UILabel 从该值中提取本地化文本。

于 2011-09-14T09:01:35.207 回答
16

我以迅捷的方式呈现给你

1.创建UILabel的子类

class LozalizedLabel : UILabel {

    @IBInspectable var keyValue: String {
        get {
            return self.text!
        }
        set(value) {
            self.text = NSLocalizedString(value, comment: "")

        }
    }
}

2.在IB中设置类为LocalizedLabel

在此处输入图像描述

3. 直接在 IB 中输入来自 Localizable.strings 的密钥

在此处输入图像描述

瞧,现在花更少的时间创建无用的 IBOutlets 只是为了使其成为可本地化的 UILabel。

注意 这不会使本地化字符串显示在界面构建器中,而只是“键”。因此,在构建 TextView 时,请记住相应地设置约束

于 2017-08-31T12:52:42.383 回答
5

没有办法Localizable.strings直接使用 Interface Builder 进行设置。

您可能想要翻译 NIB 的原因是因为每种语言的单词长度可能会有所不同。因此,您可以更改每种语言的笔尖布局。

你可以在viewDidLoad你的UIViewController.

- (void) viewDidLoad {
   [supper viewDidLoad];

   self.someLabel.text = NSLocalizedString(@"Some Label", @"Some label on some view.");
}
于 2011-09-14T08:57:37.970 回答
5

NSLocalizedString具有易于实施的优点。风险是您可能会忘记为新的 Gui 元素添加条目。

您可以使用itool从原始 xib 文件中转储字符串,翻译这些转储的字符串,然后将翻译后的字符串加载到 other-language-xib 文件中。

NSLocalizedString.

  • 翻译和字符串长度的所有考虑仍然适用,但您只需触摸原始 xib,其他语言可以通过脚本更新。
  • 您会看到已翻译的元素以及转储文件中每个 UIElement 的不同可能状态。
  • 您将有更多的单字符串文件发送给您的翻译人员,但更容易了解哪些部分需要翻译,哪些部分已完成。
  • GUI 对英文 xib 所做的更改应用于本地化 xib,您基本上是将原始 xib 与翻译后的字符串合并。

当您创建一个 XIB 时,您将其设置为本地化(如前所述),然后itool针对此原始 xib 运行以提取字符串。将字符串文件翻译成所需的语言,然后将翻译加载到本地化的 xib 中。

如果你用谷歌搜索ibtool --generate-strings-file你应该找到一些教程和例子。

语法应类似于:

  #dump original xib to a $xibfile.strings file:
  ibtool --generate-strings-file Resources/English.lproj/$xibfile.strings Resources/English.lproj/$xibfile.xib
  # offline: translate the $xibfile.xib, place it into the correct lproj folder
  # then: merge translated $xibfile.strings with original xib to create localized xib
  ibtool --strings-file Resources/de.lproj/$xibfile.strings --write Resources/de.lproj/$xibfile.xib Resources/English.lproj/$xibfile.xib

$xibfile.stringsResources/English.lproj 目录中将包含原始(英语语言)字符串。翻译的 $xibfile.strings必须放在适当的xx.lproj目录中。

如果您将构建脚本添加到 xcode,则将在每次构建时调用翻译的加载。

于 2011-09-14T10:24:45.760 回答
4

IB 不能使用 Localizable.strings 中的字符串,但还有另一个选项称为Base Internationalization。

简而言之:您可以为每种所需语言创建附加到 xib/storyboard 的单独 .strings 文件。结果,您将拥有 xib,每种语言都有自己的翻译。因此它可以复制您在 Localizable.strings 中的一些值,但它比通过代码设置或复制 xib 文件更清晰。

请参阅有关 Base Internationalization 的 Apple 文档。

于 2015-01-05T18:08:11.787 回答
2

另一种快捷方式,但有扩展名:

extension UILabel {
    static var localizedKey:UInt8 = 0

    @IBInspectable public var localizationKey: String? {
        set {
            objc_setAssociatedObject(self, &UILabel.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
        get {
            return objc_getAssociatedObject(self, &UILabel.localizedKey) as? String
        }
    }

    open override func awakeFromNib() {
        super.awakeFromNib()
        if let localizationKey = self.localizationKey {
            self.text = NSLocalizedString(localizationKey, comment: "")
        }
    }
}

然后,您将能够直接从 IB 编写本地化密钥,并将在运行时进行本地化。

于 2018-02-28T14:26:25.470 回答
1

您可以在代码中执行此操作:

    label.text = NSLocalizedString(@"key", @"comment");

但我认为除了本地化整个笔尖之外,没有其他方法可以仅使用笔尖。过去我当然没有找到其他方法。

于 2011-09-14T08:56:48.610 回答
1

这是我的版本。希望能帮助到你。

extension UILabel {

    /// The IBInspectable helps us to set localizable text in IB
    @IBInspectable var localizableText: String? {
        get { return text }
        set(value) { text = value?.localized() }
    }


    /// The IBInspectable helps us to set localizable text in IB
    @IBInspectable var localizableUppercaseText: String? {
        get { return text }
        set(value) { text = value?.localized().uppercased() }
    }
}

extension String {

    func localized(bundle: Bundle = .main, tableName: String = "Localizable") -> String {
        return NSLocalizedString(self, tableName: tableName, value: "**\(self)**", comment: "")
    }

}
于 2018-11-06T11:29:36.973 回答
0

Apple 支持的本地化 .xib 文件的方法。这允许您本地化每种语言/国家/地区的文本和布局。

在此处输入图像描述

于 2015-05-14T15:20:27.323 回答