静态库和国际化(Static library and internationalization)

2019-09-22 13:23发布

我有一个关于静态库的问题。 我需要本地化我库内一些文字。 所以,我创建了一个包,我把我的不同的本地化文件。 然后,我创造了这样的功能:

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是法国人)。 我不知道为什么。

Answer 1:

我已经做了完全一样时,得到了同样的问题:我有一个静态库,并用图像的同伴捆绑文件,本地化的字符串,等等。

我已经想通了,这似乎是静态的不能找出正确的设备本地化(我很抱歉,但我没能找到这个问题的原因),我已经做这个固定的:

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


Answer 2:

我不得不修改卢卡的回答得到它的工作我想怎样。 我的问题是非常相似:从消费应用程序中使用我的捆绑本地化字符串没有决心改正[郎咸平] .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如果不出意外是存在的。



文章来源: Static library and internationalization