DefaultLocalizationHelper.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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 System;
  10. using System.IO;
  11. using System.Text;
  12. using UnityEngine;
  13. namespace UnityGameFramework.Runtime
  14. {
  15. /// <summary>
  16. /// 默认本地化辅助器。
  17. /// </summary>
  18. public class DefaultLocalizationHelper : LocalizationHelperBase
  19. {
  20. private static readonly string[] ColumnSplitSeparator = new string[] { "\t" };
  21. private static readonly string BytesAssetExtension = ".bytes";
  22. private const int ColumnCount = 4;
  23. private ResourceComponent m_ResourceComponent = null;
  24. /// <summary>
  25. /// 获取系统语言。
  26. /// </summary>
  27. public override Language SystemLanguage
  28. {
  29. get
  30. {
  31. switch (Application.systemLanguage)
  32. {
  33. case UnityEngine.SystemLanguage.Afrikaans: return Language.Afrikaans;
  34. case UnityEngine.SystemLanguage.Arabic: return Language.Arabic;
  35. case UnityEngine.SystemLanguage.Basque: return Language.Basque;
  36. case UnityEngine.SystemLanguage.Belarusian: return Language.Belarusian;
  37. case UnityEngine.SystemLanguage.Bulgarian: return Language.Bulgarian;
  38. case UnityEngine.SystemLanguage.Catalan: return Language.Catalan;
  39. case UnityEngine.SystemLanguage.Chinese: return Language.ChineseSimplified;
  40. case UnityEngine.SystemLanguage.ChineseSimplified: return Language.ChineseSimplified;
  41. case UnityEngine.SystemLanguage.ChineseTraditional: return Language.ChineseTraditional;
  42. case UnityEngine.SystemLanguage.Czech: return Language.Czech;
  43. case UnityEngine.SystemLanguage.Danish: return Language.Danish;
  44. case UnityEngine.SystemLanguage.Dutch: return Language.Dutch;
  45. case UnityEngine.SystemLanguage.English: return Language.English;
  46. case UnityEngine.SystemLanguage.Estonian: return Language.Estonian;
  47. case UnityEngine.SystemLanguage.Faroese: return Language.Faroese;
  48. case UnityEngine.SystemLanguage.Finnish: return Language.Finnish;
  49. case UnityEngine.SystemLanguage.French: return Language.French;
  50. case UnityEngine.SystemLanguage.German: return Language.German;
  51. case UnityEngine.SystemLanguage.Greek: return Language.Greek;
  52. case UnityEngine.SystemLanguage.Hebrew: return Language.Hebrew;
  53. case UnityEngine.SystemLanguage.Hungarian: return Language.Hungarian;
  54. case UnityEngine.SystemLanguage.Icelandic: return Language.Icelandic;
  55. case UnityEngine.SystemLanguage.Indonesian: return Language.Indonesian;
  56. case UnityEngine.SystemLanguage.Italian: return Language.Italian;
  57. case UnityEngine.SystemLanguage.Japanese: return Language.Japanese;
  58. case UnityEngine.SystemLanguage.Korean: return Language.Korean;
  59. case UnityEngine.SystemLanguage.Latvian: return Language.Latvian;
  60. case UnityEngine.SystemLanguage.Lithuanian: return Language.Lithuanian;
  61. case UnityEngine.SystemLanguage.Norwegian: return Language.Norwegian;
  62. case UnityEngine.SystemLanguage.Polish: return Language.Polish;
  63. case UnityEngine.SystemLanguage.Portuguese: return Language.PortuguesePortugal;
  64. case UnityEngine.SystemLanguage.Romanian: return Language.Romanian;
  65. case UnityEngine.SystemLanguage.Russian: return Language.Russian;
  66. case UnityEngine.SystemLanguage.SerboCroatian: return Language.SerboCroatian;
  67. case UnityEngine.SystemLanguage.Slovak: return Language.Slovak;
  68. case UnityEngine.SystemLanguage.Slovenian: return Language.Slovenian;
  69. case UnityEngine.SystemLanguage.Spanish: return Language.Spanish;
  70. case UnityEngine.SystemLanguage.Swedish: return Language.Swedish;
  71. case UnityEngine.SystemLanguage.Thai: return Language.Thai;
  72. case UnityEngine.SystemLanguage.Turkish: return Language.Turkish;
  73. case UnityEngine.SystemLanguage.Ukrainian: return Language.Ukrainian;
  74. case UnityEngine.SystemLanguage.Unknown: return Language.Unspecified;
  75. case UnityEngine.SystemLanguage.Vietnamese: return Language.Vietnamese;
  76. default: return Language.Unspecified;
  77. }
  78. }
  79. }
  80. /// <summary>
  81. /// 读取字典。
  82. /// </summary>
  83. /// <param name="localizationManager">本地化管理器。</param>
  84. /// <param name="dictionaryAssetName">字典资源名称。</param>
  85. /// <param name="dictionaryAsset">字典资源。</param>
  86. /// <param name="userData">用户自定义数据。</param>
  87. /// <returns>是否读取字典成功。</returns>
  88. public override bool ReadData(ILocalizationManager localizationManager, string dictionaryAssetName, object dictionaryAsset, object userData)
  89. {
  90. TextAsset dictionaryTextAsset = dictionaryAsset as TextAsset;
  91. if (dictionaryTextAsset != null)
  92. {
  93. if (dictionaryAssetName.EndsWith(BytesAssetExtension, StringComparison.Ordinal))
  94. {
  95. return localizationManager.ParseData(dictionaryTextAsset.bytes, userData);
  96. }
  97. else
  98. {
  99. return localizationManager.ParseData(dictionaryTextAsset.text, userData);
  100. }
  101. }
  102. Log.Warning("Dictionary asset '{0}' is invalid.", dictionaryAssetName);
  103. return false;
  104. }
  105. /// <summary>
  106. /// 读取字典。
  107. /// </summary>
  108. /// <param name="localizationManager">本地化管理器。</param>
  109. /// <param name="dictionaryAssetName">字典资源名称。</param>
  110. /// <param name="dictionaryBytes">字典二进制流。</param>
  111. /// <param name="startIndex">字典二进制流的起始位置。</param>
  112. /// <param name="length">字典二进制流的长度。</param>
  113. /// <param name="userData">用户自定义数据。</param>
  114. /// <returns>是否读取字典成功。</returns>
  115. public override bool ReadData(ILocalizationManager localizationManager, string dictionaryAssetName, byte[] dictionaryBytes, int startIndex, int length, object userData)
  116. {
  117. if (dictionaryAssetName.EndsWith(BytesAssetExtension, StringComparison.Ordinal))
  118. {
  119. return localizationManager.ParseData(dictionaryBytes, startIndex, length, userData);
  120. }
  121. else
  122. {
  123. return localizationManager.ParseData(Utility.Converter.GetString(dictionaryBytes, startIndex, length), userData);
  124. }
  125. }
  126. /// <summary>
  127. /// 解析字典。
  128. /// </summary>
  129. /// <param name="localizationManager">本地化管理器。</param>
  130. /// <param name="dictionaryString">要解析的字典字符串。</param>
  131. /// <param name="userData">用户自定义数据。</param>
  132. /// <returns>是否解析字典成功。</returns>
  133. public override bool ParseData(ILocalizationManager localizationManager, string dictionaryString, object userData)
  134. {
  135. try
  136. {
  137. int position = 0;
  138. string dictionaryLineString = null;
  139. while ((dictionaryLineString = dictionaryString.ReadLine(ref position)) != null)
  140. {
  141. if (dictionaryLineString[0] == '#')
  142. {
  143. continue;
  144. }
  145. string[] splitedLine = dictionaryLineString.Split(ColumnSplitSeparator, StringSplitOptions.None);
  146. if (splitedLine.Length != ColumnCount)
  147. {
  148. Log.Warning("Can not parse dictionary line string '{0}' which column count is invalid.", dictionaryLineString);
  149. return false;
  150. }
  151. string dictionaryKey = splitedLine[1];
  152. string dictionaryValue = splitedLine[3];
  153. if (!localizationManager.AddRawString(dictionaryKey, dictionaryValue))
  154. {
  155. Log.Warning("Can not add raw string with dictionary key '{0}' which may be invalid or duplicate.", dictionaryKey);
  156. return false;
  157. }
  158. }
  159. return true;
  160. }
  161. catch (Exception exception)
  162. {
  163. Log.Warning("Can not parse dictionary string with exception '{0}'.", exception.ToString());
  164. return false;
  165. }
  166. }
  167. /// <summary>
  168. /// 解析字典。
  169. /// </summary>
  170. /// <param name="localizationManager">本地化管理器。</param>
  171. /// <param name="dictionaryBytes">要解析的字典二进制流。</param>
  172. /// <param name="startIndex">字典二进制流的起始位置。</param>
  173. /// <param name="length">字典二进制流的长度。</param>
  174. /// <param name="userData">用户自定义数据。</param>
  175. /// <returns>是否解析字典成功。</returns>
  176. public override bool ParseData(ILocalizationManager localizationManager, byte[] dictionaryBytes, int startIndex, int length, object userData)
  177. {
  178. try
  179. {
  180. using (MemoryStream memoryStream = new MemoryStream(dictionaryBytes, startIndex, length, false))
  181. {
  182. using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
  183. {
  184. while (binaryReader.BaseStream.Position < binaryReader.BaseStream.Length)
  185. {
  186. string dictionaryKey = binaryReader.ReadString();
  187. string dictionaryValue = binaryReader.ReadString();
  188. if (!localizationManager.AddRawString(dictionaryKey, dictionaryValue))
  189. {
  190. Log.Warning("Can not add raw string with dictionary key '{0}' which may be invalid or duplicate.", dictionaryKey);
  191. return false;
  192. }
  193. }
  194. }
  195. }
  196. return true;
  197. }
  198. catch (Exception exception)
  199. {
  200. Log.Warning("Can not parse dictionary bytes with exception '{0}'.", exception.ToString());
  201. return false;
  202. }
  203. }
  204. /// <summary>
  205. /// 释放字典资源。
  206. /// </summary>
  207. /// <param name="localizationManager">本地化管理器。</param>
  208. /// <param name="dictionaryAsset">要释放的字典资源。</param>
  209. public override void ReleaseDataAsset(ILocalizationManager localizationManager, object dictionaryAsset)
  210. {
  211. m_ResourceComponent.UnloadAsset(dictionaryAsset);
  212. }
  213. private void Start()
  214. {
  215. m_ResourceComponent = GameEntry.GetComponent<ResourceComponent>();
  216. if (m_ResourceComponent == null)
  217. {
  218. Log.Fatal("Resource component is invalid.");
  219. return;
  220. }
  221. }
  222. }
  223. }