SwiftUI如何进行多语言设置,如何进行本地化?单复数变换?
一些小型的工具类应用还是比较推荐支持多语言的,毕竟语言是使用软件的最大门槛。如果没有掌握语言,使用这个应用仅靠着图形界面来说除非是常用应用,否则根本不会使用。特别对于年纪较大的人来说更不友好。如何使用SwiftUI的情况下还能够尽兴本地化呢?
起始项目
我这里创建了一个项目,进行了一个基本布局。
1 | struct ContentView: View { |
我们的目标是将页面进行本地化,支持英文。
项目多语言
我们需要告诉程序我们支持什么语言。
新建语言文件
我们创建一个语言文件
命名为Localizable.strings
分配语言
我们需要给语言文件分配一个语言
然后勾选所有语言
之后我们就可以在左侧的项目文件管理中看到两个语言文件了
编辑语言文件
语言文件编写规则很简单。
1 | "你好世界" = "Hello,world"; |
预览多语言
我们可以添加预览结构的语言修饰符
1 | .environment(\.locale, .init(identifier: "en")) |
除了这种方式,我们还可以在虚拟机测试时更改语言
插入变量的文本如何转换
我们先解决小明的问题。这段文本我们插入了一个name
的变量
1 | var name = "小明" |
用直接替换的传统方式显然行不通,因为我们不可能将所有的情况都写进多语言文件里。
所以我们需要在语言文件中用字符串格式说明符来插入变量。因为小明
是一个字符串,我们可以使用%@
来代替。例如这段文字我们可以写成:
1 | "小明" = "XiaoMing"; |
我们可以发现小明
并没有发生改变,这是因为变量的值我们需要进行一些改进。根据如何在 SwiftUI 中将 LocalizedStringKey 更改为 String我们需要添加一段扩展,具体原理可以参考原文。
1 | extension LocalizedStringKey { |
原文给到的用例如下
1 | let localizedKey = LocalizedStringKey("KEY_NAME_HERE") |
这本篇文章中,我们可以改变一下小明的变量。
单数与复数的变化
在中文一般不会出现复数变化,但是英文中就比较常见了(还有一些其他的语言)。这个时候我们当然可以用数量判断来进行,但是这样做不仅麻烦而且还有代码量影响阅读。我们可以通过添加一个Stringsdict
文件来进行调整。
新建一个Stringsdict
文件,我们可以将它命名为Plurals.stringsdict
在本文的项目中我们只针对英文有单复数变化,所以在语言中我们选择英文。
如果不使用复数形式,原文中是我们有 \(appleCount) 苹果
,appleCount是Int类型,我们可以知道使用的是%lld来进行表示,即%lld 苹果。
1 | "我们有 %lld 苹果" = "We have %lld apples" |
但是涉及到复数问题我们就不能在这里填写了,就需要在Plurals.stringsdict表里添加这种复数情况
Localized String Key
更改为形式我们有 %lld 苹果
Localized Format Key
的值为我们需要变复数的词
VARIABLE
更改为我们需要变复数的词
NSStringFormatValueTypeKey
在本文中为lld
在下方的数值中我们只保留one
和other
对应的值填写对应的形式
之后我们需要更改字符串的tableName
值,在原来的UI代码中:
1 | Text("我们有 \(appleCount) 苹果") |
添加tableName
属性
1 | Text("我们有 \(appleCount) 苹果",tableName: "Plurals") |
Plurals
为我们的文件名
参考文献
Localizing Strings That Contain Plurals
- 感谢你赐予我前进的力量