【问题标题】:Use localized strings in storyboard在情节提要中使用本地化字符串
【发布时间】:2017-10-27 04:07:17
【问题描述】:

我对 iOS 开发还很陌生,我问自己是否可以将“Localizable.strings”文件中的本地化字符串直接用于情节提要。 例如,在 Android 中,您可以像这样从 XML 文件中执行此操作:

android:text="@string/notConnected"

我知道您可以制作故事板的本地化版本,但是拥有不同的字符串文件和不同的故事板对我来说看起来很丑。

那么是否可以只有字符串文件并在情节提要中使用我需要的内容?最好不用代码设置?

编辑: 这实际上是我想要做的:

那么这可能吗?有没有像在 Android 中那样从那里调用字符串的合法方法?

【问题讨论】:

  • 多年来有多个涵盖本地化和国际化的 WWDC 视频。你看过哪些? Apple 还提供了一个 Internationalization and Localization Guide 来涵盖该主题;当您遵循文档时遇到什么问题(请具体说明):developer.apple.com/library/content/documentation/MacOSX/…
  • 请看我的编辑,好像我还不够清楚
  • 您是否阅读了我链接的文档?你说的是Base Internationalization

标签: ios localization storyboard


【解决方案1】:

我认为能够在故事板中本地化Strings 具有显着优势。我不同意@elk_cloner 的观点,即为每个UILabel 连接IBOutlets 是前进的方向。

使其工作的一种方法是在UILabel 子类上使用@IBInspectable 属性:

class LocalisableLabel: UILabel {

    @IBInspectable var localisedKey: String? {
        didSet {
            guard let key = localisedKey else { return }
            text = NSLocalizedString(key, comment: "")
        }
    }

}

在故事板中设置自定义类:

在属性检查器中,localisedKey 字段将出现,您可以在此处添加您的密钥。

就是这样!

编辑:

您可以用同样的方式本地化UIButtons,但是如果情节提要的标题字段中的文本与本地化的字符串不同(在其他语言中它会这样),标题的设置将会动画。

要解决此问题,请将 setTitle 放入 performWithoutAnimation 块中:

class LocalisableButton: UIButton {

    @IBInspectable var localisedKey: String? {
        didSet {
            guard let key = localisedKey else { return }
            UIView.performWithoutAnimation {
                setTitle(key.localized, for: .normal)
                layoutIfNeeded()
            }
        }
    }

}

【讨论】:

  • Xcode 有什么方法可以在情节提要中正确呈现字符串?
  • @Niklas 我认为这不可能。
  • @Niklas 当然,只需在子类中使用@IBDesignable。 @IBDesignable class DesignableButton: UIButton { } 其中 UIButton 已设置为 set(value) { text = NSLocalizedString(value!, comment: "") }
  • @SevenDays Niklas 询问是否可以在情节提要中呈现本地化文本本身。
  • @Leon 是的,我提供了有关如何在情节提要中呈现本地化文本的解决方案。它是通过在子类中使用 IBDesignable 说明符来完成的
【解决方案2】:

除了Leon's answer,您还可以通过使用扩展来摆脱对显式子类的需求:

extension UILabel {
    @IBInspectable var localizableText: String? {
        get { return text }
        set(value) { text = NSLocalizedString(value!, comment: "") }
    }
}

【讨论】:

  • post 中,您可以找到此方法的详细说明,以及一些小部件的example
  • 非常漂亮整洁。
【解决方案3】:

根据您的要求,这是不可能的,但是

本地化不需要不同的故事板

假设你想本地化一个标签字符串。

  1. 使用
  2. 绘制、导出和更改文本

mylabel.text = nsLocalizedString("THIS_IS_MY_STRING",nil);

当然在你的本地化文件中会有一行。对于不同的语言,你必须有不同的文件。假设你有一个英文文件,并且必须有一行。

"THIS_IS_MY_STRING" = "这是我的字符串";

当您编译您的应用时,该函数将使用映射来本地化您的应用。

编辑:

如果您想了解详细信息,请查看这些教程 internationalization-tutorial-for-ios-2014

ios-localization-tutorial

有一些在线脚本(例如 localize.py)可以帮助您自动搜索所有代码并找出 nslocalizedString 函数并在您的 localizableString 文件中创建行。像这样。

"THIS_IS_MY_STRING" = "THIS_IS_MY_STRING"

然后你只需要在那里写实际的字符串。 :)

【讨论】:

  • 我的意思是,如果我的标签上有静态文本,Xcode 会为情节提要本地化创建一个特定文件,但我的问题是关于使用本地化文件中的字符串而不从代码中写入使用它的位置,但直接进入情节提要编辑器
  • 请查看我的编辑以了解我的真正要求,如果我不清楚,请见谅
  • 好吧,我对它变得更好感到失望,但我会更好地记录自己,如果你编辑你的答案也说这是不可能的,我会接受它,谢谢你的时间和耐心
【解决方案4】:

制作一个按钮类并将@IBInspectable属性设置为按钮类

    class Button: UIButton {                 

      @IBInspectable public var referenceText: String = "" {
          didSet {
              self.setTitle(NSLocalizedString(referenceText, comment: ""), for: .normal)
          }
      }
}

然后在storyboard中可以设置referenceText

按钮文本将是“登录”

【讨论】:

  • 一个很好的解决方案可以完美运行!我将它改编为 UILabel 和我所有不同的观点都没有问题。
【解决方案5】:

另一种可能的方法是将情节提要本地化,然后直接在 .string 文件上更改标签和按钮的值。

首先选择storyboard,然后点击localize:

然后你就可以选择你想要的语言了。

这样您就可以继续使用您选择的语言进行开发,只需编辑生成的.string 文件

【讨论】:

    【解决方案6】:

    按钮

    extension UIButton {
    @IBInspectable var localizableText: String? {
        get { return titleLabel?.text }
        set(value)
        {
        setTitle(NSLocalizedString(value!, comment: ""), for: .normal)
        }}}
    

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      相关资源
      最近更新 更多