Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS本地化、模拟器和设备始终使用Base.lproj,而不是用户首选的语言环境_Ios_Swift_Xcode_Dictionary_Localization - Fatal编程技术网

iOS本地化、模拟器和设备始终使用Base.lproj,而不是用户首选的语言环境

iOS本地化、模拟器和设备始终使用Base.lproj,而不是用户首选的语言环境,ios,swift,xcode,dictionary,localization,Ios,Swift,Xcode,Dictionary,Localization,我正在创建一个应用程序,目前我想用英语和德语提供。我检查了项目配置中的基本本地化标记,并添加了德语。我把英语作为发展语言 然后我创建了一个文件Translation.plist,它基本上由我称之为类别的字典组成,例如,我有一个按钮文本、标签文本等的字典。每个类别字典同样由包含两个字符串的字典组成:值和注释。Translation.plist通过XCode进行本地化。文件夹Base.lproj、en.lproj和de.lproj存在,并按预期包含plist文件的副本 然后我创建了一个类Transl

我正在创建一个应用程序,目前我想用英语和德语提供。我检查了项目配置中的基本本地化标记,并添加了
德语
。我把英语作为发展语言

然后我创建了一个文件
Translation.plist
,它基本上由我称之为类别的字典组成,例如,我有一个按钮文本、标签文本等的字典。每个类别字典同样由包含两个字符串的字典组成:值和注释。Translation.plist通过
XCode
进行本地化。文件夹
Base.lproj
en.lproj
de.lproj
存在,并按预期包含plist文件的副本

然后我创建了一个类
Translator.swift
,该类根据用户的首选语言环境将
Translation.plist
文件作为
NSDictionary
加载。代码如下所示:

func relevantDictionary(category: String) -> NSDictionary {
    let preferredLocale = Bundle.main.preferredLocalizations.first ?? "Base"
    NSLog("User's preferred locale is \(preferredLocale)")
    guard let url = Bundle.main.url(forResource: "Translation", withExtension: "plist") else {
        fatalError("Could not find Translation.plist")
    }

    NSLog("Using \(url.absoluteURL) for translation")
    guard let root = NSDictionary(contentsOf: url) else {
        fatalError("Could not find dictionary for category (locale=\(preferredLocale)")
    }

    guard let relevant = root.value(forKey: category) as? NSDictionary else {
        fatalError("Could not create dictionary from Translation.plist")
    }

    return relevant
}
然后,我创建了一个使用转换器的字符串扩展,如下所示:

func localize(category: String) -> String {
    return Translator.instance.translate(category: category, string: self)
}
有了这个,我用“是”来称呼翻译人员。本地化(“按钮”)。在英语中我期望“是”,在德语中我期望“是”。日志上说:

2017-07-05 08:45:24.728 myApp[13598:35048360]用户首选的语言环境是Deu de

2017-07-05 08:45:24.728 myApp[13598:35048360]使用file:///Users/me/Library/Developer/CoreSimulator/Devices/A39D3318-943D-4EFE-BB97-5C2218279132/data/Containers/Bundle/Application/4614E696-B52E-4C30-BBE8-3C76F6392413/myApp.app/Base.lproj/Translation.plist 翻译

我想知道为什么会这样,我错过了什么。我本以为加载的是
de.lproj/Translation.plist
,而不是
Base.lproj/Translation.plist


非常感谢您的帮助。

您可以使用单个.plist文件来完成此操作。您不需要为它创建不同的.plist文件

Firstly, Add English and German countries with locale in Project -> info
https://i.stack.imgur.com/M4QIY.png

Once, you added countries with locale in Project -> info then add localizable.strings file in your bundle.
https://i.stack.imgur.com/lnjgL.png

At the end, just add country's locale in your language support class.

NSArray* languages = @[@"en", @"de"];`enter code here`
    NSString *current = [languages objectAtIndex:0];
    [self setLanguage:current];

希望它能对您有所帮助。

您首先为什么要创建自己的plist文件?你应该使用
.strings
文件,不是吗?当我使用plist文件时,我感觉更舒服、更灵活。在如何组织本地化方面,它们更强大。这意味着,即使只需要一种语言,我也必须加载所有语言。对我来说,这似乎是昂贵的内存使用,对吗?无论如何,是否可以加载本地化的plist文件?如果是,怎么做?@Martin,这在内存使用方面并不昂贵。我可以用包含区域设置的文件名为每种语言创建一个文件,并根据用户首选的区域设置加载正确的文件。这样,我只需加载所需的内容。无论如何,谢谢你的提示。:)