NSLocalizedString有时会加载字符串,而不是总是

时间:2013-01-23 18:34:51

标签: ios objective-c nslocalizedstring

NSLocalizedString仅在我获得引用键的预期值的一半时间内起作用。其他时候我回到NSLocalizedString中指定的密钥名称,并且每次运行都会一直发生。

目前,我目前只支持英语。

我在打电话:

NSString *someText = NSLocalizedString(@"mystring.keyname", nil);

en.lproj / Localizable.strings的内容:

"mystring.keyname" = "Hello there!";

如果它无法正常工作,someText's值为mystring.keyname

以下是我测试可靠性的方法:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    NSLog(@"Strings file: %@", [bundle pathForResource:@"Localizable" ofType:@".strings"]);
    NSLog(@"Localizations: %@", [bundle localizations]);
    NSLog(@"Local Dict: %@", [bundle localizedInfoDictionary]);
    NSLog(@"localizedStringForKey: %@", [bundle localizedStringForKey:@"mystring.keyname"value:@"Wha happened?" table:nil]);
    NSLog(@"Localized String: %@", NSLocalizedString(@"mystring.keyname", @"Are you sure you want to start a new game?"));
}

这会在每次运行时打印出预期值:

Run #1:
Local Dict: (null)
localizedStringForKey: Hello there!
Localized String: Hello there!

Run #2:
Local Dict: (null)
localizedStringForKey: Wha happened?
Localized String: mystring.keyname

我的档案如下:

WORKSPACE_DIR/ 
  my_workspace_name.xcworkspace
  PROJECT_DIR/
    - my_project_name.xcodeproj
    RESOURCES_DIR/
      - en.lproj/
          Localizable.strings

XCode的项目级设置:

1) Build Phases has Localizable.strings listed in the "Copy Bundle Resources".

2) Build Settings:
   Convert Copied Files => YES
   Property List Output Encoding => binary
   Strings file Output Encoding => UTF-16        

3) Info.plist's: CFBundleDevelopmentRegion => 'en'

Localizable.strings配置为UTF-16虽然我没有在文件检查器中看到选中了字符串文件的文本设置选项。但我已经通过在TextWrangler中打开文件来验证编码类型,该文件使用Unix LF显示编码为Unicode(UTF-16)。

有关如何让这一切始终有效的任何建议吗?

3 个答案:

答案 0 :(得分:3)

如果您的localisable文件中有任何额外的分号,它会构建,但无法进行本地化。

答案 1 :(得分:1)

目标中应该有多个名为“Localizable.strings”的文件。 Xcode无法处理此问题。 您可以重命名一个,并使用“NSLocalizedStringFromTable”从中加载。 有关详细信息,请参阅: Localisation strings not always work having ShareKit in a project

答案 2 :(得分:1)

在寻求解决方案后几分钟,我找到了。 我已经包含了来自第三方的另一个Localizable.strings。一旦我删除了它,每次运行都不会丢失翻译。