Skip to content

Conversation

@zerob13
Copy link
Collaborator

@zerob13 zerob13 commented Aug 8, 2025

使用GPT5 优化了各个语言的翻译,缩兼容了ui中较短的部分

Summary by CodeRabbit

  • Style
    • Refined and clarified user interface text across English, French, Japanese, Persian, and Russian localizations for improved readability and consistency.
    • Updated terminology, button labels, dialog prompts, and success/error messages for actions like copy, paste, file selection, and permission requests.
    • Enhanced pluralization, capitalization, and phrasing for better user experience in multiple languages.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 8, 2025

Walkthrough

This 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

Cohort / File(s) Change Summary
English Localization Refinements
src/renderer/src/i18n/en-US/*.json
Refined English UI text in chat, components, contextMenu, dialog, MCP, promptSetting, settings, thread, and update JSON files: reworded labels, improved clarity, standardized terminology, and corrected capitalization. No logic or key changes.
Persian Localization Updates
src/renderer/src/i18n/fa-IR/*.json
Updated Persian translations for chat, artifacts, common, components, contextMenu, dialog, routes, thread, toolCall, and update: improved phrasing, consistency, and clarity across UI elements. Only string values changed.
French Localization Improvements
src/renderer/src/i18n/fr-FR/*.json
Enhanced French translations in about, artifacts, chat, common, components, contextMenu, dialog, MCP, routes, settings, thread, toolCall, and update: made text more concise, corrected terminology, and improved readability. No structural changes.
Japanese Localization Refinements
src/renderer/src/i18n/ja-JP/*.json
Revised Japanese UI text in about, artifacts, chat, common, components, contextMenu, dialog, MCP, routes, settings, thread, toolCall, and update: simplified expressions, standardized terminology, and improved tone. No logic or key changes.
Russian Localization Enhancements
src/renderer/src/i18n/ru-RU/*.json
Updated Russian translations in about, artifacts, chat, common, components, contextMenu, dialog, routes, thread, toolCall, and update: improved clarity, standardized access/permission terminology, and refined UI strings. Only string values modified.
Dependency Version Specification
package.json
Updated the "vite" package version specification in devDependencies and pnpm.overrides from alias "npm:rolldown-vite@latest" to explicit version "npm:rolldown-vite@7.0.12". No other changes to dependencies or configurations.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

  • ThinkInAIXYZ/deepchat#594: Implements the permission check and UI flow for MCP tool calls, which these localization updates directly support.
  • ThinkInAIXYZ/deepchat#554: Refines MCP-related localization strings, closely related to this PR's textual updates for MCP terminology.
  • ThinkInAIXYZ/deepchat#573: Another batch of localization string updates across multiple languages, similar in scope and nature to this PR.

Poem

🐇
In every tongue, the words now gleam,
Refined and polished—what a team!
From “GitHub” fixed to “Select File” clear,
Each phrase now brings the user cheer.
Across the world, the UI sings—
Hooray for well-translated things!

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 details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7ae9e53 and 10dd25b.

📒 Files selected for processing (1)
  • package.json (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • package.json
⏰ 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)
  • GitHub Check: build-check (x64)
✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/better-translate

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 nested common.contentProtection object, but the English file uses flat keys under common (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.contentProtection object to mirror FR.

Key discrepancy detected:
• FR-only: common.contentProtection

Please 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 file

Most 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 consistency

Great 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 success

If 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 descriptions

Currently:

  • 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 Japanese

If 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 consistency

You 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 message

Consider adding “сообщения” for precision.

-    "description": "Скопировать сообщения с начала до текущего в новый разговор.",
+    "description": "Скопировать сообщения с начала до текущего сообщения в новый разговор.",
src/renderer/src/i18n/fa-IR/dialog.json (2)

16-19: Unify “clean” terminology; prefer “پاک‌سازی” for nounal titles

Aligns with standard Persian UI wording and differentiates from “حذف”.

-    "title": "پاک کردن پیام‌ها",
+    "title": "پاک‌سازی پیام‌ها",
@@
-    "confirm": "پاک کردن"
+    "confirm": "پاک‌سازی"

21-24: “ایجاد شاخه” reads more formal/natural for creation actions

Minor 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 style

Shorter 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 placeholders

Japanese 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 consistency

Current 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 warning

CI 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 neutral

Current 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 naturalness

Minor 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” description

More 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 warning

CI 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 description

Suggested 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 description

Use “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.",

Comment on lines +26 to 34
"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?"
}
Copy link
Contributor

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
done

Length 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
done

Length 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.

Suggested change
"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",
Copy link
Contributor

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]+)"' -o

Length 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.

Suggested change
"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.

Comment on lines +14 to +16
"previousVariant": "Previous Variant",
"nextVariant": "Next Variant",
"copy": "Copy as Markdown",
Copy link
Contributor

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.")
PY

Length of output: 731


Cross-locale i18n discrepancies detected

The consistency check reveals missing translations and placeholders:

  • Missing key common.contentProtection in src/renderer/src/i18n/en-US/settings.json; add it to match other locales.
  • In src/renderer/src/i18n/ko-KR/components.json under messageBlockPermissionRequest.description, the read, write, and all entries 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.

Suggested change
"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.

Comment on lines +7 to 9
"fileSelect": "انتخاب فایل",
"pasteFiles": "چسباندن فایل‌ها از بریده‌دان",
"dropFiles": "پرونده‌ها را اینجا رها کنید",
Copy link
Contributor

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.

Suggested change
"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
"فایل".

Comment on lines +7 to +8
"title": "این گفت‌وگو پاک شود؟",
"description": "این کار برگشت‌ناپذیر است.",
Copy link
Contributor

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-IR

Length 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 deleteConversation in 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.

Suggested change
"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": "Управление промптами"
Copy link
Contributor

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-RU

Length 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": "Установить",
Copy link
Contributor

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"
done

Length 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.

Suggested change
"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.

@zerob13 zerob13 merged commit 1909d8b into dev Aug 8, 2025
2 checks passed
zerob13 added a commit that referenced this pull request Aug 13, 2025
* 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>
zerob13 added a commit that referenced this pull request Aug 13, 2025
* 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>
@zerob13 zerob13 deleted the refactor/better-translate branch September 21, 2025 15:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants