@pie-players/pie-players-shared 0.3.28 → 0.3.30

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 (146) hide show
  1. package/{src → dist}/components/PieItemPlayer.svelte +156 -88
  2. package/dist/i18n/translations/en/tools.json +1 -1
  3. package/{src → dist}/i18n/use-i18n-standalone.svelte.ts +1 -0
  4. package/{src → dist}/i18n/use-i18n.svelte.ts +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/loader-config.d.ts +25 -0
  10. package/dist/loader-config.d.ts.map +1 -1
  11. package/dist/loader-config.js +5 -0
  12. package/dist/loader-config.js.map +1 -1
  13. package/dist/pie/config.d.ts.map +1 -1
  14. package/dist/pie/config.js +12 -5
  15. package/dist/pie/config.js.map +1 -1
  16. package/dist/pie/custom-element-define.d.ts +1 -1
  17. package/dist/pie/custom-element-define.d.ts.map +1 -1
  18. package/dist/pie/custom-element-define.js +2 -2
  19. package/dist/pie/custom-element-define.js.map +1 -1
  20. package/dist/pie/iife-loader.d.ts +35 -0
  21. package/dist/pie/iife-loader.d.ts.map +1 -1
  22. package/dist/pie/iife-loader.js +138 -2
  23. package/dist/pie/iife-loader.js.map +1 -1
  24. package/dist/pie/index.d.ts +3 -1
  25. package/dist/pie/index.d.ts.map +1 -1
  26. package/dist/pie/index.js +1 -0
  27. package/dist/pie/index.js.map +1 -1
  28. package/dist/pie/overrides.d.ts +9 -0
  29. package/dist/pie/overrides.d.ts.map +1 -1
  30. package/dist/pie/overrides.js +36 -0
  31. package/dist/pie/overrides.js.map +1 -1
  32. package/dist/pie/resource-monitor.d.ts +17 -0
  33. package/dist/pie/resource-monitor.d.ts.map +1 -1
  34. package/dist/pie/resource-monitor.js +284 -81
  35. package/dist/pie/resource-monitor.js.map +1 -1
  36. package/dist/pie/updates.d.ts.map +1 -1
  37. package/dist/pie/updates.js +65 -2
  38. package/dist/pie/updates.js.map +1 -1
  39. package/dist/security/index.d.ts +5 -0
  40. package/dist/security/index.d.ts.map +1 -0
  41. package/dist/security/index.js +5 -0
  42. package/dist/security/index.js.map +1 -0
  43. package/dist/security/sanitize-item-markup.d.ts +46 -0
  44. package/dist/security/sanitize-item-markup.d.ts.map +1 -0
  45. package/dist/security/sanitize-item-markup.js +174 -0
  46. package/dist/security/sanitize-item-markup.js.map +1 -0
  47. package/dist/security/sanitize-svg-icon.d.ts +15 -0
  48. package/dist/security/sanitize-svg-icon.d.ts.map +1 -0
  49. package/dist/security/sanitize-svg-icon.js +89 -0
  50. package/dist/security/sanitize-svg-icon.js.map +1 -0
  51. package/dist/security/validate-style-url.d.ts +28 -0
  52. package/dist/security/validate-style-url.d.ts.map +1 -0
  53. package/dist/security/validate-style-url.js +58 -0
  54. package/dist/security/validate-style-url.js.map +1 -0
  55. package/dist/security/wrap-overwide-images.d.ts +31 -0
  56. package/dist/security/wrap-overwide-images.d.ts.map +1 -0
  57. package/dist/security/wrap-overwide-images.js +92 -0
  58. package/dist/security/wrap-overwide-images.js.map +1 -0
  59. package/dist/server/npm-registry.d.ts +8 -0
  60. package/dist/server/npm-registry.d.ts.map +1 -0
  61. package/dist/server/npm-registry.js +60 -0
  62. package/dist/server/npm-registry.js.map +1 -0
  63. package/dist/types/index.d.ts +10 -0
  64. package/dist/types/index.d.ts.map +1 -1
  65. package/dist/types/index.js.map +1 -1
  66. package/dist/ui/first-focusable.d.ts +21 -0
  67. package/dist/ui/first-focusable.d.ts.map +1 -0
  68. package/dist/ui/first-focusable.js +73 -0
  69. package/dist/ui/first-focusable.js.map +1 -0
  70. package/dist/ui/focus-trap.d.ts.map +1 -1
  71. package/dist/ui/focus-trap.js +2 -13
  72. package/dist/ui/focus-trap.js.map +1 -1
  73. package/package.json +44 -34
  74. package/dist/i18n/scripts/check-coverage.d.ts +0 -16
  75. package/dist/i18n/scripts/check-coverage.d.ts.map +0 -1
  76. package/dist/i18n/scripts/check-coverage.js +0 -262
  77. package/dist/i18n/scripts/check-coverage.js.map +0 -1
  78. package/dist/i18n/scripts/scan-hardcoded.d.ts +0 -16
  79. package/dist/i18n/scripts/scan-hardcoded.d.ts.map +0 -1
  80. package/dist/i18n/scripts/scan-hardcoded.js +0 -266
  81. package/dist/i18n/scripts/scan-hardcoded.js.map +0 -1
  82. package/dist/i18n/use-i18n-standalone.svelte.d.ts +0 -87
  83. package/dist/i18n/use-i18n-standalone.svelte.d.ts.map +0 -1
  84. package/dist/i18n/use-i18n-standalone.svelte.js +0 -151
  85. package/dist/i18n/use-i18n-standalone.svelte.js.map +0 -1
  86. package/dist/i18n/use-i18n.svelte.d.ts +0 -67
  87. package/dist/i18n/use-i18n.svelte.d.ts.map +0 -1
  88. package/dist/i18n/use-i18n.svelte.js +0 -144
  89. package/dist/i18n/use-i18n.svelte.js.map +0 -1
  90. package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts +0 -170
  91. package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts.map +0 -1
  92. package/dist/instrumentation/providers/DataDogInstrumentationProvider.js +0 -183
  93. package/dist/instrumentation/providers/DataDogInstrumentationProvider.js.map +0 -1
  94. package/dist/theming/css-variables.d.ts +0 -7
  95. package/dist/theming/css-variables.d.ts.map +0 -1
  96. package/dist/theming/css-variables.js +0 -43
  97. package/dist/theming/css-variables.js.map +0 -1
  98. package/dist/theming/index.d.ts +0 -4
  99. package/dist/theming/index.d.ts.map +0 -1
  100. package/dist/theming/index.js +0 -3
  101. package/dist/theming/index.js.map +0 -1
  102. package/dist/theming/presets.d.ts +0 -7
  103. package/dist/theming/presets.d.ts.map +0 -1
  104. package/dist/theming/presets.js +0 -146
  105. package/dist/theming/presets.js.map +0 -1
  106. package/dist/theming/types.d.ts +0 -5
  107. package/dist/theming/types.d.ts.map +0 -1
  108. package/dist/theming/types.js +0 -2
  109. package/dist/theming/types.js.map +0 -1
  110. package/dist/types/custom-elements.d.ts +0 -158
  111. package/dist/types/custom-elements.d.ts.map +0 -1
  112. package/dist/types/custom-elements.js +0 -8
  113. package/dist/types/custom-elements.js.map +0 -1
  114. package/dist/types/search.d.ts +0 -105
  115. package/dist/types/search.d.ts.map +0 -1
  116. package/dist/types/search.js +0 -12
  117. package/dist/types/search.js.map +0 -1
  118. package/dist/types/transform.d.ts +0 -48
  119. package/dist/types/transform.d.ts.map +0 -1
  120. package/dist/types/transform.js +0 -21
  121. package/dist/types/transform.js.map +0 -1
  122. package/src/i18n/README.md +0 -223
  123. package/src/i18n/index.ts +0 -26
  124. package/src/i18n/loader.ts +0 -156
  125. package/src/i18n/scripts/check-coverage.ts +0 -345
  126. package/src/i18n/scripts/scan-hardcoded.ts +0 -342
  127. package/src/i18n/simple-i18n.ts +0 -236
  128. package/src/i18n/translations/ar/common.json +0 -36
  129. package/src/i18n/translations/ar/toolkit.json +0 -48
  130. package/src/i18n/translations/ar/tools.json +0 -103
  131. package/src/i18n/translations/en/common.json +0 -36
  132. package/src/i18n/translations/en/toolkit.json +0 -48
  133. package/src/i18n/translations/en/tools.json +0 -103
  134. package/src/i18n/translations/es/common.json +0 -36
  135. package/src/i18n/translations/es/toolkit.json +0 -48
  136. package/src/i18n/translations/es/tools.json +0 -103
  137. package/src/i18n/translations/zh/common.json +0 -36
  138. package/src/i18n/translations/zh/toolkit.json +0 -48
  139. package/src/i18n/translations/zh/tools.json +0 -103
  140. package/src/i18n/types.ts +0 -66
  141. /package/{src → dist}/components/PiePreviewLayout.svelte +0 -0
  142. /package/{src → dist}/components/PiePreviewToggle.svelte +0 -0
  143. /package/{src → dist}/components/PieSpinner.svelte +0 -0
  144. /package/{src → dist}/components/ToolSettingsButton.svelte +0 -0
  145. /package/{src → dist}/components/ToolSettingsPanel.svelte +0 -0
  146. /package/{src → dist}/components/index.ts +0 -0
