using System.Collections; using System.Collections.Generic; using System; using UnityEngine; using LitJson; public static class Language { public static int languageNumber { get; set; } public static event Action languageChangeEvent; public static void ChangeLanguage(int _number) { if (languageChangeEvent != null) { languageChangeEvent(); } } public static Dictionary languageShowDict = new Dictionary();//界面显示的多语言版本 //启动多语言的渠道,如{appid:[默认语言标识,是否首次安装强制指定语言,只包含哪些语言版本]} // 如{"sghy":["en","0","en,zh,ft"]},字符0代表随系统选择如果找不到则用默认,配1则不检查系统直接用默认 //为了同代码版本同表维护,保持配置一致按appid区分,只做翻译处理 public static Dictionary languageStartDict = new Dictionary();//启动多语言的渠道 static Dictionary languageDict = new Dictionary();// unity语言配置对应的约定字符 找不到用默认 /// /// 未强制语言的 根据系统语言自动设置默认语言 等情况 /// public static void InitDefaultLanguage() { //初始化, 该表是随包安装的如果热更需要二次才生效 var config = InitialFunctionConfig.Get("LanguageEx"); languageShowDict = JsonMapper.ToObject>(config.Numerical1); languageStartDict = JsonMapper.ToObject>(config.Numerical2); languageDict = JsonMapper.ToObject>(config.Numerical3); if (languageStartDict == null || !languageStartDict.ContainsKey(VersionConfigEx.Get().appId)) { //检查有没多语言 Debug.Log("当前渠道未开启多语言:" + VersionConfigEx.Get().appId); return; } Debug.LogFormat("系统语言:{0} {1}", Application.systemLanguage, config.Numerical1); var id = LocalSave.GetString("LANGUAGE_ID1"); if (!string.IsNullOrEmpty(id)) { //玩家已经选择过语言,不做处理 Debug.Log("当前选择语言:" + id); return; } var defaultCfg = languageStartDict[VersionConfigEx.Get().appId]; string languageMark; if (defaultCfg[1] == "0") { //随系统选择 languageMark = ((int)Application.systemLanguage).ToString(); if (languageDict.ContainsKey(languageMark)) { id = languageDict[languageMark]; var lanArr = defaultCfg[2].Split(','); if (Array.IndexOf(lanArr, id) == -1) { //不包含的语言 用默认 id = defaultCfg[0]; } } else { //默认 id = defaultCfg[0]; } } else { //强制指定默认 id = defaultCfg[0]; } Id = id; Debug.LogFormat("系统语言:{0} 设置为{1}", Application.systemLanguage, Id); } /// /// 语言的ID,用于区分下载资源 /// /// public static string Id { get { if (languageStartDict == null || languageStartDict.Count == 0) { return ""; } if (!languageStartDict.ContainsKey(VersionConfigEx.Get().appId)) { return ""; } return LocalSave.GetString("LANGUAGE_ID1"); } set { LocalSave.SetString("LANGUAGE_ID1", value); } } //多语言的路径 //默认路径不附加地址,Id不为空时附加Id public static string fixPath { get { if (string.IsNullOrEmpty(Id)) return ""; return string.Format("/{0}", Id); } } // 获取语言选项 public static string[] GetLanguages() { if (languageStartDict == null || !languageStartDict.ContainsKey(VersionConfig.Get().appId)) { return null; } return languageStartDict[VersionConfig.Get().appId][2].Split(','); } public static string Get(string _id) { // return string.Empty; var languageInfo = LanguageConfig.Get(_id); if (languageInfo == null) { #if UNITY_EDITOR // TODO YYL // if (_id.StartsWith(NewBieGuideScriptableObject.GuidesPrefixNewBie) || // _id.StartsWith(NewBieGuideScriptableObject.GuidesPrefixFun)) // return string.Empty; Debug.LogErrorFormat("缺少语言表配置,id: {0}", _id); #endif return string.Empty; } if (string.IsNullOrEmpty(languageInfo.content)) { Debug.LogFormat("语言内容为空,id: {0}", _id); } return languageInfo.content; } public static string Get(string _id, params object[] _objects) { var content = Get(_id); try { return string.Format(content, _objects); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } // 基础泛型版本 public static string Get(string _id, T1 arg1) { var content = Get(_id); try { // 使用泛型可以避免装箱,编译器会为值类型生成特化版本 return string.Format(content, arg1); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } public static string Get(string _id, T1 arg1, T2 arg2) { var content = Get(_id); try { return string.Format(content, arg1, arg2); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } // 继续扩展更多参数... public static string Get(string _id, T1 arg1, T2 arg2, T3 arg3) { var content = Get(_id); try { return string.Format(content, arg1, arg2, arg3); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } public static string Get(string _id, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { var content = Get(_id); try { return string.Format(content, arg1, arg2, arg3, arg4); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } public static string Get(string _id, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) { var content = Get(_id); try { return string.Format(content, arg1, arg2, arg3, arg4, arg5); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } public static string GetFromLocal(int _id) { var languageInfo = PriorLanguageConfig.Get(_id); if (languageInfo == null) { Debug.LogFormat("缺少语言表配置,id: {0}", _id); return string.Empty; } if (string.IsNullOrEmpty(languageInfo.Content)) { Debug.LogFormat("语言内容为空,id: {0}", _id); } return languageInfo.Content; } public static string GetFromLocal(int _id, params object[] _objects) { var content = GetFromLocal(_id); try { return string.Format(content, _objects); } catch (Exception ex) { Debug.LogFormat("语言内容格式错误,id: {0}", _id); return content; } } }