iOS--App應用內切換語言

 

核心方法:app

#define NSLocalizedStringFromTableInBundle(key, tbl, bundle, comment) \
        [bundle localizedStringForKey:(key) value:@"" table:(tbl)]

 

原理即在工程內部創建 .String,在內部採用鍵值對方式對所須要切換語言的文字進行賦值spa

1.工程內部建立.String文件,命名爲Language.Stringcode

 

2.右側菜單欄點擊Localize,彈出菜單選擇English,肯定component

 

3.第二步結束後選擇工程,選擇PROJECT,下方Localizations菜單中點擊+號選擇添加中文orm

 

 

4.此時Language.String中會顯示兩個文件,Language.String(Chinese) 和 Language.String(English),這一步像這兩個文件中添加鍵值對blog

 

 

英文文件中:資源

"12hour" = "12-Hour Time";
"24hour" = "24-Hour Time";
"am" = "AM";
"pm" = "PM";

 

中文文件中字符串

"12hour" = "12小時制";
"24hour" = "24小時制";
"am" = "上午";
"pm" = "下午";

 

5.新建一個單例類,ChangeLanguage,.h中添加屬性方法get

#import <Foundation/Foundation.h>

//app應用內切換語言
#define HLLocalizedString(key, tbl) [LocalizationManager getStringForKey:key withTable:tbl]

//#define HLLocalizedString(key, tbl) NSLocalizedString(key, tbl)

@interface LocalizationManager : NSObject

/// 獲取當前資源文件
+ (NSBundle *)bundle;
/// 初始化語言文件
+ (void)initUserLanguage;
/// 獲取應用當前語言
+ (NSString *)userLanguage;
/// 設置當前語言
+ (void)setUserlanguage:(NSString *)language;
/// 經過Key得到對應的string
+ (NSString *)getStringByKey:(NSString *)key;

+ (NSString *)getStringForKey:(NSString *)key withTable:(NSString *)table;
@end

 

6.在.m中實現方法string

#import "LocalizationManager.h"
#import "AppDelegate.h"



@implementation LocalizationManager
static NSString *TableName = @"localization";
static NSBundle *bundle = nil;
static NSString *UserLanguage = @"UserLanguage";

+ (NSBundle *)bundle
{
    if(!bundle)
    {
        [self initUserLanguage];
    }
    return bundle;
}

+ (void)initUserLanguage{
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString *string = [def valueForKey:UserLanguage];
    if(string.length == 0)
    {
        //獲取系統當前語言版本(中文zh-Hans,英文en)
        NSArray *languages = [NSLocale preferredLanguages];
        
        NSString *current = [languages objectAtIndex:0];
        string = [self languageFormat:current];
        [def setValue:current forKey:UserLanguage];
        [def synchronize];//持久化,不加的話不會保存
    }
    
    //獲取文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:string] ofType:@"lproj"];
    
    bundle = [NSBundle bundleWithPath:path];//生成bundle
}

+ (void)setUserlanguage:(NSString *)language{
    
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    
    //1.第一步改變bundle的值
    NSString *path = [[NSBundle mainBundle] pathForResource:[self languageFormat:language] ofType:@"lproj" ];
    
    bundle = [NSBundle bundleWithPath:path];
    
    //2.持久化
    [def setValue:language forKey:UserLanguage];
    
    [def synchronize];
    [self resetRootViewController];
}

+ (NSString *)userLanguage
{
    NSString *userLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:UserLanguage];
    return userLanguage;
}

+ (NSString *)getStringByKey:(NSString *)key
{
    return [[LocalizationManager bundle] localizedStringForKey:key value:nil table:TableName];
}

///語言和語言對應的.lproj的文件夾前綴不一致時在這裏作處理
+ (NSString *)languageFormat:(NSString*)language {
    if([language rangeOfString:@"zh-Hans"].location != NSNotFound)
    {
        return @"zh-Hans";
    }
    else if([language rangeOfString:@"zh-Hant"].location != NSNotFound)
    {
        return @"zh-Hant";
    }
    else
    {
        //字符串查找
        if([language rangeOfString:@"-"].location != NSNotFound) {
            //除了中文之外的其餘語言統一處理@"ru_RU" @"ko_KR"取前面一部分
            NSArray *ary = [language componentsSeparatedByString:@"-"];
            if (ary.count > 1) {
                NSString *str = ary[0];
                return str;
            }
        }
    }
    return language;
}


+ (NSString *)getStringForKey:(NSString *)key withTable:(NSString *)table
{
    if ([LocalizationManager bundle])
    {
        return NSLocalizedStringFromTableInBundle(key, table, [LocalizationManager bundle], @"");
    }

    return NSLocalizedStringFromTable(key, table, @"");
}

//從新設置
+ (void)resetRootViewController
{
    AppDelegate *delegate = [AppDelegate getAPPDelegate];
    [delegate initTabbarCV];

}
@end

 

7:使用

#切換時使用 
if([[LocalizationManager userLanguage] isEqualToString:@"en"])
        {
            [LocalizationManager setUserlanguage:@"zh-Hans"];
            
        }
        else
        {
            [LocalizationManager setUserlanguage:@"en"];
            
        }



#注意,多語言的地方須要使用以下定義纔有效

HLLocalizedString(@"Setlang", nil)
相關文章
相關標籤/搜索