@@ -1,236 +0,0 @@
1
- /**
2
- * Simple I18n Implementation
3
- *
4
- * Lightweight i18n without external dependencies.
5
- * Used for standalone components that don't need the full service architecture.
6
- */
7
-
8
- import type { I18nConfig, PluralTranslation, TranslationBundle } from "./types.js";
9
-
10
- /**
11
- * Simple I18n class for standalone use
12
- */
13
- export class SimpleI18n {
14
- private locale: string = "en";
15
- private fallbackLocale: string = "en";
16
- private direction: "ltr" | "rtl" = "ltr";
17
- private translations = new Map<string, TranslationBundle>();
18
- private listeners = new Set<() => void>();
19
- private loadingPromises = new Map<string, Promise<void>>();
20
- private config: I18nConfig;
21
-
22
- constructor(config: I18nConfig = {}) {
23
- this.config = config;
24
- this.fallbackLocale = config.fallbackLocale || "en";
25
-
26
- // Load bundled translations
27
- if (config.bundledTranslations) {
28
- for (const [locale, bundle] of Object.entries(
29
- config.bundledTranslations,
30
- )) {
31
- this.translations.set(locale, bundle);
32
- }
33
- }
34
- }
35
-
36
- /**
37
- * Initialize with locale
38
- */
39
- async initialize(config: I18nConfig): Promise<void> {
40
- Object.assign(this.config, config);
41
-
42
- const locale = config.locale || this.detectBrowserLocale();
43
- await this.setLocale(locale);
44
- }
45
-
46
- /**
47
- * Translate a key
48
- */
49
- t(key: string, params?: Record<string, any>): string {
50
- const translation = this.getTranslation(key);
51
- return this.interpolate(translation as string, params);
52
- }
53
-
54
- /**
55
- * Translate with pluralization
56
- */
57
- tn(key: string, count: number, params?: Record<string, any>): string {
58
- const translation = this.getTranslation(key);
59
-
60
- if (typeof translation === "object") {
61
- const pluralForm = this.selectPluralForm(count, this.locale);
62
- const text = translation[pluralForm] || translation.other;
63
- return this.interpolate(text, { ...params, count });
64
- }
65
-
66
- return this.interpolate(translation as string, { ...params, count });
67
- }
68
-
69
- /**
70
- * Get current locale
71
- */
72
- getLocale(): string {
73
- return this.locale;
74
- }
75
-
76
- /**
77
- * Change locale
78
- */
79
- async setLocale(locale: string): Promise<void> {
80
- // Check if already loading
81
- if (this.loadingPromises.has(locale)) {
82
- await this.loadingPromises.get(locale);
83
- return;
84
- }
85
-
86
- // Check if already loaded
87
- if (this.translations.has(locale)) {
88
- this.applyLocale(locale);
89
- return;
90
- }
91
-
92
- // Load translations
93
- const loadingPromise = this.loadTranslationsForLocale(locale);
94
- this.loadingPromises.set(locale, loadingPromise);
95
-
96
- try {
97
- await loadingPromise;
98
- this.applyLocale(locale);
99
- } finally {
100
- this.loadingPromises.delete(locale);
101
- }
102
- }
103
-
104
- /**
105
- * Get current direction
106
- */
107
- getDirection(): "ltr" | "rtl" {
108
- return this.direction;
109
- }
110
-
111
- /**
112
- * Get available locales
113
- */
114
- getAvailableLocales(): string[] {
115
- return Array.from(this.translations.keys());
116
- }
117
-
118
- /**
119
- * Check if locale is loaded
120
- */
121
- isLocaleLoaded(locale: string): boolean {
122
- return this.translations.has(locale);
123
- }
124
-
125
- /**
126
- * Subscribe to changes
127
- */
128
- subscribe(listener: () => void): () => void {
129
- this.listeners.add(listener);
130
- return () => {
131
- this.listeners.delete(listener);
132
- };
133
- }
134
-
135
- /**
136
- * Check if key exists
137
- */
138
- hasKey(key: string): boolean {
139
- const bundle = this.translations.get(this.locale);
140
- return !!bundle?.translations[key];
141
- }
142
-
143
- private notifyListeners(): void {
144
- for (const listener of this.listeners) {
145
- listener();
146
- }
147
- }
148
-
149
- private applyLocale(locale: string): void {
150
- const bundle = this.translations.get(locale);
151
- if (!bundle) return;
152
-
153
- this.locale = locale;
154
- this.direction = bundle.direction;
155
-
156
- this.applyDOMDirection();
157
- this.notifyListeners();
158
- }
159
-
160
- private applyDOMDirection(): void {
161
- if (typeof document === "undefined") return;
162
-
163
- document.documentElement.setAttribute("dir", this.direction);
164
- document.documentElement.setAttribute("lang", this.locale);
165
- }
166
-
167
- private async loadTranslationsForLocale(locale: string): Promise<void> {
168
- if (!this.config.loadTranslations) {
169
- throw new Error(`No translation loader configured for locale: ${locale}`);
170
- }
171
-
172
- const bundle = await this.config.loadTranslations(locale);
173
- this.translations.set(locale, bundle);
174
- }
175
-
176
- private getTranslation(key: string): string | PluralTranslation {
177
- // Try current locale
178
- const currentBundle = this.translations.get(this.locale);
179
- if (currentBundle?.translations[key]) {
180
- return currentBundle.translations[key];
181
- }
182
-
183
- // Try fallback locale
184
- const fallbackBundle = this.translations.get(this.fallbackLocale);
185
- if (fallbackBundle?.translations[key]) {
186
- return fallbackBundle.translations[key];
187
- }
188
-
189
- // Missing key
190
- if (this.config.onMissingKey) {
191
- this.config.onMissingKey(key, this.locale);
192
- }
193
-
194
- return key;
195
- }
196
-
197
- private interpolate(text: string, params?: Record<string, any>): string {
198
- if (!params) return text;
199
-
200
- return text.replace(/\{(\w+)\}/g, (match, key) => {
201
- return params[key]?.toString() || match;
202
- });
203
- }
204
-
205
- private selectPluralForm(
206
- count: number,
207
- locale: string,
208
- ): keyof PluralTranslation {
209
- // Use Intl.PluralRules if available
210
- if (typeof Intl !== "undefined" && Intl.PluralRules) {
211
- try {
212
- const rules = new Intl.PluralRules(locale);
213
- const category = rules.select(count);
214
- return category as keyof PluralTranslation;
215
- } catch {
216
- // Fall through to simple rules
217
- }
218
- }
219
-
220
- // Fallback to simple rules
221
- if (count === 0) return "zero";
222
- if (count === 1) return "one";
223
- return "other";
224
- }
225
-
226
- private detectBrowserLocale(): string {
227
- if (typeof navigator === "undefined") return "en";
228
-
229
- const browserLang =
230
- navigator.language ||
231
- (navigator.languages && navigator.languages[0]) ||
232
- "en";
233
-
234
- return browserLang.split("-")[0];
235
- }
236
- }
@@ -1,36 +0,0 @@
1
- {
2
- "common": {
3
- "save": "حفظ",
4
- "cancel": "إلغاء",
5
- "close": "إغلاق",
6
- "loading": "جار التحميل...",
7
- "error": "خطأ",
8
- "retry": "إعادة المحاولة",
9
- "back": "رجوع",
10
- "next": "التالي",
11
- "previous": "السابق",
12
- "submit": "إرسال",
13
- "continue": "متابعة",
14
- "finish": "إنهاء",
15
- "yes": "نعم",
16
- "no": "لا",
17
- "ok": "موافق",
18
- "settings": "الإعدادات",
19
- "language": "اللغة",
20
- "theme": "المظهر",
21
- "settings_aria": "فتح قائمة الإعدادات",
22
- "rtl_notice": "اتجاه النص من اليمين إلى اليسار نشط",
23
- "question": {
24
- "one": "سؤال",
25
- "other": "أسئلة"
26
- },
27
- "item": {
28
- "one": "عنصر",
29
- "other": "عناصر"
30
- },
31
- "character": {
32
- "one": "حرف",
33
- "other": "حروف"
34
- }
35
- }
36
- }
@@ -1,48 +0,0 @@
1
- {
2
- "assessment": {
3
- "title": "التقييم",
4
- "questions": {
5
- "one": "{count} سؤال",
6
- "other": "{count} أسئلة"
7
- },
8
- "question_of": "السؤال {current} من {total}",
9
- "student_name": "اسم الطالب",
10
- "fullscreen": "ملء الشاشة",
11
- "exit_fullscreen": "الخروج من ملء الشاشة",
12
- "enter_fullscreen_aria": "الدخول إلى ملء الشاشة",
13
- "exit_fullscreen_aria": "الخروج من ملء الشاشة"
14
- },
15
- "accommodation": {
16
- "audio": "صوت",
17
- "audio_aria": "تبديل الصوت/تحويل النص إلى كلام",
18
- "contrast": "التباين",
19
- "contrast_aria": "تبديل تباين الألوان"
20
- },
21
- "navigation": {
22
- "back": "← رجوع",
23
- "next": "التالي ←",
24
- "previous": "السابق",
25
- "submit": "إرسال",
26
- "navigate_to": "الانتقال إلى السؤال {index}",
27
- "section": "القسم"
28
- },
29
- "section": {
30
- "title": "بنية التقييم",
31
- "add": "+ إضافة قسم",
32
- "untitled": "قسم بدون عنوان",
33
- "remove": "حذف القسم",
34
- "items": {
35
- "one": "{count} عنصر",
36
- "other": "{count} عناصر"
37
- },
38
- "aria_label": "القسم: {title}",
39
- "drop_zone": "إسقاط العناصر هنا",
40
- "unassigned": "عناصر غير مخصصة",
41
- "unassigned_instruction": "اسحب هذه العناصر إلى الأقسام",
42
- "unassigned_item_aria": "سؤال غير مخصص: {title}"
43
- },
44
- "item": {
45
- "load_error": "تعذر تحميل السؤال.",
46
- "untitled": "بدون عنوان"
47
- }
48
- }
@@ -1,103 +0,0 @@
1
- {
2
- "tool": {
3
- "calculator": "آلة حاسبة",
4
- "calculator_aria": "فتح الآلة الحاسبة",
5
- "graph": "رسم بياني",
6
- "graph_aria": "فتح أداة الرسم البياني",
7
- "periodic_table": "الجدول الدوري",
8
- "periodic_table_aria": "فتح الجدول الدوري",
9
- "protractor": "منقلة",
10
- "protractor_aria": "فتح المنقلة",
11
- "ruler": "مسطرة",
12
- "ruler_aria": "فتح المسطرة",
13
- "line_reader": "قارئ السطر",
14
- "line_reader_aria": "فتح قارئ السطر",
15
- "text_to_speech": "تحويل النص إلى كلام",
16
- "text_to_speech_aria": "فتح تحويل النص إلى كلام",
17
- "color_scheme": "نظام الألوان",
18
- "color_scheme_aria": "فتح محدد نظام الألوان",
19
- "annotation": "التعليق التوضيحي",
20
- "annotation_aria": "فتح شريط أدوات التعليق التوضيحي",
21
- "answer_eliminator": "محذف الإجابات"
22
- },
23
- "tts": {
24
- "title": "تحويل النص إلى كلام",
25
- "close_aria": "إغلاق تحويل النص إلى كلام",
26
- "failed_init": "فشل في تهيئة TTS",
27
- "initializing": "جار التهيئة...",
28
- "select_text": "حدد نصًا على الصفحة لقراءته بصوت عالٍ.",
29
- "selected": "{count} {character} محددة",
30
- "speed": "السرعة:",
31
- "rate_slow": "بطيء",
32
- "rate_slower": "أبطأ",
33
- "rate_normal": "عادي",
34
- "rate_faster": "أسرع",
35
- "rate_fast": "سريع",
36
- "rate_very_fast": "سريع جدًا",
37
- "play": "تشغيل",
38
- "pause": "إيقاف مؤقت",
39
- "resume": "استئناف",
40
- "stop": "إيقاف",
41
- "speaking": "يتحدث...",
42
- "paused": "متوقف مؤقتًا"
43
- },
44
- "calculator": {
45
- "title": "آلة حاسبة",
46
- "aria_label": "أداة الآلة الحاسبة - استخدم Alt+مفاتيح الأسهم للتحرك، Escape للإغلاق",
47
- "settings": "إعدادات الآلة الحاسبة",
48
- "close": "إغلاق الآلة الحاسبة",
49
- "settings_title": "إعدادات الآلة الحاسبة",
50
- "type": "نوع الآلة الحاسبة",
51
- "basic": "أساسي",
52
- "scientific": "علمي",
53
- "graphing": "رسم بياني",
54
- "configuration": "التكوين",
55
- "config_help": "هذه الإعدادات مفيدة للاختبار. قد تكون مخفية أو مقيدة للطلاب في الإنتاج.",
56
- "restricted_mode": "الوضع المقيد (وضع الاختبار)",
57
- "angle_mode": "وضع الزاوية",
58
- "degrees": "درجات",
59
- "radians": "راديان",
60
- "qwerty": "لوحة مفاتيح QWERTY",
61
- "screen_reader": "دعم قارئ الشاشة",
62
- "accessible_display": "عرض يمكن الوصول إليه",
63
- "settings_menu": "قائمة الإعدادات",
64
- "notes": "ملاحظات",
65
- "folders": "مجلدات",
66
- "sliders": "أشرطة التمرير",
67
- "display_mode": "وضع العرض",
68
- "classic": "كلاسيكي",
69
- "mathprint": "MathPrint"
70
- },
71
- "color_scheme": {
72
- "title": "نظام الألوان",
73
- "description": "حدد نظام الألوان لتحسين سهولة القراءة وتقليل إجهاد العين.",
74
- "close_aria": "إغلاق محدد نظام الألوان",
75
- "select_aria": "تحديد نظام الألوان",
76
- "default": "افتراضي",
77
- "default_desc": "ألوان PIE القياسية",
78
- "black_on_white": "أسود على أبيض",
79
- "black_on_white_desc": "تباين عالٍ لسهولة القراءة",
80
- "white_on_black": "أبيض على أسود",
81
- "white_on_black_desc": "تباين عالٍ معكوس",
82
- "rose_on_green": "وردي على أخضر",
83
- "rose_on_green_desc": "يقلل من الوهج",
84
- "yellow_on_blue": "أصفر على أزرق",
85
- "yellow_on_blue_desc": "بديل تباين عالٍ",
86
- "black_on_rose": "أسود على وردي",
87
- "black_on_rose_desc": "خلفية دافئة",
88
- "light_gray_on_dark_gray": "رمادي فاتح على رمادي داكن",
89
- "light_gray_on_dark_gray_desc": "سطوع مخفض"
90
- },
91
- "annotation": {
92
- "yellow_aria": "تمييز أصفر",
93
- "pink_aria": "تمييز وردي",
94
- "blue_aria": "تمييز أزرق",
95
- "green_aria": "تمييز أخضر",
96
- "read_selection": "قراءة التحديد",
97
- "translation": "طلب ترجمة",
98
- "clear": "مسح التمييزات"
99
- },
100
- "ruler": {
101
- "switched_to": "تم التبديل إلى {unit}"
102
- }
103
- }
@@ -1,36 +0,0 @@
1
- {
2
- "common": {
3
- "save": "Save",
4
- "cancel": "Cancel",
5
- "close": "Close",
6
- "loading": "Loading...",
7
- "error": "Error",
8
- "retry": "Retry",
9
- "back": "Back",
10
- "next": "Next",
11
- "previous": "Previous",
12
- "submit": "Submit",
13
- "continue": "Continue",
14
- "finish": "Finish",
15
- "yes": "Yes",
16
- "no": "No",
17
- "ok": "OK",
18
- "settings": "Settings",
19
- "language": "Language",
20
- "theme": "Theme",
21
- "settings_aria": "Open settings menu",
22
- "rtl_notice": "RTL text direction active",
23
- "question": {
24
- "one": "Question",
25
- "other": "Questions"
26
- },
27
- "item": {
28
- "one": "Item",
29
- "other": "Items"
30
- },
31
- "character": {
32
- "one": "character",
33
- "other": "characters"
34
- }
35
- }
36
- }
@@ -1,48 +0,0 @@
1
- {
2
- "assessment": {
3
- "title": "Assessment",
4
- "questions": {
5
- "one": "{count} Question",
6
- "other": "{count} Questions"
7
- },
8
- "question_of": "Question {current} of {total}",
9
- "student_name": "Student Name",
10
- "fullscreen": "Fullscreen",
11
- "exit_fullscreen": "Exit Fullscreen",
12
- "enter_fullscreen_aria": "Enter fullscreen",
13
- "exit_fullscreen_aria": "Exit fullscreen"
14
- },
15
- "accommodation": {
16
- "audio": "Audio",
17
- "audio_aria": "Toggle audio/text-to-speech",
18
- "contrast": "Contrast",
19
- "contrast_aria": "Toggle color contrast"
20
- },
21
- "navigation": {
22
- "back": "← Back",
23
- "next": "Next →",
24
- "previous": "Previous",
25
- "submit": "Submit",
26
- "navigate_to": "Navigate to question {index}",
27
- "section": "Section"
28
- },
29
- "section": {
30
- "title": "Assessment Structure",
31
- "add": "+ Add Section",
32
- "untitled": "Untitled Section",
33
- "remove": "Remove section",
34
- "items": {
35
- "one": "{count} item",
36
- "other": "{count} items"
37
- },
38
- "aria_label": "Section: {title}",
39
- "drop_zone": "Drop items here",
40
- "unassigned": "Unassigned Items",
41
- "unassigned_instruction": "Drag these items into sections",
42
- "unassigned_item_aria": "Unassigned question: {title}"
43
- },
44
- "item": {
45
- "load_error": "Question could not be loaded.",
46
- "untitled": "Untitled"
47
- }
48
- }
@@ -1,103 +0,0 @@
1
- {
2
- "tool": {
3
- "calculator": "Calculator",
4
- "calculator_aria": "Open calculator",
5
- "graph": "Graph",
6
- "graph_aria": "Open graphing tool",
7
- "periodic_table": "Periodic Table",
8
- "periodic_table_aria": "Open periodic table",
9
- "protractor": "Protractor",
10
- "protractor_aria": "Open protractor",
11
- "ruler": "Ruler",
12
- "ruler_aria": "Open ruler",
13
- "line_reader": "Line Reader",
14
- "line_reader_aria": "Open line reader",
15
- "text_to_speech": "Text-to-Speech",
16
- "text_to_speech_aria": "Open text-to-speech",
17
- "color_scheme": "Color Scheme",
18
- "color_scheme_aria": "Open color scheme selector",
19
- "annotation": "Annotation",
20
- "annotation_aria": "Open annotation toolbar",
21
- "answer_eliminator": "Answer Eliminator"
22
- },
23
- "tts": {
24
- "title": "Text-to-Speech",
25
- "close_aria": "Close text-to-speech",
26
- "failed_init": "Failed to initialize TTS",
27
- "initializing": "Initializing...",
28
- "select_text": "Select text on the page to read it aloud.",
29
- "selected": "{count} {character} selected",
30
- "speed": "Speed:",
31
- "rate_slow": "Slow",
32
- "rate_slower": "Slower",
33
- "rate_normal": "Normal",
34
- "rate_faster": "Faster",
35
- "rate_fast": "Fast",
36
- "rate_very_fast": "Very Fast",
37
- "play": "Play",
38
- "pause": "Pause",
39
- "resume": "Resume",
40
- "stop": "Stop",
41
- "speaking": "Speaking...",
42
- "paused": "Paused"
43
- },
44
- "calculator": {
45
- "title": "Calculator",
46
- "aria_label": "Calculator tool - Use Alt+Arrow keys to move, Escape to close",
47
- "settings": "Calculator settings",
48
- "close": "Close calculator",
49
- "settings_title": "Calculator Settings",
50
- "type": "Calculator Type",
51
- "basic": "Basic",
52
- "scientific": "Scientific",
53
- "graphing": "Graphing",
54
- "configuration": "Configuration",
55
- "config_help": "These settings are useful for testing. They may be hidden or restricted for students in production.",
56
- "restricted_mode": "Restricted Mode (Test Mode)",
57
- "angle_mode": "Angle Mode",
58
- "degrees": "Degrees",
59
- "radians": "Radians",
60
- "qwerty": "QWERTY Keyboard",
61
- "screen_reader": "Screen Reader Support",
62
- "accessible_display": "Accessible Display",
63
- "settings_menu": "Settings Menu",
64
- "notes": "Notes",
65
- "folders": "Folders",
66
- "sliders": "Sliders",
67
- "display_mode": "Display Mode",
68
- "classic": "Classic",
69
- "mathprint": "MathPrint"
70
- },
71
- "color_scheme": {
72
- "title": "Color Scheme",
73
- "description": "Select a color scheme to improve readability and reduce eye strain.",
74
- "close_aria": "Close color scheme selector",
75
- "select_aria": "Select color scheme",
76
- "default": "Default",
77
- "default_desc": "Standard PIE colors",
78
- "black_on_white": "Black on White",
79
- "black_on_white_desc": "High contrast for readability",
80
- "white_on_black": "White on Black",
81
- "white_on_black_desc": "Inverse high contrast",
82
- "rose_on_green": "Rose on Green",
83
- "rose_on_green_desc": "Reduces glare",
84
- "yellow_on_blue": "Yellow on Blue",
85
- "yellow_on_blue_desc": "High contrast alternative",
86
- "black_on_rose": "Black on Rose",
87
- "black_on_rose_desc": "Warm background",
88
- "light_gray_on_dark_gray": "Light Gray on Dark Gray",
89
- "light_gray_on_dark_gray_desc": "Reduced brightness"
90
- },
91
- "annotation": {
92
- "yellow_aria": "Yellow highlight",
93
- "pink_aria": "Pink highlight",
94
- "blue_aria": "Blue highlight",
95
- "green_aria": "Green highlight",
96
- "read_selection": "Read selection",
97
- "translation": "Translation request",
98
- "clear": "Clear highlights"
99
- },
100
- "ruler": {
101
- "switched_to": "Switched to {unit}"
102
- }
103
- }
@@ -1,36 +0,0 @@
1
- {
2
- "common": {
3
- "save": "Guardar",
4
- "cancel": "Cancelar",
5
- "close": "Cerrar",
6
- "loading": "Cargando...",
7
- "error": "Error",
8
- "retry": "Reintentar",
9
- "back": "Atrás",
10
- "next": "Siguiente",
11
- "previous": "Anterior",
12
- "submit": "Enviar",
13
- "continue": "Continuar",
14
- "finish": "Finalizar",
15
- "yes": "Sí",
16
- "no": "No",
17
- "ok": "OK",
18
- "settings": "Configuración",
19
- "language": "Idioma",
20
- "theme": "Tema",
21
- "settings_aria": "Abrir menú de configuración",
22
- "rtl_notice": "Dirección de texto RTL activa",
23
- "question": {
24
- "one": "Pregunta",
25
- "other": "Preguntas"
26
- },
27
- "item": {
28
- "one": "Ítem",
29
- "other": "Ítems"
30
- },
31
- "character": {
32
- "one": "carácter",
33
- "other": "caracteres"
34
- }
35
- }
36
- }