我有做的完全一樣的,當同樣的問題:我有一個靜態庫,並用圖像的同伴捆綁文件,本地化的字符串,等等。
我已經想通了,看來,靜態想不通正確的設備本地化(我很抱歉,但我沒能找到這個問題的原因),我已經做這個固定的:
@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]
非常相似,並且返回了靜態庫的正確包,因此我可以使用它ywhere我想要的,例如:
#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];
}
感謝盧卡,它現在完美:) – Niko
不客氣,請讓我知道,如果你能找到是什麼原因造成的問題。 –
的確,但沒有問題,我只有很少的圖像。 – Niko