我有一个Localizable.strings
为我的项目的国际化文件和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)]
伪代码:
#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
或没有?
提前致谢!!
如果该键不存在,您将收到该字符串将是关键本身。 所以,只要你想,你永远都不会使用该密钥作为一个本地化的字符串,你可以测试是否NSLocalizableString回到你的关键与否。
在此呼吁:
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
值参数(目前为空字符串)将被使用,如果字符串不能在你的字符串文件使用指定的关键所在。 所以......你应该需要做的是你的第二个查找的地方KYLocalizable.strings作为值到该参数。 该代码将类似于这样(我其实没有运行它,但它应该是接近):
[[NSBundle mainBundle] localizedStringForKey:(key)
value:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:@"KYLocalizable"]
table:nil]
在这一点上,如果发现Localizable.strings字符串将被使用。 否则,将使用在KYLocalizable.strings值。 如果还是没有被找到,然后一个空字符串将返回(因为这是在嵌套值参数指定)。
但是,这种方法的一个效率低下是(做外查找到Localizable.strings时,使这个结果随后可以传入作为值参数),您的应用程序实际上会尝试先对每一个试图在KYLocalizable.strings查找。 如果你真的想先检查Localized.strings,然后只做了第二次查找,如果未找到字符串,我想你会需要它来创建与逻辑的方法(例如,在添加一个方法在一个NSBundle类)。
谢谢@Xval,我只是想它自己,这里有一个简单的函数(请提供一些建议,如果你有更好的想法):
#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:
将返回的NSString作为@Xval说。 :)
对于斯威夫特:
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.
因此,使用这种技术,你可以根据需要嵌套调用尽可能多的本地化文件。
我写了本地化字符串这个方便的扩展,所以你可以只使用localized()
函数来得到本地化的字符串(你也可以传递参数)和isLocalized
计算的属性来检查字符串是否局部存在:
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)
}
}
文章来源: How to define a function macro to check key between multiple localized string files?