Swift iOS Framework中Localizable.strings文件的可覆写实现方案咨询
实现iOS框架本地化被App覆写的可行方案
完全可以实现类似Android的资源覆写机制!下面分享两种最常用且靠谱的方案,都是Swift环境下经过实践验证的:
方案一:自定义本地化字符串获取方法(推荐)
这是最灵活可控的方式,核心思路是优先从App的主Bundle读取字符串,如果不存在则自动回落到框架自身的Bundle。
- 在你的Framework中创建一个全局工具类或者扩展方法,示例代码如下:
import Foundation public class FrameworkLocalization { public static func localized(for key: String) -> String { // 先尝试从App主Bundle获取对应key的字符串 let mainBundle = Bundle.main var result = mainBundle.localizedString(forKey: key, value: nil, table: nil) // 如果主Bundle找不到(返回值等于key本身),就用框架自己的Bundle读取默认值 if result == key { let frameworkBundle = Bundle(for: FrameworkLocalization.self) result = frameworkBundle.localizedString(forKey: key, value: key, table: nil) } return result } }
- 框架内部所有需要本地化的字符串,都用这个方法替代默认的
NSLocalizedString:
// 替代原来的 NSLocalizedString("welcome_msg", comment: "") let welcomeText = FrameworkLocalization.localized(for: "welcome_msg")
- 集成框架的App只需要在自己的
Localizable.strings文件中添加相同的key,就能直接覆写框架的对应字符串:
"welcome_msg" = "欢迎使用我的定制App!";
如果App没有添加这个key,就会自动使用框架里的默认本地化文本。
方案二:利用指定table名称实现覆写
如果不想自定义方法,也可以通过约定table名称来实现,步骤如下:
框架的本地化文件不要用默认的
Localizable.strings,而是命名为比如FrameworkStrings.strings(对应的table名就是FrameworkStrings)。框架内部使用带table和bundle参数的
NSLocalizedString:
let welcomeText = NSLocalizedString( "welcome_msg", tableName: "FrameworkStrings", bundle: Bundle(for: Self.self), value: "", comment: "欢迎语" )
- 集成的App要覆写时,只需要在自己的Bundle中创建同名的
FrameworkStrings.strings文件,添加对应key即可。iOS会优先从主Bundle读取指定table的字符串,找不到再去框架Bundle加载默认值。
注意事项
- 两种方案都要求框架和App使用完全一致的key名称,否则无法触发覆写逻辑。
- 如果框架支持多语言,App需要在对应的语言lproj目录下添加对应字符串文件,才能实现对应语言的覆写。
- 方案一对集成方更友好,不需要额外创建新的strings文件,只用App默认的
Localizable.strings就能完成覆写。
内容的提问来源于stack exchange,提问作者Gautam Naik
相关产品推荐
相关产品推荐

