@playcraft/adsdk 1.0.18-beta.3 → 1.0.18-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -532,6 +532,7 @@ function detectCandidates() {
532
532
  var SUPPORTED_LANG_CODES = [
533
533
  "en",
534
534
  "zh",
535
+ "zh-TW",
535
536
  "ja",
536
537
  "ko",
537
538
  "de",
@@ -548,9 +549,31 @@ var SUPPORTED_LANG_CODES = [
548
549
  "ms",
549
550
  "id"
550
551
  ];
552
+ var LANG_TAG_TO_I18N_CODE = {
553
+ // 简体中文 → zh
554
+ "zh": "zh",
555
+ "zh-cn": "zh",
556
+ "zh-sg": "zh",
557
+ "zh-my": "zh",
558
+ "zh-hans": "zh",
559
+ "zh-hans-cn": "zh",
560
+ "zh-hans-sg": "zh",
561
+ "zh-hans-my": "zh",
562
+ // 繁体中文 → zh-TW
563
+ "zh-tw": "zh-TW",
564
+ "zh-hk": "zh-TW",
565
+ "zh-mo": "zh-TW",
566
+ "zh-hant": "zh-TW",
567
+ "zh-hant-tw": "zh-TW",
568
+ "zh-hant-hk": "zh-TW",
569
+ "zh-hant-mo": "zh-TW"
570
+ };
551
571
  function normalizeLangTag(tag) {
552
572
  if (!tag || typeof tag !== "string") return void 0;
553
- const primary = tag.split(/[-_]/)[0].toLowerCase();
573
+ const lower = tag.toLowerCase();
574
+ const mapped = LANG_TAG_TO_I18N_CODE[lower];
575
+ if (mapped) return mapped;
576
+ const primary = lower.split(/[-_]/)[0];
554
577
  return SUPPORTED_LANG_CODES.indexOf(primary) >= 0 ? primary : void 0;
555
578
  }
556
579
  function getLanguageCode() {
@@ -561,97 +584,6 @@ function getLanguageCode() {
561
584
  }
562
585
  return "en";
563
586
  }
564
- var LANGUAGE_MAP = {
565
- // 英语
566
- "en": "EN",
567
- // 中文(简体)
568
- "zh": "CN_S",
569
- "zh-cn": "CN_S",
570
- "zh-sg": "CN_S",
571
- "zh-my": "CN_S",
572
- "zh-hans": "CN_S",
573
- "zh-hans-cn": "CN_S",
574
- "zh-hans-sg": "CN_S",
575
- "zh-hans-my": "CN_S",
576
- // 中文(繁体)
577
- "zh-tw": "CN_T",
578
- "zh-hk": "CN_T",
579
- "zh-mo": "CN_T",
580
- "zh-hant": "CN_T",
581
- "zh-hant-tw": "CN_T",
582
- "zh-hant-hk": "CN_T",
583
- "zh-hant-mo": "CN_T",
584
- // 德语
585
- "de": "DE",
586
- // 法语
587
- "fr": "FR",
588
- // 西班牙语
589
- "es": "ES",
590
- // 日语
591
- "ja": "JA",
592
- // 韩语
593
- "ko": "KO",
594
- // 葡萄牙语
595
- "pt": "PT",
596
- // 意大利语
597
- "it": "IT",
598
- // 印地语
599
- "hi": "HI",
600
- // 孟加拉语
601
- "bn": "BN",
602
- // 乌尔都语
603
- "ur": "UR",
604
- // 阿拉伯语
605
- "ar": "AR",
606
- // 土耳其语
607
- "tr": "TR",
608
- // 俄语
609
- "ru": "RU",
610
- // 马来语
611
- "ms": "MS",
612
- // 印尼语
613
- "id": "ID"
614
- };
615
- var SUPPORTED_PROJECT_LANGUAGES = /* @__PURE__ */ new Set([
616
- "EN",
617
- "CN_S",
618
- "CN_T",
619
- "DE",
620
- "FR",
621
- "ES",
622
- "JA",
623
- "KO",
624
- "PT",
625
- "IT",
626
- "HI",
627
- "BN",
628
- "UR",
629
- "AR",
630
- "TR",
631
- "RU",
632
- "MS",
633
- "IN",
634
- "ID"
635
- ]);
636
- function resolveLanguageTag(tag) {
637
- if (!tag || typeof tag !== "string") return void 0;
638
- const normalized = tag.trim();
639
- if (!normalized) return void 0;
640
- const projectCode = normalized.toUpperCase().replace(/-/g, "_");
641
- if (SUPPORTED_PROJECT_LANGUAGES.has(projectCode)) return projectCode;
642
- const lower = normalized.toLowerCase();
643
- if (LANGUAGE_MAP[lower]) return LANGUAGE_MAP[lower];
644
- const primary = lower.split(/[-_]/)[0];
645
- return LANGUAGE_MAP[primary];
646
- }
647
- function getLanguage() {
648
- const candidates = detectCandidates();
649
- for (const tag of candidates) {
650
- const code = resolveLanguageTag(tag);
651
- if (code) return code;
652
- }
653
- return "EN";
654
- }
655
587
 
656
588
  // src/theme-config.ts
657
589
  function extractDefaultsFromSchema(schema) {
@@ -671,13 +603,19 @@ function extractDefaultsFromSchema(schema) {
671
603
  }
672
604
  return void 0;
673
605
  }
606
+ var LANG_FALLBACK_MAP = {
607
+ // 繁体中文:优先查专用键,没有则回退通用简体,最后回退 en
608
+ "zh-TW": ["zh-TW", "zh", "en"]
609
+ };
674
610
  function lookupI18nRuntime(runtime, key, langCode) {
611
+ var _a;
675
612
  const map = runtime[key];
676
613
  if (!map || typeof map !== "object") return void 0;
677
- const val = map[langCode];
678
- if (val && val.length > 0) return val;
679
- const enVal = map["en"];
680
- if (enVal && enVal.length > 0) return enVal;
614
+ const fallbackChain = (_a = LANG_FALLBACK_MAP[langCode]) != null ? _a : [langCode, "en"];
615
+ for (const code of fallbackChain) {
616
+ const val = map[code];
617
+ if (val && val.length > 0) return val;
618
+ }
681
619
  return Object.values(map).find((v) => typeof v === "string" && v.length > 0);
682
620
  }
683
621
  function mergeI18nRuntimes(runtimes) {
@@ -1576,19 +1514,6 @@ var _sdk = class _sdk {
1576
1514
  static getLanguageCode() {
1577
1515
  return getLanguageCode();
1578
1516
  }
1579
- /**
1580
- * 获取当前用户语言的业务代号。
1581
- * 多源探测(querystring → localStorage → cookie → navigator → html tag),
1582
- * 并映射到业务语言代号(区分简繁中文)。
1583
- *
1584
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
1585
- *
1586
- * @example
1587
- * const lang = sdk.getLanguage(); // 'CN_S'
1588
- */
1589
- static getLanguage() {
1590
- return getLanguage();
1591
- }
1592
1517
  /**
1593
1518
  * 设置主题配置,支持传入多份 JSON5 配置。
1594
1519
  * 每一份配置都可以是 JSON Schema(带 $schema 字段),会自动提取其中的 default 值。
@@ -1651,7 +1576,7 @@ var _sdk = class _sdk {
1651
1576
  }
1652
1577
  };
1653
1578
  /** Current version of the SDK */
1654
- _sdk.version = "1.0.18-beta.3";
1579
+ _sdk.version = "1.0.18-beta.4";
1655
1580
  /** Current maximum width of the playable ad container in pixels */
1656
1581
  _sdk.maxWidth = Math.floor(window.innerWidth);
1657
1582
  /** Current maximum height of the playable ad container in pixels */
@@ -1681,7 +1606,6 @@ export {
1681
1606
  sdk as default,
1682
1607
  disableCustomCursor,
1683
1608
  enableCustomCursor,
1684
- getLanguage,
1685
1609
  getLanguageCode,
1686
1610
  hideWechatGuide,
1687
1611
  removeWechatGuide,
@@ -770,6 +770,7 @@
770
770
  var SUPPORTED_LANG_CODES = [
771
771
  "en",
772
772
  "zh",
773
+ "zh-TW",
773
774
  "ja",
774
775
  "ko",
775
776
  "de",
@@ -786,9 +787,31 @@
786
787
  "ms",
787
788
  "id"
788
789
  ];
790
+ var LANG_TAG_TO_I18N_CODE = {
791
+ // 简体中文 → zh
792
+ "zh": "zh",
793
+ "zh-cn": "zh",
794
+ "zh-sg": "zh",
795
+ "zh-my": "zh",
796
+ "zh-hans": "zh",
797
+ "zh-hans-cn": "zh",
798
+ "zh-hans-sg": "zh",
799
+ "zh-hans-my": "zh",
800
+ // 繁体中文 → zh-TW
801
+ "zh-tw": "zh-TW",
802
+ "zh-hk": "zh-TW",
803
+ "zh-mo": "zh-TW",
804
+ "zh-hant": "zh-TW",
805
+ "zh-hant-tw": "zh-TW",
806
+ "zh-hant-hk": "zh-TW",
807
+ "zh-hant-mo": "zh-TW"
808
+ };
789
809
  function normalizeLangTag(tag) {
790
810
  if (!tag || typeof tag !== "string") return void 0;
791
- const primary = tag.split(/[-_]/)[0].toLowerCase();
811
+ const lower = tag.toLowerCase();
812
+ const mapped = LANG_TAG_TO_I18N_CODE[lower];
813
+ if (mapped) return mapped;
814
+ const primary = lower.split(/[-_]/)[0];
792
815
  return SUPPORTED_LANG_CODES.indexOf(primary) >= 0 ? primary : void 0;
793
816
  }
794
817
  function getLanguageCode() {
@@ -799,97 +822,6 @@
799
822
  }
800
823
  return "en";
801
824
  }
802
- var LANGUAGE_MAP = {
803
- // 英语
804
- "en": "EN",
805
- // 中文(简体)
806
- "zh": "CN_S",
807
- "zh-cn": "CN_S",
808
- "zh-sg": "CN_S",
809
- "zh-my": "CN_S",
810
- "zh-hans": "CN_S",
811
- "zh-hans-cn": "CN_S",
812
- "zh-hans-sg": "CN_S",
813
- "zh-hans-my": "CN_S",
814
- // 中文(繁体)
815
- "zh-tw": "CN_T",
816
- "zh-hk": "CN_T",
817
- "zh-mo": "CN_T",
818
- "zh-hant": "CN_T",
819
- "zh-hant-tw": "CN_T",
820
- "zh-hant-hk": "CN_T",
821
- "zh-hant-mo": "CN_T",
822
- // 德语
823
- "de": "DE",
824
- // 法语
825
- "fr": "FR",
826
- // 西班牙语
827
- "es": "ES",
828
- // 日语
829
- "ja": "JA",
830
- // 韩语
831
- "ko": "KO",
832
- // 葡萄牙语
833
- "pt": "PT",
834
- // 意大利语
835
- "it": "IT",
836
- // 印地语
837
- "hi": "HI",
838
- // 孟加拉语
839
- "bn": "BN",
840
- // 乌尔都语
841
- "ur": "UR",
842
- // 阿拉伯语
843
- "ar": "AR",
844
- // 土耳其语
845
- "tr": "TR",
846
- // 俄语
847
- "ru": "RU",
848
- // 马来语
849
- "ms": "MS",
850
- // 印尼语
851
- "id": "ID"
852
- };
853
- var SUPPORTED_PROJECT_LANGUAGES = /* @__PURE__ */ new Set([
854
- "EN",
855
- "CN_S",
856
- "CN_T",
857
- "DE",
858
- "FR",
859
- "ES",
860
- "JA",
861
- "KO",
862
- "PT",
863
- "IT",
864
- "HI",
865
- "BN",
866
- "UR",
867
- "AR",
868
- "TR",
869
- "RU",
870
- "MS",
871
- "IN",
872
- "ID"
873
- ]);
874
- function resolveLanguageTag(tag) {
875
- if (!tag || typeof tag !== "string") return void 0;
876
- const normalized = tag.trim();
877
- if (!normalized) return void 0;
878
- const projectCode = normalized.toUpperCase().replace(/-/g, "_");
879
- if (SUPPORTED_PROJECT_LANGUAGES.has(projectCode)) return projectCode;
880
- const lower = normalized.toLowerCase();
881
- if (LANGUAGE_MAP[lower]) return LANGUAGE_MAP[lower];
882
- const primary = lower.split(/[-_]/)[0];
883
- return LANGUAGE_MAP[primary];
884
- }
885
- function getLanguage() {
886
- const candidates = detectCandidates();
887
- for (const tag of candidates) {
888
- const code = resolveLanguageTag(tag);
889
- if (code) return code;
890
- }
891
- return "EN";
892
- }
893
825
 
894
826
  // src/theme-config.ts
895
827
  function extractDefaultsFromSchema(schema) {
@@ -909,13 +841,19 @@
909
841
  }
910
842
  return void 0;
911
843
  }
844
+ var LANG_FALLBACK_MAP = {
845
+ // 繁体中文:优先查专用键,没有则回退通用简体,最后回退 en
846
+ "zh-TW": ["zh-TW", "zh", "en"]
847
+ };
912
848
  function lookupI18nRuntime(runtime, key, langCode) {
849
+ var _a;
913
850
  const map = runtime[key];
914
851
  if (!map || typeof map !== "object") return void 0;
915
- const val = map[langCode];
916
- if (val && val.length > 0) return val;
917
- const enVal = map["en"];
918
- if (enVal && enVal.length > 0) return enVal;
852
+ const fallbackChain = (_a = LANG_FALLBACK_MAP[langCode]) != null ? _a : [langCode, "en"];
853
+ for (const code of fallbackChain) {
854
+ const val = map[code];
855
+ if (val && val.length > 0) return val;
856
+ }
919
857
  return Object.values(map).find((v) => typeof v === "string" && v.length > 0);
920
858
  }
921
859
  function mergeI18nRuntimes(runtimes) {
@@ -1814,19 +1752,6 @@
1814
1752
  static getLanguageCode() {
1815
1753
  return getLanguageCode();
1816
1754
  }
1817
- /**
1818
- * 获取当前用户语言的业务代号。
1819
- * 多源探测(querystring → localStorage → cookie → navigator → html tag),
1820
- * 并映射到业务语言代号(区分简繁中文)。
1821
- *
1822
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
1823
- *
1824
- * @example
1825
- * const lang = sdk.getLanguage(); // 'CN_S'
1826
- */
1827
- static getLanguage() {
1828
- return getLanguage();
1829
- }
1830
1755
  /**
1831
1756
  * 设置主题配置,支持传入多份 JSON5 配置。
1832
1757
  * 每一份配置都可以是 JSON Schema(带 $schema 字段),会自动提取其中的 default 值。
@@ -1889,7 +1814,7 @@
1889
1814
  }
1890
1815
  };
1891
1816
  /** Current version of the SDK */
1892
- _sdk.version = "1.0.18-beta.3";
1817
+ _sdk.version = "1.0.18-beta.4";
1893
1818
  /** Current maximum width of the playable ad container in pixels */
1894
1819
  _sdk.maxWidth = Math.floor(window.innerWidth);
1895
1820
  /** Current maximum height of the playable ad container in pixels */
package/dist/index.d.mts CHANGED
@@ -276,17 +276,6 @@ declare class sdk {
276
276
  * const langCode = sdk.getLanguageCode(); // 'zh'
277
277
  */
278
278
  static getLanguageCode(): string;
279
- /**
280
- * 获取当前用户语言的业务代号。
281
- * 多源探测(querystring → localStorage → cookie → navigator → html tag),
282
- * 并映射到业务语言代号(区分简繁中文)。
283
- *
284
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
285
- *
286
- * @example
287
- * const lang = sdk.getLanguage(); // 'CN_S'
288
- */
289
- static getLanguage(): string;
290
279
  /**
291
280
  * 设置主题配置,支持传入多份 JSON5 配置。
292
281
  * 每一份配置都可以是 JSON Schema(带 $schema 字段),会自动提取其中的 default 值。
@@ -378,14 +367,8 @@ declare function removeWechatGuide(): void;
378
367
  /**
379
368
  * 多源探测当前用户语言,并归一化为 i18n 简码。
380
369
  *
381
- * @returns i18n 简码:en | zh | ja | ko | de | fr | es | pt | it | hi | bn | ur | ar | tr | ru | ms | id,默认 'en'
370
+ * @returns i18n 简码:en | zh | zh-TW | ja | ko | de | fr | es | pt | it | hi | bn | ur | ar | tr | ru | ms | id,默认 'en'
382
371
  */
383
372
  declare function getLanguageCode(): string;
384
- /**
385
- * 多源探测当前用户语言,返回业务语言代号。
386
- *
387
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
388
- */
389
- declare function getLanguage(): string;
390
373
 
391
- export { type CursorOptions, type I18nRecord, sdk as default, disableCustomCursor, enableCustomCursor, getLanguage, getLanguageCode, hideWechatGuide, removeWechatGuide, sdk, showWechatGuide };
374
+ export { type CursorOptions, type I18nRecord, sdk as default, disableCustomCursor, enableCustomCursor, getLanguageCode, hideWechatGuide, removeWechatGuide, sdk, showWechatGuide };
package/dist/index.d.ts CHANGED
@@ -276,17 +276,6 @@ declare class sdk {
276
276
  * const langCode = sdk.getLanguageCode(); // 'zh'
277
277
  */
278
278
  static getLanguageCode(): string;
279
- /**
280
- * 获取当前用户语言的业务代号。
281
- * 多源探测(querystring → localStorage → cookie → navigator → html tag),
282
- * 并映射到业务语言代号(区分简繁中文)。
283
- *
284
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
285
- *
286
- * @example
287
- * const lang = sdk.getLanguage(); // 'CN_S'
288
- */
289
- static getLanguage(): string;
290
279
  /**
291
280
  * 设置主题配置,支持传入多份 JSON5 配置。
292
281
  * 每一份配置都可以是 JSON Schema(带 $schema 字段),会自动提取其中的 default 值。
@@ -378,14 +367,8 @@ declare function removeWechatGuide(): void;
378
367
  /**
379
368
  * 多源探测当前用户语言,并归一化为 i18n 简码。
380
369
  *
381
- * @returns i18n 简码:en | zh | ja | ko | de | fr | es | pt | it | hi | bn | ur | ar | tr | ru | ms | id,默认 'en'
370
+ * @returns i18n 简码:en | zh | zh-TW | ja | ko | de | fr | es | pt | it | hi | bn | ur | ar | tr | ru | ms | id,默认 'en'
382
371
  */
383
372
  declare function getLanguageCode(): string;
384
- /**
385
- * 多源探测当前用户语言,返回业务语言代号。
386
- *
387
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
388
- */
389
- declare function getLanguage(): string;
390
373
 
391
- export { type CursorOptions, type I18nRecord, sdk as default, disableCustomCursor, enableCustomCursor, getLanguage, getLanguageCode, hideWechatGuide, removeWechatGuide, sdk, showWechatGuide };
374
+ export { type CursorOptions, type I18nRecord, sdk as default, disableCustomCursor, enableCustomCursor, getLanguageCode, hideWechatGuide, removeWechatGuide, sdk, showWechatGuide };
package/dist/index.js CHANGED
@@ -40,7 +40,6 @@ __export(index_exports, {
40
40
  default: () => sdk,
41
41
  disableCustomCursor: () => disableCustomCursor,
42
42
  enableCustomCursor: () => enableCustomCursor,
43
- getLanguage: () => getLanguage,
44
43
  getLanguageCode: () => getLanguageCode,
45
44
  hideWechatGuide: () => hideWechatGuide,
46
45
  removeWechatGuide: () => removeWechatGuide,
@@ -563,6 +562,7 @@ function detectCandidates() {
563
562
  var SUPPORTED_LANG_CODES = [
564
563
  "en",
565
564
  "zh",
565
+ "zh-TW",
566
566
  "ja",
567
567
  "ko",
568
568
  "de",
@@ -579,9 +579,31 @@ var SUPPORTED_LANG_CODES = [
579
579
  "ms",
580
580
  "id"
581
581
  ];
582
+ var LANG_TAG_TO_I18N_CODE = {
583
+ // 简体中文 → zh
584
+ "zh": "zh",
585
+ "zh-cn": "zh",
586
+ "zh-sg": "zh",
587
+ "zh-my": "zh",
588
+ "zh-hans": "zh",
589
+ "zh-hans-cn": "zh",
590
+ "zh-hans-sg": "zh",
591
+ "zh-hans-my": "zh",
592
+ // 繁体中文 → zh-TW
593
+ "zh-tw": "zh-TW",
594
+ "zh-hk": "zh-TW",
595
+ "zh-mo": "zh-TW",
596
+ "zh-hant": "zh-TW",
597
+ "zh-hant-tw": "zh-TW",
598
+ "zh-hant-hk": "zh-TW",
599
+ "zh-hant-mo": "zh-TW"
600
+ };
582
601
  function normalizeLangTag(tag) {
583
602
  if (!tag || typeof tag !== "string") return void 0;
584
- const primary = tag.split(/[-_]/)[0].toLowerCase();
603
+ const lower = tag.toLowerCase();
604
+ const mapped = LANG_TAG_TO_I18N_CODE[lower];
605
+ if (mapped) return mapped;
606
+ const primary = lower.split(/[-_]/)[0];
585
607
  return SUPPORTED_LANG_CODES.indexOf(primary) >= 0 ? primary : void 0;
586
608
  }
587
609
  function getLanguageCode() {
@@ -592,97 +614,6 @@ function getLanguageCode() {
592
614
  }
593
615
  return "en";
594
616
  }
595
- var LANGUAGE_MAP = {
596
- // 英语
597
- "en": "EN",
598
- // 中文(简体)
599
- "zh": "CN_S",
600
- "zh-cn": "CN_S",
601
- "zh-sg": "CN_S",
602
- "zh-my": "CN_S",
603
- "zh-hans": "CN_S",
604
- "zh-hans-cn": "CN_S",
605
- "zh-hans-sg": "CN_S",
606
- "zh-hans-my": "CN_S",
607
- // 中文(繁体)
608
- "zh-tw": "CN_T",
609
- "zh-hk": "CN_T",
610
- "zh-mo": "CN_T",
611
- "zh-hant": "CN_T",
612
- "zh-hant-tw": "CN_T",
613
- "zh-hant-hk": "CN_T",
614
- "zh-hant-mo": "CN_T",
615
- // 德语
616
- "de": "DE",
617
- // 法语
618
- "fr": "FR",
619
- // 西班牙语
620
- "es": "ES",
621
- // 日语
622
- "ja": "JA",
623
- // 韩语
624
- "ko": "KO",
625
- // 葡萄牙语
626
- "pt": "PT",
627
- // 意大利语
628
- "it": "IT",
629
- // 印地语
630
- "hi": "HI",
631
- // 孟加拉语
632
- "bn": "BN",
633
- // 乌尔都语
634
- "ur": "UR",
635
- // 阿拉伯语
636
- "ar": "AR",
637
- // 土耳其语
638
- "tr": "TR",
639
- // 俄语
640
- "ru": "RU",
641
- // 马来语
642
- "ms": "MS",
643
- // 印尼语
644
- "id": "ID"
645
- };
646
- var SUPPORTED_PROJECT_LANGUAGES = /* @__PURE__ */ new Set([
647
- "EN",
648
- "CN_S",
649
- "CN_T",
650
- "DE",
651
- "FR",
652
- "ES",
653
- "JA",
654
- "KO",
655
- "PT",
656
- "IT",
657
- "HI",
658
- "BN",
659
- "UR",
660
- "AR",
661
- "TR",
662
- "RU",
663
- "MS",
664
- "IN",
665
- "ID"
666
- ]);
667
- function resolveLanguageTag(tag) {
668
- if (!tag || typeof tag !== "string") return void 0;
669
- const normalized = tag.trim();
670
- if (!normalized) return void 0;
671
- const projectCode = normalized.toUpperCase().replace(/-/g, "_");
672
- if (SUPPORTED_PROJECT_LANGUAGES.has(projectCode)) return projectCode;
673
- const lower = normalized.toLowerCase();
674
- if (LANGUAGE_MAP[lower]) return LANGUAGE_MAP[lower];
675
- const primary = lower.split(/[-_]/)[0];
676
- return LANGUAGE_MAP[primary];
677
- }
678
- function getLanguage() {
679
- const candidates = detectCandidates();
680
- for (const tag of candidates) {
681
- const code = resolveLanguageTag(tag);
682
- if (code) return code;
683
- }
684
- return "EN";
685
- }
686
617
 
687
618
  // src/theme-config.ts
688
619
  function extractDefaultsFromSchema(schema) {
@@ -702,13 +633,19 @@ function extractDefaultsFromSchema(schema) {
702
633
  }
703
634
  return void 0;
704
635
  }
636
+ var LANG_FALLBACK_MAP = {
637
+ // 繁体中文:优先查专用键,没有则回退通用简体,最后回退 en
638
+ "zh-TW": ["zh-TW", "zh", "en"]
639
+ };
705
640
  function lookupI18nRuntime(runtime, key, langCode) {
641
+ var _a;
706
642
  const map = runtime[key];
707
643
  if (!map || typeof map !== "object") return void 0;
708
- const val = map[langCode];
709
- if (val && val.length > 0) return val;
710
- const enVal = map["en"];
711
- if (enVal && enVal.length > 0) return enVal;
644
+ const fallbackChain = (_a = LANG_FALLBACK_MAP[langCode]) != null ? _a : [langCode, "en"];
645
+ for (const code of fallbackChain) {
646
+ const val = map[code];
647
+ if (val && val.length > 0) return val;
648
+ }
712
649
  return Object.values(map).find((v) => typeof v === "string" && v.length > 0);
713
650
  }
714
651
  function mergeI18nRuntimes(runtimes) {
@@ -1607,19 +1544,6 @@ var _sdk = class _sdk {
1607
1544
  static getLanguageCode() {
1608
1545
  return getLanguageCode();
1609
1546
  }
1610
- /**
1611
- * 获取当前用户语言的业务代号。
1612
- * 多源探测(querystring → localStorage → cookie → navigator → html tag),
1613
- * 并映射到业务语言代号(区分简繁中文)。
1614
- *
1615
- * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
1616
- *
1617
- * @example
1618
- * const lang = sdk.getLanguage(); // 'CN_S'
1619
- */
1620
- static getLanguage() {
1621
- return getLanguage();
1622
- }
1623
1547
  /**
1624
1548
  * 设置主题配置,支持传入多份 JSON5 配置。
1625
1549
  * 每一份配置都可以是 JSON Schema(带 $schema 字段),会自动提取其中的 default 值。
@@ -1682,7 +1606,7 @@ var _sdk = class _sdk {
1682
1606
  }
1683
1607
  };
1684
1608
  /** Current version of the SDK */
1685
- _sdk.version = "1.0.18-beta.3";
1609
+ _sdk.version = "1.0.18-beta.4";
1686
1610
  /** Current maximum width of the playable ad container in pixels */
1687
1611
  _sdk.maxWidth = Math.floor(window.innerWidth);
1688
1612
  /** Current maximum height of the playable ad container in pixels */
@@ -1712,7 +1636,6 @@ window.PlayableSDK = sdk;
1712
1636
  0 && (module.exports = {
1713
1637
  disableCustomCursor,
1714
1638
  enableCustomCursor,
1715
- getLanguage,
1716
1639
  getLanguageCode,
1717
1640
  hideWechatGuide,
1718
1641
  removeWechatGuide,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcraft/adsdk",
3
- "version": "1.0.18-beta.3",
3
+ "version": "1.0.18-beta.4",
4
4
  "description": "统一的 Playable SDK,支持 MRAID、Google、Facebook、Vungle、BigoAds 等多广告渠道",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/esm/index.js",