feat: multilingual glossary UI, translate selector, context fusion
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 1m30s

- TermEditor: rewritten with expandable multilingual translation grid
  (13 languages), editorial styling, source/target + translations JSON
- GlossarySelector: new component in translate page config panel,
  fetches user glossaries, shows flag + term count, Pro+LLM only
- useTranslationConfig: added glossaryId state
- useTranslationSubmit: sends glossary_id to backend
- Context page: removed textarea glossary, presets now create API
  glossaries via template import, added link to Glossaries page
- i18n: added 12 keys × 13 locales for glossary/translate/context

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 15:54:04 +02:00
parent b2d918c832
commit 50d5a8d22f
8 changed files with 563 additions and 129 deletions

View File

@@ -694,6 +694,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Clear all",
"context.saving": "Saving...",
"context.save": "Save",
"translate.glossary.title": "Glossary",
"translate.glossary.select": "Select a glossary",
"translate.glossary.none": "None",
"translate.glossary.terms": "terms",
"context.presets.createGlossary": "Create glossary",
"context.presets.created": "Glossary created",
"context.presets.createdDesc": "The glossary \"{name}\" has been created with {count} terms.",
"context.presets.hint": "Click a preset to create a glossary with domain-specific terms. Manage your glossaries in the Glossaries section.",
"context.glossary.manage": "Manage glossaries",
"context.saved": "Saved",
"context.savedDesc": "Your context instructions have been saved.",
// ── Admin ──
"admin.login.title": "Administration",
@@ -1447,6 +1458,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Tout effacer",
"context.saving": "Enregistrement...",
"context.save": "Enregistrer",
"translate.glossary.title": "Glossaire",
"translate.glossary.select": "Sélectionner un glossaire",
"translate.glossary.none": "Aucun",
"translate.glossary.terms": "termes",
"context.presets.createGlossary": "Créer le glossaire",
"context.presets.created": "Glossaire créé",
"context.presets.createdDesc": "Le glossaire \"{name}\" a été créé avec {count} termes.",
"context.presets.hint": "Cliquez sur un preset pour créer un glossaire avec des termes spécifiques au domaine. Gérez vos glossaires dans la section Glossaires.",
"context.glossary.manage": "Gérer les glossaires",
"context.saved": "Enregistré",
"context.savedDesc": "Vos instructions de contexte ont été enregistrées.",
// ── Admin ──
"admin.login.title": "Administration",
@@ -2146,6 +2168,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Borrar todo",
"context.saving": "Guardando...",
"context.save": "Guardar",
"translate.glossary.title": "Glosario",
"translate.glossary.select": "Seleccionar glosario",
"translate.glossary.none": "Ninguno",
"translate.glossary.terms": "términos",
"context.presets.createGlossary": "Crear glosario",
"context.presets.created": "Glosario creado",
"context.presets.createdDesc": "El glosario \"{name}\" ha sido creado con {count} términos.",
"context.presets.hint": "Haz clic en un preset para crear un glosario con términos específicos del dominio. Gestiona tus glosarios en la sección de Glosarios.",
"context.glossary.manage": "Gestionar glosarios",
"context.saved": "Guardado",
"context.savedDesc": "Tus instrucciones de contexto se han guardado.",
"admin.login.title": "Administración",
"admin.login.required": "Inicio de sesión requerido",
"admin.login.password": "Contraseña de administrador",
@@ -2843,6 +2876,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Alles löschen",
"context.saving": "Wird gespeichert...",
"context.save": "Speichern",
"translate.glossary.title": "Glossar",
"translate.glossary.select": "Glossar auswählen",
"translate.glossary.none": "Keins",
"translate.glossary.terms": "Begriffe",
"context.presets.createGlossary": "Glossar erstellen",
"context.presets.created": "Glossar erstellt",
"context.presets.createdDesc": "Das Glossar \"{name}\" wurde mit {count} Begriffen erstellt.",
"context.presets.hint": "Klicken Sie auf ein Preset, um ein Glossar mit domänenspezifischen Begriffen zu erstellen. Verwalten Sie Ihre Glossare im Glossar-Bereich.",
"context.glossary.manage": "Glossare verwalten",
"context.saved": "Gespeichert",
"context.savedDesc": "Ihre Kontextanweisungen wurden gespeichert.",
"admin.login.title": "Administration",
"admin.login.required": "Anmeldung erforderlich",
"admin.login.password": "Admin-Passwort",
@@ -3540,6 +3584,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Limpar tudo",
"context.saving": "Salvando...",
"context.save": "Salvar",
"translate.glossary.title": "Glossário",
"translate.glossary.select": "Selecionar glossário",
"translate.glossary.none": "Nenhum",
"translate.glossary.terms": "termos",
"context.presets.createGlossary": "Criar glossário",
"context.presets.created": "Glossário criado",
"context.presets.createdDesc": "O glossário \"{name}\" foi criado com {count} termos.",
"context.presets.hint": "Clique em um preset para criar um glossário com termos específicos do domínio. Gerencie seus glossários na seção Glossários.",
"context.glossary.manage": "Gerenciar glossários",
"context.saved": "Salvo",
"context.savedDesc": "Suas instruções de contexto foram salvas.",
"admin.login.title": "Administração",
"admin.login.required": "Login necessário",
"admin.login.password": "Senha de administrador",
@@ -4237,6 +4292,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Cancella tutto",
"context.saving": "Salvataggio...",
"context.save": "Salva",
"translate.glossary.title": "Glossario",
"translate.glossary.select": "Seleziona glossario",
"translate.glossary.none": "Nessuno",
"translate.glossary.terms": "termini",
"context.presets.createGlossary": "Crea glossario",
"context.presets.created": "Glossario creato",
"context.presets.createdDesc": "Il glossario \"{name}\" è stato creato con {count} termini.",
"context.presets.hint": "Fai clic su un preset per creare un glossario con termini specifici del dominio. Gestisci i tuoi glossari nella sezione Glossari.",
"context.glossary.manage": "Gestisci glossari",
"context.saved": "Salvato",
"context.savedDesc": "Le tue istruzioni di contesto sono state salvate.",
"admin.login.title": "Amministrazione",
"admin.login.required": "Accesso richiesto",
"admin.login.password": "Password amministratore",
@@ -4934,6 +5000,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Alles wissen",
"context.saving": "Opslaan...",
"context.save": "Opslaan",
"translate.glossary.title": "Woordenlijst",
"translate.glossary.select": "Woordenlijst selecteren",
"translate.glossary.none": "Geen",
"translate.glossary.terms": "termen",
"context.presets.createGlossary": "Woordenlijst maken",
"context.presets.created": "Woordenlijst gemaakt",
"context.presets.createdDesc": "De woordenlijst \"{name}\" is gemaakt met {count} termen.",
"context.presets.hint": "Klik op een preset om een woordenlijst met domeinspecifieke termen te maken. Beheer je woordenlijsten in het Woordenlijsten-gedeelte.",
"context.glossary.manage": "Woordenlijsten beheren",
"context.saved": "Opgeslagen",
"context.savedDesc": "Je contextinstructies zijn opgeslagen.",
"admin.login.title": "Beheer",
"admin.login.required": "Inloggen vereist",
"admin.login.password": "Admin-wachtwoord",
@@ -5633,6 +5710,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "Очистить всё",
"context.saving": "Сохранение...",
"context.save": "Сохранить",
"translate.glossary.title": "Глоссарий",
"translate.glossary.select": "Выбрать глоссарий",
"translate.glossary.none": "Нет",
"translate.glossary.terms": "терминов",
"context.presets.createGlossary": "Создать глоссарий",
"context.presets.created": "Глоссарий создан",
"context.presets.createdDesc": "Глоссарий \"{name}\" создан с {count} терминами.",
"context.presets.hint": "Нажмите на пресет, чтобы создать глоссарий с предметными терминами. Управляйте глоссариями в разделе Глоссарии.",
"context.glossary.manage": "Управлять глоссариями",
"context.saved": "Сохранено",
"context.savedDesc": "Ваши контекстные инструкции сохранены.",
"admin.login.title": "Администрирование",
"admin.login.required": "Требуется вход",
"admin.login.password": "Пароль администратора",
@@ -6329,6 +6417,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "すべてクリア",
"context.saving": "保存中...",
"context.save": "保存",
"translate.glossary.title": "用語集",
"translate.glossary.select": "用語集を選択",
"translate.glossary.none": "なし",
"translate.glossary.terms": "件",
"context.presets.createGlossary": "用語集を作成",
"context.presets.created": "用語集を作成しました",
"context.presets.createdDesc": "用語集「{name}」を{count}件の用語で作成しました。",
"context.presets.hint": "プリセットをクリックして、専門用語の用語集を作成します。用語集セクションで管理できます。",
"context.glossary.manage": "用語集を管理",
"context.saved": "保存しました",
"context.savedDesc": "コンテキスト指示を保存しました。",
"admin.login.title": "管理画面",
"admin.login.required": "ログインが必要です",
"admin.login.password": "管理者パスワード",
@@ -7025,6 +7124,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "모두 지우기",
"context.saving": "저장 중...",
"context.save": "저장",
"translate.glossary.title": "용어집",
"translate.glossary.select": "용어집 선택",
"translate.glossary.none": "없음",
"translate.glossary.terms": "개",
"context.presets.createGlossary": "용어집 만들기",
"context.presets.created": "용어집 생성됨",
"context.presets.createdDesc": "용어집 \"{name}\"이(가) {count}개의 용어로 생성되었습니다.",
"context.presets.hint": "프리셋을 클릭하여 도메인별 용어가 포함된 용어집을 만드세요. 용어집 섹션에서 관리할 수 있습니다.",
"context.glossary.manage": "용어집 관리",
"context.saved": "저장됨",
"context.savedDesc": "컨텍스트 지침이 저장되었습니다.",
"admin.login.title": "관리",
"admin.login.required": "로그인 필요",
"admin.login.password": "관리자 비밀번호",
@@ -7679,6 +7789,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "全部清除",
"context.saving": "保存中...",
"context.save": "保存",
"translate.glossary.title": "术语表",
"translate.glossary.select": "选择术语表",
"translate.glossary.none": "无",
"translate.glossary.terms": "个术语",
"context.presets.createGlossary": "创建术语表",
"context.presets.created": "术语表已创建",
"context.presets.createdDesc": "术语表 \"{name}\" 已创建,包含 {count} 个术语。",
"context.presets.hint": "点击预设以创建包含领域特定术语的术语表。在术语表部分管理您的术语表。",
"context.glossary.manage": "管理术语表",
"context.saved": "已保存",
"context.savedDesc": "您的上下文说明已保存。",
"admin.login.title": "管理后台",
"admin.login.required": "需要登录",
"admin.login.password": "管理员密码",
@@ -8333,6 +8454,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "مسح الكل",
"context.saving": "جارٍ الحفظ...",
"context.save": "حفظ",
"translate.glossary.title": "المسرد",
"translate.glossary.select": "اختر مسرداً",
"translate.glossary.none": "بدون",
"translate.glossary.terms": "مصطلحات",
"context.presets.createGlossary": "إنشاء مسرد",
"context.presets.created": "تم إنشاء المسرد",
"context.presets.createdDesc": "تم إنشاء المسرد \"{name}\" بـ {count} مصطلحات.",
"context.presets.hint": "انقر على إعداد مسبق لإنشاء مسرد بمصطلحات خاصة بالمجال. أد穹 مصادرك في قسم المسرات.",
"context.glossary.manage": "إدارة المسرات",
"context.saved": "تم الحفظ",
"context.savedDesc": "تم حفظ تعليمات السياق الخاصة بك.",
"admin.login.title": "الإدارة",
"admin.login.required": "تسجيل الدخول مطلوب",
"admin.login.password": "كلمة مرور المسؤول",
@@ -9023,6 +9155,17 @@ const messages: Record<Locale, Record<string, string>> = {
"context.clearAll": "پاک کردن همه",
"context.saving": "در حال ذخیره...",
"context.save": "ذخیره",
"translate.glossary.title": "واژه‌نامه",
"translate.glossary.select": "انتخاب واژه‌نامه",
"translate.glossary.none": "هیچکدام",
"translate.glossary.terms": "واژه",
"context.presets.createGlossary": "ایجاد واژه‌نامه",
"context.presets.created": "واژه‌نامه ایجاد شد",
"context.presets.createdDesc": "واژه‌نامه \"{name}\" با {count} واژه ایجاد شد.",
"context.presets.hint": "روی یک پیش‌تنظیم کلیک کنید تا واژه‌نامه‌ای با اصطلاحات تخصصی ایجاد شود. واژه‌نامه‌های خود را در بخش واژه‌نامه‌ها مدیریت کنید.",
"context.glossary.manage": "مدیریت واژه‌نامه‌ها",
"context.saved": "ذخیره شد",
"context.savedDesc": "دستورالعمل‌های زمینه شما ذخیره شد.",
"admin.login.title": "مدیریت",
"admin.login.required": "ورود لازم است",
"admin.login.password": "رمز عبور مدیر",