Iphone 使用安全吗;“真正的”;NSLocalizedString()中的键?是否有保证的回退语言?

Iphone 使用安全吗;“真正的”;NSLocalizedString()中的键?是否有保证的回退语言?,iphone,ios,ipad,localization,nslocalizedstring,Iphone,Ios,Ipad,Localization,Nslocalizedstring,我知道很多开发人员就是这样做的:他们开始用英语开发应用程序,然后把NSLoclaizedString(@“点击这个做那个!”,@“告诉做什么…”)放到而不是简单的@“点击这个做那个!” 然后运行genstrings,通过提取所有这些字符串,以某种方式创建一个本地化的.strings文件。混乱的部分:代码中使用的长文本成为关键。它起作用了。直到有一天,您快速进入代码并更改英文字符串,忘记了本地化,忘记了本地化是所有可本地化的.strings文件的关键 所以我倾向于使用“真实”键,不会与字符串混淆。

我知道很多开发人员就是这样做的:他们开始用英语开发应用程序,然后把
NSLoclaizedString(@“点击这个做那个!”,@“告诉做什么…”)放到
而不是简单的
@“点击这个做那个!”

然后运行
genstrings
,通过提取所有这些字符串,以某种方式创建一个本地化的.strings文件。混乱的部分:代码中使用的长文本成为关键。它起作用了。直到有一天,您快速进入代码并更改英文字符串,忘记了本地化,忘记了本地化是所有可本地化的.strings文件的关键

所以我倾向于使用“真实”键,不会与字符串混淆。为了快速测试,我创建了一个本地化为英语和法语的项目。然后我将模拟器语言设置为德语。因为,你知道,如果用户看到像
TTTDT
这样的键,那就糟透了

因此,只有英语和德语,我启动了演示应用程序。我得到的是来自English Localizable.strings文件的英文文本

结论:如果应用程序未涵盖操作系统语言,NSLocalizedString似乎会回到英文文件


Quesion:假设始终存在一个
Localizable.strings(英文)
文件,并且密钥和正确格式的值都在该文件中。是否存在NSLocalizedString失败然后直接显示键的情况?

我们倾向于使用“真实”键,但它们通常是英文文本(或缩写形式),并在末尾添加“键”。这样就很清楚了。

回答您的问题:是的,我遇到了您担心的问题,即即使存在
可本地化的.strings
文件,并且包含了这些键名的条目,但仍显示了键名。当项目中有多个
可本地化.strings
文件时,就会发生这种情况。如果您将一组具有自己的
可本地化.strings
(例如ShareKit)的开源项目中的文件拖放到您的项目中,则很容易发生这种情况

讨论这个问题

但至少如果你使用ID样式的密钥名,当你用任何语言测试你的应用程序时,你都会注意到这样一个问题。如果您使用英语(或基本语言)字符串作为键,那么在测试本地化版本之前,您不会看到这个潜在的问题,它可能会更容易被忽略


因此,在重写文本时,除了必须记住更新键(所有语言)之外,在使用英文文本作为键时,还存在潜在隐藏错误的问题(英文文本看起来可以,但本地化版本不行)。因此,在我看来,使用“真实”的键名而不是实际的文本更为实际。如果您仍然担心由于某些原因可能会出现密钥名称,请选择一个至少具有足够描述性且易于理解的密钥。

我编写了一些自定义代码,用于实际验证应用程序中的所有密钥是否出现在所有
本地化.string
文件中。此过程分为两个步骤-使用
genstrings
生成一个新的可本地化字符串文件,其中包含源代码中当前引用的所有键。然后,我使用一些objective-C api加载我现有的
本地化.strings
文件,并比较它们与新生成的密钥集完全相同(不多也不少)。

我认为更好的方法(特别是对于我们程序员而言)是:

1) 将技术字符串放入代码中

2) traslate具有专用的便利功能

这样:

a) 给我们更多的细节

b) 我们只修改“Localizable.strings”中的本地化字符串

c) 我们可以向外部发送一个简单的“Localizable.strings”,而不必疯狂地在代码上搜索字符串,一旦得到翻译,就替换它们

d) 添加一种语言只需单击两次,然后粘贴一个文本

e) 我们可以使错误对最终用户更一般/更温和:

样本:

“网络错误”=“网络错误”

“网络错误\u无数据”=“无数据,请检查设置”

“网络错误\u无\u JSON”=“无数据,请检查设置”

最终用户无法理解404或JSON解析错误,就像谷歌一样

“Opps…发生网络错误”。(编码员将在代码中看到真正的原因)

最后。。。早点开始本地化

便利性f:

func localized(_ msg: String)->String{
    let s = NSLocalizedString(msg, comment : "")
    return s
}