【问题标题】:iOS Localize app manually then switchiOS 手动本地化应用程序然后切换
【发布时间】:2014-01-08 14:25:04
【问题描述】:

自从我第一次使用本地化以来,我一直面临 iOS 编程问题,

我使用以下信息来了解我使用的是哪种语言:

- (NSString*) getLanguage{

NSArray* languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];

NSString *preferredLang = [languages objectAtIndex:0];

return preferredLang;}

还有一个按钮来改变语言调用函数来改变语言

- (void) setLanguage:(NSString*) l{
[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:l, nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults]synchronize];}

语言切换成功,但是我需要关闭应用重新打开才能看到结果,有没有其他方法可以在切换语言后自动更改本地化?

注意:它也应该通过故事板唤醒。

【问题讨论】:

  • 您需要在应用程序中执行此操作而不是让用户使用 iOS 设置的任何特殊原因?看起来很奇怪
  • 是的,我希望用户为应用程序选择他想要的语言...

标签: ios objective-c localization nslocalizedstring


【解决方案1】:

正如@Tudorizer 在您翻译文件后在this link 中所描述的那样

使用此解决方案:

将此宏放在 Prefix.pch 中:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]

以及任何需要本地化字符串的地方:

NSLocalizedStringFromTableInBundle(@"GalleryTitleKey", nil, currentLanguageBundle, @"");

设置语言使用:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];

多次:

NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"fr"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"it"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));

【讨论】:

  • 这个在 Localizable.strings 上运行良好,但它似乎不适用于情节提要?
  • 嗯..是的..因为你没有提到你试图使用故事板,我不知道..
【解决方案2】:

您可以使用以下类在应用程序中切换语言: (请注意,无论如何您都应该刷新存储在内存中的所有控制器的内容才能完全生效。)

// AMLocalization.h

#define SetAppLanguage(language) [[AMLocalization sharedLocalization] setLanguage:language]
#define GetAppLanguage() [[AMLocalization sharedLocalization] language]
#define LSC(key, comment) [[AMLocalization sharedLocalization] localizedStringForKey:(key) value:(comment)]
#define UDKeyAppLanguage @"UDKeyAppLanguage"

typedef enum {
    UILanguageUnknown,
    UILanguageEnglish,
    UILanguageFrench,
    ..................
} UILanguage;

@interface AMLocalization : NSObject
+ (AMLocalization *)sharedLocalization;
- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment;
- (BOOL) setLanguage:(UILanguage) lang;
- (UILanguage) language;
@end

// AMLocalization.m

#import "AMLocalization.h"

static AMLocalization *_s_sharedLocalization = nil;

@implementation AMLocalization {

    NSBundle *_bundle;
    NSDictionary *_languageSet;
}

+ (AMLocalization *)sharedLocalization
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _s_sharedLocalization = [AMLocalization new];
    });
    return _s_sharedLocalization;
}

- (id) init
{
    if (self = [super init]) {
        _bundle = [NSBundle mainBundle];
        _languageSet = @{
                     @(UILanguageEnglish) : @"en",
                     @(UILanguageFrench) : @"fr"
                    };
    }
    return self;
}

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)comment
{
return [_bundle localizedStringForKey:key value:comment table:nil];
}

- (BOOL) setLanguage:(UILanguage) lang
{
    UILanguage activeLang = [self language];
    if (lang == UILanguageUnknown) {
        _bundle = [NSBundle mainBundle];
        [[NSUserDefaults standardUserDefaults] removeObjectForKey:UDKeyAppLanguage];
    }
    else {
        NSString *path = [[NSBundle mainBundle] pathForResource:_languageSet[@(lang)] ofType:@"lproj"];

        _bundle = [NSBundle bundleWithPath:path];
        [[NSUserDefaults standardUserDefaults] setInteger:lang forKey:UDKeyAppLanguage];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];

    return activeLang != lang;
}

- (UILanguage) language
{
    UILanguage lang = [[NSUserDefaults standardUserDefaults] integerForKey:UDKeyAppLanguage];
    if (lang == UILanguageUnknown) {
        NSString* preferredLang = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0];
        for (NSNumber *key in _languageSet) {
            if ([_languageSet[key] isEqualToString:preferredLang]) {
                lang = [key integerValue];
                break;
            }
        }
    }
    return lang;
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多