@smart-cloud/ai-kit-ui 1.4.6 → 1.4.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/ai-kit-ui",
3
- "version": "1.4.6",
3
+ "version": "1.4.7",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -24,6 +24,7 @@
24
24
  "@smart-cloud/wpsuite-core": "^2.2.10",
25
25
  "@tabler/icons-react": "^3.40.0",
26
26
  "chroma-js": "^3.2.0",
27
+ "country-data-list": "^1.6.0",
27
28
  "react-markdown": "^10.1.0",
28
29
  "rehype-parse": "^9.0.1",
29
30
  "rehype-raw": "^7.0.0",
@@ -41,7 +41,16 @@ import {
41
41
  type WriteArgs,
42
42
  } from "@smart-cloud/ai-kit-core";
43
43
  import { I18n } from "aws-amplify/utils";
44
- import { FC, useCallback, useEffect, useMemo, useRef, useState } from "react";
44
+ import { countries } from "country-data-list";
45
+ import {
46
+ type ComponentProps,
47
+ FC,
48
+ useCallback,
49
+ useEffect,
50
+ useMemo,
51
+ useRef,
52
+ useState,
53
+ } from "react";
45
54
  import ReactMarkdown from "react-markdown";
46
55
  import remarkGfm from "remark-gfm";
47
56
 
@@ -80,8 +89,80 @@ type GeneratedPostMetadata = {
80
89
  excerpt?: string;
81
90
  };
82
91
 
92
+ type LanguageSelectorOption = {
93
+ value: AiKitLanguageCode;
94
+ label: string;
95
+ countryCode: string;
96
+ countryName: string;
97
+ flag: string;
98
+ };
99
+
100
+ type WriterTone = "neutral" | "formal" | "casual";
101
+ type RewriterTone = "as-is" | "more-formal" | "more-casual";
102
+ type WriterLength = "short" | "medium" | "long";
103
+ type RewriterLength = "as-is" | "shorter" | "longer";
104
+ type SummarizerLength = "short" | "medium" | "long";
105
+ type SummarizerType = "headline" | "key-points" | "teaser" | "tldr";
106
+ type ProofreadResult = {
107
+ corrections: ComponentProps<typeof ProofreadDiff>["corrections"];
108
+ correctedInput?: string;
109
+ };
110
+
83
111
  const aiKit = getAiKitPlugin();
84
112
 
