@playcraft/adsdk 1.0.17 → 1.0.18-beta.2

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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025-present Smoud
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025-present Smoud
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/defines.d.ts CHANGED
@@ -1,130 +1,130 @@
1
- declare const mraid: {
2
- getVersion: () => string; // MRAID 规范必需:返回 MRAID 版本(如 "3.0")
3
- isReady: () => boolean;
4
- isViewable: () => boolean;
5
- getState: () => string;
6
- addEventListener: (
7
- event: 'viewableChange' | 'sizeChange' | 'ready' | 'audioVolumeChange' | 'stateChange' | 'error' | 'orientationChange' | 'resize',
8
- callback: (...args: any[]) => void
9
- ) => void;
10
- removeEventListener: (
11
- event: 'viewableChange' | 'sizeChange' | 'ready' | 'audioVolumeChange' | 'stateChange' | 'error' | 'orientationChange' | 'resize',
12
- callback: (...args: any[]) => void
13
- ) => void;
14
- getMaxSize: () => { width: number; height: number };
15
- openStoreUrl: () => void;
16
- open: (url: string) => void;
17
- close: () => void; // Unity Ads 必需:关闭广告
18
- getAudioVolume: () => number;
19
- fireTrackingEvent?: (event: string) => void; // Unity Ads 可选:跟踪事件
20
- preloadStore?: () => void;
21
- };
22
-
23
- declare const dapi: {
24
- addEventListener: (
25
- event: 'viewableChange' | 'adResized' | 'ready' | 'audioVolumeChange' | 'error',
26
- callback: (...args: any[]) => void
27
- ) => void;
28
- removeEventListener: (
29
- event: 'viewableChange' | 'adResized' | 'ready' | 'audioVolumeChange' | 'error',
30
- callback: (...args: any[]) => void
31
- ) => void;
32
- getScreenSize: () => { width: number; height: number };
33
- openStoreUrl: () => void;
34
- getAudioVolume: () => number;
35
- isViewable: () => boolean;
36
- isReady: () => boolean;
37
- };
38
-
39
- declare const NUC: {
40
- trigger: {
41
- convert: (destinationUrl: string) => void;
42
- tryAgain: Function;
43
- };
44
- };
45
-
46
- declare const ScPlayableAd: { onCTAClick: () => void };
47
-
48
- // Adikteev 占位符变量
49
- declare const AK_CLICK_DESTINATION_URL: string;
50
- declare const AK_CLICK_PIXEL_URL: string;
51
- declare const FbPlayableAd: { onCTAClick: () => void };
52
- declare const smxTracking: { redirect: () => void };
53
- declare const ExitApi: { exit: () => void };
54
-
55
- declare const AD_NETWORK:
56
- | 'preview'
57
- | 'applovin'
58
- | 'unity'
59
- | 'google'
60
- | 'ironsource'
61
- | 'facebook'
62
- | 'moloco'
63
- | 'mintegral'
64
- | 'vungle'
65
- | 'adcolony'
66
- | 'tapjoy'
67
- | 'snapchat'
68
- | 'tiktok'
69
- | 'appreciate'
70
- | 'chartboost'
71
- | 'pangle'
72
- | 'mytarget'
73
- | 'liftoff'
74
- | 'smadex'
75
- | 'adikteev'
76
- | 'bigabid'
77
- | 'inmobi'
78
- | 'bigoads';
79
-
80
- declare const AD_PROTOCOL: 'mraid' | 'dapi' | 'nucleo' | 'none';
81
- declare const GOOGLE_PLAY_URL: string;
82
- declare const APP_STORE_URL: string;
83
- declare const BUILD_HASH: string;
84
-
85
- interface Window {
86
- PlayableSDK: any;
87
- ADS_MRAID_CONFIG: {
88
- landUrl: string;
89
- };
90
-
91
- // AppLovin Playable Analytics
92
- // 文档: https://support.axon.ai/en/growth/promoting-your-apps/creatives/playable-analytics-integration
93
- ALPlayableAnalytics?: {
94
- trackEvent: (event: string) => void;
95
- };
96
-
97
- // BigoAds SDK
98
- // 文档: https://www.bigoads.com/help/detail?id=143&moduleId=7&currentLan=CN
99
- BGY_MRAID: {
100
- open: () => void; // 打开应用商店/推广地址
101
- gameReady: () => void; // 素材准备完毕时调用
102
- gameEnd: () => void; // 游戏结束时调用
103
- isViewable: () => boolean;
104
- addEventListener: (event: string, callback: (...args: any[]) => void) => void;
105
- removeEventListener: (event: string, callback: (...args: any[]) => void) => void;
106
- };
107
-
108
- // Mintegral functions
109
- gameReady: Function;
110
- gameEnd: Function;
111
- gameRetry: Function;
112
- install: Function;
113
- mintGameStart: Function;
114
- mintGameClose: Function;
115
-
116
- // Tapjoy functions
117
- TJ_API: {
118
- objectiveComplete: Function;
119
- playableFinished: Function;
120
- gameplayFinished: Function;
121
- setPlayableBuild: Function;
122
- setPlayableAPI: Function;
123
- click: Function;
124
- };
125
-
126
- BIGABID_BIDTIMEMACROS?: Record<string, string>
127
- INMOBI_DSPMACROS?: Record<string, string>
128
-
129
- openAppStore: Function;
130
- }
1
+ declare const mraid: {
2
+ getVersion: () => string; // MRAID 规范必需:返回 MRAID 版本(如 "3.0")
3
+ isReady: () => boolean;
4
+ isViewable: () => boolean;
5
+ getState: () => string;
6
+ addEventListener: (
7
+ event: 'viewableChange' | 'sizeChange' | 'ready' | 'audioVolumeChange' | 'stateChange' | 'error' | 'orientationChange' | 'resize',
8
+ callback: (...args: any[]) => void
9
+ ) => void;
10
+ removeEventListener: (
11
+ event: 'viewableChange' | 'sizeChange' | 'ready' | 'audioVolumeChange' | 'stateChange' | 'error' | 'orientationChange' | 'resize',
12
+ callback: (...args: any[]) => void
13
+ ) => void;
14
+ getMaxSize: () => { width: number; height: number };
15
+ openStoreUrl: () => void;
16
+ open: (url: string) => void;
17
+ close: () => void; // Unity Ads 必需:关闭广告
18
+ getAudioVolume: () => number;
19
+ fireTrackingEvent?: (event: string) => void; // Unity Ads 可选:跟踪事件
20
+ preloadStore?: () => void;
21
+ };
22
+
23
+ declare const dapi: {
24
+ addEventListener: (
25
+ event: 'viewableChange' | 'adResized' | 'ready' | 'audioVolumeChange' | 'error',
26
+ callback: (...args: any[]) => void
27
+ ) => void;
28
+ removeEventListener: (
29
+ event: 'viewableChange' | 'adResized' | 'ready' | 'audioVolumeChange' | 'error',
30
+ callback: (...args: any[]) => void
31
+ ) => void;
32
+ getScreenSize: () => { width: number; height: number };
33
+ openStoreUrl: () => void;
34
+ getAudioVolume: () => number;
35
+ isViewable: () => boolean;
36
+ isReady: () => boolean;
37
+ };
38
+
39
+ declare const NUC: {
40
+ trigger: {
41
+ convert: (destinationUrl: string) => void;
42
+ tryAgain: Function;
43
+ };
44
+ };
45
+
46
+ declare const ScPlayableAd: { onCTAClick: () => void };
47
+
48
+ // Adikteev 占位符变量
49
+ declare const AK_CLICK_DESTINATION_URL: string;
50
+ declare const AK_CLICK_PIXEL_URL: string;
51
+ declare const FbPlayableAd: { onCTAClick: () => void };
52
+ declare const smxTracking: { redirect: () => void };
53
+ declare const ExitApi: { exit: () => void };
54
+
55
+ declare const AD_NETWORK:
56
+ | 'preview'
57
+ | 'applovin'
58
+ | 'unity'
59
+ | 'google'
60
+ | 'ironsource'
61
+ | 'facebook'
62
+ | 'moloco'
63
+ | 'mintegral'
64
+ | 'vungle'
65
+ | 'adcolony'
66
+ | 'tapjoy'
67
+ | 'snapchat'
68
+ | 'tiktok'
69
+ | 'appreciate'
70
+ | 'chartboost'
71
+ | 'pangle'
72
+ | 'mytarget'
73
+ | 'liftoff'
74
+ | 'smadex'
75
+ | 'adikteev'
76
+ | 'bigabid'
77
+ | 'inmobi'
78
+ | 'bigoads';
79
+
80
+ declare const AD_PROTOCOL: 'mraid' | 'dapi' | 'nucleo' | 'none';
81
+ declare const GOOGLE_PLAY_URL: string;
82
+ declare const APP_STORE_URL: string;
83
+ declare const BUILD_HASH: string;
84
+
85
+ interface Window {
86
+ PlayableSDK: any;
87
+ ADS_MRAID_CONFIG: {
88
+ landUrl: string;
89
+ };
90
+
91
+ // AppLovin Playable Analytics
92
+ // 文档: https://support.axon.ai/en/growth/promoting-your-apps/creatives/playable-analytics-integration
93
+ ALPlayableAnalytics?: {
94
+ trackEvent: (event: string) => void;
95
+ };
96
+
97
+ // BigoAds SDK
98
+ // 文档: https://www.bigoads.com/help/detail?id=143&moduleId=7&currentLan=CN
99
+ BGY_MRAID: {
100
+ open: () => void; // 打开应用商店/推广地址
101
+ gameReady: () => void; // 素材准备完毕时调用
102
+ gameEnd: () => void; // 游戏结束时调用
103
+ isViewable: () => boolean;
104
+ addEventListener: (event: string, callback: (...args: any[]) => void) => void;
105
+ removeEventListener: (event: string, callback: (...args: any[]) => void) => void;
106
+ };
107
+
108
+ // Mintegral functions
109
+ gameReady: Function;
110
+ gameEnd: Function;
111
+ gameRetry: Function;
112
+ install: Function;
113
+ mintGameStart: Function;
114
+ mintGameClose: Function;
115
+
116
+ // Tapjoy functions
117
+ TJ_API: {
118
+ objectiveComplete: Function;
119
+ playableFinished: Function;
120
+ gameplayFinished: Function;
121
+ setPlayableBuild: Function;
122
+ setPlayableAPI: Function;
123
+ click: Function;
124
+ };
125
+
126
+ BIGABID_BIDTIMEMACROS?: Record<string, string>
127
+ INMOBI_DSPMACROS?: Record<string, string>
128
+
129
+ openAppStore: Function;
130
+ }
package/dist/esm/index.js CHANGED
@@ -443,6 +443,196 @@ function removeWechatGuide() {
443
443
  }
