我有一个关于静态库的问题。 我需要本地化我库内一些文字。 所以,我创建了一个包,我把我的不同的本地化文件。 然后,我创造了这样的功能:
NSString *MyLocalizedString(NSString* key, NSString* comment)
{
static NSBundle* bundle = nil;
if (!bundle)
{
NSString* path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MyStaticLib.bundle"];
bundle = [[NSBundle bundleWithPath:path] retain];
}
return [bundle localizedStringForKey:key value:@"" table:nil];
}
但是,当我使用它,它总是返回英文本地化的字符串(除了我的手机langage是法国人)。 我不知道为什么。
我已经做了完全一样时,得到了同样的问题:我有一个静态库,并用图像的同伴捆绑文件,本地化的字符串,等等。
我已经想通了,这似乎是静态的不能找出正确的设备本地化(我很抱歉,但我没能找到这个问题的原因),我已经做这个固定的:
@implementation NSBundle (KiosKitAdditions)
+ (NSBundle *)kioskitBundle
{
static NSBundle* kioskitBundle = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
NSString *libraryBundlePath = [[NSBundle mainBundle] pathForResource:KKBundleName
ofType:@"bundle"];
NSBundle *libraryBundle = [[NSBundle bundleWithPath:libraryBundlePath] retain];
NSString *langID = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *path = [libraryBundle pathForResource:langID ofType:@"lproj"];
kioskitBundle = [[NSBundle bundleWithPath:path] retain];
});
return kioskitBundle;
}
@end
正如你可以看到我已经创建了一个NSBundle用类方法的范畴,其作用非常相似[NSBundle mainBundle]
和返回我正确的束为静态libray所以我随处我想使用它,例如:
#define KKLocalizedString(key) NSLocalizedStringFromTableInBundle(key, @"Localizable", [NSBundle kioskitBundle], @"")
该代码是很简单首先,我找到静态库包的路径,找到当前设备的语言,然后我创建一个新的一个NSBundle的路径是LIBRARY_PATH / device_language.lproj。
这种方法的缺点是,你需要送花儿给人本地化所有的资产,这可以是一个痛苦,如果你在你的包有很多图像(但我认为这是不可能的)。
如果你不希望采纳我的类中的方法,你可以改变你这样的代码:
NSString *MyLocalizedString(NSString* key, NSString* comment)
{
static NSBundle* bundle = nil;
if (!bundle)
{
NSString *libraryBundlePath = [[NSBundle mainBundle] pathForResource:@"MyStaticLib"
ofType:@"bundle"];
NSBundle *libraryBundle = [NSBundle bundleWithPath:libraryBundlePath];
NSString *langID = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *path = [libraryBundle pathForResource:langID ofType:@"lproj"];
bundle = [[NSBundle bundleWithPath:path] retain];
}
return [bundle localizedStringForKey:key value:@"" table:nil];
}
我不得不修改卢卡的回答得到它的工作我想怎样。 我的问题是非常相似:从消费应用程序中使用我的捆绑本地化字符串没有决心改正[郎咸平] .LPROJ文件夹。 就我而言,我有我想从查找的es.lproj文件夹。 但是,如果用户设置自己喜欢的langauge到ES-MX,使用[NSLocale preferredLanguages] objectAtIndex:0]会试图找到ES-MS.lproj文件夹,它不存在。
@implementation NSBundle (CCPAdditions)
+ (NSBundle *)CCPBundle
{
static NSBundle* corePaymentBundle = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
NSString *libraryBundlePath = [[NSBundle mainBundle] pathForResource:@"ClipCorePayments"
ofType:@"bundle"];
NSBundle *libraryBundle = [NSBundle bundleWithPath:libraryBundlePath];
for (NSString *langID in [NSLocale preferredLanguages])
{
NSString *path = [libraryBundle pathForResource:langID ofType:@"lproj"];
if (path)
{
corePaymentBundle = [NSBundle bundleWithPath:path];
break;
}
}
});
return corePaymentBundle;
}
@end
这遍历的首选语言列表,并检查,看看是否存在路径。 如果ES-MX.lproj丢失,它将会检查es.lproj等,并最终找到en.lproj如果不出意外是存在的。