diff --git a/.github/labeler.yml b/.github/labeler.yml index a448dc25c9b..b926f4827f9 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -70,11 +70,6 @@ - "extensions/workboard/**" - "docs/plugins/workboard.md" - "docs/plugins/reference/workboard.md" -"plugin: workspaces": - - changed-files: - - any-glob-to-any-file: - - "extensions/workspaces/**" - - "docs/web/workspaces.md" "plugin: migrate-hermes": - changed-files: - any-glob-to-any-file: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b96b75211b..e1b47e00463 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -150,8 +150,14 @@ jobs: CHECKOUT_EVENT_REF: ${{ github.ref }} CHECKOUT_FALLBACK_REF: ${{ github.sha }} GITHUB_EVENT_NAME: ${{ github.event_name }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" git init "$GITHUB_WORKSPACE" git -C "$GITHUB_WORKSPACE" config gc.auto 0 git -C "$GITHUB_WORKSPACE" remote add origin "https://github.com/${CHECKOUT_REPO}.git" @@ -161,6 +167,7 @@ jobs: for attempt in 1 2 3; do timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ "+${ref}:refs/remotes/origin/checkout" && return 0 fetch_status="$?" @@ -184,6 +191,7 @@ jobs: for attempt in 1 2 3; do timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=2 \ --filter=blob:none origin "$sha" && return 0 if [ "$attempt" = "3" ]; then @@ -807,8 +815,14 @@ jobs: CHECKOUT_REF: ${{ inputs.target_ref || github.sha }} CHECKOUT_FALLBACK_REF: ${{ github.sha }} GITHUB_EVENT_NAME: ${{ github.event_name }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" git init "$GITHUB_WORKSPACE" git -C "$GITHUB_WORKSPACE" config gc.auto 0 git -C "$GITHUB_WORKSPACE" remote add origin "https://github.com/${CHECKOUT_REPO}.git" @@ -818,6 +832,7 @@ jobs: for attempt in 1 2 3; do timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=2 origin \ "+${ref}:refs/remotes/origin/checkout" && return 0 fetch_status="$?" @@ -970,9 +985,16 @@ jobs: env: CHECKOUT_REPO: ${{ github.repository }} CHECKOUT_SHA: ${{ needs.preflight.outputs.checkout_revision }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" + workdir="$GITHUB_WORKSPACE" reset_checkout_dir() { mkdir -p "$workdir" @@ -990,6 +1012,7 @@ jobs: timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ "+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1 @@ -1137,6 +1160,7 @@ jobs: id: built_artifact_checks if: needs.preflight.outputs.run_checks == 'true' || needs.preflight.outputs.run_checks_node_core_dist == 'true' || needs.preflight.outputs.run_check_additional == 'true' env: + PARALLEL_GATEWAY_WATCH: ${{ runner.environment != 'github-hosted' && 'true' || 'false' }} RUN_CHANNELS: ${{ needs.preflight.outputs.run_checks }} RUN_CORE_SUPPORT_BOUNDARY: ${{ needs.preflight.outputs.run_checks_node_core_dist }} RUN_GATEWAY_WATCH: ${{ needs.preflight.outputs.run_check_additional }} @@ -1164,6 +1188,29 @@ jobs: pids+=("$!") } + wait_checks() { + local index name log pid result + for index in "${!pids[@]}"; do + name="${names[$index]}" + log="${logs[$index]}" + pid="${pids[$index]}" + + if wait "$pid"; then + result="success" + else + result="failure" + fi + + echo "::group::${name} log" + cat "$log" + echo "::endgroup::" + results["$name"]="$result" + done + names=() + pids=() + logs=() + } + if [ "$RUN_CHANNELS" = "true" ]; then start_check "channels" env \ NODE_OPTIONS=--max-old-space-size=8192 \ @@ -1178,36 +1225,19 @@ jobs: node scripts/run-vitest.mjs run --config test/vitest/vitest.full-core-support-boundary.config.ts fi - for index in "${!pids[@]}"; do - name="${names[$index]}" - log="${logs[$index]}" - pid="${pids[$index]}" - - if wait "$pid"; then - result="success" - else - result="failure" - fi - - echo "::group::${name} log" - cat "$log" - echo "::endgroup::" - results["$name"]="$result" - done + if [ "$RUN_GATEWAY_WATCH" = "true" ] && [ "$PARALLEL_GATEWAY_WATCH" = "true" ]; then + start_check "gateway-watch" \ + node scripts/check-gateway-watch-regression.mjs --skip-build + fi - if [ "$RUN_GATEWAY_WATCH" = "true" ]; then - log="${RUNNER_TEMP}/gateway-watch.log" - echo "starting gateway-watch: node scripts/check-gateway-watch-regression.mjs --skip-build" - if node scripts/check-gateway-watch-regression.mjs --skip-build >"$log" 2>&1; then - result="success" - else - result="failure" - fi + wait_checks - echo "::group::gateway-watch log" - cat "$log" - echo "::endgroup::" - results["gateway-watch"]="$result" + # Preserve the low-core hosted path; concurrent Vitest can otherwise + # starve the Gateway readiness deadline used by this regression gate. + if [ "$RUN_GATEWAY_WATCH" = "true" ] && [ "$PARALLEL_GATEWAY_WATCH" != "true" ]; then + start_check "gateway-watch" \ + node scripts/check-gateway-watch-regression.mjs --skip-build + wait_checks fi for name in channels core-support-boundary gateway-watch; do @@ -2564,8 +2594,14 @@ jobs: env: CHECKOUT_REPO: ${{ github.repository }} CHECKOUT_SHA: ${{ needs.preflight.outputs.checkout_revision }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" git init "$GITHUB_WORKSPACE" git -C "$GITHUB_WORKSPACE" config gc.auto 0 git -C "$GITHUB_WORKSPACE" remote add origin "https://github.com/${CHECKOUT_REPO}.git" @@ -2574,6 +2610,7 @@ jobs: for attempt in 1 2 3; do timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ "+${CHECKOUT_SHA}:refs/remotes/origin/checkout" && return 0 fetch_status="$?" @@ -2632,8 +2669,14 @@ jobs: env: CHECKOUT_REPO: ${{ github.repository }} CHECKOUT_SHA: ${{ needs.preflight.outputs.checkout_revision }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" git init "$GITHUB_WORKSPACE" git -C "$GITHUB_WORKSPACE" config gc.auto 0 git -C "$GITHUB_WORKSPACE" remote add origin "https://github.com/${CHECKOUT_REPO}.git" @@ -2641,6 +2684,7 @@ jobs: fetch_checkout_ref_once() { git -C "$GITHUB_WORKSPACE" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ "+${CHECKOUT_SHA}:refs/remotes/origin/checkout" & local fetch_pid="$!" @@ -3110,9 +3154,16 @@ jobs: env: CHECKOUT_REPO: ${{ github.repository }} CHECKOUT_SHA: ${{ needs.preflight.outputs.checkout_revision }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" + workdir="$GITHUB_WORKSPACE" reset_checkout_dir() { mkdir -p "$workdir" @@ -3130,6 +3181,7 @@ jobs: timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ "+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1 diff --git a/.github/workflows/platformclaw-ci.yml b/.github/workflows/platformclaw-ci.yml index d83f6bdffd4..0be7401b967 100644 --- a/.github/workflows/platformclaw-ci.yml +++ b/.github/workflows/platformclaw-ci.yml @@ -22,7 +22,7 @@ jobs: name: PlatformClaw CI if: github.event_name != 'pull_request' || !github.event.pull_request.draft runs-on: ubuntu-24.04 - timeout-minutes: 45 + timeout-minutes: 90 steps: - name: Checkout uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 @@ -35,11 +35,14 @@ jobs: with: install-bun: "false" - - name: Run changed-surface checks - run: pnpm check:changed + - name: Typecheck PlatformClaw control plane + run: node scripts/run-tsgo.mjs -p packages/platformclaw-control-plane/tsconfig.json --noEmit - name: Test PlatformClaw control plane run: node scripts/run-vitest.mjs packages/platformclaw-control-plane/src - name: Build PlatformClaw control plane run: pnpm --dir packages/platformclaw-control-plane build + + - name: Run changed-surface checks + run: pnpm check:changed diff --git a/.github/workflows/workflow-sanity.yml b/.github/workflows/workflow-sanity.yml index affef8ad795..61a43d29064 100644 --- a/.github/workflows/workflow-sanity.yml +++ b/.github/workflows/workflow-sanity.yml @@ -30,8 +30,14 @@ jobs: env: CHECKOUT_REPO: ${{ github.repository }} CHECKOUT_SHA: ${{ github.sha }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" git init "$GITHUB_WORKSPACE" git -C "$GITHUB_WORKSPACE" config gc.auto 0 git -C "$GITHUB_WORKSPACE" remote add origin "https://github.com/${CHECKOUT_REPO}.git" @@ -40,6 +46,7 @@ jobs: for attempt in 1 2 3; do timeout --signal=TERM --kill-after=10s 30s git -C "$GITHUB_WORKSPACE" \ -c protocol.version=2 \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ "+${CHECKOUT_SHA}:refs/remotes/origin/checkout" && return 0 fetch_status="$?" @@ -96,8 +103,14 @@ jobs: env: BASE_REF: ${{ github.event.pull_request.base.ref }} BASE_SHA: ${{ github.event.pull_request.base.sha }} + CHECKOUT_TOKEN: ${{ github.token }} run: | set -euo pipefail + if [[ -z "$CHECKOUT_TOKEN" ]]; then + echo "checkout token is missing" >&2 + exit 1 + fi + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" trusted_config="$RUNNER_TEMP/pre-commit-base.yaml" trusted_zizmor_config="$RUNNER_TEMP/zizmor-base.yml" @@ -106,7 +119,9 @@ jobs: local target="$2" local fetch_status for attempt in 1 2 3; do - timeout --signal=TERM --kill-after=10s 30s git fetch --no-tags --depth=1 origin \ + timeout --signal=TERM --kill-after=10s 30s git \ + -c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \ + fetch --no-tags --depth=1 origin \ "+${ref}:${target}" && return 0 fetch_status="$?" if [ "$fetch_status" != "124" ] && [ "$fetch_status" != "137" ]; then diff --git a/CHANGELOG.md b/CHANGELOG.md index 75763220837..14ce3db2188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- **Bounded input and provider responses:** cap pasted auth/config input and enforce wall-clock deadlines across generated-media downloads, polling JSON, and failed response details so oversized or slow-drip streams cannot exceed resource budgets (thanks @Pick-cat). - **Cloud worker derived workspace caches:** exclude Python caches, dependency trees, and macOS metadata symmetrically from outbound sync and inbound reconciliation so local cache rewrites cannot fence later cloud results or worker reclaim. - **Codex model status diagnostics:** report a configured Codex route as unavailable when its harness plugin is disabled, missing, or quarantined, while preserving the separate credential result and making `models status --check` fail instead of silently treating fallback execution as healthy. Thanks @shakkernerd. - **Gateway control-plane rate limiting:** use per-method buckets with a 30-per-minute budget so interactive admin writes remain responsive while retaining runaway-loop protection. diff --git a/apps/.i18n/apple-translation-contradictions.json b/apps/.i18n/apple-translation-contradictions.json index 1cd929526d4..c2ed401a116 100644 --- a/apps/.i18n/apple-translation-contradictions.json +++ b/apps/.i18n/apple-translation-contradictions.json @@ -744,6 +744,62 @@ "Arkivera" ] }, + { + "locale": "ar", + "source": "Archived", + "translations": [ + "مؤرشف", + "مؤرشفة" + ] + }, + { + "locale": "es", + "source": "Archived", + "translations": [ + "Archivada", + "Archivadas" + ] + }, + { + "locale": "fr", + "source": "Archived", + "translations": [ + "Archivé", + "Archivée" + ] + }, + { + "locale": "it", + "source": "Archived", + "translations": [ + "Archiviata", + "Archiviato" + ] + }, + { + "locale": "pl", + "source": "Archived", + "translations": [ + "Zarchiwizowana", + "Zarchiwizowane" + ] + }, + { + "locale": "th", + "source": "Archived", + "translations": [ + "เก็บถาวรแล้ว", + "เก็บเข้าคลังแล้ว" + ] + }, + { + "locale": "tr", + "source": "Archived", + "translations": [ + "Arşivlendi", + "Arşivlenmiş" + ] + }, { "locale": "fr", "source": "Asking OpenClaw", @@ -1955,6 +2011,38 @@ "हटाएँ" ] }, + { + "locale": "nl", + "source": "Delete", + "translations": [ + "Verwijder", + "Verwijderen" + ] + }, + { + "locale": "sv", + "source": "Delete", + "translations": [ + "Radera", + "Ta bort" + ] + }, + { + "locale": "sv", + "source": "Delete Group", + "translations": [ + "Radera grupp", + "Ta bort grupp" + ] + }, + { + "locale": "zh-CN", + "source": "Delete Group", + "translations": [ + "删除分组", + "删除群组" + ] + }, { "locale": "fa", "source": "Delete Session", @@ -1979,6 +2067,22 @@ "Удалить сессию" ] }, + { + "locale": "fr", + "source": "Delete “%@”?", + "translations": [ + "Supprimer « %@ » ?", + "Supprimer « %@ » ?" + ] + }, + { + "locale": "sv", + "source": "Delete “%@”?", + "translations": [ + "Radera ”%@”?", + "Ta bort ”%@”?" + ] + }, { "locale": "it", "source": "Deny", @@ -2427,6 +2531,14 @@ "Listo" ] }, + { + "locale": "hi", + "source": "Done", + "translations": [ + "पूर्ण", + "हो गया" + ] + }, { "locale": "it", "source": "Done", @@ -3511,12 +3623,53 @@ "Gateway設定" ] }, + { + "locale": "ar", + "source": "Get Info…", + "translations": [ + "إحضار المعلومات…", + "الحصول على معلومات…" + ] + }, + { + "locale": "hi", + "source": "Get Info…", + "translations": [ + "जानकारी पाएँ…", + "जानकारी प्राप्त करें…" + ] + }, + { + "locale": "pl", + "source": "Get Info…", + "translations": [ + "Informacje…", + "Pokaż informacje…" + ] + }, + { + "locale": "pt-BR", + "source": "Get Info…", + "translations": [ + "Obter Informações…", + "Obter informações…" + ] + }, + { + "locale": "uk", + "source": "Get Info…", + "translations": [ + "Отримати інформацію…", + "Переглянути інформацію…" + ] + }, { "locale": "zh-CN", "source": "Group name", "translations": [ "分组名称", - "组名称" + "组名称", + "群组名称" ] }, { @@ -4742,6 +4895,14 @@ "ขาดหาย: %@" ] }, + { + "locale": "ru", + "source": "Name", + "translations": [ + "Имя", + "Название" + ] + }, { "locale": "ar", "source": "Needs attention", @@ -6276,14 +6437,31 @@ "Vastzetten" ] }, + { + "locale": "ar", + "source": "Pinned", + "translations": [ + "مثبّت", + "مثبّتة" + ] + }, { "locale": "es", "source": "Pinned", "translations": [ + "Fijada", "Fijadas", "Fijado" ] }, + { + "locale": "fr", + "source": "Pinned", + "translations": [ + "Épinglé", + "Épinglée" + ] + }, { "locale": "it", "source": "Pinned", @@ -6293,6 +6471,14 @@ "In evidenza" ] }, + { + "locale": "pl", + "source": "Pinned", + "translations": [ + "Przypięta", + "Przypięte" + ] + }, { "locale": "pt-BR", "source": "Pinned", @@ -6381,6 +6567,30 @@ "Port" ] }, + { + "locale": "ko", + "source": "Provider", + "translations": [ + "제공업체", + "제공자" + ] + }, + { + "locale": "ru", + "source": "Provider", + "translations": [ + "Поставщик", + "Провайдер" + ] + }, + { + "locale": "zh-CN", + "source": "Provider", + "translations": [ + "提供商", + "提供方" + ] + }, { "locale": "ja-JP", "source": "QR Scanner Unavailable", @@ -6750,6 +6960,150 @@ "دامنهٔ راه دور" ] }, + { + "locale": "ar", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "أزل المرفقات أو انتظر حتى يكتمل التسليم قبل بدء محادثة جديدة.", + "أزِل المرفقات أو انتظر اكتمال التسليم قبل بدء محادثة جديدة." + ] + }, + { + "locale": "de", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Entferne Anhänge oder warte, bis die Zustellung abgeschlossen ist, bevor du einen neuen Chat startest.", + "Entfernen Sie Anhänge oder warten Sie auf die Zustellung, bevor Sie einen neuen Chat starten." + ] + }, + { + "locale": "es", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Elimina los adjuntos o espera a que se complete la entrega antes de iniciar un nuevo chat.", + "Elimina los archivos adjuntos o espera a que se complete la entrega antes de iniciar un nuevo chat." + ] + }, + { + "locale": "fa", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "پیش از شروع گفتگوی جدید، پیوست‌ها را حذف کنید یا منتظر تکمیل ارسال بمانید.", + "پیش از شروع گفت‌وگوی جدید، پیوست‌ها را حذف کنید یا منتظر بمانید تا ارسال آن‌ها تکمیل شود." + ] + }, + { + "locale": "fr", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Supprimez les pièces jointes ou attendez la fin de leur envoi avant de démarrer une nouvelle discussion.", + "Supprimez les pièces jointes ou attendez la livraison avant de démarrer une nouvelle conversation." + ] + }, + { + "locale": "hi", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "नई चैट शुरू करने से पहले अटैचमेंट हटाएँ या डिलीवरी पूरी होने की प्रतीक्षा करें।", + "नई चैट शुरू करने से पहले अटैचमेंट हटाएं या डिलीवरी पूरी होने की प्रतीक्षा करें।" + ] + }, + { + "locale": "id", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Hapus lampiran atau tunggu hingga pengiriman selesai sebelum memulai obrolan baru.", + "Hapus lampiran atau tunggu pengiriman selesai sebelum memulai obrolan baru." + ] + }, + { + "locale": "ja-JP", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "新しいチャットを開始する前に、添付ファイルを削除するか、配信が完了するまでお待ちください。", + "新しいチャットを開始する前に、添付ファイルを削除するか送信が完了するのを待ってください。" + ] + }, + { + "locale": "nl", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Verwijder bijlagen of wacht tot de bezorging is afgerond voordat je een nieuwe chat start.", + "Verwijder bijlagen of wacht tot de bezorging is voltooid voordat je een nieuwe chat start." + ] + }, + { + "locale": "pt-BR", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Remova os anexos ou aguarde a conclusão da entrega antes de iniciar uma nova conversa.", + "Remova os anexos ou aguarde a entrega ser concluída antes de iniciar uma nova conversa." + ] + }, + { + "locale": "ru", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Удалите вложения или дождитесь доставки, прежде чем начинать новый чат.", + "Удалите вложения или дождитесь завершения доставки, прежде чем начинать новый чат." + ] + }, + { + "locale": "sv", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Ta bort bilagor eller vänta på att leveransen slutförs innan du startar en ny chatt.", + "Ta bort bilagor eller vänta tills leveransen är klar innan du startar en ny chatt." + ] + }, + { + "locale": "th", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "นำไฟล์แนบออกหรือรอให้การส่งเสร็จสิ้นก่อนเริ่มแชตใหม่", + "ลบไฟล์แนบหรือรอให้การส่งเสร็จสิ้นก่อนเริ่มแชทใหม่" + ] + }, + { + "locale": "uk", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Видаліть вкладення або дочекайтеся завершення доставки, перш ніж починати новий чат.", + "Видаліть вкладення або зачекайте на завершення доставлення, перш ніж починати новий чат." + ] + }, + { + "locale": "vi", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "Gỡ tệp đính kèm hoặc chờ gửi xong trước khi bắt đầu cuộc trò chuyện mới.", + "Xóa tệp đính kèm hoặc chờ quá trình gửi hoàn tất trước khi bắt đầu cuộc trò chuyện mới." + ] + }, + { + "locale": "zh-CN", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "请移除附件或等待发送完成后再开始新聊天。", + "请移除附件或等待发送完成后,再开始新聊天。" + ] + }, + { + "locale": "zh-TW", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translations": [ + "請先移除附件或等待傳送完成,再開始新的聊天。", + "請移除附件,或等待傳送問題解決後再開始新的聊天。" + ] + }, + { + "locale": "ar", + "source": "Rename", + "translations": [ + "إعادة التسمية", + "إعادة تسمية" + ] + }, { "locale": "es", "source": "Rename", @@ -6763,7 +7117,8 @@ "source": "Rename", "translations": [ "Ganti Nama", - "Ubah Nama" + "Ubah Nama", + "Ubah nama" ] }, { @@ -6782,6 +7137,30 @@ "Hernoemen" ] }, + { + "locale": "es", + "source": "Rename Group", + "translations": [ + "Cambiar nombre del grupo", + "Renombrar grupo" + ] + }, + { + "locale": "id", + "source": "Rename Group", + "translations": [ + "Ganti Nama Grup", + "Ubah Nama Grup" + ] + }, + { + "locale": "nl", + "source": "Rename Group", + "translations": [ + "Groep hernoemen", + "Groepsnaam wijzigen" + ] + }, { "locale": "es", "source": "Rename Session", @@ -6847,6 +7226,14 @@ "Перейменувати сесію" ] }, + { + "locale": "ar", + "source": "Rename…", + "translations": [ + "إعادة التسمية…", + "إعادة تسمية…" + ] + }, { "locale": "es", "source": "Rename…", @@ -7040,7 +7427,8 @@ "translations": [ "Ponów", "Ponów próbę", - "Retry" + "Retry", + "Spróbuj ponownie" ] }, { @@ -7116,12 +7504,133 @@ "重試" ] }, + { + "locale": "ar", + "source": "Run", + "translations": [ + "التشغيل", + "تشغيل" + ] + }, + { + "locale": "de", + "source": "Run", + "translations": [ + "Ausführen", + "Ausführung" + ] + }, + { + "locale": "es", + "source": "Run", + "translations": [ + "Ejecución", + "Ejecutar" + ] + }, + { + "locale": "fr", + "source": "Run", + "translations": [ + "Exécuter", + "Exécution" + ] + }, { "locale": "hi", "source": "Run", "translations": [ "चलाएँ", - "चलाएं" + "चलाएं", + "रन" + ] + }, + { + "locale": "id", + "source": "Run", + "translations": [ + "Jalankan", + "Proses" + ] + }, + { + "locale": "it", + "source": "Run", + "translations": [ + "Esecuzione", + "Esegui" + ] + }, + { + "locale": "nl", + "source": "Run", + "translations": [ + "Uitvoeren", + "Uitvoering" + ] + }, + { + "locale": "pl", + "source": "Run", + "translations": [ + "Uruchom", + "Uruchomienie" + ] + }, + { + "locale": "pt-BR", + "source": "Run", + "translations": [ + "Executar", + "Execução" + ] + }, + { + "locale": "ru", + "source": "Run", + "translations": [ + "Запуск", + "Запустить" + ] + }, + { + "locale": "sv", + "source": "Run", + "translations": [ + "Kör", + "Körning" + ] + }, + { + "locale": "th", + "source": "Run", + "translations": [ + "การทำงาน", + "เรียกใช้" + ] + }, + { + "locale": "tr", + "source": "Run", + "translations": [ + "Çalıştır", + "Çalıştırma" + ] + }, + { + "locale": "uk", + "source": "Run", + "translations": [ + "Запуск", + "Запустити" + ] + }, + { + "locale": "vi", + "source": "Run", + "translations": [ + "Chạy", + "Lần chạy" ] }, { @@ -7154,6 +7663,7 @@ "source": "Running", "translations": [ "Actief", + "In uitvoering", "Wordt uitgevoerd" ] }, @@ -7161,6 +7671,7 @@ "locale": "pl", "source": "Running", "translations": [ + "Uruchomiona", "Uruchomione", "Uruchomiono", "W toku" @@ -7182,6 +7693,54 @@ "运行中" ] }, + { + "locale": "ar", + "source": "Runtime", + "translations": [ + "بيئة التشغيل", + "وقت التشغيل" + ] + }, + { + "locale": "es", + "source": "Runtime", + "translations": [ + "Entorno de ejecución", + "Runtime" + ] + }, + { + "locale": "fa", + "source": "Runtime", + "translations": [ + "زمان اجرا", + "محیط اجرا" + ] + }, + { + "locale": "pt-BR", + "source": "Runtime", + "translations": [ + "Ambiente de execução", + "Tempo de execução" + ] + }, + { + "locale": "tr", + "source": "Runtime", + "translations": [ + "Çalışma Zamanı", + "Çalışma zamanı" + ] + }, + { + "locale": "vi", + "source": "Runtime", + "translations": [ + "Môi trường chạy", + "Thời gian chạy" + ] + }, { "locale": "de", "source": "Same Machine (Dev)", diff --git a/apps/.i18n/native-source.json b/apps/.i18n/native-source.json index 5a9304050e0..4cb36bf09f4 100644 --- a/apps/.i18n/native-source.json +++ b/apps/.i18n/native-source.json @@ -29171,7 +29171,7 @@ }, { "kind": "conditional-branch", - "line": 878, + "line": 881, "path": "apps/macos/Sources/OpenClaw/DashboardWindowController.swift", "source": "[\\(host)]", "surface": "apple", @@ -32243,7 +32243,7 @@ }, { "kind": "ui-localized-call", - "line": 10, + "line": 11, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "Wake up, my friend!", "surface": "apple", @@ -32251,7 +32251,7 @@ }, { "kind": "conditional-branch", - "line": 129, + "line": 229, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "", "surface": "apple", @@ -32259,7 +32259,7 @@ }, { "kind": "conditional-branch", - "line": 228, + "line": 288, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "OpenClaw was interrupted. Restart to try again.", "surface": "apple", @@ -32267,7 +32267,7 @@ }, { "kind": "conditional-branch", - "line": 229, + "line": 289, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "The Gateway connection changed. Restart OpenClaw to reconnect.", "surface": "apple", @@ -32275,7 +32275,7 @@ }, { "kind": "ui-call", - "line": 253, + "line": 331, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "OpenClaw is working…", "surface": "apple", @@ -32283,7 +32283,7 @@ }, { "kind": "ui-call", - "line": 278, + "line": 356, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "Restart", "surface": "apple", @@ -32291,7 +32291,7 @@ }, { "kind": "ui-call", - "line": 289, + "line": 367, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "Enter secret…", "surface": "apple", @@ -32299,12 +32299,28 @@ }, { "kind": "ui-call", - "line": 291, + "line": 369, "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", "source": "Reply to OpenClaw… (yes sets everything up)", "surface": "apple", "id": "native.apple.35a542956f4f5497" }, + { + "kind": "ui-call", + "line": 409, + "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", + "source": "Skip for now", + "surface": "apple", + "id": "native.apple.134b9ae1d8a543df" + }, + { + "kind": "ui-call", + "line": 444, + "path": "apps/macos/Sources/OpenClaw/OnboardingSystemAgentChat.swift", + "source": "Recommended", + "surface": "apple", + "id": "native.apple.5435391fa338f227" + }, { "kind": "ui-call", "line": 10, @@ -35979,7 +35995,7 @@ }, { "kind": "ui-localized-call", - "line": 758, + "line": 816, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Talk mode off", "surface": "apple", @@ -35987,7 +36003,7 @@ }, { "kind": "ui-localized-call", - "line": 759, + "line": 817, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Talk mode paused", "surface": "apple", @@ -35995,7 +36011,7 @@ }, { "kind": "ui-localized-call", - "line": 761, + "line": 819, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Talk mode ready", "surface": "apple", @@ -36003,7 +36019,7 @@ }, { "kind": "ui-localized-call", - "line": 762, + "line": 820, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Listening", "surface": "apple", @@ -36011,7 +36027,7 @@ }, { "kind": "ui-localized-call", - "line": 763, + "line": 821, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Thinking", "surface": "apple", @@ -36019,7 +36035,7 @@ }, { "kind": "ui-localized-call", - "line": 764, + "line": 822, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Speaking", "surface": "apple", @@ -36027,7 +36043,7 @@ }, { "kind": "ui-localized-call", - "line": 768, + "line": 826, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "What would you like to work on?", "surface": "apple", @@ -36035,7 +36051,7 @@ }, { "kind": "ui-localized-call", - "line": 772, + "line": 830, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Check OpenClaw status", "surface": "apple", @@ -36043,7 +36059,7 @@ }, { "kind": "ui-localized-call", - "line": 773, + "line": 831, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Summarize the current OpenClaw status and tell me what needs attention.", "surface": "apple", @@ -36051,7 +36067,7 @@ }, { "kind": "ui-localized-call", - "line": 776, + "line": 834, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "What can you do?", "surface": "apple", @@ -36059,7 +36075,7 @@ }, { "kind": "ui-localized-call", - "line": 777, + "line": 835, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Show me what you can help with on this Mac right now.", "surface": "apple", @@ -36067,7 +36083,7 @@ }, { "kind": "ui-localized-call", - "line": 780, + "line": 838, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Catch me up", "surface": "apple", @@ -36075,7 +36091,7 @@ }, { "kind": "ui-localized-call", - "line": 781, + "line": 839, "path": "apps/macos/Sources/OpenClaw/WebChatSwiftUI.swift", "source": "Summarize what happened in my sessions since yesterday.", "surface": "apple", @@ -36803,295 +36819,823 @@ }, { "kind": "ui-localized-call", - "line": 33, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Search sessions", + "line": 30, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "This session cannot be archived while it is active or running.", "surface": "apple", - "id": "native.apple.8ec708a3605a2cc3" + "id": "native.apple.b1cdcb906a43d5d6" }, { "kind": "ui-localized-call", - "line": 38, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "No Sessions", + "line": 32, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "The main session cannot be deleted.", "surface": "apple", - "id": "native.apple.23b069b4e7f97039" + "id": "native.apple.5817e3f3dab1ee19" }, { "kind": "ui-localized-call", - "line": 39, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "No Results", - "surface": "apple", - "id": "native.apple.2d4ee298bdd1c05d" - }, - { - "kind": "ui-call", - "line": 49, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "New Session", + "line": 34, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", "surface": "apple", - "id": "native.apple.0058923f2ce8a3ec" + "id": "native.apple.a6b8df3f18171c91" }, { "kind": "ui-localized-call", - "line": 51, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "New session", + "line": 141, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Running", "surface": "apple", - "id": "native.apple.66ba42960eb4135b" + "id": "native.apple.476b3862e0449857" }, { - "kind": "ui-localized-call", - "line": 61, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Rename Session", + "kind": "ui-call", + "line": 171, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Identity", "surface": "apple", - "id": "native.apple.36753ef2f1ed4264" + "id": "native.apple.83b41e41f428cffb" }, { - "kind": "ui-localized-call", - "line": 64, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Session name", + "kind": "ui-call", + "line": 172, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Name", "surface": "apple", - "id": "native.apple.c9de0a1510ef475f" + "id": "native.apple.ba6710da42846eed" }, { - "kind": "ui-localized-call", - "line": 65, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Rename", + "kind": "ui-call", + "line": 174, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Key", "surface": "apple", - "id": "native.apple.6ec5a13c0e6c20d9" + "id": "native.apple.bdb1928f7e63c4c6" }, { - "kind": "ui-localized-call", - "line": 71, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Cancel", + "kind": "ui-modifier", + "line": 181, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Copy session key", "surface": "apple", - "id": "native.apple.4c76665d89af4bec" + "id": "native.apple.7259d51423f8def0" }, { - "kind": "ui-localized-call", - "line": 76, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Delete Session", + "kind": "ui-call", + "line": 183, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Kind", "surface": "apple", - "id": "native.apple.afb4e6c99c63a28d" + "id": "native.apple.1494b638984ddca3" }, { - "kind": "ui-localized-call", - "line": 83, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "The session and its transcript are removed from the gateway.", + "kind": "ui-call", + "line": 187, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Organization", "surface": "apple", - "id": "native.apple.3d4ef32e42f136a4" + "id": "native.apple.49cd6c21bdd0d8da" }, { - "kind": "ui-localized-call", - "line": 105, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Delete “%@”?", + "kind": "ui-call", + "line": 188, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Group", "surface": "apple", - "id": "native.apple.90bcad5f067b4be1" + "id": "native.apple.83e2ae5c4c7dbb94" }, { - "kind": "ui-localized-call", - "line": 153, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Session running", + "kind": "ui-call", + "line": 189, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "None", "surface": "apple", - "id": "native.apple.9a7dca238fba628d" + "id": "native.apple.1ba465bfa16ed23b" }, { - "kind": "ui-localized-call", - "line": 158, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Session failed", + "kind": "ui-call", + "line": 199, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Pinned", "surface": "apple", - "id": "native.apple.fcfbfe5e97a95e9c" + "id": "native.apple.2c7c9e5dc8ad574e" }, { - "kind": "ui-localized-call", - "line": 167, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Unread", + "kind": "ui-call", + "line": 201, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Archived", "surface": "apple", - "id": "native.apple.ac85292b16a7465f" + "id": "native.apple.b0d3e265af9f562a" }, { - "kind": "ui-localized-call", - "line": 177, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Rename…", + "kind": "ui-call", + "line": 208, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Run", "surface": "apple", - "id": "native.apple.a174cb1027a9b881" + "id": "native.apple.de94ca2cf7d4d766" }, { - "kind": "ui-localized-call", - "line": 183, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Pin", + "kind": "ui-call", + "line": 209, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Status", "surface": "apple", - "id": "native.apple.134d6bf84d58fb38" + "id": "native.apple.f7a51dca3268b26c" }, { - "kind": "ui-localized-call", - "line": 183, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Unpin", + "kind": "ui-call", + "line": 210, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Model", "surface": "apple", - "id": "native.apple.e7815cc4ba359513" + "id": "native.apple.12678de5fa43321d" }, { - "kind": "ui-localized-call", - "line": 189, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Fork", + "kind": "ui-call", + "line": 211, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Provider", "surface": "apple", - "id": "native.apple.83f9f2db7eef6a19" + "id": "native.apple.8ec6bd6001df285d" }, { - "kind": "ui-localized-call", - "line": 195, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Mark Read", + "kind": "ui-call", + "line": 212, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Runtime", "surface": "apple", - "id": "native.apple.235614194dc19df2" + "id": "native.apple.f43534cf1ee73605" }, { - "kind": "ui-localized-call", - "line": 195, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Mark Unread", + "kind": "ui-call", + "line": 214, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Run duration", "surface": "apple", - "id": "native.apple.bc71f0d20b7f72a0" + "id": "native.apple.f0775e602bbe75ed" }, { - "kind": "ui-localized-call", - "line": 206, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Archive", + "kind": "ui-call", + "line": 221, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Worktree", "surface": "apple", - "id": "native.apple.c9e118f6aae18d97" + "id": "native.apple.ecde91d89eab026b" }, { - "kind": "ui-localized-call", - "line": 206, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Restore", + "kind": "ui-call", + "line": 222, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "ID", "surface": "apple", - "id": "native.apple.10365a351a1b58b3" + "id": "native.apple.1ef1698bb3ff7166" }, { - "kind": "ui-localized-call", - "line": 215, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Copy Session Key", + "kind": "ui-call", + "line": 223, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Branch", "surface": "apple", - "id": "native.apple.660f63319b89bd8e" + "id": "native.apple.69bc49f9663fa205" }, { - "kind": "ui-localized-call", + "kind": "ui-call", "line": 224, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Delete Session…", + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Repository root", "surface": "apple", - "id": "native.apple.4aeb7c14c26dabac" + "id": "native.apple.aa430e81e52e2354" }, { - "kind": "ui-localized-call", - "line": 254, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Gateway connected", + "kind": "ui-call", + "line": 228, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Activity", "surface": "apple", - "id": "native.apple.6a3425ea2811ff88" + "id": "native.apple.6e851b012a982d38" }, { - "kind": "ui-localized-call", - "line": 255, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", - "source": "Connecting…", + "kind": "ui-call", + "line": 229, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Updated", "surface": "apple", - "id": "native.apple.e3958d1053259f1d" + "id": "native.apple.bf87c6fd92c9315a" }, { - "kind": "ui-named-argument", - "line": 67, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebarModel.swift", - "source": "Pinned", + "kind": "ui-call", + "line": 230, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Last activity", "surface": "apple", - "id": "native.apple.63320b6d5138c0db" + "id": "native.apple.dcb1734cba578b79" }, { - "kind": "conditional-branch", - "line": 16, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Active", + "kind": "ui-call", + "line": 231, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Last interaction", "surface": "apple", - "id": "native.apple.0d9f7c1e0e65a820" + "id": "native.apple.58ca290e3f032865" }, { - "kind": "conditional-branch", + "kind": "ui-call", + "line": 232, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Run started", + "surface": "apple", + "id": "native.apple.7020bd521499f3b8" + }, + { + "kind": "ui-call", + "line": 233, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Run ended", + "surface": "apple", + "id": "native.apple.abb2b24d6378b605" + }, + { + "kind": "ui-modifier", + "line": 244, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Session Info", + "surface": "apple", + "id": "native.apple.cd7c3095a22f80a9" + }, + { + "kind": "ui-call", + "line": 359, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Groups", + "surface": "apple", + "id": "native.apple.e308b012d84b3b3e" + }, + { + "kind": "ui-call", + "line": 366, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Rename…", + "surface": "apple", + "id": "native.apple.6438f66cfcaefaf7" + }, + { + "kind": "ui-call", + "line": 370, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Delete…", + "surface": "apple", + "id": "native.apple.58b0f1df4985b0d1" + }, + { + "kind": "ui-call", + "line": 383, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "No groups", + "surface": "apple", + "id": "native.apple.bc70cc0f0b882179" + }, + { + "kind": "ui-call", + "line": 388, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Create Group", + "surface": "apple", + "id": "native.apple.cb3e1fa7783a35d2" + }, + { + "kind": "ui-call", + "line": 392, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Add Group", + "surface": "apple", + "id": "native.apple.4ac72aeb70f107d8" + }, + { + "kind": "ui-modifier", + "line": 412, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Session Groups", + "surface": "apple", + "id": "native.apple.23d628606fe0734f" + }, + { + "kind": "ui-call", + "line": 415, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Done", + "surface": "apple", + "id": "native.apple.7777b2d2ec43ed59" + }, + { + "kind": "ui-modifier", + "line": 423, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Rename Group", + "surface": "apple", + "id": "native.apple.0b0149661cacfe36" + }, + { + "kind": "ui-call", + "line": 428, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Group name", + "surface": "apple", + "id": "native.apple.8cbd863aa4d0524f" + }, + { + "kind": "ui-call", + "line": 430, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Rename", + "surface": "apple", + "id": "native.apple.6021088d5ed9c301" + }, + { + "kind": "ui-call", + "line": 437, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Cancel", + "surface": "apple", + "id": "native.apple.e697417338a47751" + }, + { + "kind": "ui-localized-call", + "line": 440, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Delete “%@”?", + "surface": "apple", + "id": "native.apple.cc89328a14af7a23" + }, + { + "kind": "ui-localized-call", + "line": 441, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Delete group?", + "surface": "apple", + "id": "native.apple.4c09741db2e6c624" + }, + { + "kind": "ui-call", + "line": 446, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Delete Group", + "surface": "apple", + "id": "native.apple.ddb1bbbd3c1a9c5e" + }, + { + "kind": "ui-call", + "line": 453, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Sessions in this group become ungrouped.", + "surface": "apple", + "id": "native.apple.b049c8a4d2805e08" + }, + { + "kind": "ui-localized-call", + "line": 515, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Gateway changed. Close and reopen Groups to continue.", + "surface": "apple", + "id": "native.apple.5aa6082d78027c5f" + }, + { + "kind": "ui-localized-call", + "line": 555, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "No agents are available on this gateway.", + "surface": "apple", + "id": "native.apple.bb4b44183929c881" + }, + { + "kind": "ui-call", + "line": 570, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "New Session Options", + "surface": "apple", + "id": "native.apple.6c89f35d53506406" + }, + { + "kind": "ui-call", + "line": 572, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Agent", + "surface": "apple", + "id": "native.apple.5b0cde807ccb4241" + }, + { + "kind": "ui-call", + "line": 580, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Create in a worktree", + "surface": "apple", + "id": "native.apple.124a640f9620d9cd" + }, + { + "kind": "ui-call", + "line": 584, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Base ref (optional)", + "surface": "apple", + "id": "native.apple.632ce245d5575fea" + }, + { + "kind": "ui-call", + "line": 594, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Retry", + "surface": "apple", + "id": "native.apple.fd81909fc9719a59" + }, + { + "kind": "ui-call", + "line": 600, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "Create", + "surface": "apple", + "id": "native.apple.a085278be62286b2" + }, + { + "kind": "ui-localized-call", + "line": 618, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionManagementViews.swift", + "source": "The session could not be created.", + "surface": "apple", + "id": "native.apple.795ba37f6782cf28" + }, + { + "kind": "ui-localized-call", + "line": 64, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Search sessions", + "surface": "apple", + "id": "native.apple.8ec708a3605a2cc3" + }, + { + "kind": "ui-localized-call", + "line": 69, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "No Sessions", + "surface": "apple", + "id": "native.apple.23b069b4e7f97039" + }, + { + "kind": "ui-localized-call", + "line": 70, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "No Results", + "surface": "apple", + "id": "native.apple.2d4ee298bdd1c05d" + }, + { + "kind": "ui-call", + "line": 81, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "New Session", + "surface": "apple", + "id": "native.apple.0058923f2ce8a3ec" + }, + { + "kind": "ui-localized-call", + "line": 83, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "New session", + "surface": "apple", + "id": "native.apple.66ba42960eb4135b" + }, + { + "kind": "ui-localized-call", + "line": 89, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "New session options", + "surface": "apple", + "id": "native.apple.2ef0e34db02ad255" + }, + { + "kind": "ui-localized-call", + "line": 117, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Rename Session", + "surface": "apple", + "id": "native.apple.36753ef2f1ed4264" + }, + { + "kind": "ui-localized-call", + "line": 120, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Session name", + "surface": "apple", + "id": "native.apple.c9de0a1510ef475f" + }, + { + "kind": "ui-localized-call", + "line": 121, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Rename", + "surface": "apple", + "id": "native.apple.6ec5a13c0e6c20d9" + }, + { + "kind": "ui-localized-call", + "line": 127, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Cancel", + "surface": "apple", + "id": "native.apple.4c76665d89af4bec" + }, + { + "kind": "ui-localized-call", + "line": 132, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Delete Session", + "surface": "apple", + "id": "native.apple.afb4e6c99c63a28d" + }, + { + "kind": "ui-localized-call", + "line": 139, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "The session and its transcript are removed from the gateway.", + "surface": "apple", + "id": "native.apple.3d4ef32e42f136a4" + }, + { + "kind": "ui-localized-call", + "line": 167, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Delete “%@”?", + "surface": "apple", + "id": "native.apple.90bcad5f067b4be1" + }, + { + "kind": "ui-localized-call", + "line": 215, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Session running", + "surface": "apple", + "id": "native.apple.9a7dca238fba628d" + }, + { + "kind": "ui-localized-call", + "line": 220, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Session failed", + "surface": "apple", + "id": "native.apple.fcfbfe5e97a95e9c" + }, + { + "kind": "ui-localized-call", + "line": 229, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Unread", + "surface": "apple", + "id": "native.apple.ac85292b16a7465f" + }, + { + "kind": "ui-localized-call", + "line": 238, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Get Info…", + "surface": "apple", + "id": "native.apple.f57a4b9c14d31867" + }, + { + "kind": "ui-localized-call", + "line": 245, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Rename…", + "surface": "apple", + "id": "native.apple.a174cb1027a9b881" + }, + { + "kind": "ui-localized-call", + "line": 251, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Pin", + "surface": "apple", + "id": "native.apple.134d6bf84d58fb38" + }, + { + "kind": "ui-localized-call", + "line": 251, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Unpin", + "surface": "apple", + "id": "native.apple.e7815cc4ba359513" + }, + { + "kind": "ui-localized-call", + "line": 257, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Fork", + "surface": "apple", + "id": "native.apple.83f9f2db7eef6a19" + }, + { + "kind": "ui-localized-call", + "line": 263, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Mark Read", + "surface": "apple", + "id": "native.apple.235614194dc19df2" + }, + { + "kind": "ui-localized-call", + "line": 263, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Mark Unread", + "surface": "apple", + "id": "native.apple.bc71f0d20b7f72a0" + }, + { + "kind": "ui-localized-call", + "line": 274, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Archive", + "surface": "apple", + "id": "native.apple.c9e118f6aae18d97" + }, + { + "kind": "ui-localized-call", + "line": 274, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Restore", + "surface": "apple", + "id": "native.apple.10365a351a1b58b3" + }, + { + "kind": "ui-localized-call", + "line": 283, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Copy Session Key", + "surface": "apple", + "id": "native.apple.660f63319b89bd8e" + }, + { + "kind": "ui-localized-call", + "line": 292, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Delete Session…", + "surface": "apple", + "id": "native.apple.4aeb7c14c26dabac" + }, + { + "kind": "ui-localized-call", + "line": 334, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Gateway connected", + "surface": "apple", + "id": "native.apple.6a3425ea2811ff88" + }, + { + "kind": "ui-localized-call", + "line": 335, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Connecting…", + "surface": "apple", + "id": "native.apple.e3958d1053259f1d" + }, + { + "kind": "ui-localized-call", + "line": 346, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebar.swift", + "source": "Retry session groups", + "surface": "apple", + "id": "native.apple.79f708b3bc1d3a6c" + }, + { + "kind": "ui-named-argument", + "line": 76, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSessionSidebarModel.swift", + "source": "Pinned", + "surface": "apple", + "id": "native.apple.63320b6d5138c0db" + }, + { + "kind": "conditional-branch", + "line": 16, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Active", + "surface": "apple", + "id": "native.apple.0d9f7c1e0e65a820" + }, + { + "kind": "conditional-branch", "line": 17, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Archived", + "source": "Archived", + "surface": "apple", + "id": "native.apple.3c71a4c13836cc75" + }, + { + "kind": "ui-call", + "line": 76, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Scope", + "surface": "apple", + "id": "native.apple.0489ad746c8d35c2" + }, + { + "kind": "ui-named-argument", + "line": 88, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Search sessions", + "surface": "apple", + "id": "native.apple.2c37581c7b88f741" + }, + { + "kind": "ui-modifier", + "line": 89, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Sessions", + "surface": "apple", + "id": "native.apple.43be8a2336e42faf" + }, + { + "kind": "ui-modifier", + "line": 146, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Rename Session", + "surface": "apple", + "id": "native.apple.0b379cdfcbd3247f" + }, + { + "kind": "ui-call", + "line": 152, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Session name", + "surface": "apple", + "id": "native.apple.54b6fbd9e41db009" + }, + { + "kind": "ui-call", + "line": 167, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Cancel", "surface": "apple", - "id": "native.apple.3c71a4c13836cc75" + "id": "native.apple.833fe2915430c89d" + }, + { + "kind": "ui-modifier", + "line": 178, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Delete selected sessions?", + "surface": "apple", + "id": "native.apple.751e0f6b81cd374a" }, { "kind": "ui-call", - "line": 65, + "line": 183, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Scope", + "source": "Delete Sessions", "surface": "apple", - "id": "native.apple.0489ad746c8d35c2" + "id": "native.apple.aa679276581b0058" }, { - "kind": "ui-named-argument", - "line": 77, + "kind": "ui-call", + "line": 187, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Search sessions", + "source": "Each selected session and its transcript will be removed from the gateway.", "surface": "apple", - "id": "native.apple.2c37581c7b88f741" + "id": "native.apple.f837129cbee23297" }, { - "kind": "ui-modifier", - "line": 78, + "kind": "ui-call", + "line": 216, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Sessions", + "source": "Groups", "surface": "apple", - "id": "native.apple.43be8a2336e42faf" + "id": "native.apple.bf09df5e38a7a950" }, { "kind": "ui-modifier", - "line": 103, + "line": 222, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Rename Session", + "source": "Manage session groups", "surface": "apple", - "id": "native.apple.0b379cdfcbd3247f" + "id": "native.apple.64013cfee5e25305" }, { - "kind": "ui-call", - "line": 109, + "kind": "conditional-branch", + "line": 226, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Session name", + "source": "Done", "surface": "apple", - "id": "native.apple.54b6fbd9e41db009" + "id": "native.apple.185f4688f98e244e" }, { - "kind": "ui-call", - "line": 124, + "kind": "conditional-branch", + "line": 226, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Cancel", + "source": "Select", "surface": "apple", - "id": "native.apple.833fe2915430c89d" + "id": "native.apple.58133fc5791847e6" }, { "kind": "conditional-branch", - "line": 153, + "line": 241, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", "source": "No archived sessions", "surface": "apple", @@ -37099,7 +37643,7 @@ }, { "kind": "conditional-branch", - "line": 153, + "line": 241, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", "source": "No sessions found", "surface": "apple", @@ -37107,75 +37651,91 @@ }, { "kind": "ui-localized-call", - "line": 162, + "line": 260, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", "source": "Restore", "surface": "apple", "id": "native.apple.f0e9d8f69c1d9190" }, + { + "kind": "ui-call", + "line": 310, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Get Info…", + "surface": "apple", + "id": "native.apple.158cfa096c57bcb9" + }, + { + "kind": "ui-call", + "line": 317, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", + "source": "Rename", + "surface": "apple", + "id": "native.apple.080fce25e4a9bb61" + }, { "kind": "ui-localized-call", - "line": 163, + "line": 346, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Archive", + "source": "Fork", "surface": "apple", - "id": "native.apple.666ba6eb696e649f" + "id": "native.apple.6de479e9d780869a" }, { - "kind": "ui-modifier", - "line": 197, + "kind": "ui-localized-call", + "line": 355, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Pinned", + "source": "Mark Read", "surface": "apple", - "id": "native.apple.05cb1fecc5844b69" + "id": "native.apple.1398a2f69867f22d" }, { - "kind": "ui-call", - "line": 235, + "kind": "ui-localized-call", + "line": 356, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Rename", + "source": "Mark Unread", "surface": "apple", - "id": "native.apple.080fce25e4a9bb61" + "id": "native.apple.4f259c4409cfcc75" }, { - "kind": "conditional-branch", - "line": 243, + "kind": "ui-modifier", + "line": 387, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Pin", + "source": "Pinned", "surface": "apple", - "id": "native.apple.d148288258094aa6" + "id": "native.apple.05cb1fecc5844b69" }, { - "kind": "conditional-branch", - "line": 243, + "kind": "ui-call", + "line": 394, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Unpin", + "source": "Pin", "surface": "apple", - "id": "native.apple.3c62aaf44e6ab4d4" + "id": "native.apple.d148288258094aa6" }, { - "kind": "ui-localized-call", - "line": 264, + "kind": "ui-call", + "line": 395, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Fork", + "source": "Unpin", "surface": "apple", - "id": "native.apple.6de479e9d780869a" + "id": "native.apple.3c62aaf44e6ab4d4" }, { - "kind": "ui-localized-call", - "line": 273, + "kind": "ui-call", + "line": 396, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Mark Read", + "source": "Archive", "surface": "apple", - "id": "native.apple.1398a2f69867f22d" + "id": "native.apple.666ba6eb696e649f" }, { - "kind": "ui-localized-call", - "line": 274, + "kind": "ui-call", + "line": 398, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatSheets.swift", - "source": "Mark Unread", + "source": "Delete", "surface": "apple", - "id": "native.apple.4f259c4409cfcc75" + "id": "native.apple.b09b91392835fe58" }, { "kind": "ui-localized-call", @@ -37273,17 +37833,9 @@ "surface": "apple", "id": "native.apple.99df7de891c8235f" }, - { - "kind": "ui-call", - "line": 618, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", - "source": "Jump to latest", - "surface": "apple", - "id": "native.apple.f84b674ad395b694" - }, { "kind": "ui-modifier", - "line": 629, + "line": 631, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Jump to latest reply", "surface": "apple", @@ -37291,7 +37843,7 @@ }, { "kind": "ui-named-argument", - "line": 649, + "line": 651, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Refresh", "surface": "apple", @@ -37299,7 +37851,7 @@ }, { "kind": "ui-call", - "line": 1036, + "line": 1038, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Copy Message", "surface": "apple", @@ -37307,7 +37859,7 @@ }, { "kind": "ui-call", - "line": 1059, + "line": 1061, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Open Full Message", "surface": "apple", @@ -37315,7 +37867,7 @@ }, { "kind": "ui-localized-call", - "line": 1080, + "line": 1082, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Reply", "surface": "apple", @@ -37323,7 +37875,7 @@ }, { "kind": "ui-localized-call", - "line": 1090, + "line": 1092, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "You", "surface": "apple", @@ -37331,7 +37883,7 @@ }, { "kind": "ui-localized-call", - "line": 1092, + "line": 1094, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Assistant", "surface": "apple", @@ -37339,7 +37891,7 @@ }, { "kind": "ui-call", - "line": 1158, + "line": 1160, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Loading chat", "surface": "apple", @@ -37347,7 +37899,7 @@ }, { "kind": "ui-modifier", - "line": 1238, + "line": 1240, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift", "source": "Dismiss", "surface": "apple", @@ -37435,23 +37987,39 @@ }, { "kind": "ui-localized-call", - "line": 1150, - "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel.swift", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "line": 84, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+SessionActions.swift", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "surface": "apple", - "id": "native.apple.710c7bd117a7cc12" + "id": "native.apple.787047d0da6b8b9f" + }, + { + "kind": "ui-localized-call", + "line": 229, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel+SessionActions.swift", + "source": "Gateway changed before the session operation started.", + "surface": "apple", + "id": "native.apple.980f552bb0f96c0f" }, { "kind": "ui-localized-call", - "line": 1208, + "line": 773, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel.swift", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "surface": "apple", "id": "native.apple.d93e6fe16ec1b0e5" }, + { + "kind": "ui-localized-call", + "line": 1156, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatViewModel.swift", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "surface": "apple", + "id": "native.apple.710c7bd117a7cc12" + }, { "kind": "ui-modifier", - "line": 77, + "line": 78, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Clear this session's history?", "surface": "apple", @@ -37459,7 +38027,7 @@ }, { "kind": "ui-call", - "line": 83, + "line": 84, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Clear History", "surface": "apple", @@ -37467,7 +38035,7 @@ }, { "kind": "ui-localized-call-multiline", - "line": 88, + "line": 89, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "This resets the conversation for %@. The session key stays the same.", "surface": "apple", @@ -37475,7 +38043,7 @@ }, { "kind": "ui-localized-call", - "line": 94, + "line": 95, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Rename Session", "surface": "apple", @@ -37483,7 +38051,7 @@ }, { "kind": "ui-localized-call", - "line": 95, + "line": 96, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Session name", "surface": "apple", @@ -37491,7 +38059,7 @@ }, { "kind": "ui-localized-call", - "line": 96, + "line": 97, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Rename", "surface": "apple", @@ -37499,7 +38067,7 @@ }, { "kind": "ui-localized-call", - "line": 101, + "line": 102, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Cancel", "surface": "apple", @@ -37507,7 +38075,7 @@ }, { "kind": "ui-call", - "line": 142, + "line": 143, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Export Transcript", "surface": "apple", @@ -37515,7 +38083,7 @@ }, { "kind": "ui-call", - "line": 151, + "line": 152, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Sessions", "surface": "apple", @@ -37523,7 +38091,7 @@ }, { "kind": "ui-localized-call", - "line": 239, + "line": 240, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "%@ (override)", "surface": "apple", @@ -37531,7 +38099,7 @@ }, { "kind": "ui-call", - "line": 245, + "line": 246, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Thinking", "surface": "apple", @@ -37539,7 +38107,7 @@ }, { "kind": "ui-localized-call", - "line": 249, + "line": 250, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Thinking level", "surface": "apple", @@ -37547,7 +38115,7 @@ }, { "kind": "ui-localized-call", - "line": 262, + "line": 263, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Full", "surface": "apple", @@ -37555,7 +38123,7 @@ }, { "kind": "ui-localized-call", - "line": 268, + "line": 269, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Verbosity", "surface": "apple", @@ -37563,7 +38131,7 @@ }, { "kind": "ui-localized-call", - "line": 277, + "line": 278, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Default (inherited)", "surface": "apple", @@ -37571,7 +38139,7 @@ }, { "kind": "ui-localized-call", - "line": 279, + "line": 280, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "On", "surface": "apple", @@ -37579,7 +38147,7 @@ }, { "kind": "ui-localized-call", - "line": 280, + "line": 281, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Off", "surface": "apple", @@ -37587,7 +38155,7 @@ }, { "kind": "ui-localized-call", - "line": 282, + "line": 283, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Fast", "surface": "apple", @@ -37595,7 +38163,7 @@ }, { "kind": "ui-localized-call", - "line": 285, + "line": 286, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Fast responses", "surface": "apple", @@ -37603,7 +38171,7 @@ }, { "kind": "ui-call", - "line": 299, + "line": 300, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Pinned", "surface": "apple", @@ -37611,7 +38179,7 @@ }, { "kind": "ui-call", - "line": 302, + "line": 303, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Recent", "surface": "apple", @@ -37619,7 +38187,7 @@ }, { "kind": "ui-call", - "line": 319, + "line": 320, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Model", "surface": "apple", @@ -37627,7 +38195,7 @@ }, { "kind": "ui-localized-call", - "line": 333, + "line": 334, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Default", "surface": "apple", @@ -37635,7 +38203,7 @@ }, { "kind": "ui-call", - "line": 347, + "line": 348, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "New Session", "surface": "apple", @@ -37645,13 +38213,21 @@ "kind": "ui-call", "line": 355, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", + "source": "New Session Options…", + "surface": "apple", + "id": "native.apple.a7119fbf9d25df5e" + }, + { + "kind": "ui-call", + "line": 362, + "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Refresh", "surface": "apple", "id": "native.apple.5361129a24118af6" }, { "kind": "ui-call", - "line": 362, + "line": 369, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Sessions…", "surface": "apple", @@ -37659,7 +38235,7 @@ }, { "kind": "ui-localized-call", - "line": 374, + "line": 381, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Rename Session…", "surface": "apple", @@ -37667,7 +38243,7 @@ }, { "kind": "ui-localized-call", - "line": 382, + "line": 389, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Fork Session", "surface": "apple", @@ -37675,7 +38251,7 @@ }, { "kind": "ui-localized-call", - "line": 393, + "line": 400, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Unpin", "surface": "apple", @@ -37683,7 +38259,7 @@ }, { "kind": "ui-localized-call", - "line": 394, + "line": 401, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Pin", "surface": "apple", @@ -37691,7 +38267,7 @@ }, { "kind": "ui-localized-call", - "line": 405, + "line": 412, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Mark Read", "surface": "apple", @@ -37699,7 +38275,7 @@ }, { "kind": "ui-localized-call", - "line": 406, + "line": 413, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Mark Unread", "surface": "apple", @@ -37707,7 +38283,7 @@ }, { "kind": "ui-localized-call", - "line": 422, + "line": 429, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Restore", "surface": "apple", @@ -37715,7 +38291,7 @@ }, { "kind": "ui-localized-call", - "line": 423, + "line": 430, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Archive", "surface": "apple", @@ -37723,7 +38299,7 @@ }, { "kind": "ui-call", - "line": 435, + "line": 442, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Copy Session Key", "surface": "apple", @@ -37731,7 +38307,7 @@ }, { "kind": "ui-call", - "line": 441, + "line": 448, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Export Transcript…", "surface": "apple", @@ -37739,7 +38315,7 @@ }, { "kind": "ui-call", - "line": 453, + "line": 460, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Show Reasoning", "surface": "apple", @@ -37747,7 +38323,7 @@ }, { "kind": "ui-call", - "line": 465, + "line": 472, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Show Tool Activity", "surface": "apple", @@ -37755,7 +38331,7 @@ }, { "kind": "ui-call", - "line": 482, + "line": 489, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Clear History…", "surface": "apple", @@ -37763,7 +38339,7 @@ }, { "kind": "ui-call", - "line": 485, + "line": 492, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Session", "surface": "apple", @@ -37771,7 +38347,7 @@ }, { "kind": "ui-modifier", - "line": 488, + "line": 500, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Session actions", "surface": "apple", @@ -37779,7 +38355,7 @@ }, { "kind": "ui-localized-call", - "line": 522, + "line": 534, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Session cost %@", "surface": "apple", @@ -37787,7 +38363,7 @@ }, { "kind": "ui-call", - "line": 528, + "line": 540, "path": "apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatWindowShell.swift", "source": "Compact Session", "surface": "apple", diff --git a/apps/.i18n/native/ar.json b/apps/.i18n/native/ar.json index 2698e247d00..21db4ef335c 100644 --- a/apps/.i18n/native/ar.json +++ b/apps/.i18n/native/ar.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "رد على OpenClaw… (تؤدي الإجابة بنعم إلى إعداد كل شيء)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "تخطي الآن" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "موصى به" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "المستخدم" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "لا يمكن أرشفة هذه الجلسة أثناء نشاطها أو تشغيلها." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "لا يمكن حذف الجلسة الرئيسية." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "أزل المرفقات أو انتظر تسليمها قبل أرشفة هذه الجلسة أو حذفها." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "قيد التشغيل" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "الهوية" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "الاسم" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "المفتاح" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "نسخ مفتاح الجلسة" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "النوع" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "المؤسسة" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "المجموعة" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "لا شيء" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "مثبّتة" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "مؤرشفة" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "التشغيل" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "الحالة" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "النموذج" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "المزوّد" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "بيئة التشغيل" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "مدة التشغيل" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "شجرة العمل" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "المعرّف" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "الفرع" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "جذر المستودع" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "النشاط" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "تم التحديث" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "آخر نشاط" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "آخر تفاعل" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "بدأ التشغيل" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "انتهى التشغيل" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "معلومات الجلسة" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "المجموعات" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "إعادة التسمية…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "حذف…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "لا توجد مجموعات" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "إنشاء مجموعة" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "إضافة مجموعة" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "مجموعات الجلسة" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "تم" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "إعادة تسمية المجموعة" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "اسم المجموعة" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "إعادة التسمية" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "إلغاء" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "حذف «%@»؟" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "حذف المجموعة؟" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "حذف المجموعة" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "ستصبح الجلسات في هذه المجموعة غير مصنّفة ضمن مجموعة." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "تغيّر Gateway. أغلق المجموعات وأعد فتحها للمتابعة." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "لا توجد وكلاء متاحة على هذا Gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "خيارات الجلسة الجديدة" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "الوكيل" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "إنشاء في شجرة عمل" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "المرجع الأساسي (اختياري)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "إعادة المحاولة" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "إنشاء" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "تعذّر إنشاء الجلسة." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "جلسة جديدة" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "خيارات الجلسة الجديدة" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "غير مقروء" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "الحصول على معلومات…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "جارٍ الاتصال…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "إعادة محاولة تحميل مجموعات الجلسات" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "إلغاء" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "حذف الجلسات المحددة؟" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "حذف الجلسات" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "ستُزال كل جلسة محددة ونصها من Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "المجموعات" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "إدارة مجموعات الجلسات" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "تم" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "تحديد" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "استعادة" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "أرشفة" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "مثبّت" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "إحضار المعلومات…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "إعادة تسمية" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "تثبيت" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "إلغاء التثبيت" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "وضع علامة كغير مقروء" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "مثبّت" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "تثبيت" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "إلغاء التثبيت" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "أرشفة" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "حذف" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "استمع" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "الانتقال إلى الأحدث" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "تمت الإضافة إلى قائمة الانتظار بعد تغيير المسار" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "أزِل المرفقات أو انتظر اكتمال التسليم قبل تبديل المحادثات." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "أزل المرفقات أو انتظر حتى يكتمل التسليم قبل بدء محادثة جديدة." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "تغيّر Gateway قبل بدء عملية الجلسة." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "أزِل المرفقات أو انتظر اكتمال التسليم قبل بدء محادثة جديدة." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "أزِل المرفقات أو انتظر اكتمال التسليم قبل تبديل المحادثات." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "جلسة جديدة" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "خيارات جلسة جديدة…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/de.json b/apps/.i18n/native/de.json index 5f93ae8c189..69777918739 100644 --- a/apps/.i18n/native/de.json +++ b/apps/.i18n/native/de.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "OpenClaw antworten… („yes“ richtet alles ein)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Vorerst überspringen" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Empfohlen" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Benutzer" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Diese Sitzung kann nicht archiviert werden, solange sie aktiv ist oder ausgeführt wird." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Die Hauptsitzung kann nicht gelöscht werden." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Entfernen Sie Anhänge oder warten Sie auf deren Zustellung, bevor Sie diese Sitzung archivieren oder löschen." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Wird ausgeführt" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identität" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Name" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Schlüssel" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Sitzungsschlüssel kopieren" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Art" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organisation" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Gruppe" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Keine" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Angeheftet" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Archiviert" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Ausführung" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Status" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Modell" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Anbieter" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Laufzeit" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Ausführungsdauer" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Arbeitsbaum" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Branch" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Repository-Stammverzeichnis" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Aktivität" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Aktualisiert" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Letzte Aktivität" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Letzte Interaktion" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Ausführung gestartet" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Ausführung beendet" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Sitzungsinformationen" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Gruppen" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Umbenennen…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Löschen…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Keine Gruppen" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Gruppe erstellen" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Gruppe hinzufügen" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Sitzungsgruppen" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Fertig" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Gruppe umbenennen" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Gruppenname" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Umbenennen" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Abbrechen" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "„%@“ löschen?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Gruppe löschen?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Gruppe löschen" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Sitzungen in dieser Gruppe werden aus der Gruppe entfernt." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway wurde geändert. Schließen und öffnen Sie „Gruppen“ erneut, um fortzufahren." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Auf diesem Gateway sind keine Agenten verfügbar." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Optionen für neue Sitzungen" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agent" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "In einem Worktree erstellen" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Basis-Ref (optional)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Erneut versuchen" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Erstellen" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Die Sitzung konnte nicht erstellt werden." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Neue Sitzung" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Optionen für neue Sitzungen" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Ungelesen" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Informationen…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Verbindung wird hergestellt…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Sitzungsgruppen erneut laden" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Abbrechen" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Ausgewählte Sitzungen löschen?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Sitzungen löschen" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Alle ausgewählten Sitzungen und ihre Transkripte werden aus dem Gateway entfernt." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Gruppen" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Sitzungsgruppen verwalten" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Fertig" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Auswählen" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Wiederherstellen" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Archivieren" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Angeheftet" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Informationen…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Umbenennen" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Anheften" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Lösen" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Als ungelesen markieren" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Angeheftet" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Anheften" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Lösen" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Archivieren" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Löschen" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Zuhören" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Zum neuesten springen" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "nach Routenänderung in Warteschlange" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Entfernen Sie Anhänge oder warten Sie auf die Zustellung, bevor Sie den Chat wechseln." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Entferne Anhänge oder warte, bis die Zustellung abgeschlossen ist, bevor du einen neuen Chat startest." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Das Gateway wurde geändert, bevor der Sitzungsvorgang gestartet wurde." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Entfernen Sie Anhänge oder warten Sie auf die Zustellung, bevor Sie einen neuen Chat starten." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Entfernen Sie Anhänge oder warten Sie auf die Zustellung, bevor Sie den Chat wechseln." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Neue Sitzung" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Optionen für neue Sitzung…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/es.json b/apps/.i18n/native/es.json index 3fc69f9e398..b0e650c3a3a 100644 --- a/apps/.i18n/native/es.json +++ b/apps/.i18n/native/es.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Responde a OpenClaw… («sí» lo configura todo)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Omitir por ahora" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Recomendado" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Usuario" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Esta sesión no se puede archivar mientras esté activa o en ejecución." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "La sesión principal no se puede eliminar." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Elimina los archivos adjuntos o espera a que se entreguen antes de archivar o eliminar esta sesión." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "En ejecución" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identidad" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Nombre" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Clave" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Copiar clave de sesión" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Tipo" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organización" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Grupo" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Ninguno" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Fijada" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Archivada" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Ejecución" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Estado" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Modelo" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Proveedor" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Entorno de ejecución" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Duración de la ejecución" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Árbol de trabajo" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Rama" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Raíz del repositorio" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Actividad" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Actualizado" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Última actividad" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Última interacción" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Ejecución iniciada" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Ejecución finalizada" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Información de la sesión" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Grupos" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Cambiar nombre…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Eliminar…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "No hay grupos" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Crear grupo" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Añadir grupo" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Grupos de sesiones" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Listo" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Cambiar nombre del grupo" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Nombre del grupo" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Renombrar" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Cancelar" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "¿Eliminar “%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "¿Eliminar el grupo?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Eliminar grupo" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Las sesiones de este grupo quedarán sin agrupar." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "El Gateway ha cambiado. Cierra y vuelve a abrir Grupos para continuar." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "No hay agentes disponibles en este Gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Opciones de nueva sesión" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agente" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Crear en un worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Referencia base (opcional)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Reintentar" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Crear" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "No se pudo crear la sesión." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Nueva sesión" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Opciones de nueva sesión" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "No leído" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Obtener información…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Conectando…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Reintentar grupos de sesiones" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Cancelar" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "¿Eliminar las sesiones seleccionadas?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Eliminar sesiones" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Cada sesión seleccionada y su transcripción se eliminarán del Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Grupos" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Gestionar grupos de sesiones" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Listo" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Seleccionar" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Restaurar" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Archivar" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Fijadas" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Obtener información…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Cambiar nombre" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Fijar" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Dejar de fijar" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Marcar como no leído" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Fijadas" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Fijar" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Dejar de fijar" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Archivar" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Eliminar" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Escuchar" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Ir a lo más reciente" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "en cola tras cambio de ruta" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Elimina los adjuntos o espera a que se complete la entrega antes de cambiar de chat." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Elimina los archivos adjuntos o espera a que se complete la entrega antes de iniciar un nuevo chat." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "El Gateway cambió antes de que se iniciara la operación de sesión." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Elimina los adjuntos o espera a que se complete la entrega antes de iniciar un nuevo chat." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Elimina los adjuntos o espera a que se complete la entrega antes de cambiar de chat." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Nueva sesión" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Opciones de nueva sesión…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/fa.json b/apps/.i18n/native/fa.json index 0d73f0b9ab2..1c727271c60 100644 --- a/apps/.i18n/native/fa.json +++ b/apps/.i18n/native/fa.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "به OpenClaw پاسخ دهید… (با «بله» همه‌چیز راه‌اندازی می‌شود)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "فعلاً رد شود" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "پیشنهادشده" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "کاربر" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "این نشست تا زمانی که فعال یا در حال اجرا است، قابل بایگانی نیست." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "نشست اصلی قابل حذف نیست." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "پیش از بایگانی یا حذف این نشست، پیوست‌ها را حذف کنید یا منتظر تحویل آن‌ها بمانید." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "در حال اجرا" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "هویت" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "نام" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "کلید" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "کپی کلید نشست" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "نوع" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "سازمان" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "گروه" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "هیچ‌کدام" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "سنجاق‌شده" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "بایگانی‌شده" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "اجرا" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "وضعیت" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "مدل" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "ارائه‌دهنده" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "محیط اجرا" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "مدت اجرا" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "درخت کاری" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "شناسه" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "شاخه" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "ریشهٔ مخزن" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "فعالیت" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "به‌روزرسانی‌شده" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "آخرین فعالیت" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "آخرین تعامل" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "اجرا آغاز شد" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "اجرا پایان یافت" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "اطلاعات نشست" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "گروه‌ها" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "تغییر نام…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "حذف…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "هیچ گروهی وجود ندارد" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "ایجاد گروه" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "افزودن گروه" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "گروه‌های نشست" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "انجام شد" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "تغییر نام گروه" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "نام گروه" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "تغییر نام" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "لغو" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "«%@» حذف شود؟" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "گروه حذف شود؟" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "حذف گروه" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "نشست‌های این گروه از گروه خارج می‌شوند." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway تغییر کرد. برای ادامه، Groups را ببندید و دوباره باز کنید." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "هیچ عاملی در این Gateway در دسترس نیست." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "گزینه‌های نشست جدید" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "عامل" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "ایجاد در یک worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "ارجاع پایه (اختیاری)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "تلاش مجدد" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "ایجاد" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "جلسه ایجاد نشد." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "نشست جدید" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "گزینه‌های نشست جدید" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "خوانده‌نشده" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "دریافت اطلاعات…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "در حال اتصال…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "تلاش مجدد برای گروه‌های نشست" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "لغو" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "نشست‌های انتخاب‌شده حذف شوند؟" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "حذف نشست‌ها" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "هر نشست انتخاب‌شده و رونوشت آن از Gateway حذف خواهد شد." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "گروه‌ها" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "مدیریت گروه‌های نشست" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "انجام شد" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "انتخاب" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "بازیابی" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "بایگانی" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "سنجاق‌شده" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "دریافت اطلاعات…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "تغییر نام" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "سنجاق کردن" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "برداشتن سنجاق" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "علامت‌گذاری به‌عنوان خوانده‌نشده" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "سنجاق‌شده" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "سنجاق کردن" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "برداشتن سنجاق" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "بایگانی" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "حذف" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "گوش دادن" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "پرش به آخرین مورد" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "پس از تغییر مسیر در صف قرار گرفت" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "پیش از تغییر گفتگو، پیوست‌ها را حذف کنید یا منتظر تکمیل ارسال بمانید." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "پیش از شروع گفت‌وگوی جدید، پیوست‌ها را حذف کنید یا منتظر بمانید تا ارسال آن‌ها تکمیل شود." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway پیش از شروع عملیات نشست تغییر کرد." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "پیش از شروع گفتگوی جدید، پیوست‌ها را حذف کنید یا منتظر تکمیل ارسال بمانید." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "پیش از تغییر گفتگو، پیوست‌ها را حذف کنید یا منتظر تکمیل ارسال بمانید." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "نشست جدید" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "گزینه‌های نشست جدید…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/fr.json b/apps/.i18n/native/fr.json index 578fd210a50..cc0beb4258e 100644 --- a/apps/.i18n/native/fr.json +++ b/apps/.i18n/native/fr.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Répondre à OpenClaw… (« yes » configure tout)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Ignorer pour l’instant" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Recommandé" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Utilisateur" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Cette session ne peut pas être archivée tant qu’elle est active ou en cours d’exécution." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "La session principale ne peut pas être supprimée." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Supprimez les pièces jointes ou attendez leur envoi avant d’archiver ou de supprimer cette session." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "En cours d’exécution" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identité" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Nom" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Clé" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Copier la clé de session" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Type" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organisation" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Groupe" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Aucun" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Épinglée" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Archivée" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Exécution" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "État" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Modèle" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Fournisseur" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Environnement d’exécution" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Durée d’exécution" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Arbre de travail" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Branche" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Racine du dépôt" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Activité" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Mis à jour" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Dernière activité" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Dernière interaction" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Début de l’exécution" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Fin de l’exécution" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Informations sur la session" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Groupes" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Renommer…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Supprimer…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Aucun groupe" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Créer un groupe" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Ajouter un groupe" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Groupes de sessions" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Terminé" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Renommer le groupe" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Nom du groupe" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Renommer" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Annuler" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Supprimer « %@ » ?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Supprimer le groupe ?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Supprimer le groupe" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Les sessions de ce groupe ne seront plus regroupées." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Le Gateway a changé. Fermez et rouvrez Groupes pour continuer." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Aucun agent n’est disponible sur ce Gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Options de la nouvelle session" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agent" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Créer dans un worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Référence de base (facultatif)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Réessayer" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Créer" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "La session n’a pas pu être créée." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Nouvelle session" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Options de la nouvelle session" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Non lu" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Lire les informations…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Connexion…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Réessayer de charger les groupes de sessions" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Annuler" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Supprimer les sessions sélectionnées ?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Supprimer les sessions" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Chaque session sélectionnée et sa transcription seront supprimées du Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Groupes" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Gérer les groupes de sessions" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Terminé" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Sélectionner" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Restaurer" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Archiver" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Épinglé" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Lire les informations…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Renommer" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Épingler" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Désépingler" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Marquer comme non lu" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Épinglé" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Épingler" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Désépingler" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Archiver" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Supprimer" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Écouter" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Aller au plus récent" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "mis en file d’attente après le changement d’itinéraire" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Supprimez les pièces jointes ou attendez la livraison avant de changer de conversation." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Supprimez les pièces jointes ou attendez la fin de leur envoi avant de démarrer une nouvelle discussion." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Le Gateway a changé avant le début de l’opération sur la session." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Supprimez les pièces jointes ou attendez la livraison avant de démarrer une nouvelle conversation." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Supprimez les pièces jointes ou attendez la livraison avant de changer de conversation." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Nouvelle session" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Options de la nouvelle session…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/hi.json b/apps/.i18n/native/hi.json index 9d0e2e93564..279802847fe 100644 --- a/apps/.i18n/native/hi.json +++ b/apps/.i18n/native/hi.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "OpenClaw को जवाब दें… (हाँ कहने पर सब कुछ सेट हो जाएगा)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "अभी के लिए छोड़ें" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "अनुशंसित" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "उपयोगकर्ता" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "यह सत्र सक्रिय या चल रहा होने के दौरान संग्रहीत नहीं किया जा सकता।" + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "मुख्य सत्र को हटाया नहीं जा सकता।" + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "इस सत्र को संग्रहीत करने या हटाने से पहले अटैचमेंट हटाएँ या डिलीवरी की प्रतीक्षा करें।" + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "चल रहा है" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "पहचान" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "नाम" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "कुंजी" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "सत्र कुंजी कॉपी करें" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "प्रकार" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "संगठन" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "समूह" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "कोई नहीं" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "पिन किया गया" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "संग्रहीत" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "रन" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "स्थिति" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "मॉडल" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "प्रदाता" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "रनटाइम" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "रन की अवधि" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "वर्कट्री" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "ब्रांच" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "रिपॉज़िटरी रूट" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "गतिविधि" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "अपडेट किया गया" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "पिछली गतिविधि" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "पिछला इंटरैक्शन" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "रन शुरू हुआ" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "रन समाप्त हुआ" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "सेशन की जानकारी" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "समूह" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "नाम बदलें…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "हटाएँ…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "कोई समूह नहीं" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "समूह बनाएँ" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "समूह जोड़ें" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "सेशन समूह" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "पूर्ण" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "समूह का नाम बदलें" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "समूह का नाम" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "नाम बदलें" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "रद्द करें" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "“%@” को हटाएँ?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "समूह हटाएँ?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "समूह हटाएँ" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "इस समूह के सत्र असमूहीकृत हो जाएँगे।" + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway बदल गया है। जारी रखने के लिए Groups को बंद करके फिर से खोलें।" + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "इस Gateway पर कोई एजेंट उपलब्ध नहीं है।" + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "नए सत्र के विकल्प" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "एजेंट" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "वर्कट्री में बनाएँ" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "बेस रेफ़रेंस (वैकल्पिक)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "पुनः प्रयास करें" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "बनाएँ" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "सत्र बनाया नहीं जा सका।" + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "नया सत्र" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "नए सत्र के विकल्प" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "अपठित" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "जानकारी पाएँ…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "कनेक्ट हो रहा है…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "सत्र समूहों के लिए फिर से प्रयास करें" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "रद्द करें" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "चुने गए सत्र हटाएँ?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "सत्र हटाएँ" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "हर चुना गया सत्र और उसकी प्रतिलिपि Gateway से हटा दी जाएगी।" + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "समूह" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "सत्र समूह प्रबंधित करें" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "पूर्ण" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "चुनें" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "पुनर्स्थापित करें" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "संग्रहित करें" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "पिन किया गया" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "जानकारी प्राप्त करें…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "नाम बदलें" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "पिन करें" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "अनपिन करें" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "अपठित चिह्नित करें" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "पिन किया गया" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "पिन करें" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "अनपिन करें" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "संग्रहित करें" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "हटाएँ" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "सुनें" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "नवीनतम पर जाएँ" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "रूट बदलने के बाद कतार में रखा गया" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "चैट बदलने से पहले अटैचमेंट हटाएं या डिलीवरी पूरी होने की प्रतीक्षा करें।" + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "नई चैट शुरू करने से पहले अटैचमेंट हटाएँ या डिलीवरी पूरी होने की प्रतीक्षा करें।" + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "सत्र संचालन शुरू होने से पहले Gateway बदल गया।" }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "नई चैट शुरू करने से पहले अटैचमेंट हटाएं या डिलीवरी पूरी होने की प्रतीक्षा करें।" }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "चैट बदलने से पहले अटैचमेंट हटाएं या डिलीवरी पूरी होने की प्रतीक्षा करें।" + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "नया सेशन" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "नए सत्र के विकल्प…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/id.json b/apps/.i18n/native/id.json index 6d8c5fae09d..dc50df90b73 100644 --- a/apps/.i18n/native/id.json +++ b/apps/.i18n/native/id.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Balas OpenClaw… (yes menyiapkan semuanya)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Lewati untuk sekarang" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Direkomendasikan" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Pengguna" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Sesi ini tidak dapat diarsipkan saat masih aktif atau berjalan." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Sesi utama tidak dapat dihapus." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Hapus lampiran atau tunggu hingga pengiriman selesai sebelum mengarsipkan atau menghapus sesi ini." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Berjalan" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identitas" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Nama" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Kunci" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Salin kunci sesi" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Jenis" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organisasi" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Grup" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Tidak ada" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Disematkan" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Diarsipkan" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Proses" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Status" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Model" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Penyedia" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Runtime" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Durasi proses" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Worktree" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Branch" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Root repositori" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Aktivitas" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Diperbarui" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Aktivitas terakhir" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Interaksi terakhir" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Proses dimulai" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Proses berakhir" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Info Sesi" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Grup" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Ubah nama…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Hapus…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Tidak ada grup" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Buat Grup" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Tambahkan Grup" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Grup Sesi" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Selesai" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Ubah Nama Grup" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Nama grup" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Ubah nama" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Batal" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Hapus “%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Hapus grup?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Hapus Grup" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Sesi dalam grup ini tidak akan lagi dikelompokkan." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway berubah. Tutup dan buka kembali Grup untuk melanjutkan." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Tidak ada agen yang tersedia di gateway ini." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Opsi Sesi Baru" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agen" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Buat di worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Ref dasar (opsional)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Coba lagi" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Buat" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Sesi tidak dapat dibuat." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Sesi baru" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Opsi sesi baru" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Belum dibaca" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Dapatkan Info…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Menghubungkan…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Coba lagi grup sesi" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Batal" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Hapus sesi yang dipilih?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Hapus Sesi" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Setiap sesi yang dipilih beserta transkripnya akan dihapus dari Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Grup" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Kelola grup sesi" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Selesai" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Pilih" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Pulihkan" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Arsipkan" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Disematkan" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Dapatkan Info…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Ganti Nama" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Sematkan" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Lepas Sematan" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Tandai Belum Dibaca" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Disematkan" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Sematkan" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Lepas Sematan" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Arsipkan" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Hapus" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Dengarkan" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Lompat ke terbaru" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "diantrekan setelah perubahan rute" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Hapus lampiran atau tunggu pengiriman selesai sebelum beralih obrolan." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Hapus lampiran atau tunggu hingga pengiriman selesai sebelum memulai obrolan baru." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway berubah sebelum operasi sesi dimulai." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Hapus lampiran atau tunggu pengiriman selesai sebelum memulai obrolan baru." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Hapus lampiran atau tunggu pengiriman selesai sebelum beralih obrolan." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Sesi Baru" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Opsi Sesi Baru…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/it.json b/apps/.i18n/native/it.json index 395dff367e6..148c5f65924 100644 --- a/apps/.i18n/native/it.json +++ b/apps/.i18n/native/it.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Rispondi a OpenClaw… (sì configura tutto)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Salta per ora" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Consigliato" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Utente" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Questa sessione non può essere archiviata mentre è attiva o in esecuzione." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "La sessione principale non può essere eliminata." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Rimuovi gli allegati o attendi la consegna prima di archiviare o eliminare questa sessione." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "In esecuzione" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identità" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Nome" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Chiave" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Copia chiave della sessione" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Tipo" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organizzazione" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Gruppo" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Nessuno" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "In evidenza" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Archiviata" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Esecuzione" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Stato" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Modello" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Provider" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Runtime" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Durata dell'esecuzione" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Worktree" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Branch" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Radice del repository" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Attività" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Aggiornato" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Ultima attività" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Ultima interazione" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Esecuzione avviata" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Esecuzione terminata" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Informazioni sulla sessione" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Gruppi" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Rinomina…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Elimina…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Nessun gruppo" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Crea gruppo" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Aggiungi gruppo" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Gruppi della sessione" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Fine" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Rinomina gruppo" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Nome del gruppo" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Rinomina" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Annulla" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Eliminare “%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Eliminare il gruppo?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Elimina gruppo" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Le sessioni in questo gruppo non saranno più raggruppate." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Il Gateway è cambiato. Chiudi e riapri Gruppi per continuare." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Nessun agente è disponibile su questo gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Opzioni nuova sessione" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agente" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Crea in un worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Riferimento di base (facoltativo)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Riprova" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Crea" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Non è stato possibile creare la sessione." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Nuova sessione" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Opzioni nuova sessione" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Da leggere" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Ottieni informazioni…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Connessione…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Riprova gruppi di sessioni" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Annulla" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Eliminare le sessioni selezionate?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Elimina sessioni" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Ogni sessione selezionata e la relativa trascrizione verranno rimosse dal Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Gruppi" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Gestisci gruppi di sessioni" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Fine" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Seleziona" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Ripristina" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Archivia" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Fissato" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Ottieni informazioni…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Rinomina" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Fissa" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Rimuovi" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Segna come non letta" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Fissato" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Fissa" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Rimuovi" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Archivia" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Elimina" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Ascolta" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Vai all'ultimo" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "in coda dopo la modifica del percorso" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Rimuovi gli allegati o attendi il completamento della consegna prima di cambiare chat." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Rimuovi gli allegati o attendi il completamento della consegna prima di iniziare una nuova chat." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Il Gateway è cambiato prima dell'inizio dell'operazione sulla sessione." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Rimuovi gli allegati o attendi il completamento della consegna prima di iniziare una nuova chat." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Rimuovi gli allegati o attendi il completamento della consegna prima di cambiare chat." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Nuova sessione" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Opzioni nuova sessione…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/ja-JP.json b/apps/.i18n/native/ja-JP.json index 0f711b64b8c..db0959fca2f 100644 --- a/apps/.i18n/native/ja-JP.json +++ b/apps/.i18n/native/ja-JP.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "OpenClawに返信…(yesですべてセットアップされます)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "今はスキップ" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "おすすめ" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "ユーザー" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "このセッションは、アクティブまたは実行中のためアーカイブできません。" + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "メインセッションは削除できません。" + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "このセッションをアーカイブまたは削除する前に、添付ファイルを削除するか、配信が完了するまでお待ちください。" + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "実行中" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "ID" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "名前" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "キー" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "セッションキーをコピー" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "種類" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "組織" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "グループ" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "なし" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "ピン留め済み" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "アーカイブ済み" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "実行" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "ステータス" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "モデル" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "プロバイダー" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "ランタイム" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "実行時間" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "ワークツリー" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "ブランチ" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "リポジトリのルート" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "アクティビティ" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "更新日時" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "最終アクティビティ" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "最終操作" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "実行開始" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "実行終了" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "セッション情報" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "グループ" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "名前を変更…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "削除…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "グループなし" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "グループを作成" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "グループを追加" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "セッショングループ" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "完了" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "グループ名を変更" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "グループ名" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "名前を変更" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "キャンセル" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "「%@」を削除しますか?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "グループを削除しますか?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "グループを削除" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "このグループ内のセッションはグループ化されていない状態になります。" + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gatewayが変更されました。続行するには「グループ」を閉じて再度開いてください。" + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "このGatewayでは利用可能なエージェントがありません。" + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "新規セッションのオプション" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "エージェント" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "ワークツリーに作成" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "ベース参照(任意)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "再試行" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "作成" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "セッションを作成できませんでした。" + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "新規セッション" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "新規セッションのオプション" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "未読" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "情報を見る…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "接続中…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "セッショングループを再試行" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "キャンセル" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "選択したセッションを削除しますか?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "セッションを削除" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "選択した各セッションとそのトランスクリプトがGatewayから削除されます。" + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "グループ" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "セッショングループを管理" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "完了" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "選択" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "復元" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "アーカイブ" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "ピン留め済み" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "情報を見る…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "名前を変更" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "ピン留め" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "ピン留めを解除" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "未読にする" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "ピン留め済み" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "ピン留め" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "ピン留めを解除" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "アーカイブ" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "削除" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "聞く" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "最新に移動" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "経路変更後にキューに追加済み" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "チャットを切り替える前に、添付ファイルを削除するか送信が完了するのを待ってください。" + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "新しいチャットを開始する前に、添付ファイルを削除するか、配信が完了するまでお待ちください。" + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "セッション操作を開始する前にGatewayが変更されました。" }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "新しいチャットを開始する前に、添付ファイルを削除するか送信が完了するのを待ってください。" }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "チャットを切り替える前に、添付ファイルを削除するか送信が完了するのを待ってください。" + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "新規セッション" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "新規セッションのオプション…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/ko.json b/apps/.i18n/native/ko.json index e3aea0e9edb..31709b79b83 100644 --- a/apps/.i18n/native/ko.json +++ b/apps/.i18n/native/ko.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "OpenClaw에 답장… (yes를 입력하면 모든 설정이 완료됩니다)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "지금은 건너뛰기" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "권장" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "사용자" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "이 세션은 활성 상태이거나 실행 중인 동안 보관할 수 없습니다." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "기본 세션은 삭제할 수 없습니다." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "이 세션을 보관하거나 삭제하기 전에 첨부 파일을 제거하거나 전송이 완료될 때까지 기다리세요." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "실행 중" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "ID" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "이름" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "키" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "세션 키 복사" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "종류" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "조직" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "그룹" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "없음" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "고정됨" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "보관됨" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "실행" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "상태" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "모델" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "제공업체" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "런타임" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "실행 시간" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Worktree" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "브랜치" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "저장소 루트" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "활동" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "업데이트됨" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "최근 활동" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "최근 상호작용" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "실행 시작" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "실행 종료" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "세션 정보" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "그룹" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "이름 변경…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "삭제…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "그룹 없음" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "그룹 생성" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "그룹 추가" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "세션 그룹" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "완료" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "그룹 이름 변경" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "그룹 이름" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "이름 변경" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "취소" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "“%@”을(를) 삭제하시겠습니까?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "그룹을 삭제하시겠습니까?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "그룹 삭제" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "이 그룹의 세션은 그룹에서 해제됩니다." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway가 변경되었습니다. 계속하려면 그룹을 닫았다가 다시 여세요." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "이 Gateway에서 사용할 수 있는 에이전트가 없습니다." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "새 세션 옵션" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "에이전트" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "워크트리에 생성" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "기준 참조(선택 사항)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "다시 시도" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "생성" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "세션을 생성할 수 없습니다." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "새 세션" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "새 세션 옵션" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "읽지 않음" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "정보 가져오기…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "연결 중…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "세션 그룹 다시 시도" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "취소" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "선택한 세션을 삭제하시겠습니까?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "세션 삭제" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "선택한 각 세션과 해당 기록이 Gateway에서 삭제됩니다." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "그룹" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "세션 그룹 관리" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "완료" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "선택" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "복원" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "보관" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "고정됨" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "정보 가져오기…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "이름 바꾸기" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "고정" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "고정 해제" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "읽지 않음으로 표시" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "고정됨" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "고정" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "고정 해제" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "보관" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "삭제" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "듣기" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "최신 항목으로 이동" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "경로 변경 후 대기열에 추가됨" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "채팅을 전환하기 전에 첨부 파일을 제거하거나 전송이 완료될 때까지 기다리세요." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "새 채팅을 시작하기 전에 첨부 파일을 제거하거나 전송이 완료될 때까지 기다리세요." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "세션 작업이 시작되기 전에 Gateway가 변경되었습니다." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "새 채팅을 시작하기 전에 첨부 파일을 제거하거나 전송이 완료될 때까지 기다리세요." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "채팅을 전환하기 전에 첨부 파일을 제거하거나 전송이 완료될 때까지 기다리세요." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "새 세션" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "새 세션 옵션…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/nl.json b/apps/.i18n/native/nl.json index ebeacd69de1..48457f1af24 100644 --- a/apps/.i18n/native/nl.json +++ b/apps/.i18n/native/nl.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Antwoord aan OpenClaw… (met ja wordt alles ingesteld)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Voor nu overslaan" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Aanbevolen" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Gebruiker" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Deze sessie kan niet worden gearchiveerd terwijl deze actief of in uitvoering is." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "De hoofdsessie kan niet worden verwijderd." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Verwijder bijlagen of wacht op de bezorging voordat u deze sessie archiveert of verwijdert." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "In uitvoering" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identiteit" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Naam" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Sleutel" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Sessiesleutel kopiëren" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Type" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organisatie" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Groep" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Geen" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Vastgezet" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Gearchiveerd" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Uitvoering" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Status" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Model" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Provider" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Runtime" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Uitvoeringsduur" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Worktree" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Branch" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Repositoryhoofdmap" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Activiteit" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Bijgewerkt" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Laatste activiteit" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Laatste interactie" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Uitvoering gestart" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Uitvoering beëindigd" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Sessie-informatie" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Groepen" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Naam wijzigen…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Verwijderen…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Geen groepen" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Groep aanmaken" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Groep toevoegen" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Sessiegroepen" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Gereed" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Groepsnaam wijzigen" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Groepsnaam" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Hernoemen" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Annuleren" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "‘%@’ verwijderen?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Groep verwijderen?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Groep verwijderen" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Sessies in deze groep worden uit de groep gehaald." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway gewijzigd. Sluit Groepen en open het opnieuw om door te gaan." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Er zijn geen agents beschikbaar op deze gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Opties voor nieuwe sessie" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agent" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Aanmaken in een worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Basisreferentie (optioneel)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Opnieuw proberen" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Aanmaken" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "De sessie kon niet worden aangemaakt." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Nieuwe sessie" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Opties voor nieuwe sessie" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Ongelezen" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Toon info…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Verbinden…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Sessiegroepen opnieuw proberen" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Annuleren" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Geselecteerde sessies verwijderen?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Sessies verwijderen" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Elke geselecteerde sessie en het bijbehorende transcript worden van de Gateway verwijderd." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Groepen" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Sessiegroepen beheren" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Gereed" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Selecteer" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Herstel" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Archiveren" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Vastgezet" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Toon info…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Hernoemen" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Vastzetten" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Losmaken" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Markeer als ongelezen" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Vastgezet" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Vastzetten" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Losmaken" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Archiveren" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Verwijder" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Luisteren" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Naar nieuwste springen" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "in wachtrij na routewijziging" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Verwijder bijlagen of wacht tot de bezorging is voltooid voordat je van chat wisselt." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Verwijder bijlagen of wacht tot de bezorging is afgerond voordat je een nieuwe chat start." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "De Gateway is gewijzigd voordat de sessiebewerking is gestart." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Verwijder bijlagen of wacht tot de bezorging is voltooid voordat je een nieuwe chat start." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Verwijder bijlagen of wacht tot de bezorging is voltooid voordat je van chat wisselt." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Nieuwe sessie" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Opties voor nieuwe sessie…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/pl.json b/apps/.i18n/native/pl.json index f8c52040a94..61a96c82dbe 100644 --- a/apps/.i18n/native/pl.json +++ b/apps/.i18n/native/pl.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Odpowiedz OpenClaw… („yes” skonfiguruje wszystko)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Pomiń na razie" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Zalecane" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Użytkownik" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Nie można zarchiwizować tej sesji, gdy jest aktywna lub uruchomiona." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Nie można usunąć sesji głównej." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Usuń załączniki lub poczekaj na ich dostarczenie przed zarchiwizowaniem albo usunięciem tej sesji." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Uruchomiona" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Tożsamość" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Nazwa" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Klucz" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Kopiuj klucz sesji" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Rodzaj" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organizacja" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Grupa" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Brak" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Przypięta" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Zarchiwizowana" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Uruchomienie" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Status" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Model" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Dostawca" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Środowisko uruchomieniowe" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Czas trwania uruchomienia" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Drzewo robocze" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Gałąź" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Katalog główny repozytorium" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Aktywność" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Zaktualizowano" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Ostatnia aktywność" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Ostatnia interakcja" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Rozpoczęcie uruchomienia" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Zakończenie uruchomienia" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Informacje o sesji" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Grupy" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Zmień nazwę…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Usuń…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Brak grup" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Utwórz grupę" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Dodaj grupę" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Grupy sesji" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Gotowe" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Zmień nazwę grupy" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Nazwa grupy" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Zmień nazwę" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Anuluj" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Usunąć „%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Usunąć grupę?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Usuń grupę" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Sesje w tej grupie przestaną być przypisane do grupy." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway został zmieniony. Zamknij i ponownie otwórz Grupy, aby kontynuować." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Na tym gatewayu nie są dostępni żadni agenci." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Opcje nowej sesji" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agent" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Utwórz w drzewie roboczym" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Referencja bazowa (opcjonalnie)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Spróbuj ponownie" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Utwórz" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Nie udało się utworzyć sesji." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Nowa sesja" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Opcje nowej sesji" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Nieprzeczytane" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Informacje…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Łączenie…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Ponów próbę wczytania grup sesji" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Anuluj" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Usunąć wybrane sesje?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Usuń sesje" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Każda wybrana sesja i jej transkrypcja zostaną usunięte z Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Grupy" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Zarządzaj grupami sesji" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Gotowe" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Wybierz" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Przywróć" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Archiwizuj" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Przypięte" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Pokaż informacje…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Zmień nazwę" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Przypnij" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Odepnij" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Oznacz jako nieprzeczytane" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Przypięte" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Przypnij" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Odepnij" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Archiwizuj" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Usuń" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Słuchaj" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Przejdź do najnowszych" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "dodano do kolejki po zmianie trasy" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Usuń załączniki lub poczekaj na zakończenie dostarczania przed przełączeniem czatów." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Usuń załączniki lub poczekaj na zakończenie dostarczania przed rozpoczęciem nowego czatu." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway zmienił się przed rozpoczęciem operacji na sesji." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Usuń załączniki lub poczekaj na zakończenie dostarczania przed rozpoczęciem nowego czatu." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Usuń załączniki lub poczekaj na zakończenie dostarczania przed przełączeniem czatów." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Nowa sesja" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Opcje nowej sesji…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/pt-BR.json b/apps/.i18n/native/pt-BR.json index 19157fc44a0..df9a4950d27 100644 --- a/apps/.i18n/native/pt-BR.json +++ b/apps/.i18n/native/pt-BR.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Responda ao OpenClaw… (sim configura tudo)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Pular por enquanto" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Recomendado" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Usuário" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Esta sessão não pode ser arquivada enquanto estiver ativa ou em execução." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "A sessão principal não pode ser excluída." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Remova os anexos ou aguarde a entrega antes de arquivar ou excluir esta sessão." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Em execução" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identidade" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Nome" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Chave" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Copiar chave da sessão" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Tipo" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organização" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Grupo" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Nenhum" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Fixada" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Arquivada" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Execução" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Status" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Modelo" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Provedor" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Ambiente de execução" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Duração da execução" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Árvore de trabalho" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Branch" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Raiz do repositório" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Atividade" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Atualizado" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Última atividade" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Última interação" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Execução iniciada" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Execução encerrada" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Informações da sessão" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Grupos" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Renomear…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Excluir…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Nenhum grupo" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Criar grupo" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Adicionar grupo" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Grupos da sessão" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Concluído" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Renomear grupo" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Nome do grupo" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Renomear" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Cancelar" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Excluir “%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Excluir grupo?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Excluir grupo" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "As sessões deste grupo ficarão sem grupo." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "O Gateway foi alterado. Feche e reabra Grupos para continuar." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Nenhum agente está disponível neste gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Opções da nova sessão" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agente" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Criar em uma worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Referência base (opcional)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Tentar novamente" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Criar" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Não foi possível criar a sessão." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Nova sessão" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Opções da nova sessão" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Não lida" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Obter informações…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Conectando…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Tentar carregar os grupos de sessões novamente" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Cancelar" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Excluir as sessões selecionadas?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Excluir sessões" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Cada sessão selecionada e sua transcrição serão removidas do gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Grupos" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Gerenciar grupos de sessões" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Concluído" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Selecionar" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Restaurar" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Arquivar" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Fixada" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Obter Informações…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Renomear" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Fixar" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Desafixar" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Marcar como não lida" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Fixada" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Fixar" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Desafixar" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Arquivar" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Excluir" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Ouvir" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Ir para a mais recente" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "na fila após alteração de rota" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Remova os anexos ou aguarde a entrega ser concluída antes de trocar de conversa." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Remova os anexos ou aguarde a conclusão da entrega antes de iniciar uma nova conversa." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "O Gateway foi alterado antes do início da operação da sessão." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Remova os anexos ou aguarde a entrega ser concluída antes de iniciar uma nova conversa." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Remova os anexos ou aguarde a entrega ser concluída antes de trocar de conversa." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Nova sessão" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Opções de Nova Sessão…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/ru.json b/apps/.i18n/native/ru.json index b85d5701a5c..4a22497f8e0 100644 --- a/apps/.i18n/native/ru.json +++ b/apps/.i18n/native/ru.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Ответьте OpenClaw… (yes настроит всё)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Пропустить пока" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Рекомендуется" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Пользователь" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Этот сеанс нельзя архивировать, пока он активен или выполняется." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Основной сеанс нельзя удалить." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Удалите вложения или дождитесь доставки, прежде чем архивировать или удалять этот сеанс." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Выполняется" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Идентификация" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Имя" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Ключ" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Скопировать ключ сеанса" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Тип" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Организация" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Группа" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Нет" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Закреплено" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "В архиве" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Запуск" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Статус" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Модель" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Провайдер" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Среда выполнения" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Длительность выполнения" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Рабочее дерево" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Ветка" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Корень репозитория" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Активность" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Обновлено" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Последняя активность" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Последнее взаимодействие" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Запуск начат" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Запуск завершён" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Информация о сеансе" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Группы" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Переименовать…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Удалить…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Нет групп" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Создать группу" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Добавить группу" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Группы сеансов" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Готово" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Переименовать группу" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Название группы" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Переименовать" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Отмена" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Удалить «%@»?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Удалить группу?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Удалить группу" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Сеансы в этой группе останутся без группы." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway изменён. Закройте и снова откройте раздел «Группы», чтобы продолжить." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "На этом Gateway нет доступных агентов." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Параметры нового сеанса" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Агент" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Создать в рабочем дереве" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Базовая ссылка (необязательно)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Повторить" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Создать" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Не удалось создать сеанс." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Новая сессия" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Параметры нового сеанса" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Непрочитанное" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Сведения…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Подключение…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Повторить загрузку групп сеансов" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Отмена" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Удалить выбранные сеансы?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Удалить сеансы" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Все выбранные сеансы и их расшифровки будут удалены из Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Группы" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Управление группами сеансов" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Готово" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Выбрать" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Восстановить" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Архивировать" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Закреплено" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Сведения…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Переименовать" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Закрепить" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Открепить" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Отметить как непрочитанное" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Закреплено" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Закрепить" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Открепить" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Архивировать" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Удалить" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Слушать" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Перейти к последнему" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "поставлено в очередь после изменения маршрута" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Удалите вложения или дождитесь доставки, прежде чем переключать чаты." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Удалите вложения или дождитесь завершения доставки, прежде чем начинать новый чат." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway изменился до начала операции с сеансом." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Удалите вложения или дождитесь доставки, прежде чем начинать новый чат." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Удалите вложения или дождитесь доставки, прежде чем переключать чаты." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Новая сессия" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Параметры нового сеанса…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/sv.json b/apps/.i18n/native/sv.json index 82875ddfbac..098563ec96e 100644 --- a/apps/.i18n/native/sv.json +++ b/apps/.i18n/native/sv.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Svara OpenClaw… (ja konfigurerar allt)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Hoppa över tills vidare" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Rekommenderas" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Användare" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Den här sessionen kan inte arkiveras medan den är aktiv eller körs." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Huvudsessionen kan inte tas bort." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Ta bort bilagor eller vänta på leverans innan du arkiverar eller tar bort den här sessionen." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Körs" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Identitet" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Namn" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Nyckel" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Kopiera sessionsnyckel" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Typ" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Organisation" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Grupp" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Ingen" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Fäst" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Arkiverad" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Körning" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Status" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Modell" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Leverantör" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Körmiljö" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Körtid" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Arbetskopia" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Gren" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Repositoriets rot" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Aktivitet" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Uppdaterad" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Senaste aktivitet" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Senaste interaktion" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Körning startad" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Körning avslutad" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Sessionsinformation" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Grupper" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Byt namn…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Radera…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Inga grupper" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Skapa grupp" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Lägg till grupp" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Sessionsgrupper" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Klar" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Byt namn på grupp" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Gruppnamn" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Byt namn" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Avbryt" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Ta bort ”%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Ta bort gruppen?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Ta bort grupp" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Sessioner i den här gruppen blir ogrupperade." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway har ändrats. Stäng och öppna Grupper igen för att fortsätta." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Inga agenter är tillgängliga på denna gateway." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Alternativ för ny session" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Agent" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Skapa i ett arbetsträd" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Basreferens (valfritt)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Försök igen" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Skapa" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Sessionen kunde inte skapas." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Ny session" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Alternativ för ny session" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Oläst" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Visa info…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Ansluter…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Försök läsa in sessionsgrupper igen" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Avbryt" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Ta bort valda sessioner?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Ta bort sessioner" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Varje vald session och dess transkription tas bort från Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Grupper" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Hantera sessionsgrupper" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Klar" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Välj" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Återställ" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Arkivera" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Fästa" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Visa info…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Byt namn" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Fäst" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Lossa" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Markera som oläst" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Fästa" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Fäst" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Lossa" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Arkivera" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Radera" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Lyssna" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Hoppa till senaste" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "köad efter ruttändring" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Ta bort bilagor eller vänta på att leveransen slutförs innan du byter chatt." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Ta bort bilagor eller vänta tills leveransen är klar innan du startar en ny chatt." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway ändrades innan sessionsåtgärden startade." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Ta bort bilagor eller vänta på att leveransen slutförs innan du startar en ny chatt." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Ta bort bilagor eller vänta på att leveransen slutförs innan du byter chatt." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Ny session" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Alternativ för ny session…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/th.json b/apps/.i18n/native/th.json index 5bf285935c3..2b2987b5bf6 100644 --- a/apps/.i18n/native/th.json +++ b/apps/.i18n/native/th.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "ตอบกลับ OpenClaw… (พิมพ์ yes เพื่อตั้งค่าทุกอย่าง)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "ข้ามไปก่อน" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "แนะนำ" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "ผู้ใช้" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "ไม่สามารถเก็บเซสชันนี้เข้าคลังขณะที่ยังใช้งานหรือกำลังทำงานอยู่ได้" + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "ไม่สามารถลบเซสชันหลักได้" + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "นำไฟล์แนบออกหรือรอให้ส่งเสร็จก่อนเก็บเซสชันนี้เข้าคลังหรือลบ" + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "กำลังทำงาน" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "ข้อมูลประจำตัว" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "ชื่อ" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "คีย์" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "คัดลอกคีย์เซสชัน" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "ประเภท" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "องค์กร" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "กลุ่ม" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "ไม่มี" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "ปักหมุดแล้ว" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "เก็บเข้าคลังแล้ว" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "การทำงาน" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "สถานะ" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "โมเดล" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "ผู้ให้บริการ" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "รันไทม์" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "ระยะเวลาการทำงาน" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Worktree" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "สาขา" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "รากของ Repository" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "กิจกรรม" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "อัปเดตแล้ว" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "กิจกรรมล่าสุด" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "การโต้ตอบล่าสุด" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "เริ่มการทำงาน" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "สิ้นสุดการทำงาน" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "ข้อมูลเซสชัน" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "กลุ่ม" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "เปลี่ยนชื่อ…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "ลบ…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "ไม่มีกลุ่ม" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "สร้างกลุ่ม" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "เพิ่มกลุ่ม" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "กลุ่มเซสชัน" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "เสร็จสิ้น" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "เปลี่ยนชื่อกลุ่ม" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "ชื่อกลุ่ม" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "เปลี่ยนชื่อ" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "ยกเลิก" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "ลบ “%@” หรือไม่?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "ลบกลุ่มหรือไม่?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "ลบกลุ่ม" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "เซสชันในกลุ่มนี้จะไม่อยู่ในกลุ่มใด" + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway มีการเปลี่ยนแปลง ปิดแล้วเปิดกลุ่มอีกครั้งเพื่อดำเนินการต่อ" + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "ไม่มีเอเจนต์ที่พร้อมใช้งานบน Gateway นี้" + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "ตัวเลือกเซสชันใหม่" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "เอเจนต์" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "สร้างใน worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Base ref (ไม่บังคับ)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "ลองอีกครั้ง" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "สร้าง" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "ไม่สามารถสร้างเซสชันได้" + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "เซสชันใหม่" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "ตัวเลือกเซสชันใหม่" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "ยังไม่ได้อ่าน" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "ดูข้อมูล…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "กำลังเชื่อมต่อ…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "ลองโหลดกลุ่มเซสชันอีกครั้ง" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "ยกเลิก" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "ลบเซสชันที่เลือกหรือไม่?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "ลบเซสชัน" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "เซสชันที่เลือกแต่ละรายการและบันทึกการสนทนาจะถูกลบออกจาก Gateway" + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "กลุ่ม" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "จัดการกลุ่มเซสชัน" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "เสร็จสิ้น" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "เลือก" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "กู้คืน" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "เก็บถาวร" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "ปักหมุดแล้ว" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "ดูข้อมูล…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "เปลี่ยนชื่อ" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "ปักหมุด" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "เลิกปักหมุด" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "ทำเครื่องหมายว่ายังไม่ได้อ่าน" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "ปักหมุดแล้ว" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "ปักหมุด" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "เลิกปักหมุด" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "เก็บถาวร" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "ลบ" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "ฟัง" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "ข้ามไปยังล่าสุด" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "อยู่ในคิวหลังจากเปลี่ยนเส้นทาง" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "ลบไฟล์แนบหรือรอให้การส่งเสร็จสิ้นก่อนสลับแชท" + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "นำไฟล์แนบออกหรือรอให้การส่งเสร็จสิ้นก่อนเริ่มแชตใหม่" + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway มีการเปลี่ยนแปลงก่อนเริ่มดำเนินการกับเซสชัน" }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "ลบไฟล์แนบหรือรอให้การส่งเสร็จสิ้นก่อนเริ่มแชทใหม่" }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "ลบไฟล์แนบหรือรอให้การส่งเสร็จสิ้นก่อนสลับแชท" + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "เซสชันใหม่" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "ตัวเลือกเซสชันใหม่…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/tr.json b/apps/.i18n/native/tr.json index a34847d4884..c2fd594d1f1 100644 --- a/apps/.i18n/native/tr.json +++ b/apps/.i18n/native/tr.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "OpenClaw'a yanıt verin… (evet, her şeyi ayarlar)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Şimdilik atla" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Önerilen" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Kullanıcı" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Bu oturum etkinken veya çalışırken arşivlenemez." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Ana oturum silinemez." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Bu oturumu arşivlemeden veya silmeden önce ekleri kaldırın ya da teslim edilmelerini bekleyin." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Çalışıyor" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Kimlik" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Ad" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Anahtar" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Oturum anahtarını kopyala" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Tür" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Kuruluş" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Grup" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Yok" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Sabitlenmiş" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Arşivlenmiş" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Çalıştırma" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Durum" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Model" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Sağlayıcı" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Çalışma zamanı" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Çalıştırma süresi" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Çalışma ağacı" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "Kimlik" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Dal" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Depo kökü" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Etkinlik" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Güncellendi" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Son etkinlik" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Son etkileşim" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Çalıştırma başladı" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Çalıştırma sona erdi" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Oturum Bilgileri" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Gruplar" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Yeniden adlandır…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Sil…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Grup yok" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Grup Oluştur" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Grup Ekle" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Oturum Grupları" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Bitti" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Grubu Yeniden Adlandır" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Grup adı" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Yeniden Adlandır" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "İptal" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "“%@” silinsin mi?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Grup silinsin mi?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Grubu Sil" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Bu gruptaki oturumlar gruptan çıkarılır." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway değişti. Devam etmek için Gruplar'ı kapatıp yeniden açın." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Bu Gateway'de kullanılabilir aracı yok." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Yeni Oturum Seçenekleri" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Aracı" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Bir worktree içinde oluştur" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Temel ref (isteğe bağlı)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Yeniden Dene" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Oluştur" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Oturum oluşturulamadı." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Yeni oturum" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Yeni oturum seçenekleri" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Okunmamış" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Bilgi Al…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Bağlanıyor…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Oturum gruplarını yeniden dene" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "İptal" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Seçili oturumlar silinsin mi?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Oturumları Sil" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Seçili her oturum ve dökümü gateway'den kaldırılacaktır." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Gruplar" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Oturum gruplarını yönet" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Bitti" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Seç" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Geri Yükle" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Arşivle" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Sabitlenmiş" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Bilgi Al…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Yeniden Adlandır" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Sabitle" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Sabitlemeyi Kaldır" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Okunmadı Olarak İşaretle" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Sabitlenmiş" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Sabitle" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Sabitlemeyi Kaldır" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Arşivle" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Sil" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Dinle" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "En yeniye atla" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "rota değişikliğinden sonra kuyruğa alındı" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Sohbetleri değiştirmeden önce ekleri kaldırın veya teslimatın tamamlanmasını bekleyin." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Yeni bir sohbet başlatmadan önce ekleri kaldırın veya teslimatın tamamlanmasını bekleyin." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Oturum işlemi başlamadan önce Gateway değişti." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Yeni bir sohbet başlatmadan önce ekleri kaldırın veya teslimatın tamamlanmasını bekleyin." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Sohbetleri değiştirmeden önce ekleri kaldırın veya teslimatın tamamlanmasını bekleyin." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Yeni Oturum" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Yeni Oturum Seçenekleri…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/uk.json b/apps/.i18n/native/uk.json index bbdbab70e4d..875502dbcc0 100644 --- a/apps/.i18n/native/uk.json +++ b/apps/.i18n/native/uk.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Відповісти OpenClaw… (так налаштує все)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Пропустити зараз" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Рекомендовано" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Користувач" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Цей сеанс не можна архівувати, доки він активний або виконується." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Основний сеанс не можна видалити." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Видаліть вкладення або дочекайтеся їх доставлення, перш ніж архівувати чи видаляти цей сеанс." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Виконується" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Ідентифікація" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Назва" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Ключ" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Копіювати ключ сеансу" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Тип" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Організація" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Група" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Немає" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Закріплено" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Заархівовано" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Запуск" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Статус" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Модель" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Постачальник" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Середовище виконання" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Тривалість виконання" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Робоче дерево" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Гілка" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Корінь репозиторію" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Активність" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Оновлено" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Остання активність" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Остання взаємодія" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Запуск розпочато" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Запуск завершено" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Відомості про сеанс" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Групи" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Перейменувати…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Видалити…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Немає груп" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Створити групу" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Додати групу" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Групи сеансів" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Готово" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Перейменувати групу" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Назва групи" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Перейменувати" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Скасувати" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Видалити «%@»?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Видалити групу?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Видалити групу" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Сеанси в цій групі більше не будуть згруповані." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway змінено. Закрийте й знову відкрийте розділ «Групи», щоб продовжити." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "На цьому шлюзі немає доступних агентів." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Параметри нового сеансу" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Агент" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Створити в робочому дереві" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Базове посилання (необов’язково)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Повторити" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Створити" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Не вдалося створити сеанс." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Новий сеанс" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Параметри нового сеансу" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Непрочитане" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Переглянути інформацію…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Підключення…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Повторити завантаження груп сеансів" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Скасувати" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Видалити вибрані сеанси?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Видалити сеанси" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Кожен вибраний сеанс і його стенограму буде видалено з Gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Групи" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Керувати групами сеансів" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Готово" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Вибрати" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Відновити" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Архівувати" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Закріплено" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Отримати інформацію…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Перейменувати" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Закріпити" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Відкріпити" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Позначити непрочитаним" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Закріплено" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Закріпити" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Відкріпити" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Архівувати" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Видалити" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Слухати" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Перейти до останнього" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "поставлено в чергу після зміни маршруту" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Видаліть вкладення або зачекайте на завершення доставлення, перш ніж перемикати чати." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Видаліть вкладення або дочекайтеся завершення доставки, перш ніж починати новий чат." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway змінився до початку операції із сеансом." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Видаліть вкладення або зачекайте на завершення доставлення, перш ніж починати новий чат." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Видаліть вкладення або зачекайте на завершення доставлення, перш ніж перемикати чати." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Нова сесія" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Параметри нового сеансу…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/vi.json b/apps/.i18n/native/vi.json index 1e4200348a2..e189bf76f7b 100644 --- a/apps/.i18n/native/vi.json +++ b/apps/.i18n/native/vi.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "Trả lời OpenClaw… (chọn có để thiết lập mọi thứ)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "Bỏ qua lúc này" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "Được đề xuất" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "Người dùng" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "Không thể lưu trữ phiên này khi phiên đang hoạt động hoặc đang chạy." + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "Không thể xóa phiên chính." + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "Hãy xóa tệp đính kèm hoặc chờ gửi xong trước khi lưu trữ hoặc xóa phiên này." + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "Đang chạy" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "Danh tính" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "Tên" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "Khóa" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "Sao chép khóa phiên" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "Loại" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "Tổ chức" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "Nhóm" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "Không có" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "Đã ghim" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "Đã lưu trữ" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "Lần chạy" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "Trạng thái" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "Mô hình" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "Nhà cung cấp" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "Môi trường chạy" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "Thời lượng chạy" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "Worktree" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "Nhánh" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "Thư mục gốc của kho lưu trữ" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "Hoạt động" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "Đã cập nhật" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "Hoạt động gần nhất" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "Lần tương tác gần nhất" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "Lượt chạy đã bắt đầu" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "Lượt chạy đã kết thúc" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "Thông tin phiên" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "Nhóm" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "Đổi tên…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "Xóa…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "Không có nhóm" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "Tạo nhóm" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "Thêm nhóm" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "Nhóm phiên" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "Xong" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "Đổi tên nhóm" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "Tên nhóm" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "Đổi tên" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "Hủy" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "Xóa “%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "Xóa nhóm?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "Xóa nhóm" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "Các phiên trong nhóm này sẽ không còn thuộc nhóm nào." + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway đã thay đổi. Hãy đóng rồi mở lại Nhóm để tiếp tục." + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "Không có tác nhân nào khả dụng trên gateway này." + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "Tùy chọn phiên mới" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "Tác nhân" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "Tạo trong một worktree" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "Tham chiếu cơ sở (không bắt buộc)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "Thử lại" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "Tạo" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "Không thể tạo phiên." + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "Phiên mới" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "Tùy chọn phiên mới" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "Chưa đọc" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "Xem thông tin…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "Đang kết nối…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "Thử tải lại các nhóm phiên" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "Hủy" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "Xóa các phiên đã chọn?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "Xóa các phiên" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "Mỗi phiên đã chọn và bản ghi của phiên đó sẽ bị xóa khỏi gateway." + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "Nhóm" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "Quản lý nhóm phiên" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "Xong" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "Chọn" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "Khôi phục" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "Lưu trữ" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "Đã ghim" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "Xem thông tin…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "Đổi tên" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "Ghim" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "Bỏ ghim" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "Đánh dấu là chưa đọc" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "Đã ghim" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "Ghim" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "Bỏ ghim" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "Lưu trữ" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "Xóa" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "Nghe" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "Chuyển đến mới nhất" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "đã đưa vào hàng đợi sau khi thay đổi tuyến" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "Gỡ tệp đính kèm hoặc chờ gửi xong trước khi chuyển cuộc trò chuyện." + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "Xóa tệp đính kèm hoặc chờ quá trình gửi hoàn tất trước khi bắt đầu cuộc trò chuyện mới." + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway đã thay đổi trước khi thao tác phiên bắt đầu." }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "Gỡ tệp đính kèm hoặc chờ gửi xong trước khi bắt đầu cuộc trò chuyện mới." }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "Gỡ tệp đính kèm hoặc chờ gửi xong trước khi chuyển cuộc trò chuyện." + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "Phiên Mới" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "Tùy chọn phiên mới…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/zh-CN.json b/apps/.i18n/native/zh-CN.json index 59c85e46326..58cf30eaf3e 100644 --- a/apps/.i18n/native/zh-CN.json +++ b/apps/.i18n/native/zh-CN.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "回复 OpenClaw…(回复 yes 即可完成所有设置)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "暂时跳过" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "推荐" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "用户" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "此会话处于活动或运行状态时无法归档。" + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "无法删除主会话。" + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "请移除附件或等待其发送完成,然后再归档或删除此会话。" + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "运行中" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "身份" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "名称" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "密钥" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "复制会话密钥" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "类型" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "组织" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "群组" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "无" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "已置顶" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "已归档" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "运行" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "状态" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "模型" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "提供商" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "运行时" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "运行时长" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "工作树" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "分支" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "仓库根目录" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "活动" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "更新时间" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "最近活动" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "最近交互" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "运行开始时间" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "运行结束时间" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "会话信息" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "群组" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "重命名…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "删除…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "无群组" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "创建群组" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "添加群组" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "会话群组" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "完成" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "重命名群组" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "群组名称" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "重命名" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "取消" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "删除“%@”?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "删除群组?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "删除群组" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "此群组中的会话将变为未分组状态。" + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway 已更改。请关闭并重新打开“群组”以继续。" + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "此 Gateway 上没有可用的代理。" + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "新建会话选项" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "代理" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "在工作树中创建" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "基础引用(可选)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "重试" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "创建" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "无法创建会话。" + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "新建会话" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "新建会话选项" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "未读" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "显示简介…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "正在连接…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "重试加载会话群组" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "取消" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "删除所选会话?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "删除会话" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "每个所选会话及其转录记录都将从 Gateway 中移除。" + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "群组" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "管理会话分组" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "完成" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "选择" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "恢复" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "归档" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "已置顶" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "显示简介…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "重命名" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "置顶" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "取消置顶" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "标为未读" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "已置顶" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "置顶" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "取消置顶" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "归档" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "删除" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "聆听" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "跳转到最新" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "路由更改后已排队" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "请移除附件或等待发送完成后再切换聊天。" + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "请移除附件或等待发送完成后,再开始新聊天。" + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway 在会话操作开始前已更改。" }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "请移除附件或等待发送完成后再开始新聊天。" }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "请移除附件或等待发送完成后再切换聊天。" + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "新建会话" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "新建会话选项…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/.i18n/native/zh-TW.json b/apps/.i18n/native/zh-TW.json index 5456d8f418e..84e0f23d2f9 100644 --- a/apps/.i18n/native/zh-TW.json +++ b/apps/.i18n/native/zh-TW.json @@ -20193,6 +20193,16 @@ "source": "Reply to OpenClaw… (yes sets everything up)", "translated": "回覆 OpenClaw…(輸入 yes 即可完成所有設定)" }, + { + "id": "native.apple.134b9ae1d8a543df", + "source": "Skip for now", + "translated": "暫時略過" + }, + { + "id": "native.apple.5435391fa338f227", + "source": "Recommended", + "translated": "建議" + }, { "id": "native.apple.78d1ad73762a7ce8", "source": "Connect your AI", @@ -23003,6 +23013,286 @@ "source": "User", "translated": "使用者" }, + { + "id": "native.apple.b1cdcb906a43d5d6", + "source": "This session cannot be archived while it is active or running.", + "translated": "此工作階段在作用中或執行中時無法封存。" + }, + { + "id": "native.apple.5817e3f3dab1ee19", + "source": "The main session cannot be deleted.", + "translated": "無法刪除主要工作階段。" + }, + { + "id": "native.apple.a6b8df3f18171c91", + "source": "Remove attachments or wait for delivery before archiving or deleting this session.", + "translated": "請先移除附件或等待傳送完成,再封存或刪除此工作階段。" + }, + { + "id": "native.apple.476b3862e0449857", + "source": "Running", + "translated": "執行中" + }, + { + "id": "native.apple.83b41e41f428cffb", + "source": "Identity", + "translated": "身分" + }, + { + "id": "native.apple.ba6710da42846eed", + "source": "Name", + "translated": "名稱" + }, + { + "id": "native.apple.bdb1928f7e63c4c6", + "source": "Key", + "translated": "金鑰" + }, + { + "id": "native.apple.7259d51423f8def0", + "source": "Copy session key", + "translated": "複製工作階段金鑰" + }, + { + "id": "native.apple.1494b638984ddca3", + "source": "Kind", + "translated": "類型" + }, + { + "id": "native.apple.49cd6c21bdd0d8da", + "source": "Organization", + "translated": "組織" + }, + { + "id": "native.apple.83e2ae5c4c7dbb94", + "source": "Group", + "translated": "群組" + }, + { + "id": "native.apple.1ba465bfa16ed23b", + "source": "None", + "translated": "無" + }, + { + "id": "native.apple.2c7c9e5dc8ad574e", + "source": "Pinned", + "translated": "已釘選" + }, + { + "id": "native.apple.b0d3e265af9f562a", + "source": "Archived", + "translated": "已封存" + }, + { + "id": "native.apple.de94ca2cf7d4d766", + "source": "Run", + "translated": "執行" + }, + { + "id": "native.apple.f7a51dca3268b26c", + "source": "Status", + "translated": "狀態" + }, + { + "id": "native.apple.12678de5fa43321d", + "source": "Model", + "translated": "模型" + }, + { + "id": "native.apple.8ec6bd6001df285d", + "source": "Provider", + "translated": "提供者" + }, + { + "id": "native.apple.f43534cf1ee73605", + "source": "Runtime", + "translated": "執行階段" + }, + { + "id": "native.apple.f0775e602bbe75ed", + "source": "Run duration", + "translated": "執行時間" + }, + { + "id": "native.apple.ecde91d89eab026b", + "source": "Worktree", + "translated": "工作樹" + }, + { + "id": "native.apple.1ef1698bb3ff7166", + "source": "ID", + "translated": "ID" + }, + { + "id": "native.apple.69bc49f9663fa205", + "source": "Branch", + "translated": "分支" + }, + { + "id": "native.apple.aa430e81e52e2354", + "source": "Repository root", + "translated": "儲存庫根目錄" + }, + { + "id": "native.apple.6e851b012a982d38", + "source": "Activity", + "translated": "活動" + }, + { + "id": "native.apple.bf87c6fd92c9315a", + "source": "Updated", + "translated": "已更新" + }, + { + "id": "native.apple.dcb1734cba578b79", + "source": "Last activity", + "translated": "最近活動" + }, + { + "id": "native.apple.58ca290e3f032865", + "source": "Last interaction", + "translated": "最近互動" + }, + { + "id": "native.apple.7020bd521499f3b8", + "source": "Run started", + "translated": "執行開始時間" + }, + { + "id": "native.apple.abb2b24d6378b605", + "source": "Run ended", + "translated": "執行結束時間" + }, + { + "id": "native.apple.cd7c3095a22f80a9", + "source": "Session Info", + "translated": "工作階段資訊" + }, + { + "id": "native.apple.e308b012d84b3b3e", + "source": "Groups", + "translated": "群組" + }, + { + "id": "native.apple.6438f66cfcaefaf7", + "source": "Rename…", + "translated": "重新命名…" + }, + { + "id": "native.apple.58b0f1df4985b0d1", + "source": "Delete…", + "translated": "刪除…" + }, + { + "id": "native.apple.bc70cc0f0b882179", + "source": "No groups", + "translated": "沒有群組" + }, + { + "id": "native.apple.cb3e1fa7783a35d2", + "source": "Create Group", + "translated": "建立群組" + }, + { + "id": "native.apple.4ac72aeb70f107d8", + "source": "Add Group", + "translated": "加入群組" + }, + { + "id": "native.apple.23d628606fe0734f", + "source": "Session Groups", + "translated": "工作階段群組" + }, + { + "id": "native.apple.7777b2d2ec43ed59", + "source": "Done", + "translated": "完成" + }, + { + "id": "native.apple.0b0149661cacfe36", + "source": "Rename Group", + "translated": "重新命名群組" + }, + { + "id": "native.apple.8cbd863aa4d0524f", + "source": "Group name", + "translated": "群組名稱" + }, + { + "id": "native.apple.6021088d5ed9c301", + "source": "Rename", + "translated": "重新命名" + }, + { + "id": "native.apple.e697417338a47751", + "source": "Cancel", + "translated": "取消" + }, + { + "id": "native.apple.cc89328a14af7a23", + "source": "Delete “%@”?", + "translated": "刪除「%@」?" + }, + { + "id": "native.apple.4c09741db2e6c624", + "source": "Delete group?", + "translated": "刪除群組?" + }, + { + "id": "native.apple.ddb1bbbd3c1a9c5e", + "source": "Delete Group", + "translated": "刪除群組" + }, + { + "id": "native.apple.b049c8a4d2805e08", + "source": "Sessions in this group become ungrouped.", + "translated": "此群組中的工作階段將變為未分組。" + }, + { + "id": "native.apple.5aa6082d78027c5f", + "source": "Gateway changed. Close and reopen Groups to continue.", + "translated": "Gateway 已變更。請關閉並重新開啟「群組」以繼續。" + }, + { + "id": "native.apple.bb4b44183929c881", + "source": "No agents are available on this gateway.", + "translated": "此 Gateway 上沒有可用的代理程式。" + }, + { + "id": "native.apple.6c89f35d53506406", + "source": "New Session Options", + "translated": "新工作階段選項" + }, + { + "id": "native.apple.5b0cde807ccb4241", + "source": "Agent", + "translated": "代理程式" + }, + { + "id": "native.apple.124a640f9620d9cd", + "source": "Create in a worktree", + "translated": "在工作樹中建立" + }, + { + "id": "native.apple.632ce245d5575fea", + "source": "Base ref (optional)", + "translated": "基礎參照(選填)" + }, + { + "id": "native.apple.fd81909fc9719a59", + "source": "Retry", + "translated": "重試" + }, + { + "id": "native.apple.a085278be62286b2", + "source": "Create", + "translated": "建立" + }, + { + "id": "native.apple.795ba37f6782cf28", + "source": "The session could not be created.", + "translated": "無法建立工作階段。" + }, { "id": "native.apple.8ec708a3605a2cc3", "source": "Search sessions", @@ -23028,6 +23318,11 @@ "source": "New session", "translated": "新增工作階段" }, + { + "id": "native.apple.2ef0e34db02ad255", + "source": "New session options", + "translated": "新工作階段選項" + }, { "id": "native.apple.36753ef2f1ed4264", "source": "Rename Session", @@ -23078,6 +23373,11 @@ "source": "Unread", "translated": "未讀" }, + { + "id": "native.apple.f57a4b9c14d31867", + "source": "Get Info…", + "translated": "取得資訊…" + }, { "id": "native.apple.a174cb1027a9b881", "source": "Rename…", @@ -23138,6 +23438,11 @@ "source": "Connecting…", "translated": "連線中…" }, + { + "id": "native.apple.79f708b3bc1d3a6c", + "source": "Retry session groups", + "translated": "重試工作階段群組" + }, { "id": "native.apple.63320b6d5138c0db", "source": "Pinned", @@ -23183,6 +23488,41 @@ "source": "Cancel", "translated": "取消" }, + { + "id": "native.apple.751e0f6b81cd374a", + "source": "Delete selected sessions?", + "translated": "刪除所選的工作階段?" + }, + { + "id": "native.apple.aa679276581b0058", + "source": "Delete Sessions", + "translated": "刪除工作階段" + }, + { + "id": "native.apple.f837129cbee23297", + "source": "Each selected session and its transcript will be removed from the gateway.", + "translated": "每個所選的工作階段及其逐字稿都將從 Gateway 中移除。" + }, + { + "id": "native.apple.bf09df5e38a7a950", + "source": "Groups", + "translated": "群組" + }, + { + "id": "native.apple.64013cfee5e25305", + "source": "Manage session groups", + "translated": "管理工作階段群組" + }, + { + "id": "native.apple.185f4688f98e244e", + "source": "Done", + "translated": "完成" + }, + { + "id": "native.apple.58133fc5791847e6", + "source": "Select", + "translated": "選取" + }, { "id": "native.apple.b67eaecec1b423ac", "source": "No archived sessions", @@ -23199,30 +23539,15 @@ "translated": "復原" }, { - "id": "native.apple.666ba6eb696e649f", - "source": "Archive", - "translated": "封存" - }, - { - "id": "native.apple.05cb1fecc5844b69", - "source": "Pinned", - "translated": "已釘選" + "id": "native.apple.158cfa096c57bcb9", + "source": "Get Info…", + "translated": "取得資訊…" }, { "id": "native.apple.080fce25e4a9bb61", "source": "Rename", "translated": "重新命名" }, - { - "id": "native.apple.d148288258094aa6", - "source": "Pin", - "translated": "釘選" - }, - { - "id": "native.apple.3c62aaf44e6ab4d4", - "source": "Unpin", - "translated": "取消釘選" - }, { "id": "native.apple.6de479e9d780869a", "source": "Fork", @@ -23238,6 +23563,31 @@ "source": "Mark Unread", "translated": "標示為未讀" }, + { + "id": "native.apple.05cb1fecc5844b69", + "source": "Pinned", + "translated": "已釘選" + }, + { + "id": "native.apple.d148288258094aa6", + "source": "Pin", + "translated": "釘選" + }, + { + "id": "native.apple.3c62aaf44e6ab4d4", + "source": "Unpin", + "translated": "取消釘選" + }, + { + "id": "native.apple.666ba6eb696e649f", + "source": "Archive", + "translated": "封存" + }, + { + "id": "native.apple.b09b91392835fe58", + "source": "Delete", + "translated": "刪除" + }, { "id": "native.apple.946b677d8dbf0f37", "source": "Hide talk transcript", @@ -23298,11 +23648,6 @@ "source": "Listen", "translated": "聆聽" }, - { - "id": "native.apple.f84b674ad395b694", - "source": "Jump to latest", - "translated": "跳至最新內容" - }, { "id": "native.apple.429d825201b2cb85", "source": "Jump to latest reply", @@ -23399,15 +23744,25 @@ "translated": "路由變更後已排入佇列" }, { - "id": "native.apple.710c7bd117a7cc12", - "source": "Remove attachments or wait for delivery to resolve before switching chats.", - "translated": "請先移除附件或等待傳送完成,再切換聊天。" + "id": "native.apple.787047d0da6b8b9f", + "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", + "translated": "請移除附件,或等待傳送問題解決後再開始新的聊天。" + }, + { + "id": "native.apple.980f552bb0f96c0f", + "source": "Gateway changed before the session operation started.", + "translated": "Gateway 在工作階段操作開始前已變更。" }, { "id": "native.apple.d93e6fe16ec1b0e5", "source": "Remove attachments or wait for delivery to resolve before starting a new chat.", "translated": "請先移除附件或等待傳送完成,再開始新的聊天。" }, + { + "id": "native.apple.710c7bd117a7cc12", + "source": "Remove attachments or wait for delivery to resolve before switching chats.", + "translated": "請先移除附件或等待傳送完成,再切換聊天。" + }, { "id": "native.apple.87ba543b42696b92", "source": "Clear this session's history?", @@ -23528,6 +23883,11 @@ "source": "New Session", "translated": "新增工作階段" }, + { + "id": "native.apple.a7119fbf9d25df5e", + "source": "New Session Options…", + "translated": "新增工作階段選項…" + }, { "id": "native.apple.5361129a24118af6", "source": "Refresh", diff --git a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt b/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt index e5a43d3a88e..0a0d9bbc33f 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/gateway/GatewayProtocol.kt @@ -303,6 +303,8 @@ enum class GatewayMethod( SessionsCompactionGet("sessions.compaction.get"), SessionsCompactionBranch("sessions.compaction.branch"), SessionsCompactionRestore("sessions.compaction.restore"), + SessionsRewind("sessions.rewind"), + SessionsFork("sessions.fork"), SessionsCreate("sessions.create"), SessionsSend("sessions.send"), SessionsAbort("sessions.abort"), diff --git a/apps/android/app/src/main/res/values-es/strings.xml b/apps/android/app/src/main/res/values-es/strings.xml index 68d4c2bc87d..c3d8bd043f9 100644 --- a/apps/android/app/src/main/res/values-es/strings.xml +++ b/apps/android/app/src/main/res/values-es/strings.xml @@ -619,7 +619,7 @@ "Compartir mensaje" "Genera un código QR." "Altavoz activado" - "¿Eliminar grupo?" + "¿Eliminar el grupo?" "Falta" "Buscar propuestas" "stop" @@ -1081,7 +1081,7 @@ "%1$s %2$s" "Automatización habilitada." "Memory Get" - "Archivadas" + "Archivada" "Recargar" "Buscar automatizaciones" "Los teléfonos vinculados y los hosts de nodos aparecerán aquí después del emparejamiento." diff --git a/apps/android/app/src/main/res/values-fr/strings.xml b/apps/android/app/src/main/res/values-fr/strings.xml index 133b57313e4..4d7108f158c 100644 --- a/apps/android/app/src/main/res/values-fr/strings.xml +++ b/apps/android/app/src/main/res/values-fr/strings.xml @@ -850,7 +850,7 @@ "En attente d’association" "Démarrer ou poursuivre une conversation" "Aucune tâche planifiée" - "Statut" + "État" "Nœud OpenClaw · Connecté" "Actif" "Afficher l’état de débogage du partage d’écran." diff --git a/apps/android/app/src/main/res/values-hi/strings.xml b/apps/android/app/src/main/res/values-hi/strings.xml index 5012908490a..67336ee8b44 100644 --- a/apps/android/app/src/main/res/values-hi/strings.xml +++ b/apps/android/app/src/main/res/values-hi/strings.xml @@ -619,7 +619,7 @@ "संदेश साझा करें" "QR कोड जनरेट करें।" "स्पीकर चालू है" - "समूह हटाएं?" + "समूह हटाएँ?" "अनुपलब्ध" "प्रस्ताव खोजें" "stop" diff --git a/apps/android/app/src/main/res/values-it/strings.xml b/apps/android/app/src/main/res/values-it/strings.xml index 0203da9880e..00ef037d504 100644 --- a/apps/android/app/src/main/res/values-it/strings.xml +++ b/apps/android/app/src/main/res/values-it/strings.xml @@ -1393,7 +1393,7 @@ "Scansiona il codice QR per abbinare" "Approvazione negata." "Impossibile esaminare la proposta di Skill Workshop." - "Fissato" + "In evidenza" "Profilo e dispositivo" "Chiudi selettore livello di riflessione" "Impossibile mettere il messaggio in coda per inviarlo in seguito." diff --git a/apps/android/app/src/main/res/values-th/strings.xml b/apps/android/app/src/main/res/values-th/strings.xml index a25260c5a73..8205bfe7945 100644 --- a/apps/android/app/src/main/res/values-th/strings.xml +++ b/apps/android/app/src/main/res/values-th/strings.xml @@ -347,7 +347,7 @@ "ระบบทั้งหมดทำงานตามปกติ" "ไม่สามารถเข้าถึง Gateway ได้" "OC" - "อัปเดตเมื่อ" + "อัปเดตแล้ว" "เชื่อมต่อแล้ว (โหนดออฟไลน์)" "หน้าแรก" "การป้อนตามคำบอกกำลังฟังอยู่" diff --git a/apps/android/app/src/main/res/values-tr/strings.xml b/apps/android/app/src/main/res/values-tr/strings.xml index f13267650a3..f741c0c08ce 100644 --- a/apps/android/app/src/main/res/values-tr/strings.xml +++ b/apps/android/app/src/main/res/values-tr/strings.xml @@ -105,7 +105,7 @@ "Yakın zamanda oturum yok" "Gateway durumu, telefon düğümü hazır olma durumu ve son günlük akışı." "Otomasyon ayrıntısını aç" - "Çalışma Zamanı" + "Çalışma zamanı" "Aracı %1$s" "Get Goal" "OpenClaw %1$s (%2$s)" diff --git a/apps/android/app/src/main/res/values-uk/strings.xml b/apps/android/app/src/main/res/values-uk/strings.xml index 343fa0d4290..e85011d8c12 100644 --- a/apps/android/app/src/main/res/values-uk/strings.xml +++ b/apps/android/app/src/main/res/values-uk/strings.xml @@ -850,7 +850,7 @@ "Очікування сполучення" "Почніть або продовжте розмову" "Немає запланованих завдань" - "Стан" + "Статус" "Вузол OpenClaw · Підключено" "Активні" "Показувати стан налагодження спільного доступу до екрана." diff --git a/apps/android/app/src/main/res/values-zh-rCN/strings.xml b/apps/android/app/src/main/res/values-zh-rCN/strings.xml index 9e6c461efd5..8b9fcc5093a 100644 --- a/apps/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/apps/android/app/src/main/res/values-zh-rCN/strings.xml @@ -347,7 +347,7 @@ "所有系统运行正常" "无法连接到 Gateway" "OC" - "已更新" + "更新时间" "已连接(节点离线)" "首页" "正在听写" diff --git a/apps/android/app/src/main/res/values-zh-rTW/strings.xml b/apps/android/app/src/main/res/values-zh-rTW/strings.xml index 3a19b758325..4a26f972c1c 100644 --- a/apps/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/apps/android/app/src/main/res/values-zh-rTW/strings.xml @@ -1418,7 +1418,7 @@ "尚無工作階段" "已封鎖 %1$s 個應用程式進行轉送。" "訊息動作" - "種類" + "類型" "取消封存" "Transcripts" "最近的工作階段" diff --git a/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyClient.kt b/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyClient.kt index a9aa798eba5..fd7eea770af 100644 --- a/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyClient.kt +++ b/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyClient.kt @@ -12,7 +12,6 @@ import com.google.android.gms.wearable.CapabilityClient import com.google.android.gms.wearable.Wearable import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive @@ -21,13 +20,12 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import kotlinx.coroutines.withTimeout +import kotlinx.coroutines.withTimeoutOrNull import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.buildJsonObject import java.util.UUID import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.atomic.AtomicReference import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -77,10 +75,9 @@ internal class WearProxyClient private constructor( private val transport: WearMessageTransport, ) : WearRpcRequester { private val pending = ConcurrentHashMap() - private val selectedPhoneNodeId = AtomicReference() private val preferredPhoneLock = Any() - private var preferredPhoneKnown = false - private var preferredPhoneNodeId: String? = null + private var preferredPhoneGeneration = 0L + private var registeredPhone: PreferredPhoneRegistration? = null private val inboundMutex = Mutex() private val mutableEvents = MutableSharedFlow( @@ -98,31 +95,49 @@ internal class WearProxyClient private constructor( params: JsonObject, expectedNodeId: String?, requirePreferredNode: Boolean, - ): WearRpcResult = - try { - withTimeout(REQUEST_TIMEOUT_MS) { - requestBeforeDeadline(method, params, expectedNodeId, requirePreferredNode) + ): WearRpcResult { + var attemptedPreferredPhone: PreferredPhoneRegistration? = null + val result = + withTimeoutOrNull(REQUEST_TIMEOUT_MS) { + requestBeforeDeadline(method, params, expectedNodeId, requirePreferredNode) { registration -> + attemptedPreferredPhone = registration + } } - } catch (_: TimeoutCancellationException) { - throw WearProxyException("timeout", "Paired phone did not respond") - } + if (result != null) return result + + // MessageClient success only proves the request was queued. A silent phone + // must be rediscovered just like a node that rejected the send outright. + invalidatePreferredPhone(attemptedPreferredPhone) + throw WearProxyException("timeout", "Paired phone did not respond") + } private suspend fun requestBeforeDeadline( method: WearRpcMethod, params: JsonObject, expectedNodeId: String?, requirePreferredNode: Boolean, + recordPreferredPhoneAttempt: (PreferredPhoneRegistration?) -> Unit, ): WearRpcResult { // Stateful RPCs stay on the phone that supplied their session/transcript. // Rediscovery here could route a shared session key to a different phone. - val requiredPreferredNodeId = if (requirePreferredNode) resolvePreferredPhoneNode() else null - val nodeId = expectedNodeId ?: requiredPreferredNodeId ?: resolvePreferredPhoneNode() - if (requirePreferredNode && expectedNodeId != null && requiredPreferredNodeId != expectedNodeId) { + val preferredPhone = + when { + requirePreferredNode || expectedNodeId == null -> resolvePreferredPhone() + else -> preferredPhoneRegistration(expectedNodeId) + } + val nodeId = expectedNodeId ?: checkNotNull(preferredPhone).nodeId + if (requirePreferredNode && expectedNodeId != null && preferredPhone?.nodeId != expectedNodeId) { throw WearProxyException("phone_changed", "Preferred phone changed during request") } + recordPreferredPhoneAttempt(preferredPhone?.takeIf { it.nodeId == nodeId }) val requestId = UUID.randomUUID().toString() val response = CompletableDeferred() - val pendingRequest = PendingWearRequest(nodeId = nodeId, response = response) + val pendingRequest = + PendingWearRequest( + nodeId = nodeId, + response = response, + preferredPhone = preferredPhone?.takeIf { it.nodeId == nodeId }, + ) check(pending.putIfAbsent(requestId, pendingRequest) == null) return try { try { @@ -136,14 +151,16 @@ internal class WearProxyClient private constructor( ) } catch (_: CancellationException) { currentCoroutineContext().ensureActive() + invalidatePreferredPhone(preferredPhone?.takeIf { it.nodeId == nodeId }) throw WearProxyException("phone_unavailable", "Paired phone is unavailable") } catch (_: Throwable) { + invalidatePreferredPhone(preferredPhone?.takeIf { it.nodeId == nodeId }) throw WearProxyException("phone_unavailable", "Paired phone is unavailable") } val envelope = response.await() if ( (expectedNodeId == null || requirePreferredNode || method.requiresPreferredSnapshotSource()) && - selectedPhoneNodeId.get() != nodeId + currentPreferredPhone()?.nodeId != nodeId ) { throw WearProxyException("phone_changed", "Preferred phone changed during request") } @@ -175,8 +192,12 @@ internal class WearProxyClient private constructor( path == WearProtocol.RESPONSE_PATH && message is WearMessage.Response -> { pending[message.requestId] ?.takeIf { it.nodeId == sourceNodeId } - ?.response - ?.complete(message) + ?.let { request -> + // Correlation is the reachability proof. Advance the registration + // before a concurrently expiring request can invalidate it. + confirmPreferredPhoneResponse(request.preferredPhone) + request.response.complete(message) + } null } path == WearProtocol.EVENT_PATH && message is WearMessage.Event -> { @@ -209,15 +230,12 @@ internal class WearProxyClient private constructor( } ?: throw WearProxyException("phone_unavailable", "Paired phone is unavailable") private suspend fun acceptEventSource(sourceNodeId: String): Boolean { - val snapshot = preferredPhoneSnapshot() - if (snapshot.known) { - val preferred = snapshot.nodeId - selectedPhoneNodeId.set(preferred) - return preferred == sourceNodeId + val preferredPhone = currentPreferredPhone() + if (preferredPhone != null) { + return preferredPhone.nodeId == sourceNodeId } - if (selectedPhoneNodeId.get() == sourceNodeId) return true return try { - resolvePreferredPhoneNode() == sourceNodeId + resolvePreferredPhone().nodeId == sourceNodeId } catch (err: CancellationException) { throw err } catch (_: WearProxyException) { @@ -225,49 +243,97 @@ internal class WearProxyClient private constructor( } } - /** Capability callbacks invalidate cached routing before another old-phone event is accepted. */ - fun updatePreferredPhoneNodeId(nodeId: String?) { + /** A unique directly connected phone becomes the preferred routing source immediately. */ + fun updatePreferredPhoneNodeId(nodeId: String) { val changed = synchronized(preferredPhoneLock) { - val changed = !preferredPhoneKnown || preferredPhoneNodeId != nodeId - preferredPhoneKnown = true - preferredPhoneNodeId = nodeId + val changed = registeredPhone?.nodeId != nodeId + preferredPhoneGeneration += 1 + registeredPhone = PreferredPhoneRegistration(nodeId, preferredPhoneGeneration) changed } - selectedPhoneNodeId.set(nodeId) if (changed) mutablePreferredPhoneChanges.tryEmit(nodeId) } - private suspend fun resolvePreferredPhoneNode(): String { - preferredPhoneSnapshot().takeIf(PreferredPhoneSnapshot::known)?.let { snapshot -> - return snapshot.nodeId ?: throw WearProxyException("phone_unavailable", "Paired phone is unavailable") - } + /** Capability callbacks are not reachability-filtered, so ambiguous results force fresh discovery. */ + fun invalidatePreferredPhoneNode() { + val changed = + synchronized(preferredPhoneLock) { + val changed = registeredPhone != null + preferredPhoneGeneration += 1 + registeredPhone = null + changed + } + if (changed) mutablePreferredPhoneChanges.tryEmit(null) + } + + private suspend fun resolvePreferredPhone(): PreferredPhoneRegistration { + // Capability callbacks can invalidate the route while discovery suspends. + // Only a result from the same generation may repopulate it. + val discoveryGeneration = + synchronized(preferredPhoneLock) { + registeredPhone?.let { return it } + preferredPhoneGeneration + } val resolved = resolvePhoneNode() - val selected = + return synchronized(preferredPhoneLock) { + registeredPhone ?: if (preferredPhoneGeneration == discoveryGeneration) { + preferredPhoneGeneration += 1 + PreferredPhoneRegistration(resolved, preferredPhoneGeneration).also { registeredPhone = it } + } else { + null + } + } ?: throw WearProxyException("phone_unavailable", "Paired phone is unavailable") + } + + private fun currentPreferredPhone(): PreferredPhoneRegistration? = + synchronized(preferredPhoneLock) { + registeredPhone + } + + private fun preferredPhoneRegistration(nodeId: String): PreferredPhoneRegistration? = + synchronized(preferredPhoneLock) { + registeredPhone?.takeIf { it.nodeId == nodeId } + } + + private fun invalidatePreferredPhone(registration: PreferredPhoneRegistration?) { + if (registration == null) return + val invalidated = synchronized(preferredPhoneLock) { - if (!preferredPhoneKnown) { - preferredPhoneKnown = true - preferredPhoneNodeId = resolved + if (registeredPhone == registration) { + // A capability callback can refresh the same node while an older request + // is failing. Clear only the registration that owned this transport attempt. + preferredPhoneGeneration += 1 + registeredPhone = null + true + } else { + false } - preferredPhoneNodeId - } ?: throw WearProxyException("phone_unavailable", "Paired phone is unavailable") - selectedPhoneNodeId.set(selected) - return selected + } + if (invalidated) mutablePreferredPhoneChanges.tryEmit(null) } - private fun preferredPhoneSnapshot(): PreferredPhoneSnapshot = + private fun confirmPreferredPhoneResponse(registration: PreferredPhoneRegistration?) { + if (registration == null) return synchronized(preferredPhoneLock) { - PreferredPhoneSnapshot(known = preferredPhoneKnown, nodeId = preferredPhoneNodeId) + if (registeredPhone == registration) { + // Any correlated response proves this registration is reachable. Advance + // it so an older parallel request cannot clear it on a later timeout. + preferredPhoneGeneration += 1 + registeredPhone = registration.copy(generation = preferredPhoneGeneration) + } } + } - private data class PreferredPhoneSnapshot( - val known: Boolean, - val nodeId: String?, + private data class PreferredPhoneRegistration( + val nodeId: String, + val generation: Long, ) private data class PendingWearRequest( val nodeId: String, val response: CompletableDeferred, + val preferredPhone: PreferredPhoneRegistration?, ) companion object { @@ -281,13 +347,13 @@ internal class WearProxyClient private constructor( return WearProxyClient( nodeResolver = WearNodeResolver { - capabilityClient - .getCapability(WearProtocol.PHONE_CAPABILITY, CapabilityClient.FILTER_REACHABLE) - .await() - .nodes - .sortedWith(compareByDescending { it.isNearby }.thenBy { it.id }) - .firstOrNull() - ?.id + selectReachablePhoneNodeId( + capabilityClient + .getCapability(WearProtocol.PHONE_CAPABILITY, CapabilityClient.FILTER_REACHABLE) + .await() + .nodes + .map { node -> WearReachablePhoneNode(id = node.id, isNearby = node.isNearby) }, + ) }, transport = WearMessageTransport { nodeId, path, data -> @@ -303,6 +369,22 @@ internal class WearProxyClient private constructor( } } +internal data class WearReachablePhoneNode( + val id: String, + val isNearby: Boolean, +) + +internal fun selectReachablePhoneNodeId(nodes: Collection): String? { + val distinctNodes = nodes.distinctBy(WearReachablePhoneNode::id) + val nearbyNodes = distinctNodes.filter(WearReachablePhoneNode::isNearby) + return when { + nearbyNodes.size == 1 -> nearbyNodes.single().id + nearbyNodes.isNotEmpty() -> null + distinctNodes.size == 1 -> distinctNodes.single().id + else -> null + } +} + private fun WearRpcMethod.requiresPreferredSnapshotSource(): Boolean = this == WearRpcMethod.ProxyStatus || this == WearRpcMethod.SessionsList || this == WearRpcMethod.ChatHistory internal enum class WearSequenceDecision { diff --git a/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyListenerService.kt b/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyListenerService.kt index efe10c706e1..2933b9c3e29 100644 --- a/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyListenerService.kt +++ b/apps/android/wear/src/main/java/ai/openclaw/wear/WearProxyListenerService.kt @@ -11,11 +11,19 @@ class WearProxyListenerService : WearableListenerService() { override fun onCapabilityChanged(capabilityInfo: CapabilityInfo) { if (capabilityInfo.name != WearProtocol.PHONE_CAPABILITY) return val preferredNodeId = - capabilityInfo.nodes - .sortedWith(compareByDescending { it.isNearby }.thenBy { it.id }) - .firstOrNull() - ?.id - (application as? WearApplication)?.proxyClient?.updatePreferredPhoneNodeId(preferredNodeId) + selectReachablePhoneNodeId( + capabilityInfo.nodes.map { node -> + WearReachablePhoneNode(id = node.id, isNearby = node.isNearby) + }, + ) + val proxyClient = (application as? WearApplication)?.proxyClient ?: return + if (preferredNodeId == null) { + // Capability callbacks contain reachable nodes. Multiple routes remain + // ambiguous, so force the next request through fresh discovery. + proxyClient.invalidatePreferredPhoneNode() + } else { + proxyClient.updatePreferredPhoneNodeId(preferredNodeId) + } } override fun onMessageReceived(messageEvent: MessageEvent) { diff --git a/apps/android/wear/src/test/java/ai/openclaw/wear/WearProxyClientTest.kt b/apps/android/wear/src/test/java/ai/openclaw/wear/WearProxyClientTest.kt index a23bc75f006..0dd00c0941b 100644 --- a/apps/android/wear/src/test/java/ai/openclaw/wear/WearProxyClientTest.kt +++ b/apps/android/wear/src/test/java/ai/openclaw/wear/WearProxyClientTest.kt @@ -8,13 +8,16 @@ import ai.openclaw.wear.shared.WearProtocolCodec import ai.openclaw.wear.shared.WearProxyCapability import ai.openclaw.wear.shared.WearRpcMethod import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.async import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.withTimeout import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.jsonObject @@ -346,6 +349,374 @@ class WearProxyClientTest { assertEquals("phone_unavailable", (failure as WearProxyException).code) } + @Test + fun shorterCallerTimeoutPropagatesWithoutInvalidatingPhone() = + runTest { + var discoveries = 0 + var respond = false + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + "resolver-phone" + }, + transport = + WearMessageTransport { nodeId, _, data -> + if (!respond) awaitCancellation() + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + }, + ) + client.updatePreferredPhoneNodeId("phone-current") + + val failure = + runCatching { + withTimeout(1_000L) { + client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) + } + }.exceptionOrNull() + respond = true + + assertTrue(failure is TimeoutCancellationException) + assertEquals("phone-current", client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null).sourceNodeId) + assertEquals(0, discoveries) + } + + @Test + fun sendFailureInvalidatesCachedPhoneAndRediscoversNextRequest() = + runTest { + var resolvedNode = "phone-old" + var discoveries = 0 + var sends = 0 + val sentNodes = mutableListOf() + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + resolvedNode + }, + transport = + WearMessageTransport { nodeId, _, data -> + sends += 1 + sentNodes += nodeId + if (sends == 1) error("stale node") + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + }, + ) + + val first = runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) }.exceptionOrNull() + resolvedNode = "phone-new" + val second = client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) + + assertEquals("phone_unavailable", (first as WearProxyException).code) + assertEquals("phone-new", second.sourceNodeId) + assertEquals(2, discoveries) + assertEquals(listOf("phone-old", "phone-new"), sentNodes) + } + + @Test + fun responseTimeoutInvalidatesCachedPhoneAndRediscoversNextRequest() = + runTest { + var resolvedNode = "phone-old" + var discoveries = 0 + var sends = 0 + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + resolvedNode + }, + transport = + WearMessageTransport { nodeId, _, data -> + sends += 1 + if (sends > 1) { + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + } + }, + ) + + val first = runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) }.exceptionOrNull() + resolvedNode = "phone-new" + val second = client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) + + assertEquals("timeout", (first as WearProxyException).code) + assertEquals("phone-new", second.sourceNodeId) + assertEquals(2, discoveries) + } + + @Test + fun staleSendFailureDoesNotInvalidateNewerSamePhoneGeneration() = + runTest { + var discoveries = 0 + var sends = 0 + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + "resolver-phone" + }, + transport = + WearMessageTransport { nodeId, _, data -> + sends += 1 + if (sends == 1) { + client.updatePreferredPhoneNodeId(nodeId) + error("stale send") + } + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + }, + ) + client.updatePreferredPhoneNodeId("phone-current") + + val first = runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) }.exceptionOrNull() + val second = client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) + + assertEquals("phone_unavailable", (first as WearProxyException).code) + assertEquals("phone-current", second.sourceNodeId) + assertEquals(0, discoveries) + } + + @Test + fun staleResponseTimeoutDoesNotInvalidateNewerSamePhoneGeneration() = + runTest { + var discoveries = 0 + var sends = 0 + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + "resolver-phone" + }, + transport = + WearMessageTransport { nodeId, _, data -> + sends += 1 + if (sends == 1) { + client.updatePreferredPhoneNodeId(nodeId) + } else { + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + } + }, + ) + client.updatePreferredPhoneNodeId("phone-current") + + val first = runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) }.exceptionOrNull() + val second = client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) + + assertEquals("timeout", (first as WearProxyException).code) + assertEquals("phone-current", second.sourceNodeId) + assertEquals(0, discoveries) + } + + @Test + fun successfulParallelResponseProtectsPhoneFromOlderTimeout() = + runTest { + var discoveries = 0 + var sends = 0 + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + "resolver-phone" + }, + transport = + WearMessageTransport { nodeId, _, data -> + sends += 1 + if (sends > 1) { + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + } + }, + ) + client.updatePreferredPhoneNodeId("phone-current") + + val older = async { runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) } } + runCurrent() + val newer = async { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) } + runCurrent() + + assertEquals("phone-current", newer.await().sourceNodeId) + assertEquals("timeout", (older.await().exceptionOrNull() as WearProxyException).code) + assertEquals("phone-current", client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null).sourceNodeId) + assertEquals(0, discoveries) + } + + @Test + fun correlatedResponseProtectsPhoneBeforeRequesterResumes() = + runTest { + var discoveries = 0 + var respond = false + val requests = mutableListOf() + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + "resolver-phone" + }, + transport = + WearMessageTransport { nodeId, _, data -> + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + requests += request + if (respond) { + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + } + }, + ) + client.updatePreferredPhoneNodeId("phone-current") + + val older = async { runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) } } + val newer = async { runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) } } + runCurrent() + assertEquals(2, requests.size) + + client.handleMessage( + sourceNodeId = "phone-current", + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = requests[1].requestId, ok = true)), + ) + newer.cancel() + advanceUntilIdle() + + assertTrue(newer.isCancelled) + assertEquals("timeout", (older.await().exceptionOrNull() as WearProxyException).code) + respond = true + assertEquals("phone-current", client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null).sourceNodeId) + assertEquals(0, discoveries) + } + + @Test + fun ambiguousCapabilityCallbackForcesReachableRediscovery() = + runTest { + var discoveries = 0 + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + discoveries += 1 + "phone-reachable" + }, + transport = + WearMessageTransport { nodeId, _, data -> + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + }, + ) + client.updatePreferredPhoneNodeId("phone-stale") + + client.invalidatePreferredPhoneNode() + val result = client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) + + assertEquals("phone-reachable", result.sourceNodeId) + assertEquals(1, discoveries) + } + + @Test + fun inFlightDiscoveryCannotRestoreInvalidatedPhone() = + runTest { + val discoveryStarted = CompletableDeferred() + val releaseDiscovery = CompletableDeferred() + var resolvedNode = "phone-old" + var discoveries = 0 + val sentNodes = mutableListOf() + lateinit var client: WearProxyClient + client = + WearProxyClient.createForTests( + nodeResolver = + WearNodeResolver { + val result = resolvedNode + discoveries += 1 + if (discoveries == 1) { + discoveryStarted.complete(Unit) + releaseDiscovery.await() + } + result + }, + transport = + WearMessageTransport { nodeId, _, data -> + sentNodes += nodeId + val request = (WearProtocolCodec.decode(data) as WearDecodeResult.Success).message as WearMessage.Request + client.handleMessage( + sourceNodeId = nodeId, + path = WearProtocol.RESPONSE_PATH, + data = WearProtocolCodec.encode(WearMessage.Response(requestId = request.requestId, ok = true)), + ) + }, + ) + + val first = async { runCatching { client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null) } } + discoveryStarted.await() + client.invalidatePreferredPhoneNode() + resolvedNode = "phone-new" + releaseDiscovery.complete(Unit) + + assertEquals("phone_unavailable", (first.await().exceptionOrNull() as WearProxyException).code) + assertEquals("phone-new", client.request(WearRpcMethod.ProxyStatus, buildJsonObject {}, null).sourceNodeId) + assertEquals(2, discoveries) + assertEquals(listOf("phone-new"), sentNodes) + } + + @Test + fun reachablePhoneSelectionPrefersOneNearbyNodeAndRejectsAmbiguity() { + val nearby = WearReachablePhoneNode(id = "phone-nearby", isNearby = true) + val nearbyTwo = WearReachablePhoneNode(id = "phone-nearby-2", isNearby = true) + val cloud = WearReachablePhoneNode(id = "phone-cloud", isNearby = false) + val cloudTwo = WearReachablePhoneNode(id = "phone-cloud-2", isNearby = false) + + assertEquals("phone-nearby", selectReachablePhoneNodeId(listOf(cloud, nearby))) + assertEquals("phone-cloud", selectReachablePhoneNodeId(listOf(cloud))) + assertEquals(null, selectReachablePhoneNodeId(listOf(nearby, nearbyTwo, cloud))) + assertEquals(null, selectReachablePhoneNodeId(listOf(cloud, cloudTwo))) + } + @Test fun eventGapAndResetRequireCanonicalRefresh() { val tracker = WearEventSequenceTracker() diff --git a/apps/ios/Resources/Localizable.xcstrings b/apps/ios/Resources/Localizable.xcstrings index 4def5447c0e..94e75e46740 100644 --- a/apps/ios/Resources/Localizable.xcstrings +++ b/apps/ios/Resources/Localizable.xcstrings @@ -9385,6 +9385,142 @@ } } }, + "Add Group": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Group" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "添加群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "加入群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Adicionar grupo" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gruppe hinzufügen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir grupo" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "グループを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "그룹 추가" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un groupe" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "समूह जोड़ें" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "إضافة مجموعة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi gruppo" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Grup Ekle" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Додати групу" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Tambahkan Grup" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Dodaj grupę" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เพิ่มกลุ่ม" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thêm nhóm" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Groep toevoegen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "افزودن گروه" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Добавить группу" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Lägg till grupp" + } + } + } + }, "Add Header": { "localizations": { "en": { @@ -23393,6 +23529,142 @@ } } }, + "Base ref (optional)": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Base ref (optional)" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "基础引用(可选)" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "基礎參照(選填)" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Referência base (opcional)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Basis-Ref (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Referencia base (opcional)" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "ベース参照(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기준 참조(선택 사항)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Référence de base (facultatif)" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "बेस रेफ़रेंस (वैकल्पिक)" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "المرجع الأساسي (اختياري)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riferimento di base (facoltativo)" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Temel ref (isteğe bağlı)" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Базове посилання (необов’язково)" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Ref dasar (opsional)" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Referencja bazowa (opcjonalnie)" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "Base ref (ไม่บังคับ)" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Tham chiếu cơ sở (không bắt buộc)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Basisreferentie (optioneel)" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "ارجاع پایه (اختیاری)" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Базовая ссылка (необязательно)" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Basreferens (valfritt)" + } + } + } + }, "Blocked": { "localizations": { "en": { @@ -23665,6 +23937,142 @@ } } }, + "Branch": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Branch" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "分支" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "分支" + } + }, + "pt-BR": { + "stringUnit": { + "state": "new", + "value": "Branch" + } + }, + "de": { + "stringUnit": { + "state": "new", + "value": "Branch" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Rama" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "ブランチ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "브랜치" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Branche" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "ब्रांच" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "الفرع" + } + }, + "it": { + "stringUnit": { + "state": "new", + "value": "Branch" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Dal" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Гілка" + } + }, + "id": { + "stringUnit": { + "state": "new", + "value": "Branch" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Gałąź" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "สาขา" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Nhánh" + } + }, + "nl": { + "stringUnit": { + "state": "new", + "value": "Branch" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "شاخه" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Ветка" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Gren" + } + } + } + }, "Browse": { "localizations": { "en": { @@ -43793,6 +44201,142 @@ } } }, + "Copy session key": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Copy session key" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "复制会话密钥" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "複製工作階段金鑰" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Copiar chave da sessão" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungsschlüssel kopieren" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Copiar clave de sesión" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッションキーをコピー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 키 복사" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Copier la clé de session" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सत्र कुंजी कॉपी करें" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "نسخ مفتاح الجلسة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Copia chiave della sessione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum anahtarını kopyala" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Копіювати ключ сеансу" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Salin kunci sesi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Kopiuj klucz sesji" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "คัดลอกคีย์เซสชัน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Sao chép khóa phiên" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessiesleutel kopiëren" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "کپی کلید نشست" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Скопировать ключ сеанса" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Kopiera sessionsnyckel" + } + } + } + }, "Copy setup code command": { "localizations": { "en": { @@ -47737,6 +48281,142 @@ } } }, + "Create Group": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create Group" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "创建群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "建立群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Criar grupo" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gruppe erstellen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear grupo" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "グループを作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "그룹 생성" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer un groupe" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "समूह बनाएँ" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "إنشاء مجموعة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea gruppo" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Grup Oluştur" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Створити групу" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Buat Grup" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Utwórz grupę" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "สร้างกลุ่ม" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Tạo nhóm" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Groep aanmaken" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "ایجاد گروه" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Создать группу" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Skapa grupp" + } + } + } + }, "Create a card or change the filter.": { "localizations": { "en": { @@ -47873,6 +48553,142 @@ } } }, + "Create in a worktree": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create in a worktree" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "在工作树中创建" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "在工作樹中建立" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Criar em uma worktree" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "In einem Worktree erstellen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear en un worktree" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "ワークツリーに作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "워크트리에 생성" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer dans un worktree" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "वर्कट्री में बनाएँ" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "إنشاء في شجرة عمل" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea in un worktree" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Bir worktree içinde oluştur" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Створити в робочому дереві" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Buat di worktree" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Utwórz w drzewie roboczym" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "สร้างใน worktree" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Tạo trong một worktree" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aanmaken in een worktree" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "ایجاد در یک worktree" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Создать в рабочем дереве" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Skapa i ett arbetsträd" + } + } + } + }, "Creates a workboard card": { "localizations": { "en": { @@ -51545,6 +52361,142 @@ } } }, + "Delete Sessions": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Sessions" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "删除会话" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "刪除工作階段" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Excluir sessões" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungen löschen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar sesiones" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッションを削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 삭제" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer les sessions" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सत्र हटाएँ" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "حذف الجلسات" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina sessioni" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturumları Sil" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Видалити сеанси" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Hapus Sesi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Usuń sesje" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ลบเซสชัน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Xóa các phiên" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessies verwijderen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "حذف نشست‌ها" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Удалить сеансы" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Ta bort sessioner" + } + } + } + }, "Delete Session…": { "localizations": { "en": { @@ -51817,6 +52769,278 @@ } } }, + "Delete group?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete group?" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "删除群组?" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "刪除群組?" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Excluir grupo?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gruppe löschen?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Eliminar el grupo?" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "グループを削除しますか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "그룹을 삭제하시겠습니까?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer le groupe ?" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "समूह हटाएँ?" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "حذف المجموعة؟" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Eliminare il gruppo?" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Grup silinsin mi?" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Видалити групу?" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Hapus grup?" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Usunąć grupę?" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ลบกลุ่มหรือไม่?" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Xóa nhóm?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Groep verwijderen?" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "گروه حذف شود؟" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Удалить группу?" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Ta bort gruppen?" + } + } + } + }, + "Delete selected sessions?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete selected sessions?" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "删除所选会话?" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "刪除所選的工作階段?" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Excluir as sessões selecionadas?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausgewählte Sitzungen löschen?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Eliminar las sesiones seleccionadas?" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "選択したセッションを削除しますか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택한 세션을 삭제하시겠습니까?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer les sessions sélectionnées ?" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "चुने गए सत्र हटाएँ?" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "حذف الجلسات المحددة؟" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Eliminare le sessioni selezionate?" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Seçili oturumlar silinsin mi?" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Видалити вибрані сеанси?" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Hapus sesi yang dipilih?" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Usunąć wybrane sesje?" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ลบเซสชันที่เลือกหรือไม่?" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Xóa các phiên đã chọn?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geselecteerde sessies verwijderen?" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "نشست‌های انتخاب‌شده حذف شوند؟" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Удалить выбранные сеансы?" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Ta bort valda sessioner?" + } + } + } + }, "Delete this automation?": { "localizations": { "en": { @@ -59297,6 +60521,142 @@ } } }, + "Each selected session and its transcript will be removed from the gateway.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Each selected session and its transcript will be removed from the gateway." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "每个所选会话及其转录记录都将从 Gateway 中移除。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "每個所選的工作階段及其逐字稿都將從 Gateway 中移除。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Cada sessão selecionada e sua transcrição serão removidas do gateway." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle ausgewählten Sitzungen und ihre Transkripte werden aus dem Gateway entfernt." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cada sesión seleccionada y su transcripción se eliminarán del Gateway." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "選択した各セッションとそのトランスクリプトがGatewayから削除されます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택한 각 세션과 해당 기록이 Gateway에서 삭제됩니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chaque session sélectionnée et sa transcription seront supprimées du Gateway." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "हर चुना गया सत्र और उसकी प्रतिलिपि Gateway से हटा दी जाएगी।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "ستُزال كل جلسة محددة ونصها من Gateway." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ogni sessione selezionata e la relativa trascrizione verranno rimosse dal Gateway." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Seçili her oturum ve dökümü gateway'den kaldırılacaktır." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Кожен вибраний сеанс і його стенограму буде видалено з Gateway." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Setiap sesi yang dipilih beserta transkripnya akan dihapus dari Gateway." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Każda wybrana sesja i jej transkrypcja zostaną usunięte z Gateway." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เซสชันที่เลือกแต่ละรายการและบันทึกการสนทนาจะถูกลบออกจาก Gateway" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Mỗi phiên đã chọn và bản ghi của phiên đó sẽ bị xóa khỏi gateway." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Elke geselecteerde sessie en het bijbehorende transcript worden van de Gateway verwijderd." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "هر نشست انتخاب‌شده و رونوشت آن از Gateway حذف خواهد شد." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Все выбранные сеансы и их расшифровки будут удалены из Gateway." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Varje vald session och dess transkription tas bort från Gateway." + } + } + } + }, "Edit": { "localizations": { "en": { @@ -70585,6 +71945,278 @@ } } }, + "Gateway changed before the session operation started.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Gateway changed before the session operation started." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "Gateway 在会话操作开始前已更改。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "Gateway 在工作階段操作開始前已變更。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "O Gateway foi alterado antes do início da operação da sessão." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Das Gateway wurde geändert, bevor der Sitzungsvorgang gestartet wurde." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El Gateway cambió antes de que se iniciara la operación de sesión." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッション操作を開始する前にGatewayが変更されました。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 작업이 시작되기 전에 Gateway가 변경되었습니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le Gateway a changé avant le début de l’opération sur la session." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सत्र संचालन शुरू होने से पहले Gateway बदल गया।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تغيّر Gateway قبل بدء عملية الجلسة." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il Gateway è cambiato prima dell'inizio dell'operazione sulla sessione." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum işlemi başlamadan önce Gateway değişti." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Gateway змінився до початку операції із сеансом." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Gateway berubah sebelum operasi sesi dimulai." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Gateway zmienił się przed rozpoczęciem operacji na sesji." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "Gateway มีการเปลี่ยนแปลงก่อนเริ่มดำเนินการกับเซสชัน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Gateway đã thay đổi trước khi thao tác phiên bắt đầu." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De Gateway is gewijzigd voordat de sessiebewerking is gestart." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "Gateway پیش از شروع عملیات نشست تغییر کرد." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Gateway изменился до начала операции с сеансом." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Gateway ändrades innan sessionsåtgärden startade." + } + } + } + }, + "Gateway changed. Close and reopen Groups to continue.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Gateway changed. Close and reopen Groups to continue." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "Gateway 已更改。请关闭并重新打开“群组”以继续。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "Gateway 已變更。請關閉並重新開啟「群組」以繼續。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "O Gateway foi alterado. Feche e reabra Grupos para continuar." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gateway wurde geändert. Schließen und öffnen Sie „Gruppen“ erneut, um fortzufahren." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El Gateway ha cambiado. Cierra y vuelve a abrir Grupos para continuar." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "Gatewayが変更されました。続行するには「グループ」を閉じて再度開いてください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Gateway가 변경되었습니다. 계속하려면 그룹을 닫았다가 다시 여세요." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le Gateway a changé. Fermez et rouvrez Groupes pour continuer." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "Gateway बदल गया है। जारी रखने के लिए Groups को बंद करके फिर से खोलें।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تغيّر Gateway. أغلق المجموعات وأعد فتحها للمتابعة." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il Gateway è cambiato. Chiudi e riapri Gruppi per continuare." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Gateway değişti. Devam etmek için Gruplar'ı kapatıp yeniden açın." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Gateway змінено. Закрийте й знову відкрийте розділ «Групи», щоб продовжити." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Gateway berubah. Tutup dan buka kembali Grup untuk melanjutkan." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Gateway został zmieniony. Zamknij i ponownie otwórz Grupy, aby kontynuować." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "Gateway มีการเปลี่ยนแปลง ปิดแล้วเปิดกลุ่มอีกครั้งเพื่อดำเนินการต่อ" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Gateway đã thay đổi. Hãy đóng rồi mở lại Nhóm để tiếp tục." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gateway gewijzigd. Sluit Groepen en open het opnieuw om door te gaan." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "Gateway تغییر کرد. برای ادامه، Groups را ببندید و دوباره باز کنید." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Gateway изменён. Закройте и снова откройте раздел «Группы», чтобы продолжить." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Gateway har ändrats. Stäng och öppna Grupper igen för att fortsätta." + } + } + } + }, "Gateway command": { "localizations": { "en": { @@ -73441,6 +75073,142 @@ } } }, + "Get Info…": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Get Info…" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "显示简介…" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "取得資訊…" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Obter Informações…" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Informationen…" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Obtener información…" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "情報を見る…" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "정보 가져오기…" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Lire les informations…" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "जानकारी पाएँ…" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "إحضار المعلومات…" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ottieni informazioni…" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Bilgi Al…" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Отримати інформацію…" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Dapatkan Info…" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Informacje…" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ดูข้อมูล…" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Xem thông tin…" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toon info…" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "دریافت اطلاعات…" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сведения…" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Visa info…" + } + } + } + }, "Get key": { "localizations": { "en": { @@ -74257,6 +76025,142 @@ } } }, + "Group": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Group" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Grupo" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gruppe" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Grupo" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "グループ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "그룹" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Groupe" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "समूह" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "المجموعة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gruppo" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Grup" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Група" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Grup" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Grupa" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "กลุ่ม" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Nhóm" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Groep" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "گروه" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Группа" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Grupp" + } + } + } + }, "Group name": { "localizations": { "en": { @@ -74393,6 +76297,142 @@ } } }, + "Groups": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Groups" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Grupos" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gruppen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Grupos" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "グループ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "그룹" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Groupes" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "समूह" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "المجموعات" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gruppi" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Gruplar" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Групи" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Grup" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Grupy" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "กลุ่ม" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Nhóm" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Groepen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "گروه‌ها" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Группы" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Grupper" + } + } + } + }, "Header name": { "localizations": { "en": { @@ -76841,6 +78881,142 @@ } } }, + "ID": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "ID" + } + }, + "zh-CN": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "zh-TW": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "pt-BR": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "de": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "es": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "ja-JP": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "ko": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "fr": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "hi": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "المعرّف" + } + }, + "it": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Kimlik" + } + }, + "uk": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "id": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "pl": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "th": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "vi": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "nl": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "شناسه" + } + }, + "ru": { + "stringUnit": { + "state": "new", + "value": "ID" + } + }, + "sv": { + "stringUnit": { + "state": "new", + "value": "ID" + } + } + } + }, "INSERT INTO cached_transcripts(gateway_id, session_key, agent_id, payload, updated_at)\nSELECT gateway_id, session_key, '', payload, updated_at\nFROM cached_transcripts_pre_v3\nWHERE lower(trim(session_key)) GLOB 'agent:*:*'": { "localizations": { "en": { @@ -77385,6 +79561,142 @@ } } }, + "Identity": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Identity" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "身份" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "身分" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Identidade" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Identität" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Identidad" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "ID" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "ID" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Identité" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "पहचान" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "الهوية" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Identità" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Kimlik" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Ідентифікація" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Identitas" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Tożsamość" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ข้อมูลประจำตัว" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Danh tính" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Identiteit" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "هویت" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Идентификация" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Identitet" + } + } + } + }, "Idle": { "localizations": { "en": { @@ -80921,142 +83233,6 @@ } } }, - "Jump to latest": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "Jump to latest" - } - }, - "zh-CN": { - "stringUnit": { - "state": "translated", - "value": "跳转到最新" - } - }, - "zh-TW": { - "stringUnit": { - "state": "translated", - "value": "跳至最新內容" - } - }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "Ir para a mais recente" - } - }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Zum neuesten springen" - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Ir a lo más reciente" - } - }, - "ja-JP": { - "stringUnit": { - "state": "translated", - "value": "最新に移動" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "최신 항목으로 이동" - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Aller au plus récent" - } - }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "नवीनतम पर जाएँ" - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "الانتقال إلى الأحدث" - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Vai all'ultimo" - } - }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "En yeniye atla" - } - }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Перейти до останнього" - } - }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Lompat ke terbaru" - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Przejdź do najnowszych" - } - }, - "th": { - "stringUnit": { - "state": "translated", - "value": "ข้ามไปยังล่าสุด" - } - }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Chuyển đến mới nhất" - } - }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Naar nieuwste springen" - } - }, - "fa": { - "stringUnit": { - "state": "translated", - "value": "پرش به آخرین مورد" - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Перейти к последнему" - } - }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Hoppa till senaste" - } - } - } - }, "Jump to latest reply": { "localizations": { "en": { @@ -81873,6 +84049,142 @@ } } }, + "Kind": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Kind" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "类型" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "類型" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Tipo" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Art" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "種類" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "종류" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "प्रकार" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "النوع" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Tür" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Тип" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Jenis" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Rodzaj" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ประเภท" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Loại" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Type" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "نوع" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Тип" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Typ" + } + } + } + }, "LAN or Tailscale host": { "localizations": { "en": { @@ -82281,6 +84593,278 @@ } } }, + "Last activity": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Last activity" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "最近活动" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "最近活動" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Última atividade" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Letzte Aktivität" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Última actividad" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "最終アクティビティ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "최근 활동" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Dernière activité" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "पिछली गतिविधि" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "آخر نشاط" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ultima attività" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Son etkinlik" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Остання активність" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Aktivitas terakhir" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Ostatnia aktywność" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "กิจกรรมล่าสุด" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Hoạt động gần nhất" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laatste activiteit" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "آخرین فعالیت" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Последняя активность" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Senaste aktivitet" + } + } + } + }, + "Last interaction": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Last interaction" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "最近交互" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "最近互動" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Última interação" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Letzte Interaktion" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Última interacción" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "最終操作" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "최근 상호작용" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Dernière interaction" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "पिछला इंटरैक्शन" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "آخر تفاعل" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ultima interazione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Son etkileşim" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Остання взаємодія" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Interaksi terakhir" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Ostatnia interakcja" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "การโต้ตอบล่าสุด" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Lần tương tác gần nhất" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laatste interactie" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "آخرین تعامل" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Последнее взаимодействие" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Senaste interaktion" + } + } + } + }, "Last issue": { "localizations": { "en": { @@ -90441,6 +93025,142 @@ } } }, + "Manage session groups": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Manage session groups" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "管理会话分组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "管理工作階段群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Gerenciar grupos de sessões" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungsgruppen verwalten" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Gestionar grupos de sesiones" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッショングループを管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 그룹 관리" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérer les groupes de sessions" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सत्र समूह प्रबंधित करें" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "إدارة مجموعات الجلسات" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci gruppi di sessioni" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum gruplarını yönet" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Керувати групами сеансів" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Kelola grup sesi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Zarządzaj grupami sesji" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "จัดการกลุ่มเซสชัน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Quản lý nhóm phiên" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessiegroepen beheren" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "مدیریت گروه‌های نشست" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Управление группами сеансов" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Hantera sessionsgrupper" + } + } + } + }, "Managed cron is installed.": { "localizations": { "en": { @@ -96330,7 +99050,551 @@ "ja-JP": { "stringUnit": { "state": "translated", - "value": "新規セッション" + "value": "新規セッション" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 세션" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nouvelle session" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "नया सेशन" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "جلسة جديدة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nuova sessione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yeni Oturum" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Нова сесія" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Sesi Baru" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nowa sesja" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เซสชันใหม่" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Phiên Mới" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe sessie" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "نشست جدید" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Новая сессия" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Ny session" + } + } + } + }, + "New Session Options": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "New Session Options" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "新建会话选项" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "新工作階段選項" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Opções da nova sessão" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Optionen für neue Sitzungen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Opciones de nueva sesión" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "新規セッションのオプション" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 세션 옵션" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Options de la nouvelle session" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "नए सत्र के विकल्प" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "خيارات الجلسة الجديدة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Opzioni nuova sessione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yeni Oturum Seçenekleri" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Параметри нового сеансу" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Opsi Sesi Baru" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Opcje nowej sesji" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ตัวเลือกเซสชันใหม่" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Tùy chọn phiên mới" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opties voor nieuwe sessie" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "گزینه‌های نشست جدید" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Параметры нового сеанса" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Alternativ för ny session" + } + } + } + }, + "New Session Options…": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "New Session Options…" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "新建会话选项…" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "新增工作階段選項…" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Opções de Nova Sessão…" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Optionen für neue Sitzung…" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Opciones de nueva sesión…" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "新規セッションのオプション…" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 세션 옵션…" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Options de la nouvelle session…" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "नए सत्र के विकल्प…" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "خيارات جلسة جديدة…" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Opzioni nuova sessione…" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yeni Oturum Seçenekleri…" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Параметри нового сеансу…" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Opsi Sesi Baru…" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Opcje nowej sesji…" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ตัวเลือกเซสชันใหม่…" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Tùy chọn phiên mới…" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opties voor nieuwe sessie…" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "گزینه‌های نشست جدید…" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Параметры нового сеанса…" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Alternativ för ny session…" + } + } + } + }, + "New proposals will appear here when agents draft skills.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "New proposals will appear here when agents draft skills." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "当 Agent 草拟 Skills 时,新提案将显示在此处。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "當 agents 起草 skills 時,新的提案會顯示在這裡。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Novas propostas aparecerão aqui quando os agentes criarem rascunhos de skills." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neue Vorschläge werden hier angezeigt, wenn Agenten Skills entwerfen." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Las nuevas propuestas aparecerán aquí cuando los agentes redacten skills." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "エージェントが Skills を下書きすると、新しい提案がここに表示されます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "에이전트가 스킬 초안을 작성하면 새 제안이 여기에 표시됩니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les nouvelles propositions apparaîtront ici lorsque les agents rédigeront des skills." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "जब एजेंट Skills का ड्राफ़्ट बनाएंगे, तो नए प्रस्ताव यहाँ दिखाई देंगे." + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "ستظهر المقترحات الجديدة هنا عندما تقوم الوكلاء بصياغة المهارات." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Le nuove proposte appariranno qui quando gli agenti creeranno bozze di skill." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Aracılar skill taslakları oluşturduğunda yeni teklifler burada görünür." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Нові пропозиції з’являться тут, коли агенти створять чернетки Skills." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Proposal baru akan muncul di sini saat agen menyusun skill." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nowe propozycje pojawią się tutaj, gdy agenci opracują skills." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ข้อเสนอใหม่จะแสดงที่นี่เมื่อ Agent ร่าง Skills" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Các đề xuất mới sẽ xuất hiện tại đây khi tác nhân soạn thảo kỹ năng." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe voorstellen verschijnen hier wanneer agents skills opstellen." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "وقتی عامل‌ها مهارت‌ها را پیش‌نویس کنند، پیشنهادهای جدید اینجا ظاهر می‌شوند." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Новые предложения появятся здесь, когда агенты подготовят Skills." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Nya förslag visas här när agenter utformar skills." + } + } + } + }, + "New session": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "New session" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "新建会话" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "新工作階段" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Nova sessão" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neue Sitzung" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nueva sesión" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "新しいセッション" } }, "ko": { @@ -96348,7 +99612,7 @@ "hi": { "stringUnit": { "state": "translated", - "value": "नया सेशन" + "value": "नया सत्र" } }, "ar": { @@ -96366,19 +99630,19 @@ "tr": { "stringUnit": { "state": "translated", - "value": "Yeni Oturum" + "value": "Yeni oturum" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Нова сесія" + "value": "Новий сеанс" } }, "id": { "stringUnit": { "state": "translated", - "value": "Sesi Baru" + "value": "Sesi baru" } }, "pl": { @@ -96396,7 +99660,7 @@ "vi": { "stringUnit": { "state": "translated", - "value": "Phiên Mới" + "value": "Phiên mới" } }, "nl": { @@ -96408,7 +99672,7 @@ "fa": { "stringUnit": { "state": "translated", - "value": "نشست جدید" + "value": "جلسه جدید" } }, "ru": { @@ -96425,274 +99689,138 @@ } } }, - "New proposals will appear here when agents draft skills.": { - "localizations": { - "en": { - "stringUnit": { - "state": "translated", - "value": "New proposals will appear here when agents draft skills." - } - }, - "zh-CN": { - "stringUnit": { - "state": "translated", - "value": "当 Agent 草拟 Skills 时,新提案将显示在此处。" - } - }, - "zh-TW": { - "stringUnit": { - "state": "translated", - "value": "當 agents 起草 skills 時,新的提案會顯示在這裡。" - } - }, - "pt-BR": { - "stringUnit": { - "state": "translated", - "value": "Novas propostas aparecerão aqui quando os agentes criarem rascunhos de skills." - } - }, - "de": { - "stringUnit": { - "state": "translated", - "value": "Neue Vorschläge werden hier angezeigt, wenn Agenten Skills entwerfen." - } - }, - "es": { - "stringUnit": { - "state": "translated", - "value": "Las nuevas propuestas aparecerán aquí cuando los agentes redacten skills." - } - }, - "ja-JP": { - "stringUnit": { - "state": "translated", - "value": "エージェントが Skills を下書きすると、新しい提案がここに表示されます。" - } - }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "에이전트가 스킬 초안을 작성하면 새 제안이 여기에 표시됩니다." - } - }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Les nouvelles propositions apparaîtront ici lorsque les agents rédigeront des skills." - } - }, - "hi": { - "stringUnit": { - "state": "translated", - "value": "जब एजेंट Skills का ड्राफ़्ट बनाएंगे, तो नए प्रस्ताव यहाँ दिखाई देंगे." - } - }, - "ar": { - "stringUnit": { - "state": "translated", - "value": "ستظهر المقترحات الجديدة هنا عندما تقوم الوكلاء بصياغة المهارات." - } - }, - "it": { - "stringUnit": { - "state": "translated", - "value": "Le nuove proposte appariranno qui quando gli agenti creeranno bozze di skill." - } - }, - "tr": { - "stringUnit": { - "state": "translated", - "value": "Aracılar skill taslakları oluşturduğunda yeni teklifler burada görünür." - } - }, - "uk": { - "stringUnit": { - "state": "translated", - "value": "Нові пропозиції з’являться тут, коли агенти створять чернетки Skills." - } - }, - "id": { - "stringUnit": { - "state": "translated", - "value": "Proposal baru akan muncul di sini saat agen menyusun skill." - } - }, - "pl": { - "stringUnit": { - "state": "translated", - "value": "Nowe propozycje pojawią się tutaj, gdy agenci opracują skills." - } - }, - "th": { - "stringUnit": { - "state": "translated", - "value": "ข้อเสนอใหม่จะแสดงที่นี่เมื่อ Agent ร่าง Skills" - } - }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Các đề xuất mới sẽ xuất hiện tại đây khi tác nhân soạn thảo kỹ năng." - } - }, - "nl": { - "stringUnit": { - "state": "translated", - "value": "Nieuwe voorstellen verschijnen hier wanneer agents skills opstellen." - } - }, - "fa": { - "stringUnit": { - "state": "translated", - "value": "وقتی عامل‌ها مهارت‌ها را پیش‌نویس کنند، پیشنهادهای جدید اینجا ظاهر می‌شوند." - } - }, - "ru": { - "stringUnit": { - "state": "translated", - "value": "Новые предложения появятся здесь, когда агенты подготовят Skills." - } - }, - "sv": { - "stringUnit": { - "state": "translated", - "value": "Nya förslag visas här när agenter utformar skills." - } - } - } - }, - "New session": { + "New session options": { "localizations": { "en": { "stringUnit": { "state": "translated", - "value": "New session" + "value": "New session options" } }, "zh-CN": { "stringUnit": { "state": "translated", - "value": "新建会话" + "value": "新建会话选项" } }, "zh-TW": { "stringUnit": { "state": "translated", - "value": "新工作階段" + "value": "新工作階段選項" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Nova sessão" + "value": "Opções da nova sessão" } }, "de": { "stringUnit": { "state": "translated", - "value": "Neue Sitzung" + "value": "Optionen für neue Sitzungen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Nueva sesión" + "value": "Opciones de nueva sesión" } }, "ja-JP": { "stringUnit": { "state": "translated", - "value": "新しいセッション" + "value": "新規セッションのオプション" } }, "ko": { "stringUnit": { "state": "translated", - "value": "새 세션" + "value": "새 세션 옵션" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Nouvelle session" + "value": "Options de la nouvelle session" } }, "hi": { "stringUnit": { "state": "translated", - "value": "नया सत्र" + "value": "नए सत्र के विकल्प" } }, "ar": { "stringUnit": { "state": "translated", - "value": "جلسة جديدة" + "value": "خيارات الجلسة الجديدة" } }, "it": { "stringUnit": { "state": "translated", - "value": "Nuova sessione" + "value": "Opzioni nuova sessione" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Yeni oturum" + "value": "Yeni oturum seçenekleri" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Новий сеанс" + "value": "Параметри нового сеансу" } }, "id": { "stringUnit": { "state": "translated", - "value": "Sesi baru" + "value": "Opsi sesi baru" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Nowa sesja" + "value": "Opcje nowej sesji" } }, "th": { "stringUnit": { "state": "translated", - "value": "เซสชันใหม่" + "value": "ตัวเลือกเซสชันใหม่" } }, "vi": { "stringUnit": { "state": "translated", - "value": "Phiên mới" + "value": "Tùy chọn phiên mới" } }, "nl": { "stringUnit": { "state": "translated", - "value": "Nieuwe sessie" + "value": "Opties voor nieuwe sessie" } }, "fa": { "stringUnit": { "state": "translated", - "value": "جلسه جدید" + "value": "گزینه‌های نشست جدید" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Новая сессия" + "value": "Параметры нового сеанса" } }, "sv": { "stringUnit": { "state": "translated", - "value": "Ny session" + "value": "Alternativ för ny session" } } } @@ -97649,6 +100777,142 @@ } } }, + "No agents are available on this gateway.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No agents are available on this gateway." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "此 Gateway 上没有可用的代理。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "此 Gateway 上沒有可用的代理程式。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Nenhum agente está disponível neste gateway." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Auf diesem Gateway sind keine Agenten verfügbar." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No hay agentes disponibles en este Gateway." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "このGatewayでは利用可能なエージェントがありません。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 Gateway에서 사용할 수 있는 에이전트가 없습니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun agent n’est disponible sur ce Gateway." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "इस Gateway पर कोई एजेंट उपलब्ध नहीं है।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لا توجد وكلاء متاحة على هذا Gateway." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun agente è disponibile su questo gateway." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Bu Gateway'de kullanılabilir aracı yok." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "На цьому шлюзі немає доступних агентів." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Tidak ada agen yang tersedia di gateway ini." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Na tym gatewayu nie są dostępni żadni agenci." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่มีเอเจนต์ที่พร้อมใช้งานบน Gateway นี้" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không có tác nhân nào khả dụng trên gateway này." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er zijn geen agents beschikbaar op deze gateway." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "هیچ عاملی در این Gateway در دسترس نیست." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "На этом Gateway нет доступных агентов." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Inga agenter är tillgängliga på denna gateway." + } + } + } + }, "No agents reported": { "localizations": { "en": { @@ -100777,6 +104041,142 @@ } } }, + "No groups": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No groups" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "无群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "沒有群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Nenhum grupo" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Gruppen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No hay grupos" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "グループなし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "그룹 없음" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun groupe" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "कोई समूह नहीं" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لا توجد مجموعات" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun gruppo" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Grup yok" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Немає груп" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Tidak ada grup" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Brak grup" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่มีกลุ่ม" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không có nhóm" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen groepen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "هیچ گروهی وجود ندارد" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Нет групп" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Inga grupper" + } + } + } + }, "No instances connected": { "localizations": { "en": { @@ -105401,6 +108801,142 @@ } } }, + "None": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "None" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "无" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "無" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Nenhum" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ninguno" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "なし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "없음" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "कोई नहीं" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لا شيء" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuno" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Yok" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Немає" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Tidak ada" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Brak" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่มี" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không có" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "هیچ‌کدام" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Нет" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Ingen" + } + } + } + }, "None reported.": { "localizations": { "en": { @@ -113969,6 +117505,142 @@ } } }, + "Organization": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Organization" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "组织" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "組織" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Organização" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Organisation" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Organización" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "組織" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "조직" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Organisation" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "संगठन" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "المؤسسة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Organizzazione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Kuruluş" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Організація" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Organisasi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Organizacja" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "องค์กร" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Tổ chức" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Organisatie" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "سازمان" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Организация" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Organisation" + } + } + } + }, "Other": { "localizations": { "en": { @@ -130017,6 +133689,142 @@ } } }, + "Remove attachments or wait for delivery before archiving or deleting this session.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Remove attachments or wait for delivery before archiving or deleting this session." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "请移除附件或等待其发送完成,然后再归档或删除此会话。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "請先移除附件或等待傳送完成,再封存或刪除此工作階段。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Remova os anexos ou aguarde a entrega antes de arquivar ou excluir esta sessão." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Entfernen Sie Anhänge oder warten Sie auf deren Zustellung, bevor Sie diese Sitzung archivieren oder löschen." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Elimina los archivos adjuntos o espera a que se entreguen antes de archivar o eliminar esta sesión." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "このセッションをアーカイブまたは削除する前に、添付ファイルを削除するか、配信が完了するまでお待ちください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 세션을 보관하거나 삭제하기 전에 첨부 파일을 제거하거나 전송이 완료될 때까지 기다리세요." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimez les pièces jointes ou attendez leur envoi avant d’archiver ou de supprimer cette session." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "इस सत्र को संग्रहीत करने या हटाने से पहले अटैचमेंट हटाएँ या डिलीवरी की प्रतीक्षा करें।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "أزل المرفقات أو انتظر تسليمها قبل أرشفة هذه الجلسة أو حذفها." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi gli allegati o attendi la consegna prima di archiviare o eliminare questa sessione." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Bu oturumu arşivlemeden veya silmeden önce ekleri kaldırın ya da teslim edilmelerini bekleyin." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Видаліть вкладення або дочекайтеся їх доставлення, перш ніж архівувати чи видаляти цей сеанс." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Hapus lampiran atau tunggu hingga pengiriman selesai sebelum mengarsipkan atau menghapus sesi ini." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Usuń załączniki lub poczekaj na ich dostarczenie przed zarchiwizowaniem albo usunięciem tej sesji." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "นำไฟล์แนบออกหรือรอให้ส่งเสร็จก่อนเก็บเซสชันนี้เข้าคลังหรือลบ" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Hãy xóa tệp đính kèm hoặc chờ gửi xong trước khi lưu trữ hoặc xóa phiên này." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verwijder bijlagen of wacht op de bezorging voordat u deze sessie archiveert of verwijdert." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "پیش از بایگانی یا حذف این نشست، پیوست‌ها را حذف کنید یا منتظر تحویل آن‌ها بمانید." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Удалите вложения или дождитесь доставки, прежде чем архивировать или удалять этот сеанс." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Ta bort bilagor eller vänta på leverans innan du arkiverar eller tar bort den här sessionen." + } + } + } + }, "Remove attachments or wait for delivery to resolve before starting a new chat.": { "localizations": { "en": { @@ -131377,6 +135185,142 @@ } } }, + "Repository root": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Repository root" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "仓库根目录" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "儲存庫根目錄" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Raiz do repositório" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Repository-Stammverzeichnis" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Raíz del repositorio" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "リポジトリのルート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장소 루트" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Racine du dépôt" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "रिपॉज़िटरी रूट" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "جذر المستودع" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Radice del repository" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Depo kökü" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Корінь репозиторію" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Root repositori" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Katalog główny repozytorium" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "รากของ Repository" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thư mục gốc của kho lưu trữ" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Repositoryhoofdmap" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "ریشهٔ مخزن" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Корень репозитория" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Repositoriets rot" + } + } + } + }, "Request": { "localizations": { "en": { @@ -134505,6 +138449,142 @@ } } }, + "Retry session groups": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Retry session groups" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "重试加载会话群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "重試工作階段群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Tentar carregar os grupos de sessões novamente" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungsgruppen erneut laden" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Reintentar grupos de sesiones" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッショングループを再試行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 그룹 다시 시도" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réessayer de charger les groupes de sessions" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सत्र समूहों के लिए फिर से प्रयास करें" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "إعادة محاولة تحميل مجموعات الجلسات" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riprova gruppi di sessioni" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum gruplarını yeniden dene" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Повторити завантаження груп сеансів" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Coba lagi grup sesi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Ponów próbę wczytania grup sesji" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ลองโหลดกลุ่มเซสชันอีกครั้ง" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thử tải lại các nhóm phiên" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessiegroepen opnieuw proberen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "تلاش مجدد برای گروه‌های نشست" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Повторить загрузку групп сеансов" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Försök läsa in sessionsgrupper igen" + } + } + } + }, "Return to the queue and choose another proposal.": { "localizations": { "en": { @@ -138041,6 +142121,278 @@ } } }, + "Run duration": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Run duration" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "运行时长" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "執行時間" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Duração da execução" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausführungsdauer" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Duración de la ejecución" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "実行時間" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "실행 시간" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Durée d’exécution" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "रन की अवधि" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "مدة التشغيل" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Durata dell'esecuzione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Çalıştırma süresi" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Тривалість виконання" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Durasi proses" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Czas trwania uruchomienia" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ระยะเวลาการทำงาน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thời lượng chạy" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uitvoeringsduur" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "مدت اجرا" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Длительность выполнения" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Körtid" + } + } + } + }, + "Run ended": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Run ended" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "运行结束时间" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "執行結束時間" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Execução encerrada" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausführung beendet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ejecución finalizada" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "実行終了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "실행 종료" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fin de l’exécution" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "रन समाप्त हुआ" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "انتهى التشغيل" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Esecuzione terminata" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Çalıştırma sona erdi" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запуск завершено" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Proses berakhir" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Zakończenie uruchomienia" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "สิ้นสุดการทำงาน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Lượt chạy đã kết thúc" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uitvoering beëindigd" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "اجرا پایان یافت" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Запуск завершён" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Körning avslutad" + } + } + } + }, "Run failed": { "localizations": { "en": { @@ -138857,6 +143209,142 @@ } } }, + "Run started": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Run started" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "运行开始时间" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "執行開始時間" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Execução iniciada" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausführung gestartet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ejecución iniciada" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "実行開始" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "실행 시작" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Début de l’exécution" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "रन शुरू हुआ" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "بدأ التشغيل" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Esecuzione avviata" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Çalıştırma başladı" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Запуск розпочато" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Proses dimulai" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Rozpoczęcie uruchomienia" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เริ่มการทำงาน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Lượt chạy đã bắt đầu" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uitvoering gestart" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "اجرا آغاز شد" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Запуск начат" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Körning startad" + } + } + } + }, "Run still pending": { "localizations": { "en": { @@ -139435,8 +143923,8 @@ }, "es": { "stringUnit": { - "state": "new", - "value": "Runtime" + "state": "translated", + "value": "Entorno de ejecución" } }, "ja-JP": { @@ -145521,6 +150009,142 @@ } } }, + "Select": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Select" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "选择" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "選取" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Selecionar" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Auswählen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "चुनें" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تحديد" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Seç" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Вибрати" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Pilih" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Wybierz" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เลือก" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Chọn" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "انتخاب" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Выбрать" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Välj" + } + } + } + }, "Select refresh to load the proposal body.": { "localizations": { "en": { @@ -147833,6 +152457,278 @@ } } }, + "Session Groups": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Session Groups" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "会话群组" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "工作階段群組" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Grupos da sessão" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungsgruppen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Grupos de sesiones" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッショングループ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 그룹" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Groupes de sessions" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सेशन समूह" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "مجموعات الجلسة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gruppi della sessione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum Grupları" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Групи сеансів" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Grup Sesi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Grupy sesji" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "กลุ่มเซสชัน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Nhóm phiên" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessiegroepen" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "گروه‌های نشست" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Группы сеансов" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Sessionsgrupper" + } + } + } + }, + "Session Info": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Session Info" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "会话信息" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "工作階段資訊" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Informações da sessão" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungsinformationen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información de la sesión" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッション情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션 정보" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations sur la session" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सेशन की जानकारी" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "معلومات الجلسة" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni sulla sessione" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum Bilgileri" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Відомості про сеанс" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Info Sesi" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Informacje o sesji" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ข้อมูลเซสชัน" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Thông tin phiên" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessie-informatie" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "اطلاعات نشست" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Информация о сеансе" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Sessionsinformation" + } + } + } + }, "Session actions": { "localizations": { "en": { @@ -149057,6 +153953,142 @@ } } }, + "Sessions in this group become ungrouped.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sessions in this group become ungrouped." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "此群组中的会话将变为未分组状态。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "此群組中的工作階段將變為未分組。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "As sessões deste grupo ficarão sem grupo." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzungen in dieser Gruppe werden aus der Gruppe entfernt." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Las sesiones de este grupo quedarán sin agrupar." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "このグループ内のセッションはグループ化されていない状態になります。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 그룹의 세션은 그룹에서 해제됩니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les sessions de ce groupe ne seront plus regroupées." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "इस समूह के सत्र असमूहीकृत हो जाएँगे।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "ستصبح الجلسات في هذه المجموعة غير مصنّفة ضمن مجموعة." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Le sessioni in questo gruppo non saranno più raggruppate." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Bu gruptaki oturumlar gruptan çıkarılır." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Сеанси в цій групі більше не будуть згруповані." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Sesi dalam grup ini tidak akan lagi dikelompokkan." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Sesje w tej grupie przestaną być przypisane do grupy." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "เซสชันในกลุ่มนี้จะไม่อยู่ในกลุ่มใด" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Các phiên trong nhóm này sẽ không còn thuộc nhóm nào." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sessies in deze groep worden uit de groep gehaald." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "نشست‌های این گروه از گروه خارج می‌شوند." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Сеансы в этой группе останутся без группы." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Sessioner i den här gruppen blir ogrupperade." + } + } + } + }, "Sessions unavailable": { "localizations": { "en": { @@ -153166,7 +158198,7 @@ "de": { "stringUnit": { "state": "translated", - "value": "Denkprozess und Tool-Aktivität anzeigen" + "value": "Gedankengang und Werkzeugaktivität anzeigen" } }, "es": { @@ -153214,13 +158246,13 @@ "tr": { "stringUnit": { "state": "translated", - "value": "Akıl yürütmeyi ve araç etkinliğini göster" + "value": "Akıl yürütme ve araç etkinliğini göster" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Показувати міркування та активність інструментів" + "value": "Показувати міркування та дії інструментів" } }, "id": { @@ -153238,7 +158270,7 @@ "th": { "stringUnit": { "state": "translated", - "value": "แสดงการให้เหตุผลและกิจกรรมของเครื่องมือ" + "value": "แสดงกระบวนการให้เหตุผลและการทำงานของเครื่องมือ" } }, "vi": { @@ -168505,6 +173537,142 @@ } } }, + "The main session cannot be deleted.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The main session cannot be deleted." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "无法删除主会话。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "無法刪除主要工作階段。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "A sessão principal não pode ser excluída." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Hauptsitzung kann nicht gelöscht werden." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La sesión principal no se puede eliminar." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "メインセッションは削除できません。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본 세션은 삭제할 수 없습니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La session principale ne peut pas être supprimée." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "मुख्य सत्र को हटाया नहीं जा सकता।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لا يمكن حذف الجلسة الرئيسية." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La sessione principale non può essere eliminata." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Ana oturum silinemez." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Основний сеанс не можна видалити." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Sesi utama tidak dapat dihapus." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nie można usunąć sesji głównej." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่สามารถลบเซสชันหลักได้" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không thể xóa phiên chính." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De hoofdsessie kan niet worden verwijderd." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "نشست اصلی قابل حذف نیست." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Основной сеанс нельзя удалить." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Huvudsessionen kan inte tas bort." + } + } + } + }, "The saved TLS certificate pin for %@ no longer matches the gateway certificate. The new certificate is trusted by this device; this is commonly caused by certificate rotation.": { "localizations": { "en": { @@ -169049,6 +174217,142 @@ } } }, + "The session could not be created.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The session could not be created." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "无法创建会话。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "無法建立工作階段。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível criar a sessão." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Sitzung konnte nicht erstellt werden." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear la sesión." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "セッションを作成できませんでした。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션을 생성할 수 없습니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La session n’a pas pu être créée." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "सत्र बनाया नहीं जा सका।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تعذّر إنشاء الجلسة." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non è stato possibile creare la sessione." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Oturum oluşturulamadı." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Не вдалося створити сеанс." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Sesi tidak dapat dibuat." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nie udało się utworzyć sesji." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่สามารถสร้างเซสชันได้" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không thể tạo phiên." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De sessie kon niet worden aangemaakt." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "جلسه ایجاد نشد." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Не удалось создать сеанс." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Sessionen kunde inte skapas." + } + } + } + }, "The short-term dreaming store is empty.": { "localizations": { "en": { @@ -172449,6 +177753,142 @@ } } }, + "This session cannot be archived while it is active or running.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This session cannot be archived while it is active or running." + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "此会话处于活动或运行状态时无法归档。" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "此工作階段在作用中或執行中時無法封存。" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Esta sessão não pode ser arquivada enquanto estiver ativa ou em execução." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese Sitzung kann nicht archiviert werden, solange sie aktiv ist oder ausgeführt wird." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Esta sesión no se puede archivar mientras esté activa o en ejecución." + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "このセッションは、アクティブまたは実行中のためアーカイブできません。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 세션은 활성 상태이거나 실행 중인 동안 보관할 수 없습니다." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette session ne peut pas être archivée tant qu’elle est active ou en cours d’exécution." + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "यह सत्र सक्रिय या चल रहा होने के दौरान संग्रहीत नहीं किया जा सकता।" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لا يمكن أرشفة هذه الجلسة أثناء نشاطها أو تشغيلها." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Questa sessione non può essere archiviata mentre è attiva o in esecuzione." + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Bu oturum etkinken veya çalışırken arşivlenemez." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Цей сеанс не можна архівувати, доки він активний або виконується." + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Sesi ini tidak dapat diarsipkan saat masih aktif atau berjalan." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Nie można zarchiwizować tej sesji, gdy jest aktywna lub uruchomiona." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่สามารถเก็บเซสชันนี้เข้าคลังขณะที่ยังใช้งานหรือกำลังทำงานอยู่ได้" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Không thể lưu trữ phiên này khi phiên đang hoạt động hoặc đang chạy." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze sessie kan niet worden gearchiveerd terwijl deze actief of in uitvoering is." + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "این نشست تا زمانی که فعال یا در حال اجرا است، قابل بایگانی نیست." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Этот сеанс нельзя архивировать, пока он активен или выполняется." + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Den här sessionen kan inte arkiveras medan den är aktiv eller körs." + } + } + } + }, "Time zone": { "localizations": { "en": { @@ -176665,6 +182105,142 @@ } } }, + "Updated": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Updated" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "更新时间" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "已更新" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Atualizado" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktualisiert" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Actualizado" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "更新日時" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업데이트됨" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mis à jour" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "अपडेट किया गया" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "تم التحديث" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiornato" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Güncellendi" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Оновлено" + } + }, + "id": { + "stringUnit": { + "state": "translated", + "value": "Diperbarui" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Zaktualizowano" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "อัปเดตแล้ว" + } + }, + "vi": { + "stringUnit": { + "state": "translated", + "value": "Đã cập nhật" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bijgewerkt" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "به‌روزرسانی‌شده" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Обновлено" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Uppdaterad" + } + } + } + }, "Updated %@": { "localizations": { "en": { @@ -185233,6 +190809,142 @@ } } }, + "Worktree": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Worktree" + } + }, + "zh-CN": { + "stringUnit": { + "state": "translated", + "value": "工作树" + } + }, + "zh-TW": { + "stringUnit": { + "state": "translated", + "value": "工作樹" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Árvore de trabalho" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Arbeitsbaum" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Árbol de trabajo" + } + }, + "ja-JP": { + "stringUnit": { + "state": "translated", + "value": "ワークツリー" + } + }, + "ko": { + "stringUnit": { + "state": "new", + "value": "Worktree" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Arbre de travail" + } + }, + "hi": { + "stringUnit": { + "state": "translated", + "value": "वर्कट्री" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "شجرة العمل" + } + }, + "it": { + "stringUnit": { + "state": "new", + "value": "Worktree" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Çalışma ağacı" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Робоче дерево" + } + }, + "id": { + "stringUnit": { + "state": "new", + "value": "Worktree" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Drzewo robocze" + } + }, + "th": { + "stringUnit": { + "state": "new", + "value": "Worktree" + } + }, + "vi": { + "stringUnit": { + "state": "new", + "value": "Worktree" + } + }, + "nl": { + "stringUnit": { + "state": "new", + "value": "Worktree" + } + }, + "fa": { + "stringUnit": { + "state": "translated", + "value": "درخت کاری" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Рабочее дерево" + } + }, + "sv": { + "stringUnit": { + "state": "translated", + "value": "Arbetskopia" + } + } + } + }, "Writing": { "localizations": { "en": { diff --git a/apps/ios/Tests/Info.plist b/apps/ios/Tests/Info.plist index 5bcf88ff5ad..7b5a9804f20 100644 --- a/apps/ios/Tests/Info.plist +++ b/apps/ios/Tests/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - OpenClawTests + OpenClawLogicTests CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/apps/linux/src-tauri/src/gateway_device_identity.rs b/apps/linux/src-tauri/src/gateway_device_identity.rs index 0094981f1bb..0657a86e78a 100644 --- a/apps/linux/src-tauri/src/gateway_device_identity.rs +++ b/apps/linux/src-tauri/src/gateway_device_identity.rs @@ -61,6 +61,8 @@ pub(crate) struct GatewayDeviceIdentityStore { identity: GatewayDeviceIdentity, } +// This credential boundary (gateway_device_identity.rs:65-98) intentionally excludes setup-code +// and bootstrapToken redemption; those require a dedicated product UI and remain follow-up work. #[derive(Clone, Eq, PartialEq)] pub(crate) enum GatewayAuth { DeviceToken(String), diff --git a/apps/linux/src-tauri/src/gateway_ws.rs b/apps/linux/src-tauri/src/gateway_ws.rs index cf701a03406..f6da2924e04 100644 --- a/apps/linux/src-tauri/src/gateway_ws.rs +++ b/apps/linux/src-tauri/src/gateway_ws.rs @@ -26,6 +26,7 @@ use tokio_tungstenite::{ use uuid::Uuid; const GATEWAY_STATE_EVENT: &str = "quickchat:gateway-state"; +const CHAT_EVENT: &str = "quickchat:chat-event"; const GATEWAY_DEVICE_IDENTITY_FILE: &str = "quickchat-gateway-device.json"; const AGENTS_CACHE_TTL: Duration = Duration::from_secs(60); const CONNECT_TIMEOUT: Duration = Duration::from_secs(10); @@ -35,6 +36,8 @@ const COMMAND_TIMEOUT: Duration = Duration::from_secs(35); const DRIVER_TICK: Duration = Duration::from_secs(1); const MAX_RECONNECT_DELAY: Duration = Duration::from_secs(30); const PAIRING_REQUIRED_DETAIL_CODE: &str = "PAIRING_REQUIRED"; +const AUTH_TOKEN_MISSING_DETAIL_CODE: &str = "AUTH_TOKEN_MISSING"; +const AUTH_PASSWORD_MISSING_DETAIL_CODE: &str = "AUTH_PASSWORD_MISSING"; const AUTH_DEVICE_TOKEN_MISMATCH_DETAIL_CODE: &str = "AUTH_DEVICE_TOKEN_MISMATCH"; const TLS_PIN_MISMATCH_ERROR: &str = "Gateway TLS certificate fingerprint mismatch"; @@ -212,6 +215,7 @@ struct ChatSendParams { #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct ChatSendAck { + run_id: String, status: String, #[serde(default)] error: Option, @@ -219,10 +223,19 @@ struct ChatSendAck { message: Option, } -#[derive(Clone, Debug, Eq, PartialEq)] -struct ChatRoutingTarget { - session_key: String, - agent_id: Option, +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ChatRoutingTarget { + pub(crate) session_key: String, + pub(crate) agent_id: Option, +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ChatSendResult { + #[serde(flatten)] + pub(crate) target: ChatRoutingTarget, + pub(crate) run_id: String, } enum GatewayRequest { @@ -243,11 +256,66 @@ enum DriverCommand { Reconfigure, } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum GatewayConnectionState { + Down = 0, + Up = 1, + PairingRequired = 2, + CredentialRequired = 3, + TlsFailure = 4, +} + +impl GatewayConnectionState { + fn from_u64(value: u64) -> Self { + match value { + 1 => Self::Up, + 2 => Self::PairingRequired, + 3 => Self::CredentialRequired, + 4 => Self::TlsFailure, + _ => Self::Down, + } + } + + fn event_name(self) -> &'static str { + match self { + Self::Down => "down", + Self::Up => "up", + Self::PairingRequired => "pairing-required", + Self::CredentialRequired => "credential-required", + Self::TlsFailure => "tls-failure", + } + } +} + +#[derive(Clone, Debug, Default, Eq, PartialEq)] +struct ConnectErrorDetails { + code: Option, + device_id: Option, + remediation_hint: Option, + retryable: Option, + pause_reconnect: Option, +} + +impl ConnectErrorDetails { + fn from_value(value: Option<&Value>) -> Self { + let Some(value) = value else { + return Self::default(); + }; + Self { + code: connect_detail_text(value.get("code"), 80), + device_id: connect_detail_text(value.get("deviceId"), 128), + remediation_hint: connect_detail_text(value.get("remediationHint"), 240), + retryable: value.get("retryable").and_then(Value::as_bool), + pause_reconnect: value.get("pauseReconnect").and_then(Value::as_bool), + } + } +} + struct RequestFailure { message: String, disconnect: bool, - detail_code: Option, - pairing_required: bool, + connect_details: ConnectErrorDetails, + connect_state: Option, tls_failure: bool, } @@ -256,8 +324,8 @@ impl RequestFailure { Self { message: message.into(), disconnect: true, - detail_code: None, - pairing_required: false, + connect_details: ConnectErrorDetails::default(), + connect_state: None, tls_failure: false, } } @@ -266,69 +334,38 @@ impl RequestFailure { Self { message: message.into(), disconnect: true, - detail_code: None, - pairing_required: false, + connect_details: ConnectErrorDetails::default(), + connect_state: None, tls_failure: true, } } - fn method_with_detail(message: impl Into, detail_code: Option) -> Self { + fn method_with_details(message: impl Into, details: Option<&Value>) -> Self { Self { message: message.into(), disconnect: false, - detail_code, - pairing_required: false, + connect_details: ConnectErrorDetails::from_value(details), + connect_state: None, tls_failure: false, } } fn classify_connect(mut self, auth: &GatewayAuth) -> Self { - let pairing_required = self.detail_code.as_deref() == Some(PAIRING_REQUIRED_DETAIL_CODE); - let missing_bootstrap_auth = auth.is_none() - && self - .detail_code - .as_deref() - .is_some_and(|code| code.starts_with("AUTH_")); - self.pairing_required = pairing_required || missing_bootstrap_auth; + self.connect_state = + classify_connect_failure(self.connect_details.code.as_deref(), !auth.is_none()); self } } -#[derive(Clone, Copy, Eq, PartialEq)] -enum GatewayConnectionState { - Down = 0, - Up = 1, - PairingRequired = 2, - TlsFailure = 3, -} - -impl GatewayConnectionState { - fn from_u64(value: u64) -> Self { - match value { - 1 => Self::Up, - 2 => Self::PairingRequired, - 3 => Self::TlsFailure, - _ => Self::Down, - } - } - - fn event_name(self) -> &'static str { - match self { - Self::Down => "down", - Self::Up => "up", - Self::PairingRequired => "pairing-required", - Self::TlsFailure => "tls-failure", - } - } -} - struct GatewayClientInner { config: Mutex>, config_generation: AtomicU64, commands: Mutex>>, agents_cache: Mutex>, identity: Mutex>, + connection_notice: Mutex>, connection_state: AtomicU64, + reconnect_paused: AtomicBool, running: AtomicBool, } @@ -346,7 +383,9 @@ impl GatewayClient { commands: Mutex::new(None), agents_cache: Mutex::new(None), identity: Mutex::new(None), + connection_notice: Mutex::new(None), connection_state: AtomicU64::new(GatewayConnectionState::Down as u64), + reconnect_paused: AtomicBool::new(false), running: AtomicBool::new(false), }), } @@ -364,7 +403,8 @@ impl GatewayClient { .lock() .expect("gateway agents cache mutex poisoned") = None; self.inner.config_generation.fetch_add(1, Ordering::SeqCst); - self.set_connection_state(app, GatewayConnectionState::Down); + self.inner.reconnect_paused.store(false, Ordering::SeqCst); + self.set_connection_state(app, GatewayConnectionState::Down, None); if let Some(commands) = self .inner .commands @@ -388,7 +428,8 @@ impl GatewayClient { .lock() .expect("gateway agents cache mutex poisoned") = None; self.inner.config_generation.fetch_add(1, Ordering::SeqCst); - self.set_connection_state(app, GatewayConnectionState::Down); + self.inner.reconnect_paused.store(false, Ordering::SeqCst); + self.set_connection_state(app, GatewayConnectionState::Down, None); if let Some(commands) = self .inner .commands @@ -417,10 +458,16 @@ impl GatewayClient { } pub fn emit_current_state(&self, window: &WebviewWindow) -> Result<(), String> { + let notice = self + .inner + .connection_notice + .lock() + .map_err(|_| "Gateway connection notice is unavailable.".to_string())? + .clone(); window .emit( GATEWAY_STATE_EVENT, - GatewayStateEvent::new(self.connection_state()), + GatewayStateEvent::new(self.connection_state(), notice), ) .map_err(|error| format!("Could not report Gateway connectivity: {error}")) } @@ -456,12 +503,12 @@ impl GatewayClient { scope: &str, main_key: &str, idempotency_key: &str, - ) -> Result<(), String> { + ) -> Result { let target = routing_target(scope, selected_agent_id, main_key); let response = self .request(GatewayRequest::ChatSend(ChatSendParams { - session_key: target.session_key, - agent_id: target.agent_id, + session_key: target.session_key.clone(), + agent_id: target.agent_id.clone(), message, idempotency_key: idempotency_key.to_string(), })) @@ -469,7 +516,26 @@ impl GatewayClient { let GatewayResponse::ChatSend(ack) = response else { return Err("Gateway returned the wrong response for chat.send.".to_string()); }; - classify_chat_ack(&ack) + classify_chat_ack(&ack)?; + Ok(ChatSendResult { + target, + run_id: ack.run_id, + }) + } + + pub fn resume_reconnect(&self) { + if !self.inner.reconnect_paused.load(Ordering::SeqCst) { + return; + } + if let Some(commands) = self + .inner + .commands + .lock() + .expect("gateway command mutex poisoned") + .as_ref() + { + let _ = commands.try_send(DriverCommand::Reconfigure); + } } async fn request(&self, request: GatewayRequest) -> Result { @@ -498,7 +564,8 @@ impl GatewayClient { let mut reconnect_attempt = 0_u32; loop { if app.get_webview_window(QUICKCHAT_LABEL).is_none() { - self.set_connection_state(&app, GatewayConnectionState::Down); + self.inner.reconnect_paused.store(false, Ordering::SeqCst); + self.set_connection_state(&app, GatewayConnectionState::Down, None); tokio::time::sleep(DRIVER_TICK).await; reconnect_attempt = 0; continue; @@ -510,7 +577,8 @@ impl GatewayClient { .expect("gateway config mutex poisoned") .clone(); let Some(config) = config else { - self.set_connection_state(&app, GatewayConnectionState::Down); + self.inner.reconnect_paused.store(false, Ordering::SeqCst); + self.set_connection_state(&app, GatewayConnectionState::Down, None); tokio::time::sleep(DRIVER_TICK).await; continue; }; @@ -522,12 +590,45 @@ impl GatewayClient { .connect_and_serve(&app, &config, generation, &mut receiver) .await; let reached_hello = self.is_connected(); - let disconnected_state = match connection_result.as_ref() { - Err(failure) if failure.pairing_required => GatewayConnectionState::PairingRequired, - Err(failure) if failure.tls_failure => GatewayConnectionState::TlsFailure, - _ => GatewayConnectionState::Down, - }; - self.set_connection_state(&app, disconnected_state); + let failure = connection_result.as_ref().err(); + let disconnected_state = failure + .and_then(|failure| failure.connect_state) + .or_else(|| { + failure + .is_some_and(|failure| failure.tls_failure) + .then_some(GatewayConnectionState::TlsFailure) + }) + .unwrap_or(GatewayConnectionState::Down); + let pause_reconnect = failure + .map(|failure| should_pause_reconnect(&failure.connect_details)) + .unwrap_or(false); + let notice = failure.and_then(|failure| { + connection_notice( + disconnected_state, + &failure.connect_details, + pause_reconnect, + ) + }); + self.inner + .reconnect_paused + .store(pause_reconnect, Ordering::SeqCst); + self.set_connection_state(&app, disconnected_state, notice); + if pause_reconnect { + // Server retry policy is authoritative: explicit pauseReconnect or retryable=false + // waits for a fresh user summon instead of burning the capped backoff loop. + loop { + let Some(command) = receiver.recv().await else { + return; + }; + match command { + DriverCommand::Reconfigure => break, + command => reject_disconnected_command(command), + } + } + self.inner.reconnect_paused.store(false, Ordering::SeqCst); + reconnect_attempt = 0; + continue; + } reconnect_attempt = if reached_hello { 1 } else { @@ -566,7 +667,7 @@ impl GatewayClient { let signed_at_ms = unix_time_ms().map_err(RequestFailure::transport)?; let params = connect_params(&identity, &auth, &nonce, signed_at_ms) .map_err(RequestFailure::transport)?; - let hello = match request_on_socket(&mut socket, "connect", params).await { + let hello = match request_on_socket(app, &mut socket, "connect", params).await { Ok(hello) => hello, Err(failure) => { let failure = failure.classify_connect(&auth); @@ -582,12 +683,12 @@ impl GatewayClient { self.persist_device_token(&config.ws_url, device_token)?; } - let agents = request_agents_list(&mut socket).await?; + let agents = request_agents_list(app, &mut socket).await?; if self.inner.config_generation.load(Ordering::SeqCst) != generation { return Ok(()); } self.cache_agents(agents); - self.set_connection_state(app, GatewayConnectionState::Up); + self.set_connection_state(app, GatewayConnectionState::Up, None); let mut last_gateway_activity = Instant::now(); loop { @@ -604,7 +705,7 @@ impl GatewayClient { match command { DriverCommand::Reconfigure => return Ok(()), DriverCommand::Request { request, reply } => { - let result = perform_request(&mut socket, request).await; + let result = perform_request(app, &mut socket, request).await; last_gateway_activity = Instant::now(); match result { Ok(response) => { @@ -623,7 +724,7 @@ impl GatewayClient { } } incoming = socket.next() => { - handle_idle_message(&mut socket, incoming).await?; + handle_idle_message(app, &mut socket, incoming).await?; last_gateway_activity = Instant::now(); } _ = tokio::time::sleep(DRIVER_TICK) => { @@ -719,7 +820,12 @@ impl GatewayClient { GatewayConnectionState::from_u64(self.inner.connection_state.load(Ordering::SeqCst)) } - fn set_connection_state(&self, app: &AppHandle, state: GatewayConnectionState) { + fn set_connection_state( + &self, + app: &AppHandle, + state: GatewayConnectionState, + notice: Option, + ) { if state != GatewayConnectionState::Up { *self .inner @@ -727,18 +833,31 @@ impl GatewayClient { .lock() .expect("gateway agents cache mutex poisoned") = None; } - if self + let notice_changed = { + let mut current = self + .inner + .connection_notice + .lock() + .expect("gateway connection notice mutex poisoned"); + if *current == notice { + false + } else { + *current = notice.clone(); + true + } + }; + let state_changed = self .inner .connection_state .swap(state as u64, Ordering::SeqCst) - == state as u64 - { + != state as u64; + if !state_changed && !notice_changed { return; } let _ = app.emit_to( QUICKCHAT_LABEL, GATEWAY_STATE_EVENT, - GatewayStateEvent::new(state), + GatewayStateEvent::new(state, notice), ); } } @@ -746,12 +865,15 @@ impl GatewayClient { #[derive(Clone, Serialize)] struct GatewayStateEvent { state: &'static str, + #[serde(skip_serializing_if = "Option::is_none")] + notice: Option, } impl GatewayStateEvent { - fn new(state: GatewayConnectionState) -> Self { + fn new(state: GatewayConnectionState, notice: Option) -> Self { Self { state: state.event_name(), + notice, } } } @@ -777,6 +899,75 @@ fn routing_target(scope: &str, selected_agent_id: &str, main_key: &str) -> ChatR } } +fn connect_detail_text(value: Option<&Value>, max_chars: usize) -> Option { + let normalized = value + .and_then(Value::as_str)? + .split_whitespace() + .collect::>() + .join(" "); + if normalized.is_empty() { + return None; + } + Some(normalized.chars().take(max_chars).collect()) +} + +fn classify_connect_failure( + detail_code: Option<&str>, + has_local_credential: bool, +) -> Option { + if detail_code == Some(PAIRING_REQUIRED_DETAIL_CODE) { + return Some(GatewayConnectionState::PairingRequired); + } + let credential_required = !has_local_credential + && detail_code.is_some_and(|code| { + code == AUTH_TOKEN_MISSING_DETAIL_CODE + || code == AUTH_PASSWORD_MISSING_DETAIL_CODE + || (code.starts_with("AUTH_") && code.ends_with("_MISMATCH")) + }); + credential_required.then_some(GatewayConnectionState::CredentialRequired) +} + +fn should_pause_reconnect(details: &ConnectErrorDetails) -> bool { + details.pause_reconnect == Some(true) || details.retryable == Some(false) +} + +fn short_device_id(device_id: &str) -> Option { + let short = device_id + .chars() + .filter(|character| character.is_ascii_alphanumeric()) + .take(8) + .collect::(); + (!short.is_empty()).then_some(short) +} + +fn connection_notice( + state: GatewayConnectionState, + details: &ConnectErrorDetails, + reconnect_paused: bool, +) -> Option { + let fallback = match state { + GatewayConnectionState::PairingRequired => "Approve this device in the dashboard (Nodes)", + GatewayConnectionState::CredentialRequired => { + "Gateway requires a credential — open the dashboard on the gateway host" + } + _ if reconnect_paused => "Gateway connection paused — reopen Quick Chat to retry", + _ => return None, + }; + // The Gateway owns recovery semantics and can give more precise operator guidance than this + // client. Keep only its bounded plain-text hint, then add the safe pairing identifier. + let mut notice = details + .remediation_hint + .clone() + .unwrap_or_else(|| fallback.to_string()); + if state == GatewayConnectionState::PairingRequired { + if let Some(device_id) = details.device_id.as_deref().and_then(short_device_id) { + notice.push_str(" · Device "); + notice.push_str(&device_id); + } + } + Some(notice) +} + fn reconnect_backoff(attempt: u32) -> Duration { let shift = attempt.saturating_sub(1).min(5); Duration::from_secs((1_u64 << shift).min(MAX_RECONNECT_DELAY.as_secs())) @@ -784,7 +975,7 @@ fn reconnect_backoff(attempt: u32) -> Duration { fn should_clear_stored_device_token(failure: &RequestFailure, auth: &GatewayAuth) -> bool { matches!(auth, GatewayAuth::DeviceToken(_)) - && failure.detail_code.as_deref() == Some(AUTH_DEVICE_TOKEN_MISMATCH_DETAIL_CODE) + && failure.connect_details.code.as_deref() == Some(AUTH_DEVICE_TOKEN_MISMATCH_DETAIL_CODE) } fn connect_params( @@ -849,6 +1040,7 @@ async fn wait_for_connect_challenge(socket: &mut GatewaySocket) -> Result Result { match request { - GatewayRequest::AgentsList => request_agents_list(socket) + GatewayRequest::AgentsList => request_agents_list(app, socket) .await .map(GatewayResponse::AgentsList), GatewayRequest::ChatSend(params) => { let params = serde_json::to_value(params).map_err(|error| { RequestFailure::transport(format!("Could not encode chat.send: {error}")) })?; - let payload = request_on_socket(socket, "chat.send", params).await?; + let payload = request_on_socket(app, socket, "chat.send", params).await?; serde_json::from_value(payload) .map(GatewayResponse::ChatSend) .map_err(|error| { @@ -915,9 +1106,10 @@ async fn perform_request( } async fn request_agents_list( + app: &AppHandle, socket: &mut GatewaySocket, ) -> Result { - let payload = request_on_socket(socket, "agents.list", json!({})).await?; + let payload = request_on_socket(app, socket, "agents.list", json!({})).await?; serde_json::from_value(payload).map_err(|error| { RequestFailure::transport(format!("Invalid agents.list response: {error}")) }) @@ -1089,6 +1281,7 @@ async fn next_json(socket: &mut GatewaySocket) -> Result } async fn handle_idle_message( + app: &AppHandle, socket: &mut GatewaySocket, incoming: Option>, ) -> Result<(), RequestFailure> { @@ -1098,6 +1291,12 @@ async fn handle_idle_message( RequestFailure::transport(format!("Gateway connection failed: {error}")) })?; match message { + Message::Text(text) => { + if let Ok(value) = serde_json::from_str::(text.as_ref()) { + dispatch_chat_event(app, &value); + } + Ok(()) + } Message::Ping(payload) => socket.send(Message::Pong(payload)).await.map_err(|error| { RequestFailure::transport(format!("Could not answer Gateway ping: {error}")) }), @@ -1106,6 +1305,18 @@ async fn handle_idle_message( } } +fn dispatch_chat_event(app: &AppHandle, frame: &Value) { + if frame.get("type").and_then(Value::as_str) != Some("event") + || frame.get("event").and_then(Value::as_str) != Some("chat") + { + return; + } + if let Some(payload) = frame.get("payload") { + // Payload stays raw so the WebView can mirror Gateway delta assembly without native drift. + let _ = app.emit_to(QUICKCHAT_LABEL, CHAT_EVENT, payload.clone()); + } +} + fn unix_time_ms() -> Result { SystemTime::now() .duration_since(UNIX_EPOCH) @@ -1133,6 +1344,11 @@ mod tests { agent_id: None, } ); + assert_eq!( + serde_json::to_value(routing_target("global", "work", "main")) + .expect("serialized routing target"), + json!({ "sessionKey": "global", "agentId": "work" }) + ); } #[test] @@ -1169,6 +1385,7 @@ mod tests { fn chat_ack_acceptance_is_explicit() { for status in ["ok", "started", "in_flight"] { assert!(classify_chat_ack(&ChatSendAck { + run_id: "run-1".to_string(), status: status.to_string(), error: None, message: None, @@ -1177,6 +1394,7 @@ mod tests { } for status in ["error", "timeout", "queued"] { assert!(classify_chat_ack(&ChatSendAck { + run_id: "run-1".to_string(), status: status.to_string(), error: Some(json!({ "message": "not accepted" })), message: None, @@ -1291,33 +1509,122 @@ mod tests { } #[test] - fn pairing_failures_map_to_the_pairing_strip_state() { - let pending = RequestFailure::method_with_detail( - "pairing required", - Some(PAIRING_REQUIRED_DETAIL_CODE.to_string()), - ) - .classify_connect(&GatewayAuth::SharedToken("bootstrap".to_string())); - assert!(pending.pairing_required); + fn connect_classification_separates_pairing_and_missing_credentials() { + assert_eq!( + classify_connect_failure(Some(PAIRING_REQUIRED_DETAIL_CODE), true), + Some(GatewayConnectionState::PairingRequired) + ); + assert_eq!( + classify_connect_failure(Some(AUTH_TOKEN_MISSING_DETAIL_CODE), false), + Some(GatewayConnectionState::CredentialRequired) + ); + assert_eq!( + classify_connect_failure(Some("AUTH_TOKEN_MISMATCH"), false), + Some(GatewayConnectionState::CredentialRequired) + ); + assert_eq!( + classify_connect_failure(Some("AUTH_TOKEN_MISMATCH"), true), + None + ); + assert_eq!( + GatewayConnectionState::CredentialRequired.event_name(), + "credential-required" + ); - let missing_bootstrap = RequestFailure::method_with_detail( - "token missing", - Some("AUTH_TOKEN_MISSING".to_string()), - ) - .classify_connect(&GatewayAuth::None); - assert!(missing_bootstrap.pairing_required); + let pairing_details = json!({ "code": PAIRING_REQUIRED_DETAIL_CODE }); + let pending = + RequestFailure::method_with_details("pairing required", Some(&pairing_details)) + .classify_connect(&GatewayAuth::SharedToken("bootstrap".to_string())); + assert_eq!( + pending.connect_state, + Some(GatewayConnectionState::PairingRequired) + ); + + let missing_details = json!({ "code": AUTH_TOKEN_MISSING_DETAIL_CODE }); + let missing_auth_failure = + RequestFailure::method_with_details("token missing", Some(&missing_details)) + .classify_connect(&GatewayAuth::None); + assert_eq!( + missing_auth_failure.connect_state, + Some(GatewayConnectionState::CredentialRequired) + ); + + let mismatch_details = json!({ "code": "AUTH_TOKEN_MISMATCH" }); + let mismatch_without_auth = + RequestFailure::method_with_details("token mismatch", Some(&mismatch_details)) + .classify_connect(&GatewayAuth::None); + assert_eq!( + mismatch_without_auth.connect_state, + Some(GatewayConnectionState::CredentialRequired) + ); + let mismatch_with_auth = + RequestFailure::method_with_details("token mismatch", Some(&mismatch_details)) + .classify_connect(&GatewayAuth::SharedToken("configured".to_string())); + assert_eq!(mismatch_with_auth.connect_state, None); - let stale_device_auth = RequestFailure::method_with_detail( + let stale_device_details = json!({ "code": AUTH_DEVICE_TOKEN_MISMATCH_DETAIL_CODE }); + let stale_device_auth = RequestFailure::method_with_details( "device token mismatch", - Some(AUTH_DEVICE_TOKEN_MISMATCH_DETAIL_CODE.to_string()), + Some(&stale_device_details), ) .classify_connect(&GatewayAuth::DeviceToken("stale".to_string())); - assert!(!stale_device_auth.pairing_required); + assert_eq!(stale_device_auth.connect_state, None); assert!(should_clear_stored_device_token( &stale_device_auth, &GatewayAuth::DeviceToken("stale".to_string()) )); } + #[test] + fn reconnect_pause_requires_explicit_server_policy() { + let pause_details = json!({ "pauseReconnect": true }); + let paused = RequestFailure::method_with_details("pause", Some(&pause_details)); + assert!(should_pause_reconnect(&paused.connect_details)); + + let terminal_details = json!({ "retryable": false }); + let terminal = RequestFailure::method_with_details("terminal", Some(&terminal_details)); + assert!(should_pause_reconnect(&terminal.connect_details)); + + let retry_details = json!({ "retryable": true, "pauseReconnect": false }); + let retry = RequestFailure::method_with_details("retry", Some(&retry_details)); + assert!(!should_pause_reconnect(&retry.connect_details)); + assert!(!should_pause_reconnect( + &RequestFailure::transport("transport").connect_details + )); + } + + #[test] + fn connection_notices_prefer_server_guidance_and_shorten_device_ids() { + let details = ConnectErrorDetails::from_value(Some(&json!({ + "remediationHint": "Use the Nodes approval queue.", + "deviceId": "abcdef1234567890" + }))); + assert_eq!( + connection_notice(GatewayConnectionState::PairingRequired, &details, true).as_deref(), + Some("Use the Nodes approval queue. · Device abcdef12") + ); + assert_eq!( + connection_notice( + GatewayConnectionState::CredentialRequired, + &ConnectErrorDetails::default(), + true, + ) + .as_deref(), + Some("Gateway requires a credential — open the dashboard on the gateway host") + ); + assert_eq!( + connection_notice( + GatewayConnectionState::Down, + &ConnectErrorDetails::from_value(Some(&json!({ + "remediationHint": "Replace the configured credential." + }))), + true, + ) + .as_deref(), + Some("Replace the configured credential.") + ); + } + #[test] fn chat_send_frame_matches_gateway_schema() { let params = ChatSendParams { @@ -1344,4 +1651,16 @@ mod tests { }) ); } + + #[test] + fn chat_send_result_flattens_route_and_ack_run_id() { + let result = ChatSendResult { + target: routing_target("global", "work", "main"), + run_id: "run-1".to_string(), + }; + assert_eq!( + serde_json::to_value(result).expect("serialized chat send result"), + json!({ "sessionKey": "global", "agentId": "work", "runId": "run-1" }) + ); + } } diff --git a/apps/linux/src-tauri/src/quickchat.rs b/apps/linux/src-tauri/src/quickchat.rs index 724fb801874..ec3d8e7563b 100644 --- a/apps/linux/src-tauri/src/quickchat.rs +++ b/apps/linux/src-tauri/src/quickchat.rs @@ -1,4 +1,4 @@ -use crate::gateway_ws::{AgentsListResult, GatewayClient}; +use crate::gateway_ws::{AgentsListResult, ChatSendResult, GatewayClient}; use crate::{tray, DesktopState}; use serde::Serialize; use std::fs; @@ -513,6 +513,7 @@ pub fn toggle_quickchat(app: &AppHandle) { fn show_quickchat(app: &AppHandle) -> Result<(), String> { let window = ensure_quickchat_window(app)?; + app.state::().resume_reconnect(); window .set_size(LogicalSize::new(QUICKCHAT_WIDTH, QUICKCHAT_HEIGHT)) .map_err(|error| format!("Could not reset Quick Chat size: {error}"))?; @@ -588,7 +589,7 @@ pub async fn quickchat_send( gateway: State<'_, GatewayClient>, state: State<'_, QuickChatState>, message: String, -) -> Result<(), String> { +) -> Result { require_quickchat_window(&window)?; let message = message.trim().to_string(); if message.is_empty() { diff --git a/apps/linux/ui/quickchat.css b/apps/linux/ui/quickchat.css index b1f06abbd65..21f7d9c2124 100644 --- a/apps/linux/ui/quickchat.css +++ b/apps/linux/ui/quickchat.css @@ -220,11 +220,98 @@ body.shown .composer { opacity 120ms ease; } -.composer.has-error .status { +.composer.has-error > .status, +.reply.has-error .reply-error { max-height: 16px; opacity: 1; } +.reply { + padding: 10px 3px 2px 46px; + border-top: 1px solid rgb(255 255 255 / 7%); + margin-top: 9px; +} + +.reply-header { + display: flex; + min-height: 24px; + margin-bottom: 6px; + align-items: center; + justify-content: space-between; +} + +.reply-agent { + display: inline-flex; + min-width: 0; + padding: 2px 7px 2px 2px; + gap: 6px; + align-items: center; + border: 1px solid rgb(255 255 255 / 8%); + border-radius: 999px; + color: #d7d7da; + background: rgb(255 255 255 / 4%); +} + +.reply-agent .agent-avatar-mini { + flex-basis: 20px; + width: 20px; + height: 20px; + font-size: 10px; +} + +.reply-agent-name { + overflow: hidden; + font-size: 11px; + font-weight: 600; + text-overflow: ellipsis; + white-space: nowrap; +} + +.reply-state { + padding-right: 3px; + color: #7f7f84; + font-size: 10px; + letter-spacing: 0.02em; + opacity: 0; + text-transform: uppercase; + transition: opacity 120ms ease; +} + +.reply.is-terminal .reply-state { + opacity: 1; +} + +.reply-scroll { + max-height: 228px; + padding-right: 5px; + overflow-y: auto; + scrollbar-color: rgb(255 255 255 / 16%) transparent; + scrollbar-width: thin; +} + +.reply-text { + overflow-wrap: anywhere; + color: #ededee; + font: 400 13px/1.5 inherit; + white-space: pre-wrap; +} + +.reply-thinking { + display: inline-block; + color: transparent; + font-size: 12px; + background: linear-gradient(100deg, #777 20%, #d2d2d4 48%, #777 76%); + -webkit-background-clip: text; + background-clip: text; + background-size: 220% 100%; + animation: shimmer 1.35s ease-in-out infinite; +} + +.reply-error { + margin-left: 0; + white-space: normal; +} + .popover { position: absolute; z-index: 2; @@ -356,6 +443,16 @@ body.shown .popover:not([hidden]) { } } +@keyframes shimmer { + from { + background-position: 100% 0; + } + + to { + background-position: -100% 0; + } +} + @media (prefers-reduced-motion: reduce) { *, *::before, @@ -369,4 +466,9 @@ body.shown .popover:not([hidden]) { body.shown .composer { transform: none; } + + .reply-thinking { + color: #8e8e93; + background: none; + } } diff --git a/apps/linux/ui/quickchat.html b/apps/linux/ui/quickchat.html index feb757aade1..b3048cfaa89 100644 --- a/apps/linux/ui/quickchat.html +++ b/apps/linux/ui/quickchat.html @@ -43,6 +43,20 @@ + -
-
-

${t("mcpPage.configuredServers")}

-
-

- ${t("mcpPage.runtimeHint")} - ${t("mcpPage.manageServersLink")} -

-
- ${rows.length - ? rows.map((row) => renderServerRow(row)) - : renderSettingsEmpty(t("mcpPage.noServers"))} -
-
+ ${props.editor} diff --git a/ui/src/pages/config/notifications-section.ts b/ui/src/pages/config/notifications-section.ts new file mode 100644 index 00000000000..c017ae6c9df --- /dev/null +++ b/ui/src/pages/config/notifications-section.ts @@ -0,0 +1,261 @@ +import { html, nothing } from "lit"; +import type { NativeNotificationsPermission } from "../../app/native-notifications.ts"; +import { icons } from "../../components/icons.ts"; +import { + renderSettingsRow, + renderSettingsStatus, + renderSettingsValue, +} from "../../components/settings-ui.ts"; +import { t } from "../../i18n/index.ts"; +import { COMMUNICATION_SETTINGS_TARGET_IDS } from "./settings-targets.ts"; + +export type WebPushUiState = { + supported: boolean; + permission: NotificationPermission | "unsupported"; + subscribed: boolean; + loading: boolean; + error?: string | null; +}; + +// Leaf props contract: view.ts imports this module, so importing ConfigProps +// back from view.ts would create an import cycle. ConfigProps is structurally +// assignable to this subset. +type NotificationsSectionProps = { + connected: boolean; + nativeNotifications?: { permission: NativeNotificationsPermission | "unknown" }; + onNativeNotificationsRequestPermission?: () => void; + onNativeNotificationsSendTest?: () => void; + webPush?: WebPushUiState; + onWebPushSubscribe?: () => void; + onWebPushUnsubscribe?: () => void; + onWebPushTest?: () => void; +}; + +function nativeNotificationsStatus(permission: NativeNotificationsPermission | "unknown"): { + kind: "ok" | "danger" | "accent" | "muted"; + label: string; +} { + switch (permission) { + case "granted": + return { kind: "ok", label: t("configView.notifications.granted") }; + case "denied": + return { kind: "danger", label: t("configView.notifications.denied") }; + case "notDetermined": + return { kind: "accent", label: t("configView.notifications.notRequested") }; + default: + return { kind: "muted", label: t("configView.notifications.checking") }; + } +} + +export function renderNotificationsSection(props: NotificationsSectionProps) { + const native = props.nativeNotifications; + if (native) { + const status = nativeNotificationsStatus(native.permission); + const actionButton = + native.permission === "notDetermined" + ? html` + + ` + : native.permission === "denied" + ? html` + + ` + : native.permission === "granted" + ? html` + + ` + : nothing; + + return html` +
+
+
+

${t("configView.notifications.nativeTitle")}

+
${renderSettingsStatus(status)}
+
+

${t("configView.notifications.nativeHint")}

+
+ ${renderSettingsRow({ + title: t("configView.notifications.permission"), + control: renderSettingsValue(status.label), + })} + ${actionButton !== nothing + ? html` +
+
${actionButton}
+
+ ` + : nothing} + ${native.permission === "denied" + ? renderSettingsRow({ + title: t("configView.notifications.blocked"), + description: t("configView.notifications.nativeBlockedHint"), + control: renderSettingsStatus({ + kind: "danger", + label: t("configView.notifications.denied"), + }), + }) + : nothing} +
+
+
+ `; + } + + const push = props.webPush; + if (!push) { + return html` +
+
+
+

${t("configView.notifications.title")}

+
+ ${renderSettingsStatus({ + kind: "muted", + label: t("configView.notifications.unavailable"), + })} +
+
+
+
+
+ + ${t("configView.notifications.unavailableHint")} + +
+
+
+
+
+ `; + } + + const permissionLabel = + push.permission === "granted" + ? t("configView.notifications.granted") + : push.permission === "denied" + ? t("configView.notifications.denied") + : push.permission === "default" + ? t("configView.notifications.notRequested") + : t("configView.notifications.unsupported"); + const subscriptionLabel = push.subscribed + ? t("configView.notifications.subscribed") + : t("configView.notifications.notSubscribed"); + const statusLabel = !push.supported + ? t("configView.notifications.unsupported") + : push.permission === "denied" + ? t("configView.notifications.blocked") + : push.subscribed + ? t("configView.notifications.subscribed") + : t("configView.notifications.ready"); + const statusKind = !push.supported + ? ("muted" as const) + : push.permission === "denied" + ? ("danger" as const) + : push.subscribed + ? ("ok" as const) + : ("accent" as const); + + const actionButtons = + push.supported && push.permission !== "denied" + ? push.subscribed + ? html` + + + ` + : html` + + ` + : nothing; + + return html` +
+
+
+

${t("configView.notifications.title")}

+
+ ${renderSettingsStatus({ kind: statusKind, label: statusLabel })} +
+
+

${t("configView.notifications.hint")}

+
+ ${renderSettingsRow({ + title: t("configView.notifications.browserSupport"), + control: renderSettingsValue( + push.supported + ? t("configView.notifications.available") + : t("configView.notifications.notSupported"), + ), + })} + ${renderSettingsRow({ + title: t("configView.notifications.permission"), + control: renderSettingsValue(permissionLabel), + })} + ${renderSettingsRow({ + title: t("configView.notifications.status"), + control: renderSettingsStatus({ + kind: push.subscribed ? "ok" : "muted", + label: subscriptionLabel, + }), + })} + ${actionButtons !== nothing + ? html` +
+
${actionButtons}
+
+ ` + : nothing} + ${push.permission === "denied" + ? renderSettingsRow({ + title: t("configView.notifications.blocked"), + description: t("configView.notifications.blockedHint"), + control: renderSettingsStatus({ + kind: "danger", + label: t("configView.notifications.denied"), + }), + }) + : nothing} + ${push.error + ? html` +
+
+ ${push.error} +
+
+ ` + : nothing} +
+
+
+ `; +} diff --git a/ui/src/pages/config/quick.ts b/ui/src/pages/config/quick.ts index 8529595e896..fc70d2ffe90 100644 --- a/ui/src/pages/config/quick.ts +++ b/ui/src/pages/config/quick.ts @@ -23,6 +23,7 @@ import { } from "../../components/settings-ui.ts"; import { t, type Locale } from "../../i18n/index.ts"; import { formatBytes } from "../../lib/agents/display.ts"; +import { BASE_THINKING_LEVELS } from "../../lib/chat/thinking.ts"; import type { ConfigAutoSaveStatus } from "../../lib/config/index.ts"; import { formatDurationHuman } from "../../lib/format.ts"; import { renderLanguageSelect } from "./language-select.ts"; @@ -67,7 +68,9 @@ type QuickSettingsProps = { version: string; }; -const THINKING_LEVELS = ["off", "low", "medium", "high"]; +// The compact General hub intentionally omits "minimal"; the full list stays +// available on session-level pickers. +const THINKING_LEVELS = BASE_THINKING_LEVELS.filter((level) => level !== "minimal"); /** Section wrapper that keeps the stable settings-search scroll target ids. */ function renderTargetSection( @@ -97,6 +100,7 @@ function renderGeneralSection(props: QuickSettingsProps) { return renderSettingsSection({ title: t("nav.settingsGeneral") }, [ renderSettingsRow({ title: t("quickSettings.language"), + description: t("configView.syncedHint"), control: renderLanguageSelect(props.locale, props.onLocaleChange), }), ]); diff --git a/ui/src/pages/config/security.test.ts b/ui/src/pages/config/security.test.ts index 1679f162a75..0efa4373f26 100644 --- a/ui/src/pages/config/security.test.ts +++ b/ui/src/pages/config/security.test.ts @@ -94,9 +94,9 @@ describe("renderSecurity", () => { browserInput.dispatchEvent(new Event("change")); expect(onBrowserEnabledToggle).toHaveBeenCalledWith(true); - selectRadio(expectButtonByText(container, "full")); + selectRadio(expectButtonByText(container, "Full")); expect(onToolProfileChange).toHaveBeenCalledWith("full"); - const activeProfile = expectButtonByText(container, "messaging"); + const activeProfile = expectButtonByText(container, "Messaging"); expect(activeProfile.classList.contains("settings-segmented__btn--active")).toBe(true); }); @@ -106,7 +106,7 @@ describe("renderSecurity", () => { render(renderSecurity(createProps({ configBusy: true, onToolProfileChange })), container); - const profileButton = expectButtonByText(expectRowByTitle(container, "Tool profile"), "full"); + const profileButton = expectButtonByText(expectRowByTitle(container, "Tool profile"), "Full"); expect( (profileButton.closest("wa-radio-group") as HTMLElement & { disabled?: boolean }).disabled, ).toBe(true); diff --git a/ui/src/pages/config/security.ts b/ui/src/pages/config/security.ts index 1a1b742f74f..44686f7095f 100644 --- a/ui/src/pages/config/security.ts +++ b/ui/src/pages/config/security.ts @@ -12,6 +12,7 @@ import { renderSettingsValue, } from "../../components/settings-ui.ts"; import { t } from "../../i18n/index.ts"; +import { PROFILE_OPTIONS } from "../../lib/agents/display.ts"; export type SecurityOverview = { gatewayAuth: string; @@ -32,14 +33,16 @@ type SecurityViewProps = { editor: TemplateResult; }; -const TOOL_PROFILES = ["minimal", "coding", "messaging", "full"]; - function renderSecurityOverview(props: SecurityViewProps) { const { gatewayAuth, execPolicy, deviceAuth, browserEnabled, toolProfile } = props.security; const normalizedToolProfile = toolProfile.trim() || "full"; - const toolProfiles = TOOL_PROFILES.includes(normalizedToolProfile) - ? TOOL_PROFILES - : [...TOOL_PROFILES, normalizedToolProfile]; + const profileOptions = PROFILE_OPTIONS.map((profile) => ({ + value: profile.id as string, + label: t(profile.labelKey), + })); + if (!profileOptions.some((option) => option.value === normalizedToolProfile)) { + profileOptions.push({ value: normalizedToolProfile, label: normalizedToolProfile }); + } return renderSettingsSection({ title: t("quickSettings.security.title") }, [ renderSettingsRow({ title: t("quickSettings.security.gatewayAuth"), @@ -63,7 +66,7 @@ function renderSecurityOverview(props: SecurityViewProps) { stacked: true, control: renderSettingsSegmented({ value: normalizedToolProfile, - options: toolProfiles.map((profile) => ({ value: profile, label: profile })), + options: profileOptions, disabled: props.configBusy, onChange: (profile) => props.onToolProfileChange?.(profile), }), diff --git a/ui/src/pages/config/settings-search.test.ts b/ui/src/pages/config/settings-search.test.ts index 0aef30b06a6..66ba835b013 100644 --- a/ui/src/pages/config/settings-search.test.ts +++ b/ui/src/pages/config/settings-search.test.ts @@ -201,6 +201,23 @@ describe("findSettingsSearchBlocks", () => { ]); }); + it("routes workspace queries to the sessions-hub pages", () => { + const matches = findSettingsSearchBlocks({ + query: "worktree", + schema: null, + value: null, + uiHints: {}, + }); + + expect(matches).toEqual([ + expect.objectContaining({ + routeId: "worktrees", + label: "Managed Worktrees", + hash: "", + }), + ]); + }); + it("does not create block results for an empty query", () => { expect( findSettingsSearchBlocks({ diff --git a/ui/src/pages/config/settings-search.ts b/ui/src/pages/config/settings-search.ts index c7fc8755718..1949e6afb24 100644 --- a/ui/src/pages/config/settings-search.ts +++ b/ui/src/pages/config/settings-search.ts @@ -14,6 +14,7 @@ import { AUTOMATION_SECTION_KEYS, COMMUNICATION_SECTION_KEYS, INFRASTRUCTURE_SECTION_KEYS, + MCP_SECTION_KEYS, SECURITY_SECTION_KEYS, } from "./config-sections.ts"; import { @@ -182,21 +183,50 @@ const COMMUNICATION_SETTINGS_BLOCKS = { "configView.notifications.subscribed", "configView.notifications.notSubscribed", "configView.notifications.enable", + "configView.notifications.nativeTitle", + "configView.notifications.nativeHint", + "configView.notifications.openSystemSettings", ], aliases: "vapid gateway", }, } as const satisfies Record; +// Sessions-hub workspace pages have no schema-backed config section, so they +// only surface in search through these static entries. +const WORKSPACE_SETTINGS_BLOCKS = { + sessions: { + routeId: "sessions", + labelKey: "sessionsView.title", + hash: "", + searchKeys: ["sessionsView.subtitle", "sessionsView.archivedOnly"], + aliases: "history archive overrides", + }, + worktrees: { + routeId: "worktrees", + labelKey: "worktrees.title", + hash: "", + searchKeys: [ + "worktrees.subtitle", + "worktrees.cleanupTitle", + "worktrees.cleanupMaxCount", + "worktrees.cleanupMaxSize", + ], + aliases: "git checkout branch cleanup", + }, +} as const satisfies Record; + const STATIC_SETTINGS_BLOCKS: readonly StaticSettingsBlockDescriptor[] = [ ...Object.values(GENERAL_SETTINGS_BLOCKS), ...Object.values(APPEARANCE_SETTINGS_BLOCKS), ...Object.values(COMMUNICATION_SETTINGS_BLOCKS), + ...Object.values(WORKSPACE_SETTINGS_BLOCKS), ]; const COMMUNICATION_SECTIONS = new Set(COMMUNICATION_SECTION_KEYS); const APPEARANCE_SECTIONS = new Set(APPEARANCE_SECTION_KEYS); const SECURITY_SECTIONS = new Set(SECURITY_SECTION_KEYS); const AUTOMATION_SECTIONS = new Set(AUTOMATION_SECTION_KEYS); +const MCP_SECTIONS = new Set(MCP_SECTION_KEYS); const INFRASTRUCTURE_SECTIONS = new Set(INFRASTRUCTURE_SECTION_KEYS); const AI_AGENTS_SECTIONS = new Set(AI_AGENTS_SECTION_KEYS); @@ -211,7 +241,7 @@ function resolveStaticSettingsBlock(block: StaticSettingsBlockDescriptor): Stati } function routeForConfigSection(key: string): RouteId { - if (key === "mcp") { + if (MCP_SECTIONS.has(key)) { return "mcp"; } if (COMMUNICATION_SECTIONS.has(key)) { diff --git a/ui/src/pages/config/view.browser.test.ts b/ui/src/pages/config/view.browser.test.ts index 3a9725fb3a5..50cf4c06a00 100644 --- a/ui/src/pages/config/view.browser.test.ts +++ b/ui/src/pages/config/view.browser.test.ts @@ -1,11 +1,18 @@ // Control UI tests cover config behavior. import { render } from "lit"; -import { describe, expect, it, vi } from "vitest"; +import { beforeAll, describe, expect, it, vi } from "vitest"; import "../../styles.css"; import type { ThemeMode, ThemeName } from "../../app/theme.ts"; +import { warmJson5 } from "../../lib/json5-runtime.ts"; import { createConfigViewState, renderConfig, type ConfigProps } from "./view.ts"; describe("config view", () => { + // The view module warms the lazy JSON5 parser on load; tests assert the + // steady state where raw diffs parse synchronously. + beforeAll(async () => { + await warmJson5(); + }); + const baseProps = () => ({ raw: "{\n}\n", originalRaw: "{\n}\n", diff --git a/ui/src/pages/config/view.ts b/ui/src/pages/config/view.ts index 313d9c800f5..6aedc7b69b5 100644 --- a/ui/src/pages/config/view.ts +++ b/ui/src/pages/config/view.ts @@ -1,9 +1,10 @@ // Control UI view renders config screen content. +import "../../styles/lobster-pet.css"; import { truncateUtf16Safe } from "@openclaw/normalization-core/utf16-slice"; -import JSON5 from "json5"; -import { html, nothing, type TemplateResult } from "lit"; +import { html, nothing } from "lit"; import type { QueueMode } from "../../../../src/auto-reply/reply/queue/types.js"; import type { ConfigUiHints } from "../../api/types.ts"; +import type { NativeNotificationsPermission } from "../../app/native-notifications.ts"; import { normalizeChatFollowUpMode, normalizeChatSendShortcut, @@ -25,12 +26,12 @@ import { schemaType, type JsonSchema, } from "../../components/config-form.shared.ts"; -import "../../components/tooltip.ts"; import { analyzeConfigSchema, renderConfigForm, type ConfigSchemaAnalysis, } from "../../components/config-form.ts"; +import "../../components/tooltip.ts"; import { icons } from "../../components/icons.ts"; import { getLobsterdex, getLobsterdexEntries } from "../../components/lobster-dex.ts"; import { @@ -47,12 +48,15 @@ import { } from "../../components/settings-ui.ts"; import { t } from "../../i18n/index.ts"; import type { ConfigAutoSaveStatus } from "../../lib/config/index.ts"; +import { isJson5Warm, parseJson5Text, warmJson5 } from "../../lib/json5-runtime.ts"; import type { RealtimeTalkInputDevice } from "../chat/realtime-talk-input.ts"; +import { renderNotificationsSection, type WebPushUiState } from "./notifications-section.ts"; import { renderSettingsSelectRow } from "./settings-select-row.ts"; -import { - APPEARANCE_SETTINGS_TARGET_IDS, - COMMUNICATION_SETTINGS_TARGET_IDS, -} from "./settings-targets.ts"; +import { APPEARANCE_SETTINGS_TARGET_IDS } from "./settings-targets.ts"; + +// The config editor is where JSON5 text first appears; warm the parser with +// the page instead of racing the first raw-draft keystroke. +void warmJson5().catch(() => undefined); const TEXT_SCALE_LABELS: Record = { 90: "configView.textSizes.small", @@ -62,14 +66,6 @@ const TEXT_SCALE_LABELS: Record = { 140: "configView.textSizes.xxl", }; -type WebPushUiState = { - supported: boolean; - permission: NotificationPermission | "unsupported"; - subscribed: boolean; - loading: boolean; - error?: string | null; -}; - type SettingsMicrophoneState = { devices: RealtimeTalkInputDevice[]; selectedDeviceId: string; @@ -198,6 +194,9 @@ export type ConfigProps = { includeVirtualSections?: boolean; /** Layout mode: "tabs" (default flat scroll) or "accordion" (grouped collapsible). */ settingsLayout?: "tabs" | "accordion"; + nativeNotifications?: { permission: NativeNotificationsPermission | "unknown" }; + onNativeNotificationsRequestPermission?: () => void; + onNativeNotificationsSendTest?: () => void; webPush?: WebPushUiState; onWebPushSubscribe?: () => void; onWebPushUnsubscribe?: () => void; @@ -746,8 +745,8 @@ function computeRawDiff( return viewState.rawDiffCache.diff; } try { - const originalValue = JSON5.parse(original) as unknown; - const currentValue = JSON5.parse(current) as unknown; + const originalValue = parseJson5Text(original); + const currentValue = parseJson5Text(current); if ( !originalValue || !currentValue || @@ -766,7 +765,12 @@ function computeRawDiff( viewState.rawDiffCache = { original, current, diff }; return diff; } catch { - viewState.rawDiffCache = { original, current, diff: [] }; + // While the lazy JSON5 parser is still loading, a parse failure may be + // transient; skip the cache so the next render retries instead of pinning + // an empty diff for this text pair. + if (isJson5Warm()) { + viewState.rawDiffCache = { original, current, diff: [] }; + } return []; } } @@ -836,29 +840,42 @@ type ThemeOption = { id: ThemeName; labelKey: string; descriptionKey: string; - icon: TemplateResult; }; const BUILTIN_THEME_OPTIONS: ThemeOption[] = [ { id: "claw", labelKey: "configView.themes.claw.label", descriptionKey: "configView.themes.claw.description", - icon: icons.zap, }, { id: "knot", labelKey: "configView.themes.knot.label", descriptionKey: "configView.themes.knot.description", - icon: icons.link, }, { id: "dash", labelKey: "configView.themes.dash.label", descriptionKey: "configView.themes.dash.description", - icon: icons.barChart, }, ]; +/* Builtin cards preview their real palette (chip colors live in config.css, + mirrored from the base.css theme blocks). The custom card only has real + colors while active — its chips read the live CSS variables — so it falls + back to the spark icon otherwise. */ +function renderThemeCardVisual(id: ThemeName, activeTheme: ThemeName) { + if (id === "custom" && activeTheme !== "custom") { + return html``; + } + return html` + + `; +} + function importedThemeName(props: Pick) { return props.hasCustomTheme && props.customThemeLabel ? props.customThemeLabel @@ -885,156 +902,6 @@ function focusCustomThemeImportInput() { }); } -function renderNotificationsSection(props: ConfigProps) { - const push = props.webPush; - if (!push) { - return html` -
-
-
-

${t("configView.notifications.title")}

-
- ${renderSettingsStatus({ - kind: "muted", - label: t("configView.notifications.unavailable"), - })} -
-
-
-
-
- - ${t("configView.notifications.unavailableHint")} - -
-
-
-
-
- `; - } - - const permissionLabel = - push.permission === "granted" - ? t("configView.notifications.granted") - : push.permission === "denied" - ? t("configView.notifications.denied") - : push.permission === "default" - ? t("configView.notifications.notRequested") - : t("configView.notifications.unsupported"); - const subscriptionLabel = push.subscribed - ? t("configView.notifications.subscribed") - : t("configView.notifications.notSubscribed"); - const statusLabel = !push.supported - ? t("configView.notifications.unsupported") - : push.permission === "denied" - ? t("configView.notifications.blocked") - : push.subscribed - ? t("configView.notifications.subscribed") - : t("configView.notifications.ready"); - const statusKind = !push.supported - ? ("muted" as const) - : push.permission === "denied" - ? ("danger" as const) - : push.subscribed - ? ("ok" as const) - : ("accent" as const); - - const actionButtons = - push.supported && push.permission !== "denied" - ? push.subscribed - ? html` - - - ` - : html` - - ` - : nothing; - - return html` -
-
-
-

${t("configView.notifications.title")}

-
- ${renderSettingsStatus({ kind: statusKind, label: statusLabel })} -
-
-

${t("configView.notifications.hint")}

-
- ${renderSettingsRow({ - title: t("configView.notifications.browserSupport"), - control: renderSettingsValue( - push.supported - ? t("configView.notifications.available") - : t("configView.notifications.notSupported"), - ), - })} - ${renderSettingsRow({ - title: t("configView.notifications.permission"), - control: renderSettingsValue(permissionLabel), - })} - ${renderSettingsRow({ - title: t("configView.notifications.status"), - control: renderSettingsStatus({ - kind: push.subscribed ? "ok" : "muted", - label: subscriptionLabel, - }), - })} - ${actionButtons !== nothing - ? html` -
-
${actionButtons}
-
- ` - : nothing} - ${push.permission === "denied" - ? renderSettingsRow({ - title: t("configView.notifications.blocked"), - description: t("configView.notifications.blockedHint"), - control: renderSettingsStatus({ - kind: "danger", - label: t("configView.notifications.denied"), - }), - }) - : nothing} - ${push.error - ? html` -
-
- ${push.error} -
-
- ` - : nothing} -
-
-
- `; -} - function renderSettingsMicrophoneField(props: ConfigProps) { const microphone = props.microphone; if (!microphone || !props.onMicrophoneSelect) { @@ -1110,7 +977,9 @@ function renderChatPreferencesSection(props: ConfigProps) {

${t("configView.chatPrefs.title")}

-

${t("configView.chatPrefs.hint")}

+

+ ${t("configView.chatPrefs.hint")} ${t("configView.syncedHint")} +

${renderSettingsSelectRow({ title: t("chat.sendShortcut"), @@ -1264,13 +1133,11 @@ function renderAppearanceSection(props: ConfigProps) { id: ThemeName; label: string; description: string; - icon: TemplateResult; }> = [ ...BUILTIN_THEME_OPTIONS.map((option) => ({ id: option.id, label: t(option.labelKey), description: t(option.descriptionKey), - icon: option.icon, })), { id: "custom", @@ -1278,7 +1145,6 @@ function renderAppearanceSection(props: ConfigProps) { description: props.hasCustomTheme ? t("configView.appearance.importedFrom", { name: importedName }) : t("configView.appearance.importHint"), - icon: icons.spark, }, ]; return html` @@ -1287,14 +1153,17 @@ function renderAppearanceSection(props: ConfigProps) {

${t("configView.appearance.theme")}

-

${t("configView.appearance.chooseTheme")}

+

+ ${t("configView.appearance.chooseTheme")} ${t("configView.syncedHint")} +

${themeOptions.map( (opt) => html` - - `, - }); + const { label, ...secret } = params; + return renderSettingsRow({ title: label, control: renderSettingsSecretInput(secret) }); } export function renderConnection(props: ConnectionProps) { diff --git a/ui/src/pages/nodes/view-pairing.ts b/ui/src/pages/nodes/view-pairing.ts index 8b0d3f68f25..27c17c4e558 100644 --- a/ui/src/pages/nodes/view-pairing.ts +++ b/ui/src/pages/nodes/view-pairing.ts @@ -20,6 +20,7 @@ type DevicePairSetupProps = { onClose: () => void; onCopy: (setupCode: string) => void; onManageDevices: () => void; + onGetApps: () => void; }; export function renderDevicePairSetup(props: DevicePairSetupProps) { @@ -40,6 +41,10 @@ export function renderDevicePairSetup(props: DevicePairSetupProps) {

${title}

${description}

+

+ ${t("nodes.pairing.noApp")} + +

-
- `; -} - -function renderTabStrip(state: WorkspaceUiState, workspace: WorkspaceDocument): TemplateResult { - const tabs = visibleTabs(workspace); - const hidden = hiddenTabs(workspace); - return html` - ) => - navigateToWorkspaceTab(event.detail.name)} - > - ${tabs.map((tab) => { - return html` - - ${tab.icon && Object.hasOwn(icons, tab.icon) - ? html`` - : nothing} - ${tab.title} - - `; - })} - ${hidden.length > 0 - ? html` - ) => { - const slug = event.detail.item.value; - if (slug) { - navigateToWorkspaceTab(slug); - } - }} - > - - ${hidden.map( - (tab) => html` - - ${tab.title} - - `, - )} - - ` - : nothing} - - `; -} - -/** - * Load `widget.json` manifests for the APPROVED custom widgets on the active tab. - * Only approved widgets ever build an iframe, so only they need a manifest; a - * pending/rejected widget never fetches one. Workspace changes, reconnects, and - * approaching server expiry clear the cache: capabilities are approval-scoped - * and process-local, so they must never outlive either boundary. - */ -function ensureManifests( - viewState: WorkspaceViewState, - props: WorkspaceProps, - workspace: WorkspaceDocument, - tab: WorkspaceTab, -): void { - if (!props.connected || !props.client) { - return; - } - if (viewState.manifestVersion !== workspace.workspaceVersion) { - viewState.manifestCache.clear(); - viewState.manifestLoads.clear(); - viewState.manifestVersion = workspace.workspaceVersion; - } - const manifestVersion = viewState.manifestVersion; - const manifestEpoch = viewState.manifestEpoch; - for (const widget of tab.widgets) { - const name = customWidgetName(widget.kind); - const cached = name ? viewState.manifestCache.get(name) : undefined; - if (name && cached?.frameExpiresAt && cached.frameExpiresAt <= Date.now() + 60_000) { - viewState.manifestCache.delete(name); - } - if ( - !name || - customWidgetStatus(workspace, widget.kind) !== "approved" || - viewState.manifestCache.has(name) || - viewState.manifestLoads.has(name) - ) { - continue; - } - viewState.manifestLoads.add(name); - void loadWidgetManifestView(props.client, name).then((manifest) => { - // A fetch started for an older approval must not repopulate the cache after - // a workspace update invalidated it. - if ( - viewState.manifestVersion !== manifestVersion || - viewState.manifestEpoch !== manifestEpoch - ) { - return; - } - viewState.manifestLoads.delete(name); - if (manifest) { - viewState.manifestCache.set(name, manifest); - props.onRequestUpdate(); - } - }); - } -} - -/** Builds the L5 custom-widget context for one `custom:` widget, or null. */ -function buildCustomContext( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, - workspace: WorkspaceDocument, - widget: WorkspaceWidget, -): WorkspaceCustomWidgetContext | null { - const name = customWidgetName(widget.kind); - if (!name) { - return null; - } - const host: CustomWidgetHostContext = { - client: props.client, - basePath: props.basePath ?? "", - sessionKey: props.sessionKey ?? "main", - }; - const createdBy = workspace.widgetsRegistry[name]?.createdBy; - return { - status: customWidgetStatus(workspace, widget.kind), - ...(createdBy ? { createdBy } : {}), - manifest: viewState.manifestCache.get(name) ?? null, - host, - onApprove: () => void approveWidget(state, props.client, { name, decision: "approved" }), - onReject: () => void approveWidget(state, props.client, { name, decision: "rejected" }), - }; -} - -/** Shared ambient builtin state; full-bleed tabs must preserve every grid capability. */ -function buildBuiltinContext( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, - workspace: WorkspaceDocument, -): BuiltinWidgetContext { - const decideCustomWidget = props.canApproveWidgets - ? (name: string, decision: "approved" | "rejected") => { - void approveWidget(state, props.client, { name, decision }); - } - : undefined; - return { - basePath: props.basePath ?? "", - embed: props.embed ?? DEFAULT_EMBED_CONTEXT, - preview: { - getViewport: (widgetId, fallback) => viewState.previewViewports.get(widgetId) ?? fallback, - setViewport: (widgetId, viewport) => { - viewState.previewViewports.set(widgetId, viewport); - props.onRequestUpdate?.(); - }, - }, - customWidgetApprovals: buildCustomWidgetApprovalsSource( - workspace, - state.pendingApprovalNames, - decideCustomWidget, - ), - }; -} - -function renderGrid( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, - workspace: WorkspaceDocument, - tab: WorkspaceTab, -): TemplateResult { - ensureBindings(viewState, props.client, workspace, tab, props.onRequestUpdate ?? null); - ensureManifests(viewState, props, workspace, tab); - if (tab.widgets.length === 0) { - // #15: dashed placeholder card with an icon so an empty tab reads as an - // intentional drop zone. - return html` -
- -
${t("workspaces.empty.tabTitle")}
-
${t("workspaces.empty.tabSubtitle")}
-
- `; - } - if (tab.layout === "full") { - return renderFullBleed(props, state, viewState, workspace, tab); - } - const callbacks = makeCallbacks(props, state, viewState, tab); - const builtinContext = buildBuiltinContext(props, state, viewState, workspace); - const rows = gridRowCount(tab.widgets); - const minHeight = rows * WORKSPACE_ROW_HEIGHT + Math.max(0, rows - 1) * WORKSPACE_GRID_GAP; - return html` -
- ${tab.widgets.map((widget) => { - const custom = buildCustomContext(props, state, viewState, workspace, widget); - return renderWidgetCell({ - widget, - binding: viewState.bindingResults.get(widget.id) ?? null, - menuOpen: viewState.openMenuWidgetId === widget.id, - pending: state.pendingWidgetIds.has(widget.id), - dragging: viewState.drag?.widgetId === widget.id, - builtinContext, - callbacks, - ...(custom ? { custom } : {}), - }); - })} - ${renderDragGhost(viewState, tab)} -
- `; -} - -/** App-like tabs render their first widget through the same approval and sandbox path. */ -function renderFullBleed( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, - workspace: WorkspaceDocument, - tab: WorkspaceTab, -): TemplateResult { - const widget = tab.widgets[0]!; - const callbacks = makeCallbacks(props, state, viewState, tab); - const builtinContext = buildBuiltinContext(props, state, viewState, workspace); - const custom = buildCustomContext(props, state, viewState, workspace, widget); - return html`
- ${renderWorkspaceWidgetBody( - widget, - viewState.bindingResults.get(widget.id) ?? null, - builtinContext, - callbacks, - custom ?? undefined, - )} -
`; -} - -/** - * Snapped drop-target ghost for the active move/resize drag (#4). Placed in the - * same grid slot the drop would land in so the target is obvious. An overlapping - * (reject-bound) target reads distinctly via `--invalid`. - */ -function renderDragGhost( - viewState: WorkspaceViewState, - tab: WorkspaceTab, -): TemplateResult | typeof nothing { - const drag = viewState.drag; - if (!drag) { - return nothing; - } - const invalid = collides(drag.ghostRect, tab.widgets, drag.widgetId); - return html` - - `; -} - -function makeCallbacks( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, - tab: WorkspaceTab, -): WorkspaceWidgetCellCallbacks { - const requestUpdate = () => props.onRequestUpdate?.(); - const commitDrag = (widget: WorkspaceWidget, event: PointerEvent, mode: "move" | "resize") => { - const metrics = gridMetrics(props.host); - if (metrics.width <= 0) { - return; - } - const drag = beginDrag({ - widget, - mode, - clientX: event.clientX, - clientY: event.clientY, - metrics, - }); - viewState.drag = drag; - const target = event.target as Element; - if (target.setPointerCapture) { - target.setPointerCapture(event.pointerId); - } - // Once cancelled (tab-switch/disconnect via stopWorkspace), the window - // listeners are removed and any late pointerup becomes a no-op so it cannot - // fire moveWidget against a stale tab/client. - let settled = false; - const teardown = () => { - window.removeEventListener("pointermove", onMove); - window.removeEventListener("pointerup", onUp); - }; - const cancel = () => { - if (settled) { - return; - } - settled = true; - teardown(); - viewState.drag = null; - requestUpdate(); - }; - const onMove = (moveEvent: PointerEvent) => { - updateDrag(drag, moveEvent.clientX, moveEvent.clientY); - requestUpdate(); - }; - const onUp = () => { - if (settled) { - return; - } - settled = true; - teardown(); - clearActiveDrag(props.host); - const resolved = resolveDrop({ - requested: drag.ghostRect, - widgets: tab.widgets, - widgetId: widget.id, - }); - viewState.drag = null; - requestUpdate(); - if ( - resolved && - (resolved.x !== widget.grid.x || - resolved.y !== widget.grid.y || - resolved.w !== widget.grid.w || - resolved.h !== widget.grid.h) - ) { - void moveWidget(state, props.client, { - slug: tab.slug, - widgetId: widget.id, - grid: resolved, - }); - } - }; - window.addEventListener("pointermove", onMove); - window.addEventListener("pointerup", onUp); - registerActiveDrag(props.host, cancel); - }; - return { - onToggleCollapse: (widget) => - void setWidgetCollapsed(state, props.client, { - slug: tab.slug, - widgetId: widget.id, - collapsed: !widget.collapsed, - }), - onToggleMenu: (widget) => { - viewState.openMenuWidgetId = viewState.openMenuWidgetId === widget.id ? null : widget.id; - requestUpdate(); - }, - onCloseMenu: () => { - viewState.openMenuWidgetId = null; - requestUpdate(); - }, - onHide: (widget) => { - viewState.openMenuWidgetId = null; - // Hiding removes the widget from view and persists the hidden flag; distinct - // from remove, which deletes it from the document. - void hideWidget(state, props.client, { slug: tab.slug, widgetId: widget.id }); - }, - onRemove: (widget) => { - viewState.openMenuWidgetId = null; - viewState.previewViewports.delete(widget.id); - void removeWidgetFromTab(state, props.client, { slug: tab.slug, widgetId: widget.id }); - }, - onEditTitle: (widget) => { - viewState.openMenuWidgetId = null; - // #12: open the themed edit-title dialog instead of window.prompt(). - viewState.dialog = { - kind: "editTitle", - slug: tab.slug, - widgetId: widget.id, - title: widget.title, - }; - requestUpdate(); - }, - onMoveToTab: (widget) => { - viewState.openMenuWidgetId = null; - // #12: open the themed move-to-tab dialog (a select of existing tabs, not a - // free-text slug entry). - viewState.dialog = { kind: "moveToTab", slug: tab.slug, widgetId: widget.id }; - requestUpdate(); - }, - onMovePointerDown: (widget, event) => { - if (event.button !== 0) { - return; - } - event.preventDefault(); - commitDrag(widget, event, "move"); - }, - onResizePointerDown: (widget, event) => { - if (event.button !== 0) { - return; - } - event.preventDefault(); - event.stopPropagation(); - commitDrag(widget, event, "resize"); - }, - onKeyboardNudge: (widget, mode, direction) => { - const next = nudgeRect(widget.grid, mode, direction); - const resolved = resolveDrop({ requested: next, widgets: tab.widgets, widgetId: widget.id }); - if (resolved) { - void moveWidget(state, props.client, { - slug: tab.slug, - widgetId: widget.id, - grid: resolved, - }); - } - }, - }; -} - -/** - * Themed edit-title / move-to-tab dialog (#12), replacing window.prompt(). Reuses - * the app's openclaw-modal-dialog (Escape/backdrop cancel, focus trap) and the - * exec-approval card idiom. Move-to-tab offers a select of existing tabs. - */ -function renderDialog( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, -): TemplateResult | typeof nothing { - const dialog = viewState.dialog; - if (!dialog) { - return nothing; - } - const requestUpdate = () => props.onRequestUpdate?.(); - const close = () => { - viewState.dialog = null; - requestUpdate(); - }; - - if (dialog.kind === "editTitle") { - const title = t("workspaces.widget.editTitleTitle"); - const submit = (event: Event) => { - event.preventDefault(); - const input = (event.currentTarget as HTMLElement).querySelector( - "input[name='workspace-widget-title']", - ); - const next = input?.value.trim() ?? ""; - if (next && next !== dialog.title) { - void updateWidgetTitle(state, props.client, { - slug: dialog.slug, - widgetId: dialog.widgetId, - title: next, - }); - } - close(); - }; - return html` - -
-
-
${title}
-
- -
- - -
-
-
- `; - } - - const title = t("workspaces.widget.moveToTabTitle"); - const targets = state.workspace - ? orderedTabs(state.workspace).filter((candidate) => candidate.slug !== dialog.slug) - : []; - const submit = (event: Event) => { - event.preventDefault(); - const select = (event.currentTarget as HTMLElement).querySelector( - "select[name='workspace-move-target']", - ); - const toSlug = select?.value ?? ""; - if (toSlug && toSlug !== dialog.slug) { - void moveWidgetToTab(state, props.client, { - fromSlug: dialog.slug, - toSlug, - widgetId: dialog.widgetId, - }); - } - close(); - }; - return html` - -
-
-
${title}
-
- ${targets.length === 0 - ? html`
- ${t("workspaces.widget.moveToTabEmpty")} -
` - : html``} -
- - -
-
-
- `; -} - -export function renderWorkspace(props: WorkspaceProps): TemplateResult { - const state = getWorkspaceState(props.host); - const viewState = getViewState(props.host); - const sessionListRevision = props.sessionListRevision; - if (viewState.sessionListRevisionSeen && sessionListRevision !== viewState.sessionListRevision) { - // The shared session capability already coalesced the canonical event refresh. - // Drop only sessions.list values; unrelated data widgets keep their caches. - viewState.sessionBindingGeneration += 1; - invalidateCanonicalSessionBindings(viewState, state.workspace); - } - viewState.sessionListRevision = sessionListRevision; - viewState.sessionListRevisionSeen = true; - state.requestUpdate = props.onRequestUpdate ?? null; - // Keep the outside-click / Escape dismiss listeners in sync with the open kebab - // menu (#3). Cheap no-op when the open state is unchanged. - syncMenuDismiss(props.host, viewState, () => props.onRequestUpdate?.()); - - const requestedSlug = requestedWorkspaceSlug(window.location.search); - const active = props.connected; - // Gateway restart revokes every in-memory frame capability without changing - // workspaceVersion. A disconnect/reconnect therefore starts a new cache epoch. - if (viewState.manifestConnected !== active) { - viewState.manifestConnected = active; - viewState.manifestEpoch += 1; - viewState.manifestCache.clear(); - viewState.manifestLoads.clear(); - viewState.manifestVersion = -1; - } - subscribeToWorkspaceEvents(props.host, state, active ? props.client : null); - // Per-widget data refresh: a visibility-gated timer bumps the data version so - // the next render re-resolves data-widget bindings. stopWorkspace clears it on - // tab-leave/disconnect (logbook's stop discipline — no orphan timers). - startBindingPolling(props.host, active ? props.client : null, () => { - bumpWorkspaceDataVersion(props.host); - props.onRequestUpdate?.(); - }); - if (active && !state.loaded && !state.loading && !state.error) { - void loadWorkspace(state, props.client, { requestedSlug }); - } - - // Deep-link: a changed `?ws=` re-points the active tab without a refetch. - if (!requestedSlug) { - cancelWorkspaceLoadIntent(state); - } else if (state.workspace) { - setActiveWorkspaceSlug(state, state.workspace, requestedSlug); - } - - return html` -
- ${state.actionError - ? html`` - : nothing} - ${renderBody(props, state, viewState)} ${renderDialog(props, state, viewState)} -
- `; -} - -function renderBody( - props: WorkspaceProps, - state: WorkspaceUiState, - viewState: WorkspaceViewState, -): TemplateResult { - if (state.error) { - return html` - - `; - } - const workspace = state.workspace; - if (!workspace) { - // #19: skeleton cards instead of a bare "Loading…" line. - return html` -
- ${[0, 1, 2, 3, 4, 5].map(() => html`
`)} -
- `; - } - if (workspace.tabs.length === 0) { - return html` -
-
${t("workspaces.empty.onboardingTitle")}
-
${t("workspaces.empty.onboardingSubtitle")}
- ${t("workspaces.empty.onboardingCommand")} -
- `; - } - const tab = findTab(workspace, state.activeSlug) ?? visibleTabs(workspace)[0]; - if (!tab) { - return html`
-
${t("workspaces.empty.noVisibleTabs")}
-
`; - } - return html` - ${renderWorkspacesHeader(tab)} - ${renderOnboardingBanner(viewState, () => props.onRequestUpdate?.())} - ${renderTabStrip(state, workspace)} - - ${renderGrid(props, state, viewState, workspace, tab)} - - `; -} - -/** - * Page-header treatment for the Workspaces view (#7): the active workspace tab as - * the title, matching the app's .page-title header pattern - * idiom used by the other top-level pages. - */ -function renderWorkspacesHeader(tab: WorkspaceTab): TemplateResult { - return html` -
-
${tab.title}
-
- `; -} -/* oxlint-disable max-lines -- TODO: split this grandfathered oversized file. */ diff --git a/ui/src/pages/plugins/plugins-page.test.ts b/ui/src/pages/plugins/plugins-page.test.ts index dbc72fa9a5e..f424a5b30b4 100644 --- a/ui/src/pages/plugins/plugins-page.test.ts +++ b/ui/src/pages/plugins/plugins-page.test.ts @@ -869,7 +869,7 @@ describe("PluginsPage", () => { addButton?.click(); await page.updateComplete; - const form = page.querySelector(".plugins-mcp-form")!; + const form = page.querySelector(".mcp-server-form")!; form.querySelector('[name="mcp-name"]')!.value = "context7"; form.querySelector('[name="mcp-target"]')!.value = "https://mcp.context7.com/mcp"; @@ -1021,7 +1021,7 @@ describe("PluginsPage", () => { ].find((button) => button.textContent?.includes("Add server")); addButton?.click(); await page.updateComplete; - const form = page.querySelector(".plugins-mcp-form")!; + const form = page.querySelector(".mcp-server-form")!; form.querySelector('[name="mcp-name"]')!.value = "bad name!"; form.querySelector('[name="mcp-target"]')!.value = "https://x.example/mcp"; form.dispatchEvent(new Event("submit", { bubbles: true, cancelable: true })); diff --git a/ui/src/pages/plugins/plugins-page.ts b/ui/src/pages/plugins/plugins-page.ts index a14ba78f940..bda3e45a620 100644 --- a/ui/src/pages/plugins/plugins-page.ts +++ b/ui/src/pages/plugins/plugins-page.ts @@ -1,6 +1,4 @@ import { consume } from "@lit/context"; -import { redactSensitiveUrlLikeString } from "@openclaw/net-policy/redact-sensitive-url"; -import { asNullableRecord as asRecord } from "@openclaw/normalization-core/record-coerce"; import { html, type PropertyValues } from "lit"; import { property, state } from "lit/decorators.js"; import type { GatewayBrowserClient } from "../../api/gateway.ts"; @@ -13,10 +11,22 @@ import { } from "../../app/context.ts"; import { resolveControlUiAuthCandidates } from "../../app/control-ui-auth.ts"; import { hasOperatorAdminAccess } from "../../app/operator-access.ts"; +import type { McpServerForm } from "../../components/mcp-server-form.ts"; import { renderPluginsHubTabs, type PluginsHubTab } from "../../components/plugins-hub-tabs.ts"; import { renderSettingsWorkspace } from "../../components/settings-workspace.ts"; import { t } from "../../i18n/index.ts"; import { resolveEditableSnapshotConfig } from "../../lib/config/index.ts"; +import { + buildAddMcpServerPatch, + buildRemoveMcpServerPatch, + buildToggleMcpServerPatch, + MCP_SERVER_NAME_PATTERN, + parseMcpTarget, + patchMcpServers, + summarizeMcpServers, + type McpServerSummary, + type McpServersPatchBuildResult, +} from "../../lib/config/mcp-servers.ts"; import { installPlugin, loadPluginCatalog, @@ -41,8 +51,6 @@ import { pluginRowKey, renderPlugins, type InstalledFilter, - type McpServerForm, - type McpServerSummary, type PluginRowMessage, type PluginsTab, } from "./view.ts"; @@ -89,47 +97,6 @@ function mutationSuccessMessage( return lines.filter(Boolean).join("\n"); } -/** Cold MCP server summary mirroring the config page's row projection. */ -function summarizeMcpServers(config: Record | null): McpServerSummary[] | null { - if (!config) { - return null; - } - const servers = asRecord(asRecord(config.mcp)?.servers) ?? {}; - return Object.entries(servers) - .map(([name, value]) => { - const server = asRecord(value) ?? {}; - const url = typeof server.url === "string" ? server.url : ""; - // Command only, mirroring the config page: stdio args routinely carry - // tokens and this surface is visible to read-only operators. - const command = typeof server.command === "string" ? server.command : ""; - const launch = url || command || "missing transport"; - return { - name, - enabled: server.enabled !== false, - transport: url ? ("http" as const) : command ? ("stdio" as const) : ("invalid" as const), - target: url ? redactSensitiveUrlLikeString(launch) : launch, - auth: typeof server.auth === "string" ? server.auth : null, - }; - }) - .toSorted((left, right) => left.name.localeCompare(right.name)); -} - -const MCP_SERVER_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/; - -function parseMcpTarget(target: string): Record | null { - if (/^https?:\/\//i.test(target)) { - // The runtime defaults URL-only servers to SSE; modern MCP endpoints are - // streamable HTTP unless the /sse path convention says otherwise. - const transport = /\/sse\/?$/i.test(target.split("?")[0] ?? target) ? "sse" : "streamable-http"; - return { url: target, transport }; - } - const [command, ...args] = target.trim().split(/\s+/u); - if (!command) { - return null; - } - return args.length > 0 ? { command, args } : { command }; -} - class PluginsPage extends OpenClawLightDomElement { @consume({ context: applicationContext, subscribe: true }) private context!: ApplicationContext; @@ -849,15 +816,8 @@ class PluginsPage extends OpenClawLightDomElement { } } - /** - * Apply one mutation to config.mcp.servers through the shared config seam. - * config.patch uses RFC 7396 merge semantics, so `buildPatch` must return a - * minimal fragment (with explicit nulls for deletions), never a full config. - */ private async mutateMcpServers(params: { - buildPatch: ( - servers: Readonly>, - ) => { patch: Record } | { error: string }; + buildPatch: (servers: Readonly>) => McpServersPatchBuildResult; note: string; successText: string; busyKey?: string; @@ -883,24 +843,13 @@ class PluginsPage extends OpenClawLightDomElement { return false; }; try { - await runtimeConfig.ensureLoaded(); - const base = resolveEditableSnapshotConfig(runtimeConfig.state.configSnapshot); - if (!base) { - return fail(t("pluginsPage.mcpConfigUnavailable")); - } - const servers = asRecord(asRecord(base.mcp)?.servers) ?? {}; - const built = params.buildPatch(servers); - if ("error" in built) { - return fail(built.error); - } - const patched = await runtimeConfig.patch({ - raw: { mcp: { servers: built.patch } }, + const result = await patchMcpServers(runtimeConfig, { + buildPatch: params.buildPatch, note: params.note, }); - if (!patched) { - return fail(runtimeConfig.state.lastError ?? t("pluginsPage.mcpConfigUnavailable")); + if (!result.ok) { + return fail(result.error); } - await runtimeConfig.refresh(); this.syncMcpServers(); this.mcpMessage = { kind: "success", text: params.successText }; return true; @@ -917,21 +866,18 @@ class PluginsPage extends OpenClawLightDomElement { private async addMcpServer(form: McpServerForm) { const name = form.name.trim(); if (!MCP_SERVER_NAME_PATTERN.test(name)) { - this.mcpMessage = { kind: "error", text: t("pluginsPage.mcpNameInvalid") }; + this.mcpMessage = { kind: "error", text: t("mcpServers.nameInvalid") }; return; } const config = parseMcpTarget(form.target); if (!config) { - this.mcpMessage = { kind: "error", text: t("pluginsPage.mcpTargetInvalid") }; + this.mcpMessage = { kind: "error", text: t("mcpServers.targetInvalid") }; return; } const added = await this.mutateMcpServers({ - buildPatch: (servers) => - servers[name] - ? { error: t("pluginsPage.mcpNameTaken", { name }) } - : { patch: { [name]: config } }, + buildPatch: (servers) => buildAddMcpServerPatch(servers, name, config), note: `plugins: add MCP server ${name}`, - successText: t("pluginsPage.mcpAddedSuccess", { name }), + successText: t("mcpServers.addedSuccess", { name }), }); if (added) { this.mcpFormOpen = false; @@ -940,13 +886,9 @@ class PluginsPage extends OpenClawLightDomElement { private async toggleMcpServer(name: string, enabled: boolean) { await this.mutateMcpServers({ - buildPatch: (servers) => - servers[name] - ? // Enabling deletes the key so the config keeps its enabled-by-default shape. - { patch: { [name]: { enabled: enabled ? null : false } } } - : { error: t("pluginsPage.mcpMissing", { name }) }, + buildPatch: (servers) => buildToggleMcpServerPatch(servers, name, enabled), note: `plugins: ${enabled ? "enable" : "disable"} MCP server ${name}`, - successText: t(enabled ? "pluginsPage.enabledSuccess" : "pluginsPage.disabledSuccess", { + successText: t(enabled ? "mcpServers.enabledSuccess" : "mcpServers.disabledSuccess", { name, }), }); @@ -954,12 +896,9 @@ class PluginsPage extends OpenClawLightDomElement { private async removeMcpServer(name: string) { await this.mutateMcpServers({ - buildPatch: (servers) => - servers[name] - ? { patch: { [name]: null } } - : { error: t("pluginsPage.mcpMissing", { name }) }, + buildPatch: (servers) => buildRemoveMcpServerPatch(servers, name), note: `plugins: remove MCP server ${name}`, - successText: t("pluginsPage.mcpRemovedSuccess", { name }), + successText: t("mcpServers.removedSuccess", { name }), }); } @@ -980,9 +919,7 @@ class PluginsPage extends OpenClawLightDomElement { : t("pluginsPage.connectorAddedReady", { name: connector.name }); const added = await this.mutateMcpServers({ buildPatch: (servers) => - servers[mcp.serverName] - ? { error: t("pluginsPage.mcpNameTaken", { name: mcp.serverName }) } - : { patch: { [mcp.serverName]: structuredClone(mcp.config) } }, + buildAddMcpServerPatch(servers, mcp.serverName, structuredClone(mcp.config)), note: `plugins: add MCP connector ${mcp.serverName}`, successText, busyKey: rowKey, diff --git a/ui/src/pages/plugins/view.test.ts b/ui/src/pages/plugins/view.test.ts index b93f29da805..9b36198996e 100644 --- a/ui/src/pages/plugins/view.test.ts +++ b/ui/src/pages/plugins/view.test.ts @@ -331,6 +331,9 @@ describe("renderPlugins", () => { transport: "http", target: "https://api.githubcopilot.com/mcp/", auth: "oauth", + toolFilter: false, + parallel: false, + tls: null, }, ], onMcpToggle, @@ -347,7 +350,7 @@ describe("renderPlugins", () => { actionButton(row, "Remove github")?.click(); expect(onMcpRemove).toHaveBeenCalledWith("github"); - const form = container.querySelector(".plugins-mcp-form")!; + const form = container.querySelector(".mcp-server-form")!; form.querySelector('[name="mcp-name"]')!.value = "context7"; form.querySelector('[name="mcp-target"]')!.value = "https://mcp.context7.com/mcp"; @@ -449,7 +452,16 @@ describe("renderPlugins", () => { createProps({ activeTab: "discover", mcpServers: [ - { name: "github", enabled: true, transport: "http", target: "https://x", auth: "oauth" }, + { + name: "github", + enabled: true, + transport: "http", + target: "https://x", + auth: "oauth", + toolFilter: false, + parallel: false, + tls: null, + }, ], }), ); diff --git a/ui/src/pages/plugins/view.ts b/ui/src/pages/plugins/view.ts index 6b6119dc163..94d2dbeb59f 100644 --- a/ui/src/pages/plugins/view.ts +++ b/ui/src/pages/plugins/view.ts @@ -7,6 +7,7 @@ import { html, nothing, type TemplateResult } from "lit"; import { live } from "lit/directives/live.js"; import { repeat } from "lit/directives/repeat.js"; import { icons } from "../../components/icons.ts"; +import { renderMcpServerForm, type McpServerForm } from "../../components/mcp-server-form.ts"; import "../../components/modal-dialog.ts"; import "../../components/openclaw-mascot.ts"; import { @@ -17,6 +18,7 @@ import { renderSettingsStatus, } from "../../components/settings-ui.ts"; import { t } from "../../i18n/index.ts"; +import type { McpServerSummary } from "../../lib/config/mcp-servers.ts"; import { EXTERNAL_LINK_TARGET, buildExternalLinkRel } from "../../lib/external-link.ts"; import "../../styles/plugins.css"; import { @@ -48,19 +50,6 @@ export type PluginRowMessage = { acknowledge?: { packageName: string; version?: string }; }; -export type McpServerSummary = { - name: string; - enabled: boolean; - transport: "stdio" | "http" | "invalid"; - target: string; - auth: string | null; -}; - -export type McpServerForm = { - name: string; - target: string; -}; - type PluginsViewProps = { connected: boolean; loading: boolean; @@ -341,6 +330,12 @@ function stateStatus(plugin: PluginCatalogItem) { return renderSettingsStatus({ kind, label: stateLabel(plugin) }); } +/** Rows pair the status with an Enable/Disable button that already implies the + * healthy states, so only the error status earns a pill next to the actions. */ +function rowStateStatus(plugin: PluginCatalogItem) { + return plugin.state === "error" ? stateStatus(plugin) : nothing; +} + function originLabel(origin: string): string { switch (origin) { case "bundled": @@ -614,7 +609,7 @@ function renderInstalledRow(plugin: PluginCatalogItem, props: PluginsViewProps): ])}
- ${stateStatus(plugin)} ${renderCatalogActions(plugin, props, busy, key)} + ${rowStateStatus(plugin)} ${renderCatalogActions(plugin, props, busy, key)}
${plugin.error ? html`
${installed - ? html`${stateStatus(installed)}${renderCatalogActions(installed, props, busy, key)}` + ? html`${rowStateStatus(installed)}${renderCatalogActions(installed, props, busy, key)}` : renderInstallButton(props, busy, key, pkg.displayName, { source: "clawhub", packageName: pkg.name, @@ -1258,6 +1210,14 @@ function renderActivePanel(props: PluginsViewProps) { export function renderPlugins(props: PluginsViewProps) { const canShowCatalog = Boolean(props.result); + const panelState = + props.loading && !canShowCatalog + ? "loading" + : props.error && !canShowCatalog + ? "error" + : !props.connected && !canShowCatalog + ? "offline" + : "content"; return renderSettingsPage( html`
@@ -1273,6 +1233,9 @@ export function renderPlugins(props: PluginsViewProps) { @input=${(event: Event) => props.onQueryChange((event.currentTarget as HTMLInputElement).value)} /> + ${props.activeTab === "installed" && panelState === "content" + ? renderInstalledFilter(props) + : nothing} + ` + : nothing} @@ -1166,7 +1180,6 @@ function renderSessionsTable(props: SessionsProps, ctx: SessionsTableContext) { const limitTooltip = t("sessionsView.limitTooltip"); const globalTooltip = t("sessionsView.globalTooltip"); const unknownTooltip = t("sessionsView.unknownTooltip"); - const showArchivedTooltip = t("sessionsView.archivedOnlyTooltip"); return html`
- props.onFiltersChange({ - activeMinutes: props.activeMinutes, - limit: props.limit, - includeGlobal: props.includeGlobal, - includeUnknown: props.includeUnknown, - showArchived: checked, - }), - })} +
+ + +