2011-05-22 48 views
6

我正在使用Xcode 4開發自己的框架,並在兩個示例應用程序(控制檯一和Mac OS X Cocoa應用程序)中使用它。Xcode 4:框架本地化不起作用

我試圖添加本地化到框架,所以我創建了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> 

但它並沒有改變什麼......

我缺少什麼?

回答

10

不通過框架選擇一個合適的.strings文件的原因是NSLocalizedString宏:.strings文件的

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

框架的位置不是[NSBundle mainBundle]在微距規定。

從我看到的,你需要使用NSLocalizedStringFromTableInBundle來代替,並指定你的框架的束位置。

1

你稱之爲「技術名稱」實際上是一個關鍵。您的.strings文件將如下所示:

/* no comment */ 「LOC_TEST」=「LOC_TEST」;

在en.lproj/Localizable.strings中,用您的英文字符串替換LOC_TEST(=後面的那個)。用法文文本在fr.lproj中執行相同的操作。

+0

感謝您的幫助,但它似乎是控制檯應用程序不支持本地化的。 我在一年前發佈了這個問題,並且我用普通的可可應用取代了那個控制檯應用。現在一切正常! – Romain 2012-05-18 11:38:19

2

接受的答案是正確的,NSLocalizedString是行不通的,因爲它使用[NSBundle mainBundle],所以我在我的框架使用該宏

#define LOCALIZED_STRING(key) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil] 
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 (下載框架,將節省您的時間