2011-11-18 37 views
1

如何在我的應用程序中執行I18N離開設備的語言設置?iOS:如何做I18N /本地化的應用程序?

我想在啓動屏幕後詢問用戶想要使用應用程序的語言,這應該與系統語言無關。

有沒有簡單的方法來設置應用程序上下文中的語言設置?例如:

[[UIApplication sharedApplication] setLocale/setBundle/setLanguage] 

感謝您的任何建議。

編輯

好吧,我取得了一些進展。有沒有辦法來覆蓋NSLocalizedString()?問題是將NSUserDefaults設置爲其他語言代碼只有在重新啓動應用程序後才能識別。這對我來說當然是沒有選擇的。

回答

3

我結束了這個解決方案。現在在你的整個項目

[I18NUtil localizedString:@"myLocalizedString"] 

:我先定義一個靜態類設置我的應用程式語言上:

@implementation I18NUtil 

static NSBundle *_bundle; 
static NSString *_language; 

+ (id)alloc 
{ 
    [NSException raise:@"Cannot be instantiated!" format:@"Static class 'ClassName' cannot be instantiated!"]; 
    return nil; 
} 

+ (void)setLanguage:(NSString *)languageCode 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:languageCode, nil] forKey:@"AppleLanguages"]; 

    NSString *path = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"]; 
    _bundle = [NSBundle bundleWithPath:path]; 
    _language = languageCode; 
} 

+ (NSString *)localizedString:(NSString *)key 
{ 
    return [_bundle localizedStringForKey:key value:@"" table:nil]; 
} 

@end 

你可以很容易地使用。

但我發現重寫NSLocalizedString宏並使用像我習慣的i18n更容易。您必須將其包含到您的AppName-Prefix.pch中:

#ifdef __OBJC__ 
    ... 

    // Override native NSLocalizedString(key,message) to achieve in-app and on-the-fly i18n 
    // Needs to be defined AFTER importing Foundation.h 
    #import "I18NUtil.h" 

    #ifdef NSLocalizedString 
     #undef NSLocalizedString 
    #endif 

    #define NSLocalizedString(key, message) \ 
     [I18NUtil localizedString:(key)] 
#endif 

玩得開心!

1

您可以使用NSLocalizedStringFromTable的任意字符串文件。

舉例來說,你可以把所有的字符串文件這樣的組織:

localizable_buttons_english.strings 
localizable_buttons_spanish.strings 
... 
localizable_errors_english.strings 
localizable_errors_spanish.strings 
... 

然後,使用用戶選擇的語言在你的應用程序的喜好來獲取任何語言翻譯:

NSString *lang = <# read user prefs #> // Example: spanish 
NSString *table = [NSString stringWithFormat:@"localizable_buttons_%@", lang]; 
NSString *text = NSLocalizedStringFromTable(@"SendButtonLabel", table, nil); 
sendButton.titleLabel.text = text; 

// localizable_buttons_english.strings 
"SendButtonLabel" = "Send"; 

// localizable_buttons_spanish.strings 
"SendButtonLabel" = "Enviar"; 

本地化NIB文件只是使用用戶選擇的語言以編程方式加載NIB來構建NIB名稱的問題。