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

2019-09-22 20:38发布

我有一个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或没有?

提前致谢!!

Answer 1:

如果该键不存在,您将收到该字符串将是关键本身。 所以,只要你想,你永远都不会使用该密钥作为一个本地化的字符串,你可以测试是否NSLocalizableString回到你的关键与否。



Answer 2:

在此呼吁:

[[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类)。



Answer 3:

谢谢@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说。 :)



Answer 4:

对于斯威夫特:

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.

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



Answer 5:

我写了本地化字符串这个方便的扩展,所以你可以只使用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?