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

标签 iphone ios localization internationalization ios5

如何在我的应用程序中执行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

玩得开心!

关于iphone - iOS:如何在应用程序中进行I18N/本地化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185416/

相关文章:

ios - 访问 cellforrow 之外的 tableview 内容

c# - 键盘按键本地化

jquery - 如何更改 jQuery Selectize 插件上的 "Add"字?

ios - 为什么我的 UILabel 在其他所有内容之后延迟显示大约 10 秒?

ios - 钥匙串(keychain)上的分发证书中缺少私钥

ios - 使用 Firebase 快速接收数据

ruby-on-rails - 避免本地化文件重复

iphone - 如何将 KVO 添加到 MPMoviePlayer currentPlaybackTime?

iphone - 在 iPhone 上绘制几条直线和圆圈时 CGContextStrokePath 的性能不佳

ios - 记住 Swift 中应用内购买的数据