From 6d27dc4cda10d32ab7e47e7b186a1ec66b0bbfe5 Mon Sep 17 00:00:00 2001 From: sepehr Date: Mon, 1 Jun 2026 00:28:24 +0200 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20Phase=201=20=E2=80=94=20migrate?= =?UTF-8?q?=205=20critical=20files=20from=20hardcoded=20text=20to=20i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 47 new i18n keys added across all 13 locales (en, fr, es, de, pt, it, nl, ru, ja, ko, zh, ar, fa). English and French are fully translated, remaining locales use French as placeholder. Files migrated: - EditGlossaryDialog.tsx (18 strings) - DeleteGlossaryDialog.tsx (7 strings) - ProUpgradePrompt.tsx (10 strings) - WebhookSnippet.tsx (4 strings) - TranslationModeToggle.tsx (8 strings) Co-Authored-By: Claude Opus 4.8 --- .../app/dashboard/api-keys/WebhookSnippet.tsx | 7 +- .../glossaries/DeleteGlossaryDialog.tsx | 18 +- .../glossaries/EditGlossaryDialog.tsx | 40 +- .../dashboard/glossaries/ProUpgradePrompt.tsx | 19 +- .../translate/TranslationModeToggle.tsx | 18 +- frontend/src/lib/i18n.tsx | 611 ++++++++++++++++++ 6 files changed, 666 insertions(+), 47 deletions(-) diff --git a/frontend/src/app/dashboard/api-keys/WebhookSnippet.tsx b/frontend/src/app/dashboard/api-keys/WebhookSnippet.tsx index e8b9ea8..31c5620 100644 --- a/frontend/src/app/dashboard/api-keys/WebhookSnippet.tsx +++ b/frontend/src/app/dashboard/api-keys/WebhookSnippet.tsx @@ -5,6 +5,7 @@ import { Webhook, Copy, Check } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { API_BASE_URL } from '@/lib/apiClient'; +import { useI18n } from '@/lib/i18n'; function getWebhookSnippet(): string { const baseUrl = API_BASE_URL.replace(/\/$/, ''); @@ -18,6 +19,7 @@ function getWebhookSnippet(): string { } export function WebhookSnippet() { + const { t } = useI18n(); const [copied, setCopied] = useState(false); const webhookSnippet = useMemo(() => getWebhookSnippet(), []); @@ -33,13 +35,12 @@ export function WebhookSnippet() {
- Webhook Integration + {t('apiKeys.webhook.title')}

- Pass a webhook_url parameter - to receive a POST request when your translation is complete. + {t('apiKeys.webhook.descriptionBefore')}{t('apiKeys.webhook.codeParam')}{t('apiKeys.webhook.descriptionAfter')}

- diff --git a/frontend/src/app/dashboard/glossaries/EditGlossaryDialog.tsx b/frontend/src/app/dashboard/glossaries/EditGlossaryDialog.tsx index 42a7f31..fbdb9b4 100644 --- a/frontend/src/app/dashboard/glossaries/EditGlossaryDialog.tsx +++ b/frontend/src/app/dashboard/glossaries/EditGlossaryDialog.tsx @@ -18,6 +18,7 @@ import { exportGlossaryToCsv, parseCsvToTerms } from './csvUtils'; import { useToast } from '@/components/ui/toast'; import type { Glossary, GlossaryTermInput } from './types'; import { MAX_TERMS_PER_GLOSSARY, SUPPORTED_LANGUAGES } from './types'; +import { useI18n } from '@/lib/i18n'; interface EditGlossaryDialogProps { open: boolean; @@ -41,6 +42,7 @@ export function EditGlossaryDialog({ onSave, isSaving, }: EditGlossaryDialogProps) { + const { t } = useI18n(); const [name, setName] = useState(''); const [sourceLanguage, setSourceLanguage] = useState('fr'); const [targetLanguage, setTargetLanguage] = useState('multi'); @@ -133,22 +135,22 @@ export function EditGlossaryDialog({ if (importedTerms.length > MAX_TERMS_PER_GLOSSARY) { toast({ variant: 'destructive', - title: 'Import failed', - description: `CSV contains ${importedTerms.length} terms, but maximum is ${MAX_TERMS_PER_GLOSSARY}. Please reduce the number of terms.`, + title: t('glossaries.edit.importFailedTitle'), + description: t('glossaries.edit.importFailedMaxDesc', { count: importedTerms.length, max: MAX_TERMS_PER_GLOSSARY }), }); e.target.value = ''; return; } setTerms(importedTerms); toast({ - title: 'Import successful', - description: `${importedTerms.length} terms imported successfully.`, + title: t('glossaries.edit.importSuccessTitle'), + description: t('glossaries.edit.importSuccessDesc', { count: importedTerms.length }), }); } else { toast({ variant: 'destructive', - title: 'Import failed', - description: 'No valid terms found in CSV file.', + title: t('glossaries.edit.importFailedTitle'), + description: t('glossaries.edit.importFailedEmptyDesc'), }); } } @@ -156,8 +158,8 @@ export function EditGlossaryDialog({ reader.onerror = () => { toast({ variant: 'destructive', - title: 'Import failed', - description: 'Failed to read CSV file.', + title: t('glossaries.edit.importFailedTitle'), + description: t('glossaries.edit.importFailedReadDesc'), }); }; reader.readAsText(file); @@ -171,27 +173,27 @@ export function EditGlossaryDialog({ - Edit Glossary + {t('glossaries.edit.title')} - Update the glossary name, language pair, and terms. + {t('glossaries.edit.description')}
- + setName(e.target.value)} - placeholder="Enter glossary name..." + placeholder={t('glossaries.edit.namePlaceholder')} disabled={isSaving} />
- + handleTargetLanguageChange(e.target.value)} @@ -220,7 +222,7 @@ export function EditGlossaryDialog({
- + - Export CSV + {t('glossaries.edit.exportCsv')} onOpenChange(false)} disabled={isSaving} > - Cancel + {t('glossaries.edit.cancel')} diff --git a/frontend/src/app/dashboard/glossaries/ProUpgradePrompt.tsx b/frontend/src/app/dashboard/glossaries/ProUpgradePrompt.tsx index 34fe4de..8c5e6f7 100644 --- a/frontend/src/app/dashboard/glossaries/ProUpgradePrompt.tsx +++ b/frontend/src/app/dashboard/glossaries/ProUpgradePrompt.tsx @@ -4,8 +4,10 @@ import { BookText, Sparkles } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import Link from 'next/link'; +import { useI18n } from '@/lib/i18n'; export function ProUpgradePrompt() { + const { t } = useI18n(); return (
@@ -13,39 +15,38 @@ export function ProUpgradePrompt() {
- Glossaries + {t('glossaries.upgrade.title')} - Customize your translations with custom terminology + {t('glossaries.upgrade.description')}
- Create multiple glossaries + {t('glossaries.upgrade.feature1')}
- Define source→target term pairs + {t('glossaries.upgrade.feature2')}
- Import/export via CSV + {t('glossaries.upgrade.feature3')}
- Apply to LLM translations + {t('glossaries.upgrade.feature4')}

- Glossaries are a Pro feature. - Upgrade to unlock custom terminology. + {t('glossaries.upgrade.proFeatureBefore')}{t('glossaries.upgrade.proLabel')}{t('glossaries.upgrade.proFeatureAfter')}

diff --git a/frontend/src/app/dashboard/translate/TranslationModeToggle.tsx b/frontend/src/app/dashboard/translate/TranslationModeToggle.tsx index 8c68d18..a4b829a 100644 --- a/frontend/src/app/dashboard/translate/TranslationModeToggle.tsx +++ b/frontend/src/app/dashboard/translate/TranslationModeToggle.tsx @@ -9,6 +9,7 @@ import { TooltipTrigger, } from '@/components/ui/tooltip'; import type { TranslationMode } from './types'; +import { useI18n } from '@/lib/i18n'; interface TranslationModeToggleProps { mode: TranslationMode; @@ -21,11 +22,12 @@ export function TranslationModeToggle({ onModeChange, isPro, }: TranslationModeToggleProps) { + const { t } = useI18n(); return (
@@ -57,9 +59,9 @@ export function TranslationModeToggle({ onClick={() => isPro && onModeChange('llm')} disabled={!isPro} > - Pro LLM + {t('translate.mode.proLlm')} - Context-Aware + {t('translate.mode.proLlmDesc')} {!isPro && ( @@ -68,7 +70,7 @@ export function TranslationModeToggle({ {!isPro && ( -

Upgrade to Pro for LLM translation

+

{t('translate.mode.tooltip')}

)}
@@ -76,9 +78,9 @@ export function TranslationModeToggle({ {!isPro && (

- Upgrade to Pro + {t('translate.mode.upgradeLink')} {' '} - for LLM-powered translations + {t('translate.mode.upgradeDesc')}

)}
diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx index 073e00c..b0e1fcc 100644 --- a/frontend/src/lib/i18n.tsx +++ b/frontend/src/lib/i18n.tsx @@ -323,6 +323,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "terms imported", "glossaries.dialog.changeFile": "Change file", "glossaries.dialog.retry": "Retry", + "glossaries.edit.title": "Edit Glossary", + "glossaries.edit.description": "Update the glossary name, language pair, and terms.", + "glossaries.edit.nameLabel": "Glossary Name", + "glossaries.edit.namePlaceholder": "Enter glossary name...", + "glossaries.edit.sourceLang": "Source language", + "glossaries.edit.targetLang": "Target language", + "glossaries.edit.termsLabel": "Terms ({count} valid)", + "glossaries.edit.exportCsv": "Export CSV", + "glossaries.edit.importCsv": "Import CSV", + "glossaries.edit.cancel": "Cancel", + "glossaries.edit.saving": "Saving...", + "glossaries.edit.saveChanges": "Save Changes", + "glossaries.edit.importFailedTitle": "Import failed", + "glossaries.edit.importFailedMaxDesc": "CSV contains {count} terms, but maximum is {max}. Please reduce the number of terms.", + "glossaries.edit.importSuccessTitle": "Import successful", + "glossaries.edit.importSuccessDesc": "{count} terms imported successfully.", + "glossaries.edit.importFailedEmptyDesc": "No valid terms found in CSV file.", + "glossaries.edit.importFailedReadDesc": "Failed to read CSV file.", + "glossaries.delete.title": "Delete Glossary", + "glossaries.delete.description": "Are you sure you want to delete this glossary?", + "glossaries.delete.warning": "This action cannot be undone", + "glossaries.delete.warningDesc": "All term pairs will be permanently removed.", + "glossaries.delete.cancel": "Cancel", + "glossaries.delete.deleting": "Deleting...", + "glossaries.delete.deleteBtn": "Delete", + "glossaries.upgrade.title": "Glossaries", + "glossaries.upgrade.description": "Customize your translations with custom terminology", + "glossaries.upgrade.feature1": "Create multiple glossaries", + "glossaries.upgrade.feature2": "Define source→target term pairs", + "glossaries.upgrade.feature3": "Import/export via CSV", + "glossaries.upgrade.feature4": "Apply to LLM translations", + "glossaries.upgrade.proFeatureBefore": "Glossaries are a ", + "glossaries.upgrade.proFeatureAfter": " feature. Upgrade to unlock custom terminology.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Upgrade to Pro", + "apiKeys.webhook.title": "Webhook Integration", + "apiKeys.webhook.descriptionBefore": "Pass a ", + "apiKeys.webhook.descriptionAfter": " parameter to receive a POST request when your translation is complete.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Translation Mode", + "translate.mode.classic": "Classic", + "translate.mode.classicDesc": "Fast", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Context-Aware", + "translate.mode.tooltip": "Upgrade to Pro for LLM translation", + "translate.mode.upgradeLink": "Upgrade to Pro", + "translate.mode.upgradeDesc": "for LLM-powered translations", // ── Pricing page ── "pricing.nav.back": "Back", @@ -1140,6 +1187,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "termes importés", "glossaries.dialog.changeFile": "Changer le fichier", "glossaries.dialog.retry": "Réessayer", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", // ── Pricing page ── "pricing.nav.back": "Retour", @@ -1943,6 +2037,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "términos importados", "glossaries.dialog.changeFile": "Cambiar archivo", "glossaries.dialog.retry": "Reintentar", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "Volver", "pricing.nav.home": "Inicio", "pricing.nav.mySubscription": "Mi suscripción", @@ -2701,6 +2842,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "Begriffe importiert", "glossaries.dialog.changeFile": "Datei ändern", "glossaries.dialog.retry": "Erneut versuchen", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "Zurück", "pricing.nav.home": "Startseite", "pricing.nav.mySubscription": "Mein Abonnement", @@ -3459,6 +3647,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "termos importados", "glossaries.dialog.changeFile": "Trocar arquivo", "glossaries.dialog.retry": "Tentar novamente", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "Voltar", "pricing.nav.home": "Início", "pricing.nav.mySubscription": "Minha assinatura", @@ -4217,6 +4452,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "termini importati", "glossaries.dialog.changeFile": "Cambia file", "glossaries.dialog.retry": "Riprova", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "Indietro", "pricing.nav.home": "Home", "pricing.nav.mySubscription": "Il mio abbonamento", @@ -4975,6 +5257,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "termen geïmporteerd", "glossaries.dialog.changeFile": "Bestand wijzigen", "glossaries.dialog.retry": "Opnieuw proberen", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "Terug", "pricing.nav.home": "Home", "pricing.nav.mySubscription": "Mijn abonnement", @@ -5733,6 +6062,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "терминов импортировано", "glossaries.dialog.changeFile": "Изменить файл", "glossaries.dialog.retry": "Повторить", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "Назад", "pricing.nav.home": "Главная", "pricing.nav.mySubscription": "Моя подписка", @@ -6493,6 +6869,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "件インポート済み", "glossaries.dialog.changeFile": "ファイルを変更", "glossaries.dialog.retry": "再試行", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "戻る", "pricing.nav.home": "ホーム", "pricing.nav.mySubscription": "マイサブスクリプション", @@ -7250,6 +7673,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "개 용어 가져옴", "glossaries.dialog.changeFile": "파일 변경", "glossaries.dialog.retry": "다시 시도", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "뒤로", "pricing.nav.home": "홈", "pricing.nav.mySubscription": "내 구독", @@ -8007,6 +8477,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "个术语已导入", "glossaries.dialog.changeFile": "更换文件", "glossaries.dialog.retry": "重试", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "返回", "pricing.nav.home": "首页", "pricing.nav.mySubscription": "我的订阅", @@ -8722,6 +9239,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "مصطلحات مستوردة", "glossaries.dialog.changeFile": "تغيير الملف", "glossaries.dialog.retry": "إعادة المحاولة", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", "pricing.nav.back": "رجوع", "pricing.nav.home": "الرئيسية", "pricing.nav.mySubscription": "اشتراكي", @@ -9446,6 +10010,53 @@ const messages: Record> = { "glossaries.dialog.termsImported": "اصطلاح وارد شد", "glossaries.dialog.changeFile": "تغییر فایل", "glossaries.dialog.retry": "تلاش مجدد", + "glossaries.edit.title": "Modifier le glossaire", + "glossaries.edit.description": "Modifiez le nom, la paire de langues et les termes du glossaire.", + "glossaries.edit.nameLabel": "Nom du glossaire", + "glossaries.edit.namePlaceholder": "Entrez le nom du glossaire...", + "glossaries.edit.sourceLang": "Langue source", + "glossaries.edit.targetLang": "Langue cible", + "glossaries.edit.termsLabel": "Termes ({count} valides)", + "glossaries.edit.exportCsv": "Exporter CSV", + "glossaries.edit.importCsv": "Importer CSV", + "glossaries.edit.cancel": "Annuler", + "glossaries.edit.saving": "Enregistrement...", + "glossaries.edit.saveChanges": "Enregistrer les modifications", + "glossaries.edit.importFailedTitle": "Échec de l'importation", + "glossaries.edit.importFailedMaxDesc": "Le CSV contient {count} termes, le maximum est de {max}. Veuillez réduire le nombre de termes.", + "glossaries.edit.importSuccessTitle": "Importation réussie", + "glossaries.edit.importSuccessDesc": "{count} termes importés avec succès.", + "glossaries.edit.importFailedEmptyDesc": "Aucun terme valide trouvé dans le fichier CSV.", + "glossaries.edit.importFailedReadDesc": "Impossible de lire le fichier CSV.", + "glossaries.delete.title": "Supprimer le glossaire", + "glossaries.delete.description": "Êtes-vous sûr de vouloir supprimer ce glossaire ?", + "glossaries.delete.warning": "Cette action est irréversible", + "glossaries.delete.warningDesc": "Toutes les paires de termes seront définitivement supprimées.", + "glossaries.delete.cancel": "Annuler", + "glossaries.delete.deleting": "Suppression...", + "glossaries.delete.deleteBtn": "Supprimer", + "glossaries.upgrade.title": "Glossaires", + "glossaries.upgrade.description": "Personnalisez vos traductions avec une terminologie personnalisée", + "glossaries.upgrade.feature1": "Créez plusieurs glossaires", + "glossaries.upgrade.feature2": "Définissez des paires de termes source→cible", + "glossaries.upgrade.feature3": "Importez/exportez via CSV", + "glossaries.upgrade.feature4": "Appliquez aux traductions LLM", + "glossaries.upgrade.proFeatureBefore": "Les glossaires sont une fonctionnalité ", + "glossaries.upgrade.proFeatureAfter": ". Passez à un forfait supérieur pour débloquer la terminologie personnalisée.", + "glossaries.upgrade.proLabel": "Pro", + "glossaries.upgrade.upgradeBtn": "Passer à Pro", + "apiKeys.webhook.title": "Intégration Webhook", + "apiKeys.webhook.descriptionBefore": "Passez un paramètre ", + "apiKeys.webhook.descriptionAfter": " pour recevoir une requête POST lorsque votre traduction est terminée.", + "apiKeys.webhook.codeParam": "webhook_url", + "translate.mode.label": "Mode de traduction", + "translate.mode.classic": "Classique", + "translate.mode.classicDesc": "Rapide", + "translate.mode.proLlm": "Pro LLM", + "translate.mode.proLlmDesc": "Contextuel", + "translate.mode.tooltip": "Passez à Pro pour la traduction LLM", + "translate.mode.upgradeLink": "Passer à Pro", + "translate.mode.upgradeDesc": "pour des traductions alimentées par LLM", // ── Pricing page ── "pricing.nav.back": "بازگشت",