113
+ const LANGUAGE_TO_COUNTRY_CODE: Record<AiKitLanguageCode, string> = {
114
+ ar: "SA",
115
+ en: "US",
116
+ zh: "CN",
117
+ nl: "NL",
118
+ fr: "FR",
119
+ de: "DE",
120
+ he: "IL",
121
+ hi: "IN",
122
+ hu: "HU",
123
+ id: "ID",
124
+ it: "IT",
125
+ ja: "JP",
126
+ ko: "KR",
127
+ no: "NO",
128
+ pl: "PL",
129
+ pt: "PT",
130
+ ru: "RU",
131
+ es: "ES",
132
+ sv: "SE",
133
+ th: "TH",
134
+ tr: "TR",
135
+ uk: "UA",
136
+ };
137
+
138
+ const RTL_LANGUAGES = new Set<AiKitLanguageCode>(["ar", "he"]);
139
+
140
+ const countryLookup = countries as Record<string, { name?: string }>;
141
+
142
+ function getFlagEmoji(countryCode: string): string {
143
+ return countryCode
144
+ .toUpperCase()
145
+ .replace(/./g, (char) => String.fromCodePoint(127397 + char.charCodeAt(0)));
146
+ }
147
+
148
+ function isRtlLanguage(code?: AiKitLanguageCode | "" | null): boolean {
149
+ return Boolean(code && RTL_LANGUAGES.has(code as AiKitLanguageCode));
150
+ }
151
+
152
+ function getSupportedLanguageOptions(): LanguageSelectorOption[] {
153
+ return LANGUAGE_OPTIONS.map((languageOption) => {
154
+ const countryCode = LANGUAGE_TO_COUNTRY_CODE[languageOption.value];
155
+
156
+ return {
157
+ value: languageOption.value,
158
+ label: languageOption.label,
159
+ countryCode,
160
+ countryName: countryLookup[countryCode]?.name || languageOption.label,
161
+ flag: getFlagEmoji(countryCode),
162
+ };
163
+ });
164
+ }
165
+
85
166
  const postResponseConstraint = {
86
167
  type: "object",
87
168
  properties: {
@@ -314,9 +395,28 @@ const AiFeatureBase: FC<AiFeatureProps & AiKitShellInjectedProps> = (props) => {
314
395
  onAccept,
315
396
  onOptionsChanged,
316
397
  language,
398
+ direction,
317
399
  rootElement,
318
400
  } = props;
319
401
 
402
+ const [languageOverride, setLanguageOverride] = useState<
403
+ AiKitLanguageCode | undefined
404
+ >();
405
+ const [directionOverride, setDirectionOverride] = useState<
406
+ "ltr" | "rtl" | "auto" | undefined
407
+ >();
408
+
409
+ const effectiveUiLanguage = languageOverride ?? normalizeLang(language);
410
+ const effectiveDirection = useMemo(() => {
411
+ const activeDirection = languageOverride ? directionOverride : direction;
412
+
413
+ if (!activeDirection || activeDirection === "auto") {
414
+ return isRtlLanguage(effectiveUiLanguage) ? "rtl" : "ltr";
415
+ }
416
+
417
+ return activeDirection;
418
+ }, [direction, directionOverride, effectiveUiLanguage, languageOverride]);
419
+
320
420
  const allowOverride = {
321
421
  text: allowOverrideDefaults?.text ?? true,
322
422
  instructions: allowOverrideDefaults?.instructions ?? true,
@@ -341,7 +441,7 @@ const AiFeatureBase: FC<AiFeatureProps & AiKitShellInjectedProps> = (props) => {
341
441
  (mode === "summarize" && allowOverride?.type) ||
342
442
  allowOverride?.outputLanguage,
343
443
  );
344
- }, [allowOverride]);
444
+ }, [allowOverride, mode]);
345
445
 
346
446
  const [state, setState] = useState<string>();
347
447
  const [featureOpen, setFeatureOpen] = useState<boolean>(!showOpenButton);
@@ -377,11 +477,12 @@ const AiFeatureBase: FC<AiFeatureProps & AiKitShellInjectedProps> = (props) => {
377
477
  const [type, setType] = useState<SummarizerType | undefined>(defaults?.type);
378
478
 
379
479
  const autoRunOnceRef = useRef(false);
480
+ const supportedLanguageOptions = useMemo(
481
+ () => getSupportedLanguageOptions(),
482
+ [],
483
+ );
380
484
 
381
485
  const defaultTitle = useMemo(() => {
382
- if (language) {
383
- I18n.setLanguage(language || "en");
384
- }
385
486
  if (title) {
386
487
  return title;
387
488
  }
@@ -411,7 +512,7 @@ const AiFeatureBase: FC<AiFeatureProps & AiKitShellInjectedProps> = (props) => {
411
512
  break;
412
513
  }
413
514
  return t;
414
- }, [title, mode, language]);
515
+ }, [title, mode, effectiveUiLanguage]);
415
516
 
416
517
  const formatAiKitStatus = useCallback(
417
518
  (e: AiKitStatusEvent | null): string | null => {
@@ -464,7 +565,7 @@ const AiFeatureBase: FC<AiFeatureProps & AiKitShellInjectedProps> = (props) => {
464
565
  return msg || I18n.get("Working...");
465
566
  }
466
567
  },
467
- [language, mode],
568
+ [effectiveUiLanguage, mode],
468
569
  );
469
570
 
470
571
  const inputText = useMemo(() => {
@@ -996,7 +1097,7 @@ Follow these additional instructions: ${instructions}`
996
1097
  default:
997
1098
  return ai.lastSource ? I18n.get("Regenerate") : I18n.get("Generate");
998
1099
  }
999
- }, [language, ai.lastSource, mode]);
1100
+ }, [effectiveUiLanguage, ai.lastSource, mode]);
1000
1101
 
1001
1102
  const getRegenerateOnBackendTitle = useCallback(() => {
1002
1103
  switch (mode) {
@@ -1011,7 +1112,7 @@ Follow these additional instructions: ${instructions}`
1011
1112
  default:
1012
1113
  return I18n.get("Regenerate on Backend");
1013
1114
  }
1014
- }, [language, mode]);
1115
+ }, [effectiveUiLanguage, mode]);
1015
1116
 
