ChatGPT解决这个技术问题 Extra ChatGPT

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

https://i.stack.imgur.com/6gzmx.png

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

- 更新 -

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

你有没有解决这个问题,我也在努力让 NSLocationWhenInUseUsageDescription 本地化?

A
Ahmed Shendy

您应该使用 InfoPlist.strings 文件(保留 IP 大写)来本地化 Info.plist 的值。为此,请转到 File->New->File,在 iOSResource 标签下选择 Strings File,将其命名为 InfoPlist,然后创建。打开并插入要本地化的 Info.plist 值,例如:

NSLocationWhenInUseUsageDescription = "Description of this";

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

选择本地化选项,或在需要时启用本地化,

https://i.stack.imgur.com/B4hNo.png

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

https://i.stack.imgur.com/mG8eT.png

注意:在模拟器上测试本地化时。您必须更改模拟器本身的语言,而不仅仅是 Xcode 目标中的语言。 (学分归于 John Webb

HereInfo.plist 键本地化的官方文档。

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


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

以上所有对我来说都不起作用(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
A
Andy Weinstein

逐步本地化 Info.plist:

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

"NSLocationAlwaysAndWhenInUseUsageDescription"="blabla";

"NSLocationAlwaysUsageDescription"="blabla2";

这就是全部工作,您已经本地化了您的 info.plist 文件!


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

提示

请记住,iOS 模拟器默认会利用您的系统语言。请在 iOS 模拟器设置中更改语言(和地区)以测试您的翻译。本地化字符串(请参阅此处的 Apple 文档)应该是 NSLocationWhenInUseUsageDescription = "Description of this";而不是(带引号“...”)“NSLocationWhenInUseUsageDescription”=“这个描述”;


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

如果某些东西不起作用,请确保您添加了:

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

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


M
Matt S.

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

https://i.stack.imgur.com/tKc4E.png

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

- 编辑 -

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


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

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

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

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

https://i.stack.imgur.com/e17bt.png


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

除了接受的答案(该项目在 Flutter 上但与原生基本相同):

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

NSLocationWhenInUseUsageDescription = "My explanation why I need this";

https://i.stack.imgur.com/kSDuZ.png

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

https://i.stack.imgur.com/JatRz.png

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

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

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

PS“开发语言”不会影响您的问题,不要费心改变它。


“键周围没有引号,末尾有分号” - Xcode 12.0.1 - 实际上,即使键有引号,它也能正常工作。
C
Cap

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

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


o
ofundefined

对于较新的 XCode 12 / 13 /...

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

https://i.stack.imgur.com/egzN8.png

https://i.stack.imgur.com/fQbDO.png

https://i.stack.imgur.com/88PcT.png

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

https://i.stack.imgur.com/Ohyby.png

https://i.stack.imgur.com/wbg7G.png

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

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

https://i.stack.imgur.com/abXYm.png


H
Hourglasser

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

https://i.stack.imgur.com/MfCAu.png

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

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


d
d.ennis

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

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


M
Mike Glukhov

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