fix(#2147): add profile_concept keys to all locale blocks and update existing test

This commit is contained in:
Rod Boev authored and nesquena-hermes committed 2026-07-14 03:33:00 +00:00
1 parent e9b17b1a52
commit 453b9696e3
2 files changed
+104 -7

No files matched your search

+92 -1
View File
@@ -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',
+12 -6
View File
@@ -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():