问题描述
在测试应用本地化的过程中,发现应用的名称没有实现本地化,还有标题也没有实现本地化。

但是,当语言为中文时,本地化是正常显示的。

代码部分:
Group {
Text("Welcome to use")
Text("AppName")
}
.font(.largeTitle)
.fontWeight(.semibold)
这里的AppName在本地化文件中,可以找到对应的字段信息。

在阿拉伯语言下,显示的内容应该是默认的英语标题“Banklets”。
但是,实际上这个AppName并没有实现本地化。
在中文语言下,显示的内容是本地化的中文标题“存取猪猪”。

但是这个问题,我的推测是偶发性的,因为本地化文件正常情况下,不会使用Key显示,如果有本地化,则显示本地化的内容。如果没有本地化,则显示默认语言的内容。
因此,这一问题可能跟某些内容或操作有关。
问题排查
我尝试修改Key的内容,这里的AppName是修改后的Key,问题没有得到解决。
接着,我尝试在本地化文件中添加阿拉伯语的本地化内容,添加后,内容正常显示。


虽然,这的确解决了问题,但实际上,我们不可能遇到这个问题时,重复设置所有的本地化内容。
因此我尝试修改应用的默认语言,英语的字段为“存取猪猪”:

显示的字段,仍然跟本地化没有关系。

这也就意味着,本地化的Key和对应的内容不是造成个别字段失效的原因。
然后,我把问题的原因放到View代码层面:
HStack(spacing: 0) {
Group {
Text("Welcome to use")
Text("AppName")
}
.font(.largeTitle)
.fontWeight(.semibold)
}
怀疑是Group只支持首个Text的本地化。我颠倒两个Text的顺序。

问题仍然存在。
然后考虑的就是应用新增字段的本地化是否失效?如果失效,那么就从新增字段的本地化问题进行解决,如果没有失效,则检查是否是失效字段的Key和内容存在某种关联。
因此,我新创建了一个内容字段,Key为“Some”,默认的英语内容为“yixie”,中文语言的内容为“一些”。



然后替换原先的AppName,如果Some在中文语言下显示“一些”,其他语言下显示“Some”,那么说明本地化文件是正常的。

最后,通过对比可以看到,中文和英语的语境下,本地化内容是正常的,而在其他语言中,默认的本地化失效,变成了显示本地化内容的Key。
总结
最终的问题结果就是,即使设置了默认语言的本地化内容,如果不单独设置其他的语言的本地化,其他语言则可能显示本地化的Key。
这一问题的是在测试的过程中发现的,之前没有发现过这一问题。因此,问题的根源可能跟大量的本地化字段导致的,前期本地化字段量少,因此功能是正常的,当字段量变多时,默认语言的本地化内容就无法覆盖其他语言的本地化,就会显示本地化字段的Key。
另一种可能就是,原本Xcode的本地化就是显示Key,默认语言的本地化仅用于作为字段参照。如果不设置本地化内容,就显示Key,如果设置本地化内容,则显示本地化内容,而不是显示默认语言的本地化。
如果是后者,则意味着本地化没有问题,而是我前期理解本地化功能存在偏差。
如果想要实现默认语言本地化覆盖其他语言的本地化,就应该考虑Key和默认语言的内容一致:
HStack(spacing: 0) {
Group {
Text("Welcome to use")
Text("Banklet") // 应用名称
}
.font(.largeTitle)
.fontWeight(.semibold)
}
这样就可以正常的显示应用名称。
