我可以将uilabel链接到Interface Builder中的可本地化字符串吗?

时间:2011-09-14 08:54:14

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

已经搜索过,但没有找到解决方案:

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

这可能吗?

9 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:9)

我向你展示了很棒的方式

<强> 1。创建UILabel的子类

class LozalizedLabel : UILabel {

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

        }
    }
}

<强> 2。在IB

中将类设置为LocalizedLabel

enter image description here

第3。直接在IB

中输入Localizable.strings中的密钥

enter image description here

Voila,现在花更少的时间来创建无用的IBOutlets,只是为了让它成为可本地化的UILabel。

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

答案 2 :(得分:5)

无法直接使用Interface Builder从Localizable.strings设置。

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

您可以使用viewDidLoad的{​​{1}}方法设置它们。

UIViewController

答案 3 :(得分:5)

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

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

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

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

创建XIB时,将其设置为本地化(如前所述),然后针对此原始xib运行itool以提取字符串。 将字符串文件转换为所需的语言,然后将转换加载到本地化的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
Resources / English.lproj目录中的

$xibfile.strings将包含原始(英语)字符串。已翻译的$xibfile.strings必须位于相应的xx.lproj目录中。

如果您将构建脚本添加到xcode,那么将在每次构建时调用转换的加载。

答案 4 :(得分:4)

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

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

请参阅Apple Documentation about Base Internationalization.

答案 5 :(得分:1)

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

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

但我不认为除了本地化整个笔尖之外,还有其他方法可以使用nib。我当然没有找到另一种方式。

答案 6 :(得分:0)

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

enter image description here

答案 7 :(得分:0)

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

from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver


def add_credentials_moz(driver, target, username, password):
    driver.execute("SET_CONTEXT", {"context": "chrome"})        
    driver.execute_script("""
        let [target, username, password] = [...arguments];
        let WebRequest = Cu.import('resource://gre/modules/WebRequest.jsm', {});
        WebRequest.onAuthRequired.addListener(function listener(){
          WebRequest.onAuthRequired.removeListener(listener);
          return Promise.resolve({authCredentials: {username: username, password: password}});
        }, {urls: new MatchPatternSet([target])}, ['blocking']);
        """, target, username, password)        
    driver.execute("SET_CONTEXT", {"context": "content"})

WebDriver.add_credentials_moz = add_credentials_moz



driver = webdriver.Firefox()
driver.add_credentials_moz("https://httpbin.org/*", username="user", password="passwd")

driver.get("https://httpbin.org/")

driver.find_element_by_css_selector("[href='/basic-auth/user/passwd']")\
      .click()

然后,您就可以直接从IB编写本地化密钥,它将在运行时进行本地化。

答案 8 :(得分:0)

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

flex-direction: row