4

我有一个Localizable.strings用于项目 i18n 的文件,一个库使用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)]

伪代码:</p>

#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

提前致谢!!

4

5 回答 5

6

在本次通话中:

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

如果使用指定键无法在字符串文件中找到字符串,则将使用 value 参数(当前为空字符串)所以......您需要做的就是将您的第二次查找放在 KYLocalizable.strings作为该参数的值。代码看起来与此类似(我实际上并没有运行它,但它应该很接近):

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

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

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

于 2012-09-23T15:38:03.153 回答
4

如果密钥不存在,您将收到的字符串将是密钥本身。因此,只要您假设您永远不会将密钥用作本地化字符串,您就可以测试 NSLocalizableString 是否返回了密钥。

于 2012-09-23T15:06:46.620 回答
0

谢谢@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:将返回@Xval 所说的 NSString 。:)

于 2012-09-23T15:14:46.217 回答
0

我为本地化字符串编写了这个方便的扩展,因此您可以使用该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)
    }

}
于 2017-05-29T07:39:25.903 回答
0

对于斯威夫特:

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

根据Apple的文档,只是为了澄清一些事情:

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

因此,使用这种技术,您可以嵌套调用任意数量的本地化文件。

于 2016-05-30T10:12:57.497 回答