From c043c86bd76990dfacb67c3b2a0253149e82f8fd Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Sun, 24 May 2026 15:52:34 -0700 Subject: [PATCH] i18n+tests: add list_item_numbered, list_footer_numbered, out_of_range for 15 locales The numbered /resume feature added new i18n keys to en.yaml; the catalog parity tests require every locale to carry matching keys and placeholders, so add translations to all 15 supported locales. Also unblock tests/cli/test_cli_resume_command.py: - _make_cli stub now sets self.resume_display = 'minimal' since _handle_resume_command (post-#31695) calls _display_resumed_history. - mock_db.resolve_resume_session_id returns the input id (no compression chain) so HERMES_SESSION_ID is set to a real string, not a MagicMock. --- locales/af.yaml | 3 +++ locales/de.yaml | 3 +++ locales/es.yaml | 3 +++ locales/fr.yaml | 3 +++ locales/ga.yaml | 3 +++ locales/hu.yaml | 3 +++ locales/it.yaml | 3 +++ locales/ja.yaml | 3 +++ locales/ko.yaml | 3 +++ locales/pt.yaml | 3 +++ locales/ru.yaml | 3 +++ locales/tr.yaml | 3 +++ locales/uk.yaml | 3 +++ locales/zh-hant.yaml | 3 +++ locales/zh.yaml | 3 +++ tests/cli/test_cli_resume_command.py | 6 ++++++ 16 files changed, 51 insertions(+) diff --git a/locales/af.yaml b/locales/af.yaml index b08f4316566..636bae754f3 100644 --- a/locales/af.yaml +++ b/locales/af.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Geen benoemde sessies gevind nie.\nGebruik `/title My Sessie` om jou huidige sessie 'n naam te gee, en dan `/resume My Sessie` om later daarheen terug te keer." list_header: "📋 **Benoemde Sessies**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nGebruik: `/resume `" + list_footer_numbered: "\nGebruik: `/resume ` of `/resume ` (bv. `/resume 1` vir die mees onlangse)" list_failed: "Kon nie sessies lys nie: {error}" + out_of_range: "Hervat-indeks {index} is buite bereik.\nGebruik `/resume` sonder argumente om beskikbare sessies te sien." not_found: "Geen sessie gevind wat by '**{name}**' pas nie.\nGebruik `/resume` sonder argumente om beskikbare sessies te sien." already_on: "📌 Reeds op sessie **{name}**." switch_failed: "Kon nie sessie verander nie." diff --git a/locales/de.yaml b/locales/de.yaml index 70546c875f5..f400dd9fb2e 100644 --- a/locales/de.yaml +++ b/locales/de.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Keine benannten Sitzungen gefunden.\nVerwenden Sie `/title Meine Sitzung`, um die aktuelle Sitzung zu benennen, dann `/resume Meine Sitzung`, um später dorthin zurückzukehren." list_header: "📋 **Benannte Sitzungen**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nVerwendung: `/resume `" + list_footer_numbered: "\nVerwendung: `/resume ` oder `/resume ` (z. B. `/resume 1` für die zuletzt verwendete)" list_failed: "Sitzungen konnten nicht aufgelistet werden: {error}" + out_of_range: "Wiederaufnahme-Index {index} liegt außerhalb des gültigen Bereichs.\nVerwenden Sie `/resume` ohne Argumente, um verfügbare Sitzungen anzuzeigen." not_found: "Keine Sitzung passend zu '**{name}**' gefunden.\nVerwenden Sie `/resume` ohne Argumente, um verfügbare Sitzungen zu sehen." already_on: "📌 Bereits in Sitzung **{name}**." switch_failed: "Sitzungswechsel fehlgeschlagen." diff --git a/locales/es.yaml b/locales/es.yaml index 34b9a7bb1bb..08aaf9ad0b4 100644 --- a/locales/es.yaml +++ b/locales/es.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "No se encontraron sesiones con nombre.\nUsa `/title Mi sesión` para nombrar la sesión actual y luego `/resume Mi sesión` para volver a ella." list_header: "📋 **Sesiones con nombre**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nUso: `/resume `" + list_footer_numbered: "\nUso: `/resume ` o `/resume ` (p. ej. `/resume 1` para la más reciente)" list_failed: "No se pudieron listar las sesiones: {error}" + out_of_range: "El índice de reanudación {index} está fuera de rango.\nUsa `/resume` sin argumentos para ver las sesiones disponibles." not_found: "No se encontró ninguna sesión que coincida con '**{name}**'.\nUsa `/resume` sin argumentos para ver las sesiones disponibles." already_on: "📌 Ya estás en la sesión **{name}**." switch_failed: "No se pudo cambiar de sesión." diff --git a/locales/fr.yaml b/locales/fr.yaml index 03d5e0b6222..ddb89bd2f49 100644 --- a/locales/fr.yaml +++ b/locales/fr.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Aucune session nommée trouvée.\nUtilisez `/title Ma session` pour nommer la session actuelle, puis `/resume Ma session` pour y revenir plus tard." list_header: "📋 **Sessions nommées**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nUsage : `/resume `" + list_footer_numbered: "\nUtilisation : `/resume ` ou `/resume ` (par exemple `/resume 1` pour la plus récente)" list_failed: "Impossible de lister les sessions : {error}" + out_of_range: "L'index de reprise {index} est hors limites.\nUtilisez `/resume` sans arguments pour voir les sessions disponibles." not_found: "Aucune session correspondant à '**{name}**' trouvée.\nUtilisez `/resume` sans argument pour voir les sessions disponibles." already_on: "📌 Déjà sur la session **{name}**." switch_failed: "Échec du changement de session." diff --git a/locales/ga.yaml b/locales/ga.yaml index 3dd5c46447f..40fb94ba4e6 100644 --- a/locales/ga.yaml +++ b/locales/ga.yaml @@ -226,9 +226,12 @@ gateway: no_named_sessions: "Níor aimsíodh aon seisiún ainmnithe.\nÚsáid `/title M'Ainm Seisiúin` chun do sheisiún reatha a ainmniú, ansin `/resume M'Ainm Seisiúin` chun filleadh air níos déanaí." list_header: "📋 **Seisiúin Ainmnithe**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nÚsáid: `/resume `" + list_footer_numbered: "\nÚsáid: `/resume ` nó `/resume ` (m.sh. `/resume 1` don cheann is déanaí)" list_failed: "Níorbh fhéidir seisiúin a liostáil: {error}" + out_of_range: "Tá an t-innéacs atosaithe {index} as raon.\nÚsáid `/resume` gan argóintí chun na seisiúin atá ar fáil a fheiceáil." not_found: "Níor aimsíodh aon seisiún ag teacht le '**{name}**'.\nÚsáid `/resume` gan argóintí chun seisiúin atá ar fáil a fheiceáil." already_on: "📌 Cheana ar an seisiún **{name}**." switch_failed: "Theip ar athrú seisiúin." diff --git a/locales/hu.yaml b/locales/hu.yaml index b18f7be707f..9be44294dc2 100644 --- a/locales/hu.yaml +++ b/locales/hu.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Nem található elnevezett munkamenet.\nHasználd a `/title Saját munkamenet` parancsot a jelenlegi munkamenet elnevezéséhez, majd a `/resume Saját munkamenet` paranccsal térhetsz vissza hozzá." list_header: "📋 **Elnevezett munkamenetek**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nHasználat: `/resume `" + list_footer_numbered: "\nHasználat: `/resume ` vagy `/resume ` (pl. `/resume 1` a legutóbbihoz)" list_failed: "Nem sikerült listázni a munkameneteket: {error}" + out_of_range: "A folytatási index ({index}) tartományon kívül esik.\nA `/resume` argumentumok nélküli használata megjeleníti az elérhető munkameneteket." not_found: "Nem található '**{name}**' nevű munkamenet.\nArgumentumok nélkül használd a `/resume` parancsot az elérhető munkamenetek megtekintéséhez." already_on: "📌 Már a **{name}** munkamenetben vagy." switch_failed: "Nem sikerült munkamenetet váltani." diff --git a/locales/it.yaml b/locales/it.yaml index 053046be7d5..e98d86e7fb1 100644 --- a/locales/it.yaml +++ b/locales/it.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Nessuna sessione con nome trovata.\nUsa `/title My Session` per dare un nome alla sessione attuale, poi `/resume My Session` per tornare a essa in seguito." list_header: "📋 **Sessioni con nome**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nUso: `/resume `" + list_footer_numbered: "\nUso: `/resume ` o `/resume ` (es. `/resume 1` per la più recente)" list_failed: "Impossibile elencare le sessioni: {error}" + out_of_range: "L'indice di ripresa {index} è fuori intervallo.\nUsa `/resume` senza argomenti per vedere le sessioni disponibili." not_found: "Nessuna sessione trovata corrispondente a '**{name}**'.\nUsa `/resume` senza argomenti per vedere le sessioni disponibili." already_on: "📌 Già nella sessione **{name}**." switch_failed: "Cambio di sessione non riuscito." diff --git a/locales/ja.yaml b/locales/ja.yaml index 931e88ed3d8..33cb1b99c9a 100644 --- a/locales/ja.yaml +++ b/locales/ja.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "名前付きセッションが見つかりません。\n`/title セッション名` で現在のセッションに名前を付けると、後で `/resume セッション名` で戻れます。" list_header: "📋 **名前付きセッション**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\n使い方: `/resume <セッション名>`" + list_footer_numbered: "\n使い方: `/resume <セッション名>` または `/resume <番号>`(例: 最新のセッションには `/resume 1`)" list_failed: "セッションを一覧表示できませんでした: {error}" + out_of_range: "再開インデックス {index} は範囲外です。\n引数なしで `/resume` を実行すると、利用可能なセッションが表示されます。" not_found: "'**{name}**' に一致するセッションが見つかりません。\n引数なしで `/resume` を実行すると利用可能なセッションを表示します。" already_on: "📌 既にセッション **{name}** にいます。" switch_failed: "セッションの切り替えに失敗しました。" diff --git a/locales/ko.yaml b/locales/ko.yaml index 6fc9d1679d2..3f9ad817334 100644 --- a/locales/ko.yaml +++ b/locales/ko.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "이름이 지정된 세션이 없습니다.\n현재 세션에 이름을 지정하려면 `/title 내 세션`을 사용하고, 나중에 `/resume 내 세션`으로 돌아오세요." list_header: "📋 **이름이 지정된 세션**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\n사용법: `/resume `" + list_footer_numbered: "\n사용법: `/resume <세션 이름>` 또는 `/resume <번호>` (예: 가장 최근 세션은 `/resume 1`)" list_failed: "세션 목록을 가져올 수 없습니다: {error}" + out_of_range: "재개 인덱스 {index}이(가) 범위를 벗어났습니다.\n인자 없이 `/resume`을 실행하면 사용 가능한 세션이 표시됩니다." not_found: "'**{name}**'와 일치하는 세션이 없습니다.\n사용 가능한 세션을 보려면 인수 없이 `/resume`을 사용하세요." already_on: "📌 이미 **{name}** 세션에 있습니다." switch_failed: "세션 전환에 실패했습니다." diff --git a/locales/pt.yaml b/locales/pt.yaml index e202a53480f..0c0eddad91e 100644 --- a/locales/pt.yaml +++ b/locales/pt.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Não foram encontradas sessões com nome.\nUsa `/title A minha sessão` para nomear a sessão atual e depois `/resume A minha sessão` para voltar a ela." list_header: "📋 **Sessões com nome**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nUso: `/resume `" + list_footer_numbered: "\nUso: `/resume ` ou `/resume ` (ex.: `/resume 1` para a mais recente)" list_failed: "Não foi possível listar as sessões: {error}" + out_of_range: "O índice de retomada {index} está fora do intervalo.\nUse `/resume` sem argumentos para ver as sessões disponíveis." not_found: "Não foi encontrada nenhuma sessão correspondente a '**{name}**'.\nUsa `/resume` sem argumentos para ver as sessões disponíveis." already_on: "📌 Já estás na sessão **{name}**." switch_failed: "Falha ao mudar de sessão." diff --git a/locales/ru.yaml b/locales/ru.yaml index 76fde56a9b6..b3a202be777 100644 --- a/locales/ru.yaml +++ b/locales/ru.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Именованных сеансов не найдено.\nИспользуйте `/title Мой сеанс`, чтобы назвать текущий сеанс, затем `/resume Мой сеанс`, чтобы вернуться к нему позже." list_header: "📋 **Именованные сеансы**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nИспользование: `/resume <название сеанса>`" + list_footer_numbered: "\nИспользование: `/resume <имя сеанса>` или `/resume <номер>` (например, `/resume 1` для самого недавнего)" list_failed: "Не удалось получить список сеансов: {error}" + out_of_range: "Индекс возобновления {index} вне диапазона.\nИспользуйте `/resume` без аргументов, чтобы увидеть доступные сеансы." not_found: "Сеанс, соответствующий '**{name}**', не найден.\nИспользуйте `/resume` без аргументов, чтобы увидеть доступные сеансы." already_on: "📌 Уже в сеансе **{name}**." switch_failed: "Не удалось переключить сеанс." diff --git a/locales/tr.yaml b/locales/tr.yaml index add252ea56b..0be0e351af7 100644 --- a/locales/tr.yaml +++ b/locales/tr.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Adlandırılmış oturum bulunamadı.\nMevcut oturumu adlandırmak için `/title Oturumum`, daha sonra geri dönmek için `/resume Oturumum` kullanın." list_header: "📋 **Adlandırılmış Oturumlar**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nKullanım: `/resume `" + list_footer_numbered: "\nKullanım: `/resume ` veya `/resume ` (örn. en yenisi için `/resume 1`)" list_failed: "Oturumlar listelenemedi: {error}" + out_of_range: "Devam endeksi {index} aralık dışında.\nKullanılabilir oturumları görmek için `/resume` komutunu argümansız çalıştırın." not_found: "'**{name}**' ile eşleşen oturum bulunamadı.\nKullanılabilir oturumları görmek için argümansız `/resume` kullanın." already_on: "📌 Zaten **{name}** oturumundasınız." switch_failed: "Oturum değiştirilemedi." diff --git a/locales/uk.yaml b/locales/uk.yaml index 972e535f901..1b36b3e2f48 100644 --- a/locales/uk.yaml +++ b/locales/uk.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "Іменованих сеансів не знайдено.\nВикористайте `/title Мій сеанс`, щоб назвати поточний сеанс, потім `/resume Мій сеанс`, щоб повернутися до нього." list_header: "📋 **Іменовані сеанси**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\nВикористання: `/resume <назва сеансу>`" + list_footer_numbered: "\nВикористання: `/resume <назва сесії>` або `/resume <номер>` (наприклад, `/resume 1` для найновішої)" list_failed: "Не вдалося отримати список сеансів: {error}" + out_of_range: "Індекс відновлення {index} поза межами діапазону.\nВикористовуйте `/resume` без аргументів, щоб переглянути доступні сесії." not_found: "Сеанс, що відповідає '**{name}**', не знайдено.\nВикористайте `/resume` без аргументів, щоб побачити доступні сеанси." already_on: "📌 Уже в сеансі **{name}**." switch_failed: "Не вдалося переключити сеанс." diff --git a/locales/zh-hant.yaml b/locales/zh-hant.yaml index 30fbcabac3f..a8c67533847 100644 --- a/locales/zh-hant.yaml +++ b/locales/zh-hant.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "找不到已命名的工作階段。\n使用 `/title 我的工作階段` 為目前工作階段命名,然後使用 `/resume 我的工作階段` 返回。" list_header: "📋 **已命名工作階段**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\n用法:`/resume <工作階段名稱>`" + list_footer_numbered: "\n用法:`/resume <會話名稱>` 或 `/resume <編號>`(例如,`/resume 1` 表示最近的會話)" list_failed: "無法列出工作階段:{error}" + out_of_range: "恢復索引 {index} 超出範圍。\n請使用不帶參數的 `/resume` 查看可用會話。" not_found: "找不到符合 '**{name}**' 的工作階段。\n使用不帶參數的 `/resume` 檢視可用的工作階段。" already_on: "📌 已在工作階段 **{name}** 上。" switch_failed: "切換工作階段失敗。" diff --git a/locales/zh.yaml b/locales/zh.yaml index 60999f06d3a..86c1d359777 100644 --- a/locales/zh.yaml +++ b/locales/zh.yaml @@ -222,9 +222,12 @@ gateway: no_named_sessions: "未找到已命名的会话。\n使用 `/title 我的会话` 为当前会话命名,然后用 `/resume 我的会话` 返回。" list_header: "📋 **已命名会话**\n" list_item: "• **{title}**{preview_part}" + list_item_numbered: "{index}. **{title}**{preview_part}" list_preview_suffix: " — _{preview}_" list_footer: "\n用法:`/resume <会话名称>`" + list_footer_numbered: "\n用法:`/resume <会话名称>` 或 `/resume <编号>`(例如,`/resume 1` 表示最近的会话)" list_failed: "无法列出会话:{error}" + out_of_range: "恢复索引 {index} 超出范围。\n请使用不带参数的 `/resume` 查看可用会话。" not_found: "未找到匹配 '**{name}**' 的会话。\n使用不带参数的 `/resume` 查看可用会话。" already_on: "📌 已在会话 **{name}** 上。" switch_failed: "切换会话失败。" diff --git a/tests/cli/test_cli_resume_command.py b/tests/cli/test_cli_resume_command.py index c6298263079..2790ce5be69 100644 --- a/tests/cli/test_cli_resume_command.py +++ b/tests/cli/test_cli_resume_command.py @@ -11,6 +11,10 @@ def _make_cli(): cli_obj.conversation_history = [] cli_obj.agent = None cli_obj._session_db = MagicMock() + # _handle_resume_command now triggers _display_resumed_history (#31695), + # which reads self.resume_display. "minimal" short-circuits the recap so + # the test only exercises session-switch behavior. + cli_obj.resume_display = "minimal" return cli_obj @@ -44,6 +48,8 @@ class TestCliResumeCommand: {"role": "user", "content": "hello"}, {"role": "assistant", "content": "hi"}, ] + # resolve_resume_session_id passes the id through when no compression chain. + cli_obj._session_db.resolve_resume_session_id.return_value = "sess_001" with ( patch("hermes_cli.main._resolve_session_by_name_or_id", return_value=None),