gpt4 book ai didi

xcode - 静态库和国际化

转载 作者:行者123 更新时间:2023-12-01 10:22:01 24 4
gpt4 key购买 nike

我有一个关于静态库的问题。我需要在我的库中本地化一些文本。因此,我创建了一个包,用于放置不同的本地化文件。然后,我创建了一个这样的函数:

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];
}

但是当我使用它时,它总是返回英语本地化字符串(除了我的电话语言是法语)。我不知道为什么。

最佳答案

我在做完全相同的事情时遇到了同样的问题:我有一个静态库和一个包含图像、本地化字符串等的配套捆绑文件。

我发现静态似乎无法找出正确的设备本地化(很抱歉,但我找不到这个问题的原因),我已经通过这样做修复了:

@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 类别,其中包含一个 Class 方法,其行为与 [NSBundle mainBundle] 非常相似,并返回静态库的正确包,以便我可以使用它我想要的任何地方,例如:

#define KKLocalizedString(key) NSLocalizedStringFromTableInBundle(key, @"Localizable", [NSBundle kioskitBundle], @"")

代码非常简单,首先找到静态库包的路径,找到当前设备语言,然后创建一个新的 NSBundle,其路径为 library_path/device_language.lproj。

这种方法的一个缺点是您需要始终本地化所有 Assets ,如果您的 bundle 中有很多图像,这可能会很痛苦(但我认为这不太可能)。

如果您不想采用我的类别方法,您可以像这样更改您的代码:

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];
}

关于xcode - 静态库和国际化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12476840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com