Ø 什么是多语言支持

    应用可以根据使用的环境,配置相应的语言文字。

    应用的语言具有可配置性,且可以快速更换系统显示文字。

 

Ø 多语言技术的一般实现原理

总体实现思路是将项目中需要显示的字符串作为资源存放在一个配置文件中,配置文件使用UTF8编码。当需要将某个字符串显示在项目中时,通过字符串资源Key查找的方式获取当前语言环境下的实际内容。

1. 配置文件

1.1. 配置文件目录

在StreamingAssets文件夹下建立1个Language文件夹,用于存放多语言包的配置文件

      ->StreamingAssets

      -->Language

       --->Config.ini

       --->SimplifiedChinese.ini

1.2. 配置说明

l Config.ini(配置语言包路径)

其中

简体中文=SimplifiedChinese.ini

繁體中文=SimplifiedChinese.ini

English=SimplifiedChinese.ini

语言环境(Key) = 配置文件名字(value)

*注:这里临时写成了3种语言环境都是指定的通一个配置文件,实际环节各种语言环境都对应自己相应的配置文件

l 语言包配置举例
STR_QUIT_PLAYING=确认退出放映?
#格式说明:简体中文=目标语言
#请注意书写规范,前缀请表示改文字的用途:前缀_说明
#通用
COMMON_START_PPTEXPORTOR_FAIL=启动解析器失败
COMMON_OPEN_FILE_FAIL=文件打开失败
COMMON_PARSE_FILE_FAIL=文件解析失败

编写规则:key(在代码中运用的变量)=目标语言(最终在界面呈现的) 其中#表示注释语句

2. 代码结构

Ø -该功能由单例类MulitLanguageManager控制内容替换。

public static MulitLanguageManager Instance
    {
        get
        {
            if (instance == null)
            {
                lock (locker)
                {
                    if (instance == null)
                    {
                        instance = new MulitLanguageManager();
                    }
                }
            }
            return instance;
        }
    }

Ø 语言配置加载,通过该代码获取所有语言环境对应的配置文件名

private void LoadLanguageConfig()
    {
        dicConfig.Clear();
        string configPath = string.Format("{0}/Language/Config.ini", Application.streamingAssetsPath);
        if (!string.IsNullOrEmpty(configPath) && File.Exists(configPath))
        {
            string[] strLines = File.ReadAllLines(configPath, Encoding.UTF8);
            for (int i = 0; i < strLines.Length; i++)
            {
                string strLine = strLines[i];
                if (!string.IsNullOrEmpty(strLine))
                {
                    string[] strSplit = strLine.Split(new string[] { "=" }, System.StringSplitOptions.None);
                    if (strSplit.Length == 2)
                    {
                        dicConfig.Add(strSplit[0], strSplit[1]);
                    }
                }
            }
        }
    }

Ø 根据语言环境加载对应语言包

注:strLanguage 是传入的语言环境,如对应Config.ini的 简体中文

private string GetLanguageResPath(string strLanguage)
{
    string path = string.Empty;
    if(!string.IsNullOrEmpty(strLanguage)&&dicConfig.ContainsKey(strLanguage))
    {
        path = string.Format("{0}/Language/{1}", Application.streamingAssetsPath, dicConfig[strLanguage]);
    }
    return path;
}
注:调用该方法会将对应的语言包加载入dicStrDef 这个Dictionary中
   private void LoadLanguageRes()
    {
        try
        {
            dicStrDef.Clear();
            if(dicConfig.ContainsKey(currentLanguageType))
            {
                string languageResPath = GetLanguageResPath(currentLanguageType);
                if(!string.IsNullOrEmpty(languageResPath)&& File.Exists(languageResPath))
                {
                    string[] strLines = File.ReadAllLines(languageResPath, Encoding.UTF8);
                    for (int i = 0; i < strLines.Length; i++)
                    {
                        string strLine = strLines[i];
                        if (!string.IsNullOrEmpty(strLine))
                        {
                            int iPos = strLine.IndexOf('=');
                            if ((strLine[0] != '#') && iPos >= 0)
                            {
                                dicStrDef[strLine.Substring(0, iPos)] = strLine.Substring(iPos + 1);
                            }
                        }
                    }
                }
            }
        }
        catch (System.Exception ex)
        {
            _Log.Error(null, ex.StackTrace);
        }
    }

3. 数据运用

按2的步骤已经将设置的语言环境对应的语言包加载入dicStrDef 这个Dictionary中,要运用时,只需按key查找。

public string GetStringByID(string key)
{
    if (string.IsNullOrEmpty(key))
    {
        return key;
    }
    if (dicStrDef.ContainsKey(key))
    {
        return dicStrDef[key];
    }
    _Log.Warning(null, string.Format("No multi language data. Target Language: {0}, Word: {1}", currentLanguageType, key));
    return key;
}
public static string COMMON_START_PPTEXPORTOR_FAIL {
    get { return MulitLanguageManager.Instance.GetStringByID("COMMON_START_PPTEXPORTOR_FAIL"); } }

如语言包中配置

COMMON_START_PPTEXPORTOR_FAIL=启动解析器失败

通过调用STARTPPTEXPORTOR_FAIL这个静态变量,返回 字符串:“启动解析器失败”