From c3ff5b81a4e2b856960ae2eb685b3719e809954f Mon Sep 17 00:00:00 2001 From: bob <605277374@qq.com> Date: Thu, 5 Jun 2025 17:52:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E8=AF=AD=E8=A8=80=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runtime/LanguageConcrete/LanguageFont.cs | 70 +++++----- .../Runtime/LanguageConcrete/LanguageImage.cs | 18 +-- .../Runtime/LanguageConcrete/LanguageText.cs | 22 +-- .../NBC/Language/Runtime/LanguageConfig.cs | 34 +++++ .../Language/Runtime/LanguageConfig.cs.meta | 3 + .../NBC/Language/Runtime/LanguageManager.cs | 125 ++++++++++++++++++ .../NBC/Language/Runtime/NBC.Lan.asmdef | 18 ++- Assets/Scripts/NBC/UI/Runtime/NBC.UI.asmdef | 4 +- Assets/Scripts/Startup/App.cs | 1 + Config/language/LanguageFont.xlsx | Bin 11358 -> 11328 bytes 10 files changed, 237 insertions(+), 58 deletions(-) create mode 100644 Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs create mode 100644 Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs.meta diff --git a/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageFont.cs b/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageFont.cs index 870f0653b..33365241b 100644 --- a/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageFont.cs +++ b/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageFont.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using FairyGUI; +using TMPro; using UnityEngine; namespace NBC @@ -28,40 +30,40 @@ namespace NBC public void AddLanguage(SystemLanguage language) { - // var configDic = GameConfig.Inst.GetLanguageFontConfig(LanguageConst.languageMap[language]); - // string fontLocation = "Assets/ResRaw/Fonts/"; - // //字体使用前需要先注册 - // foreach (var config in configDic.Values) - // { - // if (config.type == "1") - // { - // DynamicFont font = new DynamicFont(); - // font.name = config.name; - // font.nativeFont = Assets.LoadAsset(fontLocation + config.relativePath).Asset as Font; - // FontManager.RegisterFont(font); - // } - // else if (config.type == "2") - // { - // TMP_FontAsset fontAsset = - // Assets.LoadAsset(fontLocation + config.relativePath).Asset as TMP_FontAsset; - // TMPFont font = new TMPFont(); - // font.name = config.name; //这个名字要和编辑器里字体资源的名字一致 - // font.fontAsset = fontAsset; - // FontManager.RegisterFont(font); - // } - // } - // - // var font2KeyDic = GameConfig.Inst.GetFont2KeyDic(); - // Dictionary keys = new Dictionary(); - // foreach (var pair in font2KeyDic) - // { - // keys.Add(pair.Key, configDic[pair.Value].name); - // } - // - // if (keys != null) - // { - // _languages[language] = keys; - // } + var configDic = Lan.Inst.GetLanguageFontConfig(LanguageConst.languageMap[language]); + string fontLocation = "Assets/Resources/Fonts/"; + //字体使用前需要先注册 + foreach (var config in configDic.Values) + { + if (config.Type == "1") + { + DynamicFont font = new DynamicFont(); + font.name = config.Name; + font.nativeFont = Resources.Load(fontLocation + config.RelativePath); + FontManager.RegisterFont(font); + } + else if (config.Type == "2") + { + TMP_FontAsset fontAsset = + Resources.Load(fontLocation + config.RelativePath) as TMP_FontAsset; + TMPFont font = new TMPFont(); + font.name = config.Name; //这个名字要和编辑器里字体资源的名字一致 + font.fontAsset = fontAsset; + FontManager.RegisterFont(font); + } + } + + var font2KeyDic = Lan.Inst.GetFont2KeyDic(); + Dictionary keys = new Dictionary(); + foreach (var pair in font2KeyDic) + { + keys.Add(pair.Key, configDic[pair.Value].Name); + } + + if (keys != null) + { + _languages[language] = keys; + } } public bool UseLanguage(SystemLanguage language) diff --git a/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageImage.cs b/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageImage.cs index 73015d979..eba904823 100644 --- a/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageImage.cs +++ b/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageImage.cs @@ -33,15 +33,15 @@ namespace NBC public void AddLanguage(SystemLanguage language) { - // var keys = GameConfig.Inst.GetLanguageImageConfig(LanguageConst.languageMap[language]); - // if (keys != null) - // { - // _languages[language] = keys; - // } - // else - // { - // _languages[language] = new Dictionary(); - // } + var keys = Lan.Inst.GetLanguageImageConfig(LanguageConst.languageMap[language]); + if (keys != null) + { + _languages[language] = keys; + } + else + { + _languages[language] = new Dictionary(); + } } public bool UseLanguage(SystemLanguage language) diff --git a/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageText.cs b/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageText.cs index 5d6dd9341..8ed9ec7cc 100644 --- a/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageText.cs +++ b/Assets/Scripts/NBC/Language/Runtime/LanguageConcrete/LanguageText.cs @@ -28,22 +28,22 @@ namespace NBC public void AddLanguage(SystemLanguage language) { - // var keys = GameConfig.Inst.GetLanguageConfig(LanguageConst.languageMap[language]); - // if (keys != null) - // { - // _languages[language] = keys; - // } - // else - // { - // _languages[language] = new Dictionary(); - // } + var keys = Lan.Inst.GetLanguageConfig(LanguageConst.languageMap[language]); + if (keys != null) + { + _languages[language] = keys; + } + else + { + _languages[language] = new Dictionary(); + } } public bool UseLanguage(SystemLanguage language) { - if (_languages.ContainsKey(language)) + if (_languages.TryGetValue(language, out var language1)) { - _currentLanguageDictionary = _languages[language]; + _currentLanguageDictionary = language1; return true; } diff --git a/Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs b/Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs new file mode 100644 index 000000000..74a64221f --- /dev/null +++ b/Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using Newtonsoft.Json.Linq; + +namespace NBC +{ + public struct LanguageFontConfig + { + public string Type; + public string Name; + public string RelativePath; + } + + public class LanguageConfig + { + public string Key; + private readonly Dictionary _languages = new Dictionary(); + + public string this[string key] => _languages.GetValueOrDefault(key, key); + + public Dictionary.KeyCollection Keys => _languages.Keys; + + public void Parse(JToken row) + { + Key = row["key"].ToString(); + var children = row.Children(); + foreach (var child in children) + { + if (child is not JProperty property) continue; + if (property.Name == "key") continue; + _languages[property.Name] = property.Value.ToString(); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs.meta b/Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs.meta new file mode 100644 index 000000000..6b6de5b3e --- /dev/null +++ b/Assets/Scripts/NBC/Language/Runtime/LanguageConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dd21030efb0f447988cd659f8a754506 +timeCreated: 1749112259 \ No newline at end of file diff --git a/Assets/Scripts/NBC/Language/Runtime/LanguageManager.cs b/Assets/Scripts/NBC/Language/Runtime/LanguageManager.cs index 89fef6079..81d46cb78 100644 --- a/Assets/Scripts/NBC/Language/Runtime/LanguageManager.cs +++ b/Assets/Scripts/NBC/Language/Runtime/LanguageManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Newtonsoft.Json.Linq; using UnityEngine; namespace NBC @@ -17,6 +18,11 @@ namespace NBC /// private Action _changeAction; + public LanguageManager() + { + LoadLanguageConfig(); + } + public void AddLanguageModule(int type, ILanguage languageModule) { _lanModuleDic.Add(type, languageModule); @@ -97,5 +103,124 @@ namespace NBC { _changeAction -= callback; } + + #region config + + private readonly Dictionary _languageConfigs = new Dictionary(); + private readonly Dictionary _font2Key = new Dictionary(); + + private readonly Dictionary _languageFontConfigs = + new Dictionary(); + + private readonly Dictionary _languageImagesConfigs = + new Dictionary(); + + public Dictionary GetLanguageConfig(LanguageInfo languageInfo) + { + Dictionary dic = new Dictionary(); + foreach (var key in _languageConfigs.Keys) + { + var value = _languageConfigs[key]; + dic[key] = value[languageInfo.Code]; + } + + return dic; + } + + public Dictionary GetLanguageFontConfig(LanguageInfo languageInfo) + { + if (_font2Key.Count != _languageFontConfigs.Count) + { + foreach (var fKey in _languageFontConfigs.Keys) + { + var config = _languageFontConfigs[fKey]; + foreach (var key in config.Keys) + { + var result = config[key]; + if (result != null) + { + string[] strs = result.Split(","); + _font2Key[strs[1]] = fKey; + } + } + } + } + + Dictionary dic = new Dictionary(); + foreach (var key in _languageFontConfigs.Keys) + { + var config = _languageFontConfigs[key]; + string result = config[languageInfo.Code]; + if (result != null) + { + string[] strs = result.Split(","); + var result2 = new LanguageFontConfig() + { + Type = strs[0], + Name = strs[1], + RelativePath = strs[2], + }; + dic[key] = result2; + } + } + + return dic; + } + + + public Dictionary GetLanguageImageConfig(LanguageInfo languageInfo) + { + Dictionary dic = new Dictionary(); + foreach (var key in _languageImagesConfigs.Keys) + { + var value = _languageImagesConfigs[key]; + dic[key] = value[languageInfo.Code]; + } + + return dic; + } + + public Dictionary GetFont2KeyDic() + { + return _font2Key; + } + + private void LoadLanguageConfig() + { + _languageConfigs.Clear(); + var textAsset = Resources.Load("config/language"); + if (textAsset) + { + var jToken = JObject.Parse(textAsset.text); + foreach (var obj in jToken) + { + switch (obj.Key) + { + case "language": + LoadLanguageConfig(obj.Value, _languageConfigs); + break; + case "languageFont": + LoadLanguageConfig(obj.Value, _languageFontConfigs); + break; + case "languageImage": + LoadLanguageConfig(obj.Value, _languageImagesConfigs); + break; + } + } + } + } + + private void LoadLanguageConfig(JToken token, Dictionary dictionary) + { + if (token is not JArray jArray) return; + foreach (var j in jArray) + { + var config = new LanguageConfig(); + config.Parse(j); + dictionary[config.Key] = config; + } + } + + #endregion } } \ No newline at end of file diff --git a/Assets/Scripts/NBC/Language/Runtime/NBC.Lan.asmdef b/Assets/Scripts/NBC/Language/Runtime/NBC.Lan.asmdef index c34a71dcb..db5503832 100644 --- a/Assets/Scripts/NBC/Language/Runtime/NBC.Lan.asmdef +++ b/Assets/Scripts/NBC/Language/Runtime/NBC.Lan.asmdef @@ -1,3 +1,17 @@ { - "name": "NBC.Lan" -} + "name": "NBC.Lan", + "rootNamespace": "", + "references": [ + "GUID:8c8f9d96103e94a7da84b012fd7e9f13", + "GUID:6055be8ebefd69e48b49212b09b47b2f" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Scripts/NBC/UI/Runtime/NBC.UI.asmdef b/Assets/Scripts/NBC/UI/Runtime/NBC.UI.asmdef index 9514cbc3e..b321dcd07 100644 --- a/Assets/Scripts/NBC/UI/Runtime/NBC.UI.asmdef +++ b/Assets/Scripts/NBC/UI/Runtime/NBC.UI.asmdef @@ -3,9 +3,9 @@ "rootNamespace": "", "references": [ "GUID:b3c9c3fa0cbae6e438ac062aa5d78b76", - "GUID:8beb767f9f7a66f4e87dd9db57cdd64e", "GUID:8c8f9d96103e94a7da84b012fd7e9f13", - "GUID:3f4a88279c0696a488a2e08f8bccf903" + "GUID:3f4a88279c0696a488a2e08f8bccf903", + "GUID:8beb767f9f7a66f4e87dd9db57cdd64e" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/Scripts/Startup/App.cs b/Assets/Scripts/Startup/App.cs index dfdc7bfdd..126c71351 100644 --- a/Assets/Scripts/Startup/App.cs +++ b/Assets/Scripts/Startup/App.cs @@ -79,6 +79,7 @@ namespace NBF } UI.Inst.SetUILanguage(); + Lan.Inst.AutoUseLanguage(); } #endregion diff --git a/Config/language/LanguageFont.xlsx b/Config/language/LanguageFont.xlsx index 95dedc7d0b889501b7e0a39add511abf1dfeb11c..2c6b904de2cd7e17f1c477f055e164917cf11dbc 100644 GIT binary patch delta 2936 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