如何将本地化的plist读作字典?

时间:2015-02-28 20:46:31

标签: ios swift dictionary localization plist

如何将本地化的plist作为字典阅读?这感觉很有希望......

if let path = NSBundle.mainBundle().pathForResource("LocalizedDictionary", ofType: "plist", inDirectory: ???, forLocalization: "en") {
        localizedDictionary = NSDictionary(contentsOfFile: path)
        return localizedDictionary
}

但是我显然遇到了 inDirectory 参数的正确路径问题。这是正确的做法吗?

如何将plist文件的本地化版本作为Dictionary?

注意:我没有使用NSLocalizedString,因为我在应用程序运行时没有切换语言时出现问题。

2 个答案:

答案 0 :(得分:0)

这里应该有所帮助。

像这样创建一个NSDictionary类扩展。 它可以根据您的需要进行调整和调整(例如,加载'字符串'字典作为例子,或者在参数中传递语言环境...)

@implementation NSDictionary (NSDictionary_Extras)

+(NSDictionary*)dictionaryWithName:(NSString*)name
{
    NSDictionary    *dict = NULL;
    NSURL           *dictURL = [[NSBundle mainBundle] URLForResource:name withExtension:@"plist"];

    if (dictURL) {
        dict = [NSDictionary dictionaryWithContentsOfURL:dictURL];
    }

    return dict;
}

+(NSDictionary*)localizedDictionaryWithName:(NSString*)name
{
    NSDictionary    *localizedDict = NULL;
    NSString        *localizationName = [[NSLocale preferredLanguages] objectAtIndex:0];
    NSURL           *localizedDictURL = [[NSBundle mainBundle] URLForResource:name withExtension:@"plist" subdirectory:[NSString stringWithFormat:@"%@.lproj",localizationName]];
    // If resource doe not exist, we try at root ( resource must have a 'base' localization, or not being localized )
    if (!localizedDictURL) {
        localizedDictURL = [[NSBundle mainBundle] URLForResource:name withExtension:@"plist"];
    }

    if (localizedDictURL) {
        localizedDict = [NSDictionary dictionaryWithContentsOfURL:localizedDictURL];
    } 

    return localizedDict;
}

@end

然后你只需使用以下方法加载一个plist:

NSDictionary* myDict = [NSDictionary dictionaryWithName:@"myDict"]

或带

的本地化plist
NSDictionary* myDict = [NSDictionary localizedDictionaryWithName:@"myDict"].

我在所有项目中导入了这个额外的内容。

答案 1 :(得分:0)

您无需更改任何代码。

xCode的资源本地化很整洁,对您来说经常是完全透明的。您只需要将主数据包的资源URL视为正常并从中加载。 NSBundle执行为您提供本地化资源所需的任何映射。

有一个教程here让我走了。它有点过时了,但重要的细节都没有改变。