【问题标题】:Is it safe to use "real" keys in NSLocalizedString()? Is there a guaranteed fallback language?在 NSLocalizedString() 中使用“真实”键是否安全?是否有保证的后备语言?
【发布时间】:2012-01-07 01:01:04
【问题描述】:

我知道很多开发者就是这样做的:他们开始用英语开发他们的应用程序,并输入NSLoclaizedString(@"Tap this to do that!", @"Telling what to do...") 而不是简单的@"Tap this to do that!"

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

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

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

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

问题:假设始终存在一个Localizable.strings (English) 文件,并且文件中的键是正确格式的值。是否存在 NSLocalizedString 会失败,然后直接显示 key 的情况?

【问题讨论】:

    标签: iphone ios ipad localization nslocalizedstring


    【解决方案1】:

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

    Here is a related question 讨论这个问题。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我认为更好的方法(尤其是对于我们程序员)可以是:

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

          2) 使用专用的便利功能进行翻译

          这样:

          a) 更多详情

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

          c) 我们可以向外部发送一个简单的“Localizable.strings”,而无需在代码中搜索字符串并替换它们,一旦得到翻译。

          d) 添加语言只需单击 2 次,然后粘贴文本。

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

          样本:

          "NETWORK_ERROR" = "网络错误";

          "NETWORK_ERROR_NO_DATA" = "没有数据。请检查设置";

          "NETWORK_ERROR_NO_JSON" = "没有数据。请检查设置";

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

          “Opps...发生网络错误”。 (Coder会在代码中看到真正的原因)

          最后……尽早开始本地化。

          便利性:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-11
            • 1970-01-01
            相关资源
            最近更新 更多