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

时间:2012-02-12 17:59:42

标签: ios xcode uialertview nslocalizedstring localizable.strings

我创建了一个名为" 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];

警报视图仅显示关键文本,而不显示值。例如,如果我将UITextviews文本设置为NSLocalizedString(@" CONNECTIONERROR",nil),它就可以工作,但警报视图只显示密钥。谁知道什么是错的?

29 个答案:

答案 0 :(得分:96)

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

答案 1 :(得分:24)

同样的问题,使用文件名解决:Localizable.strings

答案 2 :(得分:12)

将您的.strings文件名更改为Localizable.strings,这对我有用。

答案 3 :(得分:10)

在实际设备上测试应用程序并且它可以正常工作

答案 4 :(得分:10)

仔细检查Localizable.strings文件是否已添加到

目标 - > BuildPhases - >复制捆绑资源

我没有自动添加。

答案 5 :(得分:9)

我一直在寻找解决方案5个小时,我尽我所能使我的应用本地化工作。

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

我通过将文件名更改为" MyappnameLocalizable.strings"来修复此问题。并以这种方式使用NSLocalizedString:

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

答案 6 :(得分:8)

我在iOS模拟器上遇到此问题。我最终删除了模拟器目录中的Localization.strings文件

  

(/ Users /(me)/ Library / Application Support / iPhone   模拟器/ 5.0 /应用/(等)/(项目)/(application.app)

cd到那里并删除那里找到的Localization.strings的所有副本。

出于某种原因,通常的橡皮鸡伏都教的构建干净,退出iOS模拟器,退出XCode等不起作用,但这样做。至少对我来说,今天。

答案 7 :(得分:8)

当运行时由于某种原因无法找到指定的密钥时,会发生这种情况。在您的情况下,最有可能是由于输入错误:CONNECTIONERRORITLE缺少T的{​​{1}}。在编译TITLE文件时还要注意任何警告/错误:如果存在不平衡Localizable.strings或缺少",则无法正确编译/读取文件。

答案 8 :(得分:7)

将文件名更改为Localizable.strings,确保设置了文件检查器中的目标。 要避免语法错误,请右键单击Localizable.strings file->打开as-> ASCII属性列表 此外,在我的案例中,清理项目和重建也有帮助。

答案 9 :(得分:6)

NSLocalizedString用法意味着您需要密钥的精确案例和拼写才能从中获取内容。你会注意到这个说

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

什么时候应该

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

如果你看第一部分的最后一部分,它会说'ITLE',而不是'TITLE'

答案 10 :(得分:6)

将InfoPlist.strings文件重命名为Localizable.strings(double clic),然后您将获得该密钥的正确字符串。

答案 11 :(得分:4)

要查明是否找到了Localizable.strings文件,请检查.app版本的内容,您也可以在代码中执行此操作:

// en代表英语,所以在这里指定你的 NSString * path = [[NSBundle mainBundle] pathForResource:@" en" ofType:@" lproj"];

如果path为NULL,则表示找不到文件。

答案 12 :(得分:3)

如果您在一行的末尾写了双分号,则NSLocalization不起作用。 你应该检查Localizable.strings文件,如果有';;'

答案 13 :(得分:2)

如果你的字符串文件中有任何额外的分号,它就不会本地化。

答案 14 :(得分:1)

我遇到了类似的问题,突然我的可本地化字符串根本不起作用。然后我使用文件比较旧的.strings副本,最后我发现我不小心删除了一个键。

所以当然,如果格式错误,Xcode将不会为您读取字符串。

这是预期的格式“Key”=“Value”;

答案 15 :(得分:1)

所有建议的解决方案都不适合我,但我确实通过删除产品中的.app文件解决了这个问题

答案 16 :(得分:1)

在我的情况下,我尝试了清理项目并删除派生数据仍然无效。我删除了字符串文件中的几个换行符,然后Xcode再次找到字符串。

答案 17 :(得分:1)

放一个;在Localizable.strings文件的行末尾。

答案 18 :(得分:0)

当突然本地化停止翻译字符串时,我已经完成了所有工作。这意味着该文件在某种程度上对Xcode不可读。

这发生在我身上,因为我在Localized.strings文件中粘贴了一个坏字符。当我删除带有违规字符的几行(一个非unicode字符?坏的引号?无法告诉)时,一切都恢复正常。

要查找有问题的行,我创建了一个断点,并在调试器中手动翻译了我的文件中的字符串,直到我点击了第一个不能翻译的字符串。

答案 19 :(得分:0)

请务必不要放置' @'在keyvalue之前,如此:

@"key" = @"value";

应该只是:

"key" = "value";

' @'只有在访问密钥时才会出现在密钥前面:

NSWebLocalizedString(@"key", @"label for coder");

答案 20 :(得分:0)

重置模拟器设置对我有用。

iOS模拟器>重置内容和设置...

答案 21 :(得分:0)

本地化文件的第一行必须包含映射,否则SDK将不会读取该文件。

答案 22 :(得分:0)

对于xcode 9.2删除" Localizable.strings"使用控制台为项目的模拟器提供的文件为我解决了这个问题。这是像我这样懒惰的命令;)

