LanguageData.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { director } from 'cc';
  2. export let _language = 'zh';
  3. export let ready: boolean = false;
  4. /**
  5. * 初始化
  6. * @param language
  7. */
  8. export function init(language: string) {
  9. ready = true;
  10. _language = language;
  11. }
  12. /**
  13. * 翻译数据
  14. * @param key
  15. */
  16. export function t(key: string) {
  17. const win: any = window;
  18. if (!win.languages) {
  19. return key;
  20. }
  21. const searcher = key.split('.');
  22. let data = win.languages[_language];
  23. for (let i = 0; i < searcher.length; i++) {
  24. data = data[searcher[i]];
  25. if (!data) {
  26. return '';
  27. }
  28. }
  29. return data || '';
  30. }
  31. export function updateSceneRenderers() { // very costly iterations
  32. const rootNodes = director.getScene()!.children;
  33. // walk all nodes with localize label and update
  34. const allLocalizedLabels: any[] = [];
  35. const allLocalizedSprites: any[] = [];
  36. const allLocalizedMaterial: any[] = [];
  37. for (let i = 0; i < rootNodes.length; ++i) {
  38. let labels = rootNodes[i].getComponentsInChildren('LocalizedLabel');
  39. Array.prototype.push.apply(allLocalizedLabels, labels);
  40. let sprites = rootNodes[i].getComponentsInChildren('LocalizedSprite');
  41. Array.prototype.push.apply(allLocalizedSprites, sprites);
  42. let meshs = rootNodes[i].getComponentsInChildren('LocalizedMaterial');
  43. Array.prototype.push.apply(allLocalizedMaterial, meshs);
  44. }
  45. for (let i = 0; i < allLocalizedLabels.length; ++i) {
  46. let label = allLocalizedLabels[i];
  47. if (!label.node.active) continue;
  48. label.updateLabel();
  49. }
  50. // walk all nodes with localize sprite and update
  51. for (let i = 0; i < allLocalizedSprites.length; ++i) {
  52. let sprite = allLocalizedSprites[i];
  53. if (!sprite.node.active) continue;
  54. sprite.updateSprite();
  55. }
  56. for (let i = 0; i < allLocalizedMaterial.length; ++i) {
  57. let mesh = allLocalizedMaterial[i];
  58. if (!mesh.node.active) continue;
  59. mesh.updateMat();
  60. }
  61. }
  62. // 供插件查询当前语言使用
  63. const win = window as any;
  64. win._languageData = {
  65. get language() {
  66. return _language;
  67. },
  68. init(lang: string) {
  69. init(lang);
  70. },
  71. updateSceneRenderers() {
  72. updateSceneRenderers();
  73. },
  74. };