Skip to content

Instantly share code, notes, and snippets.

@i0532386223
Created July 11, 2016 22:43
Show Gist options
  • Select an option

  • Save i0532386223/1a965d2bdc53e619daec48479046cdbc to your computer and use it in GitHub Desktop.

Select an option

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)
#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
#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
#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]));
}
}
#import <Foundation/Foundation.h>
@interface NSBundle (Language)
+ (void)setLanguage:(NSString *)language;
@end
#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