-
Notifications
You must be signed in to change notification settings - Fork 614
refactor: better translate #716
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ceholder unchanged
…ceholder unchanged
…ceholder unchanged
WalkthroughThis change updates localization JSON files for English, Persian, French, Japanese, and Russian, refining UI text for clarity, consistency, and accuracy. Modifications include rewording labels, descriptions, and button texts, standardizing terminology, correcting capitalization, and improving phrasing in chat, settings, dialog, thread, MCP, and component-related strings. No logic or control flow is altered. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Possibly related PRs
Poem
Note 🔌 MCP (Model Context Protocol) integration is now available in Early Access!Pro users can now connect to remote MCP servers under the Integrations page to get reviews and chat conversations that understand additional development context. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
✅ Files skipped from review due to trivial changes (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
✨ Finishing Touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 7
🔭 Outside diff range comments (1)
src/renderer/src/i18n/en-US/settings.json (1)
1-691: Inconsistent translation key hierarchy for “contentProtection”
The French file defines a nestedcommon.contentProtectionobject, but the English file uses flat keys undercommon(e.g.contentProtectionDialogTitle,contentProtectionEnableDesc, etc.). This mismatch will cause runtime lookup failures in one locale.Please align both files so they share the same key structure. You can either:
- Flatten the FR translations to match the EN flat keys, or
- Nest the EN keys under a
common.contentProtectionobject to mirror FR.Key discrepancy detected:
• FR-only: common.contentProtectionPlease update:
- src/renderer/src/i18n/en-US/settings.json
- src/renderer/src/i18n/fr-FR/settings.json
🧹 Nitpick comments (26)
src/renderer/src/i18n/fa-IR/toolCall.json (1)
7-7: Tone/style consistency suggestion (fa-IR)Current "برای دیدن جزئیات بزنید" is slightly colloquial. Consider a more formal UI tone used elsewhere in fa-IR files:
- "clickToView": "برای دیدن جزئیات بزنید", + "clickToView": "برای مشاهدهٔ جزئیات کلیک کنید",src/renderer/src/i18n/en-US/promptSetting.json (1)
40-40: Capitalize to match Title Case used elsewhere in this fileMost labels here use Title Case (e.g., “File Management”, “Uploaded Files”). Consider aligning:
- "uploadFromDevice": "Upload from device", + "uploadFromDevice": "Upload from Device",src/renderer/src/i18n/fr-FR/update.json (1)
7-7: Optional: more idiomatic French phrasing“Téléchargement GitHub” is understandable but “Télécharger depuis GitHub” is more natural for a button/CTA.
Apply if desired:
- "githubDownload": "Téléchargement GitHub", + "githubDownload": "Télécharger depuis GitHub",src/renderer/src/i18n/fr-FR/toolCall.json (1)
7-7: Consider UI tone for action labels“Cliquer pour afficher les détails” reads like an instruction. For buttons/links, “Afficher les détails” (or “Voir les détails”) is more idiomatic and shorter.
- "clickToView": "Cliquer pour afficher les détails", + "clickToView": "Afficher les détails",src/renderer/src/i18n/fr-FR/contextMenu.json (1)
9-9: Typographic apostrophe consistencyGreat switch to the typographic apostrophe (’). Consider updating “Appel d'outil” to “Appel d’outil” for consistency within the same locale file.
Outside the shown lines:
- Replace: "title": "Appel d'outil"
- With: "title": "Appel d’outil"
Also applies to: 12-12
src/renderer/src/i18n/fr-FR/common.json (1)
5-10: Optional dedup: link image-copy success to the generic copy successIf vue-i18n message linking is enabled, you can avoid duplicating identical labels.
- "copyImageSuccess": "Copié", + "copyImageSuccess": "@:copySuccess",src/renderer/src/i18n/ja-JP/artifacts.json (1)
33-39: Nit: align tone across failure descriptionsCurrently:
- copyFailedDesc: クリップボードへのコピーに失敗しました
- copyImageFailedDesc: 画像をコピーできませんでした
Consider using the same pattern for both. For example, switch copyFailedDesc to the “できませんでした” form:
- "copyFailedDesc": "クリップボードへのコピーに失敗しました", + "copyFailedDesc": "クリップボードにコピーできませんでした",src/renderer/src/i18n/ja-JP/update.json (1)
7-7: Nit: more idiomatic JapaneseIf space allows, “GitHub からダウンロード” reads a bit more natural.
- "githubDownload": "GitHub ダウンロード", + "githubDownload": "GitHub からダウンロード",src/renderer/src/i18n/fa-IR/common.json (1)
5-5: fa-IR: Align terminology ("رونوشت" vs "رونویسی") for consistencyYou switched titles to "رونوشت شد/نشد" but descriptions still use "رونویسی". Consider unifying to "رونوشت" across both for consistency.
Proposed adjustments:
- "copySuccessDesc": "محتوا در بریدهدان رونویسی شد", + "copySuccessDesc": "محتوا در بریدهدان رونوشت شد", - "copyImageSuccessDesc": "تصویر در بریدهدان رونویسی شد", + "copyImageSuccessDesc": "تصویر در بریدهدان رونوشت شد", - "copyFailedDesc": "رونویسی محتوا در بریدهدان انجام نشد", + "copyFailedDesc": "رونوشت محتوا در بریدهدان انجام نشد",Also applies to: 7-7, 9-9
src/renderer/src/i18n/ru-RU/dialog.json (1)
24-28: Nit: clarify “до текущего” to explicitly reference the current messageConsider adding “сообщения” for precision.
- "description": "Скопировать сообщения с начала до текущего в новый разговор.", + "description": "Скопировать сообщения с начала до текущего сообщения в новый разговор.",src/renderer/src/i18n/fa-IR/dialog.json (2)
16-19: Unify “clean” terminology; prefer “پاکسازی” for nounal titlesAligns with standard Persian UI wording and differentiates from “حذف”.
- "title": "پاک کردن پیامها", + "title": "پاکسازی پیامها", @@ - "confirm": "پاک کردن" + "confirm": "پاکسازی"
21-24: “ایجاد شاخه” reads more formal/natural for creation actionsMinor style tweak; keeps tag as singular “شاخه”.
- "title": "ساخت شاخه", + "title": "ایجاد شاخه", @@ - "confirm": "ساخت شاخه", + "confirm": "ایجاد شاخه",src/renderer/src/i18n/ru-RU/artifacts.json (1)
34-36: Optional: simplify descriptions to match concise styleShorter variants keep consistency with the tightened titles.
- "copySuccessDesc": "Содержимое скопировано в буфер обмена", + "copySuccessDesc": "Скопировано в буфер обмена", @@ - "copyFailedDesc": "Не удалось скопировать содержимое в буфер обмена", + "copyFailedDesc": "Не удалось скопировать в буфер обмена",src/renderer/src/i18n/ja-JP/components.json (1)
31-33: Optional JP typography: prefer kagi kakko for placeholdersJapanese UI commonly uses 「」 around entity names. This also avoids mixing ASCII quotes with full-width text.
- "read": "'{serverName}' の '{toolName}' が読み取り操作を行うことを許可しますか?", + "read": "「{serverName}」の「{toolName}」が読み取り操作を行うことを許可しますか?", - "write": "'{serverName}' の '{toolName}' が書き込み操作を行うことを許可しますか?", + "write": "「{serverName}」の「{toolName}」が書き込み操作を行うことを許可しますか?", - "all": "'{serverName}' の '{toolName}' が読み取り・書き込みを行うことを許可しますか?" + "all": "「{serverName}」の「{toolName}」が読み取り・書き込みを行うことを許可しますか?"src/renderer/src/i18n/fr-FR/components.json (1)
16-16: French grammar tweaks for naturalness (“depuis”) and past participle
- Prefer “depuis” (from) to link tool and server.
- “Poursuivi” → “Continué” reads more naturally as a post-action state.
Apply:
- "continued": "Poursuivi" + "continued": "Continué"- "read": "Autoriser '{toolName}' de '{serverName}' à effectuer des opérations de lecture ?", + "read": "Autoriser '{toolName}' depuis '{serverName}' à effectuer des opérations de lecture ?", - "write": "Autoriser '{toolName}' de '{serverName}' à effectuer des opérations d'écriture ?", + "write": "Autoriser '{toolName}' depuis '{serverName}' à effectuer des opérations d'écriture ?", - "all": "Autoriser '{toolName}' de '{serverName}' à lire et écrire ?" + "all": "Autoriser '{toolName}' depuis '{serverName}' à lire et écrire ?"Also applies to: 26-29, 31-33
src/renderer/src/i18n/fa-IR/thread.json (1)
12-12: Polish Persian microcopy for naturalness and consistencyCurrent terms work, but the following are more idiomatic and consistent with existing usage (“گفتگو”):
Apply:
- "previousVariant": "گونه قبلی", + "previousVariant": "نسخه قبلی", - "nextVariant": "گونه بعدی", + "nextVariant": "نسخه بعدی", - "copy": "رونوشت به Markdown", + "copy": "کپی به Markdown", - "retry": "تولید دوباره", + "retry": "تولید مجدد", - "fork": "ساخت شاخه", + "fork": "انشعاب به گفتگوی جدید"Note: “ذخیره” updates (Lines 12, 28) look good and consistent.
Also applies to: 14-16, 21-22, 28-28
src/renderer/src/i18n/ja-JP/settings.json (1)
23-24: JA strings improved; small punctuation/style nitpicks
- Content protection and notifications descriptions are clearer.
- “Artifacts” as a product term is acceptable in JA UI.
- Consistency nitpicks:
- Consider ending notificationsDesc with “。” to match most descriptions.
- “コンテキスト長” (Line 124) differs from earlier “コンテキストの長さ” (Lines 101–104). Unify one style across the file.
- Many actions use non-polite forms now (“モデルを追加”). Consider aligning “モデルを選択します” (Line 118, unchanged) to “モデルを選択” for consistency.
Apply this punctuation tweak:
- "notificationsDesc": "DeepChatがバックグラウンドのとき、応答が完了すると通知を送信します" + "notificationsDesc": "DeepChatがバックグラウンドのとき、応答が完了すると通知を送信します。"Would you like me to prepare a follow-up commit to:
- unify “コンテキスト長/コンテキストの長さ” in this file, and
- align “モデルを選択します” → “モデルを選択”?
Also applies to: 55-55, 112-114, 124-124, 175-175, 187-187
src/renderer/src/i18n/fr-FR/thread.json (1)
16-17: Minor wording nit
"copy": "Copier en Markdown"is understandable, but “Copier au format Markdown” is more idiomatic French.src/renderer/src/i18n/fr-FR/settings.json (5)
1-1: Prettier formatting warningCI flagged formatting for this file. Please run Prettier to pass the check.
Run: prettier --write src/renderer/src/i18n/fr-FR/settings.json
53-54: FR: Make the notification description grammatical and neutralCurrent phrasing reads like an instruction. Prefer a descriptive sentence.
- "notifications": "Notifications système", - "notificationsDesc": "Quand DeepChat est en arrière‑plan, envoyer une notification à la fin d’une réponse" + "notifications": "Notifications système", + "notificationsDesc": "Lorsque DeepChat est en arrière‑plan, une notification système est envoyée à la fin d’une réponse."
110-112: FR: Keep “Artifacts” as a feature name, improve description naturalnessMinor style tweak; keeps the product term “Artifacts” unlocalized.
- "description": "Activer Artifacts pour permettre à l’IA de générer un contenu plus riche", - "title": "Artifacts" + "description": "Active Artifacts afin de permettre à l’IA de générer du contenu plus riche", + "title": "Artifacts"
175-177: FR: Refine “Température” descriptionMore idiomatic French and clearer effect of higher values.
- "description": "Contrôle l’aléatoire de la sortie. Valeur plus élevée = plus aléatoire.", - "label": "Température" + "description": "Contrôle le caractère aléatoire de la sortie. Des valeurs plus élevées augmentent la diversité des réponses.", + "label": "Température"
186-186: FR: “Rerank” option label“Modèle de rerank” reads awkwardly in FR. Consider “reranking” or a French term.
- "rerank": "Modèle de rerank" + "rerank": "Modèle de reranking"Alternative: "Modèle de réordonnancement"
src/renderer/src/i18n/en-US/settings.json (3)
1-1: Prettier formatting warningCI flagged formatting for this file. Please run Prettier to pass the check.
Run: prettier --write src/renderer/src/i18n/en-US/settings.json
52-54: Polish notification descriptionSuggested simpler, precise phrasing.
- "notifications": "System Notifications", - "notificationsDesc": "When DeepChat is not in the foreground, if a session is generated, a system notification will be sent" + "notifications": "System Notifications", + "notificationsDesc": "Send a system notification when a response finishes while DeepChat is in the background"
174-176: Grammar nit in temperature descriptionUse “Controls” (3rd person) and tighten punctuation.
- "description": "Control the randomness of the output. Most models are 0-1, and some support between 0-2. Higher values increase randomness.", + "description": "Controls the randomness of the output. Most models are 0–1, and some support 0–2. Higher values increase randomness.",
| "read": "Read Access", | ||
| "write": "Write Access", | ||
| "all": "Full Access" | ||
| }, | ||
| "description": { | ||
| "read": "Allow '{toolName}' of '{serverName}' to perform read operations?", | ||
| "write": "Allow '{toolName}' of '{serverName}' to perform write operations?", | ||
| "all": "Allow '{toolName}' of '{serverName}' to perform read and write operations?" | ||
| "read": "Allow '{toolName}' from '{serverName}' to perform read operations?", | ||
| "write": "Allow '{toolName}' from '{serverName}' to perform write operations?", | ||
| "all": "Allow '{toolName}' from '{serverName}' to perform read and write operations?" | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Terminology shift to “Access” is consistent; placeholders intact
Labels read well and descriptions consistently use “from” with '{toolName}' and '{serverName}'.
Check that all locales keep both placeholders present in the permission descriptions:
🏁 Script executed:
#!/bin/bash
set -e
fd -a -g 'src/renderer/src/i18n/*/components.json' | while read -r f; do
for k in read write all; do
v=$(jq -r ".messageBlockPermissionRequest.description.$k // empty" "$f")
if [ -z "$v" ]; then echo "Missing description.$k in $f"; continue; fi
grep -q '{toolName}' <<<"$v" || echo "Missing {toolName} in $f description.$k"
grep -q '{serverName}' <<<"$v" || echo "Missing {serverName} in $f description.$k"
done
doneLength of output: 73
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Locate all components.json files under each locale
find src/renderer/src/i18n -type f -name 'components.json' | while IFS= read -r f; do
echo "Checking $f"
# Ensure the description block exists
if ! jq -e '.messageBlockPermissionRequest.description' "$f" > /dev/null; then
echo " ❌ Missing .messageBlockPermissionRequest.description in $f"
continue
fi
# Verify each permission level has both placeholders
for key in read write all; do
value=$(jq -r ".messageBlockPermissionRequest.description.$key" "$f")
if [[ "$value" == "null" || -z "$value" ]]; then
echo " ❌ Missing description.$key in $f"
continue
fi
# Check for {toolName} and {serverName}
if ! grep -q '{toolName}' <<<"$value"; then
echo " ❌ Missing '{toolName}' in $f (description.$key)"
fi
if ! grep -q '{serverName}' <<<"$value"; then
echo " ❌ Missing '{serverName}' in $f (description.$key)"
fi
done
doneLength of output: 14158
Fix placeholder casing in ko-KR locale
We’ve verified that all other locales include both {toolName} and {serverName} correctly, but in ko-KR/components.json the placeholders are mis-cased ({toolname} / {servername}), which will break interpolation.
• File: src/renderer/src/i18n/ko-KR/components.json
– description.read
– description.write
– description.all
Suggested diff for each key:
- "read": "읽기 작업을 수행하려면 '{servername}'의 '{toolname}'을 허용합니까?"
+ "read": "읽기 작업을 수행하려면 '{serverName}'의 '{toolName}'을 허용합니까?"
- "write": "쓰기 작업을 수행하려면 '{servername}'의 '{toolname}'을 허용합니까?"
+ "write": "쓰기 작업을 수행하려면 '{serverName}'의 '{toolName}'을 허용합니까?"
- "all": "읽기 및 쓰기 작업을 수행하려면 '{servername}'의 '{toolname}'을 허용합니까?"
+ "all": "읽기 및 쓰기 작업을 수행하려면 '{serverName}'의 '{toolName}'을 허용합니까?"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "read": "Read Access", | |
| "write": "Write Access", | |
| "all": "Full Access" | |
| }, | |
| "description": { | |
| "read": "Allow '{toolName}' of '{serverName}' to perform read operations?", | |
| "write": "Allow '{toolName}' of '{serverName}' to perform write operations?", | |
| "all": "Allow '{toolName}' of '{serverName}' to perform read and write operations?" | |
| "read": "Allow '{toolName}' from '{serverName}' to perform read operations?", | |
| "write": "Allow '{toolName}' from '{serverName}' to perform write operations?", | |
| "all": "Allow '{toolName}' from '{serverName}' to perform read and write operations?" | |
| } | |
| "description": { | |
| "read": "읽기 작업을 수행하려면 '{serverName}'의 '{toolName}'을 허용합니까?", | |
| "write": "쓰기 작업을 수행하려면 '{serverName}'의 '{toolName}'을 허용합니까?", | |
| "all": "읽기 및 쓰기 작업을 수행하려면 '{serverName}'의 '{toolName}'을 허용합니까?" | |
| } |
🤖 Prompt for AI Agents
In src/renderer/src/i18n/ko-KR/components.json around lines corresponding to
description.read, description.write, and description.all, the placeholders
{toolname} and {servername} are incorrectly cased. Update these placeholders to
{toolName} and {serverName} respectively to match the casing used in other
locales and ensure proper interpolation.
| "characters": "Characters", | ||
| "fileManagement": "File Management", | ||
| "uploadFromDevice": "Upload from Your Device", | ||
| "uploadFromDevice": "Upload from device", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Confirm style guide (Title Case vs Sentence case)
If the project is moving to sentence case for action labels, keep as-is and plan a bulk pass for consistency.
🏁 Script executed:
#!/bin/bash
# Quick scan of this file to see casing of top-level labels
sed -n '2,70p' src/renderer/src/i18n/en-US/promptSetting.json | rg -n '": "([A-Z][a-z]+ [A-Z][a-z]+|[A-Z][a-z]+)"' -oLength of output: 657
Inconsistent Casing in promptSetting.json
A quick scan shows most action labels in src/renderer/src/i18n/en-US/promptSetting.json use Title Case (e.g. “Add Prompt”, “Edit Prompt”), but the entry at line 40:
• "uploadFromDevice": "Upload from device"
is in sentence case. Please choose one convention and apply it consistently:
- If you prefer Title Case for action labels, update this to:
"uploadFromDevice": "Upload From Device",
- If you’re standardizing on sentence case, plan a bulk pass to convert all current Title-Case labels (e.g., “Add Prompt” → “Add prompt”).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "uploadFromDevice": "Upload from device", | |
| "uploadFromDevice": "Upload From Device", |
🤖 Prompt for AI Agents
In src/renderer/src/i18n/en-US/promptSetting.json at line 40, the label "Upload
from device" uses sentence case while most other action labels use Title Case.
To fix this inconsistency, update the value to "Upload From Device" to match the
Title Case convention used elsewhere in the file.
| "previousVariant": "Previous Variant", | ||
| "nextVariant": "Next Variant", | ||
| "copy": "Copy as Markdown", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Terminology looks good; minor microcopy tweak and cross-locale verification suggested
- “Variant” renaming and shorter copy labels are clear.
- Suggest polishing the hint for clarity: “long press” (noun) and “the top”.
Apply this diff for Line 18:
- "copyImageWithLongPress": "Copy as Image (long-press to capture from top)",
+ "copyImageWithLongPress": "Copy as Image (long press to capture from the top)",Optional: “Save/Cancel/Edit/Delete” are repeated across modules; consider centralizing in common.json (e.g., common.button.save) to reduce duplication.
Run a quick consistency check to ensure these keys are present and aligned across locales, and that permission placeholders are correct:
Also applies to: 18-18, 22-22, 28-28
🏁 Script executed:
#!/bin/bash
set -euo pipefail
root="src/renderer/src/i18n"
python - << 'PY'
import json, os, glob, sys
from collections import defaultdict
basefiles = ["thread.json","components.json","settings.json"]
def flatten(d, prefix=""):
out = {}
if isinstance(d, dict):
for k, v in d.items():
for kk, vv in flatten(v, f"{prefix}.{k}" if prefix else k).items():
out[kk] = vv
else:
out[prefix] = d
return out
groups = defaultdict(list)
for bf in basefiles:
for fp in glob.glob(os.path.join("src/renderer/src/i18n","**",bf), recursive=True):
groups[bf].append(fp)
def locale_of(path):
parts = os.path.normpath(path).split(os.sep)
# .../i18n/<locale>/<bf>
for i, p in enumerate(parts):
if p == "i18n" and i+1 < len(parts):
return parts[i+1]
return "unknown"
had_issue = False
for bf, files in groups.items():
if not files:
continue
print(f"\n== Checking key parity for {bf} ==")
per_locale = {}
all_keys = set()
for fp in files:
with open(fp, "r", encoding="utf-8") as f:
data = json.load(f)
loc = locale_of(fp)
flat = flatten(data)
string_keys = {k for k, v in flat.items() if isinstance(v, str)}
per_locale[loc] = string_keys
all_keys |= string_keys
for loc, keys in sorted(per_locale.items()):
missing = sorted(all_keys - keys)
if missing:
had_issue = True
print(f"[MISSING] {loc} in {bf}: {len(missing)} keys missing")
for k in missing:
print(f" - {k}")
# Extra: validate placeholders in components.json for permission descriptions
print("\n== Validating placeholders for permission descriptions in components.json ==")
for fp in groups.get("components.json", []):
with open(fp, "r", encoding="utf-8") as f:
data = json.load(f)
loc = locale_of(fp)
msg = data.get("messageBlockPermissionRequest", {})
desc = (msg.get("description") or {})
for key in ["read","write","all"]:
val = desc.get(key, "")
if not isinstance(val, str):
continue
has_tool = "{toolName}" in val
has_server = "{serverName}" in val
if not (has_tool and has_server):
had_issue = True
print(f"[PLACEHOLDER] {loc} {fp} description.{key} missing placeholders: "
f"tool={has_tool} server={has_server}")
if had_issue:
sys.exit(1)
else:
print("\nAll checks passed.")
PYLength of output: 731
Cross-locale i18n discrepancies detected
The consistency check reveals missing translations and placeholders:
- Missing key
common.contentProtectioninsrc/renderer/src/i18n/en-US/settings.json; add it to match other locales. - In
src/renderer/src/i18n/ko-KR/components.jsonundermessageBlockPermissionRequest.description, theread,write, andallentries lack both{toolName}and{serverName}placeholders—align these with other locales.
Apply the microcopy tweak in thread.json:
--- a/src/renderer/src/i18n/en-US/thread.json
+++ b/src/renderer/src/i18n/en-US/thread.json
@@ -14,7 +14,7 @@
"copy": "Copy as Markdown",
- "copyImageWithLongPress": "Copy as Image (long-press to capture from top)",
+ "copyImageWithLongPress": "Copy as Image (long press to capture from the top)",• Propagate this same adjustment to all other locale variants of thread.json.
• Optional: centralize common button labels (Save/Cancel/Edit/Delete) in src/renderer/src/i18n/common.json (e.g., common.button.save) to reduce duplication.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "previousVariant": "Previous Variant", | |
| "nextVariant": "Next Variant", | |
| "copy": "Copy as Markdown", | |
| "previousVariant": "Previous Variant", | |
| "nextVariant": "Next Variant", | |
| "copy": "Copy as Markdown", | |
| "copyImageWithLongPress": "Copy as Image (long press to capture from the top)", |
🤖 Prompt for AI Agents
In src/renderer/src/i18n/en-US/thread.json around lines 14 to 16, update the
"copy" key's value as per the suggested microcopy tweak and then propagate this
exact change to all other locale variants of thread.json to maintain
consistency. Additionally, add the missing key "common.contentProtection" to
src/renderer/src/i18n/en-US/settings.json to align with other locales. For
src/renderer/src/i18n/ko-KR/components.json, update the
messageBlockPermissionRequest.description entries for "read", "write", and "all"
to include the {toolName} and {serverName} placeholders matching other locales.
Optionally, consider centralizing common button labels like Save, Cancel, Edit,
and Delete into src/renderer/src/i18n/common.json to reduce duplication across
locale files.
| "fileSelect": "انتخاب فایل", | ||
| "pasteFiles": "چسباندن فایلها از بریدهدان", | ||
| "dropFiles": "پروندهها را اینجا رها کنید", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Terminology inconsistency: “فایل” vs “پرونده” within the same file
Elsewhere in this locale file, “پرونده” is used (e.g., lines 4–5, 9–13). For consistency in fa-IR, prefer one term. Suggest reverting to “پرونده” here or updating all occurrences accordingly.
- "fileSelect": "انتخاب فایل",
- "pasteFiles": "چسباندن فایلها از بریدهدان",
+ "fileSelect": "انتخاب پرونده",
+ "pasteFiles": "چسباندن پروندهها از بریدهدان",To locate remaining mixed usages and standardize:
🏁 Script executed:
#!/bin/bash
rg -n "فایل|پرونده" src/renderer/src/i18n/fa-IR | sed 's/^/fa-IR: /'Length of output: 3700
Replace “فایل” with “پرونده” for consistency in fa-IR translations
Only chat.json is using “فایل” in two keys—everywhere else in this locale file (and across other fa-IR JSONs) uses “پرونده”. Update these two entries:
• File: src/renderer/src/i18n/fa-IR/chat.json
– Lines 7–8: replace “فایل” → “پرونده”
- "fileSelect": "انتخاب فایل",
- "pasteFiles": "چسباندن فایلها از بریدهدان",
+ "fileSelect": "انتخاب پرونده",
+ "pasteFiles": "چسباندن پروندهها از بریدهدان",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "fileSelect": "انتخاب فایل", | |
| "pasteFiles": "چسباندن فایلها از بریدهدان", | |
| "dropFiles": "پروندهها را اینجا رها کنید", | |
| "fileSelect": "انتخاب پرونده", | |
| "pasteFiles": "چسباندن پروندهها از بریدهدان", | |
| "dropFiles": "پروندهها را اینجا رها کنید", |
🤖 Prompt for AI Agents
In src/renderer/src/i18n/fa-IR/chat.json at lines 7 to 8, replace the word
"فایل" with "پرونده" in the values of the keys "fileSelect" and "pasteFiles" to
maintain consistency with other fa-IR translations that use "پرونده" instead of
"فایل".
| "title": "این گفتوگو پاک شود؟", | ||
| "description": "این کار برگشتناپذیر است.", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Persian phrasing: consider a shorter, more natural title
Shorter aligns with the PR’s goal and common UI phrasing.
- "title": "این گفتوگو پاک شود؟",
+ "title": "حذف گفتوگو؟",If “حذف” vs “پاک کردن” is mixed across fa-IR, we should standardize destructive actions. To audit usage:
🏁 Script executed:
#!/bin/bash
# Scan Persian i18n for 'حذف' vs 'پاک ' usage to standardize destructive action wording.
rg -n $'حذف|پاک کردن|پاکسازی' src/renderer/src/i18n/fa-IRLength of output: 4121
Use “پاک کردن گفتوگو؟” for consistency
Our scan shows that all other fa-IR keys for deleting a conversation use “پاک کردن گفتوگو” (e.g. in common.json and settings.json). Let’s match that and keep titles concise.
--- a/src/renderer/src/i18n/fa-IR/dialog.json
+++ b/src/renderer/src/i18n/fa-IR/dialog.json
@@ -7,2 +7,2 @@
- "title": "این گفتوگو پاک شود؟",
- "description": "این کار برگشتناپذیر است.",
+ "title": "پاک کردن گفتوگو؟",
+ "description": "این کار برگشتناپذیر است.",- Standardized on “پاک کردن” for destructive actions (see
deleteConversationin common.json/settings.json). - ZWNJ usage in “گفتوگو” is already correct.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "title": "این گفتوگو پاک شود؟", | |
| "description": "این کار برگشتناپذیر است.", | |
| "title": "پاک کردن گفتوگو؟", | |
| "description": "این کار برگشتناپذیر است.", |
🤖 Prompt for AI Agents
In src/renderer/src/i18n/fa-IR/dialog.json at lines 7 to 8, the title key uses
"این گفتوگو پاک شود؟" which is inconsistent with other fa-IR keys that use "پاک
کردن گفتوگو؟" for delete actions. Replace the title value with "پاک کردن
گفتوگو؟" to maintain consistency and conciseness across the localization files.
| "settings-display": "Настройки отображения", | ||
| "settings-knowledge-base": "База знаний", | ||
| "settings-prompt": "Управление Prompt" | ||
| "settings-prompt": "Управление промптами" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Verify terminology consistency across RU locale (“промпт” vs “подсказка”)
Ensure we use one term consistently across ru-RU files.
Run to inspect usage:
🏁 Script executed:
#!/bin/bash
# Count occurrences across RU i18n files
rg -n "промпт" src/renderer/src/i18n/ru-RU
rg -n "подсказк" src/renderer/src/i18n/ru-RULength of output: 3302
Unify terminology in ru-RU translations
We currently mix “промпт” and “подсказка” in the RU locale. To keep terminology consistent, standardize on “промпт”.
• File: src/renderer/src/i18n/ru-RU/mcp.json (line 189)
- "desc": "Автоматически выбирает наиболее подходящий пользовательский шаблон подсказки на основе ввода пользователя и интеллектуально заполняет шаблон подсказки."
+ "desc": "Автоматически выбирает наиболее подходящий пользовательский шаблон промпта на основе ввода пользователя и интеллектуально заполняет шаблон промпта."Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In src/renderer/src/i18n/ru-RU/routes.json at line 13, the term "подсказка" is
used inconsistently with the preferred term "промпт" used elsewhere like in
src/renderer/src/i18n/ru-RU/mcp.json line 189. Update the translation value to
use "промпт" consistently by replacing any occurrence of "подсказка" with
"промпт" in this file.
| "autoUpdate": "Автоматическое обновление", | ||
| "downloading": "Загрузка", | ||
| "installNow": "Установить сейчас", | ||
| "installNow": "Установить", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Verify cross-locale semantic consistency for “installNow”
RU shortens to “Установить” while key implies “Install now”. Ensure other locales aren’t using a longer/“now”-emphasized phrasing that could diverge UX tone.
Run to compare values across locales:
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Checking installNow and githubDownload across locales..."
for f in $(fd -a 'update.json' src/renderer/src/i18n); do
echo "== $f =="
jq -r '
[
{key:"installNow", val:(.installNow // "<missing>")},
{key:"githubDownload", val:(.githubDownload // "<missing>")}
] | .[] | "\(.key)=\(.val)"
' "$f"
doneLength of output: 4531
Consistent urgency in Russian “installNow” translation
The Russian locale currently drops the “now” emphasis present in all other languages. To maintain cross-locale semantic consistency, update the imperative to include “сейчас.”
• File: src/renderer/src/i18n/ru-RU/update.json (around line 12)
Suggested change:
- "installNow": "Установить",
+ "installNow": "Установить сейчас",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "installNow": "Установить", | |
| "installNow": "Установить сейчас", |
🤖 Prompt for AI Agents
In src/renderer/src/i18n/ru-RU/update.json around line 12, the translation for
"installNow" lacks the urgency conveyed by "now" in other languages. Update the
value from "Установить" to "Установить сейчас" to maintain consistent emphasis
across locales.
* fix: add AlertDialogDescription to resolve accessibility warning (#706) * fix: resolve focus flicker when creating new windows with Ctrl+Shift+N (#707) * feat: enhance window management by implementing main window ID handling (#709) * docs: update zhipu developer doc website link (#715) Co-authored-by: gongchao <chao.gong@aminer.cn> * refactor: better translate (#716) * chore: en-us i18n * chore(i18n): polish ja-JP translations across UI; keep chat.input.placeholder unchanged * chore(i18n): polish fr-FR translations; keep chat.input.placeholder unchanged * chore(i18n): refine fr-FR MCP & Settings copy; idiomatic, concise, brand-consistent * chore(i18n): polish ru-RU translations across UI; keep chat.input.placeholder unchanged * chore(i18n): polish fa-IR translations across UI; keep chat.input.placeholder unchanged * chore: fix format * chore: fix i18n * chore: lock rolldown-vite version * feat: add GPT-5 series model support (#717) * ci(vite): Bundle the main file into a single file to speed up loading. (#718) * fix(math): parser by upgrade vue-renderer-markdown (#722) * chore: bump deps (#721) * chore: bump deps * fix: rolldown-vite 7.1.0 and duckdb bundle issue * chore: back to vite * chore: update electron * chore: update versions * fix(math): parser by upgrade vue-renderer-markdown (#722) * chore: bump deps --------- Co-authored-by: Simon He <57086651+Simon-He95@users.noreply.github.com> * fix: add scrollable support to PopoverContent to prevent overflow (#720) * feat: implement floating chat window system with performance optimization (#724) * feat: add mcp sync and modelscope provider #615 (#723) * wip: add modelscope provider * feat: add mcp sync to modelscope * fix: add scrollable support to PopoverContent to prevent overflow (#720) * feat: implement floating chat window system with performance optimization (#724) * chore: i18n and format * feat: better style * fix: mcp tool display --------- Co-authored-by: yyhhyyyyyy <yyhhyyyyyy8@gmail.com> * fix: move_files newPath parse issue (#725) * fix: move_files newPath 参数计算规则 * fix: move_files 移动前需要判断dest是目录还是文件 * feat: add Claude Opus 4.1 to anthropic default model list (#726) * feat: Add mcprouter's MCP marketplace api support (#727) * wip: add mcp market * feat: mcp market install * wip: mcp install status sync * feat: mcp server config mask * chore: remove working doc * chore: add translate * feat: add ESC key to close floating chat window (#728) * feat: add floating button position persistence with boundary validation (#729) * feat: add floating button position persistence with boundary validation * feat: refactor floating button to use electron-window-state * chore: bump to 0.3.0 * feat: add reasoning_effort parameter support for gpt-oss models (#731) * feat: add reasoning_effort parameter support for gpt-oss models - add reasoning effort UI support across all components * fix: preserve user reasoning effort settings and improve display logic * fix: artifacts code not streaming (#732) * fix: artifact react load failed * chore: remove log * fix: artifacts code not stream * fix: format --------- Co-authored-by: yyhhyyyyyy <yyhhyyyyyy8@gmail.com> Co-authored-by: hllshiro <40970081+hllshiro@users.noreply.github.com> Co-authored-by: tomsun28 <tomsun28@outlook.com> Co-authored-by: gongchao <chao.gong@aminer.cn> Co-authored-by: Simon He <57086651+Simon-He95@users.noreply.github.com> Co-authored-by: wanna <wanna.w@binarywalk.com>
* fix: add AlertDialogDescription to resolve accessibility warning (#706) * fix: resolve focus flicker when creating new windows with Ctrl+Shift+N (#707) * feat: enhance window management by implementing main window ID handling (#709) * docs: update zhipu developer doc website link (#715) Co-authored-by: gongchao <chao.gong@aminer.cn> * refactor: better translate (#716) * chore: en-us i18n * chore(i18n): polish ja-JP translations across UI; keep chat.input.placeholder unchanged * chore(i18n): polish fr-FR translations; keep chat.input.placeholder unchanged * chore(i18n): refine fr-FR MCP & Settings copy; idiomatic, concise, brand-consistent * chore(i18n): polish ru-RU translations across UI; keep chat.input.placeholder unchanged * chore(i18n): polish fa-IR translations across UI; keep chat.input.placeholder unchanged * chore: fix format * chore: fix i18n * chore: lock rolldown-vite version * feat: add GPT-5 series model support (#717) * ci(vite): Bundle the main file into a single file to speed up loading. (#718) * fix(math): parser by upgrade vue-renderer-markdown (#722) * chore: bump deps (#721) * chore: bump deps * fix: rolldown-vite 7.1.0 and duckdb bundle issue * chore: back to vite * chore: update electron * chore: update versions * fix(math): parser by upgrade vue-renderer-markdown (#722) * chore: bump deps --------- Co-authored-by: Simon He <57086651+Simon-He95@users.noreply.github.com> * fix: add scrollable support to PopoverContent to prevent overflow (#720) * feat: implement floating chat window system with performance optimization (#724) * feat: add mcp sync and modelscope provider #615 (#723) * wip: add modelscope provider * feat: add mcp sync to modelscope * fix: add scrollable support to PopoverContent to prevent overflow (#720) * feat: implement floating chat window system with performance optimization (#724) * chore: i18n and format * feat: better style * fix: mcp tool display --------- Co-authored-by: yyhhyyyyyy <yyhhyyyyyy8@gmail.com> * fix: move_files newPath parse issue (#725) * fix: move_files newPath 参数计算规则 * fix: move_files 移动前需要判断dest是目录还是文件 * feat: add Claude Opus 4.1 to anthropic default model list (#726) * feat: Add mcprouter's MCP marketplace api support (#727) * wip: add mcp market * feat: mcp market install * wip: mcp install status sync * feat: mcp server config mask * chore: remove working doc * chore: add translate * feat: add ESC key to close floating chat window (#728) * feat: add floating button position persistence with boundary validation (#729) * feat: add floating button position persistence with boundary validation * feat: refactor floating button to use electron-window-state * chore: bump to 0.3.0 * feat: add reasoning_effort parameter support for gpt-oss models (#731) * feat: add reasoning_effort parameter support for gpt-oss models - add reasoning effort UI support across all components * fix: preserve user reasoning effort settings and improve display logic * fix: artifacts code not streaming (#732) * fix: artifact react load failed * chore: remove log * fix: artifacts code not stream * fix: format * feat: disable automatic model enabling for better UX (#734) * feat: sync provider sorting from settings to model selection (#736) * feat: sync provider sorting from settings to model selection * feat: refactor ModelSelect to use computed providers for better reactivity --------- Co-authored-by: yyhhyyyyyy <yyhhyyyyyy8@gmail.com> Co-authored-by: hllshiro <40970081+hllshiro@users.noreply.github.com> Co-authored-by: tomsun28 <tomsun28@outlook.com> Co-authored-by: gongchao <chao.gong@aminer.cn> Co-authored-by: Simon He <57086651+Simon-He95@users.noreply.github.com> Co-authored-by: wanna <wanna.w@binarywalk.com>
使用GPT5 优化了各个语言的翻译,缩兼容了ui中较短的部分
Summary by CodeRabbit