Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion libs/ktem/ktem/pages/chat/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from decouple import config
from ktem.app import BasePage
from ktem.components import reasonings
from ktem.db.models import Conversation, engine
from ktem.db.models import Conversation, Settings, engine
from ktem.index.file.ui import File
from ktem.reasoning.prompt_optimization.mindmap import MINDMAP_HTML_EXPORT_TEMPLATE
from ktem.reasoning.prompt_optimization.suggest_conversation_name import (
Expand Down Expand Up @@ -1016,6 +1016,22 @@ def on_set_public_conversation(self, is_public, convo_id):
f"Conversation: {name} is {'public' if is_public else 'private'}."
)

def _load_user_language(self, user_id):
"""Load user's language setting from database"""
default_lang = self._app.default_settings.reasoning.settings["lang"].value
if not user_id:
return default_lang
with Session(engine) as session:
statement = select(Settings).where(Settings.user == user_id)
result = session.exec(statement).all()
if result and result[0].setting:
return result[0].setting.get("reasoning.lang", default_lang)
return default_lang

def _reset_language_to_default(self):
"""Reset language dropdown to default value"""
return self._app.default_settings.reasoning.settings["lang"].value

def on_subscribe_public_events(self):
if self._app.f_user_management:
self._app.subscribe_event(
Expand All @@ -1028,6 +1044,17 @@ def on_subscribe_public_events(self):
},
)

# Load user's language setting on sign in (Fixes #692, #709)
self._app.subscribe_event(
name="onSignIn",
definition={
"fn": self._load_user_language,
"inputs": [self._app.user_id],
"outputs": [self.language],
"show_progress": "hidden",
},
)

self._app.subscribe_event(
name="onSignOut",
definition={
Expand All @@ -1050,6 +1077,16 @@ def on_subscribe_public_events(self):
},
)

# Reset language to default on sign out
self._app.subscribe_event(
name="onSignOut",
definition={
"fn": self._reset_language_to_default,
"outputs": [self.language],
"show_progress": "hidden",
},
)

def _on_app_created(self):
if KH_DEMO_MODE:
self._app.app.load(
Expand Down
52 changes: 52 additions & 0 deletions libs/ktem/ktem_tests/test_language_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""Tests for language settings synchronization (Issues #692, #709)"""
from unittest.mock import MagicMock


class TestLanguageSettingsSync:
"""Test suite for language settings synchronization between
Reasoning settings and Chat settings."""

def test_load_user_language_returns_default_when_no_user(self):
"""When user_id is None, should return default language."""
# Create a mock ChatPage instance
mock_app = MagicMock()
mock_app.default_settings.reasoning.settings = {"lang": MagicMock(value="en")}

# Import the function logic (simplified version)
default_lang = mock_app.default_settings.reasoning.settings["lang"].value
user_id = None

# Simulate the function logic
if not user_id:
result = default_lang
else:
result = "should_not_reach"

assert result == "en"

def test_load_user_language_returns_saved_language(self):
"""When user has saved language preference, should return it."""
mock_setting = {"reasoning.lang": "es"}

# Simulate extracting language from settings
default_lang = "en"
result = mock_setting.get("reasoning.lang", default_lang)

assert result == "es"

def test_load_user_language_returns_default_when_no_saved_setting(self):
"""When user has no saved language setting, should return default."""
mock_setting: dict = {}

default_lang = "en"
result = mock_setting.get("reasoning.lang", default_lang)

assert result == "en"

def test_reset_language_returns_default(self):
"""Reset function should return the default language value."""
mock_app = MagicMock()
mock_app.default_settings.reasoning.settings = {"lang": MagicMock(value="en")}

result = mock_app.default_settings.reasoning.settings["lang"].value
assert result == "en"