如何定义一个函数macros来检查多个本地化的string文件之间的密钥?

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

我已经考虑从KYLocalizable.strings使Localizable.strings “子类”,但它不能据我所知。 所以相反,我想定义一个像SDK一样的函数macros:

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

伪代码:

 #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"] 

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

提前致谢!!

如果密钥不存在,您将收到的string将是密钥本身。 所以只要你认为你永远不会使用这个键作为本地化的string,你可以testingNSLocalizableString是否返回了你的键。

在这个电话中:

 [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

如果string不能使用指定的键位于string文件中,则将使用value参数(当前为空string)。 所以…所有你需要做的就是把你的第二次查findKYLocalizable.strings作为该参数的值。 代码看起来类似于(我没有真正运行这个,但它应该是closures的):

 [[NSBundle mainBundle] localizedStringForKey:(key) value:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"] table:nil] 

在这一点上,如果findLocalizable.strings中的string将被使用。 否则,将使用KYLocalizable.strings中的值。 如果没有find,则会返回一个空白string(因为这是在嵌套的参数中指定的)。

然而,这种方法的低效之处在于,您的应用程序将在每次尝试时首先尝试在KYLocalizable.strings中进行查找(以便随后在执行对Localizable.strings的外部查找时,可以将此结果作为参数传入)。 如果你真的想首先检查Localized.strings ,然后只做第二次查找,如果没有findstring,我想你需要创build一个方法与它的逻辑(例如,添加一个方法在类别在NSBundle)。

谢谢@Xval,我自己弄明白了,这里有一个简单的函数(如果你有更好的想法,请提供一些build议):

 #define KYLocalizedString(key, comment) \ [[[NSBundle mainBundle] localizedStringForKey:(key) value:nil table:nil] isEqualToString:(key)] ? \ [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"] : \ [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

localizedStringForKey:将会返回一个如@Xval所说的NSString。 🙂

对于Swift:

 var key = "your_key" NSBundle.mainBundle().localizedStringForKey(key, value: NSBundle.mainBundle().localizedStringForKey(key, value:"", table: nil), table: "Your_Custom_Localizable_File") 

根据苹果公司的文件,只是为了澄清事情:

 If key is not found and value is nil or an empty string, returns key. 

因此,使用这种技术,您可以根据需要将调用嵌套到尽可能多的本地化文件。

我为本地化的string编写了这个方便的扩展,所以你可以使用localized()函数获取本地化的string(你也可以传递参数)和isLocalized计算属性来检查string是否是本地化的:

 extension String { var isLocalized: Bool { return localized() != self } func localized(parameter: CVarArg? = nil) -> String { if let parameter = parameter { return String(format: NSLocalizedString(self, comment: ""), parameter) } else { return NSLocalizedString(self, comment: "") } } func localized(parameter0: CVarArg, parameter1: CVarArg) -> String { return String(format: NSLocalizedString(self, comment: ""), parameter0, parameter1) } }