我正在使用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>
但它没有改变任何东西......
我错过了什么?
答案 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 (下载将节省您的时间的框架)