444
444
  }
445
445
 
446
+ // src/language.ts
447
+ function readQuerystring(key) {
448
+ try {
449
+ if (typeof window === "undefined" || !window.location) return void 0;
450
+ const search = window.location.search || "";
451
+ if (!search) return void 0;
452
+ if (typeof URLSearchParams !== "undefined") {
453
+ const params = new URLSearchParams(search);
454
+ return params.get(key) || void 0;
455
+ }
456
+ const re = new RegExp("[?&]" + key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "=([^&#]*)");
457
+ const m = re.exec(search);
458
+ return m ? decodeURIComponent(m[1]) : void 0;
459
+ } catch (e) {
460
+ return void 0;
461
+ }
462
+ }
463
+ function readLocalStorage(key) {
464
+ try {
465
+ if (typeof localStorage === "undefined") return void 0;
466
+ return localStorage.getItem(key) || void 0;
467
+ } catch (e) {
468
+ return void 0;
469
+ }
470
+ }
471
+ function readCookie(name) {
472
+ try {
473
+ if (typeof document === "undefined" || !document.cookie) return void 0;
474
+ const re = new RegExp("(?:^|; )" + name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "=([^;]*)");
475
+ const m = re.exec(document.cookie);
476
+ return m ? decodeURIComponent(m[1]) : void 0;
477
+ } catch (e) {
478
+ return void 0;
479
+ }
480
+ }
481
+ function readNavigatorLanguages() {
482
+ try {
483
+ if (typeof navigator === "undefined") return [];
484
+ const list = [];
485
+ const langs = navigator.languages;
486
+ if (Array.isArray(langs)) list.push(...langs);
487
+ if (navigator.language) list.push(navigator.language);
488
+ const userLang = navigator.userLanguage || navigator.browserLanguage;
489
+ if (userLang) list.push(userLang);
490
+ return list.filter(Boolean);
491
+ } catch (e) {
492
+ return [];
493
+ }
494
+ }
495
+ function readHtmlTag() {
496
+ try {
497
+ if (typeof document === "undefined" || !document.documentElement) return void 0;
498
+ return document.documentElement.lang || void 0;
499
+ } catch (e) {
500
+ return void 0;
501
+ }
502
+ }
503
+ function detectCandidates() {
504
+ return [
505
+ readQuerystring("lng"),
506
+ readLocalStorage("i18nextLng"),
507
+ readCookie("i18next"),
508
+ ...readNavigatorLanguages(),
509
+ readHtmlTag()
510
+ ];
511
+ }
512
+ var SUPPORTED_LANG_CODES = [
513
+ "en",
514
+ "zh",
515
+ "ja",
516
+ "ko",
517
+ "de",
518
+ "fr",
519
+ "es",
520
+ "pt",
521
+ "it",
522
+ "hi",
523
+ "bn",
524
+ "ur",
525
+ "ar",
526
+ "tr",
527
+ "ru",
528
+ "ms",
529
+ "id"
530
+ ];
531
+ function normalizeLangTag(tag) {
532
+ if (!tag || typeof tag !== "string") return void 0;
533
+ const primary = tag.split(/[-_]/)[0].toLowerCase();
534
+ return SUPPORTED_LANG_CODES.indexOf(primary) >= 0 ? primary : void 0;
535
+ }
536
+ function getLanguageCode() {
537
+ const candidates = detectCandidates();
538
+ for (const tag of candidates) {
539
+ const code = normalizeLangTag(tag);
540
+ if (code) return code;
541
+ }
542
+ return "en";
543
+ }
544
+ var LANGUAGE_MAP = {
545
+ // 英语
546
+ "en": "EN",
547
+ // 中文(简体)
548
+ "zh": "CN_S",
549
+ "zh-cn": "CN_S",
550
+ "zh-sg": "CN_S",
551
+ "zh-my": "CN_S",
552
+ "zh-hans": "CN_S",
553
+ "zh-hans-cn": "CN_S",
554
+ "zh-hans-sg": "CN_S",
555
+ "zh-hans-my": "CN_S",
556
+ // 中文(繁体)
557
+ "zh-tw": "CN_T",
558
+ "zh-hk": "CN_T",
559
+ "zh-mo": "CN_T",
560
+ "zh-hant": "CN_T",
561
+ "zh-hant-tw": "CN_T",
562
+ "zh-hant-hk": "CN_T",
563
+ "zh-hant-mo": "CN_T",
564
+ // 德语
565
+ "de": "DE",
566
+ // 法语
567
+ "fr": "FR",
568
+ // 西班牙语
569
+ "es": "ES",
570
+ // 日语
571
+ "ja": "JA",
572
+ // 韩语
573
+ "ko": "KO",
574
+ // 葡萄牙语
575
+ "pt": "PT",
576
+ // 意大利语
577
+ "it": "IT",
578
+ // 印地语
579
+ "hi": "HI",
580
+ // 孟加拉语
581
+ "bn": "BN",
582
+ // 乌尔都语
583
+ "ur": "UR",
584
+ // 阿拉伯语
585
+ "ar": "AR",
586
+ // 土耳其语
587
+ "tr": "TR",
588
+ // 俄语
589
+ "ru": "RU",
590
+ // 马来语
591
+ "ms": "MS",
592
+ // 印尼语
593
+ "id": "ID"
594
+ };
595
+ var SUPPORTED_PROJECT_LANGUAGES = /* @__PURE__ */ new Set([
596
+ "EN",
597
+ "CN_S",
598
+ "CN_T",
599
+ "DE",
600
+ "FR",
601
+ "ES",
602
+ "JA",
603
+ "KO",
604
+ "PT",
605
+ "IT",
606
+ "HI",
607
+ "BN",
608
+ "UR",
609
+ "AR",
610
+ "TR",
611
+ "RU",
612
+ "MS",
613
+ "IN",
614
+ "ID"
615
+ ]);
616
+ function resolveLanguageTag(tag) {
617
+ if (!tag || typeof tag !== "string") return void 0;
618
+ const normalized = tag.trim();
619
+ if (!normalized) return void 0;
620
+ const projectCode = normalized.toUpperCase().replace(/-/g, "_");
621
+ if (SUPPORTED_PROJECT_LANGUAGES.has(projectCode)) return projectCode;
622
+ const lower = normalized.toLowerCase();
623
+ if (LANGUAGE_MAP[lower]) return LANGUAGE_MAP[lower];
624
+ const primary = lower.split(/[-_]/)[0];
625
+ return LANGUAGE_MAP[primary];
626
+ }
627
+ function getLanguage() {
628
+ const candidates = detectCandidates();
629
+ for (const tag of candidates) {
630
+ const code = resolveLanguageTag(tag);
631
+ if (code) return code;
632
+ }
633
+ return "EN";
634
+ }
635
+
446
636
  // src/theme-config.ts
