如何设置画布预览语言?

时间:2019-09-16 23:11:31

标签: swift xcode swiftui

(当前尝试使用Xcode 11 Beta 7)

我想将一个已经本地化的字符串传递给Text(),并使用“ .environment(.locale,.init(identifier:” ja“))”“在画布上查看其外观,但是预览始终设置为任何内容我在方案设置中设置的语言。

我知道,如果我直接传递LocalizedStringKey(例如Text(“ introTitle”)),则它可以工作,但是我不想这样做。相反,我想使用诸如Text(L10n.Intro.title)之类的枚举,但是当我这样做时,方案设置语言会覆盖环境运算符。

这是错误还是预期的行为?

struct ContentView: View {
    var body: some View {
        Text("introTitle") //this works
        Text(L10n.Intro.title) //this doesn't
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["en", "ja", "pt"], id: \.self) { localeIdentifier in
            ContentView()
                .environment(\.locale, .init(identifier: localeIdentifier)) //this gets ignored, and only the scheme settings language is previewed
                .previewDisplayName(localeIdentifier)
        }
    }
}

internal enum L10n {
  internal enum Intro {
    internal static let title = NSLocalizedString("introTitle", comment: "")
    internal static let title2 = "introTitle" //this also doesn't work
  }
}

Localizable.strings 中,我有:

//英语

"introTitle" = "Welcome!";

//日语

"introTitle" = "ようこそ!";

//葡萄牙语

"introTitle" = "Bem-vindo(a)!";

1 个答案:

答案 0 :(得分:2)

我的首选方法是使用Text("introTitle"),但是如果要对本地化键使用枚举,则必须像这样声明它

internal enum L10n {
  internal enum Intro {
    internal static let title = LocalizedStringKey("introTitle")
  }
}

然后您将可以像这样使用它:

Text(L10n.Intro.title)

在您的代码中,title的类型为NSLocalisedStringtitle2String,但是您需要LocalizedStringKey才能传递给文本初始化程序。