故事板中的标签没有采用正确的本地化值

Label in storyboard don't take the right localization value

我已经构建了一个应用程序,现在是时候将它翻译成不同的语言了。但是我认为我已经本地化的一些标签不会以具有不同值的不同语言显示。

图片一:首先,我在里面添加了瑞典语

"Project -> Localizations"

然后我进入 "LaunchScreen.storyboard" 并编辑了文件。 这个:

编辑为:

之后我确保我的启动屏幕支持这样的语言:

最后一步..我将应用程序语言编辑为瑞典语,如下所示:


但是当我在模拟器上 运行 时,文本没有得到翻译。它仍然是相同的文本,我不知道如何解决它。你?请随时帮助我,我将不胜感激!

因此,我不确定是否必须添加一些代码或其他任何内容才能使这项工作正常进行,但我遵循了指南,但他们没有。这就是我如此困惑的原因之一。提前致谢!

不喜欢之前:至少给我一个理由,以后我可以改进!

由于情节提要元素的 ID 发生了变化并且它们无法在本地化 "key-value" 对中用作 "keys",所以当本地化情节提要 (UI) 元素时,一个更好的解决方案可能是提供定义为 Locale Key 的自定义 User Define Attribute 以用于 UIView.

然后您可以在 Storyboard Attribute Inspector 中定义特定的 UI 查看输入字段,该字段将填充 localized key 在您的 Localizable.strings 文件中定义(一个对于英语,一个将用于瑞典语,两者应具有相同的键但具有不同的值 - 在英语中,一个值将具有英文翻译,而在瑞典语中,则相反。

1) 例如,因为你想本地化一个 UI 视图 UILabel 而不是你可以在 swift 文件 Localizable.swift 中有这个(代码使可能:

import UIKit

// MARK: Localizable
public protocol Localizable {
    var localized: String { get }
}

extension String: Localizable {
    public var localized: String {
        return NSLocalizedString(self, comment: "")
    }
}

// MARK: XIBLocalizable
public protocol XIBLocalizable {
    var localeKey: String? { get set }
}

extension UILabel: XIBLocalizable {
    @IBInspectable public var localeKey: String? {
        get { return nil }
        set(key) {
            text = key?.localized
        }
    }
}

2) 您可以 uncheck your storyboard translations 这样您最终将拥有 1 个故事板,而无需将故事板复制为多个翻译版本。

3) 您现在可以创建一个 Localizable.strings 文件,其中包含您的密钥和翻译,以及 localize 这个文件,以便获得您的翻译(就像您对故事板所做的那样,但不是本地化将故事板转换为多个翻译版本,您将本地化 Localizable.strings 文件(因此在本地化后您将看到两个文件以两种语言显示,一个名为 Localizable.strings (English),另一个名为 Localizable.strings (Swedish)

例如,您的 Localizable.strings (English) 可能如下所示:

"main_page_title_label" = "Main Page Title in English";

例如,您的 Localizable.strings (Swedish) 可能如下所示:

"main_page_title_label" = "Huvudsida Titel på engelska";

4) 现在去你的 LaunchScreen.storyboard 你应该有 un-localized 所以你只有一个版本,而不是你的示例图片中的两个版本(英语,瑞典语)。查找要本地化的 UI 标签,在 Attribute Inspector 下,您将看到一个名为 Locale Key 的新输入字段,您可以在此处输入值 main_page_title_label。现在您刚刚在故事板中本地化了一个 UILabel。

5) 要从模拟器中测试它,您必须更改 Edit Scheme > Run > Options > Application Language 中的语言,保存后您现在可以 运行 模拟器中的应用程序,它将模拟您的模拟器OS 系统将设置为瑞典语,因此使用该键设置的标签将显示该键的瑞典语值。

支持更多 UI 视图(UIButton、UITextField、UISearchBar..)

如果您希望能够本地化更多 UI 视图,而不仅仅是 UI 类型 UILabel 视图,那么您可以为 Localizable.swift 添加更多支持文件。

如果您还希望能够本地化按钮类型的 UI 视图,您可以将此 添加到 Localizable.swift:

extension UIButton: XIBLocalizable {
    @IBInspectable public var localeKey: String? {
        get { return nil }
        set(key) {
            setTitle(key?.localized, for: .normal)
        }
    }
}

要支持故事板中 UITextFieldUISearchBar 占位符文本的本地化 将此 添加到您的 Localizable.swift:

// MARK: Special protocol to localizaze UI's placeholder
public protocol UIPlaceholderXIBLocalizable {
    var localePlaceholderKey: String? { get set }
}

extension UITextField: UIPlaceholderXIBLocalizable {

    @IBInspectable public var localePlaceholderKey: String? {
        get { return nil }
        set(key) {
            placeholder = key?.localized
        }
    }

}

extension UISearchBar: UIPlaceholderXIBLocalizable {

    @IBInspectable public var localePlaceholderKey: String? {
        get { return nil }
        set(key) {
            placeholder = key?.localized
        }
    }

}

我喜欢 denis_lor 的解决方案,但我想我首先要开始工作应该已经工作的东西(用简单的字符串文件翻译故事板)而不必 re-implement该功能以类似的方式。

我的问题与问题中描述的类似。翻译已经在一定程度上发挥了作用,但手动添加和一些更改的翻译根本没有翻译。

我找到的解决方案是使用 ibtool 重新创建字符串文件:

ibtool AppName/Base.lproj/Main.storyboard --generate-strings-file tmp.strings

备份我当前的(只是部分工作)Main.strings 文件(AppName/de.lproj/Main.strings)后,我用新生成的 tmp.strings

mv tmp.strings AppName/de.lproj/Main.strings

然后我手动将该文件的值更改为备份值。

现在一切都重新正确翻译了。我认为这个问题可能与编码问题有关,因为字符串文件是 UTF16 编码的。

根据 Apple 文档,LaunchScreen.storyboard 是静态的,不应包含文本,因为这些文本不会被本地化。

Avoid including text on your launch screen. Because launch screens are static, any displayed text won’t be localized.

来源:https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/launch-screen/