diff --git a/src/renderer/src/i18n/zh.ts b/src/renderer/src/i18n/zh.ts index 98a4ef8f..c544941e 100644 --- a/src/renderer/src/i18n/zh.ts +++ b/src/renderer/src/i18n/zh.ts @@ -54,6 +54,9 @@ export const zh: Record = { "Cancel run": "取消运行", "Show older runs": "显示更早的运行", "Target date": "目标日期", + "Applies to every company in this app.": "适用于本应用中的所有公司。", + "Applies to {company} only; the folders are on this computer.": "仅适用于 {company};文件夹位于这台电脑上。", + "Applies to {company} only.": "仅适用于 {company}。", "{n} others": "其余 {n} 人", "Work accepted (7 days)": "工作验收(近 7 天)", "{accepted} done · {returned} sent back · sessions: {ok} ended, {failed} failed": "{accepted} 项完成 · {returned} 项退回 · 会话:{ok} 次结束,{failed} 次失败", diff --git a/src/renderer/src/pages/SettingsPage.tsx b/src/renderer/src/pages/SettingsPage.tsx index 0089d7df..1be7dae7 100644 --- a/src/renderer/src/pages/SettingsPage.tsx +++ b/src/renderer/src/pages/SettingsPage.tsx @@ -50,6 +50,7 @@ export function SettingsPage({ snapshot, actions, focus }: PageProps) { {tab === "providers" && ( )} - {tab === "integrations" && } + {tab === "integrations" && } {tab === "advanced" && (

{t("Advanced")}

+ {connected.length > 0 && (
diff --git a/src/renderer/src/pages/settings/IntegrationKeysPanel.tsx b/src/renderer/src/pages/settings/IntegrationKeysPanel.tsx index a3b18520..b842fa32 100644 --- a/src/renderer/src/pages/settings/IntegrationKeysPanel.tsx +++ b/src/renderer/src/pages/settings/IntegrationKeysPanel.tsx @@ -1,3 +1,4 @@ +import { ScopeNote } from "./ScopeNote"; import { useState, type FormEvent } from "react"; import type { IntegrationKeyName, IntegrationKeyStatus } from "../../../../shared/commands"; import { Button, Field, Pill } from "../../shared/ui"; @@ -22,11 +23,12 @@ const KEY_COPY: Record

{t("Integrations")}

-

+ +

{t("Keys are stored on this device, encrypted by the operating system, and shared by every company.")}

{keys.map((status) => )} diff --git a/src/renderer/src/pages/settings/ProvidersPanel.tsx b/src/renderer/src/pages/settings/ProvidersPanel.tsx index 51db50a9..aa544b77 100644 --- a/src/renderer/src/pages/settings/ProvidersPanel.tsx +++ b/src/renderer/src/pages/settings/ProvidersPanel.tsx @@ -1,3 +1,4 @@ +import { ScopeNote } from "./ScopeNote"; import { useState, type FormEvent } from "react"; import { Button, Pill } from "../../shared/ui"; import { Dialog } from "../../shared/Dialog"; @@ -16,6 +17,7 @@ import { composeSecret } from "./provider-secret"; import type { SnapshotActions } from "../../app/useSnapshot"; interface ProvidersPanelProps { + companyName: string; orgId: string; employeeId: string; providers: ProviderRecord[]; @@ -30,7 +32,7 @@ const PRICE_GRID = "minmax(150px, 1.4fr) 110px 110px 110px 92px"; const POLICY_GRID = "minmax(150px, 1.2fr) minmax(118px, 0.8fr) minmax(140px, 1fr) 112px 124px 124px 92px"; type WorkspaceScope = "organization" | "workspace"; -export function ProvidersPanel({ orgId, employeeId, providers, authProfiles, catalog, agents, providerRateLimits, actions }: ProvidersPanelProps) { +export function ProvidersPanel({ orgId, companyName, employeeId, providers, authProfiles, catalog, agents, providerRateLimits, actions }: ProvidersPanelProps) { const [active, setActive] = useState(null); const connected = providers.filter((provider) => provider.enabled); const available = providers.filter((provider) => !provider.enabled); @@ -58,6 +60,7 @@ export function ProvidersPanel({ orgId, employeeId, providers, authProfiles, cat return (

{t("Providers")}

+ {connected.length > 0 && ( <> diff --git a/src/renderer/src/pages/settings/ScopeNote.tsx b/src/renderer/src/pages/settings/ScopeNote.tsx new file mode 100644 index 00000000..d580cf00 --- /dev/null +++ b/src/renderer/src/pages/settings/ScopeNote.tsx @@ -0,0 +1,14 @@ +import { t } from "../../i18n/i18n"; + +/** Where a setting takes effect: only the current company, every company in this app, or the company with folders on this computer. */ +export type SettingScope = "company" | "app" | "company_folders"; + +/** Says, under a settings section, what a change there affects. */ +export function ScopeNote({ scope, company }: { scope: SettingScope; company: string }) { + const text = scope === "app" + ? t("Applies to every company in this app.") + : scope === "company_folders" + ? t("Applies to {company} only; the folders are on this computer.", { company }) + : t("Applies to {company} only.", { company }); + return
{text}
; +} diff --git a/src/renderer/src/pages/settings/WorkspacePanel.tsx b/src/renderer/src/pages/settings/WorkspacePanel.tsx index ac927dc8..5dad7ab0 100644 --- a/src/renderer/src/pages/settings/WorkspacePanel.tsx +++ b/src/renderer/src/pages/settings/WorkspacePanel.tsx @@ -1,3 +1,4 @@ +import { ScopeNote } from "./ScopeNote"; import { useState, type FormEvent } from "react"; import type { OrganizationRecord, @@ -62,6 +63,7 @@ export function WorkspacePanel({ return (

{t("General")}

+
{organization.executionMode === "ai_ceo" ? t("AI CEO") : t("AI Co-Founder")} @@ -76,7 +78,8 @@ export function WorkspacePanel({
-
{t("Appearance")}
+
{t("Appearance")}
+