删除项目的一种语言后,项目中的其他现有可本地化文件未正确加载。文件包含在捆绑包资源中,但它们未正确加载,load方法不会返回任何值,而是包含在localizable.strings文件中的字符串键。
这是加载方法:
-(NSString*) languageSelectedStringForKey:(NSString*) key
{
NSString *path;
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [currentDefaults objectForKey:@"AppleLanguages"];
NSString *selectedLanguage = [languages objectAtIndex:0];
if([selectedLanguage isEqualToString:@"es"])
path = [[NSBundle mainBundle] pathForResource:@"es" ofType:@"lproj"];
else if([selectedLanguage isEqualToString:@"en"])
path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
NSBundle* languageBundle = [NSBundle bundleWithPath:path];
NSString* str=[languageBundle localizedStringForKey:key value:@"" table:nil];
path=nil;
languages=nil;
selectedLanguage=nil;
languages=nil;
languageBundle=nil;
return str;
}
非常感谢你的帮助。
答案 0 :(得分:3)
在大多数情况下,您只需使用NSLocalizedString
查找字符串的翻译即可。例如:
myLabel.text = NSLocalizedString(@"The String Key", @"Comment for translators");
为了探索查找这些字符串的问题,我有两点建议:
在模拟器中运行您的应用,并记录以下路径:
NSLog(@"Bundle path is: %@", [[NSBundle mainBundle] bundlePath]);
从那里,您可以浏览应用程序用于执行语言特定查找的文件树(使用Finder或Terminal检查该目录中的文件)。您应该看到直接位于上面记录的路径中的目录,看起来像{ios-language-code} .lproj,并且每个目录中都应该有一个名为Localizable.strings的文件(假设您使用的是默认的转换设置) )。例如,英语为en.lproj
,法语为fr.lproj
。
从那里,我建议验证这些文件的格式是否正确,here进行了描述。了解使用这些文件的工具也很好,这些文件描述为here。
如果文件结构不符合您的预期,一种可能性是在Xcode中检查目标的构建阶段,并验证“复制捆绑资源”部分下是否列出了Localization.strings
。
我很确定如果你的bundle中有正确的.lproj目录,并且那些目录中有正确的.strings
文件,那么NSLocalizedString
应该按预期工作 - 所以即使如果上述建议没有完全解决您的问题,您可以减少修复主捆绑文件结构的问题。