【问题标题】:Can i link a uilabel to a localizable string in Interface Builder?我可以将 uilabel 链接到 Interface Builder 中的可本地化字符串吗?
【发布时间】:2011-09-14 08:54:13
【问题描述】:

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

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

这可能吗?

【问题讨论】:

  • 如果您认为(像我一样)使用 ibtool 本地化您的 IB 文件或通过在代码中链接您的组件很复杂,请查看这个库:github.com/angelolloqui/AGi18n 它只是为 添加了一些魔力在运行时翻译所有元素,对开发人员完全透明,并且还提供了一些命令从您的 IB 文件中提取标签到 Localizable.strings 中每种语言。 免责声明:我是库的开发者

标签: iphone localization interface-builder uilabel localizable.strings


【解决方案1】:

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

【讨论】:

  • 我的应用程序中每个可本地化标签的 UILabel 子类?这对我来说听起来有点矫枉过正:-S
  • @Jonathan,我认为你没有得到克劳斯的建议:你应该只做一个 UILabel 子类,它在 awakeFromNib 中会得到你设置标签的文本,并将其用作自动获取本地化字符串的键。我刚刚实现了它,它工作得很好。这应该是公认的答案!
  • 基础国际化提供了一种避免子类化 UILabel 以实现本地化的方法。
  • 我觉得这个更准确:rshankar.com/…
【解决方案2】:

我以迅捷的方式呈现给你

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 时,请记住相应地设置约束

【讨论】:

    【解决方案3】:

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

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

    您可以在UIViewControllerviewDidLoad 方法中设置它们。

    - (void) viewDidLoad {
       [supper viewDidLoad];
    
       self.someLabel.text = NSLocalizedString(@"Some Label", @"Some label on some view.");
    }
    

    【讨论】:

    • 这就是我正在做的事情,只是想知道是否有更好的方法。不得不说,Android 开发环境设置在这个部门遥遥领先。嗯……
    • 或者,如果您不想仅仅为了翻译而为每个标签设置 IBOutlets,您可以使用标签。
    • 有更好的方法。看看我的回答
    • 过时的答案。您需要使用带有自动布局约束的 Base 国际化。
    【解决方案4】:

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

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

    NSLocalizedString 相比,这样做有一些优势。

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

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

    如果您在 Google 上搜索 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
    

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

    如果您向 xcode 添加构建脚本,则每次构建时都会调用翻译的加载。

    【讨论】:

      【解决方案5】:

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

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

      请参考Apple Documentation about Base Internationalization.

      【讨论】:

      • 根本无法避免重复?我是 iOS 的菜鸟,我发现 Android 对这个问题的解决方案更加优雅。如果您本地化情节提要、启动屏幕并保留一个 .strings 文件,您可能会拥有 3 次相同的字符串。 DRY 故障就在那里。
      【解决方案6】:

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

      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 编写本地化密钥,并将在运行时进行本地化。

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

        • 是什么让你这么说?这仍然是可能的
        • “我认为除了本地化整个笔尖之外,没有其他方法可以仅使用笔尖”是错误的。
        【解决方案8】:

        这是我的版本。希望对您有所帮助。

        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: "")
            }
        
        }
        

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-23
            • 1970-01-01
            相关资源
            最近更新 更多