应用程序本地化显示键而不是 iOS 中的值
App localization showing the key instead of the value in iOS
我一直在我的应用程序中使用本地化,但由于某些原因,一些字符串(不是全部)不会翻译,我看到了关键价值。我试图通过这样做来检查应用程序是否找到了本地化文件:
NSString *enPath = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSString *hePath = [[NSBundle mainBundle] pathForResource:@"he" ofType:@"lproj"];
NSString *ruPath = [[NSBundle mainBundle] pathForResource:@"ru" ofType:@"lproj"];
NSString *esPath = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"];
NSString *frPath = [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"];
NSString *arPath = [[NSBundle mainBundle] pathForResource:@"ar" ofType:@"lproj"];
其中none个为零
我检查了本地化文件的名称,它是 Localizable.strings
应该的名称。
还检查了密钥是否存在于 Localizable.strings
文件中并且确实如此。
我也试过:
- 清空缓存
- 正在清理所有目标
- 删除派生数据文件夹
- 重启
- 重置模拟器
- 转换为 UTF-16
- 删除所有本地化文件并重新创建它们。
还尝试完成 this 问题中的所有内容。
重要的是要说这不仅仅是一个 Simulator/Cache 问题。它还显示在下载该应用程序的设备上。 (我有企业帐号)。
我还能做些什么来识别或解决问题?
所以我发现了问题,我猜谁为我翻译了Localizable.strings
文件是个混蛋。在我的字符串文件中的 4 个地方有一行如下:
"KEY" ;= "Value"
此行导致某种崩溃,但由于某种原因让编译器成功构建。这就是为什么我找不到错误的原因,只有当我决定采用最后一个未翻译的键和值并将它们移动到 Localizable.strings
文件的顶部时。然后我能够理解并看到问题出在文件中间的某个地方,并且顶部的键和值翻译得很好。
如果您指定 table:nil
,则 NSBundle
将尝试从默认 table(SOMELANG.lproj/Localizable.strings
中的那个)获取本地化。如果你在其他地方有 localization
,你应该使用 table:@"File"
明确指定 table(或者以类似的方式使用 NSLocalizedStringFromTable()
宏:
NSString *value = NSLocalizedStringFromTable(@"key", @"File", nil);
此外,
仔细检查 Localizable.strings
文件是否被添加到
Targets -> BuildPhases -> Copy Bundle Resources
它没有为我自动添加。
捕获此类错误的一个方法是复制字符串文件,将扩展名更改为 plist 并尝试在 Xcode 中打开它。如果字符串文件中有任何问题,它将显示在 Xcode 中,因为字典将只包含键,直到出现错误为止。然后您可以执行 Find 操作并找到错误,直到您确定所有字符串都出现在 plist 文件中。然后您可以将文件重命名回 .strings
我一直在我的应用程序中使用本地化,但由于某些原因,一些字符串(不是全部)不会翻译,我看到了关键价值。我试图通过这样做来检查应用程序是否找到了本地化文件:
NSString *enPath = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSString *hePath = [[NSBundle mainBundle] pathForResource:@"he" ofType:@"lproj"];
NSString *ruPath = [[NSBundle mainBundle] pathForResource:@"ru" ofType:@"lproj"];
NSString *esPath = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"];
NSString *frPath = [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"];
NSString *arPath = [[NSBundle mainBundle] pathForResource:@"ar" ofType:@"lproj"];
其中none个为零
我检查了本地化文件的名称,它是 Localizable.strings
应该的名称。
还检查了密钥是否存在于 Localizable.strings
文件中并且确实如此。
我也试过:
- 清空缓存
- 正在清理所有目标
- 删除派生数据文件夹
- 重启
- 重置模拟器
- 转换为 UTF-16
- 删除所有本地化文件并重新创建它们。
还尝试完成 this 问题中的所有内容。
重要的是要说这不仅仅是一个 Simulator/Cache 问题。它还显示在下载该应用程序的设备上。 (我有企业帐号)。
我还能做些什么来识别或解决问题?
所以我发现了问题,我猜谁为我翻译了Localizable.strings
文件是个混蛋。在我的字符串文件中的 4 个地方有一行如下:
"KEY" ;= "Value"
此行导致某种崩溃,但由于某种原因让编译器成功构建。这就是为什么我找不到错误的原因,只有当我决定采用最后一个未翻译的键和值并将它们移动到 Localizable.strings
文件的顶部时。然后我能够理解并看到问题出在文件中间的某个地方,并且顶部的键和值翻译得很好。
如果您指定 table:nil
,则 NSBundle
将尝试从默认 table(SOMELANG.lproj/Localizable.strings
中的那个)获取本地化。如果你在其他地方有 localization
,你应该使用 table:@"File"
明确指定 table(或者以类似的方式使用 NSLocalizedStringFromTable()
宏:
NSString *value = NSLocalizedStringFromTable(@"key", @"File", nil);
此外,
仔细检查 Localizable.strings
文件是否被添加到
Targets -> BuildPhases -> Copy Bundle Resources
它没有为我自动添加。
捕获此类错误的一个方法是复制字符串文件,将扩展名更改为 plist 并尝试在 Xcode 中打开它。如果字符串文件中有任何问题,它将显示在 Xcode 中,因为字典将只包含键,直到出现错误为止。然后您可以执行 Find 操作并找到错误,直到您确定所有字符串都出现在 plist 文件中。然后您可以将文件重命名回 .strings