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

369

您可能已经知道,iOS 8需要使用NSLocationWhenInUseUsageDescription密钥才能使用用户位置。我已将此密钥和一些通用信息添加到我的info plist中。 enter image description here

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

--更新--

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


你解决过这个问题吗?我正在努力将NSLocationWhenInUseUsageDescription本地化,但是遇到了困难。 - Oliver Pearmain
15个回答

688
你应该使用InfoPlist.strings文件(保持IP大写)来本地化Info.plist的值。要做到这一点,进入文件->新建->文件,在iOS资源选项卡下选择Strings File,命名为InfoPlist,然后创建。打开并插入你想要本地化的Info.plist的值,例如:
"NSLocationWhenInUseUsageDescription" = "Description of this";

现在您可以使用翻译来本地化InfoPlist.strings文件。
选择本地化选项,或根据需要启用本地化。

right side editor

你应该能够在左侧的编辑器上看到文件。

left side editor

注意:在模拟器上测试本地化时,您必须更改模拟器本身的语言,而不仅仅是Xcode目标中的语言。(感谢John Webb提供的帮助) 这里是有关Info.plist键本地化的官方文档。
感谢Marco在此答案中包含图片!

35
创建完字符串文件后,是否需要在Info.plist文件中包含相应的键值,或者从Info.plist中删除该键值是否安全? - rounak
24
提示:请精确使用“InfoPlist.strings”这个名称,不要改动其他内容。例如,我的原始 Info.plist 文件名是其他的,但我需要精确使用这个名称才能使其正常工作。 - Sjoerd Perfors
37
测试本地化内容时,在模拟器上需要更改模拟器本身的语言,而不仅仅是在Xcode目标中更改语言。对其他人提个醒。 - John Webb
15
正确的用法是keyname = "你的文本"; 例如:NSLocationWhenInUseUsageDescription = "你的文本" - Magurizio
21
注意:此文件中的键不应带引号,这与常规本地化不同。例如:NSMicrophoneUsageDescription =“您的描述”; - Yuchao Zhou
显示剩余24条评论

45
上述方法都没有为我工作(XCode 7.3),所以我阅读了苹果提供的参考文献,发现它比上面描述的要简单得多。根据苹果公司的说法:

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

因此,我创建了一个名为InfoPlist.strings的字符串文件,并将其放置在“xx”语言的xx.lproj文件夹中(并使用 文件->添加文件到... 将其添加到项目中)。就是这样。不需要键"Localized resources can be mixed" = YES,也不需要在 base.lproj 或 en.lproj 中使用 InfoPlist.strings。
应用程序如果无法在语言特定的文件中找到键,则使用 Info.plist 键值作为默认值。因此,我在 Info.plist 文件中放置了英文值,并在语言特定文件中放置了翻译后的值,测试后一切正常。
特别说明的是,不需要本地化 InfoPlist.strings(这会在 base.lproj、en.lroj 和 xx.lproj 中创建该文件的版本),而且在我的情况下,这种方式行不通。

2
为什么没有包含适当文档的链接? - Jurasic
4
这是苹果文档相关页面的链接,如果有人感兴趣可以查看:https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html - bend
而我们如何决定xx呢?例如对于英语,它可以是en、En、Eng、English等等。抱歉,如果这是个愚蠢的问题,因为我是个初学者。 - Muhammad Awais
你的答案对我有用,除了备用语言方案,应用程序总是获取先前使用的语言而不是英语的备用语言,尽管我的Info.plist文件中存在英语值,我也尝试过base.lproj。 - Muhammad Awais

44

逐步本地化 Info.plist:

  1. 在 Xcode 中找到资源文件夹(位于根目录中)
  2. 选择资源文件夹
  3. 然后按主菜单 File->New->File...
  4. 在“资源”部分中选择 Strings 文件,然后点击下一步
  5. 然后在“另存为”字段中仅写入 InfoPlist (“I”(眼睛)大写和“P”大写 - P 后面的 l(L)不应该是大写字母)
  6. 然后点击创建
  7. 然后选择在资源文件夹中创建的 InfoPlist.strings 文件,并在右侧菜单中点击“本地化”按钮
  8. 接下来,在项目导航器中选择项目并选择项目列表中的项目
  9. 您可以在底部的“信息”选项卡中输入所需的语言(在本地化部分中)
  10. 您可以在“资源”文件夹中看到语言
  11. 要本地化 info.plist 文件中的值(“键”),您可以使用文本编辑器打开并获取所有要本地化的键
  12. 您可以在任何 InfoPlist.strings 中编写任何键,例如上面的示例

"NSLocationAlwaysAndWhenInUseUsageDescription"="blabla";

"NSLocationAlwaysUsageDescription"="blabla2";

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


1
这是一个很好的建议:“然后在“另存为”字段中仅写入InfoPlist(“I”大写和“P”大写)”。 - dtochetto
4
如果你在某一步迷失了方向,我建议观看这个短的YouTube视频教程:https://www.youtube.com/watch?v=e-T_8jZTrv0。 - Albert Vila Calvo
我不得不把InfoPlist.strings文件放在我的项目文件夹中。之前移出去后,它就停止工作了。 - FrugalResolution
请修正您的帖子。关键部分应该加上引号。 - Ertuğrul Çakıcı

