如何本地化 iOS info.plist 文件中的字符串?

Posted

技术标签:

【中文标题】如何本地化 iOS info.plist 文件中的字符串?【英文标题】:How to localise a string inside the iOS info.plist file? 【发布时间】:2014-09-09 04:28:15 【问题描述】:

您可能知道 iOS 8 需要 NSLocationWhenInUseUsageDescription 键来使用用户的位置。我已将此密钥和一些一般信息添加到我的信息列表中。

如何在 plist 文件中使用翻译字符串?

-- 更新--

我已经有一个可本地化的字符串。我只是想知道我可以使用类似的东西 plist 字符串中的 NSLocalizedString(MYSTRING,nil)。我知道我可以为本地化创建多个 info.plist 文件,但我想知道可能有更简单的方法。

【问题讨论】:

你有没有解决这个问题,我也在努力让 NSLocationWhenInUseUsageDescription 本地化? 【参考方案1】:

您应该使用InfoPlist.strings 文件来本地化Info.plist 的值。为此,请转到File->New->File,在iosResource 选项卡下选择Strings File,将其命名为InfoPlist,然后创建。打开并插入您要本地化的 Info.plist 值,例如:

NSLocationWhenInUseUsageDescription = "Description of this";

现在您可以使用翻译本地化 InfoPlist.strings 文件。

选择本地化选项,或根据需要启用本地化,

您应该也可以在左侧编辑器中看到该文件。

Here 是Info.plist 键本地化的官方文档。

致谢Marco,感谢您在此答案中包含图片!

【讨论】:

创建字符串文件后,是否还需要将密钥包含在 Info.plist 文件中,或者从那里删除是否安全? 提示:完全使用名称“InfoPlist.strings”,仅此而已。例如,我的原始 infoplist 文件被命名为其他名称,但我需要完全使用此名称才能使其正常工作。 在模拟器上测试本地化时。我不得不更改模拟器本身的语言,而不仅仅是 xcode 目标中的语言。只是对其他人的警告。 正确的用法是keyname = "your text";例如:NSLocationWhenInUseUsageDescription = "你的文字" 注意:此文件中的key不能有引号,这与正常的本地化不同。例如:NSMicrophoneUsageDescription = "你的描述";【参考方案2】:

以上所有内容都对我不起作用(XCode 7.3),所以我阅读了 Apple 参考资料,了解如何做,它比上面描述的要简单得多。根据苹果:

本地化的值不存储在 Info.plist 文件本身中。 相反,您将特定本地化的值存储在 名为 InfoPlist.strings 的字符串文件。你把这个文件放在 用于存储的特定语言项目目录 相同本地化的其他资源。

据此,我创建了一个名为InfoPlist.strings的字符串文件,并将其放在“xx”语言的xx.lproj文件夹中(并使用File->Add Files to将其添加到项目中...)。就是这样。不需要键“本地化资源可以混合”=YES,也不需要base.lproj或en.lproj中的InfoPlist.strings。

如果在特定语言文件中找不到键,应用程序使用 Info.plist 键值作为默认值。因此,我将我的英文值放在 Info.plist 文件中,将翻译后的值放在语言特定文件中,经过测试,一切正常。

特别是,不需要本地化 InfoPlist.strings(它在 base.lproj、en.lroj 和 xx.lproj 中创建文件的一个版本),在我的情况下,这种方式不起作用.

【讨论】:

为什么没有包含指向相应文档的链接? 这里是 Apple doc 相关页面的链接,以防有人感兴趣:developer.apple.com/library/archive/documentation/General/… 我们如何决定那个xx?例如对于英语,它可以是 en、En、Eng、English 等?对不起,如果这是一个愚蠢的问题,因为我是初学者 你的答案对我有用,除了备用语言场景,应用程序总是使用以前使用的语言而不是英语,我的英语值存在于 Info.plist 文件中,我也尝试过 base .lproj 也是如此【参考方案3】:

逐步本地化Info.plist:

    在 Xcode 中找到文件夹 Resources(放在根目录下) 选择文件夹资源 然后按主菜单File->New->File... 在“资源”字符串文件部分中选择,然后按下一步 然后在 Save As 字段中仅写入 InfoPlist(“I”(眼睛)大写和“P”大写 - P 后面的 l(ell)应该是大写) 然后按创建 然后选择在 Resources 文件夹中创建的文件 InfoPlist.strings 并在右侧菜单中按“本地化”按钮 然后从项目导航器中选择项目并从项目列表中选择项目 在底部的信息选项卡中,您可以选择所需的语言(本地化部分中有) 您可以在资源文件夹中看到的语言 要本地化 info.plist 文件中的值(“键”),您可以使用文本编辑器打开并获取您想要本地化的所有键 您可以在任何 InfoPlist.strings 中编写任何键作为示例,如上例所示

"NSLocationAlwaysAndWhenInUseUsageDescription"="blabla";

"NSLocationAlwaysUsageDescription"="blabla2";

所有工作都完成了,您已经本地化了您的 info.plist 文件!

【讨论】:

这是一个很好的建议:“然后在另存为字段中只写 InfoPlist(“I”大写和“P”大写)” 如果您在某个步骤中迷路了,我推荐这个简短的 YouTube 视频教程:youtube.com/watch?v=e-T_8jZTrv0【参考方案4】:

提示

    请记住,iOS 模拟器默认会利用您的系统语言。请在 iOS 模拟器设置中更改语言(和地区)以测试您的翻译。

    本地化字符串(参见 Apple 文档 here)应该是

    NSLocationWhenInUseUsageDescription = "Description of this";
    

    而不是(带引号“...”)

    "NSLocationWhenInUseUsageDescription" = "Description of this";
    