447
637
  function extractDefaultsFromSchema(schema) {
448
638
  if (!schema || typeof schema !== "object") return void 0;
@@ -461,6 +651,31 @@ function extractDefaultsFromSchema(schema) {
461
651
  }
462
652
  return void 0;
463
653
  }
654
+ function lookupI18nRuntime(runtime, key, langCode) {
655
+ var _a, _b;
656
+ const map = runtime[key];
657
+ if (!map || typeof map !== "object") return void 0;
658
+ return (_b = (_a = map[langCode]) != null ? _a : map["en"]) != null ? _b : Object.values(map)[0];
659
+ }
660
+ function resolveI18nRefs(config, i18nRecord, langCode) {
661
+ var _a;
662
+ if (!config || typeof config !== "object" || Array.isArray(config)) return;
663
+ const runtime = (_a = i18nRecord.runtime) != null ? _a : {};
664
+ for (const key of Object.keys(config)) {
665
+ const value = config[key];
666
+ if (typeof value === "string") {
667
+ if (value.startsWith("i18n.runtime.")) {
668
+ const i18nKey = value.slice("i18n.runtime.".length);
669
+ const resolved = lookupI18nRuntime(runtime, i18nKey, langCode);
670
+ if (resolved !== void 0) {
671
+ config[key] = resolved;
672
+ }
673
+ }
674
+ } else if (value !== null && typeof value === "object" && !Array.isArray(value)) {
675
+ resolveI18nRefs(value, i18nRecord, langCode);
676
+ }
677
+ }
678
+ }
464
679
  function resolveImagePaths(config, assetRecordByPath) {
465
680
  if (!assetRecordByPath || !config || typeof config !== "object") return;
466
681
  for (const key of Object.keys(config)) {
@@ -488,7 +703,7 @@ function deepMerge(target, source) {
488
703
  return target;
489
704
  }
490
705
  function setConfig(configList, config) {
491
- const { assetRecordByPath } = config;
706
+ const { assetRecordByPath, i18nRecord } = config;
492
707
  const resolvedConfigs = configList.map((item) => {
493
708
  var _a;
494
709
  if (!item) return {};
@@ -499,6 +714,11 @@ function setConfig(configList, config) {
499
714
  for (const data of rest) {
500
715
  deepMerge(mergedConfig, data);
501
716
  }
717
+ if (i18nRecord) {
718
+ const langCode = getLanguageCode();
719
+ console.log("detect target langCode", langCode);
720
+ resolveI18nRefs(mergedConfig, i18nRecord, langCode);
721
+ }
502
722
  resolveImagePaths(mergedConfig, assetRecordByPath);
503
723
  _cachedConfig = mergedConfig;
504
724
  }
@@ -1302,6 +1522,31 @@ var _sdk = class _sdk {
1302
1522
  static isGoogle() {
1303
1523
  return _sdk.getCurChannel() === "google";
1304
1524
  }
1525
+ /**
1526
+ * 获取当前用户语言的 i18n 简码。
1527
+ * 多源探测(querystring → localStorage → cookie → navigator → html tag)。
1528
+ *
1529
+ * @returns i18n 简码:en | zh | ja | ko | de | fr | es | pt | it | hi | bn | ur | ar | tr | ru | ms | id,默认 'en'
1530
+ *
1531
+ * @example
1532
+ * const langCode = sdk.getLanguageCode(); // 'zh'
1533
+ */
1534
+ static getLanguageCode() {
1535
+ return getLanguageCode();
1536
+ }
1537
+ /**
1538
+ * 获取当前用户语言的业务代号。
1539
+ * 多源探测(querystring → localStorage → cookie → navigator → html tag),
1540
+ * 并映射到业务语言代号(区分简繁中文)。
1541
+ *
1542
+ * @returns 业务代号:EN | CN_S | CN_T | DE | FR | ES | JA | KO | PT | IT | HI | BN | UR | AR | TR | RU | MS | IN | ID,默认 'EN'
1543
+ *
1544
+ * @example
1545
+ * const lang = sdk.getLanguage(); // 'CN_S'
1546
+ */
1547
+ static getLanguage() {
1548
+ return getLanguage();
1549
+ }
1305
1550
  /**
1306
1551
  * 设置主题配置,支持传入多份 JSON5 配置。
1307
1552
  * 每一份配置都可以是 JSON Schema(带 $schema 字段),会自动提取其中的 default 值。
@@ -1364,7 +1609,7 @@ var _sdk = class _sdk {
1364
1609
  }
1365
1610
  };
1366
1611
  /** Current version of the SDK */
1367
- _sdk.version = "1.0.17";
1612
+ _sdk.version = "1.0.18-beta.2";
1368
1613
  /** Current maximum width of the playable ad container in pixels */
1369
1614
  _sdk.maxWidth = Math.floor(window.innerWidth);
1370
1615
  /** Current maximum height of the playable ad container in pixels */
@@ -1394,6 +1639,8 @@ export {
1394
1639
  sdk as default,
1395
1640
  disableCustomCursor,
1396
1641
  enableCustomCursor,
1642
+ getLanguage,
1643
+ getLanguageCode,
1397
1644
  hideWechatGuide,
1398
1645
  removeWechatGuide,
1399
1646
  sdk,