docs(copy): 设置页账户与智能体分区文案按 human-copy 重写
- 改密码后的会话说法统一为「其他会话已退出」 - 模型服务向导里的 provider 统一写「提供方」 - 能力类别「提案」改「方案」;自动调查说明去掉「有界调查」 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
1 parent
89795802b5
commit
c57411f9a5
6 files changed
+15
-15
No files matched your search
@@ -41,7 +41,7 @@ function PasswordBlock({ disabled }: { disabled: boolean }) {
|
||||
setErrors({});
|
||||
try {
|
||||
const r = await change.mutateAsync({ currentPassword: form.currentPassword, newPassword: form.newPassword });
|
||||
toast.success(r.revokedSessions ? `密码已修改,注销了其它 ${r.revokedSessions} 个会话` : "密码已修改");
|
||||
toast.success(r.revokedSessions ? `密码已修改,其他 ${r.revokedSessions} 个会话已退出` : "密码已修改");
|
||||
setForm(EMPTY_PWD);
|
||||
} catch (err) {
|
||||
const msg = errorMessage(err);
|
||||
@@ -58,7 +58,7 @@ function PasswordBlock({ disabled }: { disabled: boolean }) {
|
||||
section="account"
|
||||
anchor="password"
|
||||
title="修改密码"
|
||||
description="修改后其它设备上的会话全部注销,当前会话保留。"
|
||||
description="其他设备上的会话会退出登录,当前会话保留。"
|
||||
dirty={dirty}
|
||||
>
|
||||
<form onSubmit={submit} noValidate className="grid gap-x-4 gap-y-1 sm:grid-cols-3">
|
||||
@@ -136,13 +136,13 @@ function SessionBlock() {
|
||||
</dd>
|
||||
<dt className="text-muted-foreground">当前会话</dt>
|
||||
<dd>{s?.expiresAt ? `到 ${formatDateTime(s.expiresAt)} 失效` : "未使用登录会话"}</dd>
|
||||
<dt className="text-muted-foreground">其它会话</dt>
|
||||
<dd className="text-muted-foreground">修改密码时全部注销</dd>
|
||||
<dt className="text-muted-foreground">其他会话</dt>
|
||||
<dd className="text-muted-foreground">修改密码时全部退出登录</dd>
|
||||
</dl>
|
||||
<div className="mt-4 border-t border-border/60 pt-4">
|
||||
<p className="text-caption font-medium">本机 Token</p>
|
||||
<p className="mb-2 text-meta text-muted-foreground">
|
||||
只存在这个浏览器,有值时请求会带上它。{hasToken ? "已设置。" : "未设置。"}
|
||||
只保存在这个浏览器,有值时每个请求都会带上。{hasToken ? "已设置。" : "未设置。"}
|
||||
</p>
|
||||
<div className="flex max-w-md flex-wrap items-center gap-2">
|
||||
<SecretInput
|
||||
|
||||
@@ -37,7 +37,7 @@ import { SettingsBlock } from "./settings-block.tsx";
|
||||
export const KIND_LABEL: Record<CapabilityKind, string> = {
|
||||
read: "只读",
|
||||
preview: "预览",
|
||||
propose: "提案",
|
||||
propose: "方案",
|
||||
approve: "审批",
|
||||
execute: "执行",
|
||||
};
|
||||
@@ -49,7 +49,7 @@ const RISK: Record<RiskLevel, { label: string; tone: StatusTone }> = {
|
||||
};
|
||||
|
||||
const AUTH: Record<CapabilityAuthState, { label: string; tone: StatusTone; hint: string }> = {
|
||||
read_only: { label: "无需授权", tone: "neutral", hint: "只读或预览,不落变更,Key 有对应 scope 即可调用" },
|
||||
read_only: { label: "无需授权", tone: "neutral", hint: "只读或预览,不改数据;Key 有对应 scope 就能调用" },
|
||||
granted: { label: "有持续授权", tone: "success", hint: "智能体、MCP、API Key 调用按持续授权放行" },
|
||||
needs_approval: {
|
||||
label: "需审批",
|
||||
|
||||
@@ -105,7 +105,7 @@ export const BUDGET_CARD: CardSpec = {
|
||||
export const INVESTIGATE_CARD: CardSpec = {
|
||||
anchor: "investigate",
|
||||
title: "自动处理",
|
||||
description: "整理时识别不到作品就叫智能体识别;下载失败、集数对不上等问题出现时,自动发起一次有界调查。",
|
||||
description: "整理时识别不到作品就叫智能体识别;下载失败、集数对不上时自动发起一次调查,受下面的上限约束。",
|
||||
fields: [
|
||||
{
|
||||
name: "agent.autoIdentifyOrganize",
|
||||
|
||||
@@ -102,7 +102,7 @@ export function PiOAuthLogin({
|
||||
abortRef.current = ac;
|
||||
while (!ac.signal.aborted) {
|
||||
if (Date.now() > new Date(s.expiresAt).getTime()) {
|
||||
finish("expired", "授权已超时。");
|
||||
finish("expired", "授权已超时");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
|
||||
@@ -258,7 +258,7 @@ export function ModelFetchBar({
|
||||
: remote
|
||||
? `来源:远程 · ${formatRelative(data?.fetchedAt)}更新`
|
||||
: unsupported
|
||||
? "来源:静态(这个 provider 没有模型列表接口)"
|
||||
? "来源:静态(这个提供方没有模型列表接口)"
|
||||
: data
|
||||
? "来源:静态"
|
||||
: null}
|
||||
|
||||
@@ -70,7 +70,7 @@ export function PiUpstreamWizard({ open, onClose }: { open: boolean; onClose: ()
|
||||
: (created?.name ?? "");
|
||||
const description =
|
||||
step === "provider"
|
||||
? "第 1 步,共 3 步:选 provider"
|
||||
? "第 1 步,共 3 步:选提供方"
|
||||
: step === "config"
|
||||
? "第 2 步,共 3 步:凭证与模型"
|
||||
: created?.authKind === "oauth"
|
||||
@@ -116,7 +116,7 @@ function ProviderPicker({ onPick }: { onPick: (p: PiProviderInfo) => void }) {
|
||||
<div className="relative">
|
||||
<Search className="pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-muted-foreground" />
|
||||
<Input
|
||||
aria-label="筛选 provider"
|
||||
aria-label="筛选提供方"
|
||||
placeholder="筛选,例如 openai"
|
||||
value={filter}
|
||||
onChange={(e) => setFilter(e.target.value)}
|
||||
@@ -148,7 +148,7 @@ function ProviderPicker({ onPick }: { onPick: (p: PiProviderInfo) => void }) {
|
||||
</DetailSection>
|
||||
);
|
||||
})}
|
||||
{list.length === 0 ? <p className="text-caption text-muted-foreground">没有匹配的 provider。</p> : null}
|
||||
{list.length === 0 ? <p className="text-caption text-muted-foreground">没有匹配的提供方。</p> : null}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -252,7 +252,7 @@ function ConfigStep({
|
||||
<div className="sm:col-span-2">
|
||||
<Button type="button" variant="ghost" size="xs" onClick={onBack} className="-ml-2 mb-2">
|
||||
<ChevronLeft />
|
||||
换一个 provider
|
||||
换一个提供方
|
||||
</Button>
|
||||
{provider.note && !custom ? <p className="mb-3 text-caption text-muted-foreground">{provider.note}</p> : null}
|
||||
</div>
|
||||
@@ -356,7 +356,7 @@ function ConfigStep({
|
||||
htmlFor="pw-model"
|
||||
error={errors.defaultModel}
|
||||
required={custom}
|
||||
hint={custom ? "端点上的模型 id" : "留空用 provider 的默认模型"}
|
||||
hint={custom ? "端点上的模型 id" : "留空用提供方的默认模型"}
|
||||
className="sm:col-span-2"
|
||||
>
|
||||
<ModelFetchBar
|
||||
|
||||
Reference in new issue
Block a user