diff --git a/App/Sources/Clients/Github/GithubGraphQLPullRequestResponse.swift b/App/Sources/Clients/Github/GithubGraphQLPullRequestResponse.swift index 26b77302..d2bd88ee 100644 --- a/App/Sources/Clients/Github/GithubGraphQLPullRequestResponse.swift +++ b/App/Sources/Clients/Github/GithubGraphQLPullRequestResponse.swift @@ -17,7 +17,8 @@ nonisolated struct GithubGraphQLPullRequestResponse: Decodable { return nil } let error = errors.first - return .graphQLError(type: error?.type, message: error?.message ?? "Missing repository payload") + return .graphQLError( + type: error?.type, message: error?.message ?? String(localized: "Missing repository payload")) } func pullRequestsByBranch( diff --git a/App/Sources/Localizable.xcstrings b/App/Sources/Localizable.xcstrings index 783733a6..d4e6d1bc 100644 --- a/App/Sources/Localizable.xcstrings +++ b/App/Sources/Localizable.xcstrings @@ -8079,6 +8079,46 @@ } } }, + "GitHub rate-limited until %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 已限流至 %@" + } + } + } + }, + "GitHub rate-limited, retrying at %@" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 已限流,将于 %@ 重试" + } + } + } + }, + "GitHub refused requests for this account's rate limit. Prowl sends none until the retry time, so other tools on the account keep working." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 因该账户的速率限额拒绝了请求。Prowl 在重试时间之前不会再发送任何请求,这样该账户上的其他工具可以继续工作。" + } + } + } + }, + "GitHub refused requests for this account's rate limit. Prowl sends none until the retry time." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "GitHub 因该账户的速率限额拒绝了请求。Prowl 在重试时间之前不会再发送任何请求。" + } + } + } + }, "GitHub repository not resolved" : { "localizations" : { "zh-Hans" : { @@ -9819,6 +9859,16 @@ } } }, + "Missing repository payload" : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "缺少仓库数据" + } + } + } + }, "Mode" : { "localizations" : { "zh-Hans" : { @@ -10379,12 +10429,12 @@ } } }, - "No agent skill folder was found in your home directory. Run Claude Code, Codex, or another agent once so it creates its folder, or create one from a terminal with prowl skills install --target claude|codex|agents." : { + "No agent skill folder was found in your home directory. Run Claude Code, Codex, or another agent once so it creates its folder, or create one from a terminal with prowl skills install --target claude|codex|agents|devin|antigravity." : { "localizations" : { "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "未在主目录中找到 Agent 技能文件夹。请先运行一次 Claude Code、Codex 或其他 Agent 以创建其文件夹,或在终端中使用 prowl skills install --target claude|codex|agents 创建。" + "value" : "未在主目录中找到 Agent 技能文件夹。请先运行一次 Claude Code、Codex 或其他 Agent 以创建其文件夹,或在终端中使用 prowl skills install --target claude|codex|agents|devin|antigravity 创建。" } } } @@ -15966,6 +16016,16 @@ } } }, + "Select this worktree to list each check." : { + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "选择此 worktree 以列出每项检查。" + } + } + } + }, "Select worktree and focus terminal" : { "localizations" : { "zh-Hans" : { diff --git a/docs-ai/070-app-localization/glossary.md b/docs-ai/070-app-localization/glossary.md index c1047983..ab288563 100644 --- a/docs-ai/070-app-localization/glossary.md +++ b/docs-ai/070-app-localization/glossary.md @@ -75,6 +75,7 @@ When “profile” and “configuration” meet in one sentence, write 设置 fo | symlink / link | 符号链接 / 链接 | | clone (n.) / worktree (n.) / link (n.) in a count | 克隆 / worktree / 链接 (`1 个克隆`, `%lld 个链接`) | | base ref / base branch | 基线引用 / 基线分支 (`Base branch` in a picker); 基准 for “relative to its base” | +| rate limit / rate-limited | 速率限额 / 已限流 (`GitHub 已限流至 %@`) | ## Scripts and workflows diff --git a/scripts/localization_baseline.json b/scripts/localization_baseline.json index b537d983..9db89ef5 100644 --- a/scripts/localization_baseline.json +++ b/scripts/localization_baseline.json @@ -29,7 +29,7 @@ }, "exemptLiterals": { "%@\n\n---\nProwl dispatch completion protocol v%@:\nBefore ending this task, choose exactly one terminal outcome and make this command your final tool action:\nprowl agents dispatch-complete --outcome succeeded|failed --summary \"\"\nUse succeeded only when the assigned work is complete and verified. Use failed when it cannot be completed.\nKeep the required summary to a single line with no control characters, and explain the result clearly.\nDo not omit the command; Prowl supplies its dispatch context\nautomatically.": "agent-prompt", - "%@: pullRequests(first: 5, states: [OPEN, MERGED, CLOSED], headRefName: \"%@\", %@) {\n nodes {\n number\n title\n state\n additions\n deletions\n isDraft\n reviewDecision\n mergeable\n mergeStateStatus\n url\n updatedAt\n headRefName\n baseRefName\n commits {\n totalCount\n }\n author {\n login\n }\n headRepository {\n name\n owner { login }\n }\n mergeQueueEntry {\n position\n estimatedTimeToMerge\n state\n }\n statusCheckRollup {\n contexts(first: 100) {\n nodes {\n ... on CheckRun {\n name\n status\n conclusion\n startedAt\n completedAt\n detailsUrl\n }\n ... on StatusContext {\n context\n state\n targetUrl\n createdAt\n }\n }\n }\n }\n }\n}": "identifier", + "%@ has an existing draft or attachment. Clear it on Host before dispatching.": "protocol", "%@: unexpected version output": "developer", "%@; %@; %@; exec \"${__prowl_login_argv[@]}\"": "identifier", "(invocation %@)%@; persisting.": "log", @@ -42,7 +42,6 @@ "Catppuccin Latte": "product-name", "Choose a valid Host Profile and a prompt within the size limit.": "protocol", "Claude Code": "product-name", - "Claude has an existing draft or attachment. Clear it on Host before dispatching.": "protocol", "Codex has a draft, attachment, or an unrecognized input area. Check Host before dispatching.": "protocol", "Command is not allowed.": "protocol", "Configure bundle approval in the test.": "developer", @@ -58,6 +57,7 @@ "Device access was revoked.": "log", "Device authentication failed or pairing expired.": "log", "Device authentication timed out.": "log", + "EEE, dd MMM yyyy HH:mm:ss zzz": "identifier", "Empty output": "other", "Empty repository icon storage string": "developer", "Empty response from gh api graphql": "other", @@ -115,7 +115,7 @@ "Sublime Merge": "product-name", "Sublime Text": "product-name", "Test": "developer", - "The Claude input area could not be verified. Check Host before dispatching.": "protocol", + "The %@ input area could not be verified. Check Host before dispatching.": "protocol", "The delivered output is %@ bytes; the limit is %@ bytes.": "protocol", "The delivered output is invalid: %@": "protocol", "The delivery token does not belong to the step that is waiting; rerun the latest generated completion command.": "protocol",