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

Posted

技术标签:

【中文标题】SwiftUI:大写视图的本地化字符串,例如`文本`?【英文标题】:SwiftUI: Uppercase a localized string for a view, e.g. `Text`? 【发布时间】:2019-08-20 12:20:47 【问题描述】:

使用 Xcode beta 6 和 SwiftUI,使用 >本地化 字符串创建 Text 视图,我怎样才能将其大写 而不必将本地化字符串值大写?我想我想要一个 ViewModifier 来更改大小写,但它似乎不存在?

Text("SignIn.Body.Instruction".uppercased()) 会将本地化 key 大写,因此这将不起作用,如SO question about uppercasing a non-localized string 中所述。

【问题讨论】:

localizedCapitalized 不起作用吗? developer.apple.com/documentation/foundation/nsstring/… @yawnobleix 这是完全不同的事情:D。这是一个SwiftUI 问题。我们不能更改字符串本身,因为它指的是key的名称。 【参考方案1】:

smallCaps 修饰符用于Font 怎么样?例如,Text("Hello World").font(Font.body.smallCaps()) 将呈现 "HELLO WORLD",但底层字符串将保留其适当的本地化大写以方便访问。

【讨论】:

【参考方案2】:

现在可以使用所有 new textCase ViewModifier(Xcode 12 Beta 3),如下所示:

Text("SignIn.Body.Instruction")
    .textCase(.uppercase)

lowercase:

Text("SignIn.Body.Instruction")
    .textCase(.lowercase)

【讨论】:

【参考方案3】:

手动本地化,然后大写。

extension String 
    func toUpperCase() -> String 
        return localized.uppercased(with: .current)
    
    private var localized : String 
        return NSLocalizedString( self, comment:"")
    


Text("SignIn.Body.Instruction".toUpperCase())

【讨论】:

NSLocalizedString( self, comment:"") 不是一个好主意,因为 NSLocalizedString 的关键参数不是恒定的。因此 genstrings 和 Xcode Editor -> Export for Localization 无法选择它。短期内它可能很方便,但是当你以后必须在应用程序中手动查找所有要本地化的字符串时,它会咬你! 您不想使用大写的(),它适用于编程字符串,而不是面向用户的字符串,因为它不考虑语言环境。见.uppercased(with: Locale.current)) 我不知道 .uppercased(with: Locale.current)) 感谢您的提示。至于 genstrings 的问题,您的观点非常有效,但是在 SwiftUI 中,我希望不必经常使用我的方法,大部分本地化将由 Text() 自动处理。

以上是关于SwiftUI:大写视图的本地化字符串,例如`文本`?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI中Section视图里的文本全部变成大写显示的解决

SwiftUI:如何计算文本视图的宽度?

从 SwiftUI 视图返回文本

SwiftUI 文本视图不显示不可显示的字符

带有 UIViewRepresentable 的 SwiftUI 自定义文本字段 ObservableObject 和推送视图的问题

如何确定在 SwiftUI 中的多词文本视图中点击的词