SwiftUI Text():使用三元条件不本地化

Posted

技术标签:

【中文标题】SwiftUI Text():使用三元条件不本地化【英文标题】:SwiftUI Text(): Using ternary conditional not localizing 【发布时间】:2020-01-12 20:38:52 【问题描述】:

我在有条件地打印本地化文本时遇到问题。例如,这可以正确本地化:

if valueFromDb.isEmpty 
    Text("value_is_empty") //localized text
 else 
    Text(valueFromDb)

如果 valueFromDb 为空,它会以用户的语言打印一些文本,如果 valueFromDb 不是,它会按原样打印。但是,当我尝试使用三元运算符时,它不起作用:

Text(valueFromDb.isEmpty ? "value_is_empty" : valueFromDb)

当 valueFromDb 为空时,它会打印“value_is_empty”而不是实际的本地化文本。尝试将其转换为 LocalizedStringKey 时,我得到一个错误(由于 SwiftUI,在层次结构中的随机更高)。

编辑:明确地说,我知道我可以这样做:

valueFromDb.isEmpty ? Text("value_is_empty") : Text(valueFromDb)

但是,我想将三元条件放在 Text() 括号内,因为我会为多个视图执行此操作,并且每个视图都有很多修饰符,因此代码会变得非常臃肿。

【问题讨论】:

【参考方案1】:

问题是由类型推断引起的。您必须将 myString 声明为 LocalizedStringKey 类型,然后一切都会按预期工作。

当您声明时:

@State var mySrtring: LocalizedStringKey = "whatever"

然后:

Text(myString.isEmpty ? "error_text_localized" : myString)

使用这个初始化器:

public init(_ key: LocalizedStringKey, 表名:字符串? = 无, 捆绑:捆绑? = 无, 评论:静态字符串? = 无)

当你这样声明时:

@State var mySrtring: String = "whatever"

然后:

Text(myString.isEmpty ? "error_text_localized" : myString)

使用这个初始化器:

公共初始化(逐字内容:字符串)

【讨论】:

我怀疑是因为这样的事情。但这对我也不起作用,因为“myString”指的是从数据库中检索的用户输入数据。我想我的例子对我的用例来说不是很明显,所以我会更新这个问题。 在我尝试导出本地化的情况下,即使将字符串声明为 LocalizedStringKey 似乎也无济于事。它被忽略了。如果手动添加它可能会起作用,但导出步骤会忽略 LocalizedStringKey 的 :/【参考方案2】:

您必须将您的 valueFromDb 放在引号中,然后它应该可以正常工作。

Text(valueFromDb.isEmpty ? "value_is_empty" : "\(valueFromDb)")

【讨论】:

以上是关于SwiftUI Text():使用三元条件不本地化的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:大写视图的本地化字符串,例如`文本`?

SwiftUI:有条件的 onDelete

三元条件运算符的警告仅在本地范围内发生

为啥 PostgreSQL 不使用三元索引

三元运算符问题 SwiftUI

来自 watchOS 中 if 条件 Text() 的 SwiftUI 运行时错误