8

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

我正在尝试将本地化添加到框架中,因此我创建了一个Localizable.strings文件的两个版本(en 和 fr 版本),但是每次我尝试从示例应用程序中打印本地化字符串时,我只得到它的技术姓名。例如,在框架代码中使用以下行:

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

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

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

这篇文章之后,我尝试在框架的 plist 文件中添加本地化:

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

但这并没有改变什么...

我错过了什么?

4

4 回答 4

12

框架没有选择正确的 .strings 文件的原因在于NSLocalizedString宏:

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

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

据我所知,您需要NSLocalizedStringFromTableInBundle改用并指定框架的捆绑位置。

于 2012-10-31T09:51:34.777 回答
5

接受的答案是正确的,NSLocalizedString 将无法正常工作,[NSBundle mainBundle]所以我在我的框架中使用这个宏

#define LOCALIZED_STRING(key) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil]
于 2016-04-25T02:35:03.273 回答
1

您所说的“技术名称”实际上是Key。您的 .strings 文件将类似于:

/* 无注释 */ "LOC_TEST" = "LOC_TEST";

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

于 2012-05-17T11:05:33.563 回答
0

例子:

把它放在你的 .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 (下载框架,将节省您的时间

于 2017-02-08T13:15:40.237 回答