Created
July 11, 2016 22:43
-
-
Save i0532386223/1a965d2bdc53e619daec48479046cdbc to your computer and use it in GitHub Desktop.
Change Language application with English language by default, if you select an unsupported language (without restart application)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #import <Foundation/Foundation.h> | |
| typedef NS_ENUM(NSInteger, ELanguage) | |
| { | |
| ELanguageEnglish, | |
| ELanguageGerman, | |
| ELanguageFrench, | |
| ELanguageRussian, | |
| ELanguageHebrew, | |
| ELanguageCount | |
| }; | |
| @interface LanguageManager : NSObject | |
| extern NSString *const LanguageCodes[]; | |
| extern NSString *const LanguageStrings[]; | |
| extern NSString *const LanguageSaveKey; | |
| + (void)setupCurrentLanguage; | |
| + (NSArray *)getLanguages; | |
| + (NSArray *)languageStrings; | |
| + (NSString *)currentLanguageString; | |
| + (NSString *)currentLanguageCode; | |
| + (NSInteger)currentLanguageIndex; | |
| + (void)saveLanguageByIndex:(NSInteger)index; | |
| + (BOOL)isCurrentLanguageRTL; | |
| @end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #import "LanguageManager.h" | |
| #import "NSBundle+Language.h" | |
| @implementation LanguageManager | |
| NSString * const LanguageCodes[] = { @"en", @"de", @"fr", @"ru", @"he" }; | |
| NSString * const LanguageStrings[] = { @"English", @"German", @"French", @"Russian", @"Hebrew" }; | |
| NSString * const LanguageSaveKey = @"currentLanguageKey"; | |
| + (void)setupCurrentLanguage | |
| { | |
| NSString *currentLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey]; | |
| if (!currentLanguage) { | |
| NSArray *languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]; | |
| if (languages.count > 0) { | |
| currentLanguage = languages[0]; | |
| [[NSUserDefaults standardUserDefaults] setObject:currentLanguage forKey:LanguageSaveKey]; | |
| [[NSUserDefaults standardUserDefaults] synchronize]; | |
| } | |
| } | |
| [[NSUserDefaults standardUserDefaults] setObject:@[currentLanguage] forKey:@"AppleLanguages"]; | |
| [[NSUserDefaults standardUserDefaults] synchronize]; | |
| } | |
| + (NSArray *)getLanguages | |
| { | |
| NSMutableArray *array = [NSMutableArray array]; | |
| for (NSInteger i = 0; i < ELanguageCount; ++i) { | |
| [array addObject:LanguageCodes[i]]; | |
| } | |
| return [array copy]; | |
| } | |
| + (NSArray *)languageStrings | |
| { | |
| NSMutableArray *array = [NSMutableArray array]; | |
| for (NSInteger i = 0; i < ELanguageCount; ++i) { | |
| [array addObject:NSLocalizedString(LanguageStrings[i], @"")]; | |
| } | |
| return [array copy]; | |
| } | |
| + (NSString *)currentLanguageString | |
| { | |
| NSString *string = @""; | |
| NSString *currentCode = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey]; | |
| for (NSInteger i = 0; i < ELanguageCount; ++i) { | |
| if ([currentCode isEqualToString:LanguageCodes[i]]) { | |
| string = NSLocalizedString(LanguageStrings[i], @""); | |
| break; | |
| } | |
| } | |
| return string; | |
| } | |
| + (NSString *)currentLanguageCode | |
| { | |
| return [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey]; | |
| } | |
| + (NSInteger)currentLanguageIndex | |
| { | |
| NSInteger index = 0; | |
| NSString *currentCode = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey]; | |
| for (NSInteger i = 0; i < ELanguageCount; ++i) { | |
| if ([currentCode isEqualToString:LanguageCodes[i]]) { | |
| index = i; | |
| break; | |
| } | |
| } | |
| return index; | |
| } | |
| + (void)saveLanguageByIndex:(NSInteger)index | |
| { | |
| if (index >= 0 && index < ELanguageCount) { | |
| NSString *code = LanguageCodes[index]; | |
| [[NSUserDefaults standardUserDefaults] setObject:code forKey:LanguageSaveKey]; | |
| [[NSUserDefaults standardUserDefaults] synchronize]; | |
| [NSBundle setLanguage:code]; | |
| } | |
| } | |
| + (BOOL)isCurrentLanguageRTL | |
| { | |
| NSInteger currentLanguageIndex = [self currentLanguageIndex]; | |
| return ([NSLocale characterDirectionForLanguage:LanguageCodes[currentLanguageIndex]] == NSLocaleLanguageDirectionRightToLeft); | |
| } | |
| @end | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #import <UIKit/UIKit.h> | |
| #import "NSBundle+Language.h" | |
| #import "LanguageManager.h" | |
| int main(int argc, char * argv[]) | |
| { | |
| @autoreleasepool | |
| { | |
| NSString *currentLanguage = NSLocalizedString(@"currentLocale", @""); | |
| NSLog(@"currentLocale: %@",currentLanguage); | |
| NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; | |
| NSLog(@"Language: %@", language); | |
| NSArray *loc = [language componentsSeparatedByString:@"-"]; | |
| if ([loc count]>0) | |
| { | |
| NSString *currentLang=@""; | |
| BOOL isLang = [[LanguageManager getLanguages] containsObject: loc[0]]; | |
| if (isLang == YES) | |
| { | |
| currentLang=loc[0]; | |
| } | |
| else | |
| { | |
| currentLang=@"en"; | |
| } | |
| [[NSUserDefaults standardUserDefaults] setObject:currentLang forKey:LanguageSaveKey]; | |
| [[NSUserDefaults standardUserDefaults] synchronize]; | |
| [NSBundle setLanguage:currentLang]; | |
| NSLog(@"currentLang: %@",currentLang); | |
| } | |
| return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #import <Foundation/Foundation.h> | |
| @interface NSBundle (Language) | |
| + (void)setLanguage:(NSString *)language; | |
| @end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #import "NSBundle+Language.h" | |
| #import "LanguageManager.h" | |
| #import <UIKit/UIKit.h> | |
| #import <objc/runtime.h> | |
| static const char kBundleKey = 0; | |
| @interface BundleEx : NSBundle | |
| @end | |
| @implementation BundleEx | |
| - (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName | |
| { | |
| NSBundle *bundle = objc_getAssociatedObject(self, &kBundleKey); | |
| if (bundle) { | |
| return [bundle localizedStringForKey:key value:value table:tableName]; | |
| } | |
| else { | |
| return [super localizedStringForKey:key value:value table:tableName]; | |
| } | |
| } | |
| @end | |
| @implementation NSBundle (Language) | |
| + (void)setLanguage:(NSString *)language | |
| { | |
| static dispatch_once_t onceToken; | |
| dispatch_once(&onceToken, ^{ | |
| object_setClass([NSBundle mainBundle], [BundleEx class]); | |
| }); | |
| if ([LanguageManager isCurrentLanguageRTL]) { | |
| if ([[[UIView alloc] init] respondsToSelector:@selector(setSemanticContentAttribute:)]) { | |
| [[UIView appearance] setSemanticContentAttribute: | |
| UISemanticContentAttributeForceRightToLeft]; | |
| } | |
| }else { | |
| if ([[[UIView alloc] init] respondsToSelector:@selector(setSemanticContentAttribute:)]) { | |
| [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; | |
| } | |
| } | |
| [[NSUserDefaults standardUserDefaults] setBool:[LanguageManager isCurrentLanguageRTL] forKey:@"AppleTextDirection"]; | |
| [[NSUserDefaults standardUserDefaults] setBool:[LanguageManager isCurrentLanguageRTL] forKey:@"NSForceRightToLeftWritingDirection"]; | |
| [[NSUserDefaults standardUserDefaults] synchronize]; | |
| id value = language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil; | |
| objc_setAssociatedObject([NSBundle mainBundle], &kBundleKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); | |
| } | |
| @end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment