@monetize.software/sdk-extension 0.1.0-alpha.0 → 3.0.0-alpha.10

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.
Files changed (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -56
  3. package/dist/chunks/ar-7cgIM-Vl.js +2 -0
  4. package/dist/chunks/ar-7cgIM-Vl.js.map +1 -0
  5. package/dist/chunks/ar-B2Wg_IrC.js +126 -0
  6. package/dist/chunks/ar-B2Wg_IrC.js.map +1 -0
  7. package/dist/chunks/{chrome-port-BXHR4SOG.js → chrome-port-CB1NEZOC.js} +367 -216
  8. package/dist/chunks/chrome-port-CB1NEZOC.js.map +1 -0
  9. package/dist/chunks/chrome-port-DptrBLez.js +2 -0
  10. package/dist/chunks/chrome-port-DptrBLez.js.map +1 -0
  11. package/dist/chunks/cs-BNo9Dx0Q.js +122 -0
  12. package/dist/chunks/cs-BNo9Dx0Q.js.map +1 -0
  13. package/dist/chunks/cs-S05PC5AC.js +2 -0
  14. package/dist/chunks/cs-S05PC5AC.js.map +1 -0
  15. package/dist/chunks/da-Bi4zBG14.js +2 -0
  16. package/dist/chunks/da-Bi4zBG14.js.map +1 -0
  17. package/dist/chunks/da-Do9Lq6En.js +122 -0
  18. package/dist/chunks/da-Do9Lq6En.js.map +1 -0
  19. package/dist/chunks/de-C8pDZNvx.js +141 -0
  20. package/dist/chunks/de-C8pDZNvx.js.map +1 -0
  21. package/dist/chunks/de-nCDB6D2W.js +2 -0
  22. package/dist/chunks/de-nCDB6D2W.js.map +1 -0
  23. package/dist/chunks/el-BrKaa978.js +2 -0
  24. package/dist/chunks/el-BrKaa978.js.map +1 -0
  25. package/dist/chunks/el-DzMNX-_P.js +126 -0
  26. package/dist/chunks/el-DzMNX-_P.js.map +1 -0
  27. package/dist/chunks/es-B-Wtyzrl.js +2 -0
  28. package/dist/chunks/es-B-Wtyzrl.js.map +1 -0
  29. package/dist/chunks/es-YrKt-q4w.js +141 -0
  30. package/dist/chunks/es-YrKt-q4w.js.map +1 -0
  31. package/dist/chunks/fi-Bh44pwZ4.js +122 -0
  32. package/dist/chunks/fi-Bh44pwZ4.js.map +1 -0
  33. package/dist/chunks/fi-D1SGXjnO.js +2 -0
  34. package/dist/chunks/fi-D1SGXjnO.js.map +1 -0
  35. package/dist/chunks/fr-Bc0pw4ws.js +141 -0
  36. package/dist/chunks/fr-Bc0pw4ws.js.map +1 -0
  37. package/dist/chunks/fr-BhYf-iKk.js +2 -0
  38. package/dist/chunks/fr-BhYf-iKk.js.map +1 -0
  39. package/dist/chunks/he-BXAaFv6Y.js +2 -0
  40. package/dist/chunks/he-BXAaFv6Y.js.map +1 -0
  41. package/dist/chunks/he-Bfm-bhe3.js +126 -0
  42. package/dist/chunks/he-Bfm-bhe3.js.map +1 -0
  43. package/dist/chunks/hi-D-O-B9Dn.js +126 -0
  44. package/dist/chunks/hi-D-O-B9Dn.js.map +1 -0
  45. package/dist/chunks/hi-xblDO0O7.js +2 -0
  46. package/dist/chunks/hi-xblDO0O7.js.map +1 -0
  47. package/dist/chunks/hu-CmIuAbLL.js +122 -0
  48. package/dist/chunks/hu-CmIuAbLL.js.map +1 -0
  49. package/dist/chunks/hu-Wa46p0y4.js +2 -0
  50. package/dist/chunks/hu-Wa46p0y4.js.map +1 -0
  51. package/dist/chunks/id-CQEo5X94.js +2 -0
  52. package/dist/chunks/id-CQEo5X94.js.map +1 -0
  53. package/dist/chunks/id-DN7IES-A.js +122 -0
  54. package/dist/chunks/id-DN7IES-A.js.map +1 -0
  55. package/dist/chunks/it-8AYCm0xz.js +2 -0
  56. package/dist/chunks/it-8AYCm0xz.js.map +1 -0
  57. package/dist/chunks/it-Cz5Nmqx5.js +141 -0
  58. package/dist/chunks/it-Cz5Nmqx5.js.map +1 -0
  59. package/dist/chunks/ja-BH9BlBh2.js +145 -0
  60. package/dist/chunks/ja-BH9BlBh2.js.map +1 -0
  61. package/dist/chunks/ja-q-COVayn.js +2 -0
  62. package/dist/chunks/ja-q-COVayn.js.map +1 -0
  63. package/dist/chunks/ko-B6HRCscZ.js +2 -0
  64. package/dist/chunks/ko-B6HRCscZ.js.map +1 -0
  65. package/dist/chunks/ko-CYV9QuYs.js +145 -0
  66. package/dist/chunks/ko-CYV9QuYs.js.map +1 -0
  67. package/dist/chunks/nl-BvkB900D.js +141 -0
  68. package/dist/chunks/nl-BvkB900D.js.map +1 -0
  69. package/dist/chunks/nl-CAd6_xlm.js +2 -0
  70. package/dist/chunks/nl-CAd6_xlm.js.map +1 -0
  71. package/dist/chunks/no-3s9_ormb.js +122 -0
  72. package/dist/chunks/no-3s9_ormb.js.map +1 -0
  73. package/dist/chunks/no-CAmz6bz6.js +2 -0
  74. package/dist/chunks/no-CAmz6bz6.js.map +1 -0
  75. package/dist/chunks/pl-C9WTGQtb.js +122 -0
  76. package/dist/chunks/pl-C9WTGQtb.js.map +1 -0
  77. package/dist/chunks/pl-DqUSTCaF.js +2 -0
  78. package/dist/chunks/pl-DqUSTCaF.js.map +1 -0
  79. package/dist/chunks/port-name-CF4WQQ3-.js +2 -0
  80. package/dist/chunks/port-name-CF4WQQ3-.js.map +1 -0
  81. package/dist/chunks/port-name-ervLBWAQ.js +6 -0
  82. package/dist/chunks/port-name-ervLBWAQ.js.map +1 -0
  83. package/dist/chunks/pt-8ARZnH0_.js +2 -0
  84. package/dist/chunks/pt-8ARZnH0_.js.map +1 -0
  85. package/dist/chunks/pt-uFVUv_Op.js +141 -0
  86. package/dist/chunks/pt-uFVUv_Op.js.map +1 -0
  87. package/dist/chunks/ro-BrqQ8Au-.js +122 -0
  88. package/dist/chunks/ro-BrqQ8Au-.js.map +1 -0
  89. package/dist/chunks/ro-D-NMbp2F.js +2 -0
  90. package/dist/chunks/ro-D-NMbp2F.js.map +1 -0
  91. package/dist/chunks/ru-8gbHPh0g.js +2 -0
  92. package/dist/chunks/ru-8gbHPh0g.js.map +1 -0
  93. package/dist/chunks/ru-DK594dA8.js +144 -0
  94. package/dist/chunks/ru-DK594dA8.js.map +1 -0
  95. package/dist/chunks/sv-CHNH8-mq.js +122 -0
  96. package/dist/chunks/sv-CHNH8-mq.js.map +1 -0
  97. package/dist/chunks/sv-D8a8hmx9.js +2 -0
  98. package/dist/chunks/sv-D8a8hmx9.js.map +1 -0
  99. package/dist/chunks/th-DfjUK0Y7.js +2 -0
  100. package/dist/chunks/th-DfjUK0Y7.js.map +1 -0
  101. package/dist/chunks/th-l24Pm5q-.js +126 -0
  102. package/dist/chunks/th-l24Pm5q-.js.map +1 -0
  103. package/dist/chunks/tr-ADpigSY5.js +122 -0
  104. package/dist/chunks/tr-ADpigSY5.js.map +1 -0
  105. package/dist/chunks/tr-BdBpz4tL.js +2 -0
  106. package/dist/chunks/tr-BdBpz4tL.js.map +1 -0
  107. package/dist/chunks/uk-CGqo4jek.js +144 -0
  108. package/dist/chunks/uk-CGqo4jek.js.map +1 -0
  109. package/dist/chunks/uk-Cx1zv1ao.js +2 -0
  110. package/dist/chunks/uk-Cx1zv1ao.js.map +1 -0
  111. package/dist/chunks/vi-Dk9bTu6f.js +122 -0
  112. package/dist/chunks/vi-Dk9bTu6f.js.map +1 -0
  113. package/dist/chunks/vi-oe2dW21I.js +2 -0
  114. package/dist/chunks/vi-oe2dW21I.js.map +1 -0
  115. package/dist/chunks/zh-CwczPMPp.js +2 -0
  116. package/dist/chunks/zh-CwczPMPp.js.map +1 -0
  117. package/dist/chunks/zh-LDkEV2D9.js +145 -0
  118. package/dist/chunks/zh-LDkEV2D9.js.map +1 -0
  119. package/dist/content/RemoteAuthClient.d.ts +8 -4
  120. package/dist/content/RemoteAuthClient.d.ts.map +1 -1
  121. package/dist/content/RemoteAuthClient.test-d.d.ts +2 -0
  122. package/dist/content/RemoteAuthClient.test-d.d.ts.map +1 -0
  123. package/dist/content/RemoteBillingClient.d.ts +29 -0
  124. package/dist/content/RemoteBillingClient.d.ts.map +1 -1
  125. package/dist/content/RemoteBillingClient.test-d.d.ts +2 -0
  126. package/dist/content/RemoteBillingClient.test-d.d.ts.map +1 -0
  127. package/dist/content.cjs +3 -3
  128. package/dist/content.cjs.map +1 -1
  129. package/dist/content.js +2106 -1040
  130. package/dist/content.js.map +1 -1
  131. package/dist/offscreen/server.d.ts.map +1 -1
  132. package/dist/offscreen.cjs +1 -1
  133. package/dist/offscreen.cjs.map +1 -1
  134. package/dist/offscreen.js +18 -15
  135. package/dist/offscreen.js.map +1 -1
  136. package/dist/shared/messages.d.ts +27 -4
  137. package/dist/shared/messages.d.ts.map +1 -1
  138. package/dist/shared/port-name.d.ts +1 -0
  139. package/dist/shared/port-name.d.ts.map +1 -1
  140. package/dist/shared/protocol.d.ts +1 -1
  141. package/dist/shared/protocol.d.ts.map +1 -1
  142. package/dist/sw.cjs +1 -1
  143. package/dist/sw.cjs.map +1 -1
  144. package/dist/sw.js +14 -14
  145. package/dist/sw.js.map +1 -1
  146. package/package.json +39 -21
  147. package/dist/chunks/chrome-port-BXHR4SOG.js.map +0 -1
  148. package/dist/chunks/chrome-port-EtYqHf3p.js +0 -2
  149. package/dist/chunks/chrome-port-EtYqHf3p.js.map +0 -1
  150. package/dist/chunks/port-name-BPfQKtdb.js +0 -5
  151. package/dist/chunks/port-name-BPfQKtdb.js.map +0 -1
  152. package/dist/chunks/port-name-qwB109u9.js +0 -2
  153. package/dist/chunks/port-name-qwB109u9.js.map +0 -1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 monetize.software
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/README.md CHANGED
@@ -1,14 +1,17 @@
1
1
  # @monetize.software/sdk-extension
2
2
 
3
- SDK для Chrome-расширений. Один offscreen-документ держит BillingClient,
4
- AuthClient, EventTracker — единственный source of truth для всех вкладок,
5
- popup'ов, side-panel'ов и extension-страниц расширения.
3
+ SDK for Chrome extensions. A single offscreen document holds the BillingClient,
4
+ AuthClient and EventTracker — the single source of truth for all tabs, popups,
5
+ side panels, and extension pages.
6
6
 
7
- Public API content-script **drop-in совместим** с `@monetize.software/sdk` —
8
- host пишет `import { PaywallUI } from '@monetize.software/sdk-extension'` и получает
9
- тот же класс, тот же метод-сет.
7
+ The content-script public API is **drop-in compatible** with `@monetize.software/sdk` —
8
+ the host writes `import { PaywallUI } from '@monetize.software/sdk-extension'` and
9
+ gets the same class with the same method set.
10
10
 
11
- ## Архитектура
11
+ > ⚠️ **Bundle as an npm dependency. Do not load from a CDN.**
12
+ > Chrome Web Store [MV3 policy](https://developer.chrome.com/docs/webstore/program-policies/mv3-requirements) forbids remote code execution — every line of JS your extension runs must be reviewable at submission time and ship inside the extension package. `pnpm add @monetize.software/sdk-extension` and bundle it with Vite/Rollup/webpack like any other npm dep. Loading this package (or `@monetize.software/sdk`, or `@monetize.software/sdk-react`) from `esm.sh`/`unpkg`/`jsDelivr` from a content script, popup, or service worker will get the extension rejected by review, or removed retroactively if the policy violation is spotted later. This is also why we publish `sdk-extension` as a separate package — its content-script bundle has all dependencies inlined, no runtime fetch of code.
13
+
14
+ ## Architecture
12
15
 
13
16
  ```
14
17
  content script (per tab) ──port──▶ service worker ──port──▶ offscreen
@@ -19,23 +22,15 @@ content script (per tab) ──port──▶ service worker ──port──▶
19
22
  UserWatcher
20
23
  ```
21
24
 
22
- - **content-script:** UI + RemoteBillingClient (proxy через port в offscreen).
23
- - **service worker:** маршрутизатор content↔offscreen, OAuth-флоу через
24
- `chrome.identity` (offscreen его не видит).
25
- - **offscreen:** реальный SDK state, переживает закрытие вкладок, единственная
26
- точка координации auth-refresh / trial-counter / analytics-batch.
27
-
28
- ## Статус
29
-
30
- Phase 0 — скелет: package.json, vite multi-entry, wire-protocol типы,
31
- заглушки на content/offscreen/sw + demo-extension манифест. Реальная
32
- маршрутизация и RemoteBillingClient — следующие фазы.
25
+ - **content-script:** UI + RemoteBillingClient (proxy over a port into offscreen).
26
+ - **service worker:** content↔offscreen router. OAuth uses a popup window opened
27
+ against your `apiOrigin` (custom_domain) — `chrome.identity` is **not** used.
28
+ - **offscreen:** the real SDK state, survives tab closes, the sole coordination
29
+ point for auth refresh / trial counter / analytics batching.
33
30
 
34
- См. TODO в репозитории и `src/shared/protocol.ts` для контракта сообщений.
31
+ ## Usage
35
32
 
36
- ## Использование (целевое, в финале)
37
-
38
- **В extension'е:**
33
+ **In the extension:**
39
34
 
40
35
  ```ts
41
36
  // service-worker.ts
@@ -50,64 +45,70 @@ startOffscreenServer({ paywallId: '...', apiOrigin: 'https://...' });
50
45
  ```
51
46
 
52
47
  ```ts
53
- // content-script.ts (на каждой вкладке)
48
+ // content-script.ts (in every tab)
54
49
  import { PaywallUI } from '@monetize.software/sdk-extension';
55
50
  const paywall = new PaywallUI({ paywallId: '...', apiOrigin: '...' });
56
- paywall.open(); // ровно как в @monetize.software/sdk
51
+ paywall.open(); // exactly like @monetize.software/sdk
57
52
  ```
58
53
 
59
- **На сайтах**продолжаем использовать `@monetize.software/sdk`, не меняется.
54
+ **On websites**keep using `@monetize.software/sdk`, nothing changes.
60
55
 
61
- ## Manifest: что прописывать в host extension
56
+ ## Manifest: what to declare in the host extension
62
57
 
63
- SDK сам по себе ничего в манифест не добавляет — host extension решает permissions
64
- под свой UX. Минимум для работы SDK:
58
+ The SDK itself does not add anything to the manifestthe host extension picks
59
+ permissions to match its own UX. Minimum for the SDK to work:
65
60
 
66
61
  ```json
67
62
  {
68
63
  "permissions": ["offscreen", "storage"],
69
- "host_permissions": ["https://api.monetize.software/*"],
64
+ "host_permissions": ["https://your-paywall-domain.com/*"],
70
65
  "background": { "service_worker": "sw.js", "type": "module" }
71
66
  }
72
67
  ```
73
68
 
74
- Опционально:
69
+ `host_permissions` must list **your `apiOrigin`** — the `custom_domain` configured
70
+ for your paywall in the platform (the same value you pass to `new PaywallUI({ apiOrigin })`).
71
+ This is the only origin the SDK calls from offscreen / SW / content-script (bootstrap,
72
+ checkout, billing, auth). There is no `api.monetize.software` — every customer ships
73
+ their own custom domain.
74
+
75
+ `web_accessible_resources` for `offscreen.html` is **not required** — the document
76
+ is created by the service worker via `chrome.offscreen.createDocument`, a Chrome API
77
+ that doesn't need WAR. Listing it adds attack surface (any site could `<iframe>` your
78
+ offscreen, plus it fingerprints your extension ID).
75
79
 
76
- - `"permissions": ["identity"]` — если включаете OAuth-флоу (`auth: true` + Google/etc.).
77
- - `web_accessible_resources` для `offscreen.html` **не нужен** — документ создаётся
78
- service worker'ом через `chrome.offscreen.createDocument`, это chrome-API и WAR
79
- не требует. Указывать его — лишняя attack surface (любой сайт сможет `<iframe>`-нить
80
- ваш offscreen, плюс это fingerprint вашего extension ID).
80
+ The SDK does **not** use `chrome.identity` — OAuth runs via a popup window opened
81
+ against your `apiOrigin`, so no `"identity"` permission is needed.
81
82
 
82
- ### `host_permissions` — что выбрать
83
+ ### `host_permissions` — what to pick
83
84
 
84
- `host_permissions` управляют двумя вещами: куда extension может делать `fetch` (из
85
- offscreen / SW / content-script) и на какие origin'ы content-script может
86
- инжектиться (вместе с `content_scripts.matches`).
85
+ `host_permissions` control two things: where the extension can `fetch` (from
86
+ offscreen / SW / content-script) and which origins the content-script can be
87
+ injected into (together with `content_scripts.matches`).
87
88
 
88
- | Сценарий | Рекомендация |
89
+ | Scenario | Recommendation |
89
90
  |---|---|
90
- | **Host extension `<all_urls>` уже нужен** (рекордер, тулза-на-всех-сайтах, ассистент) | Оставляйте `<all_urls>`. SDK работает как есть. **Риск:** Chrome Web Store review для `<all_urls>` идёт через ручной audit и занимает дольше; AV-вендоры (Avast/Kaspersky/etc.) активнее метят такие расширения как PUA. Это «цена» широкого инжектане SDK'шный риск, а вашего use-case'а. |
91
- | **Host extension ходит только на ваш бекенд и paywall'ит свои фичи** (popup-tool, side-panel app) | НЕ ставьте `<all_urls>`. Достаточно вашего apiOrigin: `["https://api.your-domain.com/*"]`. Никакого content-script инжекта на все сайты не нужно. |
92
- | **Хотите гибрид** — popup-tool, но иногда content-script нужен на узком списке доменов | `host_permissions` + `content_scripts.matches` ограничьте до этих доменов: `["https://*.your-target.com/*", "https://api.your-domain.com/*"]`. |
91
+ | **Host extension already needs `<all_urls>`** (recorder, all-sites tool, assistant) | Keep `<all_urls>`. SDK works as-is. **Risk:** Chrome Web Store review for `<all_urls>` is a manual audit and takes longer; AV vendors (Avast/Kaspersky/etc.) are more likely to flag such extensions as PUA. That's the price of broad injection it's a property of your use case, not an SDK risk. |
92
+ | **Host extension only talks to your backend and gates its own features** (popup tool, side-panel app) | Do NOT request `<all_urls>`. Your `apiOrigin` (custom_domain) is enough: `["https://your-paywall-domain.com/*"]`. No content-script injection on every site needed. |
93
+ | **Hybrid** — popup tool, but content-script needed on a narrow list of domains | Constrain both `host_permissions` and `content_scripts.matches` to those domains: `["https://*.your-target.com/*", "https://your-paywall-domain.com/*"]`. |
93
94
 
94
- Главный сигнал для CWS/AV: чем уже `host_permissions`, тем меньше подозрений.
95
- `<all_urls>` оставляйте только если он реально нужен для UX, и будьте готовы
96
- обосновать его в CWS review (поле "Permission justification").
95
+ The main signal to CWS/AV: the narrower `host_permissions`, the less suspicion.
96
+ Keep `<all_urls>` only when it's genuinely required for your UX, and be ready to
97
+ justify it in CWS review (the "Permission justification" field).
97
98
 
98
- ## Demo extension'а: build modes
99
+ ## Demo extension: build modes
99
100
 
100
- Для self-проверки и e2e-тестов есть `demo-extension/` — reference-imple­ментация.
101
- Билдов два:
101
+ For self-testing and e2e there's `demo-extension/` — a reference implementation.
102
+ Two builds are available:
102
103
 
103
104
  ```bash
104
- pnpm build:demo # production build (= шаблон, который можно копировать клиентам)
105
- pnpm build:demo:e2e # debug build — экспонирует window.__paywall для playwright'а
105
+ pnpm build:demo # production build (= the template clients can copy)
106
+ pnpm build:demo:e2e # debug build — exposes window.__paywall for Playwright
106
107
  ```
107
108
 
108
- `build:demo` НЕ кладёт `window.__paywall` в bundle (dead-code elimination через
109
- `import.meta.env.MODE !== 'e2e'`). Шаблон, который клиент копирует, остаётся
110
- чистым: любой script на странице иначе мог бы дёрнуть `paywall.open()` /
111
- `paywall.track()` и злоупотреблять чужим extension'ом.
109
+ `build:demo` does NOT put `window.__paywall` into the bundle (dead-code-eliminated
110
+ via `import.meta.env.MODE !== 'e2e'`). The template clients copy stays clean: any
111
+ script on the page could otherwise call `paywall.open()` / `paywall.track()` and
112
+ abuse someone else's extension.
112
113
 
113
- `pnpm dev:demo` собирает в e2e-режиме (для удобной отладки из DevTools-консоли).
114
+ `pnpm dev:demo` builds in e2e mode (handy for live debugging from the DevTools console).
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e={"anon.heading_default":"متابعة كضيف","anon.try_again":"حاول مرة أخرى","auth.check_email_message":"تحقق من بريدك الإلكتروني للحصول على رمز التأكيد.","auth.check_email_title":"تحقق من بريدك الإلكتروني","auth.confirm_email_title":"تأكيد بريدك الإلكتروني","auth.confirmation_code":"رمز التأكيد","auth.continue_with_apple":"المتابعة مع Apple","auth.continue_with_facebook":"متابعة مع Facebook","auth.continue_with_github":"متابعة مع GitHub","auth.continue_with_google":"المتابعة مع Google","auth.create_account":"إنشاء حساب","auth.default_subtitle":"سجّل الدخول للوصول إلى جميع الميزات ومزامنة بياناتك.","auth.email":"عنوان البريد الإلكتروني","auth.email_exists":"يوجد حساب بهذا البريد الإلكتروني بالفعل.","auth.email_not_confirmed":"يرجى تأكيد بريدك الإلكتروني أولاً.","auth.forgot_password":"هل نسيت كلمة المرور؟","auth.forgot_password_title":"هل نسيت كلمة المرور؟","auth.forgot_subtitle":"أدخل بريدك الإلكتروني وسنرسل لك رابط إعادة تعيين كلمة المرور.","auth.generic_error":"حدث خطأ ما","auth.have_account":"لديك حساب؟","auth.hide_password":"إخفاء كلمة المرور","auth.invalid_credentials":"البريد الإلكتروني أو كلمة المرور غير صحيحة","auth.invalid_otp":"الرمز غير صالح أو منتهي الصلاحية.","auth.last_used_no_email":"الأخير","auth.link_purchase_subheading":"سنربط الشراء بحسابك للحفاظ على الوصول.","auth.log_in":"تسجيل الدخول","auth.log_in_link":"تسجيل الدخول","auth.login_continue_purchase":"سجّل الدخول لمتابعة عملية الشراء","auth.network_error":"خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.","auth.no_account":"ليس لديك حساب؟","auth.or":"أو","auth.password":"كلمة المرور","auth.passwords_mismatch":"كلمتا المرور غير متطابقتين","auth.rate_limited":"طلبات كثيرة جدًا. حاول مرة أخرى لاحقًا.","auth.repeat_password":"كرّر كلمة المرور","auth.reset_password_title":"إعادة تعيين كلمة المرور","auth.reset_sent_message":"إذا كان هذا البريد موجودًا، فقد تم إرسال رمز إعادة التعيين.","auth.restore_purchases_heading":"استعادة المشتريات","auth.restore_purchases_subheading":"يُرجى تسجيل الدخول لاستعادة مشترياتك.","auth.send_reset":"إرسال بريد إعادة التعيين","auth.service_unavailable":"الخدمة غير متاحة مؤقتًا. حاول لاحقًا.","auth.show_password":"إظهار كلمة المرور","auth.sign_out":"تسجيل الخروج","auth.sign_up":"إنشاء حساب","auth.sign_up_link":"إنشاء حساب","auth.signed_in":"تم تسجيل الدخول","auth.signin_failed":"فشل تسجيل الدخول","auth.signup_failed":"فشل التسجيل","auth.verify":"تأكيد","auth.weak_password":"كلمة المرور ضعيفة جدًا.","auth.welcome":"مرحباً!","auth.welcome_signup":"مرحبًا!","countdown.d":"ي","countdown.h":"س","countdown.m":"د","countdown.s":"ث","cta.close":"إغلاق","cta.continue":"متابعة","cta.get_lifetime_access":"احصل على وصول مدى الحياة","cta.get_plan_daily":"احصل على الخطة اليومية","cta.get_plan_monthly":"احصل على الخطة الشهرية","cta.get_plan_weekly":"احصل على الخطة الأسبوعية","cta.get_plan_yearly":"احصل على الخطة السنوية","cta.start_trial":"ابدأ تجربة مجانية لمدة {days} يوم","modal.close_aria":"إغلاق","modal.continue":"متابعة","modal.error_generic":"حدث خطأ ما","modal.loading":"جارٍ التحميل…","modal.purchase_restored_subtitle":"مرحبًا بعودتك — اشتراكك نشط بالفعل.","modal.purchase_restored_title":"تمت استعادة الاشتراك","modal.purchase_success_subtitle":"اشتراكك نشط الآن.","modal.purchase_success_title":"تم استلام الدفع","modal.verifying_subscription":"جارٍ التحقق من اشتراكك…","nav.back":"→ رجوع","nav.back_aria":"رجوع","offer.limited_time":"عرض لفترة محدودة","payment.awaiting_title":"أكمل الدفع في علامة التبويب الجديدة","payment.checking":"جارٍ التحقق…","payment.ive_paid":"لقد دفعت","payment.open_checkout_again":"افتح الدفع مرة أخرى","payment.open_checkout_button":"افتح الدفع","pricing.free_trial_days":"تجربة مجانية لمدة {days} يومًا","pricing.included_per":"متضمن لكل {interval}:","pricing.interval.day":"يوم","pricing.interval.lifetime_short":"مدى الحياة","pricing.interval.month":"شهر","pricing.interval.period":"فترة","pricing.interval.week":"أسبوع","pricing.interval.year":"سنة","pricing.money_back":"ضمان استرداد الأموال لمدة 30 يومًا","pricing.most_popular":"الأكثر شعبية","pricing.no_prices":"لا توجد أسعار متاحة.","pricing.plan_label.daily":"الخطة اليومية","pricing.plan_label.lifetime":"مدى الحياة","pricing.plan_label.monthly":"خطة شهرية","pricing.plan_label.weekly":"خطة أسبوعية","pricing.plan_label.yearly":"خطة سنوية","pricing.plans_aria":"الخطط","session.contact_support":"اتصل بالدعم","session.restore_purchases":"استعادة المشتريات","session.sign_out":"تسجيل الخروج","session.signed_in_as_prefix":"تم تسجيل الدخول باسم","session.signing_out":"جارٍ تسجيل الخروج…","support.attachments_label":"المرفقات","support.close_button":"إغلاق","support.done_button":"تم","support.email_placeholder":"أدخل بريدك الإلكتروني","support.heading":"الدعم","support.instruction":"يُرجى ملء النموذج أدناه لإرسال طلب الدعم.","support.invalid_email":"بريد إلكتروني غير صالح","support.message_length":"1-5000 حرفاً","support.message_placeholder":"أدخل رسالتك","support.required":"مطلوب","support.send_another":"إرسال طلب آخر","support.send_button":"إرسال","support.sending":"جارٍ الإرسال…","support.subject_length":"3-200 حرفاً","support.subject_placeholder":"أدخل الموضوع","support.success_heading":"تم إرسال الطلب","support.success_message_prefix":"لقد تلقينا رسالتك وسنرد على"};exports.default=e;
2
+ //# sourceMappingURL=ar-7cgIM-Vl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-7cgIM-Vl.js","sources":["../../../sdk/src/ui/i18n/locales/ar.ts"],"sourcesContent":["/**\n * Static-translations для ar. Сгенерировано из:\n * - `online/lang/static-translations.ts` (legacy, через KEY_MAP)\n * - `tools/sdk-translations.mjs` (SDK-specific строки)\n *\n * Не править вручную — изменения теряются при следующем `node tools/gen-locales.mjs`.\n * Чтобы исправить перевод — править legacy/sdk-translations.mjs и регенерить.\n */\nconst ar = {\n 'anon.heading_default': 'متابعة كضيف',\n 'anon.try_again': 'حاول مرة أخرى',\n 'auth.check_email_message': 'تحقق من بريدك الإلكتروني للحصول على رمز التأكيد.',\n 'auth.check_email_title': 'تحقق من بريدك الإلكتروني',\n 'auth.confirm_email_title': 'تأكيد بريدك الإلكتروني',\n 'auth.confirmation_code': 'رمز التأكيد',\n 'auth.continue_with_apple': 'المتابعة مع Apple',\n 'auth.continue_with_facebook': 'متابعة مع Facebook',\n 'auth.continue_with_github': 'متابعة مع GitHub',\n 'auth.continue_with_google': 'المتابعة مع Google',\n 'auth.create_account': 'إنشاء حساب',\n 'auth.default_subtitle': 'سجّل الدخول للوصول إلى جميع الميزات ومزامنة بياناتك.',\n 'auth.email': 'عنوان البريد الإلكتروني',\n 'auth.email_exists': 'يوجد حساب بهذا البريد الإلكتروني بالفعل.',\n 'auth.email_not_confirmed': 'يرجى تأكيد بريدك الإلكتروني أولاً.',\n 'auth.forgot_password': 'هل نسيت كلمة المرور؟',\n 'auth.forgot_password_title': 'هل نسيت كلمة المرور؟',\n 'auth.forgot_subtitle': 'أدخل بريدك الإلكتروني وسنرسل لك رابط إعادة تعيين كلمة المرور.',\n 'auth.generic_error': 'حدث خطأ ما',\n 'auth.have_account': 'لديك حساب؟',\n 'auth.hide_password': 'إخفاء كلمة المرور',\n 'auth.invalid_credentials': 'البريد الإلكتروني أو كلمة المرور غير صحيحة',\n 'auth.invalid_otp': 'الرمز غير صالح أو منتهي الصلاحية.',\n 'auth.last_used_no_email': 'الأخير',\n 'auth.link_purchase_subheading': 'سنربط الشراء بحسابك للحفاظ على الوصول.',\n 'auth.log_in': 'تسجيل الدخول',\n 'auth.log_in_link': 'تسجيل الدخول',\n 'auth.login_continue_purchase': 'سجّل الدخول لمتابعة عملية الشراء',\n 'auth.network_error': 'خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.',\n 'auth.no_account': 'ليس لديك حساب؟',\n 'auth.or': 'أو',\n 'auth.password': 'كلمة المرور',\n 'auth.passwords_mismatch': 'كلمتا المرور غير متطابقتين',\n 'auth.rate_limited': 'طلبات كثيرة جدًا. حاول مرة أخرى لاحقًا.',\n 'auth.repeat_password': 'كرّر كلمة المرور',\n 'auth.reset_password_title': 'إعادة تعيين كلمة المرور',\n 'auth.reset_sent_message': 'إذا كان هذا البريد موجودًا، فقد تم إرسال رمز إعادة التعيين.',\n 'auth.restore_purchases_heading': 'استعادة المشتريات',\n 'auth.restore_purchases_subheading': 'يُرجى تسجيل الدخول لاستعادة مشترياتك.',\n 'auth.send_reset': 'إرسال بريد إعادة التعيين',\n 'auth.service_unavailable': 'الخدمة غير متاحة مؤقتًا. حاول لاحقًا.',\n 'auth.show_password': 'إظهار كلمة المرور',\n 'auth.sign_out': 'تسجيل الخروج',\n 'auth.sign_up': 'إنشاء حساب',\n 'auth.sign_up_link': 'إنشاء حساب',\n 'auth.signed_in': 'تم تسجيل الدخول',\n 'auth.signin_failed': 'فشل تسجيل الدخول',\n 'auth.signup_failed': 'فشل التسجيل',\n 'auth.verify': 'تأكيد',\n 'auth.weak_password': 'كلمة المرور ضعيفة جدًا.',\n 'auth.welcome': 'مرحباً!',\n 'auth.welcome_signup': 'مرحبًا!',\n 'countdown.d': 'ي',\n 'countdown.h': 'س',\n 'countdown.m': 'د',\n 'countdown.s': 'ث',\n 'cta.close': 'إغلاق',\n 'cta.continue': 'متابعة',\n 'cta.get_lifetime_access': 'احصل على وصول مدى الحياة',\n 'cta.get_plan_daily': 'احصل على الخطة اليومية',\n 'cta.get_plan_monthly': 'احصل على الخطة الشهرية',\n 'cta.get_plan_weekly': 'احصل على الخطة الأسبوعية',\n 'cta.get_plan_yearly': 'احصل على الخطة السنوية',\n 'cta.start_trial': 'ابدأ تجربة مجانية لمدة {days} يوم',\n 'modal.close_aria': 'إغلاق',\n 'modal.continue': 'متابعة',\n 'modal.error_generic': 'حدث خطأ ما',\n 'modal.loading': 'جارٍ التحميل…',\n 'modal.purchase_restored_subtitle': 'مرحبًا بعودتك — اشتراكك نشط بالفعل.',\n 'modal.purchase_restored_title': 'تمت استعادة الاشتراك',\n 'modal.purchase_success_subtitle': 'اشتراكك نشط الآن.',\n 'modal.purchase_success_title': 'تم استلام الدفع',\n 'modal.verifying_subscription': 'جارٍ التحقق من اشتراكك…',\n 'nav.back': '→ رجوع',\n 'nav.back_aria': 'رجوع',\n 'offer.limited_time': 'عرض لفترة محدودة',\n 'payment.awaiting_title': 'أكمل الدفع في علامة التبويب الجديدة',\n 'payment.checking': 'جارٍ التحقق…',\n 'payment.ive_paid': 'لقد دفعت',\n 'payment.open_checkout_again': 'افتح الدفع مرة أخرى',\n 'payment.open_checkout_button': 'افتح الدفع',\n 'pricing.free_trial_days': 'تجربة مجانية لمدة {days} يومًا',\n 'pricing.included_per': 'متضمن لكل {interval}:',\n 'pricing.interval.day': 'يوم',\n 'pricing.interval.lifetime_short': 'مدى الحياة',\n 'pricing.interval.month': 'شهر',\n 'pricing.interval.period': 'فترة',\n 'pricing.interval.week': 'أسبوع',\n 'pricing.interval.year': 'سنة',\n 'pricing.money_back': 'ضمان استرداد الأموال لمدة 30 يومًا',\n 'pricing.most_popular': 'الأكثر شعبية',\n 'pricing.no_prices': 'لا توجد أسعار متاحة.',\n 'pricing.plan_label.daily': 'الخطة اليومية',\n 'pricing.plan_label.lifetime': 'مدى الحياة',\n 'pricing.plan_label.monthly': 'خطة شهرية',\n 'pricing.plan_label.weekly': 'خطة أسبوعية',\n 'pricing.plan_label.yearly': 'خطة سنوية',\n 'pricing.plans_aria': 'الخطط',\n 'session.contact_support': 'اتصل بالدعم',\n 'session.restore_purchases': 'استعادة المشتريات',\n 'session.sign_out': 'تسجيل الخروج',\n 'session.signed_in_as_prefix': 'تم تسجيل الدخول باسم',\n 'session.signing_out': 'جارٍ تسجيل الخروج…',\n 'support.attachments_label': 'المرفقات',\n 'support.close_button': 'إغلاق',\n 'support.done_button': 'تم',\n 'support.email_placeholder': 'أدخل بريدك الإلكتروني',\n 'support.heading': 'الدعم',\n 'support.instruction': 'يُرجى ملء النموذج أدناه لإرسال طلب الدعم.',\n 'support.invalid_email': 'بريد إلكتروني غير صالح',\n 'support.message_length': '1-5000 حرفاً',\n 'support.message_placeholder': 'أدخل رسالتك',\n 'support.required': 'مطلوب',\n 'support.send_another': 'إرسال طلب آخر',\n 'support.send_button': 'إرسال',\n 'support.sending': 'جارٍ الإرسال…',\n 'support.subject_length': '3-200 حرفاً',\n 'support.subject_placeholder': 'أدخل الموضوع',\n 'support.success_heading': 'تم إرسال الطلب',\n 'support.success_message_prefix': 'لقد تلقينا رسالتك وسنرد على'\n} as const;\n\nexport default ar;\n"],"names":["ar"],"mappings":"gFAQA,MAAMA,EAAK,CACT,uBAAwB,cACxB,iBAAkB,gBAClB,2BAA4B,mDAC5B,yBAA0B,2BAC1B,2BAA4B,yBAC5B,yBAA0B,cAC1B,2BAA4B,oBAC5B,8BAA+B,qBAC/B,4BAA6B,mBAC7B,4BAA6B,qBAC7B,sBAAuB,aACvB,wBAAyB,uDACzB,aAAc,0BACd,oBAAqB,2CACrB,2BAA4B,qCAC5B,uBAAwB,uBACxB,6BAA8B,uBAC9B,uBAAwB,gEACxB,qBAAsB,aACtB,oBAAqB,aACrB,qBAAsB,oBACtB,2BAA4B,6CAC5B,mBAAoB,oCACpB,0BAA2B,SAC3B,gCAAiC,yCACjC,cAAe,eACf,mBAAoB,eACpB,+BAAgC,mCAChC,qBAAsB,gDACtB,kBAAmB,iBACnB,UAAW,KACX,gBAAiB,cACjB,0BAA2B,6BAC3B,oBAAqB,0CACrB,uBAAwB,mBACxB,4BAA6B,0BAC7B,0BAA2B,8DAC3B,iCAAkC,oBAClC,oCAAqC,wCACrC,kBAAmB,2BACnB,2BAA4B,wCAC5B,qBAAsB,oBACtB,gBAAiB,eACjB,eAAgB,aAChB,oBAAqB,aACrB,iBAAkB,kBAClB,qBAAsB,mBACtB,qBAAsB,cACtB,cAAe,QACf,qBAAsB,0BACtB,eAAgB,UAChB,sBAAuB,UACvB,cAAe,IACf,cAAe,IACf,cAAe,IACf,cAAe,IACf,YAAa,QACb,eAAgB,SAChB,0BAA2B,2BAC3B,qBAAsB,yBACtB,uBAAwB,yBACxB,sBAAuB,2BACvB,sBAAuB,yBACvB,kBAAmB,oCACnB,mBAAoB,QACpB,iBAAkB,SAClB,sBAAuB,aACvB,gBAAiB,gBACjB,mCAAoC,sCACpC,gCAAiC,uBACjC,kCAAmC,oBACnC,+BAAgC,kBAChC,+BAAgC,0BAChC,WAAY,SACZ,gBAAiB,OACjB,qBAAsB,mBACtB,yBAA0B,sCAC1B,mBAAoB,eACpB,mBAAoB,WACpB,8BAA+B,sBAC/B,+BAAgC,aAChC,0BAA2B,iCAC3B,uBAAwB,wBACxB,uBAAwB,MACxB,kCAAmC,aACnC,yBAA0B,MAC1B,0BAA2B,OAC3B,wBAAyB,QACzB,wBAAyB,MACzB,qBAAsB,qCACtB,uBAAwB,eACxB,oBAAqB,uBACrB,2BAA4B,gBAC5B,8BAA+B,aAC/B,6BAA8B,YAC9B,4BAA6B,cAC7B,4BAA6B,YAC7B,qBAAsB,QACtB,0BAA2B,cAC3B,4BAA6B,oBAC7B,mBAAoB,eACpB,8BAA+B,uBAC/B,sBAAuB,qBACvB,4BAA6B,WAC7B,uBAAwB,QACxB,sBAAuB,KACvB,4BAA6B,wBAC7B,kBAAmB,QACnB,sBAAuB,4CACvB,wBAAyB,yBACzB,yBAA0B,eAC1B,8BAA+B,cAC/B,mBAAoB,QACpB,uBAAwB,gBACxB,sBAAuB,QACvB,kBAAmB,gBACnB,yBAA0B,cAC1B,8BAA+B,eAC/B,0BAA2B,iBAC3B,iCAAkC,6BACpC"}
@@ -0,0 +1,126 @@
1
+ const t = {
2
+ "anon.heading_default": "متابعة كضيف",
3
+ "anon.try_again": "حاول مرة أخرى",
4
+ "auth.check_email_message": "تحقق من بريدك الإلكتروني للحصول على رمز التأكيد.",
5
+ "auth.check_email_title": "تحقق من بريدك الإلكتروني",
6
+ "auth.confirm_email_title": "تأكيد بريدك الإلكتروني",
7
+ "auth.confirmation_code": "رمز التأكيد",
8
+ "auth.continue_with_apple": "المتابعة مع Apple",
9
+ "auth.continue_with_facebook": "متابعة مع Facebook",
10
+ "auth.continue_with_github": "متابعة مع GitHub",
11
+ "auth.continue_with_google": "المتابعة مع Google",
12
+ "auth.create_account": "إنشاء حساب",
13
+ "auth.default_subtitle": "سجّل الدخول للوصول إلى جميع الميزات ومزامنة بياناتك.",
14
+ "auth.email": "عنوان البريد الإلكتروني",
15
+ "auth.email_exists": "يوجد حساب بهذا البريد الإلكتروني بالفعل.",
16
+ "auth.email_not_confirmed": "يرجى تأكيد بريدك الإلكتروني أولاً.",
17
+ "auth.forgot_password": "هل نسيت كلمة المرور؟",
18
+ "auth.forgot_password_title": "هل نسيت كلمة المرور؟",
19
+ "auth.forgot_subtitle": "أدخل بريدك الإلكتروني وسنرسل لك رابط إعادة تعيين كلمة المرور.",
20
+ "auth.generic_error": "حدث خطأ ما",
21
+ "auth.have_account": "لديك حساب؟",
22
+ "auth.hide_password": "إخفاء كلمة المرور",
23
+ "auth.invalid_credentials": "البريد الإلكتروني أو كلمة المرور غير صحيحة",
24
+ "auth.invalid_otp": "الرمز غير صالح أو منتهي الصلاحية.",
25
+ "auth.last_used_no_email": "الأخير",
26
+ "auth.link_purchase_subheading": "سنربط الشراء بحسابك للحفاظ على الوصول.",
27
+ "auth.log_in": "تسجيل الدخول",
28
+ "auth.log_in_link": "تسجيل الدخول",
29
+ "auth.login_continue_purchase": "سجّل الدخول لمتابعة عملية الشراء",
30
+ "auth.network_error": "خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.",
31
+ "auth.no_account": "ليس لديك حساب؟",
32
+ "auth.or": "أو",
33
+ "auth.password": "كلمة المرور",
34
+ "auth.passwords_mismatch": "كلمتا المرور غير متطابقتين",
35
+ "auth.rate_limited": "طلبات كثيرة جدًا. حاول مرة أخرى لاحقًا.",
36
+ "auth.repeat_password": "كرّر كلمة المرور",
37
+ "auth.reset_password_title": "إعادة تعيين كلمة المرور",
38
+ "auth.reset_sent_message": "إذا كان هذا البريد موجودًا، فقد تم إرسال رمز إعادة التعيين.",
39
+ "auth.restore_purchases_heading": "استعادة المشتريات",
40
+ "auth.restore_purchases_subheading": "يُرجى تسجيل الدخول لاستعادة مشترياتك.",
41
+ "auth.send_reset": "إرسال بريد إعادة التعيين",
42
+ "auth.service_unavailable": "الخدمة غير متاحة مؤقتًا. حاول لاحقًا.",
43
+ "auth.show_password": "إظهار كلمة المرور",
44
+ "auth.sign_out": "تسجيل الخروج",
45
+ "auth.sign_up": "إنشاء حساب",
46
+ "auth.sign_up_link": "إنشاء حساب",
47
+ "auth.signed_in": "تم تسجيل الدخول",
48
+ "auth.signin_failed": "فشل تسجيل الدخول",
49
+ "auth.signup_failed": "فشل التسجيل",
50
+ "auth.verify": "تأكيد",
51
+ "auth.weak_password": "كلمة المرور ضعيفة جدًا.",
52
+ "auth.welcome": "مرحباً!",
53
+ "auth.welcome_signup": "مرحبًا!",
54
+ "countdown.d": "ي",
55
+ "countdown.h": "س",
56
+ "countdown.m": "د",
57
+ "countdown.s": "ث",
58
+ "cta.close": "إغلاق",
59
+ "cta.continue": "متابعة",
60
+ "cta.get_lifetime_access": "احصل على وصول مدى الحياة",
61
+ "cta.get_plan_daily": "احصل على الخطة اليومية",
62
+ "cta.get_plan_monthly": "احصل على الخطة الشهرية",
63
+ "cta.get_plan_weekly": "احصل على الخطة الأسبوعية",
64
+ "cta.get_plan_yearly": "احصل على الخطة السنوية",
65
+ "cta.start_trial": "ابدأ تجربة مجانية لمدة {days} يوم",
66
+ "modal.close_aria": "إغلاق",
67
+ "modal.continue": "متابعة",
68
+ "modal.error_generic": "حدث خطأ ما",
69
+ "modal.loading": "جارٍ التحميل…",
70
+ "modal.purchase_restored_subtitle": "مرحبًا بعودتك — اشتراكك نشط بالفعل.",
71
+ "modal.purchase_restored_title": "تمت استعادة الاشتراك",
72
+ "modal.purchase_success_subtitle": "اشتراكك نشط الآن.",
73
+ "modal.purchase_success_title": "تم استلام الدفع",
74
+ "modal.verifying_subscription": "جارٍ التحقق من اشتراكك…",
75
+ "nav.back": "→ رجوع",
76
+ "nav.back_aria": "رجوع",
77
+ "offer.limited_time": "عرض لفترة محدودة",
78
+ "payment.awaiting_title": "أكمل الدفع في علامة التبويب الجديدة",
79
+ "payment.checking": "جارٍ التحقق…",
80
+ "payment.ive_paid": "لقد دفعت",
81
+ "payment.open_checkout_again": "افتح الدفع مرة أخرى",
82
+ "payment.open_checkout_button": "افتح الدفع",
83
+ "pricing.free_trial_days": "تجربة مجانية لمدة {days} يومًا",
84
+ "pricing.included_per": "متضمن لكل {interval}:",
85
+ "pricing.interval.day": "يوم",
86
+ "pricing.interval.lifetime_short": "مدى الحياة",
87
+ "pricing.interval.month": "شهر",
88
+ "pricing.interval.period": "فترة",
89
+ "pricing.interval.week": "أسبوع",
90
+ "pricing.interval.year": "سنة",
91
+ "pricing.money_back": "ضمان استرداد الأموال لمدة 30 يومًا",
92
+ "pricing.most_popular": "الأكثر شعبية",
93
+ "pricing.no_prices": "لا توجد أسعار متاحة.",
94
+ "pricing.plan_label.daily": "الخطة اليومية",
95
+ "pricing.plan_label.lifetime": "مدى الحياة",
96
+ "pricing.plan_label.monthly": "خطة شهرية",
97
+ "pricing.plan_label.weekly": "خطة أسبوعية",
98
+ "pricing.plan_label.yearly": "خطة سنوية",
99
+ "pricing.plans_aria": "الخطط",
100
+ "session.contact_support": "اتصل بالدعم",
101
+ "session.restore_purchases": "استعادة المشتريات",
102
+ "session.sign_out": "تسجيل الخروج",
103
+ "session.signed_in_as_prefix": "تم تسجيل الدخول باسم",
104
+ "session.signing_out": "جارٍ تسجيل الخروج…",
105
+ "support.attachments_label": "المرفقات",
106
+ "support.close_button": "إغلاق",
107
+ "support.done_button": "تم",
108
+ "support.email_placeholder": "أدخل بريدك الإلكتروني",
109
+ "support.heading": "الدعم",
110
+ "support.instruction": "يُرجى ملء النموذج أدناه لإرسال طلب الدعم.",
111
+ "support.invalid_email": "بريد إلكتروني غير صالح",
112
+ "support.message_length": "1-5000 حرفاً",
113
+ "support.message_placeholder": "أدخل رسالتك",
114
+ "support.required": "مطلوب",
115
+ "support.send_another": "إرسال طلب آخر",
116
+ "support.send_button": "إرسال",
117
+ "support.sending": "جارٍ الإرسال…",
118
+ "support.subject_length": "3-200 حرفاً",
119
+ "support.subject_placeholder": "أدخل الموضوع",
120
+ "support.success_heading": "تم إرسال الطلب",
121
+ "support.success_message_prefix": "لقد تلقينا رسالتك وسنرد على"
122
+ };
123
+ export {
124
+ t as default
125
+ };
126
+ //# sourceMappingURL=ar-B2Wg_IrC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar-B2Wg_IrC.js","sources":["../../../sdk/src/ui/i18n/locales/ar.ts"],"sourcesContent":["/**\n * Static-translations для ar. Сгенерировано из:\n * - `online/lang/static-translations.ts` (legacy, через KEY_MAP)\n * - `tools/sdk-translations.mjs` (SDK-specific строки)\n *\n * Не править вручную — изменения теряются при следующем `node tools/gen-locales.mjs`.\n * Чтобы исправить перевод — править legacy/sdk-translations.mjs и регенерить.\n */\nconst ar = {\n 'anon.heading_default': 'متابعة كضيف',\n 'anon.try_again': 'حاول مرة أخرى',\n 'auth.check_email_message': 'تحقق من بريدك الإلكتروني للحصول على رمز التأكيد.',\n 'auth.check_email_title': 'تحقق من بريدك الإلكتروني',\n 'auth.confirm_email_title': 'تأكيد بريدك الإلكتروني',\n 'auth.confirmation_code': 'رمز التأكيد',\n 'auth.continue_with_apple': 'المتابعة مع Apple',\n 'auth.continue_with_facebook': 'متابعة مع Facebook',\n 'auth.continue_with_github': 'متابعة مع GitHub',\n 'auth.continue_with_google': 'المتابعة مع Google',\n 'auth.create_account': 'إنشاء حساب',\n 'auth.default_subtitle': 'سجّل الدخول للوصول إلى جميع الميزات ومزامنة بياناتك.',\n 'auth.email': 'عنوان البريد الإلكتروني',\n 'auth.email_exists': 'يوجد حساب بهذا البريد الإلكتروني بالفعل.',\n 'auth.email_not_confirmed': 'يرجى تأكيد بريدك الإلكتروني أولاً.',\n 'auth.forgot_password': 'هل نسيت كلمة المرور؟',\n 'auth.forgot_password_title': 'هل نسيت كلمة المرور؟',\n 'auth.forgot_subtitle': 'أدخل بريدك الإلكتروني وسنرسل لك رابط إعادة تعيين كلمة المرور.',\n 'auth.generic_error': 'حدث خطأ ما',\n 'auth.have_account': 'لديك حساب؟',\n 'auth.hide_password': 'إخفاء كلمة المرور',\n 'auth.invalid_credentials': 'البريد الإلكتروني أو كلمة المرور غير صحيحة',\n 'auth.invalid_otp': 'الرمز غير صالح أو منتهي الصلاحية.',\n 'auth.last_used_no_email': 'الأخير',\n 'auth.link_purchase_subheading': 'سنربط الشراء بحسابك للحفاظ على الوصول.',\n 'auth.log_in': 'تسجيل الدخول',\n 'auth.log_in_link': 'تسجيل الدخول',\n 'auth.login_continue_purchase': 'سجّل الدخول لمتابعة عملية الشراء',\n 'auth.network_error': 'خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.',\n 'auth.no_account': 'ليس لديك حساب؟',\n 'auth.or': 'أو',\n 'auth.password': 'كلمة المرور',\n 'auth.passwords_mismatch': 'كلمتا المرور غير متطابقتين',\n 'auth.rate_limited': 'طلبات كثيرة جدًا. حاول مرة أخرى لاحقًا.',\n 'auth.repeat_password': 'كرّر كلمة المرور',\n 'auth.reset_password_title': 'إعادة تعيين كلمة المرور',\n 'auth.reset_sent_message': 'إذا كان هذا البريد موجودًا، فقد تم إرسال رمز إعادة التعيين.',\n 'auth.restore_purchases_heading': 'استعادة المشتريات',\n 'auth.restore_purchases_subheading': 'يُرجى تسجيل الدخول لاستعادة مشترياتك.',\n 'auth.send_reset': 'إرسال بريد إعادة التعيين',\n 'auth.service_unavailable': 'الخدمة غير متاحة مؤقتًا. حاول لاحقًا.',\n 'auth.show_password': 'إظهار كلمة المرور',\n 'auth.sign_out': 'تسجيل الخروج',\n 'auth.sign_up': 'إنشاء حساب',\n 'auth.sign_up_link': 'إنشاء حساب',\n 'auth.signed_in': 'تم تسجيل الدخول',\n 'auth.signin_failed': 'فشل تسجيل الدخول',\n 'auth.signup_failed': 'فشل التسجيل',\n 'auth.verify': 'تأكيد',\n 'auth.weak_password': 'كلمة المرور ضعيفة جدًا.',\n 'auth.welcome': 'مرحباً!',\n 'auth.welcome_signup': 'مرحبًا!',\n 'countdown.d': 'ي',\n 'countdown.h': 'س',\n 'countdown.m': 'د',\n 'countdown.s': 'ث',\n 'cta.close': 'إغلاق',\n 'cta.continue': 'متابعة',\n 'cta.get_lifetime_access': 'احصل على وصول مدى الحياة',\n 'cta.get_plan_daily': 'احصل على الخطة اليومية',\n 'cta.get_plan_monthly': 'احصل على الخطة الشهرية',\n 'cta.get_plan_weekly': 'احصل على الخطة الأسبوعية',\n 'cta.get_plan_yearly': 'احصل على الخطة السنوية',\n 'cta.start_trial': 'ابدأ تجربة مجانية لمدة {days} يوم',\n 'modal.close_aria': 'إغلاق',\n 'modal.continue': 'متابعة',\n 'modal.error_generic': 'حدث خطأ ما',\n 'modal.loading': 'جارٍ التحميل…',\n 'modal.purchase_restored_subtitle': 'مرحبًا بعودتك — اشتراكك نشط بالفعل.',\n 'modal.purchase_restored_title': 'تمت استعادة الاشتراك',\n 'modal.purchase_success_subtitle': 'اشتراكك نشط الآن.',\n 'modal.purchase_success_title': 'تم استلام الدفع',\n 'modal.verifying_subscription': 'جارٍ التحقق من اشتراكك…',\n 'nav.back': '→ رجوع',\n 'nav.back_aria': 'رجوع',\n 'offer.limited_time': 'عرض لفترة محدودة',\n 'payment.awaiting_title': 'أكمل الدفع في علامة التبويب الجديدة',\n 'payment.checking': 'جارٍ التحقق…',\n 'payment.ive_paid': 'لقد دفعت',\n 'payment.open_checkout_again': 'افتح الدفع مرة أخرى',\n 'payment.open_checkout_button': 'افتح الدفع',\n 'pricing.free_trial_days': 'تجربة مجانية لمدة {days} يومًا',\n 'pricing.included_per': 'متضمن لكل {interval}:',\n 'pricing.interval.day': 'يوم',\n 'pricing.interval.lifetime_short': 'مدى الحياة',\n 'pricing.interval.month': 'شهر',\n 'pricing.interval.period': 'فترة',\n 'pricing.interval.week': 'أسبوع',\n 'pricing.interval.year': 'سنة',\n 'pricing.money_back': 'ضمان استرداد الأموال لمدة 30 يومًا',\n 'pricing.most_popular': 'الأكثر شعبية',\n 'pricing.no_prices': 'لا توجد أسعار متاحة.',\n 'pricing.plan_label.daily': 'الخطة اليومية',\n 'pricing.plan_label.lifetime': 'مدى الحياة',\n 'pricing.plan_label.monthly': 'خطة شهرية',\n 'pricing.plan_label.weekly': 'خطة أسبوعية',\n 'pricing.plan_label.yearly': 'خطة سنوية',\n 'pricing.plans_aria': 'الخطط',\n 'session.contact_support': 'اتصل بالدعم',\n 'session.restore_purchases': 'استعادة المشتريات',\n 'session.sign_out': 'تسجيل الخروج',\n 'session.signed_in_as_prefix': 'تم تسجيل الدخول باسم',\n 'session.signing_out': 'جارٍ تسجيل الخروج…',\n 'support.attachments_label': 'المرفقات',\n 'support.close_button': 'إغلاق',\n 'support.done_button': 'تم',\n 'support.email_placeholder': 'أدخل بريدك الإلكتروني',\n 'support.heading': 'الدعم',\n 'support.instruction': 'يُرجى ملء النموذج أدناه لإرسال طلب الدعم.',\n 'support.invalid_email': 'بريد إلكتروني غير صالح',\n 'support.message_length': '1-5000 حرفاً',\n 'support.message_placeholder': 'أدخل رسالتك',\n 'support.required': 'مطلوب',\n 'support.send_another': 'إرسال طلب آخر',\n 'support.send_button': 'إرسال',\n 'support.sending': 'جارٍ الإرسال…',\n 'support.subject_length': '3-200 حرفاً',\n 'support.subject_placeholder': 'أدخل الموضوع',\n 'support.success_heading': 'تم إرسال الطلب',\n 'support.success_message_prefix': 'لقد تلقينا رسالتك وسنرد على'\n} as const;\n\nexport default ar;\n"],"names":["ar"],"mappings":"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"}