Xcode 4.6在plist文件中的本地化

时间:2013-03-20 10:40:08

标签: objective-c xcode localization plist

我已经开始在我的项目中添加更多语言并获得字符串&图形本地化没有太大麻烦。

我有一个最后一个问题,它是一个plist文件。

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

我的问题是:有没有办法本地化一个plist文件?我虽然想把本地化的字符串添加到plist但是无法弄清楚如何。

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

1 个答案:

答案 0 :(得分:24)

本地化的Plist文件

这里更容易解决的问题是将整个plist本地化。通过这样做,您将为每种支持的语言使用不同的plist文件。

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

File localization image

它将为每种支持的语言创建一个包含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为Engligh:

"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);