【问题标题】:Xcode 4.6 localization within plist fileplist 文件中的 Xcode 4.6 本地化
【发布时间】:2013-03-20 10:40:08
【问题描述】:

我已经开始在我的项目中添加更多语言,并且没有太多麻烦地本地化了字符串和图形。

我还有最后一个问题,它与 plist 文件有关。

此 plist 文件包含应用程序的默认类别名称,并在字典中填充了英文字符串。

我的问题是:有没有办法本地化 plist 文件?我想向 plist 添加本地化字符串,但不知道如何。

我不想在代码中决定要采用哪个 plist 文件,因为默认 plist 文件在第一次使用时会被用户覆盖。

【问题讨论】:

    标签: objective-c xcode localization plist


    【解决方案1】:

    本地化的 Plist 文件

    这里更简单的解决方案是本地化整个 plist。通过这样做,您将为每种受支持的语言提供不同的 plist 文件。

    选择项目中的 plist 文件,然后在 File Inspector 菜单中选择 Localize

    它将为每种支持的语言创建一个包含 Plist 文件的新文件夹。

    发件人:

    dummy.plist

    收件人:

    > en.lproj
    >  >  dummy.plist
    > es.lproj
    >  >  dummy.plist
    > de.lproj
    >  >  dummy.plist
    

    本地化的 Plist 内容

    另一种解决方案是在 plist 中使用本地化字符串,并在打印出提取的字符串之前调用 NSLocalizedString

    想象一下你有一个这样的 Plist:

    您可以通过将键添加到您的Localizable.strings 文件来简单地本地化它的字符串。例如,在西班牙语中:

    "My menu title" = "Mi título del menú";
    "My menu description" = "Mi descripción del menú";
    

    或者,我的建议是,将您的母语字符串从 Plist 移出到一个字符串文件,并用可本地化的键替换 Plist 字符串:

    还有你的Localizable.strings 英语:

    "MY_MENU_TITLE" = "My menu title";
    "MY_MENU_DESCRIPTION" = "My menu description";
    

    和西班牙语:

    "MY_MENU_TITLE" = "Mi título del menú";
    "MY_MENU_DESCRIPTION" = "Mi descripción del menú";
    

    我发现最新版本的新语言更易于维护和本地化,因为所有必需的字符串都在同一个文件中。

    最后将您的代码更改为使用NSLocalizableString,而不是从Plist 文件中读取的纯字符串。例如,假设您有以下代码:

    NSDictionary* plistDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"menuElements" ofType:@"plist"]];
    
    menuTitleLabel.text = plistDict[@"menuTitle"];
    menuDescriptionLabel.text = plistDict[@"menuDescription"];
    

    只需将其更改为:

    NSDictionary* plistDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"menuElements" ofType:@"plist"]];
    
    menuTitleLabel.text = NSLocalizedString(plistDict[@"menuTitle"], nil);
    menuDescriptionLabel.text = NSLocalizedString(plistDict[@"menuDescription"], nil);
    

    如果这是你的情况,你可以完全摆脱 plist 文件:

    menuTitleLabel.text = NSLocalizedString(@"MY_MENU_TITLE", nil);
    menuDescriptionLabel.text = NSLocalizedString(@"MY_MENU_DESCRIPTION", nil);
    

    【讨论】:

    • 这似乎是一个很好的解决方案。我想“重新询问”plist 中本地化字符串的含义。我可以在 plist 中使用 'NSLocalizedString:@"XX"' 吗?还是你的意思是事后施法?
    • 太棒了!非常感谢您抽出宝贵时间:) 接受
    • 假设您已本地化为英语和西班牙语。当我使用 menuTitleLabel.text = NSLocalizedString(@"MY_MENU_TITLE", nil);使用法语作为系统语言的用户会看到什么?她不会只看到“MY_MENU_TITLE”吗?哪个...对用户来说真的没有任何意义?
    • @JihoKang 当然不是。用户将看到默认的开发语言(在 Info.plist 文件中设置),除非在项目中为该语言创建了本地化并且该语言的本地化文件不存在。随意尝试。
    • 你永远不应该将 NSlocalizedString() 与变量或常量一起使用,永远不要做类似“NSLocalizedString(someVariable, 'comment')”之类的事情。如果你这样做,当你需要运行“genstrings”或“export for本地化”时会出现错误
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2011-10-29
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2013-03-12
    相关资源
    最近更新 更多