1016
1117
  const close = useCallback(async () => {
1017
1118
  setFeatureOpen(false);
@@ -1082,6 +1183,16 @@ Follow these additional instructions: ${instructions}`
1082
1183
  };
1083
1184
  }, []);
1084
1185
 
1186
+ useEffect(() => {
1187
+ if (!languageOverride) {
1188
+ return;
1189
+ }
1190
+
1191
+ setDirectionOverride("auto");
1192
+ setOutputLanguage(languageOverride);
1193
+ setDetectedLanguage(undefined);
1194
+ }, [languageOverride]);
1195
+
1085
1196
  const optionsSummary = useMemo(() => {
1086
1197
  const parts: string[] = [];
1087
1198
 
@@ -1126,7 +1237,7 @@ Follow these additional instructions: ${instructions}`
1126
1237
 
1127
1238
  return parts.length ? parts.join(" • ") : I18n.get("No overrides");
1128
1239
  }, [
1129
- language,
1240
+ effectiveUiLanguage,
1130
1241
  mode,
1131
1242
  inputLanguage,
1132
1243
  outputLanguage,
@@ -1151,6 +1262,89 @@ Follow these additional instructions: ${instructions}`
1151
1262
  const CollapseComponent = optionsDisplay === "collapse" ? Collapse : Stack;
1152
1263
  const OptionsComponent = optionsDisplay === "horizontal" ? Group : Stack;
1153
1264
 
1265
+ const selectedLanguageOption = useMemo(
1266
+ () =>
1267
+ supportedLanguageOptions.find(
1268
+ (option) =>
1269
+ option.value === (languageOverride ?? normalizeLang(language)),
1270
+ ) ?? supportedLanguageOptions[0],
1271
+ [language, languageOverride, supportedLanguageOptions],
1272
+ );
1273
+
1274
+ const renderedOutputLanguage = useMemo(() => {
1275
+ if (outputLanguage && outputLanguage !== "auto") {
1276
+ return outputLanguage;
1277
+ }
1278
+
1279
+ return languageOverride || readDefaultOutputLanguage() || "";
1280
+ }, [languageOverride, outputLanguage]);
1281
+
1282
+ const renderLanguageOverrideSelect = useCallback(
1283
+ (size: "xs" | "sm" = "sm") => (
1284
+ <Select
1285
+ allowDeselect={false}
1286
+ aria-label={I18n.get("Interface language")}
1287
+ checkIconPosition="right"
1288
+ className="ai-feature-language-selector"
1289
+ comboboxProps={{ width: 220 }}
1290
+ data={supportedLanguageOptions.map((option) => ({
1291
+ value: option.value,
1292
+ label: option.flag,
1293
+ }))}
1294
+ disabled={ai.busy}
1295
+ onChange={(value) => {
1296
+ const nextLanguage = normalizeLang(value);
1297
+
1298
+ if (!nextLanguage) {
1299
+ return;
1300
+ }
1301
+
1302
+ setLanguageOverride(nextLanguage);
1303
+ }}
1304
+ renderOption={({ option }) => {
1305
+ const languageOption = supportedLanguageOptions.find(
1306
+ (item) => item.value === option.value,
1307
+ );
1308
+
1309
+ if (!languageOption) {
1310
+ return option.label;
1311
+ }
1312
+
1313
+ return (
1314
+ <Group gap="xs" wrap="nowrap">
1315
+ <span aria-hidden="true">{languageOption.flag}</span>
1316
+ <span>{I18n.get(languageOption.countryName)}</span>
1317
+ </Group>
1318
+ );
1319
+ }}
1320
+ searchable={false}
1321
+ size={size}
1322
+ styles={{
1323
+ input: {
1324
+ fontSize: 18,
1325
+ lineHeight: 1,
1326
+ minHeight: size === "sm" ? 36 : 28,
1327
+ paddingInlineStart: 10,
1328
+ paddingInlineEnd: 28,
1329
+ textAlign: "center",
1330
+ width: size === "sm" ? 72 : 60,
1331
+ },
1332
+ section: {
1333
+ width: 24,
1334
+ },
1335
+ }}
1336
+ value={selectedLanguageOption?.value || null}
1337
+ w={size === "sm" ? 72 : 60}
1338
+ />
1339
+ ),
1340
+ [
1341
+ ai.busy,
1342
+ selectedLanguageOption?.value,
1343
+ setLanguageOverride,
1344
+ supportedLanguageOptions,
1345
+ ],
1346
+ );
1347
+
1154
1348
  useEffect(() => {
1155
1349
  if (variation !== "modal" || !featureOpen) {
1156
1350
  return;
@@ -1222,6 +1416,9 @@ Follow these additional instructions: ${instructions}`
1222
1416
  <Modal.Header style={{ zIndex: 1000 }}>
1223
1417
  {getOpenButtonDefaultIcon("ai-feature-title-icon")}
1224
1418
  <Modal.Title>{I18n.get(defaultTitle)}</Modal.Title>
1419
+ <div style={{ marginLeft: "auto", marginRight: 8 }}>
1420
+ {renderLanguageOverrideSelect("xs")}
1421
+ </div>
1225
1422
  <Modal.CloseButton />
1226
1423
  </Modal.Header>
1227
1424
  )}
