【问题标题】:iOS: How to do I18N/Localization in-app?iOS:如何在应用内进行 I18N/本地化?
【发布时间】:2011-11-18 16:14:03
【问题描述】:

我如何在我的应用程序中执行 I18N,而将设备的语言设置排除在外?

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

有没有一种简单的方法可以在应用程序上下文中设置语言设置?比如:

[[UIApplication sharedApplication] setLocale/setBundle/setLanguage]

感谢您的建议。

编辑

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

【问题讨论】:

    标签: iphone ios localization internationalization ios5


    【解决方案1】:

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

    @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
    

    玩得开心!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-10-05
        • 1970-01-01
        • 2014-06-14
        • 2021-11-20
        • 2014-01-01
        • 2017-11-22
        • 2014-08-18
        • 1970-01-01
        • 2020-05-05
        相关资源
        最近更新 更多