Xcode 4:框架本地化不起作用

时间:2011-05-22 08:07:09

标签: xcode frameworks localization xcode4 ios-frameworks

我正在使用Xcode 4开发自己的框架,我在两个示例应用程序(控制台和Mac OS X Cocoa应用程序)中使用它。

我正在尝试向框架添加本地化,​​所以我创建了两个版本的Localizable.strings文件(en和fr版本),但每次我都尝试从中打印本地化字符串示例应用程序,我只获得其技术名称。例如,在框架代码中包含以下行:

NSLog(NSLocalizedString(@"LOC_TEST", nil));

我只在输出中显示"LOC_TEST" ...

本地化可以与Cocoa应用程序本身一起工作(但这意味着Cocoa应用程序的本地化字符串会正确显示)。

关注this article,我尝试在框架的plist文件中添加本地化:

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>fr</string>
</array>

但它没有改变任何东西......

我错过了什么?

4 个答案:

答案 0 :(得分:11)

框架未选择正确的.strings文件的原因是NSLocalizedString宏:

#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

.strings文件的框架位置不是宏中指定的[NSBundle mainBundle]

从我看到的情况来看,您需要使用NSLocalizedStringFromTableInBundle来指定框架的捆绑位置。

答案 1 :(得分:4)

接受的答案是正确的,NSLocalizedString将无法使用[NSBundle mainBundle],因此我在我的框架中使用此宏

#define LOCALIZED_STRING(key) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil]

答案 2 :(得分:1)

您称之为“技术名称”实际上是一个密钥。您的.strings文件类似于:

/ *没有评论* / “LOC_TEST”=“LOC_TEST”;

在en.lproj / Localizable.strings中,将 second LOC_TEST(=后面的那个)替换为您的英文字符串。使用法语文本在fr.lproj中执行相同的操作。

答案 3 :(得分:1)

示例:

将它放在你的.m文件中:

#ifndef NSFrameworkLocalizedStrings
#define NSFrameworkLocalizedStrings(key) \
NSLocalizedStringFromTableInBundle(key, @"YOUR_BUNDLE_NAME", [NSBundle bundleWithPath:[[[NSBundle frameworkBundle] resourcePath] stringByAppendingPathComponent:@"YOUR_BUNDLE_NAME.bundle"]], nil)
#endif

并使用此方法:

+ (NSBundle *)frameworkBundle   {
    static NSBundle* frameworkBundle = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        frameworkBundle = [NSBundle bundleForClass:[self class]];
    });

    //NSLog(@"frameworkBundle %@",frameworkBundle);
    return frameworkBundle;
}

享受√http://www.LegoTechApps.com (下载将节省您的时间的框架)