From 453b9696e38ca60f5c529f2270aa7ac934272ebb Mon Sep 17 00:00:00 2001 From: Rod Boev Date: Wed, 8 Jul 2026 21:18:13 -0400 Subject: [PATCH] fix(#2147): add profile_concept keys to all locale blocks and update existing test --- static/i18n.js | 93 ++++++++++++++++++- .../test_issue2147_profile_workspace_copy.py | 18 ++-- 2 files changed, 104 insertions(+), 7 deletions(-) diff --git a/static/i18n.js b/static/i18n.js index 2919bc90..c15dc626 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -1,4 +1,4 @@ -// ── i18n: locale bundles and t() helper ────────────────────────────────────── +// ── i18n: locale bundles and t() helper ────────────────────────────────────── // To add a new language: add an entry to LOCALES below with all keys translated. // The language code must match a valid BCP 47 tag (used for speech recognition). // Keys missing in a non-English locale fall back to English automatically. @@ -3328,6 +3328,13 @@ const LOCALES = { profile_switch_title: 'Passa a questo profilo', profile_delete_title: 'Elimina questo profilo', profile_default_label: '(predefinito)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Nome profilo (minuscole, a-z 0-9 trattini)', profile_clone_label: 'Clona config dal profilo attivo', profile_model_label: 'Modello / provider', @@ -5071,6 +5078,13 @@ const LOCALES = { profile_switch_title: 'このプロファイルに切り替え', profile_delete_title: 'このプロファイルを削除', profile_default_label: '(デフォルト)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'プロファイル名 (小文字 a-z 0-9 ハイフン)', profile_clone_label: 'アクティブプロファイルから設定をコピー', profile_model_label: 'モデル / プロバイダー', @@ -6423,6 +6437,13 @@ const LOCALES = { profile_switch_title: 'Переключиться на этот профиль', profile_delete_title: 'Удалить этот профиль', profile_default_label: '(по умолчанию)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Название профиля (строчные буквы, a-z, 0-9, дефисы)', profile_clone_label: 'Скопировать конфигурацию из активного профиля', profile_model_label: 'Модель / провайдер', @@ -8142,6 +8163,13 @@ const LOCALES = { profile_switch_title: 'Switch to this profile', profile_delete_title: 'Eliminar este perfil', profile_default_label: '(predeterminado)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Nombre del perfil (minúsculas, a-z, 0-9, guiones)', profile_clone_label: 'Clonar configuración del perfil activo', profile_model_label: 'Modelo / proveedor', @@ -10149,6 +10177,13 @@ const LOCALES = { profile_switch_title: 'Profil wechseln', profile_delete_title: 'Profil löschen', profile_default_label: 'Standard', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Profilname', profile_clone_label: 'Klonen', profile_model_label: 'Modell / Anbieter', @@ -11499,6 +11534,13 @@ const LOCALES = { profile_switch_title: '切换到此配置档', profile_delete_title: '删除此配置档', profile_default_label: '(默认)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: '配置档名称(小写字母、a-z、0-9、连字符)', profile_clone_label: '复制当前配置档的配置', profile_model_label: '模型 / 提供商', @@ -13562,6 +13604,13 @@ const LOCALES = { profile_switch_title: '切換到此設定檔', profile_delete_title: '刪除此設定檔', profile_default_label: '(預設)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: '設定檔名稱(小寫字母、數字、連字號)', profile_clone_label: '從啟用中的設定檔複製設定', profile_model_label: '模型 / 供應商', @@ -16755,6 +16804,13 @@ const LOCALES = { profile_switch_title: 'Switch to this profile', profile_delete_title: 'Delete this profile', profile_default_label: '(default)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Profile name (lowercase, a-z 0-9 hyphens)', profile_clone_label: 'Clone config from active profile', profile_model_label: 'Model / provider', @@ -18570,6 +18626,13 @@ const LOCALES = { profile_switch_title: 'Basculer vers ce profil', profile_delete_title: 'Supprimer ce profil', profile_default_label: '(par défaut)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Nom du profil (minuscules, a-z 0-9 tirets)', profile_clone_label: 'Cloner la configuration du profil actif', profile_model_label: 'Modèle / fournisseur', @@ -19362,6 +19425,13 @@ const LOCALES = { profile_clone_label: 'Klonovat konfiguraci z aktivního profilu', profile_created: (name) => `Profil vytvořen: ${name}`, profile_default_label: '(výchozí)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_delete_confirm_message: 'Všechny relace, konfigurace, dovednosti a paměť tohoto profilu budou trvale smazány. Toto nelze vrátit zpět.', profile_delete_confirm_title: (name) => `Smazat profil "${name}"?`, profile_delete_title: 'Smazat tento profil', @@ -21908,6 +21978,13 @@ const LOCALES = { profile_switch_title: 'Bu profile geç', profile_delete_title: 'Bu profili sil', profile_default_label: '(varsayılan)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Profil adı (küçük harf, a-z 0-9 kısa çizgiler)', profile_clone_label: 'Etkin profilden yapılandırmayı kopyala', profile_model_label: 'Model / sağlayıcı', @@ -23731,6 +23808,13 @@ const LOCALES = { profile_switch_title: 'Przełącz na ten profil', profile_delete_title: 'Usuń ten profil', profile_default_label: '(domyślny)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Nazwa profilu (małe litery, a-z 0-9, myślniki)', profile_clone_label: 'Klonuj konfigurację z aktywnego profilu', profile_model_label: 'Model / dostawca', @@ -25300,6 +25384,13 @@ const LOCALES = { profile_switch_title: 'Chuyển sang hồ sơ này', profile_delete_title: 'Xóa profile này', profile_default_label: '(mặc định)', + profile_concept_title: 'Profiles vs workspaces', + profile_concept_subtitle: 'Use profiles for how the agent works; use workspaces for what files it works on.', + profile_concept_desc_profiles: 'Agent identity, memory, skills, model/provider config, and connected tools. Create profiles for roles like researcher, writer, marketer, or developer when those roles should carry different context or capabilities.', + profile_concept_desc_workspaces: 'Project or product folders on disk. Use one workspace per repo/product so chat, terminal, and file browsing point at the right files.', + profile_concept_desc_together: 'A profile can have a default workspace, but you can switch workspaces any time. Profiles answer "who is working?"; workspaces answer "where are they working?"', + profile_concept_example: 'Example: create a "researcher" profile with web-search skills enabled and a "my-app" workspace pointing at your project folder. The researcher profile remembers your research preferences; the workspace scopes file access to that project.', + profile_concept_workspace_binding: 'Each profile can bind its own default workspace, but switching workspaces mid-session does not switch profiles. Scheduled tasks run under the profile that created them.', profile_name_placeholder: 'Tên profile (chữ thường, a-z 0-9 dấu gạch ngang)', profile_clone_label: 'Nhân bản cấu hình từ profile đang hoạt động', profile_model_label: 'Model / nhà cung cấp', diff --git a/tests/test_issue2147_profile_workspace_copy.py b/tests/test_issue2147_profile_workspace_copy.py index 55203c15..5d627792 100644 --- a/tests/test_issue2147_profile_workspace_copy.py +++ b/tests/test_issue2147_profile_workspace_copy.py @@ -10,18 +10,24 @@ def read(rel: str) -> str: def test_profiles_panel_surfaces_profiles_vs_workspaces_help_card(): src = read("static/panels.js") - assert "Profiles vs workspaces" in src - assert "Use profiles for how the agent works; use workspaces for what files it works on." in src + assert "t('profile_concept_title')" in src + assert "t('profile_concept_subtitle')" in src assert "_renderProfileConceptHelp" in src assert "explainer.onclick = () => _renderProfileConceptHelp" in src def test_profile_concept_help_distinguishes_how_from_where(): + i18n = read("static/i18n.js") + assert "Agent identity, memory, skills, model/provider config, and connected tools" in i18n + assert "Create profiles for roles like researcher, writer, marketer, or developer" in i18n + assert "Project or product folders on disk" in i18n + assert 'Profiles answer' in i18n + assert 'who is working' in i18n + assert 'where are they working' in i18n src = read("static/panels.js") - assert "Agent identity, memory, skills, model/provider config, and connected tools" in src - assert "Create profiles for roles like researcher, writer, marketer, or developer" in src - assert "Project or product folders on disk" in src - assert "Profiles answer “who is working?”; workspaces answer “where are they working?”" in src + assert "t('profile_concept_desc_profiles')" in src + assert "t('profile_concept_desc_workspaces')" in src + assert "t('profile_concept_desc_together')" in src def test_empty_profiles_state_keeps_help_card_visible():