如何定义一个函数宏来检查多个本地化字符串文件之间的关键字?

Kju*_*uly 3 macros cocoa-touch localization objective-c ios

我有一个Localizable.strings文件用于我的项目的i18n,而lib则使用KYLocalizable.strings.

我考虑过制作Localizable.strings"子类" KYLocalizable.strings,但据我所知,它不能.所以相反,我想像SDK一样定义一个函数宏:

#define NSLocalizedString(key, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
Run Code Online (Sandbox Code Playgroud)

伪代码:

#define CustomLocalizedString(key, comment) \
    // if key exists in Localizable.strings
    //   use it
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
    // else
    //   search it in KYLocalizable.strings
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"]
Run Code Online (Sandbox Code Playgroud)

所以我可以CustomLocalizedString(<key>, <comment>)在我的项目中使用.
但是如何检查密钥是否存在Localizable.strings

提前致谢!!

小智 5

在这个电话中:

[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
Run Code Online (Sandbox Code Playgroud)

参数(目前为空字符串)将被使用,如果字符串不能在你的字符串文件使用指定的关键所在.所以......你需要做的就是将第二次查找到KYLocalizable.strings作为该参数的值.代码看起来与此类似(我实际上没有运行它,但它应该是关闭的):

[[NSBundle mainBundle] localizedStringForKey:(key) 
    value:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"]
    table:nil]
Run Code Online (Sandbox Code Playgroud)

此时,如果找到,将使用Localizable.strings中的字符串.否则,将使用KYLocalizable.strings中的值.如果未找到,则返回空字符串(因为这是嵌套参数中指定的字符串).

但是,这种方法的一个低效率是您的应用程序实际上会在每次尝试时首先尝试在KYLocalizable.strings中进行查找(以便随后在对Localizable.strings进行外部查找时将此结果作为参数传递).如果你真的想先检查Localized.strings,然后如果找不到字符串进行第二次查找,我认为你需要在其中创建一个带有该逻辑的方法(例如,在一个方法中添加一个方法) NSBundle上的类别).