Localize.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using UnityEngine;
  6. using UnityEngine.Events;
  7. namespace I2.Loc
  8. {
  9. [AddComponentMenu("I2/Localization/I2 Localize")]
  10. public class Localize : MonoBehaviour
  11. {
  12. public string Term
  13. {
  14. get
  15. {
  16. return this.mTerm;
  17. }
  18. set
  19. {
  20. this.SetTerm(value);
  21. }
  22. }
  23. public string SecondaryTerm
  24. {
  25. get
  26. {
  27. return this.mTermSecondary;
  28. }
  29. set
  30. {
  31. this.SetTerm(null, value);
  32. }
  33. }
  34. public Localize.ArgsPair[] TermArgs
  35. {
  36. get
  37. {
  38. return this.mTermArgs;
  39. }
  40. set
  41. {
  42. this.mTermArgs = value;
  43. }
  44. }
  45. private void Awake()
  46. {
  47. this.UpdateAssetDictionary();
  48. this.FindTarget();
  49. if (this.LocalizeOnAwake)
  50. {
  51. this.OnLocalize(false);
  52. }
  53. }
  54. private void OnEnable()
  55. {
  56. this.OnLocalize(false);
  57. }
  58. public bool HasCallback()
  59. {
  60. return this.LocalizeCallBack.HasCallback() || this.LocalizeEvent.GetPersistentEventCount() > 0;
  61. }
  62. public void OnLocalize(bool Force = false)
  63. {
  64. if (!Force && (!base.enabled || base.gameObject == null || !base.gameObject.activeInHierarchy))
  65. {
  66. return;
  67. }
  68. if (string.IsNullOrEmpty(LocalizationManager.CurrentLanguage))
  69. {
  70. return;
  71. }
  72. if (!this.AlwaysForceLocalize && !Force && !this.HasCallback() && this.LastLocalizedLanguage == LocalizationManager.CurrentLanguage)
  73. {
  74. return;
  75. }
  76. this.LastLocalizedLanguage = LocalizationManager.CurrentLanguage;
  77. if (string.IsNullOrEmpty(this.FinalTerm) || string.IsNullOrEmpty(this.FinalSecondaryTerm))
  78. {
  79. this.GetFinalTerms(out this.FinalTerm, out this.FinalSecondaryTerm);
  80. }
  81. bool flag = I2Utils.IsPlaying() && this.HasCallback();
  82. if (!flag && string.IsNullOrEmpty(this.FinalTerm) && string.IsNullOrEmpty(this.FinalSecondaryTerm))
  83. {
  84. return;
  85. }
  86. Localize.CallBackTerm = this.FinalTerm;
  87. Localize.CallBackSecondaryTerm = this.FinalSecondaryTerm;
  88. Localize.MainTranslation = ((!string.IsNullOrEmpty(this.FinalTerm) && !(this.FinalTerm == "-")) ? LocalizationManager.GetTranslation(this.FinalTerm, false, 0, true, false, null, null) : null);
  89. Localize.SecondaryTranslation = ((!string.IsNullOrEmpty(this.FinalSecondaryTerm) && !(this.FinalSecondaryTerm == "-")) ? LocalizationManager.GetTranslation(this.FinalSecondaryTerm, false, 0, true, false, null, null) : null);
  90. if (!flag && string.IsNullOrEmpty(this.FinalTerm) && string.IsNullOrEmpty(Localize.SecondaryTranslation))
  91. {
  92. return;
  93. }
  94. Localize.CurrentLocalizeComponent = this;
  95. this.LocalizeCallBack.Execute(this);
  96. this.LocalizeEvent.Invoke();
  97. LocalizationManager.ApplyLocalizationParams(ref Localize.MainTranslation, base.gameObject);
  98. if (!this.FindTarget())
  99. {
  100. return;
  101. }
  102. bool flag2 = LocalizationManager.IsRight2Left && !this.IgnoreRTL;
  103. if (Localize.MainTranslation != null)
  104. {
  105. switch (this.PrimaryTermModifier)
  106. {
  107. case Localize.TermModification.ToUpper:
  108. Localize.MainTranslation = Localize.MainTranslation.ToUpper();
  109. break;
  110. case Localize.TermModification.ToLower:
  111. Localize.MainTranslation = Localize.MainTranslation.ToLower();
  112. break;
  113. case Localize.TermModification.ToUpperFirst:
  114. Localize.MainTranslation = GoogleTranslation.UppercaseFirst(Localize.MainTranslation);
  115. break;
  116. case Localize.TermModification.ToTitle:
  117. Localize.MainTranslation = GoogleTranslation.TitleCase(Localize.MainTranslation);
  118. break;
  119. }
  120. if (!string.IsNullOrEmpty(this.TermPrefix))
  121. {
  122. Localize.MainTranslation = ((!flag2) ? (this.TermPrefix + Localize.MainTranslation) : (Localize.MainTranslation + this.TermPrefix));
  123. }
  124. if (!string.IsNullOrEmpty(this.TermSuffix))
  125. {
  126. Localize.MainTranslation = ((!flag2) ? (Localize.MainTranslation + this.TermSuffix) : (this.TermSuffix + Localize.MainTranslation));
  127. }
  128. if (this.AddSpacesToJoinedLanguages && LocalizationManager.HasJoinedWords && !string.IsNullOrEmpty(Localize.MainTranslation))
  129. {
  130. StringBuilder stringBuilder = new StringBuilder();
  131. stringBuilder.Append(Localize.MainTranslation[0]);
  132. int i = 1;
  133. int length = Localize.MainTranslation.Length;
  134. while (i < length)
  135. {
  136. stringBuilder.Append(' ');
  137. stringBuilder.Append(Localize.MainTranslation[i]);
  138. i++;
  139. }
  140. Localize.MainTranslation = stringBuilder.ToString();
  141. }
  142. if (flag2 && this.mLocalizeTarget.AllowMainTermToBeRTL() && !string.IsNullOrEmpty(Localize.MainTranslation))
  143. {
  144. Localize.MainTranslation = LocalizationManager.ApplyRTLfix(Localize.MainTranslation, this.MaxCharactersInRTL, this.IgnoreNumbersInRTL);
  145. }
  146. }
  147. if (Localize.SecondaryTranslation != null)
  148. {
  149. switch (this.SecondaryTermModifier)
  150. {
  151. case Localize.TermModification.ToUpper:
  152. Localize.SecondaryTranslation = Localize.SecondaryTranslation.ToUpper();
  153. break;
  154. case Localize.TermModification.ToLower:
  155. Localize.SecondaryTranslation = Localize.SecondaryTranslation.ToLower();
  156. break;
  157. case Localize.TermModification.ToUpperFirst:
  158. Localize.SecondaryTranslation = GoogleTranslation.UppercaseFirst(Localize.SecondaryTranslation);
  159. break;
  160. case Localize.TermModification.ToTitle:
  161. Localize.SecondaryTranslation = GoogleTranslation.TitleCase(Localize.SecondaryTranslation);
  162. break;
  163. }
  164. if (flag2 && this.mLocalizeTarget.AllowSecondTermToBeRTL() && !string.IsNullOrEmpty(Localize.SecondaryTranslation))
  165. {
  166. Localize.SecondaryTranslation = LocalizationManager.ApplyRTLfix(Localize.SecondaryTranslation);
  167. }
  168. }
  169. if (LocalizationManager.HighlightLocalizedTargets)
  170. {
  171. Localize.MainTranslation = "LOC:" + this.FinalTerm;
  172. }
  173. this.mLocalizeTarget.DoLocalize(this, Localize.MainTranslation, Localize.SecondaryTranslation);
  174. Localize.CurrentLocalizeComponent = null;
  175. }
  176. public bool FindTarget()
  177. {
  178. if (this.mLocalizeTarget != null && this.mLocalizeTarget.IsValid(this))
  179. {
  180. return true;
  181. }
  182. if (this.mLocalizeTarget != null)
  183. {
  184. UnityEngine.Object.DestroyImmediate(this.mLocalizeTarget);
  185. this.mLocalizeTarget = null;
  186. this.mLocalizeTargetName = null;
  187. }
  188. if (!string.IsNullOrEmpty(this.mLocalizeTargetName))
  189. {
  190. foreach (ILocalizeTargetDescriptor localizeTargetDescriptor in LocalizationManager.mLocalizeTargets)
  191. {
  192. if (this.mLocalizeTargetName == localizeTargetDescriptor.GetTargetType().ToString())
  193. {
  194. if (localizeTargetDescriptor.CanLocalize(this))
  195. {
  196. this.mLocalizeTarget = localizeTargetDescriptor.CreateTarget(this);
  197. }
  198. if (this.mLocalizeTarget != null)
  199. {
  200. return true;
  201. }
  202. }
  203. }
  204. }
  205. foreach (ILocalizeTargetDescriptor localizeTargetDescriptor2 in LocalizationManager.mLocalizeTargets)
  206. {
  207. if (localizeTargetDescriptor2.CanLocalize(this))
  208. {
  209. this.mLocalizeTarget = localizeTargetDescriptor2.CreateTarget(this);
  210. this.mLocalizeTargetName = localizeTargetDescriptor2.GetTargetType().ToString();
  211. if (this.mLocalizeTarget != null)
  212. {
  213. return true;
  214. }
  215. }
  216. }
  217. return false;
  218. }
  219. public void GetFinalTerms(out string primaryTerm, out string secondaryTerm)
  220. {
  221. primaryTerm = string.Empty;
  222. secondaryTerm = string.Empty;
  223. if (!this.FindTarget())
  224. {
  225. return;
  226. }
  227. if (this.mLocalizeTarget != null)
  228. {
  229. this.mLocalizeTarget.GetFinalTerms(this, this.mTerm, this.mTermSecondary, out primaryTerm, out secondaryTerm);
  230. primaryTerm = I2Utils.RemoveNonASCII(primaryTerm, false);
  231. }
  232. if (!string.IsNullOrEmpty(this.mTerm))
  233. {
  234. primaryTerm = this.mTerm;
  235. }
  236. if (!string.IsNullOrEmpty(this.mTermSecondary))
  237. {
  238. secondaryTerm = this.mTermSecondary;
  239. }
  240. if (primaryTerm != null)
  241. {
  242. primaryTerm = primaryTerm.Trim();
  243. }
  244. if (secondaryTerm != null)
  245. {
  246. secondaryTerm = secondaryTerm.Trim();
  247. }
  248. }
  249. public string GetMainTargetsText()
  250. {
  251. string text = null;
  252. string text2 = null;
  253. if (this.mLocalizeTarget != null)
  254. {
  255. this.mLocalizeTarget.GetFinalTerms(this, null, null, out text, out text2);
  256. }
  257. return (!string.IsNullOrEmpty(text)) ? text : this.mTerm;
  258. }
  259. public void SetFinalTerms(string Main, string Secondary, out string primaryTerm, out string secondaryTerm, bool RemoveNonASCII)
  260. {
  261. primaryTerm = ((!RemoveNonASCII) ? Main : I2Utils.RemoveNonASCII(Main, false));
  262. secondaryTerm = Secondary;
  263. }
  264. public void SetTerm(string primary)
  265. {
  266. if (!string.IsNullOrEmpty(primary))
  267. {
  268. this.mTerm = primary;
  269. this.FinalTerm = primary;
  270. }
  271. this.OnLocalize(true);
  272. }
  273. public void SetTerm(string primary, string secondary)
  274. {
  275. if (!string.IsNullOrEmpty(primary))
  276. {
  277. this.mTerm = primary;
  278. this.FinalTerm = primary;
  279. }
  280. this.mTermSecondary = secondary;
  281. this.FinalSecondaryTerm = secondary;
  282. this.OnLocalize(true);
  283. }
  284. internal T GetSecondaryTranslatedObj<T>(ref string mainTranslation, ref string secondaryTranslation) where T : UnityEngine.Object
  285. {
  286. string text;
  287. string text2;
  288. this.DeserializeTranslation(mainTranslation, out text, out text2);
  289. T t = (T)((object)null);
  290. if (!string.IsNullOrEmpty(text2))
  291. {
  292. t = this.GetObject<T>(text2);
  293. if (t != null)
  294. {
  295. mainTranslation = text;
  296. secondaryTranslation = text2;
  297. }
  298. }
  299. if (t == null)
  300. {
  301. t = this.GetObject<T>(secondaryTranslation);
  302. }
  303. return t;
  304. }
  305. public void UpdateAssetDictionary()
  306. {
  307. this.TranslatedObjects.RemoveAll((UnityEngine.Object x) => x == null);
  308. this.mAssetDictionary = this.TranslatedObjects.Distinct<UnityEngine.Object>().ToDictionary((UnityEngine.Object o) => o.name);
  309. }
  310. internal T GetObject<T>(string Translation) where T : UnityEngine.Object
  311. {
  312. if (string.IsNullOrEmpty(Translation))
  313. {
  314. return (T)((object)null);
  315. }
  316. T translatedObject = this.GetTranslatedObject<T>(Translation);
  317. if (translatedObject == null)
  318. {
  319. translatedObject = this.GetTranslatedObject<T>(Translation);
  320. }
  321. return translatedObject;
  322. }
  323. private T GetTranslatedObject<T>(string Translation) where T : UnityEngine.Object
  324. {
  325. return this.FindTranslatedObject<T>(Translation);
  326. }
  327. private void DeserializeTranslation(string translation, out string value, out string secondary)
  328. {
  329. if (!string.IsNullOrEmpty(translation) && translation.Length > 1 && translation[0] == '[')
  330. {
  331. int num = translation.IndexOf(']');
  332. if (num > 0)
  333. {
  334. secondary = translation.Substring(1, num - 1);
  335. value = translation.Substring(num + 1);
  336. return;
  337. }
  338. }
  339. value = translation;
  340. secondary = string.Empty;
  341. }
  342. public T FindTranslatedObject<T>(string value) where T : UnityEngine.Object
  343. {
  344. if (string.IsNullOrEmpty(value))
  345. {
  346. return (T)((object)null);
  347. }
  348. if (this.mAssetDictionary == null || this.mAssetDictionary.Count != this.TranslatedObjects.Count)
  349. {
  350. this.UpdateAssetDictionary();
  351. }
  352. foreach (KeyValuePair<string, UnityEngine.Object> keyValuePair in this.mAssetDictionary)
  353. {
  354. if (keyValuePair.Value is T && value.EndsWith(keyValuePair.Key, StringComparison.OrdinalIgnoreCase) && string.Compare(value, keyValuePair.Key, StringComparison.OrdinalIgnoreCase) == 0)
  355. {
  356. return (T)((object)keyValuePair.Value);
  357. }
  358. }
  359. T t = LocalizationManager.FindAsset(value) as T;
  360. if (t)
  361. {
  362. return t;
  363. }
  364. return ResourceManager.pInstance.GetAsset<T>(value);
  365. }
  366. public bool HasTranslatedObject(UnityEngine.Object Obj)
  367. {
  368. return this.TranslatedObjects.Contains(Obj) || ResourceManager.pInstance.HasAsset(Obj);
  369. }
  370. public void AddTranslatedObject(UnityEngine.Object Obj)
  371. {
  372. if (this.TranslatedObjects.Contains(Obj))
  373. {
  374. return;
  375. }
  376. this.TranslatedObjects.Add(Obj);
  377. this.UpdateAssetDictionary();
  378. }
  379. public void SetGlobalLanguage(string Language)
  380. {
  381. LocalizationManager.CurrentLanguage = Language;
  382. }
  383. public string mTerm = string.Empty;
  384. public string mTermSecondary = string.Empty;
  385. public Localize.ArgsPair[] mTermArgs;
  386. [NonSerialized]
  387. public string FinalTerm;
  388. [NonSerialized]
  389. public string FinalSecondaryTerm;
  390. public Localize.TermModification PrimaryTermModifier;
  391. public Localize.TermModification SecondaryTermModifier;
  392. public string TermPrefix;
  393. public string TermSuffix;
  394. public bool LocalizeOnAwake = true;
  395. private string LastLocalizedLanguage;
  396. public bool IgnoreRTL;
  397. public int MaxCharactersInRTL;
  398. public bool IgnoreNumbersInRTL = true;
  399. public bool CorrectAlignmentForRTL = true;
  400. public bool ForceOverFlowShrink = true;
  401. public bool NotAdjustScale;
  402. public bool AddSpacesToJoinedLanguages;
  403. public List<UnityEngine.Object> TranslatedObjects = new List<UnityEngine.Object>();
  404. [NonSerialized]
  405. public Dictionary<string, UnityEngine.Object> mAssetDictionary = new Dictionary<string, UnityEngine.Object>(StringComparer.Ordinal);
  406. public UnityEvent LocalizeEvent = new UnityEvent();
  407. public static string MainTranslation;
  408. public static string SecondaryTranslation;
  409. public static string CallBackTerm;
  410. public static string CallBackSecondaryTerm;
  411. public static Localize CurrentLocalizeComponent;
  412. public bool AlwaysForceLocalize;
  413. [SerializeField]
  414. public EventCallback LocalizeCallBack = new EventCallback();
  415. public bool mGUI_ShowReferences;
  416. public bool mGUI_ShowTems = true;
  417. public bool mGUI_ShowCallback;
  418. public ILocalizeTarget mLocalizeTarget;
  419. public string mLocalizeTargetName;
  420. [Serializable]
  421. public struct ArgsPair
  422. {
  423. public static Localize.ArgsPair Create(string setText)
  424. {
  425. return new Localize.ArgsPair
  426. {
  427. text = setText,
  428. isTerm = false
  429. };
  430. }
  431. public static Localize.ArgsPair Create(string setText, bool setIsTerm)
  432. {
  433. return new Localize.ArgsPair
  434. {
  435. text = setText,
  436. isTerm = setIsTerm
  437. };
  438. }
  439. public string text;
  440. public bool isTerm;
  441. }
  442. public enum TermModification
  443. {
  444. DontModify,
  445. ToUpper,
  446. ToLower,
  447. ToUpperFirst,
  448. ToTitle
  449. }
  450. }
  451. }