1. 程式人生 > >unity 多語言支援方案

unity 多語言支援方案

Ø 什麼是多語言支援

應用可以根據使用的環境,配置相應的語言文字。

應用的語言具有可配置性,且可以快速更換系統顯示文字。

Ø 多語言技術的一般實現原理

總體實現思路是將專案中需要顯示的字串作為資源存放在一個配置檔案中,配置檔案使用UTF8編碼。當需要將某個字串顯示在專案中時,通過字串資源Key查詢的方式獲取當前語言環境下的實際內容。

1. 配置檔案

1.1. 配置檔案目錄

StreamingAssets資料夾下建立1個Language資料夾,用於存放多語言包的配置檔案

->StreamingAssets

-->Language

       --->Config.ini

       --->

SimplifiedChinese.ini

1.2. 配置說明

Config.ini(配置語言包路徑)

其中 Config.ini 記錄的各語言環境對應的配置檔名,如下所示:

簡體中文=SimplifiedChinese.ini

繁體中文=SimplifiedChinese.ini

English=SimplifiedChinese.ini

語言環境(Key) = 配置檔名字(value)

*注:這裡臨時寫成了3種語言環境都是指定的通一個配置檔案,實際環節各種語言環境都對應自己相應的配置檔案

語言包配置舉例 SimplifiedChinese.ini,顯示如下

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=啟動解析器失敗

通過呼叫 COMMONSTARTPPTEXPORTOR_FAIL這個靜態變數,返回 字串:“啟動解析器失敗”

QQ交流群:162136059