无法加载localizable.strings

时间:2012-10-04 16:16:40

标签: objective-c ios nslocalizedstring

删除项目的一种语言后,项目中的其他现有可本地化文件未正确加载。文件包含在捆绑包资源中,但它们未正确加载,load方法不会返回任何值,而是包含在localizable.strings文件中的字符串键。

enter image description here

这是加载方法:

-(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;

}

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

在大多数情况下,您只需使用NSLocalizedString查找字符串的翻译即可。例如:

myLabel.text = NSLocalizedString(@"The String Key", @"Comment for translators");

为了探索查找这些字符串的问题,我有两点建议:

  • 仔细检查iPhone /模拟器是否设置为您要显示的语言。 是的,这应该是显而易见的,但让我们保持安全。
  • 在模拟器中运行您的应用,并记录以下路径:

    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应该按预期工作 - 所以即使如果上述建议没有完全解决您的问题,您可以减少修复主捆绑文件结构的问题。