@@ -1231,7 +1428,13 @@ Follow these additional instructions: ${instructions}`
1231
1428
  working={ai.busy}
1232
1429
  variation={variation}
1233
1430
  >
1234
- <Stack gap="sm" mb="sm" p="sm">
1431
+ <Stack gap="sm" mb="sm" p="sm" dir={effectiveDirection}>
1432
+ {variation !== "modal" && (
1433
+ <Group justify="flex-end">
1434
+ {renderLanguageOverrideSelect()}
1435
+ </Group>
1436
+ )}
1437
+
1235
1438
  {/* ERROR */}
1236
1439
  {error && <Alert color="red">{I18n.get(error)}</Alert>}
1237
1440
 
@@ -1877,6 +2080,7 @@ Follow these additional instructions: ${instructions}`
1877
2080
  mode !== "generatePostMetadata" &&
1878
2081
  typeof generated === "string" && (
1879
2082
  <MarkdownResult
2083
+ contentLanguage={renderedOutputLanguage}
1880
2084
  value={generated}
1881
2085
  editable={!!editable}
1882
2086
  onChange={(v) => {
@@ -1887,7 +2091,11 @@ Follow these additional instructions: ${instructions}`
1887
2091
  </Stack>
1888
2092
  )}
1889
2093
  {generated === "" && (
1890
- <MarkdownResult value={generated} editable={false} />
2094
+ <MarkdownResult
2095
+ contentLanguage={renderedOutputLanguage}
2096
+ value={generated}
2097
+ editable={false}
2098
+ />
1891
2099
  )}
1892
2100
  </Stack>
1893
2101
  {/* ACTIONS */}
@@ -1974,11 +2182,14 @@ Follow these additional instructions: ${instructions}`
1974
2182
  };
1975
2183
 
1976
2184
  function MarkdownResult(props: {
2185
+ contentLanguage?: AiKitLanguageCode | "";
1977
2186
  value: string;
1978
2187
  editable: boolean;
1979
2188
  onChange?: (v: string) => void;
1980
2189
  }) {
1981
- const { value, editable, onChange } = props;
2190
+ const { contentLanguage, value, editable, onChange } = props;
2191
+ const contentDirection = isRtlLanguage(contentLanguage) ? "rtl" : "ltr";
2192
+ const contentAlign = contentDirection === "rtl" ? "right" : "left";
1982
2193
 
1983
2194
  if (editable) {
1984
2195
  return (
@@ -1995,7 +2206,11 @@ function MarkdownResult(props: {
1995
2206
  />
1996
2207
 
1997
2208
  <Input.Label>{I18n.get("Preview")}</Input.Label>
1998
- <Stack className="ai-feature-generated-content ai-feature-preview">
2209
+ <Stack
2210
+ className="ai-feature-generated-content ai-feature-preview"
2211
+ dir={contentDirection}
2212
+ style={{ textAlign: contentAlign }}
2213
+ >
1999
2214
  <ReactMarkdown remarkPlugins={[remarkGfm]}>{value}</ReactMarkdown>
2000
2215
  </Stack>
2001
2216
  </Stack>
@@ -2003,7 +2218,11 @@ function MarkdownResult(props: {
2003
2218
  }
2004
2219
 
2005
2220
  return (
2006
- <Stack className="ai-feature-generated-content">
2221
+ <Stack
2222
+ className="ai-feature-generated-content"
2223
+ dir={contentDirection}
2224
+ style={{ textAlign: contentAlign }}
2225
+ >
2007
2226
  {value ? (
2008
2227
  <ReactMarkdown remarkPlugins={[remarkGfm]}>{value}</ReactMarkdown>
2009
2228
  ) : (
package/src/i18n/ar.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export const arDict: Record<string, string> = {
2
2
  "--- Select ---": "--- اختر ---",
3
- Accept: "يقبل",
3
+ Accept: "قبول",
4
4
  "Accept response": "قبول الرد",
5
5
  Add: "إضافة",
6
6
  "Add image": "إضافة صورة",
@@ -24,7 +24,7 @@ export const arDict: Record<string, string> = {
24
24
  "Audio no longer available": "الرسالة الصوتية لم تعد متاحة",
25
25
  "Audio recorded": "تم تسجيل الصوت",
26
26
  auto: "آلي",
27
- "Auto-detect": "الكشف التلقائي",
27
+ "Auto-detect": "اكتشاف تلقائي",
28
28
  Cancel: "يلغي",
29
29
  Caption: "التسمية التوضيحية",
30
30
  Casual: "غير رسمي",
@@ -32,7 +32,7 @@ export const arDict: Record<string, string> = {
32
32
  Categories: "الفئات",
33
33
  "Checking capabilities…": "إمكانيات الفحص…",
34
34
  Chinese: "الصينية",
35
- Clear: "",
35
+ Clear: "مسح",
36
36
  "Clear audio": "مسح الصوت",
37
37
  "Click again to confirm": "انقر مرة أخرى للتأكيد",
38
38
  Close: "يغلق",
@@ -63,7 +63,7 @@ export const arDict: Record<string, string> = {
63
63
  Formal: "رَسمِيّ",
64
64
  formal: "رَسمِيّ",
65
65
  French: "فرنسي",
66
- Generate: "يولد",
66
+ Generate: "إنشاء",
67
67
  "Generate Image Metadata": "إنشاء بيانات وصفية للصورة",
68
68
  "Generate Post Metadata": "إنشاء بيانات وصفية للمقال",
69
69
  "Generated content": "المحتوى المُنشأ",
@@ -98,7 +98,7 @@ export const arDict: Record<string, string> = {
98
98
  long: "طويل",
99
99
  Longer: "أطول",
100
100
  longer: "أطول",
101
- Markdown: "تخفيض السعر",
101
+ Markdown: "Markdown",
102
102
  Maximize: "تكبير",
103
103
  Medium: "واسطة",
104
104
  medium: "واسطة",
@@ -127,14 +127,14 @@ export const arDict: Record<string, string> = {
127
127
  Preview: "معاينة",
128
128
  Proofread: "التدقيق اللغوي",
129
129
  "Proofread again": "راجع النص مرة أخرى",
130
- "Proofread on Backend": "تمت المراجعة في الواجهة الخلفية",
130
+ "Proofread on Backend": "تدقيق لغوي على الخادم",
131
131
  Proofreading: "التدقيق اللغوي",
132
132
  "Proofreading part {current}/{total}...":
133
133
  "جارٍ تدقيق الجزء {current}/{total}...",
134
134
  "Ready.": "جاهز.",
135
135
  "Received backend response.": "تم استلام رد من الخادم الخلفي.",
136
136
  "Receiving response...": "جارٍ استلام الرد...",
137
- Record: "",
137
+ Record: "تسجيل",
138
138
  "Record audio": "تسجيل الصوت",
139
139
  "Recorded audio:": "صوت مسجّل:",
140
140
  "Recording...": "جارٍ التسجيل...",
@@ -151,7 +151,7 @@ export const arDict: Record<string, string> = {
151
151
  "Restore size": "استعادة الحجم",
152
152
  Rewrite: "إعادة كتابة",
153
153
  "Rewrite again": "أعد الكتابة مرة أخرى",
154
- "Rewrite on Backend": "إعادة كتابة الكود في الواجهة الخلفية",
154
+ "Rewrite on Backend": "إعادة كتابة على الخادم",
155
155
  "Rewriting part {current}/{total}...":
156
156
  "جارٍ إعادة كتابة الجزء {current}/{total}...",
157
157
  "Rewriting text": "إعادة كتابة النص",
@@ -179,13 +179,13 @@ export const arDict: Record<string, string> = {
179
179
  "Suggested change": "التغيير المقترح",
180
180
  Summarize: "لخص",
181
181
  "Summarize again": "أعد التلخيص",
182
- "Summarize on Backend": "تلخيص على الواجهة الخلفية",
182
+ "Summarize on Backend": "تلخيص على الخادم",
183
183
  Summarizing: "ملخص",
184
184
  "Summarizing part {current}/{total}...":
185
185
  "جارٍ تلخيص الجزء {current}/{total}...",
186
186
  Swedish: "السويدية",
187
187
  Tags: "الوسوم",
188
- Teaser: "إعلان تشويقي",
188
+ Teaser: "نص تمهيدي",
189
189
  teaser: "إعلان تشويقي",
190
190
  Thai: "تايلاندي",
191
191
  "The alt text for the image.": "النص البديل للصورة.",
@@ -208,11 +208,11 @@ export const arDict: Record<string, string> = {
208
208
  Title: "عنوان",
209
209
  "TL;DR": "باختصار شديد",
210
210
  tldr: "باختصار",
211
- Tone: "نغمة",
212
- Topic: "عنوان",
211
+ Tone: "الأسلوب",
212
+ Topic: "الموضوع",
213
213
  Translate: "يترجم",
214
214
  "Translate again": "ترجم مرة أخرى",
215
- "Translate on Backend": "الترجمة في الواجهة الخلفية",
215
+ "Translate on Backend": "ترجمة على الخادم",
216
216
  Translating: "الترجمة",
217
217
  "Translating part {current}/{total}...":
218
218
  "جارٍ ترجمة الجزء {current}/{total}...",
package/src/i18n/de.ts CHANGED
@@ -32,7 +32,7 @@ export const deDict: Record<string, string> = {
32
32
  Categories: "Kategorien",
33
33
  "Checking capabilities…": "Fähigkeiten werden geprüft…",
34
34
  Chinese: "Chinesisch",
35
- Clear: "",
35
+ Clear: "Leeren",
36
36
  "Clear audio": "Audio löschen",
37
37
  "Click again to confirm": "Zum Bestätigen erneut klicken",
38
38
  Close: "Schließen",
@@ -125,16 +125,16 @@ export const deDict: Record<string, string> = {
125
125
  Portuguese: "Portugiesisch",
126
126
  "Powered by": "Angetrieben von",
127
127
  Preview: "Vorschau",
128
- Proofread: "Prüfen",
128
+ Proofread: "Korrekturlesen",
129
129
  "Proofread again": "Erneut prüfen",
130
130
  "Proofread on Backend": "Serverseitig prüfen",
131
- Proofreading: "Textprüfung",
131
+ Proofreading: "Korrekturlesen",
132
132
  "Proofreading part {current}/{total}...":
133
133
  "Teil {current}/{total} wird Korrektur gelesen...",
134
134
  "Ready.": "Bereit.",
135
135
  "Received backend response.": "Backend-Antwort erhalten.",
136
136
  "Receiving response...": "Antwort wird empfangen...",
137
- Record: "",
137
+ Record: "Aufnehmen",
138
138
  "Record audio": "Audio aufnehmen",
139
139
  "Recorded audio:": "Aufgenommenes Audio:",
140
140
  "Recording...": "Wird aufgenommen...",
@@ -159,7 +159,7 @@ export const deDict: Record<string, string> = {
159
159
  Russian: "Russisch",
160
160
  Search: "Suchen",
161
161
  "Search the documentation…": "Durchsuchen Sie die Dokumentation…",
162
- "Search with AI-Kit": "Suche mit AI-Kit",
162
+ "Search with AI-Kit": "Mit AI-Kit suchen",
163
163
  "Searching…": "Suche…",
164
164
  "Select or type tags…": "Tags auswählen oder eingeben…",
165
165
  Send: "Senden",
package/src/i18n/es.ts CHANGED
@@ -32,7 +32,7 @@ export const esDict: Record<string, string> = {
32
32
  Categories: "Categorías",
33
33
  "Checking capabilities…": "Comprobando capacidades…",
34
34
  Chinese: "Chino",
35
- Clear: "",
35
+ Clear: "Borrar",
36
36
  "Clear audio": "Borrar audio",
37
37
  "Click again to confirm": "Haz clic de nuevo para confirmar",
38
38
  Close: "Cerrar",
@@ -100,7 +100,7 @@ export const esDict: Record<string, string> = {
100
100
  long: "largo",
101
101
  Longer: "Más extenso",
102
102
  longer: "más extenso",
103
- Markdown: "Reducción",
103
+ Markdown: "Markdown",
104
104
  Maximize: "Maximizar",
105
105
  Medium: "Medio",
106
106
  medium: "medio",
@@ -136,13 +136,13 @@ export const esDict: Record<string, string> = {
136
136
  "Ready.": "Listo.",
137
137
  "Received backend response.": "Se recibió una respuesta del backend.",
138
138
  "Receiving response...": "Recibiendo respuesta...",
139
- Record: "",
139
+ Record: "Grabar",
140
140
  "Record audio": "Grabar audio",
141
141
  "Recorded audio:": "Audio grabado:",
142
142
  "Recording...": "Grabando...",
143
143
  Reference: "Referencia",
144
144
  References: "Referencias",
145
- Regenerate: "Regenerado",
145
+ Regenerate: "Regenerar",
146
146
  "Regenerate on Backend": "Regenerar en el backend",
147
147
  "Reject response": "Rechazar respuesta",
148
148
  "Remove image": "Eliminar imagen",
@@ -187,7 +187,7 @@ export const esDict: Record<string, string> = {
187
187
  "Resumiendo la parte {current}/{total}...",
188
188
  Swedish: "sueco",
189
189
  Tags: "Etiquetas",
190
- Teaser: "Rompecabezas",
190
+ Teaser: "Texto teaser",
191
191
  teaser: "rompecabezas",
192
192
  Thai: "tailandés",
193
193
  "The alt text for the image.": "El texto alternativo de la imagen.",
package/src/i18n/fr.ts CHANGED
@@ -17,7 +17,7 @@ export const frDict: Record<string, string> = {
17
17
  "As-Is": "Sans modification",
18
18
  "as-is": "tel quel",
19
19
  "Ask anything…": "Demandez n’importe quoi…",
20
- "Ask me": "Demandez-moi",
20
+ "Ask me": "Posez-moi une question",
21
21
  Assistant: "Assistant",
22
22
  "Assistant is thinking…": "L'assistant réfléchit…",
23
23
  "Audio message": "Message audio",
@@ -27,12 +27,12 @@ export const frDict: Record<string, string> = {
27
27
  "Auto-detect": "Détection automatique",
28
28
  Cancel: "Annuler",
29
29
  Caption: "Légende",
30
- Casual: "Informel",
31
- casual: "occasionnel",
30
+ Casual: "Décontracté",
31
+ casual: "décontracté",
32
32
  Categories: "Catégories",
33
33
  "Checking capabilities…": "Vérification des capacités…",
34
34
  Chinese: "Chinois",
35
- Clear: "",
35
+ Clear: "Effacer",
36
36
  "Clear audio": "Effacer l’audio",
37
37
  "Click again to confirm": "Cliquez à nouveau pour confirmer",
38
38
  Close: "Fermer",
@@ -62,15 +62,15 @@ export const frDict: Record<string, string> = {
62
62
  Error: "Erreur",
63
63
  Excerpt: "Extrait",
64
64
  Filters: "Filtres",
65
- Formal: "Officiel",
66
- formal: "officiel",
65
+ Formal: "Formel",
66
+ formal: "formel",
67
67
  French: "Français",
68
68
  Generate: "Générer",
69
69
  "Generate Image Metadata": "Générer les métadonnées de l’image",
70
70
  "Generate Post Metadata": "Générer les métadonnées de l’article",
71
71
  "Generated content": "Contenu généré",
72
72
  "Generating text": "Générer du texte",
73
- "Generating…": "Générateur…",
73
+ "Generating…": "Génération…",
74
74
  German: "Allemand",
75
75
  Headline: "Titre",
76
76
  headline: "titre",
@@ -100,7 +100,7 @@ export const frDict: Record<string, string> = {
100
100
  long: "long",
101
101
  Longer: "Plus long",
102
102
  longer: "plus long",
103
- Markdown: "Réduction",
103
+ Markdown: "Markdown",
104
104
  Maximize: "Agrandir",
105
105
  Medium: "Moyen",
106
106
  medium: "moyen",
@@ -114,7 +114,7 @@ export const frDict: Record<string, string> = {
114
114
  "No content generated.": "Aucun contenu généré.",
115
115
  "No issues found. Your text looks great!":
116
116
  "Aucun problème détecté. Votre texte est parfait !",
117
- "No overrides": "Aucune surcharge",
117
+ "No overrides": "Aucun remplacement",
118
118
  Norwegian: "norvégien",
119
119
  "Not sent": "Non envoyé",
120
120
  "On-device model ready.": "Modèle embarqué prêt.",
@@ -130,13 +130,13 @@ export const frDict: Record<string, string> = {
130
130
  Proofread: "Relecture",
131
131
  "Proofread again": "Relisez-vous.",
132
132
  "Proofread on Backend": "Relecture côté serveur",
133
- Proofreading: "relecture",
133
+ Proofreading: "Relecture",
134
134
  "Proofreading part {current}/{total}...":
135
135
  "Relecture de la partie {current}/{total}...",
136
136
  "Ready.": "Prêt.",
137
137
  "Received backend response.": "Réponse du serveur reçue.",
138
138
  "Receiving response...": "Réception de la réponse...",
139
- Record: "",
139
+ Record: "Enregistrer",
140
140
  "Record audio": "Enregistrer l’audio",
141
141
  "Recorded audio:": "Audio enregistré:",
142
142
  "Recording...": "Enregistrement...",
@@ -151,7 +151,7 @@ export const frDict: Record<string, string> = {
151
151
  Reset: "Réinitialiser",
152
152
  "Reset conversation": "Réinitialiser la conversation",
153
153
  "Restore size": "Rétablir la taille",
154
- Rewrite: "Récrire",
154
+ Rewrite: "Réécrire",
155
155
  "Rewrite again": "Réécrire",
156
156
  "Rewrite on Backend": "Réécriture côté serveur",
157
157
  "Rewriting part {current}/{total}...":
@@ -161,7 +161,7 @@ export const frDict: Record<string, string> = {
161
161
  Russian: "russe",
162
162
  Search: "Recherche",
163
163
  "Search the documentation…": "Consultez la documentation…",
164
- "Search with AI-Kit": "Recherche avec kit d'IA",
164
+ "Search with AI-Kit": "Rechercher avec AI-Kit",
165
165
  "Searching…": "Recherche…",
166
166
  "Select or type tags…": "Sélectionnez ou saisissez des tags…",
167
167
  Send: "Envoyer",
@@ -187,7 +187,7 @@ export const frDict: Record<string, string> = {
187
187
  "Résumé de la partie {current}/{total}...",
188
188
  Swedish: "suédois",
189
189
  Tags: "Tags",
190
- Teaser: "Taquin",
190
+ Teaser: "Texte d’accroche",
191
191
  teaser: "taquin",
192
192
  Thai: "thaïlandais",
193
193
  "The alt text for the image.": "Texte alternatif de l'image.",