NSLocalizedString仅检索Localizable.strings中的键,而不是值(IOS)

48

我已经创建了一个名为 "Localizable.strings" 的字符串文件,并向其中添加了两种语言,就像这样:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";

我也将文件转换为Unicode UTF-8格式。但是,当我像这样创建一个UIAlertView:

 UIAlertView *myAlert = [[UIAlertView alloc]
 initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
 message:NSLocalizedString(@"CONNECTIONERROR",nil)                    
 delegate:self
 cancelButtonTitle:@"Ok"
 otherButtonTitles:nil];

警告视图仅显示关键文本,而不是值。如果我将UITextView的文本设置为NSLocalizedString(@“CONNECTIONERROR”,nil),则它可以正常工作,但弹出窗口仅显示关键字。有人知道怎么回事吗?


7
如果NSLocalizedString()无法找到键值对,它会返回键。 - Costique
抱歉,我没有复制/粘贴代码所以这是一个打字错误。然而,我的应用程序中的代码是正确的。 - Smiden
看看这个答案,它可能会有所帮助。 - user1947368
不要害怕在键中使用下划线或空格。 - clocksmith
我仍然无法让它工作。UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@“WARNING”,nil)message:NSLocalizedString(@“LOGIN_NRIC_REQUIRED”,nil)delegate:self cancelButtonTitle:@“OK”其他按钮:nil];没有得到LOGIN_NRIC_REQUIRED。有什么想法吗? - TPG
显示剩余2条评论
30个回答

113

在我的情况下,是因为我错误地将文件命名为“Localization.strings”,并没有注意到(它必须被命名为Localizable.strings)。如先前所述,症状是由于编译器找不到字符串而导致的。否则,原因可能是任何数量的事情,但通常是缺少分号或引号。当您一次性进行大量本地化时,这些很难发现。得出的教训是要在开发过程的早期开始构建本地化文件,并随着开发逐步构建,以便更容易发现问题。


请注意,文件名区分大小写。因此,您必须使用“.strings”而不是“.Strings”。 - He Yifei 何一非
2
文件应该命名为_Localizable.string_,其中大写字母L,没有s... 约定优于配置...我讨厌这种范式。 - Martin
在我的情况下也是Localizable.strings出了问题。我花费了两个小时的时间来查找问题的原因。 - Nermin Sehic

27

同样的问题,通过使用文件名 Localizable.strings 解决了。


20

双重检查 Localizable.strings 文件是否被添加到

Targets -> BuildPhases -> Copy Bundle Resources

对我来说它没有自动添加。

编辑 2021: 使用 XCode 12,Localizable.strings 必须添加到

Targets -> Build Phases -> Compile resources


19
将你的.strings文件名更改为Localizable.strings,这对我起到了作用。

13

我已经搜索了5个小时的解决方案,尝试了我能想到的一切来使我的应用本地化工作。

问题在于我的项目中有一个Pod包含一个Localizable.strings文件(实际上是Parse pod没有重命名)。因此,我的Localizable.strings文件无法被我的应用程序识别。

我通过将文件名更改为"MyappnameLocalizable.strings"并使用NSLocalizedString这种方式来解决了这个问题:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")

9
我在iOS模拟器上遇到了问题,最后在模拟器目录中删除了Localization.strings文件。请前往该目录(/Users/(me)/Library/Application Support/iPhone Simulator/5.0/Applications/(etc)/(project)/(application.app)),并删除其中所有的Localization.strings副本。不知何故,通常的清理、退出iOS模拟器和XCode等方法都没用,但这个办法今天对我有效。

9

在实际设备上测试了应用程序,并且它能够正常工作。


19
另一个问题是 Localizable.strings 文件没有被正确地清空和重新初始化;如果您之前在设备上进行了测试,然后创建或大量修改了 Localizable.strings 文件,则不一定会注意到更改,因此必须在更改正确传播之前清除构建并从设备中删除该副本。 - mark
从模拟器中卸载该应用程序对我起了作用。 - cprcrack
我发现从Mac的Build Products文件夹中删除应用程序就足以让Xcode使用所有最新的文件。 - Walt Sellers

8
当运行时无法找到指定的键时,会发生这种情况,原因可能是任何东西。在您的情况下,最有可能是由于打字错误:CONNECTIONERRORITLE 缺少一个 T,应该为 TITLE。此外,在编译 Localizable.strings 文件时注意任何警告/错误:如果存在不平衡的 " 或缺少的 ;,则文件将无法正确编译/读取。

7

将文件名更改为Localizable.strings,确保文件检查器中的目标已设置。 为避免语法错误,请右键单击Localizable.strings文件->打开为->ASCII属性列表 此外,在我的情况下,清理项目并重新构建也有所帮助。


这也是在本地化字符串文件中寻找错误的好方法。 - ViruMax

6

如果在一行的末尾写上了两个分号,NSLocalization 将无法工作。 您应该检查 Localizable.strings 文件中是否有 ';;'。


是的,这种情况也发生在我身上,我检查并解决了它...谢谢你的帮助。 - Devil

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