Xcode 4.6中Plist文件的本地化

8
我已经开始将更多语言添加到我的项目中,并且很容易地将字符串和图形本地化。
但是,我遇到了一个问题,就是一个plist文件。
这个plist文件包含应用程序的默认类别名称,并且使用字典中的英文字符串填充。
我的问题是:有没有办法本地化一个plist文件? 我考虑过向plist文件中添加本地化字符串,但无法弄清楚如何操作。
我不想在代码中决定要使用哪个plist文件,因为用户会在第一次使用时覆盖默认的plist文件。
1个回答

24

本地化的Plist文件

更简单的解决方案是将整个plist文件本地化。这样做,您将为每种支持的语言拥有一个不同的plist文件。

在项目中选择plist文件,在文件检查器菜单中选择本地化

文件本地化图像

它会创建一个新文件夹,其中包含每种支持语言的Plist文件。

从:

dummy.plist

到:

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

本地化 Plist 内容

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

假设您有这样一个 Plist:

Original plist

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

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

或者,我的建议是,将您的本地化语言字符串从 Plist 文件中移出到一个字符串文件中,并使用可本地化的键替换 Plist 字符串: Localized plist contents 而您的英文 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“”吗?还是之后需要转换? - Sebastian Flückiger
太棒了!非常感谢您抽出时间 :) 接受 - Sebastian Flückiger
1
假设您已经本地化为英语和西班牙语。当我使用menuTitleLabel.text = NSLocalizedString(@“MY_MENU_TITLE”,nil);时,使用法语作为系统语言的用户会看到什么?她不只是会看到“MY_MENU_TITLE”吗?这对用户来说真的没有任何意义吗? - Jiho Kang
@JihoKang 当然不会。除非项目中为该语言创建了本地化,并且该语言的本地化文件不存在,否则用户将看到默认的开发语言(在Info.plist文件中设置)。随意尝试一下。 - redent84
你不应该在NSlocalizedString()中使用变量或常量,永远不要像这样做“NSLocalizedString(someVariable, 'comment')”。如果你这样做,在运行“genstrings”或“export for localization”时会出现错误。 - Hazneliel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接