diff --git a/frontend/src/app/dashboard/translate/GlossarySelector.tsx b/frontend/src/app/dashboard/translate/GlossarySelector.tsx index 31c282d..5dba7c5 100644 --- a/frontend/src/app/dashboard/translate/GlossarySelector.tsx +++ b/frontend/src/app/dashboard/translate/GlossarySelector.tsx @@ -239,8 +239,15 @@ export function GlossarySelector({ sourceLang, targetLang, isPro, mode, glossary if (!filterByLang || sourceLang === 'auto') { return glossaries; } - return glossaries.filter(g => g.source_language === sourceLang); - }, [glossaries, filterByLang, sourceLang]); + return glossaries + .filter(g => g.source_language === sourceLang) + .sort((a, b) => { + // Glossaries matching source + target come first + const aMatch = a.target_language === targetLang ? 0 : 1; + const bMatch = b.target_language === targetLang ? 0 : 1; + return aMatch - bMatch; + }); + }, [glossaries, filterByLang, sourceLang, targetLang]); const filteredTemplates = useMemo(() => { if (!filterByLang || sourceLang === 'auto') { @@ -278,7 +285,9 @@ export function GlossarySelector({ sourceLang, targetLang, isPro, mode, glossary if (!nextVal) { onChange(null); } else if (filteredGlossaries.length > 0 && !glossaryId) { - onChange(filteredGlossaries[0].id); + // Prefer glossary matching target language, fall back to first + const matching = filteredGlossaries.find(g => g.target_language === targetLang); + onChange(matching ? matching.id : filteredGlossaries[0].id); } }} className={cn( diff --git a/frontend/src/app/dashboard/translate/useTranslationConfig.ts b/frontend/src/app/dashboard/translate/useTranslationConfig.ts index 9a6cd49..18b856a 100644 --- a/frontend/src/app/dashboard/translate/useTranslationConfig.ts +++ b/frontend/src/app/dashboard/translate/useTranslationConfig.ts @@ -80,10 +80,10 @@ export function useTranslationConfig(hasFile: boolean): UseTranslationConfigRetu } }, [settings.defaultTargetLanguage]); // eslint-disable-line react-hooks/exhaustive-deps - // Reset glossary selection when source language changes + // Reset glossary selection when source or target language changes useEffect(() => { setGlossaryId(null); - }, [sourceLang]); // eslint-disable-line react-hooks/exhaustive-deps + }, [sourceLang, targetLang]); // eslint-disable-line react-hooks/exhaustive-deps // Fetch available (admin-configured) providers useEffect(() => { diff --git a/routes/glossary_routes.py b/routes/glossary_routes.py index 2c96b79..fd3e481 100644 --- a/routes/glossary_routes.py +++ b/routes/glossary_routes.py @@ -597,6 +597,7 @@ async def import_glossary_template( user_id=user.id, name=glossary_name, source_language=template_data.get("source_lang", "fr"), + target_language=template_data.get("target_lang", "en"), created_at=datetime.now(timezone.utc), updated_at=datetime.now(timezone.utc), )