Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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 框架的字符串本地化_Ios_Swift - Fatal编程技术网

Ios 框架的字符串本地化

Ios 框架的字符串本地化,ios,swift,Ios,Swift,我正在构建一个包含UI组件的框架。我正在使用以下内容检索本地化字符串: var bundle = Bundle(identifier: "com.my.identifier") bundle.localizedString(forKey: "myKey", value: nil, table: nil) 我看到的问题是,无论哪个父应用程序与我的框架集成,都必须为我的相同本地化启用本地化(例如,如果我有es的本地化,则父应用程序还必须在项目设置中为es启用本地化: 否则,我的本地化字符串总是默

我正在构建一个包含UI组件的框架。我正在使用以下内容检索本地化字符串:

var bundle = Bundle(identifier: "com.my.identifier")
bundle.localizedString(forKey: "myKey", value: nil, table: nil)
我看到的问题是,无论哪个父应用程序与我的框架集成,都必须为我的相同本地化启用本地化(例如,如果我有
es
的本地化,则父应用程序还必须在项目设置中为
es
启用本地化:

否则,我的本地化字符串总是默认为英语

我找到了一个解决办法,根据设备的首选语言手动获取语言包:

var bundle = Bundle(identifier: "com.my.identifier")

guard let deviceLanguage = Locale.preferredLanguages.first else {
    return notFound
}

guard let languagePath = bundle.path(forResource: deviceLanguage, ofType: "lproj") else {
    return notFound
}

guard let languageBundle = Bundle(path: languagePath) else {
    return notFound
}

return NSLocalizedString(self, tableName: "Localizable", bundle: languageBundle, value:"KEY_NOT_FOUND", comment: "")
但此解决方案的问题是,我丢失了内置的iOS语言回退(例如,如果设备首选语言为
es MX
,它将自动选择
es es
字符串,而不是我拥有的
en
字符串)


对于我的框架,有没有办法避免强制父应用程序为我所有的本地化字符串启用本地化,但仍然保留iOS语言回退逻辑?

为什么您希望您的框架使用应用程序不支持的本地化?这是一种糟糕的用户体验

想象一下,使用您的框架的应用程序只支持英语和西班牙语。现在想象一下,该应用程序的用户将其设备设置为首先使用德语,然后使用英语

由于该应用程序不支持德语,因此该应用程序显示英语。整个应用程序应显示英语。如果您的应用程序框架在这种情况下显示德语,则该应用程序的用户体验现在非常混乱,因为该应用程序的大部分语言为英语,但框架支持的部分显示为德语

tl;dr-什么都不要做。让默认行为按原样工作。这会带来更好的用户体验。

当您调用bundle.localizedString时,框架将选择与应用程序相同的语言,因此如果应用程序不支持ex-german,框架将以相同的应用程序语言显示本地化,如果不可用,框架将选择chose是框架的默认开发语言。