37

小贴士

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

  2. 本地化字符串(请参阅苹果文档此处)应该为

NSLocationWhenInUseUsageDescription = "Description of this";

而不是(用引号“…”)

"NSLocationWhenInUseUsageDescription" = "Description of this";

有价值的补充,但我认为这应该是在相应答案下的评论,而不是一个新回答。还要注意,“363”不是帖子标识符,而是答案获得的投票数(此数字已更改)。 - John J. Camilleri
21
我在那里没有50点声望来添加评论。 - Giuseppe Beccari
3
无论您是否在键周围使用引号 "...",例如("NSLocationWhenInUseUsageDescription"="description"是有效的),都没有关系。它可以有也可以没有。 - mluisbrown
1
Xcode 12.0.1 - 带引号的键也可以正常工作。 - Legonaftik
带引号的键一直都很好用。事实上,有些键必须在它们周围加上引号。 - fishinear

29

针对更新的 XCode 12 / 13 / ...

1. 在您的项目中创建一个新的 InfoPlist.string 文件。

选择您的项目,点击右键,选择“新建文件”

选择文件类型为“字符串文件”

命名为 'InfoPlist' 并创建它

2. 选择您的文件,你应该看到右边的侧边栏选项“本地化”

在右侧的侧边栏中选择“本地化”

完成

3. 如果您想要在项目的信息和“本地化”中添加更多语言

它将自动为您添加的新语言创建“InfoPlist.string”的副本。

在项目中添加更多语言。


23

如果某些功能无法正常工作,请确保您已添加:

"Localized resources can be mixed" = YES

到info.plist中。在我的情况下,InfoPlist.strings文件被忽略了。


14

我强烈建议阅读苹果公司的指南,并查看此处列出的WWDC资源:国际化和本地化主题

具体来说,当您将新语言添加到项目中enter image description here时,您有机会选择包括哪些InfoPlist文件(如果您有多个目标,则会有多个Info plist文件)。要获得以下屏幕,您只需在本地化下方点击+号,并选择新语言以支持添加。 enter image description here

一旦添加完成,它将为给定语言创建必要的字符串文件,并放置在适当的lproj目录中。

--编辑--

请注意,iOS将根据用户当前选择的语言使用plist条目的键作为本地化字符串文件中的键,以交换Plist文件的字符串。


3
仅为了一个键而翻译整个属性列表文件是杀鸡焉用牛刀。在此处查找更多信息:bit.ly/1yBUTru - RGML
2
在XCode 9中,它根本不正确。当添加新语言时,它从未要求plist本地化。 - Tom
我需要研究一下Xcode 9 - 还没有机会在新的Xcode中进行测试。 - Matt S.

9
您可以使用字符串目录自:

Xcode 15 +

只需创建一个名为InfoPlist的字符串目录文件。

enter image description here

enter image description here

enter image description here

enter image description here


9
除了已接受的答案(该项目是在Flutter上,但基本上与原生是相同的)外:
我有文件夹Base.lproj, en.lproj, xx.kproj.等,并且在每个文件夹中都有InfoPlist.strings文件。这个文件包含如下行(键周围没有引号,并以分号结尾):

NSLocationWhenInUseUsageDescription = "我需要这个的解释";

请检查您的语言是否在YourProject > Info中: enter image description here 还要检查project.pbxproj文件,它位于XXX.xcodeproj/project.pbxproj中: 它应该具有代码(en、fr等)表示的所有语言

enter image description here

但即使如此也不起作用。最后,我注意到Info.plist文件中的CFBundleLocalizations键。(要将其作为原始键值以XCode方式打开,在Info.plist 文件上单击鼠标右键-> 打开方式-> 源代码) 确保数组中的值是代码而不是完整单词,例如fr而不是法语等。
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ru</string>
    <string>lv</string>
</array>

请确保您的设备语言设置正确,以便进行测试。祝好!

另外,“开发语言”不会影响您的问题,请勿更改。


1
“no quotes around the key and with a semicolon at the end” - Xcode 12.0.1 - 实际上,即使键有引号,它也可以正常工作。 - Legonaftik

7
对于任何遇到info.plist未包含在本地化中的问题,例如在Xcode 9中,你需要使info.plist可本地化。具体做法是进入文件并单击文件检查器中的本地化按钮,如下所示。然后,当你添加新的本地化时,info.plist将被包括在文件资源中。请参考下方图片:enter image description here

4
你遇到问题了吗?当我在添加两种语言到本地化后,无法构建项目,因为Xcode显示“无法打开文件info.plist,因为没有这样的文件”。请问是否出现了任何问题? - mkkrolik
3
我现在遇到了同样的问题。你找到解决方法了吗? - Todanley
@Todanley 跳过这个解决方案,它对我无效。改用 InfoPlist.strings。 - mkkrolik
@mkkrolik 谢谢,好使了。另外,在使用模拟器进行测试时,我必须更改模拟器的语言设置而不是我的目标语言设置才能使它工作。 - Todanley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接