1

删除项目的一种语言后,项目中其他现有的可本地化文件无法正确加载。文件包含在捆绑资源中,但它们没有正确加载,加载方法不会返回任何值,因为 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;

}

非常感谢您的帮助。

4

1 回答 1

3

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

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

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

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

    NSLog(@"Bundle path is: %@", [[NSBundle mainBundle] bundlePath]);

从那里您可以探索您的应用程序用于执行特定语言查找的文件树(使用 Finder 或终端检查该目录中的文件)。您应该会看到直接在上面记录的路径中的目录,看起来像 {ios-language-code}.lproj 并且每个目录中都应该有一个名为 Localizable.strings 的文件(假设您使用的是默认翻译设置)。例如,en.lproj对于英语和fr.lproj法语。

从那里,我建议验证这些文件的格式是否正确,此处描述。了解使用这些文件的工具也很好,这些文件在此处进行了描述。

如果文件结构不是您所期望的,一种可能性是在 Xcode 中检查您的目标的构建阶段,并验证它Localization.strings是否列在“复制捆绑资源”部分下。

我很确定,如果您的捆绑包中有正确的 .lproj 目录,并且.strings这些目录中有正确的文件,那么NSLocalizedString应该可以按预期工作 - 所以即使上述建议不能完全解决您的问题,您可以减少修复主捆绑文件结构的问题。

于 2012-10-04T16:57:57.060 回答