LocalizationComponent.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using GameFramework;
  8. using GameFramework.Localization;
  9. using GameFramework.Resource;
  10. using UnityEngine;
  11. namespace UnityGameFramework.Runtime
  12. {
  13. /// <summary>
  14. /// 本地化组件。
  15. /// </summary>
  16. [DisallowMultipleComponent]
  17. [AddComponentMenu("Game Framework/Localization")]
  18. public sealed class LocalizationComponent : GameFrameworkComponent
  19. {
  20. private const int DefaultPriority = 0;
  21. private ILocalizationManager m_LocalizationManager = null;
  22. private EventComponent m_EventComponent = null;
  23. [SerializeField]
  24. private bool m_EnableLoadDictionaryUpdateEvent = false;
  25. [SerializeField]
  26. private bool m_EnableLoadDictionaryDependencyAssetEvent = false;
  27. [SerializeField]
  28. private string m_LocalizationHelperTypeName = "UnityGameFramework.Runtime.DefaultLocalizationHelper";
  29. [SerializeField]
  30. private LocalizationHelperBase m_CustomLocalizationHelper = null;
  31. [SerializeField]
  32. private int m_CachedBytesSize = 0;
  33. /// <summary>
  34. /// 获取或设置本地化语言。
  35. /// </summary>
  36. public Language Language
  37. {
  38. get
  39. {
  40. return m_LocalizationManager.Language;
  41. }
  42. set
  43. {
  44. m_LocalizationManager.Language = value;
  45. }
  46. }
  47. /// <summary>
  48. /// 获取系统语言。
  49. /// </summary>
  50. public Language SystemLanguage
  51. {
  52. get
  53. {
  54. return m_LocalizationManager.SystemLanguage;
  55. }
  56. }
  57. /// <summary>
  58. /// 获取字典数量。
  59. /// </summary>
  60. public int DictionaryCount
  61. {
  62. get
  63. {
  64. return m_LocalizationManager.DictionaryCount;
  65. }
  66. }
  67. /// <summary>
  68. /// 获取缓冲二进制流的大小。
  69. /// </summary>
  70. public int CachedBytesSize
  71. {
  72. get
  73. {
  74. return m_LocalizationManager.CachedBytesSize;
  75. }
  76. }
  77. /// <summary>
  78. /// 游戏框架组件初始化。
  79. /// </summary>
  80. protected override void Awake()
  81. {
  82. base.Awake();
  83. m_LocalizationManager = GameFrameworkEntry.GetModule<ILocalizationManager>();
  84. if (m_LocalizationManager == null)
  85. {
  86. Log.Fatal("Localization manager is invalid.");
  87. return;
  88. }
  89. m_LocalizationManager.ReadDataSuccess += OnReadDataSuccess;
  90. m_LocalizationManager.ReadDataFailure += OnReadDataFailure;
  91. if (m_EnableLoadDictionaryUpdateEvent)
  92. {
  93. m_LocalizationManager.ReadDataUpdate += OnReadDataUpdate;
  94. }
  95. if (m_EnableLoadDictionaryDependencyAssetEvent)
  96. {
  97. m_LocalizationManager.ReadDataDependencyAsset += OnReadDataDependencyAsset;
  98. }
  99. }
  100. private void Start()
  101. {
  102. BaseComponent baseComponent = GameEntry.GetComponent<BaseComponent>();
  103. if (baseComponent == null)
  104. {
  105. Log.Fatal("Base component is invalid.");
  106. return;
  107. }
  108. m_EventComponent = GameEntry.GetComponent<EventComponent>();
  109. if (m_EventComponent == null)
  110. {
  111. Log.Fatal("Event component is invalid.");
  112. return;
  113. }
  114. if (baseComponent.EditorResourceMode)
  115. {
  116. m_LocalizationManager.SetResourceManager(baseComponent.EditorResourceHelper);
  117. }
  118. else
  119. {
  120. m_LocalizationManager.SetResourceManager(GameFrameworkEntry.GetModule<IResourceManager>());
  121. }
  122. LocalizationHelperBase localizationHelper = Helper.CreateHelper(m_LocalizationHelperTypeName, m_CustomLocalizationHelper);
  123. if (localizationHelper == null)
  124. {
  125. Log.Error("Can not create localization helper.");
  126. return;
  127. }
  128. localizationHelper.name = "Localization Helper";
  129. Transform transform = localizationHelper.transform;
  130. transform.SetParent(this.transform);
  131. transform.localScale = Vector3.one;
  132. m_LocalizationManager.SetDataProviderHelper(localizationHelper);
  133. m_LocalizationManager.SetLocalizationHelper(localizationHelper);
  134. m_LocalizationManager.Language = baseComponent.EditorResourceMode && baseComponent.EditorLanguage != Language.Unspecified ? baseComponent.EditorLanguage : m_LocalizationManager.SystemLanguage;
  135. if (m_CachedBytesSize > 0)
  136. {
  137. EnsureCachedBytesSize(m_CachedBytesSize);
  138. }
  139. }
  140. /// <summary>
  141. /// 确保二进制流缓存分配足够大小的内存并缓存。
  142. /// </summary>
  143. /// <param name="ensureSize">要确保二进制流缓存分配内存的大小。</param>
  144. public void EnsureCachedBytesSize(int ensureSize)
  145. {
  146. m_LocalizationManager.EnsureCachedBytesSize(ensureSize);
  147. }
  148. /// <summary>
  149. /// 释放缓存的二进制流。
  150. /// </summary>
  151. public void FreeCachedBytes()
  152. {
  153. m_LocalizationManager.FreeCachedBytes();
  154. }
  155. /// <summary>
  156. /// 读取字典。
  157. /// </summary>
  158. /// <param name="dictionaryAssetName">字典资源名称。</param>
  159. public void ReadData(string dictionaryAssetName)
  160. {
  161. m_LocalizationManager.ReadData(dictionaryAssetName);
  162. }
  163. /// <summary>
  164. /// 读取字典。
  165. /// </summary>
  166. /// <param name="dictionaryAssetName">字典资源名称。</param>
  167. /// <param name="priority">加载字典资源的优先级。</param>
  168. public void ReadData(string dictionaryAssetName, int priority)
  169. {
  170. m_LocalizationManager.ReadData(dictionaryAssetName, priority);
  171. }
  172. /// <summary>
  173. /// 读取字典。
  174. /// </summary>
  175. /// <param name="dictionaryAssetName">字典资源名称。</param>
  176. /// <param name="userData">用户自定义数据。</param>
  177. public void ReadData(string dictionaryAssetName, object userData)
  178. {
  179. m_LocalizationManager.ReadData(dictionaryAssetName, userData);
  180. }
  181. /// <summary>
  182. /// 读取字典。
  183. /// </summary>
  184. /// <param name="dictionaryAssetName">字典资源名称。</param>
  185. /// <param name="priority">加载字典资源的优先级。</param>
  186. /// <param name="userData">用户自定义数据。</param>
  187. public void ReadData(string dictionaryAssetName, int priority, object userData)
  188. {
  189. m_LocalizationManager.ReadData(dictionaryAssetName, priority, userData);
  190. }
  191. /// <summary>
  192. /// 解析字典。
  193. /// </summary>
  194. /// <param name="dictionaryString">要解析的字典字符串。</param>
  195. /// <returns>是否解析字典成功。</returns>
  196. public bool ParseData(string dictionaryString)
  197. {
  198. return m_LocalizationManager.ParseData(dictionaryString);
  199. }
  200. /// <summary>
  201. /// 解析字典。
  202. /// </summary>
  203. /// <param name="dictionaryString">要解析的字典字符串。</param>
  204. /// <param name="userData">用户自定义数据。</param>
  205. /// <returns>是否解析字典成功。</returns>
  206. public bool ParseData(string dictionaryString, object userData)
  207. {
  208. return m_LocalizationManager.ParseData(dictionaryString, userData);
  209. }
  210. /// <summary>
  211. /// 解析字典。
  212. /// </summary>
  213. /// <param name="dictionaryBytes">要解析的字典二进制流。</param>
  214. /// <returns>是否解析字典成功。</returns>
  215. public bool ParseData(byte[] dictionaryBytes)
  216. {
  217. return m_LocalizationManager.ParseData(dictionaryBytes);
  218. }
  219. /// <summary>
  220. /// 解析字典。
  221. /// </summary>
  222. /// <param name="dictionaryBytes">要解析的字典二进制流。</param>
  223. /// <param name="userData">用户自定义数据。</param>
  224. /// <returns>是否解析字典成功。</returns>
  225. public bool ParseData(byte[] dictionaryBytes, object userData)
  226. {
  227. return m_LocalizationManager.ParseData(dictionaryBytes, userData);
  228. }
  229. /// <summary>
  230. /// 解析字典。
  231. /// </summary>
  232. /// <param name="dictionaryBytes">要解析的字典二进制流。</param>
  233. /// <param name="startIndex">字典二进制流的起始位置。</param>
  234. /// <param name="length">字典二进制流的长度。</param>
  235. /// <returns>是否解析字典成功。</returns>
  236. public bool ParseData(byte[] dictionaryBytes, int startIndex, int length)
  237. {
  238. return m_LocalizationManager.ParseData(dictionaryBytes, startIndex, length);
  239. }
  240. /// <summary>
  241. /// 解析字典。
  242. /// </summary>
  243. /// <param name="dictionaryBytes">要解析的字典二进制流。</param>
  244. /// <param name="startIndex">字典二进制流的起始位置。</param>
  245. /// <param name="length">字典二进制流的长度。</param>
  246. /// <param name="userData">用户自定义数据。</param>
  247. /// <returns>是否解析字典成功。</returns>
  248. public bool ParseData(byte[] dictionaryBytes, int startIndex, int length, object userData)
  249. {
  250. return m_LocalizationManager.ParseData(dictionaryBytes, startIndex, length, userData);
  251. }
  252. /// <summary>
  253. /// 根据字典主键获取字典内容字符串。
  254. /// </summary>
  255. /// <param name="key">字典主键。</param>
  256. /// <returns>要获取的字典内容字符串。</returns>
  257. public string GetString(string key)
  258. {
  259. return m_LocalizationManager.GetString(key);
  260. }
  261. /// <summary>
  262. /// 根据字典主键获取字典内容字符串。
  263. /// </summary>
  264. /// <param name="key">字典主键。</param>
  265. /// <param name="arg0">字典参数 0。</param>
  266. /// <returns>要获取的字典内容字符串。</returns>
  267. public string GetString(string key, object arg0)
  268. {
  269. return m_LocalizationManager.GetString(key, arg0);
  270. }
  271. /// <summary>
  272. /// 根据字典主键获取字典内容字符串。
  273. /// </summary>
  274. /// <param name="key">字典主键。</param>
  275. /// <param name="arg0">字典参数 0。</param>
  276. /// <param name="arg1">字典参数 1。</param>
  277. /// <returns>要获取的字典内容字符串。</returns>
  278. public string GetString(string key, object arg0, object arg1)
  279. {
  280. return m_LocalizationManager.GetString(key, arg0, arg1);
  281. }
  282. /// <summary>
  283. /// 根据字典主键获取字典内容字符串。
  284. /// </summary>
  285. /// <param name="key">字典主键。</param>
  286. /// <param name="arg0">字典参数 0。</param>
  287. /// <param name="arg1">字典参数 1。</param>
  288. /// <param name="arg2">字典参数 2。</param>
  289. /// <returns>要获取的字典内容字符串。</returns>
  290. public string GetString(string key, object arg0, object arg1, object arg2)
  291. {
  292. return m_LocalizationManager.GetString(key, arg0, arg1, arg2);
  293. }
  294. /// <summary>
  295. /// 根据字典主键获取字典内容字符串。
  296. /// </summary>
  297. /// <param name="key">字典主键。</param>
  298. /// <param name="args">字典参数。</param>
  299. /// <returns>要获取的字典内容字符串。</returns>
  300. public string GetString(string key, params object[] args)
  301. {
  302. return m_LocalizationManager.GetString(key, args);
  303. }
  304. /// <summary>
  305. /// 是否存在字典。
  306. /// </summary>
  307. /// <param name="key">字典主键。</param>
  308. /// <returns>是否存在字典。</returns>
  309. public bool HasRawString(string key)
  310. {
  311. return m_LocalizationManager.HasRawString(key);
  312. }
  313. /// <summary>
  314. /// 根据字典主键获取字典值。
  315. /// </summary>
  316. /// <param name="key">字典主键。</param>
  317. /// <returns>字典值。</returns>
  318. public string GetRawString(string key)
  319. {
  320. return m_LocalizationManager.GetRawString(key);
  321. }
  322. /// <summary>
  323. /// 移除字典。
  324. /// </summary>
  325. /// <param name="key">字典主键。</param>
  326. /// <returns>是否移除字典成功。</returns>
  327. public bool RemoveRawString(string key)
  328. {
  329. return m_LocalizationManager.RemoveRawString(key);
  330. }
  331. /// <summary>
  332. /// 清空所有字典。
  333. /// </summary>
  334. public void RemoveAllRawStrings()
  335. {
  336. m_LocalizationManager.RemoveAllRawStrings();
  337. }
  338. private void OnReadDataSuccess(object sender, ReadDataSuccessEventArgs e)
  339. {
  340. m_EventComponent.Fire(this, LoadDictionarySuccessEventArgs.Create(e));
  341. }
  342. private void OnReadDataFailure(object sender, ReadDataFailureEventArgs e)
  343. {
  344. Log.Warning("Load dictionary failure, asset name '{0}', error message '{1}'.", e.DataAssetName, e.ErrorMessage);
  345. m_EventComponent.Fire(this, LoadDictionaryFailureEventArgs.Create(e));
  346. }
  347. private void OnReadDataUpdate(object sender, ReadDataUpdateEventArgs e)
  348. {
  349. m_EventComponent.Fire(this, LoadDictionaryUpdateEventArgs.Create(e));
  350. }
  351. private void OnReadDataDependencyAsset(object sender, ReadDataDependencyAssetEventArgs e)
  352. {
  353. m_EventComponent.Fire(this, LoadDictionaryDependencyAssetEventArgs.Create(e));
  354. }
  355. }
  356. }