mirror of
https://github.com/langgenius/dify.git
synced 2026-10-04 13:47:55 +08:00
Final-review fix wave for the "reply in the user's input language" feature: - serde.py: context_from_dict omitted reply_language from the explicit field allowlist, so it round-tripped to "" on every read despite context_to_dict (asdict) serializing it -- the localization feature silently no-op'd after the first persisted write. Added it to the constructor call; TDD'd with a failing-then-passing round-trip test in test_serde.py. - localize.py: Localizer._cache was per-instance, but a fresh Localizer is built per advance-task invocation, so the static string catalog was re-translated every turn instead of once per language. Moved the cache to a module-level _TRANSLATION_CACHE dict (safe to share: keys are tenant/session-independent catalog-string+language pairs); added an autouse fixture in test_localize.py to clear it between tests for isolation. - localize.py: detect_language and _fill_cache called self._model_provider() outside their try/except, violating the Env callback contract that these must never raise. Moved both calls inside their try/except so a raising provider degrades to the existing safe fallback instead of propagating into advance/_commit. - strings.py: documented that Template.translate_fields is advisory only -- the Localizer re-inserts all captured groups verbatim and does not consult it. No behavior change. uv run --project api pytest tests/unit_tests/core/dify_builder tests/unit_tests/services/dify_builder -q -> 722 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>