繁体   English   中英

iOS:如何在应用程序中进行I18N /本地化?

[英]iOS: How to do I18N/Localization in-app?

如何在我的应用程序中执行I18N,并将设备的语言设置退出?

我希望在启动画面后面有一个屏幕,询问用户他想要使用该应用程序的语言。这应该独立于系统语言。

是否有一种简单的方法可以在应用程序上下文中设置语言设置? 就像是:

[[UIApplication sharedApplication] setLocale/setBundle/setLanguage]

谢谢你的建议。

编辑

好的,我取得了一些进展。 有没有办法覆盖NSLocalizedString()? 问题是只有在重新启动应用程序后才能识别将NSUserDefaults设置为另一种语言代码。 那对我来说当然没有选择。

我最终得到了这个解决方案。 我首先定义一个静态类来设置我的应用程序语言:

@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

你可以轻松使用:

[I18NUtil localizedString:@"myLocalizedString"]

在你的整个项目中。

但我发现覆盖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

玩得开心!

您可以使用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名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM