【问题标题】:How to read a localized plist as Dictionary?如何将本地化的 plist 读取为字典?
【发布时间】:2015-05-01 10:36:59
【问题描述】:

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

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

但我显然在获取 inDirectory 参数的正确路径时遇到了问题。这是正确的方法吗?

如何将 plist 文件的本地化版本作为字典获取?

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

【问题讨论】:

  • 那么你的目录结构是什么样的。假设你有一个 en.lproj。需要更多信息才能有所帮助。另外,您确定您的 plist 根节点不是数组。它可以是数组或字典。
  • @mike.c 尽管问题相似,但它不是重复的。但是那里接受的答案指向了一个完全不同的解决方案,即不使用本地化 plist,并且还关注NSLocalizedString 来访问单个字符串(而不是接收整个本地化字典)。很遗憾,这并没有帮助。

标签: ios swift dictionary localization plist


【解决方案1】:

您无需更改任何代码。

xCode 的资源本地化非常简洁,而且经常对您完全透明。您只需像往常一样向主包询问资源 url 并从中加载。 NSBundle 执行为您提供本地化资源所需的任何映射。

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

【讨论】:

    【解决方案2】:

    这里有一些应该有帮助的东西。

    像这样创建一个 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"].
    

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

    【讨论】:

    • 我想它可以很容易地 swifted ;)
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多