不要忘记将 YOUR_APP_NAME_HERE 替换为您的项目名称

Shell脚本:

cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

如果您遇到单元测试问题,它将在模拟器中工作;)

答案 23 :(得分:0)

斯威夫特4:

如果您使用多个捆绑包,例如在外部框架中使用它:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")

答案 24 :(得分:0)

在开发SDK时。您需要一些额外的操作。

1)像往常一样在YourLocalizeDemoSDK中创建 Localizable.strings

2)在YourLocalizeDemo中创建相同的 Localizable.strings

3)找到YourLocalizeDemoSDK的捆绑路径

Swift4

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self))帮助您在YourLocalizeDemoSDK中找到捆绑软件。如果您改用Bundle.main,则会得到错误的值(实际上,它与键是相同的字符串)。

但是,如果您想使用dr OX提到的String扩展名。您还需要做更多。原点扩展名看起来像这样。

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

我们知道,我们正在开发一个SDK,Bundle.main将获得YourLocalizeDemo的捆绑包。那不是我们想要的。我们需要YourLocalizeDemoSDK中的捆绑软件。这是一种快速找到它的技巧。

在YourLocalizeDemoSDK的NSObject实例中运行以下代码。然后,您将获得YourLocalizeDemoSDK的URL。

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

同时打印两个URL,您会发现我们可以基于mainBundleURL构建SDK的bundleURL。在这种情况下,它将是:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

字符串扩展名将为:

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

希望有帮助。

答案 25 :(得分:0)

由于在寻找类似问题的答案时偶然发现了这一点,因此我将解决方案留在这里:

如果键中包含“ \ u2028”而不是“ \ n”,它将始终仅返回键而不返回值。似乎是本地化的错误。

答案 26 :(得分:0)

我遇到的问题是,一种语言正常工作,另一种语言工作一半时间,而另一次我获取密钥,而不是该密钥的本地化版本。

在我的情况下的问题是,在手动合并版本控制冲突之后,剩下多余的行“ >>>>>”,项目没有抱怨(不像您错过分号时那样抱怨)并且正在构建正确地翻译了'>>>>>'之前的每个键,而不翻译了之后的每个键。

如果更简单的解决方案失败,则可能必须遍历每行并查找其他字符(不仅是'>>>>>',其他字符也要查找),或者如果您使用的是版本控制变老,稳定版本的Localizable.strings文件,并手动进行更改并添加以后的提交。

答案 27 :(得分:0)

我们正在解决一个问题,即尽管所有键都存在于Localizable.strings中,但仍无法获得它们的值。

事实证明,构建文件的开发人员在一行中添加了两个分号,这导致对该文件的解析非常不稳定。

在我发现两个分号彼此相邻并摆脱了其中一个后,该应用程序将不再编译。此时,我能够找到一些没有分号的行。修复这些问题并编译应用程序后,我所有的字符串都可以正常工作。

因此在同一行中有两个分号会导致文件编译,尽管在其他行中缺少分号。

Apple的.strings文件解析器看起来非常原始。

不幸的是,在我们的案例中,plist短绒没有用。为了找到并解决该问题,我复制并粘贴了Localizable.strings文件的整个内容(该文件的长度超过2000行),然后开始将其复制回20行代码块中,并每次进行编译。这是找到短绒毛不会抓到的问题的唯一方法。

答案 28 :(得分:-1)

您是否尝试过清洁和重建项目?