【讨论】:

有价值的补充,但我认为这应该是相应答案下的评论,而不是新答案。另请注意,“363”不是帖子标识符,而是答案的投票数(此后数字已更改)。 我没有 50 声望可以在那里添加评论。 是否在键周围使用引号“...”都没有关系,例如:("NSLocationWhenInUseUsageDescription"="description" 有效)。可以有也可以没有。 Xcode 12.0.1 - 带引号的键也可以。 带引号的键一直运行良好。事实上,有些键必须有引号。【参考方案5】:

如果有问题,请确保您添加了:

“本地化资源可以混合”=YES

进入 info.plist。在我的例子中,InfoPlist.strings 文件被忽略了。

【讨论】:

【参考方案6】:

我强烈建议您阅读 Apple 的指南,并查看此处列出的 WWDC 资源: Internationalization and Localization Topics

为了具体回答您的问题,当您向项目 添加新语言时,您有机会选择要包含的 InfoPlist 文件(如果您有多个目标,您将有多个 Infoplist 文件)。获得以下屏幕所需要做的就是点击 Localizations 下的 + 并选择一种新语言来添加支持。

添加后,它将在给定语言的相应 lproj 目录中创建必要的字符串文件。

--编辑--

为了清楚起见,iOS 将根据用户当前选择的语言,使用 plist 条目的键作为本地化字符串文件中的键,为您的 Plist 文件换出字符串。

【讨论】:

只用一个键翻译整个 plist 是一种矫枉过正。在此处查找更多信息:bit.ly/1yBUTr XCode 9 根本就不是这样。添加新语言时它从不要求 plist 本地化。 我需要针对 Xcode 9 进行研究 - 还没有机会在新的 Xcode 中进行测试。【参考方案7】:

对于在尝试添加本地化时遇到 info.plist 问题的任何人,例如在 Xcode 9 中。

您需要通过进入 info.plist 并单击文件检查器中的本地化按钮来使 info.plist 本地化,如下所示。

然后,info.plist 将包含在文件资源中,以便您添加新的本地化。

【讨论】:

您有遇到什么问题吗?当我将两种语言添加到本地化时,我无法构建项目,因为 xcode 说“文件 info.plist 无法打开,因为没有这样的文件。 @mkkrolik 我现在遇到了同样的问题。你找到解决办法了吗? @Todanley 跳过这个对我不起作用的解决方案。请改用 InfoPlist.strings。 @mkkrolik 谢谢你的作品。而且在使用模拟器进行测试时,我必须更改模拟器的语言设置而不是我的目标语言设置才能使其工作。【参考方案8】:

正如 RGML 所说,您可以创建一个 InfoPlist.strings,对其进行本地化,然后添加您的键和值,如下所示: "NSLocationWhenInUseUsageDescription" = "帮助定位我!";

它将指定语言的密钥添加到您的 info.plist。

【讨论】:

【参考方案9】:

除了接受的答案(项目在Flutter上但和native基本一样):

我确实有 Base.lprojen.lprojxx.kproj. 等文件夹,每个文件夹中都有 InfoPlist.strings。 这个文件有这样的行(键周围没有引号,末尾有分号):

NSLocationWhenInUseUsageDescription = "My explanation why I need this";

检查您的项目中是否有您的语言 > 信息:

另外,检查project.pbxproj 文件,它位于 XXX.xcodeproj/project.pbxproj 中: 它应该在代码中包含您所有的语言(en、fr 等)

但即便如此,它也没有用。最后,我注意到Info.plist 文件中的CFBundleLocalizations 键。 (在 XCode 中将其作为原始键值打开 - Info.plist 文件上的鼠标右键 -> 打开为 -> 源代码) 确保数组中的值是代码而不是完整的单词,例如fr而不是French等。

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ru</string>
    <string>lv</string>
</array>

并仔细检查您的设备是否设置为您正在测试的语言。干杯

附: “开发语言”不会影响你的问题,不要费心去改。

【讨论】:

“键周围没有引号,末尾有分号” - Xcode 12.0.1 - 实际上,即使键有引号,它也能正常工作。【参考方案10】:

当使用 InfoPlist.strings 文件时(在 XCode 中,它应该放在 Info.plist 文件旁边 - 实际文件位置可能在项目中的任何位置

) 小心使用密钥的短名称进行翻译。

我尝试使用Privacy - Camera Usage Description,但工作密钥是NSCameraUsageDescription

【讨论】:

【参考方案11】:

在我的情况下,由于名称中的“-”符号,本地化不起作用。 示例:“aero-Info.plist” 并且本地化文件:“aero-InfoPlist.strings”和“aeroInfoPlist.strings”不起作用。

【讨论】:

【参考方案12】:

在我的情况下,一切都设置正确,但仍然找不到 InfoPlist.strings 文件。

唯一真正起作用的是,再次删除 InfoPlist.strings 文件并将其添加到项目中。

【讨论】:

以上是关于如何本地化 iOS info.plist 文件中的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发 Xcode中的Info.plist字段含义

无法本地化 iOS info.plist 文件中的字符串

如何在 iOS info.plist 文件中本地化字符串数组

Xcode中的Info.plist字段列表详解

Xcode 项目中的两个 info.plist 文件如何工作?

IOS 应用商店错误:ionic3 中的 Info.plist 文件中缺少目的字符串?