@smart-cloud/ai-kit-ui 1.4.5 → 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/dist/index.cjs +9 -9
- package/dist/index.js +9 -9
- package/package.json +3 -2
- package/src/ai-feature/AiFeature.tsx +234 -15
- package/src/i18n/ar.ts +13 -13
- package/src/i18n/de.ts +5 -5
- package/src/i18n/es.ts +5 -5
- package/src/i18n/fr.ts +14 -14
- package/src/i18n/he.ts +16 -16
- package/src/i18n/hi.ts +16 -16
- package/src/i18n/hu.ts +4 -4
- package/src/i18n/id.ts +10 -10
- package/src/i18n/it.ts +7 -7
- package/src/i18n/ja.ts +10 -10
- package/src/i18n/ko.ts +11 -11
- package/src/i18n/nb.ts +6 -6
- package/src/i18n/nl.ts +6 -6
- package/src/i18n/pl.ts +19 -19
- package/src/i18n/pt.ts +4 -4
- package/src/i18n/ru.ts +8 -8
- package/src/i18n/sv.ts +5 -5
- package/src/i18n/th.ts +3 -3
- package/src/i18n/tr.ts +37 -37
- package/src/i18n/ua.ts +4 -4
- package/src/i18n/zh.ts +11 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smart-cloud/ai-kit-ui",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -20,10 +20,11 @@
|
|
|
20
20
|
"@emotion/cache": "^11.14.0",
|
|
21
21
|
"@emotion/react": "^11.14.0",
|
|
22
22
|
"@mantine/colors-generator": "^8.3.16",
|
|
23
|
-
"@smart-cloud/ai-kit-core": "^1.4.
|
|
23
|
+
"@smart-cloud/ai-kit-core": "^1.4.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 {
|
|
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,
|
|
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
|
-
[
|
|
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
|
-
}, [
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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: "
|
|
128
|
+
Proofread: "Korrekturlesen",
|
|
129
129
|
"Proofread again": "Erneut prüfen",
|
|
130
130
|
"Proofread on Backend": "Serverseitig prüfen",
|
|
131
|
-
Proofreading: "
|
|
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": "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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.",
|