2014-01-08 2 views
2

я столкнулся с проблемой с прошивкой программирования, так как его первый раз я использую Локализация ,,IOS Localize приложение вручную, то переключатель

Я использовал следующие знать, какие языки у меня:

- (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];} 

изменения языка успешно, но мне нужно, чтобы закрыть и снова открыть приложение, чтобы увидеть результат, есть ли другой способ автоматически изменить локализацию после переключения lang?

ПРИМЕЧАНИЕ: он должен проснуться и с помощью раскадровки.

+0

Любая конкретная причина, по которой вам нужно сделать это в приложении, вместо того чтобы позволить пользователю использовать настройки iOS? кажется довольно нечетным –

+1

да Я хочу, чтобы пользователь выбирал язык, который он хочет для приложения ... – iJazJaz

ответ

0

Как @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, @"")); 
+0

Это хорошо работает с Localizable.strings, но похоже, что он не работает с раскадрой? – iJazJaz

+0

Humm .. Да .. как вы не упомянули, что пытались использовать с раскадрой, я не знал .. –

0

Вы можете переключаться между языками в вашем приложении, используя следующий класс: (Обратите внимание, что в любом случае вы должны обновить содержимое всех контроллеров, хранящихся в памяти, чтобы получить полный эффект.)

// 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 
Смежные вопросы