我创建了一个名为" 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),它就可以工作,但警报视图只显示密钥。谁知道什么是错的?
答案 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)
请务必不要放置' @'在key
或value
之前,如此:
@"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)
如果您使用多个捆绑包,例如在外部框架中使用它:
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)
您是否尝试过清洁和重建项目?