2011-11-18 54 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名称的问题。