zoukankan      html  css  js  c++  java
  • iOS--App应用内切换语言

    核心方法:

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

    原理即在工程内部建立 .String,在内部采用键值对方式对所需要切换语言的文字进行赋值

    1.工程内部创建.String文件,命名为Language.String

    2.右侧菜单栏点击Localize,弹出菜单选择English,确定

    3.第二步结束后选择工程,选择PROJECT,下方Localizations菜单中点击+号选择添加中文

     

    4.此时Language.String中会显示两个文件,Language.String(Chinese) 和 Language.String(English),这一步像这两个文件中添加键值对

     

    英文文件中:

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

    中文文件中

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

    5.新建一个单例类,ChangeLanguage,.h中添加属性方法

    #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中实现方法

    #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)
  • 相关阅读:
    phpMyAdmin出现错误 Access denied for user 'root'@'localhost' (using password: NO)
    Android使用butterknife注解出现nullPointerException解决
    Fragment Touch事件泄露
    清空Fragment回退栈中某个Fragment之上的所有Fragment
    Fragment保持状态切换
    点击EditText可编辑,点击其他地方不可编辑
    android ActionBar 去掉menu分隔线
    jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
    php 闭包函数
    phpstorm快捷按键
  • 原文地址:https://www.cnblogs.com/nelsen-chen/p/9640406.html
Copyright © 2011-2022 走看看