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
}