Xcode 4:框架本地化不起作用
我正在使用Xcode 4开发自己的框架,并在两个示例应用程序(一个控制台应用程序和一个Mac OS X Cocoa应用程序)中使用它 我试图将本地化添加到框架中,因此我创建了两个版本的Xcode 4:框架本地化不起作用,xcode,frameworks,localization,xcode4,ios-frameworks,Xcode,Frameworks,Localization,Xcode4,Ios Frameworks,我正在使用Xcode 4开发自己的框架,并在两个示例应用程序(一个控制台应用程序和一个Mac OS X Cocoa应用程序)中使用它 我试图将本地化添加到框架中,因此我创建了两个版本的本地化.strings文件(en和fr版本),但每次我试图打印示例应用程序中的本地化字符串时,我只得到它的技术名称。例如,框架代码中有以下行: NSLog(NSLocalizedString(@"LOC_TEST", nil)); 我只在输出中显示“LOC\u TEST” 但是,本地化可以很好地与Cocoa应用程
本地化.strings
文件(en和fr版本),但每次我试图打印示例应用程序中的本地化字符串时,我只得到它的技术名称。例如,框架代码中有以下行:
NSLog(NSLocalizedString(@"LOC_TEST", nil));
我只在输出中显示“LOC\u TEST”
但是,本地化可以很好地与Cocoa应用程序本身配合使用(这意味着Cocoa应用程序的本地化字符串会被适当地显示)
下面,我尝试在框架的plist文件中添加本地化:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>fr</string>
</array>
CbundleLocalizations
EN
fr
但这并没有改变什么
我遗漏了什么?你所说的“技术名称”实际上是一把钥匙。您的.strings文件将类似于:
/*无可奉告*/
“LOC_测试”=“LOC_测试”
在en.lproj/Localizable.strings中,将第二个LOC_测试(在=)替换为英语字符串。在fr.lproj中对法语文本执行相同操作。未按框架选择正确的.strings文件的原因在于
NSLocalizedString
宏:
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
.strings文件的框架位置不是宏中指定的[NSBundle mainBundle]
据我所知,您需要使用
NSLocalizedStringFromTableInBundle
,并指定框架的捆绑位置。公认的答案是正确的,nsLocalizedStrings将无法在使用[NSBundle mainBundle]
时工作,因此我在框架中使用此宏
#define LOCALIZED_STRING(key) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil]
例如:
将其放在.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;
}
享受√
(下载将节省您时间的框架)谢谢您的帮助,但似乎控制台应用程序根本不支持本地化。一年前我发布了这个问题,从那时起我就用一个普通的Cocoa应用程序替换了那个控制台应用程序。现在一切都好了!