我有一个使用CocoaPods的项目。因此,我有一个包含两个项目的工作区: As和Pods。
Pod包含我想要本地化的代码,并且我已经在Pod中创建了.strings
文件。但是,NSLocalizedString
无法加载这些字符串。我怀疑这是因为.strings
文件不在主包中,而没有Pod包,因为它被编译到一个静态库中。
有没有比我的主项目更好的在CocoaPods项目中本地化代码的方法?
发布于 2013-04-25 16:34:55
NSLocalizedString
只是调用了NSBundle的localizedStringForKey:value:table:
,所以我写了一个NSBundle类别,以便能够查看几个包(在iOS中,这些包只是文件夹):
NSString * const kLocalizedStringNotFound = @"kLocalizedStringNotFound";
+ (NSString *)localizedStringForKey:(NSString *)key
value:(NSString *)value
table:(NSString *)tableName
backupBundle:(NSBundle *)bundle
{
// First try main bundle
NSString * string = [[NSBundle mainBundle] localizedStringForKey:key
value:kLocalizedStringNotFound
table:tableName];
// Then try the backup bundle
if ([string isEqualToString:kLocalizedStringNotFound])
{
string = [bundle localizedStringForKey:key
value:kLocalizedStringNotFound
table:tableName];
}
// Still not found?
if ([string isEqualToString:kLocalizedStringNotFound])
{
NSLog(@"No localized string for '%@' in '%@'", key, tableName);
string = value.length > 0 ? value : key;
}
return string;
}
然后在我的前缀文件中重新定义NSLocalizedString
宏:
#undef NSLocalizedString
#define NSLocalizedString(key, comment) \
[NSBundle localizedStringForKey:key value:nil table:@"MyStringsFile" backupBundle:AlternativeBundleInsideMain]
如果需要,对其他宏也是如此(即NSLocalizedStringWithDefaultValue
)
发布于 2020-09-09 21:14:38
对于swift,您可以使用Loc枚举:
enum Loc : String{
case ok = "OK"
case cancel = "Cancel"
var localized: String {
let s = self.rawValue
let bundle = Bundle(for: <classname inside the bundle>.self)
let result = NSLocalizedString(s, tableName: nil, bundle: bundle, value: "", comment: "")
return result;
}
}
并这样使用它:
let s = Loc.ok.localized
print(s)
https://stackoverflow.com/questions/12874678
复制相似问题