From d92bcdbbd5052ff1fc528fe5514b43fb5709c763 Mon Sep 17 00:00:00 2001 From: byronwang2005 Date: Mon, 15 Dec 2025 11:57:37 +0800 Subject: [PATCH 01/17] feat(i18n): initial multilingual support --- frontend/bun.lock | 28 ++ frontend/package.json | 4 + .../public/locales/ca-ES/translation.json | 367 +++++++++++++++++ .../public/locales/de-DE/translation.json | 367 +++++++++++++++++ .../public/locales/en-GB/translation.json | 367 +++++++++++++++++ .../public/locales/en-US/translation.json | 373 +++++++++++++++++ .../public/locales/es-ES/translation.json | 367 +++++++++++++++++ .../public/locales/fr-FR/translation.json | 367 +++++++++++++++++ .../public/locales/id-ID/translation.json | 367 +++++++++++++++++ .../public/locales/it-IT/translation.json | 367 +++++++++++++++++ .../public/locales/ja-JP/translation.json | 374 ++++++++++++++++++ .../public/locales/ko-KR/translation.json | 367 +++++++++++++++++ .../public/locales/ms-MY/translation.json | 367 +++++++++++++++++ .../public/locales/pl-PL/translation.json | 367 +++++++++++++++++ .../public/locales/pt-PT/translation.json | 367 +++++++++++++++++ .../public/locales/ru-RU/translation.json | 367 +++++++++++++++++ .../public/locales/th-TH/translation.json | 367 +++++++++++++++++ .../public/locales/tr-TR/translation.json | 367 +++++++++++++++++ .../public/locales/vi-VN/translation.json | 367 +++++++++++++++++ .../public/locales/zh-Hans/translation.json | 367 +++++++++++++++++ .../public/locales/zh-Hant/translation.json | 367 +++++++++++++++++ frontend/src/api/agent.ts | 19 +- frontend/src/api/setting.ts | 2 +- frontend/src/api/stock.ts | 18 +- frontend/src/api/system.ts | 32 +- .../agent-view/common-agent-area.tsx | 6 +- .../agent-view/strategy-agent-area.tsx | 13 +- .../chat-conversation-header.tsx | 6 +- .../chat-conversation/chat-input-area.tsx | 8 +- .../modals/create-strategy-modal.tsx | 28 +- .../modals/strategy-detail-modal.tsx | 39 +- .../portfolio-positions-group.tsx | 59 ++- .../strategy-items/strategy-compose-list.tsx | 38 +- .../strategy-items/trade-strategy-group.tsx | 61 +-- frontend/src/app/agent/config.tsx | 8 +- frontend/src/app/home/_layout.tsx | 6 +- .../home/components/stock-history-chart.tsx | 17 +- .../src/app/home/components/stock-list.tsx | 4 +- .../home/components/stock-search-modal.tsx | 17 +- frontend/src/app/home/home.tsx | 51 ++- frontend/src/app/home/stock.tsx | 27 +- frontend/src/app/market/agents.tsx | 4 +- frontend/src/app/rank/board.tsx | 34 +- .../rank/components/strategy-remote-modal.tsx | 56 +-- frontend/src/app/setting/_layout.tsx | 60 ++- .../components/memory/memory-item-card.tsx | 5 +- .../components/models/model-detail.tsx | 116 +++--- .../components/models/model-providers.tsx | 20 +- frontend/src/app/setting/general.tsx | 88 ++++- frontend/src/app/setting/memory.tsx | 18 +- .../valuecell/app/app-conversation-sheet.tsx | 10 +- .../valuecell/button/back-button.tsx | 4 +- .../valuecell/form/ai-model-form.tsx | 60 +-- .../valuecell/form/exchange-form.tsx | 100 +++-- .../valuecell/form/trading-strategy-form.tsx | 56 +-- .../renderer/chat-conversation-renderer.tsx | 8 +- frontend/src/lib/format.ts | 118 ++++++ frontend/src/lib/i18n.ts | 78 ++++ frontend/src/lib/utils.ts | 41 ++ frontend/src/root.tsx | 1 + frontend/src/store/settings-store.ts | 39 ++ .../adapters/assets/i18n_integration.py | 22 +- python/valuecell/config/constants.py | 105 +++++ python/valuecell/server/config/settings.py | 4 +- .../valuecell/server/services/i18n_service.py | 38 +- 65 files changed, 8158 insertions(+), 404 deletions(-) create mode 100644 frontend/public/locales/ca-ES/translation.json create mode 100644 frontend/public/locales/de-DE/translation.json create mode 100644 frontend/public/locales/en-GB/translation.json create mode 100644 frontend/public/locales/en-US/translation.json create mode 100644 frontend/public/locales/es-ES/translation.json create mode 100644 frontend/public/locales/fr-FR/translation.json create mode 100644 frontend/public/locales/id-ID/translation.json create mode 100644 frontend/public/locales/it-IT/translation.json create mode 100644 frontend/public/locales/ja-JP/translation.json create mode 100644 frontend/public/locales/ko-KR/translation.json create mode 100644 frontend/public/locales/ms-MY/translation.json create mode 100644 frontend/public/locales/pl-PL/translation.json create mode 100644 frontend/public/locales/pt-PT/translation.json create mode 100644 frontend/public/locales/ru-RU/translation.json create mode 100644 frontend/public/locales/th-TH/translation.json create mode 100644 frontend/public/locales/tr-TR/translation.json create mode 100644 frontend/public/locales/vi-VN/translation.json create mode 100644 frontend/public/locales/zh-Hans/translation.json create mode 100644 frontend/public/locales/zh-Hant/translation.json create mode 100644 frontend/src/lib/format.ts create mode 100644 frontend/src/lib/i18n.ts diff --git a/frontend/bun.lock b/frontend/bun.lock index 8c20803e5..1fde8e88d 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -43,12 +43,16 @@ "dayjs": "^1.11.19", "echarts": "^6.0.0", "framer-motion": "^12.23.26", + "i18next": "^25.7.2", + "i18next-browser-languagedetector": "^8.2.0", + "i18next-http-backend": "^3.0.2", "isbot": "5.1.31", "lucide-react": "^0.559.0", "mutative": "^1.3.0", "next-themes": "^0.4.6", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-i18next": "^16.5.0", "react-markdown": "^10.1.0", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", @@ -135,6 +139,8 @@ "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], "@babel/traverse": ["@babel/traverse@7.28.5", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "debug": "^4.3.1" } }, "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ=="], @@ -601,6 +607,8 @@ "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], + "cross-fetch": ["cross-fetch@4.0.0", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], @@ -793,6 +801,8 @@ "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="], + "html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="], + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], @@ -803,6 +813,12 @@ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + "i18next": ["i18next@25.7.2", "", { "dependencies": { "@babel/runtime": "^7.28.4" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-58b4kmLpLv1buWUEwegMDUqZVR5J+rT+WTRFaBGL7lxDuJQQ0NrJFrq+eT2N94aYVR1k1Sr13QITNOL88tZCuw=="], + + "i18next-browser-languagedetector": ["i18next-browser-languagedetector@8.2.0", "", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g=="], + + "i18next-http-backend": ["i18next-http-backend@3.0.2", "", { "dependencies": { "cross-fetch": "4.0.0" } }, "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g=="], + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -1135,6 +1151,8 @@ "react-dom": ["react-dom@19.2.1", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.1" } }, "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg=="], + "react-i18next": ["react-i18next@16.5.0", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "i18next": ">= 25.6.2", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-IMpPTyCTKxEj8klCrLKUTIUa8uYTd851+jcu2fJuUB9Agkk9Qq8asw4omyeHVnOXHrLgQJGTm5zTvn8HpaPiqw=="], + "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], @@ -1271,6 +1289,8 @@ "tough-cookie": ["tough-cookie@6.0.0", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], @@ -1343,10 +1363,16 @@ "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], @@ -1459,6 +1485,8 @@ "compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + "cross-fetch/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], diff --git a/frontend/package.json b/frontend/package.json index 84ac86977..27e0b287f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -56,12 +56,16 @@ "dayjs": "^1.11.19", "echarts": "^6.0.0", "framer-motion": "^12.23.26", + "i18next": "^25.7.2", + "i18next-browser-languagedetector": "^8.2.0", + "i18next-http-backend": "^3.0.2", "isbot": "5.1.31", "lucide-react": "^0.559.0", "mutative": "^1.3.0", "next-themes": "^0.4.6", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-i18next": "^16.5.0", "react-markdown": "^10.1.0", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", diff --git a/frontend/public/locales/ca-ES/translation.json b/frontend/public/locales/ca-ES/translation.json new file mode 100644 index 000000000..bd5c46087 --- /dev/null +++ b/frontend/public/locales/ca-ES/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "General", + "description": "Gestioneu les vostres preferències i la configuració de l'aplicació", + "account": { + "title": "Compte", + "signInDesc": "Inicieu sessió per començar amb les funcions de Valuecell AI.", + "signOut": "Tancar sessió", + "signIn": "Iniciar sessió" + }, + "language": { + "title": "Idioma i Regió", + "description": "Seleccioneu el vostre idioma preferit i el format regional per a l'aplicació." + }, + "quotesColor": { + "title": "Color de les Cotitzacions", + "description": "Trieu com es visualitzen els moviments de les cotitzacions borsàries a l'aplicació.", + "greenUpRedDown": "Verd Puja / Vermell Baixa", + "redUpGreenDown": "Vermell Puja / Verd Baixa" + }, + "updates": { + "title": "Actualitzacions de l'App", + "check": "Comprovar actualitzacions" + } + }, + "settings": { + "title": "Configuració", + "nav": { + "models": "Models", + "general": "General", + "memory": "Memòria" + }, + "models": { + "title": "Proveïdor de Model", + "noProviders": "Cap proveïdor disponible.", + "loading": "Carregant detalls del proveïdor...", + "defaultProvider": "Proveïdor per defecte", + "apiKey": "Clau API", + "enterApiKey": "Introduïu la clau API", + "getApiKey": "Feu clic aquí per obtenir la clau API", + "apiHost": "Amfitrió API", + "models": "Models", + "add": "Afegir", + "addModel": "Afegir Model", + "modelId": "ID del Model", + "enterModelId": "Introduïu l'ID del model", + "modelName": "Nom del Model", + "enterModelName": "Introduïu el nom del model", + "cancel": "Cancel·lar", + "confirm": "Confirmar", + "noModels": "Cap model configurat per a aquest proveïdor." + }, + "memory": { + "title": "Records preservats", + "description": "Recordaré i gestionaré automàticament informació útil als xats per millorar la personalització i la rellevància de les respostes", + "loading": "Carregant...", + "noMemories": "Encara no hi ha records", + "delete": "Eliminar" + } + }, + "common": { + "back": "Enrere" + }, + "market": { + "title": "Mercat d'Agents" + }, + "agent": { + "welcome": "Benvingut a {{name}}!", + "unknown": "Agent Desconegut", + "status": { + "running": "En execució" + }, + "action": { + "view": "Veure" + }, + "config": { + "disable": "Desactivar", + "chat": "Xat", + "collectAndChat": "Recollir i xatejar" + } + }, + "chat": { + "input": { + "placeholder": "Escriviu el vostre missatge..." + }, + "newConversation": "Nova Conversa", + "settings": "Configuració", + "conversationList": { + "title": "Llista de Converses", + "loading": "Carregant...", + "empty": "Encara no hi ha converses" + }, + "action": { + "delete": "Eliminar" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Estratègia basada en Prompt", + "GridStrategy": "Estratègia de Graella" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Compatible amb OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Estratègies de Trading", + "add": "Afegir estratègia de trading", + "noStrategies": "Cap estratègia de trading", + "createFirst": "Creeu la vostra primera estratègia per començar a fer trading", + "status": { + "running": "En execució", + "stopped": "Aturat", + "live": "En viu", + "virtual": "Virtual" + }, + "action": { + "stop": "Aturar l'Estratègia de Trading?", + "stopDesc": "Aturar l'estratègia \"{{name}}\" l'aturarà immediatament i activarà una liquidació forçada. Voleu continuar?", + "confirmStop": "Confirmar Aturada", + "delete": "Eliminar", + "deleteTitle": "Eliminar l'Estratègia?", + "deleteDesc": "Eliminar l'estratègia \"{{name}}\" l'aturarà immediatament i activarà una liquidació forçada. Voleu continuar?", + "confirmDelete": "Confirmar Eliminació", + "details": "Detalls", + "duplicate": "Duplicar", + "cancel": "Cancel·lar", + "back": "Enrere", + "next": "Següent", + "confirm": "Confirmar", + "publish": "Publicar", + "shareToSocial": "Compartir a xarxes socials", + "shareToRanking": "Compartir al rànquing" + }, + "portfolio": { + "title": "Historial de Valor de la Cartera", + "totalEquity": "Patrimoni Total", + "availableBalance": "Saldo Disponible", + "totalPnl": "P&L Total", + "noData": "Cap dada de valor de cartera", + "noDataDesc": "El gràfic de valor de la cartera apareixerà un cop comenci el trading" + }, + "positions": { + "title": "Posicions", + "symbol": "Símbol", + "type": "Tipus", + "leverage": "Palanquejament", + "quantity": "Quantitat", + "pnl": "P&L", + "noOpen": "Cap posició oberta", + "noOpenDesc": "Les posicions apareixeran aquí quan s'obrin operacions" + }, + "create": { + "title": "Afegir estratègia de trading", + "steps": { + "aiModels": "Models IA", + "exchanges": "Borses", + "tradingStrategy": "Estratègia de trading" + }, + "error": "Error creant l'estratègia" + }, + "form": { + "strategyType": { + "label": "Tipus d'Estratègia", + "promptBased": "Estratègia basada en Prompt", + "grid": "Estratègia de Graella" + }, + "strategyName": { + "label": "Nom de l'Estratègia", + "placeholder": "Introduïu el nom de l'estratègia" + }, + "initialCapital": { + "label": "Capital Inicial", + "placeholder": "Introduïu el Capital Inicial" + }, + "maxLeverage": { + "label": "Palanquejament Màxim", + "placeholder": "Palanquejament Màxim" + }, + "decideInterval": { + "label": "Interval de Decisió (segons)", + "placeholder": "ex: 300" + }, + "tradingSymbols": { + "label": "Símbols de Trading", + "placeholder": "Seleccioneu símbols de trading...", + "searchPlaceholder": "Cercar o afegir símbols...", + "emptyText": "No s'han trobat símbols." + }, + "promptTemplate": { + "label": "Plantilla de Prompt del Sistema", + "new": "Nou Prompt", + "view": "Veure Estratègia" + }, + "aiModels": { + "platform": "Plataforma de Model", + "model": "Seleccionar Model", + "noModels": "Cap model disponible", + "apiKey": { + "label": "Clau API", + "placeholder": "Introduïu la Clau API" + } + }, + "exchanges": { + "transactionType": "Tipus de Transacció", + "liveTrading": "Trading en Viu", + "virtualTrading": "Trading Virtual", + "selectExchange": "Seleccionar Borsa", + "walletAddress": "Adreça de la Cartera", + "privateKey": "Clau Privada", + "apiKey": "Clau API", + "secretKey": "Clau Secreta", + "passphrase": "Frase de Pas", + "testConnection": "Provar Connexió", + "test": { + "success": "Èxit!", + "failed": "La connexió ha fallat. Si us plau, comproveu la vostra Clau API, Clau Secreta o Frase de Pas." + }, + "placeholder": { + "binance": { + "apiKey": "Introduïu la Clau API (64 caràcters)", + "secretKey": "Introduïu la Clau Secreta (64 caràcters)" + }, + "okx": { + "apiKey": "Introduïu la Clau API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Introduïu la Clau Secreta (32 lletres majúscules i números)", + "passphrase": "Introduïu la Frase de Pas (Definida durant la creació de l'API)" + }, + "gate": { + "apiKey": "Introduïu la Clau API (Comença per 'key_')", + "secretKey": "Introduïu la Clau Secreta (64 caràcters)" + }, + "hyperliquid": { + "walletAddress": "Introduïu l'Adreça de la Cartera (Comença per '0x')", + "privateKey": "Introduïu la Clau Privada (64 caràcters)" + }, + "blockchain": { + "apiKey": "Introduïu la Clau API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Introduïu la Clau Secreta" + }, + "coinbase": { + "apiKey": "Introduïu la Clau API (o Nom de la Clau)", + "secretKey": "Introduïu el Secret API (o Clau Privada)", + "passphrase": "Introduïu la Frase de Pas (Necessari per a l'API Pro Legacy)" + }, + "mexc": { + "apiKey": "Introduïu la Clau d'Accés (Comença per 'mx0')", + "secretKey": "Introduïu la Clau Secreta (Normalment 32 caràcters)" + }, + "default": { + "apiKey": "Enganxeu la vostra Clau API aquí", + "secretKey": "Enganxeu la vostra Clau Secreta aquí", + "passphrase": "Introduïu la Frase de Pas", + "walletAddress": "Introduïu l'Adreça de la Cartera", + "privateKey": "Introduïu la Clau Privada" + } + } + } + }, + "prompt": { + "delete": { + "title": "Eliminar Prompt d'Estratègia", + "description": "Esteu segur que voleu eliminar aquest prompt d'estratègia? Aquesta acció no es pot desfer i eliminarà permanentment el prompt del sistema." + } + }, + "detail": { + "title": "Detalls de l'Estratègia", + "loading": "Carregant detalls...", + "returnRate": "Taxa de Retorn", + "strategyType": "Tipus d'Estratègia", + "modelProvider": "Proveïdor de Model", + "modelId": "ID del Model", + "initialCapital": "Capital Inicial", + "maxLeverage": "Palanquejament Màxim", + "tradingSymbols": "Símbols de Trading", + "prompt": "Prompt" + }, + "history": { + "title": "Historial de Trading", + "live": "Trading en Viu", + "virtual": "Trading Virtual", + "cycle": "Cicle #{{index}}", + "aiReasoning": "Lògica de raonament IA", + "operation": "Realitzar operació", + "empty": { + "title": "Cap historial de trade", + "desc": "Els vostres trades completats apareixeran aquí" + }, + "details": { + "time": "Hora", + "price": "Preu", + "quantity": "Quantitat", + "holdingTime": "Temps de tinença", + "tradingFee": "Comissió de Trading", + "reasoning": "Raonament" + } + } + }, + "rank": { + "title": "Classificació de Beneficis", + "days": { + "7": "7D", + "30": "1M" + }, + "table": { + "rank": "Rang", + "user": "Usuari", + "pnl": "P&L", + "strategy": "Estratègia", + "exchange": "Borsa", + "model": "Model", + "details": "Detalls", + "loading": "Carregant..." + } + }, + "home": { + "hello": "👋 Hola Inversor!", + "welcome": "👋 Benvingut a ValueCell!", + "watchlist": "La Meva Llista de Seguiment", + "stock": { + "loading": "Carregant dades borsàries...", + "error": "Error carregant dades borsàries: {{message}}", + "remove": "Eliminar", + "removing": "Eliminant...", + "add": "Afegir Accions", + "about": "Sobre", + "sector": "Sector:", + "industry": "Indústria:", + "website": "Lloc Web:", + "chart": { + "24h": "24h", + "7d": "7d", + "30d": "30d" + } + }, + "search": { + "title": "Cerca d'Accions", + "placeholder": "Cercar per nom d'acció o codi", + "searching": "Cercant...", + "noResults": "No s'han trobat accions relacionades", + "action": { + "watch": "Seguir", + "watching": "Seguint...", + "watched": "Seguit" + } + }, + "suggestions": { + "research": { + "title": "Recerca Profunda", + "description": "Analitzeu les presentacions a la SEC per generar informes d'interpretació borsària en profunditat." + }, + "strategy": { + "title": "Trading Automatitzat", + "description": "Trading intel·ligent multi-estratègia, executeu automàticament les vostres estratègies" + }, + "news": { + "title": "Notificacions de Notícies", + "description": "Actualitzacions de notícies personalitzades segons un horari personalitzat" + } + } + } +} diff --git a/frontend/public/locales/de-DE/translation.json b/frontend/public/locales/de-DE/translation.json new file mode 100644 index 000000000..59f2c493f --- /dev/null +++ b/frontend/public/locales/de-DE/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Allgemein", + "description": "Verwalten Sie Ihre Einstellungen und Anwendungskonfiguration", + "account": { + "title": "Konto", + "signInDesc": "Melden Sie sich an, um die Funktionen von Valuecell AI zu nutzen.", + "signOut": "Abmelden", + "signIn": "Anmelden" + }, + "language": { + "title": "Sprache und Region", + "description": "Wählen Sie Ihre bevorzugte Sprache und das regionale Format für die App." + }, + "quotesColor": { + "title": "Kursfarbe", + "description": "Wählen Sie, wie Kursbewegungen in der App visualisiert werden.", + "greenUpRedDown": "Grün hoch / Rot runter", + "redUpGreenDown": "Rot hoch / Grün runter" + }, + "updates": { + "title": "App-Updates", + "check": "Auf Updates prüfen" + } + }, + "settings": { + "title": "Einstellungen", + "nav": { + "models": "Modelle", + "general": "Allgemein", + "memory": "Gedächtnis" + }, + "models": { + "title": "Modell-Anbieter", + "noProviders": "Keine Anbieter verfügbar.", + "loading": "Lade Anbieterdetails...", + "defaultProvider": "Standard-Anbieter", + "apiKey": "API-Schlüssel", + "enterApiKey": "API-Schlüssel eingeben", + "getApiKey": "Hier klicken, um API-Schlüssel zu erhalten", + "apiHost": "API-Host", + "models": "Modelle", + "add": "Hinzufügen", + "addModel": "Modell hinzufügen", + "modelId": "Modell-ID", + "enterModelId": "Modell-ID eingeben", + "modelName": "Modell-Name", + "enterModelName": "Modell-Name eingeben", + "cancel": "Abbrechen", + "confirm": "Bestätigen", + "noModels": "Keine Modelle für diesen Anbieter konfiguriert." + }, + "memory": { + "title": "Gespeicherte Erinnerungen", + "description": "Ich werde nützliche Informationen in Chats speichern und automatisch verwalten, um die Personalisierung und Relevanz der Antworten zu verbessern.", + "loading": "Laden...", + "noMemories": "Noch keine Erinnerungen", + "delete": "Löschen" + } + }, + "common": { + "back": "Zurück" + }, + "market": { + "title": "Agenten-Markt" + }, + "agent": { + "welcome": "Willkommen bei {{name}}!", + "unknown": "Unbekannter Agent", + "status": { + "running": "Läuft" + }, + "action": { + "view": "Ansehen" + }, + "config": { + "disable": "Deaktivieren", + "chat": "Chat", + "collectAndChat": "Sammeln und Chatten" + } + }, + "chat": { + "input": { + "placeholder": "Nachricht eingeben..." + }, + "newConversation": "Neue Konversation", + "settings": "Einstellungen", + "conversationList": { + "title": "Konversationsliste", + "loading": "Laden...", + "empty": "Noch keine Konversation" + }, + "action": { + "delete": "Löschen" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Prompt-basierte Strategie", + "GridStrategy": "Raster-Strategie" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI Kompatibel", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Handelsstrategien", + "add": "Handelsstrategie hinzufügen", + "noStrategies": "Keine Handelsstrategien", + "createFirst": "Erstellen Sie Ihre erste Strategie, um mit dem Handel zu beginnen", + "status": { + "running": "Läuft", + "stopped": "Gestoppt", + "live": "Live", + "virtual": "Virtuell" + }, + "action": { + "stop": "Handelsstrategie stoppen?", + "stopDesc": "Das Stoppen der Strategie \"{{name}}\" beendet diese sofort und löst eine Zwangsliquidation aus. Möchten Sie fortfahren?", + "confirmStop": "Stopp bestätigen", + "delete": "Löschen", + "deleteTitle": "Strategie löschen?", + "deleteDesc": "Das Löschen der Strategie \"{{name}}\" beendet diese sofort und löst eine Zwangsliquidation aus. Möchten Sie fortfahren?", + "confirmDelete": "Löschen bestätigen", + "details": "Details", + "duplicate": "Duplizieren", + "cancel": "Abbrechen", + "back": "Zurück", + "next": "Weiter", + "confirm": "Bestätigen", + "publish": "Veröffentlichen", + "shareToSocial": "In sozialen Medien teilen", + "shareToRanking": "Im Ranking teilen" + }, + "portfolio": { + "title": "Portfolio-Wertverlauf", + "totalEquity": "Gesamteigenkapital", + "availableBalance": "Verfügbares Guthaben", + "totalPnl": "Gesamt G&V", + "noData": "Keine Portfolio-Wertdaten", + "noDataDesc": "Portfolio-Wertdiagramm erscheint, sobald der Handel beginnt" + }, + "positions": { + "title": "Positionen", + "symbol": "Symbol", + "type": "Typ", + "leverage": "Hebel", + "quantity": "Menge", + "pnl": "G&V", + "noOpen": "Keine offenen Positionen", + "noOpenDesc": "Positionen erscheinen hier, wenn Trades eröffnet werden" + }, + "create": { + "title": "Handelsstrategie hinzufügen", + "steps": { + "aiModels": "KI-Modelle", + "exchanges": "Börsen", + "tradingStrategy": "Handelsstrategie" + }, + "error": "Fehler beim Erstellen der Strategie" + }, + "form": { + "strategyType": { + "label": "Strategietyp", + "promptBased": "Prompt-basierte Strategie", + "grid": "Raster-Strategie" + }, + "strategyName": { + "label": "Strategiename", + "placeholder": "Strategiename eingeben" + }, + "initialCapital": { + "label": "Startkapital", + "placeholder": "Startkapital eingeben" + }, + "maxLeverage": { + "label": "Max. Hebel", + "placeholder": "Max. Hebel" + }, + "decideInterval": { + "label": "Entscheidungsintervall (Sekunden)", + "placeholder": "z.B. 300" + }, + "tradingSymbols": { + "label": "Handelssymbole", + "placeholder": "Handelssymbole auswählen...", + "searchPlaceholder": "Symbole suchen oder hinzufügen...", + "emptyText": "Keine Symbole gefunden." + }, + "promptTemplate": { + "label": "System-Prompt-Vorlage", + "new": "Neuer Prompt", + "view": "Strategie ansehen" + }, + "aiModels": { + "platform": "Modell-Plattform", + "model": "Modell auswählen", + "noModels": "Keine Modelle verfügbar", + "apiKey": { + "label": "API-Schlüssel", + "placeholder": "API-Schlüssel eingeben" + } + }, + "exchanges": { + "transactionType": "Transaktionstyp", + "liveTrading": "Live-Handel", + "virtualTrading": "Virtueller Handel", + "selectExchange": "Börse auswählen", + "walletAddress": "Wallet-Adresse", + "privateKey": "Privater Schlüssel", + "apiKey": "API-Schlüssel", + "secretKey": "Geheimer Schlüssel", + "passphrase": "Passphrase", + "testConnection": "Verbindung testen", + "test": { + "success": "Erfolg!", + "failed": "Verbindung fehlgeschlagen. Bitte überprüfen Sie Ihren API-Schlüssel, geheimen Schlüssel oder Passphrase." + }, + "placeholder": { + "binance": { + "apiKey": "API-Schlüssel eingeben (64 Zeichen)", + "secretKey": "Geheimen Schlüssel eingeben (64 Zeichen)" + }, + "okx": { + "apiKey": "API-Schlüssel eingeben (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Geheimen Schlüssel eingeben (32 Großbuchstaben & Zahlen)", + "passphrase": "Passphrase eingeben (bei API-Erstellung festgelegt)" + }, + "gate": { + "apiKey": "API-Schlüssel eingeben (Beginnt mit 'key_')", + "secretKey": "Geheimen Schlüssel eingeben (64 Zeichen)" + }, + "hyperliquid": { + "walletAddress": "Wallet-Adresse eingeben (Beginnt mit '0x')", + "privateKey": "Privaten Schlüssel eingeben (64 Zeichen)" + }, + "blockchain": { + "apiKey": "API-Schlüssel eingeben (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Geheimen Schlüssel eingeben" + }, + "coinbase": { + "apiKey": "API-Schlüssel eingeben (oder Schlüsselname)", + "secretKey": "API-Geheimnis eingeben (oder privaten Schlüssel)", + "passphrase": "Passphrase eingeben (erforderlich für Legacy Pro API)" + }, + "mexc": { + "apiKey": "Zugangsschlüssel eingeben (Beginnt mit 'mx0')", + "secretKey": "Geheimen Schlüssel eingeben (meist 32 Zeichen)" + }, + "default": { + "apiKey": "Ihren API-Schlüssel hier einfügen", + "secretKey": "Ihren geheimen Schlüssel hier einfügen", + "passphrase": "Passphrase eingeben", + "walletAddress": "Wallet-Adresse eingeben", + "privateKey": "Privaten Schlüssel eingeben" + } + } + } + }, + "prompt": { + "delete": { + "title": "Strategie-Prompt löschen", + "description": "Sind Sie sicher, dass Sie diesen Strategie-Prompt löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden und entfernt den Prompt dauerhaft aus dem System." + } + }, + "detail": { + "title": "Strategiedetails", + "loading": "Lade Details...", + "returnRate": "Rendite", + "strategyType": "Strategietyp", + "modelProvider": "Modell-Anbieter", + "modelId": "Modell-ID", + "initialCapital": "Startkapital", + "maxLeverage": "Max. Hebel", + "tradingSymbols": "Handelssymbole", + "prompt": "Prompt" + }, + "history": { + "title": "Handelshistorie", + "live": "Live-Handel", + "virtual": "Virtueller Handel", + "cycle": "Zyklus #{{index}}", + "aiReasoning": "KI-Argumentationslogik", + "operation": "Operation ausführen", + "empty": { + "title": "Keine Handelshistorie", + "desc": "Ihre abgeschlossenen Trades erscheinen hier" + }, + "details": { + "time": "Zeit", + "price": "Preis", + "quantity": "Menge", + "holdingTime": "Haltedauer", + "tradingFee": "Handelsgebühr", + "reasoning": "Begründung" + } + } + }, + "rank": { + "title": "Gewinn-Bestenliste", + "days": { + "7": "7T", + "30": "1M" + }, + "table": { + "rank": "Rang", + "user": "Benutzer", + "pnl": "G&V", + "strategy": "Strategie", + "exchange": "Börse", + "model": "Modell", + "details": "Details", + "loading": "Laden..." + } + }, + "home": { + "hello": "👋 Hallo Investor!", + "welcome": "👋 Willkommen bei ValueCell!", + "watchlist": "Meine Watchlist", + "stock": { + "loading": "Lade Aktiendaten...", + "error": "Fehler beim Laden der Aktiendaten: {{message}}", + "remove": "Entfernen", + "removing": "Entferne...", + "add": "Aktien hinzufügen", + "about": "Über", + "sector": "Sektor:", + "industry": "Branche:", + "website": "Webseite:", + "chart": { + "24h": "24h", + "7d": "7T", + "30d": "30T" + } + }, + "search": { + "title": "Aktiensuche", + "placeholder": "Nach Aktienname oder Code suchen", + "searching": "Suche...", + "noResults": "Keine entsprechenden Aktien gefunden", + "action": { + "watch": "Watchlist", + "watching": "Beobachte...", + "watched": "Beobachtet" + } + }, + "suggestions": { + "research": { + "title": "Tiefenanalyse", + "description": "Analysieren Sie SEC-Einreichungen, um detaillierte Aktieninterpretationsberichte zu erstellen." + }, + "strategy": { + "title": "Automatisierter Handel", + "description": "Multi-Strategie Smart Trading, führt Ihre Strategien automatisch aus" + }, + "news": { + "title": "Nachrichten-Push", + "description": "Personalisierte Nachrichten-Updates nach benutzerdefiniertem Zeitplan" + } + } + } +} diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json new file mode 100644 index 000000000..8e1508490 --- /dev/null +++ b/frontend/public/locales/en-GB/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "General", + "description": "Manage your preferences and application settings", + "account": { + "title": "Account", + "signInDesc": "Sign in to get started with Valuecell AI features.", + "signOut": "Sign Out", + "signIn": "Sign In" + }, + "language": { + "title": "Language and Region", + "description": "Select your preferred language and regional format for the app." + }, + "quotesColor": { + "title": "Quotes Colour", + "description": "Choose how stock quote movements are visualised across the app.", + "greenUpRedDown": "Green Up / Red Down", + "redUpGreenDown": "Red Up / Green Down" + }, + "updates": { + "title": "App Updates", + "check": "Check for Update" + } + }, + "settings": { + "title": "Settings", + "nav": { + "models": "Models", + "general": "General", + "memory": "Memory" + }, + "models": { + "title": "Model Provider", + "noProviders": "No providers available.", + "loading": "Loading provider details...", + "defaultProvider": "Default Provider", + "apiKey": "API key", + "enterApiKey": "Enter API key", + "getApiKey": "Click here to get the API key", + "apiHost": "API Host", + "models": "Models", + "add": "Add", + "addModel": "Add Model", + "modelId": "Model ID", + "enterModelId": "Enter model ID", + "modelName": "Model Name", + "enterModelName": "Enter model name", + "cancel": "Cancel", + "confirm": "Confirm", + "noModels": "No models configured for this provider." + }, + "memory": { + "title": "Preserved memories", + "description": "I will remember and automatically manage useful information in chats to enhance the personalisation and relevance of replies", + "loading": "Loading...", + "noMemories": "No memories yet", + "delete": "Delete" + } + }, + "common": { + "back": "Back" + }, + "market": { + "title": "Agent Market" + }, + "agent": { + "welcome": "Welcome to {{name}}!", + "unknown": "Unknown Agent", + "status": { + "running": "Running" + }, + "action": { + "view": "View" + }, + "config": { + "disable": "Disable", + "chat": "Chat", + "collectAndChat": "Collect and chat" + } + }, + "chat": { + "input": { + "placeholder": "Type your message..." + }, + "newConversation": "New Conversation", + "settings": "Settings", + "conversationList": { + "title": "Conversation List", + "loading": "Loading...", + "empty": "No conversation yet" + }, + "action": { + "delete": "Delete" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Prompt Based Strategy", + "GridStrategy": "Grid Strategy" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI Compatible", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Trading Strategies", + "add": "Add trading strategy", + "noStrategies": "No trading strategies", + "createFirst": "Create your first strategy to start trading", + "status": { + "running": "Running", + "stopped": "Stopped", + "live": "Live", + "virtual": "Virtual" + }, + "action": { + "stop": "Stop Trading Strategy?", + "stopDesc": "Stopping the strategy \"{{name}}\" will stop it immediately and trigger a forced liquidation. Do you want to proceed?", + "confirmStop": "Confirm Stop", + "delete": "Delete", + "deleteTitle": "Delete Strategy?", + "deleteDesc": "Deleting the strategy \"{{name}}\" will stop it immediately and trigger a forced liquidation. Do you want to proceed?", + "confirmDelete": "Confirm Delete", + "details": "Details", + "duplicate": "Duplicate", + "cancel": "Cancel", + "back": "Back", + "next": "Next", + "confirm": "Confirm", + "publish": "Publish", + "shareToSocial": "Share to Social", + "shareToRanking": "Share to Ranking" + }, + "portfolio": { + "title": "Portfolio Value History", + "totalEquity": "Total Equity", + "availableBalance": "Available Balance", + "totalPnl": "Total P&L", + "noData": "No portfolio value data", + "noDataDesc": "Portfolio value chart will appear once trading begins" + }, + "positions": { + "title": "Positions", + "symbol": "Symbol", + "type": "Type", + "leverage": "Leverage", + "quantity": "Quantity", + "pnl": "P&L", + "noOpen": "No open positions", + "noOpenDesc": "Positions will appear here when trades are opened" + }, + "create": { + "title": "Add trading strategy", + "steps": { + "aiModels": "AI Models", + "exchanges": "Exchanges", + "tradingStrategy": "Trading strategy" + }, + "error": "Error Creating Strategy" + }, + "form": { + "strategyType": { + "label": "Strategy Type", + "promptBased": "Prompt Based Strategy", + "grid": "Grid Strategy" + }, + "strategyName": { + "label": "Strategy Name", + "placeholder": "Enter strategy name" + }, + "initialCapital": { + "label": "Initial Capital", + "placeholder": "Enter Initial Capital" + }, + "maxLeverage": { + "label": "Max Leverage", + "placeholder": "Max Leverage" + }, + "decideInterval": { + "label": "Decision Interval (seconds)", + "placeholder": "e.g. 300" + }, + "tradingSymbols": { + "label": "Trading Symbols", + "placeholder": "Select trading symbols...", + "searchPlaceholder": "Search or add symbols...", + "emptyText": "No symbols found." + }, + "promptTemplate": { + "label": "System Prompt Template", + "new": "New Prompt", + "view": "View Strategy" + }, + "aiModels": { + "platform": "Model Platform", + "model": "Select Model", + "noModels": "No models available", + "apiKey": { + "label": "API key", + "placeholder": "Enter API Key" + } + }, + "exchanges": { + "transactionType": "Transaction Type", + "liveTrading": "Live Trading", + "virtualTrading": "Virtual Trading", + "selectExchange": "Select Exchange", + "walletAddress": "Wallet Address", + "privateKey": "Private Key", + "apiKey": "API Key", + "secretKey": "Secret Key", + "passphrase": "Passphrase", + "testConnection": "Test Connection", + "test": { + "success": "Success!", + "failed": "Connection failed. Please check your API Key, Secret Key, or Passphrase." + }, + "placeholder": { + "binance": { + "apiKey": "Enter API Key (64 characters)", + "secretKey": "Enter Secret Key (64 characters)" + }, + "okx": { + "apiKey": "Enter API Key (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Enter Secret Key (32 uppercase letters & numbers)", + "passphrase": "Enter Passphrase (Set during API creation)" + }, + "gate": { + "apiKey": "Enter API Key (Starts with 'key_')", + "secretKey": "Enter Secret Key (64 characters)" + }, + "hyperliquid": { + "walletAddress": "Enter Wallet Address (Starts with '0x')", + "privateKey": "Enter Private Key (64 characters)" + }, + "blockchain": { + "apiKey": "Enter API Key (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Enter Secret Key" + }, + "coinbase": { + "apiKey": "Enter API Key (or Key Name)", + "secretKey": "Enter API Secret (or Private Key)", + "passphrase": "Enter Passphrase (Required for Legacy Pro API)" + }, + "mexc": { + "apiKey": "Enter Access Key (Starts with 'mx0')", + "secretKey": "Enter Secret Key (Usually 32 characters)" + }, + "default": { + "apiKey": "Paste your API Key here", + "secretKey": "Paste your Secret Key here", + "passphrase": "Enter Passphrase", + "walletAddress": "Enter Wallet Address", + "privateKey": "Enter Private Key" + } + } + } + }, + "prompt": { + "delete": { + "title": "Delete Strategy Prompt", + "description": "Are you sure you want to delete this strategy prompt? This action cannot be undone and will permanently remove the prompt from the system." + } + }, + "detail": { + "title": "Strategy Details", + "loading": "Loading details...", + "returnRate": "Return Rate", + "strategyType": "Strategy Type", + "modelProvider": "Model Provider", + "modelId": "Model ID", + "initialCapital": "Initial Capital", + "maxLeverage": "Max Leverage", + "tradingSymbols": "Trading Symbols", + "prompt": "Prompt" + }, + "history": { + "title": "Trading History", + "live": "Live Trading", + "virtual": "Virtual Trading", + "cycle": "Cycle #{{index}}", + "aiReasoning": "AI reasoning logic", + "operation": "Perform operation", + "empty": { + "title": "No trade history", + "desc": "Your completed trades will appear here" + }, + "details": { + "time": "Time", + "price": "Price", + "quantity": "Quantity", + "holdingTime": "Holding time", + "tradingFee": "Trading Fee", + "reasoning": "Reasoning" + } + } + }, + "rank": { + "title": "Profit Leaderboard", + "days": { + "7": "7D", + "30": "1M" + }, + "table": { + "rank": "Rank", + "user": "User", + "pnl": "P&L", + "strategy": "Strategy", + "exchange": "Exchange", + "model": "Model", + "details": "Details", + "loading": "Loading..." + } + }, + "home": { + "hello": "👋 Hello Investor!", + "welcome": "👋 Welcome to ValueCell !", + "watchlist": "My Watchlist", + "stock": { + "loading": "Loading stock data...", + "error": "Error loading stock data: {{message}}", + "remove": "Remove", + "removing": "Removing...", + "add": "Add Stocks", + "about": "About", + "sector": "Sector:", + "industry": "Industry:", + "website": "Website:", + "chart": { + "24h": "24h", + "7d": "7d", + "30d": "30d" + } + }, + "search": { + "title": "Stock Search", + "placeholder": "Search for stock name or code", + "searching": "Searching...", + "noResults": "No related stocks found", + "action": { + "watch": "Watchlist", + "watching": "Watching...", + "watched": "Watched" + } + }, + "suggestions": { + "research": { + "title": "Deep Research", + "description": "Analyze SEC filings to generate in-depth stock interpretation reports." + }, + "strategy": { + "title": "Automated Trading", + "description": "Multi-strategy smart trading, automatically execute your strategies" + }, + "news": { + "title": "Pushing News", + "description": "Personalized news updates on a custom schedule" + } + } + } +} diff --git a/frontend/public/locales/en-US/translation.json b/frontend/public/locales/en-US/translation.json new file mode 100644 index 000000000..b2f49f00a --- /dev/null +++ b/frontend/public/locales/en-US/translation.json @@ -0,0 +1,373 @@ +{ + "general": { + "title": "General", + "description": "Manage your preferences and application settings", + "account": { + "title": "Account", + "signInDesc": "Sign in to get started with Valuecell AI features.", + "signOut": "Sign Out", + "signIn": "Sign In" + }, + "language": { + "title": "Language and Region", + "description": "Select your preferred language and regional format for the app." + }, + "quotesColor": { + "title": "Quotes Color", + "description": "Choose how stock quote movements are visualized across the app.", + "greenUpRedDown": "Green Up / Red Down", + "redUpGreenDown": "Red Up / Green Down" + }, + "updates": { + "title": "App Updates", + "check": "Check for Update" + } + }, + "settings": { + "title": "Settings", + "nav": { + "models": "Models", + "general": "General", + "memory": "Memory" + }, + "models": { + "title": "Model Provider", + "noProviders": "No providers available.", + "loading": "Loading provider details...", + "defaultProvider": "Default Provider", + "apiKey": "API key", + "enterApiKey": "Enter API key", + "getApiKey": "Click here to get the API key", + "apiHost": "API Host", + "models": "Models", + "add": "Add", + "addModel": "Add Model", + "modelId": "Model ID", + "enterModelId": "Enter model ID", + "modelName": "Model Name", + "enterModelName": "Enter model name", + "cancel": "Cancel", + "confirm": "Confirm", + "noModels": "No models configured for this provider.", + "hidePassword": "Hide password", + "showPassword": "Show password", + "waitingForCheck": "Waiting for Check", + "checkAvailability": "Check Availability", + "available": "Available", + "unavailable": "Unavailable" + }, + "memory": { + "title": "Preserved memories", + "description": "I will remember and automatically manage useful information in chats to enhance the personalization and relevance of replies", + "loading": "Loading...", + "noMemories": "No memories yet", + "delete": "Delete" + } + }, + "common": { + "back": "Back" + }, + "market": { + "title": "Agent Market" + }, + "agent": { + "welcome": "Welcome to {{name}}!", + "unknown": "Unknown Agent", + "status": { + "running": "Running" + }, + "action": { + "view": "View" + }, + "config": { + "disable": "Disable", + "chat": "Chat", + "collectAndChat": "Collect and chat" + } + }, + "chat": { + "input": { + "placeholder": "Type your message..." + }, + "newConversation": "New Conversation", + "settings": "Settings", + "conversationList": { + "title": "Conversation List", + "loading": "Loading...", + "empty": "No conversation yet" + }, + "action": { + "delete": "Delete" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Prompt Based Strategy", + "GridStrategy": "Grid Strategy" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI Compatible", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Trading Strategies", + "add": "Add trading strategy", + "noStrategies": "No trading strategies", + "createFirst": "Create your first strategy to start trading", + "status": { + "running": "Running", + "stopped": "Stopped", + "live": "Live", + "virtual": "Virtual" + }, + "action": { + "stop": "Stop Trading Strategy?", + "stopDesc": "Stopping the strategy \"{{name}}\" will stop it immediately and trigger a forced liquidation. Do you want to proceed?", + "confirmStop": "Confirm Stop", + "delete": "Delete", + "deleteTitle": "Delete Strategy?", + "deleteDesc": "Deleting the strategy \"{{name}}\" will stop it immediately and trigger a forced liquidation. Do you want to proceed?", + "confirmDelete": "Confirm Delete", + "details": "Details", + "duplicate": "Duplicate", + "cancel": "Cancel", + "back": "Back", + "next": "Next", + "confirm": "Confirm", + "publish": "Publish", + "shareToSocial": "Share to Social", + "shareToRanking": "Share to Ranking" + }, + "portfolio": { + "title": "Portfolio Value History", + "totalEquity": "Total Equity", + "availableBalance": "Available Balance", + "totalPnl": "Total P&L", + "noData": "No portfolio value data", + "noDataDesc": "Portfolio value chart will appear once trading begins" + }, + "positions": { + "title": "Positions", + "symbol": "Symbol", + "type": "Type", + "leverage": "Leverage", + "quantity": "Quantity", + "pnl": "P&L", + "noOpen": "No open positions", + "noOpenDesc": "Positions will appear here when trades are opened" + }, + "create": { + "title": "Add trading strategy", + "steps": { + "aiModels": "AI Models", + "exchanges": "Exchanges", + "tradingStrategy": "Trading strategy" + }, + "error": "Error Creating Strategy" + }, + "form": { + "strategyType": { + "label": "Strategy Type", + "promptBased": "Prompt Based Strategy", + "grid": "Grid Strategy" + }, + "strategyName": { + "label": "Strategy Name", + "placeholder": "Enter strategy name" + }, + "initialCapital": { + "label": "Initial Capital", + "placeholder": "Enter Initial Capital" + }, + "maxLeverage": { + "label": "Max Leverage", + "placeholder": "Max Leverage" + }, + "decideInterval": { + "label": "Decision Interval (seconds)", + "placeholder": "e.g. 300" + }, + "tradingSymbols": { + "label": "Trading Symbols", + "placeholder": "Select trading symbols...", + "searchPlaceholder": "Search or add symbols...", + "emptyText": "No symbols found." + }, + "promptTemplate": { + "label": "System Prompt Template", + "new": "New Prompt", + "view": "View Strategy" + }, + "aiModels": { + "platform": "Model Platform", + "model": "Select Model", + "noModels": "No models available", + "apiKey": { + "label": "API key", + "placeholder": "Enter API Key" + } + }, + "exchanges": { + "transactionType": "Transaction Type", + "liveTrading": "Live Trading", + "virtualTrading": "Virtual Trading", + "selectExchange": "Select Exchange", + "walletAddress": "Wallet Address", + "privateKey": "Private Key", + "apiKey": "API Key", + "secretKey": "Secret Key", + "passphrase": "Passphrase", + "testConnection": "Test Connection", + "test": { + "success": "Success!", + "failed": "Connection failed. Please check your API Key, Secret Key, or Passphrase." + }, + "placeholder": { + "binance": { + "apiKey": "Enter API Key (64 characters)", + "secretKey": "Enter Secret Key (64 characters)" + }, + "okx": { + "apiKey": "Enter API Key (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Enter Secret Key (32 uppercase letters & numbers)", + "passphrase": "Enter Passphrase (Set during API creation)" + }, + "gate": { + "apiKey": "Enter API Key (Starts with 'key_')", + "secretKey": "Enter Secret Key (64 characters)" + }, + "hyperliquid": { + "walletAddress": "Enter Wallet Address (Starts with '0x')", + "privateKey": "Enter Private Key (64 characters)" + }, + "blockchain": { + "apiKey": "Enter API Key (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Enter Secret Key" + }, + "coinbase": { + "apiKey": "Enter API Key (or Key Name)", + "secretKey": "Enter API Secret (or Private Key)", + "passphrase": "Enter Passphrase (Required for Legacy Pro API)" + }, + "mexc": { + "apiKey": "Enter Access Key (Starts with 'mx0')", + "secretKey": "Enter Secret Key (Usually 32 characters)" + }, + "default": { + "apiKey": "Paste your API Key here", + "secretKey": "Paste your Secret Key here", + "passphrase": "Enter Passphrase", + "walletAddress": "Enter Wallet Address", + "privateKey": "Enter Private Key" + } + } + } + }, + "prompt": { + "delete": { + "title": "Delete Strategy Prompt", + "description": "Are you sure you want to delete this strategy prompt? This action cannot be undone and will permanently remove the prompt from the system." + } + }, + "detail": { + "title": "Strategy Details", + "loading": "Loading details...", + "returnRate": "Return Rate", + "strategyType": "Strategy Type", + "modelProvider": "Model Provider", + "modelId": "Model ID", + "initialCapital": "Initial Capital", + "maxLeverage": "Max Leverage", + "tradingSymbols": "Trading Symbols", + "prompt": "Prompt" + }, + "history": { + "title": "Trading History", + "live": "Live Trading", + "virtual": "Virtual Trading", + "cycle": "Cycle #{{index}}", + "aiReasoning": "AI reasoning logic", + "operation": "Perform operation", + "empty": { + "title": "No trade history", + "desc": "Your completed trades will appear here" + }, + "details": { + "time": "Time", + "price": "Price", + "quantity": "Quantity", + "holdingTime": "Holding time", + "tradingFee": "Trading Fee", + "reasoning": "Reasoning" + } + } + }, + "rank": { + "title": "Profit Leaderboard", + "days": { + "7": "7D", + "30": "1M" + }, + "table": { + "rank": "Rank", + "user": "User", + "pnl": "P&L", + "strategy": "Strategy", + "exchange": "Exchange", + "model": "Model", + "details": "Details", + "loading": "Loading..." + } + }, + "home": { + "hello": "👋 Hello Investor!", + "welcome": "👋 Welcome to ValueCell !", + "watchlist": "My Watchlist", + "stock": { + "loading": "Loading stock data...", + "error": "Error loading stock data: {{message}}", + "remove": "Remove", + "removing": "Removing...", + "add": "Add Stocks", + "about": "About", + "sector": "Sector:", + "industry": "Industry:", + "website": "Website:", + "chart": { + "24h": "24h", + "7d": "7d", + "30d": "30d" + } + }, + "search": { + "title": "Stock Search", + "placeholder": "Search for stock name or code", + "searching": "Searching...", + "noResults": "No related stocks found", + "action": { + "watch": "Watchlist", + "watching": "Watching...", + "watched": "Watched" + } + }, + "suggestions": { + "research": { + "title": "Deep Research", + "description": "Analyze SEC filings to generate in-depth stock interpretation reports." + }, + "strategy": { + "title": "Automated Trading", + "description": "Multi-strategy smart trading, automatically execute your strategies" + }, + "news": { + "title": "Pushing News", + "description": "Personalized news updates on a custom schedule" + } + } + } +} diff --git a/frontend/public/locales/es-ES/translation.json b/frontend/public/locales/es-ES/translation.json new file mode 100644 index 000000000..3b0b6815c --- /dev/null +++ b/frontend/public/locales/es-ES/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "General", + "description": "Administra tus preferencias y la configuración de la aplicación", + "account": { + "title": "Cuenta", + "signInDesc": "Inicia sesión para comenzar con las funciones de Valuecell AI.", + "signOut": "Cerrar sesión", + "signIn": "Iniciar sesión" + }, + "language": { + "title": "Idioma y Región", + "description": "Selecciona tu idioma preferido y el formato regional para la aplicación." + }, + "quotesColor": { + "title": "Color de las Cotizaciones", + "description": "Elige cómo se visualizan los movimientos de las cotizaciones bursátiles en la aplicación.", + "greenUpRedDown": "Verde Sube / Rojo Baja", + "redUpGreenDown": "Rojo Sube / Verde Baja" + }, + "updates": { + "title": "Actualizaciones de la App", + "check": "Buscar actualizaciones" + } + }, + "settings": { + "title": "Configuración", + "nav": { + "models": "Modelos", + "general": "General", + "memory": "Memoria" + }, + "models": { + "title": "Proveedor de Modelo", + "noProviders": "No hay proveedores disponibles.", + "loading": "Cargando detalles del proveedor...", + "defaultProvider": "Proveedor predeterminado", + "apiKey": "Clave API", + "enterApiKey": "Ingresa la clave API", + "getApiKey": "Haz clic aquí para obtener la clave API", + "apiHost": "Host API", + "models": "Modelos", + "add": "Agregar", + "addModel": "Agregar Modelo", + "modelId": "ID del Modelo", + "enterModelId": "Ingresa el ID del modelo", + "modelName": "Nombre del Modelo", + "enterModelName": "Ingresa el nombre del modelo", + "cancel": "Cancelar", + "confirm": "Confirmar", + "noModels": "No hay modelos configurados para este proveedor." + }, + "memory": { + "title": "Recuerdos preservados", + "description": "Recordaré y administraré automáticamente información útil en los chats para mejorar la personalización y la relevancia de las respuestas", + "loading": "Cargando...", + "noMemories": "Aún no hay recuerdos", + "delete": "Eliminar" + } + }, + "common": { + "back": "Atrás" + }, + "market": { + "title": "Mercado de Agentes" + }, + "agent": { + "welcome": "¡Bienvenido a {{name}}!", + "unknown": "Agente Desconocido", + "status": { + "running": "Ejecutando" + }, + "action": { + "view": "Ver" + }, + "config": { + "disable": "Desactivar", + "chat": "Chat", + "collectAndChat": "Recopilar y chatear" + } + }, + "chat": { + "input": { + "placeholder": "Escribe tu mensaje..." + }, + "newConversation": "Nueva Conversación", + "settings": "Configuración", + "conversationList": { + "title": "Lista de Conversaciones", + "loading": "Cargando...", + "empty": "Aún no hay conversaciones" + }, + "action": { + "delete": "Eliminar" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Estrategia basada en Prompt", + "GridStrategy": "Estrategia de Cuadrícula" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Compatible con OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Estrategias de Trading", + "add": "Agregar estrategia de trading", + "noStrategies": "No hay estrategias de trading", + "createFirst": "Crea tu primera estrategia para comenzar a operar", + "status": { + "running": "Ejecutando", + "stopped": "Detenido", + "live": "En vivo", + "virtual": "Virtual" + }, + "action": { + "stop": "¿Detener la Estrategia de Trading?", + "stopDesc": "Detener la estrategia \"{{name}}\" la detendrá inmediatamente y activará una liquidación forzosa. ¿Deseas continuar?", + "confirmStop": "Confirmar Detención", + "delete": "Eliminar", + "deleteTitle": "¿Eliminar Estrategia?", + "deleteDesc": "Eliminar la estrategia \"{{name}}\" la detendrá inmediatamente y activará una liquidación forzosa. ¿Deseas continuar?", + "confirmDelete": "Confirmar Eliminación", + "details": "Detalles", + "duplicate": "Duplicar", + "cancel": "Cancelar", + "back": "Atrás", + "next": "Siguiente", + "confirm": "Confirmar", + "publish": "Publicar", + "shareToSocial": "Compartir en redes sociales", + "shareToRanking": "Compartir en el ranking" + }, + "portfolio": { + "title": "Historial del Valor de la Cartera", + "totalEquity": "Patrimonio Total", + "availableBalance": "Saldo Disponible", + "totalPnl": "P&L Total", + "noData": "No hay datos de valor de cartera", + "noDataDesc": "El gráfico de valor de la cartera aparecerá una vez que comience el trading" + }, + "positions": { + "title": "Posiciones", + "symbol": "Símbolo", + "type": "Tipo", + "leverage": "Apalancamiento", + "quantity": "Cantidad", + "pnl": "P&L", + "noOpen": "No hay posiciones abiertas", + "noOpenDesc": "Las posiciones aparecerán aquí cuando se abran operaciones" + }, + "create": { + "title": "Agregar estrategia de trading", + "steps": { + "aiModels": "Modelos IA", + "exchanges": "Exchanges", + "tradingStrategy": "Estrategia de trading" + }, + "error": "Error creando la estrategia" + }, + "form": { + "strategyType": { + "label": "Tipo de Estrategia", + "promptBased": "Estrategia basada en Prompt", + "grid": "Estrategia de Cuadrícula" + }, + "strategyName": { + "label": "Nombre de la Estrategia", + "placeholder": "Ingresa el nombre de la estrategia" + }, + "initialCapital": { + "label": "Capital Inicial", + "placeholder": "Ingresa el Capital Inicial" + }, + "maxLeverage": { + "label": "Apalancamiento Máximo", + "placeholder": "Apalancamiento Máximo" + }, + "decideInterval": { + "label": "Intervalo de Decisión (segundos)", + "placeholder": "ej: 300" + }, + "tradingSymbols": { + "label": "Símbolos de Trading", + "placeholder": "Selecciona símbolos de trading...", + "searchPlaceholder": "Buscar o agregar símbolos...", + "emptyText": "No se encontraron símbolos." + }, + "promptTemplate": { + "label": "Plantilla de Prompt del Sistema", + "new": "Nuevo Prompt", + "view": "Ver Estrategia" + }, + "aiModels": { + "platform": "Plataforma de Modelo", + "model": "Seleccionar Modelo", + "noModels": "No hay modelos disponibles", + "apiKey": { + "label": "Clave API", + "placeholder": "Ingresa la Clave API" + } + }, + "exchanges": { + "transactionType": "Tipo de Transacción", + "liveTrading": "Trading en Vivo", + "virtualTrading": "Trading Virtual", + "selectExchange": "Seleccionar Exchange", + "walletAddress": "Dirección de Billetera", + "privateKey": "Clave Privada", + "apiKey": "Clave API", + "secretKey": "Clave Secreta", + "passphrase": "Frase de Contraseña", + "testConnection": "Probar Conexión", + "test": { + "success": "¡Éxito!", + "failed": "La conexión falló. Por favor, verifica tu Clave API, Clave Secreta o Frase de Contraseña." + }, + "placeholder": { + "binance": { + "apiKey": "Ingresa la Clave API (64 caracteres)", + "secretKey": "Ingresa la Clave Secreta (64 caracteres)" + }, + "okx": { + "apiKey": "Ingresa la Clave API (Formato: xxxxxxxx-xxxx-...)", + "secretKey": "Ingresa la Clave Secreta (32 letras mayúsculas y números)", + "passphrase": "Ingresa la Frase de Contraseña (Establecida durante la creación de la API)" + }, + "gate": { + "apiKey": "Ingresa la Clave API (Comienza con 'key_')", + "secretKey": "Ingresa la Clave Secreta (64 caracteres)" + }, + "hyperliquid": { + "walletAddress": "Ingresa la Dirección de Billetera (Comienza con '0x')", + "privateKey": "Ingresa la Clave Privada (64 caracteres)" + }, + "blockchain": { + "apiKey": "Ingresa la Clave API (Formato: xxxxxxxx-xxxx-...)", + "secretKey": "Ingresa la Clave Secreta" + }, + "coinbase": { + "apiKey": "Ingresa la Clave API (o Nombre de la Clave)", + "secretKey": "Ingresa el Secreto API (o Clave Privada)", + "passphrase": "Ingresa la Frase de Contraseña (Requerido para la API Pro Legacy)" + }, + "mexc": { + "apiKey": "Ingresa la Clave de Acceso (Comienza con 'mx0')", + "secretKey": "Ingresa la Clave Secreta (Generalmente 32 caracteres)" + }, + "default": { + "apiKey": "Pega tu Clave API aquí", + "secretKey": "Pega tu Clave Secreta aquí", + "passphrase": "Ingresa la Frase de Contraseña", + "walletAddress": "Ingresa la Dirección de Billetera", + "privateKey": "Ingresa la Clave Privada" + } + } + } + }, + "prompt": { + "delete": { + "title": "Eliminar Prompt de Estrategia", + "description": "¿Estás seguro de que deseas eliminar este prompt de estrategia? Esta acción no se puede deshacer y eliminará permanentemente el prompt del sistema." + } + }, + "detail": { + "title": "Detalles de la Estrategia", + "loading": "Cargando detalles...", + "returnRate": "Tasa de Retorno", + "strategyType": "Tipo de Estrategia", + "modelProvider": "Proveedor de Modelo", + "modelId": "ID del Modelo", + "initialCapital": "Capital Inicial", + "maxLeverage": "Apalancamiento Máximo", + "tradingSymbols": "Símbolos de Trading", + "prompt": "Prompt" + }, + "history": { + "title": "Historial de Trading", + "live": "Trading en Vivo", + "virtual": "Trading Virtual", + "cycle": "Ciclo #{{index}}", + "aiReasoning": "Lógica de razonamiento IA", + "operation": "Realizar operación", + "empty": { + "title": "No hay historial de operaciones", + "desc": "Tus operaciones completadas aparecerán aquí" + }, + "details": { + "time": "Hora", + "price": "Precio", + "quantity": "Cantidad", + "holdingTime": "Tiempo de tenencia", + "tradingFee": "Comisión de Trading", + "reasoning": "Razonamiento" + } + } + }, + "rank": { + "title": "Tabla de Clasificación de Beneficios", + "days": { + "7": "7D", + "30": "1M" + }, + "table": { + "rank": "Rango", + "user": "Usuario", + "pnl": "P&L", + "strategy": "Estrategia", + "exchange": "Exchange", + "model": "Modelo", + "details": "Detalles", + "loading": "Cargando..." + } + }, + "home": { + "hello": "👋 ¡Hola Inversor!", + "welcome": "👋 ¡Bienvenido a ValueCell!", + "watchlist": "Mi Lista de Seguimiento", + "stock": { + "loading": "Cargando datos bursátiles...", + "error": "Error cargando datos bursátiles: {{message}}", + "remove": "Eliminar", + "removing": "Eliminando...", + "add": "Agregar Acciones", + "about": "Acerca de", + "sector": "Sector:", + "industry": "Industria:", + "website": "Sitio Web:", + "chart": { + "24h": "24h", + "7d": "7d", + "30d": "30d" + } + }, + "search": { + "title": "Búsqueda de Acciones", + "placeholder": "Buscar por nombre de acción o código", + "searching": "Buscando...", + "noResults": "No se encontraron acciones relacionadas", + "action": { + "watch": "Seguir", + "watching": "Siguiendo...", + "watched": "Seguido" + } + }, + "suggestions": { + "research": { + "title": "Investigación Profunda", + "description": "Analiza las presentaciones ante la SEC para generar informes de interpretación bursátil en profundidad." + }, + "strategy": { + "title": "Trading Automatizado", + "description": "Trading inteligente multi-estrategia, ejecuta automáticamente tus estrategias" + }, + "news": { + "title": "Notificaciones de Noticias", + "description": "Actualizaciones de noticias personalizadas según un horario personalizado" + } + } + } +} diff --git a/frontend/public/locales/fr-FR/translation.json b/frontend/public/locales/fr-FR/translation.json new file mode 100644 index 000000000..46924a681 --- /dev/null +++ b/frontend/public/locales/fr-FR/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Général", + "description": "Gérez vos préférences et les paramètres de l'application", + "account": { + "title": "Compte", + "signInDesc": "Connectez-vous pour commencer avec les fonctionnalités Valuecell AI.", + "signOut": "Se déconnecter", + "signIn": "Se connecter" + }, + "language": { + "title": "Langue et Région", + "description": "Sélectionnez votre langue préférée et le format régional pour l'application." + }, + "quotesColor": { + "title": "Couleur des Cotations", + "description": "Choisissez comment les mouvements des cotations boursières sont visualisés dans l'application.", + "greenUpRedDown": "Vert Hausse / Rouge Baisse", + "redUpGreenDown": "Rouge Hausse / Vert Baisse" + }, + "updates": { + "title": "Mises à jour de l'App", + "check": "Vérifier les mises à jour" + } + }, + "settings": { + "title": "Paramètres", + "nav": { + "models": "Modèles", + "general": "Général", + "memory": "Mémoire" + }, + "models": { + "title": "Fournisseur de Modèle", + "noProviders": "Aucun fournisseur disponible.", + "loading": "Chargement des détails du fournisseur...", + "defaultProvider": "Fournisseur par défaut", + "apiKey": "Clé API", + "enterApiKey": "Entrez la clé API", + "getApiKey": "Cliquez ici pour obtenir la clé API", + "apiHost": "Hôte API", + "models": "Modèles", + "add": "Ajouter", + "addModel": "Ajouter un Modèle", + "modelId": "ID du Modèle", + "enterModelId": "Entrez l'ID du modèle", + "modelName": "Nom du Modèle", + "enterModelName": "Entrez le nom du modèle", + "cancel": "Annuler", + "confirm": "Confirmer", + "noModels": "Aucun modèle configuré pour ce fournisseur." + }, + "memory": { + "title": "Souvenirs préservés", + "description": "Je me souviendrai et gérerai automatiquement les informations utiles dans les chats pour améliorer la personnalisation et la pertinence des réponses", + "loading": "Chargement...", + "noMemories": "Pas encore de souvenirs", + "delete": "Supprimer" + } + }, + "common": { + "back": "Retour" + }, + "market": { + "title": "Marché des Agents" + }, + "agent": { + "welcome": "Bienvenue sur {{name}} !", + "unknown": "Agent Inconnu", + "status": { + "running": "En cours" + }, + "action": { + "view": "Voir" + }, + "config": { + "disable": "Désactiver", + "chat": "Chat", + "collectAndChat": "Collecter et chatter" + } + }, + "chat": { + "input": { + "placeholder": "Tapez votre message..." + }, + "newConversation": "Nouvelle Conversation", + "settings": "Paramètres", + "conversationList": { + "title": "Liste des Conversations", + "loading": "Chargement...", + "empty": "Aucune conversation pour le moment" + }, + "action": { + "delete": "Supprimer" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Stratégie basée sur Prompt", + "GridStrategy": "Stratégie de Grille" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Compatible OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Stratégies de Trading", + "add": "Ajouter une stratégie de trading", + "noStrategies": "Aucune stratégie de trading", + "createFirst": "Créez votre première stratégie pour commencer à trader", + "status": { + "running": "En cours", + "stopped": "Arrêté", + "live": "Réel", + "virtual": "Virtuel" + }, + "action": { + "stop": "Arrêter la Stratégie de Trading ?", + "stopDesc": "L'arrêt de la stratégie \"{{name}}\" l'arrêtera immédiatement et déclenchera une liquidation forcée. Voulez-vous continuer ?", + "confirmStop": "Confirmer l'Arrêt", + "delete": "Supprimer", + "deleteTitle": "Supprimer la Stratégie ?", + "deleteDesc": "La suppression de la stratégie \"{{name}}\" l'arrêtera immédiatement et déclenchera une liquidation forcée. Voulez-vous continuer ?", + "confirmDelete": "Confirmer la Suppression", + "details": "Détails", + "duplicate": "Dupliquer", + "cancel": "Annuler", + "back": "Retour", + "next": "Suivant", + "confirm": "Confirmer", + "publish": "Publier", + "shareToSocial": "Partager sur les réseaux sociaux", + "shareToRanking": "Partager au classement" + }, + "portfolio": { + "title": "Historique de la Valeur du Portefeuille", + "totalEquity": "Capitaux Propres Totaux", + "availableBalance": "Solde Disponible", + "totalPnl": "P&L Total", + "noData": "Aucune donnée de valeur de portefeuille", + "noDataDesc": "Le graphique de la valeur du portefeuille apparaîtra une fois le trading commencé" + }, + "positions": { + "title": "Positions", + "symbol": "Symbole", + "type": "Type", + "leverage": "Levier", + "quantity": "Quantité", + "pnl": "P&L", + "noOpen": "Aucune position ouverte", + "noOpenDesc": "Les positions apparaîtront ici lorsque des trades seront ouverts" + }, + "create": { + "title": "Ajouter une stratégie de trading", + "steps": { + "aiModels": "Modèles IA", + "exchanges": "Bourses", + "tradingStrategy": "Stratégie de trading" + }, + "error": "Erreur lors de la création de la stratégie" + }, + "form": { + "strategyType": { + "label": "Type de Stratégie", + "promptBased": "Stratégie basée sur Prompt", + "grid": "Stratégie de Grille" + }, + "strategyName": { + "label": "Nom de la Stratégie", + "placeholder": "Entrez le nom de la stratégie" + }, + "initialCapital": { + "label": "Capital Initial", + "placeholder": "Entrez le Capital Initial" + }, + "maxLeverage": { + "label": "Levier Max", + "placeholder": "Levier Max" + }, + "decideInterval": { + "label": "Intervalle de Décision (secondes)", + "placeholder": "ex: 300" + }, + "tradingSymbols": { + "label": "Symboles de Trading", + "placeholder": "Sélectionnez les symboles de trading...", + "searchPlaceholder": "Rechercher ou ajouter des symboles...", + "emptyText": "Aucun symbole trouvé." + }, + "promptTemplate": { + "label": "Modèle de Prompt Système", + "new": "Nouveau Prompt", + "view": "Voir la Stratégie" + }, + "aiModels": { + "platform": "Plateforme de Modèle", + "model": "Sélectionner le Modèle", + "noModels": "Aucun modèle disponible", + "apiKey": { + "label": "Clé API", + "placeholder": "Entrez la Clé API" + } + }, + "exchanges": { + "transactionType": "Type de Transaction", + "liveTrading": "Trading Réel", + "virtualTrading": "Trading Virtuel", + "selectExchange": "Sélectionner la Bourse", + "walletAddress": "Adresse du Portefeuille", + "privateKey": "Clé Privée", + "apiKey": "Clé API", + "secretKey": "Clé Secrète", + "passphrase": "Phrase Secrète", + "testConnection": "Tester la Connexion", + "test": { + "success": "Succès !", + "failed": "La connexion a échoué. Veuillez vérifier votre Clé API, Clé Secrète ou Phrase Secrète." + }, + "placeholder": { + "binance": { + "apiKey": "Entrez la Clé API (64 caractères)", + "secretKey": "Entrez la Clé Secrète (64 caractères)" + }, + "okx": { + "apiKey": "Entrez la Clé API (Format : xxxxxxxx-xxxx-...)", + "secretKey": "Entrez la Clé Secrète (32 lettres majuscules et chiffres)", + "passphrase": "Entrez la Phrase Secrète (Définie lors de la création de l'API)" + }, + "gate": { + "apiKey": "Entrez la Clé API (Commence par 'key_')", + "secretKey": "Entrez la Clé Secrète (64 caractères)" + }, + "hyperliquid": { + "walletAddress": "Entrez l'Adresse du Portefeuille (Commence par '0x')", + "privateKey": "Entrez la Clé Privée (64 caractères)" + }, + "blockchain": { + "apiKey": "Entrez la Clé API (Format : xxxxxxxx-xxxx-...)", + "secretKey": "Entrez la Clé Secrète" + }, + "coinbase": { + "apiKey": "Entrez la Clé API (ou Nom de la Clé)", + "secretKey": "Entrez le Secret API (ou Clé Privée)", + "passphrase": "Entrez la Phrase Secrète (Requis pour l'API Pro Legacy)" + }, + "mexc": { + "apiKey": "Entrez la Clé d'Accès (Commence par 'mx0')", + "secretKey": "Entrez la Clé Secrète (Généralement 32 caractères)" + }, + "default": { + "apiKey": "Collez votre Clé API ici", + "secretKey": "Collez votre Clé Secrète ici", + "passphrase": "Entrez la Phrase Secrète", + "walletAddress": "Entrez l'Adresse du Portefeuille", + "privateKey": "Entrez la Clé Privée" + } + } + } + }, + "prompt": { + "delete": { + "title": "Supprimer le Prompt de Stratégie", + "description": "Êtes-vous sûr de vouloir supprimer ce prompt de stratégie ? Cette action est irréversible et supprimera définitivement le prompt du système." + } + }, + "detail": { + "title": "Détails de la Stratégie", + "loading": "Chargement des détails...", + "returnRate": "Taux de Rendement", + "strategyType": "Type de Stratégie", + "modelProvider": "Fournisseur de Modèle", + "modelId": "ID du Modèle", + "initialCapital": "Capital Initial", + "maxLeverage": "Levier Max", + "tradingSymbols": "Symboles de Trading", + "prompt": "Prompt" + }, + "history": { + "title": "Historique de Trading", + "live": "Trading Réel", + "virtual": "Trading Virtuel", + "cycle": "Cycle #{{index}}", + "aiReasoning": "Logique de raisonnement IA", + "operation": "Effectuer l'opération", + "empty": { + "title": "Aucun historique de trade", + "desc": "Vos trades terminés apparaîtront ici" + }, + "details": { + "time": "Heure", + "price": "Prix", + "quantity": "Quantité", + "holdingTime": "Temps de détention", + "tradingFee": "Frais de Trading", + "reasoning": "Raisonnement" + } + } + }, + "rank": { + "title": "Classement des Profits", + "days": { + "7": "7J", + "30": "1M" + }, + "table": { + "rank": "Rang", + "user": "Utilisateur", + "pnl": "P&L", + "strategy": "Stratégie", + "exchange": "Bourse", + "model": "Modèle", + "details": "Détails", + "loading": "Chargement..." + } + }, + "home": { + "hello": "👋 Bonjour Investisseur !", + "welcome": "👋 Bienvenue sur ValueCell !", + "watchlist": "Ma Liste de Surveillance", + "stock": { + "loading": "Chargement des données boursières...", + "error": "Erreur lors du chargement des données boursières : {{message}}", + "remove": "Retirer", + "removing": "Retrait en cours...", + "add": "Ajouter des Actions", + "about": "À propos", + "sector": "Secteur :", + "industry": "Industrie :", + "website": "Site Web :", + "chart": { + "24h": "24h", + "7d": "7j", + "30d": "30j" + } + }, + "search": { + "title": "Recherche d'Actions", + "placeholder": "Rechercher par nom d'action ou code", + "searching": "Recherche en cours...", + "noResults": "Aucune action correspondante trouvée", + "action": { + "watch": "Suivre", + "watching": "Suivi...", + "watched": "Suivi" + } + }, + "suggestions": { + "research": { + "title": "Recherche Approfondie", + "description": "Analysez les dépôts SEC pour générer des rapports d'interprétation boursière approfondis." + }, + "strategy": { + "title": "Trading Automatisé", + "description": "Trading intelligent multi-stratégies, exécutez automatiquement vos stratégies" + }, + "news": { + "title": "Push d'Actualités", + "description": "Mises à jour d'actualités personnalisées selon un calendrier défini" + } + } + } +} diff --git a/frontend/public/locales/id-ID/translation.json b/frontend/public/locales/id-ID/translation.json new file mode 100644 index 000000000..81e1a73be --- /dev/null +++ b/frontend/public/locales/id-ID/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Umum", + "description": "Kelola preferensi dan pengaturan aplikasi Anda", + "account": { + "title": "Akun", + "signInDesc": "Masuk untuk mulai menggunakan fitur Valuecell AI.", + "signOut": "Keluar", + "signIn": "Masuk" + }, + "language": { + "title": "Bahasa dan Wilayah", + "description": "Pilih bahasa dan format wilayah pilihan Anda untuk aplikasi." + }, + "quotesColor": { + "title": "Warna Kutipan", + "description": "Pilih bagaimana pergerakan harga saham divisualisasikan di seluruh aplikasi.", + "greenUpRedDown": "Hijau Naik / Merah Turun", + "redUpGreenDown": "Merah Naik / Hijau Turun" + }, + "updates": { + "title": "Pembaruan Aplikasi", + "check": "Periksa Pembaruan" + } + }, + "settings": { + "title": "Pengaturan", + "nav": { + "models": "Model", + "general": "Umum", + "memory": "Memori" + }, + "models": { + "title": "Penyedia Model", + "noProviders": "Tidak ada penyedia yang tersedia.", + "loading": "Memuat detail penyedia...", + "defaultProvider": "Penyedia Default", + "apiKey": "Kunci API", + "enterApiKey": "Masukkan kunci API", + "getApiKey": "Klik di sini untuk mendapatkan kunci API", + "apiHost": "Host API", + "models": "Model", + "add": "Tambah", + "addModel": "Tambah Model", + "modelId": "ID Model", + "enterModelId": "Masukkan ID model", + "modelName": "Nama Model", + "enterModelName": "Masukkan nama model", + "cancel": "Batal", + "confirm": "Konfirmasi", + "noModels": "Tidak ada model yang dikonfigurasi untuk penyedia ini." + }, + "memory": { + "title": "Memori tersimpan", + "description": "Saya akan mengingat dan mengelola informasi berguna secara otomatis dalam obrolan untuk meningkatkan personalisasi dan relevansi balasan", + "loading": "Memuat...", + "noMemories": "Belum ada memori", + "delete": "Hapus" + } + }, + "common": { + "back": "Kembali" + }, + "market": { + "title": "Pasar Agen" + }, + "agent": { + "welcome": "Selamat datang di {{name}}!", + "unknown": "Agen Tidak Diketahui", + "status": { + "running": "Berjalan" + }, + "action": { + "view": "Lihat" + }, + "config": { + "disable": "Nonaktifkan", + "chat": "Obrolan", + "collectAndChat": "Kumpulkan dan ngobrol" + } + }, + "chat": { + "input": { + "placeholder": "Ketik pesan Anda..." + }, + "newConversation": "Percakapan Baru", + "settings": "Pengaturan", + "conversationList": { + "title": "Daftar Percakapan", + "loading": "Memuat...", + "empty": "Belum ada percakapan" + }, + "action": { + "delete": "Hapus" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Strategi Berbasis Prompt", + "GridStrategy": "Strategi Grid" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Kompatibel OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Strategi Perdagangan", + "add": "Tambah strategi perdagangan", + "noStrategies": "Tidak ada strategi perdagangan", + "createFirst": "Buat strategi pertama Anda untuk memulai perdagangan", + "status": { + "running": "Berjalan", + "stopped": "Berhenti", + "live": "Langsung", + "virtual": "Virtual" + }, + "action": { + "stop": "Hentikan Strategi Perdagangan?", + "stopDesc": "Menghentikan strategi \"{{name}}\" akan menghentikannya segera dan memicu likuidasi paksa. Apakah Anda ingin melanjutkan?", + "confirmStop": "Konfirmasi Berhenti", + "delete": "Hapus", + "deleteTitle": "Hapus Strategi?", + "deleteDesc": "Menghapus strategi \"{{name}}\" akan menghentikannya segera dan memicu likuidasi paksa. Apakah Anda ingin melanjutkan?", + "confirmDelete": "Konfirmasi Hapus", + "details": "Detail", + "duplicate": "Duplikat", + "cancel": "Batal", + "back": "Kembali", + "next": "Lanjut", + "confirm": "Konfirmasi", + "publish": "Terbitkan", + "shareToSocial": "Bagikan ke Sosial", + "shareToRanking": "Bagikan ke Peringkat" + }, + "portfolio": { + "title": "Riwayat Nilai Portofolio", + "totalEquity": "Total Ekuitas", + "availableBalance": "Saldo Tersedia", + "totalPnl": "Total P&L", + "noData": "Tidak ada data nilai portofolio", + "noDataDesc": "Grafik nilai portofolio akan muncul setelah perdagangan dimulai" + }, + "positions": { + "title": "Posisi", + "symbol": "Simbol", + "type": "Tipe", + "leverage": "Leverage", + "quantity": "Jumlah", + "pnl": "P&L", + "noOpen": "Tidak ada posisi terbuka", + "noOpenDesc": "Posisi akan muncul di sini saat perdagangan dibuka" + }, + "create": { + "title": "Tambah strategi perdagangan", + "steps": { + "aiModels": "Model AI", + "exchanges": "Bursa", + "tradingStrategy": "Strategi perdagangan" + }, + "error": "Kesalahan Membuat Strategi" + }, + "form": { + "strategyType": { + "label": "Tipe Strategi", + "promptBased": "Strategi Berbasis Prompt", + "grid": "Strategi Grid" + }, + "strategyName": { + "label": "Nama Strategi", + "placeholder": "Masukkan nama strategi" + }, + "initialCapital": { + "label": "Modal Awal", + "placeholder": "Masukkan Modal Awal" + }, + "maxLeverage": { + "label": "Max Leverage", + "placeholder": "Max Leverage" + }, + "decideInterval": { + "label": "Interval Keputusan (detik)", + "placeholder": "mis. 300" + }, + "tradingSymbols": { + "label": "Simbol Perdagangan", + "placeholder": "Pilih simbol perdagangan...", + "searchPlaceholder": "Cari atau tambah simbol...", + "emptyText": "Simbol tidak ditemukan." + }, + "promptTemplate": { + "label": "Template Prompt Sistem", + "new": "Prompt Baru", + "view": "Lihat Strategi" + }, + "aiModels": { + "platform": "Platform Model", + "model": "Pilih Model", + "noModels": "Tidak ada model tersedia", + "apiKey": { + "label": "Kunci API", + "placeholder": "Masukkan Kunci API" + } + }, + "exchanges": { + "transactionType": "Tipe Transaksi", + "liveTrading": "Perdagangan Langsung", + "virtualTrading": "Perdagangan Virtual", + "selectExchange": "Pilih Bursa", + "walletAddress": "Alamat Dompet", + "privateKey": "Kunci Pribadi", + "apiKey": "Kunci API", + "secretKey": "Kunci Rahasia", + "passphrase": "Frasa Sandi", + "testConnection": "Tes Koneksi", + "test": { + "success": "Berhasil!", + "failed": "Koneksi gagal. Silakan periksa Kunci API, Kunci Rahasia, atau Frasa Sandi Anda." + }, + "placeholder": { + "binance": { + "apiKey": "Masukkan Kunci API (64 karakter)", + "secretKey": "Masukkan Kunci Rahasia (64 karakter)" + }, + "okx": { + "apiKey": "Masukkan Kunci API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Masukkan Kunci Rahasia (32 huruf besar & angka)", + "passphrase": "Masukkan Frasa Sandi (Ditetapkan saat pembuatan API)" + }, + "gate": { + "apiKey": "Masukkan Kunci API (Dimulai dengan 'key_')", + "secretKey": "Masukkan Kunci Rahasia (64 karakter)" + }, + "hyperliquid": { + "walletAddress": "Masukkan Alamat Dompet (Dimulai dengan '0x')", + "privateKey": "Masukkan Kunci Pribadi (64 karakter)" + }, + "blockchain": { + "apiKey": "Masukkan Kunci API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Masukkan Kunci Rahasia" + }, + "coinbase": { + "apiKey": "Masukkan Kunci API (atau Nama Kunci)", + "secretKey": "Masukkan Rahasia API (atau Kunci Pribadi)", + "passphrase": "Masukkan Frasa Sandi (Diperlukan untuk API Pro Legacy)" + }, + "mexc": { + "apiKey": "Masukkan Kunci Akses (Dimulai dengan 'mx0')", + "secretKey": "Masukkan Kunci Rahasia (Biasanya 32 karakter)" + }, + "default": { + "apiKey": "Tempel Kunci API Anda di sini", + "secretKey": "Tempel Kunci Rahasia Anda di sini", + "passphrase": "Masukkan Frasa Sandi", + "walletAddress": "Masukkan Alamat Dompet", + "privateKey": "Masukkan Kunci Pribadi" + } + } + }, + "prompt": { + "delete": { + "title": "Hapus Prompt Strategi", + "description": "Apakah Anda yakin ingin menghapus prompt strategi ini? Tindakan ini tidak dapat dibatalkan dan akan menghapus prompt secara permanen dari sistem." + } + }, + "detail": { + "title": "Detail Strategi", + "loading": "Memuat detail...", + "returnRate": "Tingkat Pengembalian", + "strategyType": "Tipe Strategi", + "modelProvider": "Penyedia Model", + "modelId": "ID Model", + "initialCapital": "Modal Awal", + "maxLeverage": "Max Leverage", + "tradingSymbols": "Simbol Perdagangan", + "prompt": "Prompt" + }, + "history": { + "title": "Riwayat Perdagangan", + "live": "Perdagangan Langsung", + "virtual": "Perdagangan Virtual", + "cycle": "Siklus #{{index}}", + "aiReasoning": "Logika penalaran AI", + "operation": "Lakukan operasi", + "empty": { + "title": "Tidak ada riwayat perdagangan", + "desc": "Perdagangan Anda yang selesai akan muncul di sini" + }, + "details": { + "time": "Waktu", + "price": "Harga", + "quantity": "Jumlah", + "holdingTime": "Waktu tahan", + "tradingFee": "Biaya Perdagangan", + "reasoning": "Penalaran" + } + } + } + }, + "rank": { + "title": "Papan Peringkat Keuntungan", + "days": { + "7": "7H", + "30": "1B" + }, + "table": { + "rank": "Peringkat", + "user": "Pengguna", + "pnl": "P&L", + "strategy": "Strategi", + "exchange": "Bursa", + "model": "Model", + "details": "Detail", + "loading": "Memuat..." + } + }, + "home": { + "hello": "👋 Halo Investor!", + "welcome": "👋 Selamat datang di ValueCell!", + "watchlist": "Daftar Pantauan Saya", + "stock": { + "loading": "Memuat data saham...", + "error": "Kesalahan memuat data saham: {{message}}", + "remove": "Hapus", + "removing": "Menghapus...", + "add": "Tambah Saham", + "about": "Tentang", + "sector": "Sektor:", + "industry": "Industri:", + "website": "Situs Web:", + "chart": { + "24h": "24j", + "7d": "7h", + "30d": "30h" + } + }, + "search": { + "title": "Pencarian Saham", + "placeholder": "Cari nama atau kode saham", + "searching": "Mencari...", + "noResults": "Tidak ada saham terkait ditemukan", + "action": { + "watch": "Pantau", + "watching": "Memantau...", + "watched": "Dipantau" + } + }, + "suggestions": { + "research": { + "title": "Riset Mendalam", + "description": "Analisis pengajuan SEC untuk menghasilkan laporan interpretasi saham yang mendalam." + }, + "strategy": { + "title": "Perdagangan Otomatis", + "description": "Perdagangan cerdas multi-strategi, jalankan strategi Anda secara otomatis" + }, + "news": { + "title": "Berita Push", + "description": "Pembaruan berita yang dipersonalisasi pada jadwal khusus" + } + } + } +} diff --git a/frontend/public/locales/it-IT/translation.json b/frontend/public/locales/it-IT/translation.json new file mode 100644 index 000000000..c5a9ece9c --- /dev/null +++ b/frontend/public/locales/it-IT/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Generale", + "description": "Gestisci le tue preferenze e le impostazioni dell'applicazione", + "account": { + "title": "Account", + "signInDesc": "Accedi per iniziare con le funzionalità di Valuecell AI.", + "signOut": "Disconnettersi", + "signIn": "Accedi" + }, + "language": { + "title": "Lingua e Regione", + "description": "Seleziona la lingua preferita e il formato regionale per l'app." + }, + "quotesColor": { + "title": "Colore delle Quotazioni", + "description": "Scegli come visualizzare i movimenti delle quotazioni azionarie nell'app.", + "greenUpRedDown": "Verde Su / Rosso Giù", + "redUpGreenDown": "Rosso Su / Verde Giù" + }, + "updates": { + "title": "Aggiornamenti App", + "check": "Controlla aggiornamenti" + } + }, + "settings": { + "title": "Impostazioni", + "nav": { + "models": "Modelli", + "general": "Generale", + "memory": "Memoria" + }, + "models": { + "title": "Fornitore Modello", + "noProviders": "Nessun fornitore disponibile.", + "loading": "Caricamento dettagli fornitore...", + "defaultProvider": "Fornitore predefinito", + "apiKey": "Chiave API", + "enterApiKey": "Inserisci chiave API", + "getApiKey": "Clicca qui per ottenere la chiave API", + "apiHost": "Host API", + "models": "Modelli", + "add": "Aggiungi", + "addModel": "Aggiungi Modello", + "modelId": "ID Modello", + "enterModelId": "Inserisci ID modello", + "modelName": "Nome Modello", + "enterModelName": "Inserisci nome modello", + "cancel": "Annulla", + "confirm": "Conferma", + "noModels": "Nessun modello configurato per questo fornitore." + }, + "memory": { + "title": "Ricordi preservati", + "description": "Ricorderò e gestirò automaticamente informazioni utili nelle chat per migliorare la personalizzazione e la pertinenza delle risposte", + "loading": "Caricamento...", + "noMemories": "Ancora nessun ricordo", + "delete": "Elimina" + } + }, + "common": { + "back": "Indietro" + }, + "market": { + "title": "Mercato Agenti" + }, + "agent": { + "welcome": "Benvenuto in {{name}}!", + "unknown": "Agente Sconosciuto", + "status": { + "running": "In esecuzione" + }, + "action": { + "view": "Visualizza" + }, + "config": { + "disable": "Disabilita", + "chat": "Chat", + "collectAndChat": "Raccogli e chatta" + } + }, + "chat": { + "input": { + "placeholder": "Scrivi il tuo messaggio..." + }, + "newConversation": "Nuova Conversazione", + "settings": "Impostazioni", + "conversationList": { + "title": "Elenco Conversazioni", + "loading": "Caricamento...", + "empty": "Ancora nessuna conversazione" + }, + "action": { + "delete": "Elimina" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Strategia basata su Prompt", + "GridStrategy": "Strategia a Griglia" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Compatibile con OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Strategie di Trading", + "add": "Aggiungi strategia di trading", + "noStrategies": "Nessuna strategia di trading", + "createFirst": "Crea la tua prima strategia per iniziare a fare trading", + "status": { + "running": "In esecuzione", + "stopped": "Fermato", + "live": "Live", + "virtual": "Virtuale" + }, + "action": { + "stop": "Fermare la Strategia di Trading?", + "stopDesc": "Fermare la strategia \"{{name}}\" la fermerà immediatamente e attiverà una liquidazione forzata. Vuoi procedere?", + "confirmStop": "Conferma Stop", + "delete": "Elimina", + "deleteTitle": "Eliminare Strategia?", + "deleteDesc": "Eliminare la strategia \"{{name}}\" la fermerà immediatamente e attiverà una liquidazione forzata. Vuoi procedere?", + "confirmDelete": "Conferma Eliminazione", + "details": "Dettagli", + "duplicate": "Duplica", + "cancel": "Annulla", + "back": "Indietro", + "next": "Avanti", + "confirm": "Conferma", + "publish": "Pubblica", + "shareToSocial": "Condividi sui social", + "shareToRanking": "Condividi nella classifica" + }, + "portfolio": { + "title": "Storico Valore Portafoglio", + "totalEquity": "Patrimonio Totale", + "availableBalance": "Saldo Disponibile", + "totalPnl": "P&L Totale", + "noData": "Nessun dato valore portafoglio", + "noDataDesc": "Il grafico del valore del portafoglio apparirà una volta iniziato il trading" + }, + "positions": { + "title": "Posizioni", + "symbol": "Simbolo", + "type": "Tipo", + "leverage": "Leva", + "quantity": "Quantità", + "pnl": "P&L", + "noOpen": "Nessuna posizione aperta", + "noOpenDesc": "Le posizioni appariranno qui quando verranno aperti i trade" + }, + "create": { + "title": "Aggiungi strategia di trading", + "steps": { + "aiModels": "Modelli IA", + "exchanges": "Borse", + "tradingStrategy": "Strategia di trading" + }, + "error": "Errore creazione strategia" + }, + "form": { + "strategyType": { + "label": "Tipo Strategia", + "promptBased": "Strategia basata su Prompt", + "grid": "Strategia a Griglia" + }, + "strategyName": { + "label": "Nome Strategia", + "placeholder": "Inserisci nome strategia" + }, + "initialCapital": { + "label": "Capitale Iniziale", + "placeholder": "Inserisci Capitale Iniziale" + }, + "maxLeverage": { + "label": "Leva Massima", + "placeholder": "Leva Massima" + }, + "decideInterval": { + "label": "Intervallo Decisionale (secondi)", + "placeholder": "es: 300" + }, + "tradingSymbols": { + "label": "Simboli di Trading", + "placeholder": "Seleziona simboli di trading...", + "searchPlaceholder": "Cerca o aggiungi simboli...", + "emptyText": "Nessun simbolo trovato." + }, + "promptTemplate": { + "label": "Modello Prompt di Sistema", + "new": "Nuovo Prompt", + "view": "Vedi Strategia" + }, + "aiModels": { + "platform": "Piattaforma Modello", + "model": "Seleziona Modello", + "noModels": "Nessun modello disponibile", + "apiKey": { + "label": "Chiave API", + "placeholder": "Inserisci Chiave API" + } + }, + "exchanges": { + "transactionType": "Tipo Transazione", + "liveTrading": "Trading Live", + "virtualTrading": "Trading Virtuale", + "selectExchange": "Seleziona Borsa", + "walletAddress": "Indirizzo Wallet", + "privateKey": "Chiave Privata", + "apiKey": "Chiave API", + "secretKey": "Chiave Segreta", + "passphrase": "Passphrase", + "testConnection": "Test Connessione", + "test": { + "success": "Successo!", + "failed": "Connessione fallita. Controlla la tua Chiave API, Chiave Segreta o Passphrase." + }, + "placeholder": { + "binance": { + "apiKey": "Inserisci Chiave API (64 caratteri)", + "secretKey": "Inserisci Chiave Segreta (64 caratteri)" + }, + "okx": { + "apiKey": "Inserisci Chiave API (Formato: xxxxxxxx-xxxx-...)", + "secretKey": "Inserisci Chiave Segreta (32 lettere maiuscole e numeri)", + "passphrase": "Inserisci Passphrase (Impostata durante creazione API)" + }, + "gate": { + "apiKey": "Inserisci Chiave API (Inizia con 'key_')", + "secretKey": "Inserisci Chiave Segreta (64 caratteri)" + }, + "hyperliquid": { + "walletAddress": "Inserisci Indirizzo Wallet (Inizia con '0x')", + "privateKey": "Inserisci Chiave Privata (64 caratteri)" + }, + "blockchain": { + "apiKey": "Inserisci Chiave API (Formato: xxxxxxxx-xxxx-...)", + "secretKey": "Inserisci Chiave Segreta" + }, + "coinbase": { + "apiKey": "Inserisci Chiave API (o Nome Chiave)", + "secretKey": "Inserisci Segreto API (o Chiave Privata)", + "passphrase": "Inserisci Passphrase (Richiesto per Legacy Pro API)" + }, + "mexc": { + "apiKey": "Inserisci Chiave Accesso (Inizia con 'mx0')", + "secretKey": "Inserisci Chiave Segreta (Solitamente 32 caratteri)" + }, + "default": { + "apiKey": "Incolla qui la tua Chiave API", + "secretKey": "Incolla qui la tua Chiave Segreta", + "passphrase": "Inserisci Passphrase", + "walletAddress": "Inserisci Indirizzo Wallet", + "privateKey": "Inserisci Chiave Privata" + } + } + } + }, + "prompt": { + "delete": { + "title": "Elimina Prompt Strategia", + "description": "Sei sicuro di voler eliminare questo prompt di strategia? Questa azione non può essere annullata e rimuoverà permanentemente il prompt dal sistema." + } + }, + "detail": { + "title": "Dettagli Strategia", + "loading": "Caricamento dettagli...", + "returnRate": "Tasso di Ritorno", + "strategyType": "Tipo Strategia", + "modelProvider": "Fornitore Modello", + "modelId": "ID Modello", + "initialCapital": "Capitale Iniziale", + "maxLeverage": "Leva Massima", + "tradingSymbols": "Simboli di Trading", + "prompt": "Prompt" + }, + "history": { + "title": "Storico Trading", + "live": "Trading Live", + "virtual": "Trading Virtuale", + "cycle": "Ciclo #{{index}}", + "aiReasoning": "Logica ragionamento IA", + "operation": "Esegui operazione", + "empty": { + "title": "Nessun storico trade", + "desc": "I tuoi trade completati appariranno qui" + }, + "details": { + "time": "Ora", + "price": "Prezzo", + "quantity": "Quantità", + "holdingTime": "Tempo detenzione", + "tradingFee": "Commissione Trading", + "reasoning": "Ragionamento" + } + } + }, + "rank": { + "title": "Classifica Profitti", + "days": { + "7": "7G", + "30": "1M" + }, + "table": { + "rank": "Rango", + "user": "Utente", + "pnl": "P&L", + "strategy": "Strategia", + "exchange": "Borsa", + "model": "Modello", + "details": "Dettagli", + "loading": "Caricamento..." + } + }, + "home": { + "hello": "👋 Ciao Investitore!", + "welcome": "👋 Benvenuto in ValueCell!", + "watchlist": "La Mia Watchlist", + "stock": { + "loading": "Caricamento dati borsa...", + "error": "Errore caricamento dati borsa: {{message}}", + "remove": "Rimuovi", + "removing": "Rimozione...", + "add": "Aggiungi Azioni", + "about": "Info", + "sector": "Settore:", + "industry": "Industria:", + "website": "Sito Web:", + "chart": { + "24h": "24h", + "7d": "7g", + "30d": "30g" + } + }, + "search": { + "title": "Cerca Azioni", + "placeholder": "Cerca per nome azione o codice", + "searching": "Ricerca...", + "noResults": "Nessuna azione correlata trovata", + "action": { + "watch": "Segui", + "watching": "Seguendo...", + "watched": "Seguito" + } + }, + "suggestions": { + "research": { + "title": "Ricerca Approfondita", + "description": "Analizza i documenti SEC per generare report di interpretazione azionaria approfonditi." + }, + "strategy": { + "title": "Trading Automatizzato", + "description": "Trading intelligente multi-strategia, esegui automaticamente le tue strategie" + }, + "news": { + "title": "Notifiche Notizie", + "description": "Aggiornamenti notizie personalizzati su programma personalizzato" + } + } + } +} diff --git a/frontend/public/locales/ja-JP/translation.json b/frontend/public/locales/ja-JP/translation.json new file mode 100644 index 000000000..11d873996 --- /dev/null +++ b/frontend/public/locales/ja-JP/translation.json @@ -0,0 +1,374 @@ +{ + "general": { + "title": "一般", + "description": "設定とアプリケーションの管理", + "account": { + "title": "アカウント", + "signInDesc": "Valuecell AI 機能を開始するにはサインインしてください。", + "signOut": "サインアウト", + "signIn": "サインイン" + }, + "language": { + "title": "言語と地域", + "description": "アプリの言語と地域形式を選択してください。", + "options": { + "en-US": "English (United States)", + "en-GB": "English (United Kingdom)", + "zh-Hans": "简体中文", + "zh-Hant": "繁體中文", + "ja-JP": "日本語" + } + }, + "quotesColor": { + "title": "チャートの配色", + "description": "株価の変動を視覚化する方法を選択してください。", + "greenUpRedDown": "緑上昇 / 赤下落", + "redUpGreenDown": "赤上昇 / 緑下落" + }, + "updates": { + "title": "アプリアップデート", + "check": "アップデートを確認" + } + }, + "settings": { + "title": "設定", + "nav": { + "models": "モデル", + "general": "一般", + "memory": "メモリ" + }, + "models": { + "title": "モデルプロバイダー", + "noProviders": "利用可能なプロバイダーはありません。", + "loading": "プロバイダー詳細を読み込み中...", + "defaultProvider": "デフォルトプロバイダー", + "apiKey": "API キー", + "enterApiKey": "API キーを入力", + "getApiKey": "ここをクリックして API キーを取得", + "apiHost": "API ホスト", + "models": "モデル", + "add": "追加", + "addModel": "モデルを追加", + "modelId": "モデル ID", + "enterModelId": "モデル ID を入力", + "modelName": "モデル名", + "enterModelName": "モデル名を入力", + "cancel": "キャンセル", + "confirm": "確認", + "noModels": "このプロバイダーにはモデルが設定されていません。" + }, + "memory": { + "title": "保存されたメモリ", + "description": "チャット内の有用な情報を記憶・自動管理し、返信のパーソナライズと関連性を向上させます", + "loading": "読み込み中...", + "noMemories": "メモリはまだありません", + "delete": "削除" + } + }, + "common": { + "back": "戻る" + }, + "market": { + "title": "Agent マーケット" + }, + "agent": { + "welcome": "{{name}} へようこそ!", + "unknown": "不明なエージェント", + "status": { + "running": "実行中" + }, + "action": { + "view": "表示" + }, + "config": { + "disable": "無効にする", + "chat": "チャット", + "collectAndChat": "収集してチャット" + } + }, + "chat": { + "input": { + "placeholder": "メッセージを入力..." + }, + "newConversation": "新しい会話", + "settings": "設定", + "conversationList": { + "title": "会話リスト", + "loading": "読み込み中...", + "empty": "会話はまだありません" + }, + "action": { + "delete": "削除" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "プロンプトベース戦略", + "GridStrategy": "グリッド戦略" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI 互換 API", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "取引戦略", + "add": "取引戦略を追加", + "noStrategies": "取引戦略はありません", + "createFirst": "最初の戦略を作成して取引を開始しましょう", + "status": { + "running": "実行中", + "stopped": "停止", + "live": "ライブ", + "virtual": "バーチャル" + }, + "action": { + "stop": "取引戦略を停止しますか?", + "stopDesc": "戦略「{{name}}」を停止すると、即座に停止し、強制決済がトリガーされます。続行しますか?", + "confirmStop": "停止を確認", + "delete": "削除", + "deleteTitle": "戦略を削除しますか?", + "deleteDesc": "戦略「{{name}}」を削除すると、即座に停止し、強制決済がトリガーされます。続行しますか?", + "confirmDelete": "削除を確認", + "details": "詳細", + "duplicate": "複製", + "cancel": "キャンセル", + "back": "戻る", + "next": "次へ", + "confirm": "確認", + "publish": "公開", + "shareToSocial": "SNSでシェア", + "shareToRanking": "ランキングでシェア" + }, + "portfolio": { + "title": "ポートフォリオ価値履歴", + "totalEquity": "総資本", + "availableBalance": "利用可能残高", + "totalPnl": "総損益", + "noData": "ポートフォリオ価値データなし", + "noDataDesc": "取引が開始されるとポートフォリオ価値チャートが表示されます" + }, + "positions": { + "title": "ポジション", + "symbol": "銘柄", + "type": "売買", + "leverage": "レバレッジ", + "quantity": "数量", + "pnl": "損益", + "noOpen": "保有ポジションなし", + "noOpenDesc": "注文が約定すると、ここにポジションが表示されます" + }, + "create": { + "title": "取引戦略を追加", + "steps": { + "aiModels": "AIモデル", + "exchanges": "取引所", + "tradingStrategy": "取引戦略" + }, + "error": "戦略作成エラー" + }, + "form": { + "strategyType": { + "label": "戦略タイプ", + "promptBased": "プロンプトベース戦略", + "grid": "グリッド戦略" + }, + "strategyName": { + "label": "戦略名", + "placeholder": "戦略名を入力" + }, + "initialCapital": { + "label": "初期資本", + "placeholder": "初期資本を入力" + }, + "maxLeverage": { + "label": "最大レバレッジ", + "placeholder": "最大レバレッジ" + }, + "decideInterval": { + "label": "決定間隔 (秒)", + "placeholder": "例: 300" + }, + "tradingSymbols": { + "label": "取引ペア", + "placeholder": "取引ペアを選択...", + "searchPlaceholder": "取引ペアを検索または追加...", + "emptyText": "取引ペアが見つかりません。" + }, + "promptTemplate": { + "label": "システムプロンプトテンプレート", + "new": "新規プロンプト", + "view": "戦略を表示" + }, + "aiModels": { + "platform": "モデルプラットフォーム", + "model": "モデルを選択", + "noModels": "利用可能なモデルがありません", + "apiKey": { + "label": "APIキー", + "placeholder": "APIキーを入力" + } + }, + "exchanges": { + "transactionType": "取引タイプ", + "liveTrading": "ライブ取引", + "virtualTrading": "バーチャル取引", + "selectExchange": "取引所を選択", + "walletAddress": "ウォレットアドレス", + "privateKey": "秘密鍵", + "apiKey": "APIキー", + "secretKey": "シークレットキー", + "passphrase": "パスフレーズ", + "testConnection": "接続テスト", + "test": { + "success": "接続成功!", + "failed": "接続に失敗しました。APIキー、シークレットキー、またはパスフレーズを確認してください。" + }, + "placeholder": { + "binance": { + "apiKey": "APIキーを入力 (64文字)", + "secretKey": "シークレットキーを入力 (64文字)" + }, + "okx": { + "apiKey": "APIキーを入力 (形式: xxxxxxxx-xxxx-...)", + "secretKey": "シークレットキーを入力 (32文字の大文字と数字)", + "passphrase": "パスフレーズを入力 (API作成時に設定)" + }, + "gate": { + "apiKey": "APIキーを入力 ('key_'で始まる)", + "secretKey": "シークレットキーを入力 (64文字)" + }, + "hyperliquid": { + "walletAddress": "ウォレットアドレスを入力 ('0x'で始まる)", + "privateKey": "秘密鍵を入力 (64文字)" + }, + "blockchain": { + "apiKey": "APIキーを入力 (形式: xxxxxxxx-xxxx-...)", + "secretKey": "シークレットキーを入力" + }, + "coinbase": { + "apiKey": "APIキーを入力 (またはキー名)", + "secretKey": "APIシークレットを入力 (または秘密鍵)", + "passphrase": "パスフレーズを入力 (Legacy Pro APIに必要)" + }, + "mexc": { + "apiKey": "アクセスキーを入力 ('mx0'で始まる)", + "secretKey": "シークレットキーを入力 (通常32文字)" + }, + "default": { + "apiKey": "ここにAPIキーを貼り付け", + "secretKey": "ここにシークレットキーを貼り付け", + "passphrase": "パスフレーズを入力", + "walletAddress": "ウォレットアドレスを入力", + "privateKey": "秘密鍵を入力" + } + } + } + }, + "prompt": { + "delete": { + "title": "戦略プロンプトを削除", + "description": "この戦略プロンプトを削除してもよろしいですか?この操作は取り消せず、システムからプロンプトが完全に削除されます。" + } + }, + "detail": { + "title": "戦略詳細", + "loading": "詳細を読み込み中...", + "returnRate": "収益率", + "strategyType": "戦略タイプ", + "modelProvider": "モデルプロバイダー", + "modelId": "モデルID", + "initialCapital": "初期資本", + "maxLeverage": "最大レバレッジ", + "tradingSymbols": "取引ペア", + "prompt": "プロンプト" + }, + "history": { + "title": "取引履歴", + "live": "ライブ取引", + "virtual": "バーチャル取引", + "cycle": "サイクル #{{index}}", + "aiReasoning": "AI推論ロジック", + "operation": "操作を実行", + "empty": { + "title": "取引履歴がありません", + "desc": "完了した取引はここに表示されます" + }, + "details": { + "time": "時間", + "price": "価格", + "quantity": "数量", + "holdingTime": "保有時間", + "tradingFee": "取引手数料", + "reasoning": "推論" + } + } + }, + "rank": { + "title": "収益ランキング", + "days": { + "7": "7日", + "30": "1ヶ月" + }, + "table": { + "rank": "順位", + "user": "ユーザー", + "pnl": "損益", + "strategy": "戦略", + "exchange": "取引所", + "model": "モデル", + "details": "詳細", + "loading": "読み込み中..." + } + }, + "home": { + "hello": "👋 こんにちは、投資家さん!", + "welcome": "👋 ValueCell へようこそ !", + "watchlist": "ウォッチリスト", + "stock": { + "loading": "株価データを読み込み中...", + "error": "株価データの読み込みに失敗しました: {{message}}", + "remove": "削除", + "removing": "削除中...", + "add": "銘柄を追加", + "about": "概要", + "sector": "セクター:", + "industry": "業界:", + "website": "ウェブサイト:", + "chart": { + "24h": "24時間", + "7d": "7日", + "30d": "30日" + } + }, + "search": { + "title": "株式検索", + "placeholder": "銘柄名またはコードで検索", + "searching": "検索中...", + "noResults": "関連する銘柄が見つかりません", + "action": { + "watch": "ウォッチ", + "watching": "追加中...", + "watched": "ウォッチ済み" + } + }, + "suggestions": { + "research": { + "title": "深層調査", + "description": "SEC提出書類を分析し、詳細な株式解釈レポートを作成します。" + }, + "strategy": { + "title": "自動取引", + "description": "マルチ戦略スマート取引、戦略を自動実行" + }, + "news": { + "title": "ニュースプッシュ", + "description": "カスタムスケジュールでパーソナライズされたニュース更新をプッシュ" + } + } + } +} diff --git a/frontend/public/locales/ko-KR/translation.json b/frontend/public/locales/ko-KR/translation.json new file mode 100644 index 000000000..46354b67a --- /dev/null +++ b/frontend/public/locales/ko-KR/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "일반", + "description": "기본 설정 및 애플리케이션 설정을 관리하세요", + "account": { + "title": "계정", + "signInDesc": "Valuecell AI 기능을 사용하려면 로그인하세요.", + "signOut": "로그아웃", + "signIn": "로그인" + }, + "language": { + "title": "언어 및 지역", + "description": "앱의 선호 언어 및 지역 형식을 선택하세요." + }, + "quotesColor": { + "title": "시세 색상", + "description": "앱 전체에서 주가 변동을 시각화하는 방법을 선택하세요.", + "greenUpRedDown": "녹색 상승 / 적색 하락", + "redUpGreenDown": "적색 상승 / 녹색 하락" + }, + "updates": { + "title": "앱 업데이트", + "check": "업데이트 확인" + } + }, + "settings": { + "title": "설정", + "nav": { + "models": "모델", + "general": "일반", + "memory": "메모리" + }, + "models": { + "title": "모델 제공자", + "noProviders": "사용 가능한 제공자가 없습니다.", + "loading": "제공자 세부 정보를 로드하는 중...", + "defaultProvider": "기본 제공자", + "apiKey": "API 키", + "enterApiKey": "API 키 입력", + "getApiKey": "API 키를 받으려면 여기를 클릭하세요", + "apiHost": "API 호스트", + "models": "모델", + "add": "추가", + "addModel": "모델 추가", + "modelId": "모델 ID", + "enterModelId": "모델 ID 입력", + "modelName": "모델 이름", + "enterModelName": "모델 이름 입력", + "cancel": "취소", + "confirm": "확인", + "noModels": "이 제공자에 대해 구성된 모델이 없습니다." + }, + "memory": { + "title": "보존된 기억", + "description": "대화 중 유용한 정보를 기억하고 자동으로 관리하여 답변의 개인화 및 관련성을 높입니다.", + "loading": "로드 중...", + "noMemories": "아직 기억이 없습니다", + "delete": "삭제" + } + }, + "common": { + "back": "뒤로" + }, + "market": { + "title": "에이전트 마켓" + }, + "agent": { + "welcome": "{{name}}에 오신 것을 환영합니다!", + "unknown": "알 수 없는 에이전트", + "status": { + "running": "실행 중" + }, + "action": { + "view": "보기" + }, + "config": { + "disable": "비활성화", + "chat": "채팅", + "collectAndChat": "수집 및 채팅" + } + }, + "chat": { + "input": { + "placeholder": "메시지를 입력하세요..." + }, + "newConversation": "새 대화", + "settings": "설정", + "conversationList": { + "title": "대화 목록", + "loading": "로드 중...", + "empty": "아직 대화가 없습니다" + }, + "action": { + "delete": "삭제" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "프롬프트 기반 전략", + "GridStrategy": "그리드 전략" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI 호환", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "트레이딩 전략", + "add": "트레이딩 전략 추가", + "noStrategies": "트레이딩 전략 없음", + "createFirst": "첫 번째 전략을 생성하여 트레이딩을 시작하세요", + "status": { + "running": "실행 중", + "stopped": "중지됨", + "live": "라이브", + "virtual": "가상" + }, + "action": { + "stop": "트레이딩 전략을 중지하시겠습니까?", + "stopDesc": "\"{{name}}\" 전략을 중지하면 즉시 중단되고 강제 청산이 트리거됩니다. 계속하시겠습니까?", + "confirmStop": "중지 확인", + "delete": "삭제", + "deleteTitle": "전략 삭제?", + "deleteDesc": "\"{{name}}\" 전략을 삭제하면 즉시 중단되고 강제 청산이 트리거됩니다. 계속하시겠습니까?", + "confirmDelete": "삭제 확인", + "details": "세부 정보", + "duplicate": "복제", + "cancel": "취소", + "back": "뒤로", + "next": "다음", + "confirm": "확인", + "publish": "게시", + "shareToSocial": "소셜에 공유", + "shareToRanking": "랭킹에 공유" + }, + "portfolio": { + "title": "포트폴리오 가치 기록", + "totalEquity": "총 자본", + "availableBalance": "사용 가능한 잔액", + "totalPnl": "총 P&L", + "noData": "포트폴리오 가치 데이터 없음", + "noDataDesc": "트레이딩이 시작되면 포트폴리오 가치 차트가 나타납니다" + }, + "positions": { + "title": "포지션", + "symbol": "심볼", + "type": "유형", + "leverage": "레버리지", + "quantity": "수량", + "pnl": "P&L", + "noOpen": "열린 포지션 없음", + "noOpenDesc": "거래가 열리면 포지션이 여기에 나타납니다" + }, + "create": { + "title": "트레이딩 전략 추가", + "steps": { + "aiModels": "AI 모델", + "exchanges": "거래소", + "tradingStrategy": "트레이딩 전략" + }, + "error": "전략 생성 오류" + }, + "form": { + "strategyType": { + "label": "전략 유형", + "promptBased": "프롬프트 기반 전략", + "grid": "그리드 전략" + }, + "strategyName": { + "label": "전략 이름", + "placeholder": "전략 이름 입력" + }, + "initialCapital": { + "label": "초기 자본", + "placeholder": "초기 자본 입력" + }, + "maxLeverage": { + "label": "최대 레버리지", + "placeholder": "최대 레버리지" + }, + "decideInterval": { + "label": "결정 간격 (초)", + "placeholder": "예: 300" + }, + "tradingSymbols": { + "label": "트레이딩 심볼", + "placeholder": "트레이딩 심볼 선택...", + "searchPlaceholder": "심볼 검색 또는 추가...", + "emptyText": "심볼을 찾을 수 없습니다." + }, + "promptTemplate": { + "label": "시스템 프롬프트 템플릿", + "new": "새 프롬프트", + "view": "전략 보기" + }, + "aiModels": { + "platform": "모델 플랫폼", + "model": "모델 선택", + "noModels": "사용 가능한 모델 없음", + "apiKey": { + "label": "API 키", + "placeholder": "API 키 입력" + } + }, + "exchanges": { + "transactionType": "거래 유형", + "liveTrading": "라이브 트레이딩", + "virtualTrading": "가상 트레이딩", + "selectExchange": "거래소 선택", + "walletAddress": "지갑 주소", + "privateKey": "개인 키", + "apiKey": "API 키", + "secretKey": "비밀 키", + "passphrase": "암호", + "testConnection": "연결 테스트", + "test": { + "success": "성공!", + "failed": "연결 실패. API 키, 비밀 키 또는 암호를 확인하세요." + }, + "placeholder": { + "binance": { + "apiKey": "API 키 입력 (64자)", + "secretKey": "비밀 키 입력 (64자)" + }, + "okx": { + "apiKey": "API 키 입력 (형식: xxxxxxxx-xxxx-...)", + "secretKey": "비밀 키 입력 (32자 대문자 및 숫자)", + "passphrase": "암호 입력 (API 생성 시 설정)" + }, + "gate": { + "apiKey": "API 키 입력 ('key_'로 시작)", + "secretKey": "비밀 키 입력 (64자)" + }, + "hyperliquid": { + "walletAddress": "지갑 주소 입력 ('0x'로 시작)", + "privateKey": "개인 키 입력 (64자)" + }, + "blockchain": { + "apiKey": "API 키 입력 (형식: xxxxxxxx-xxxx-...)", + "secretKey": "비밀 키 입력" + }, + "coinbase": { + "apiKey": "API 키 입력 (또는 키 이름)", + "secretKey": "API 비밀 입력 (또는 개인 키)", + "passphrase": "암호 입력 (레거시 Pro API에 필수)" + }, + "mexc": { + "apiKey": "액세스 키 입력 ('mx0'으로 시작)", + "secretKey": "비밀 키 입력 (일반적으로 32자)" + }, + "default": { + "apiKey": "여기에 API 키 붙여넣기", + "secretKey": "여기에 비밀 키 붙여넣기", + "passphrase": "암호 입력", + "walletAddress": "지갑 주소 입력", + "privateKey": "개인 키 입력" + } + } + }, + "prompt": { + "delete": { + "title": "전략 프롬프트 삭제", + "description": "이 전략 프롬프트를 삭제하시겠습니까? 이 작업은 취소할 수 없으며 시스템에서 프롬프트가 영구적으로 제거됩니다." + } + }, + "detail": { + "title": "전략 세부 정보", + "loading": "세부 정보 로드 중...", + "returnRate": "수익률", + "strategyType": "전략 유형", + "modelProvider": "모델 제공자", + "modelId": "모델 ID", + "initialCapital": "초기 자본", + "maxLeverage": "최대 레버리지", + "tradingSymbols": "트레이딩 심볼", + "prompt": "프롬프트" + }, + "history": { + "title": "트레이딩 기록", + "live": "라이브 트레이딩", + "virtual": "가상 트레이딩", + "cycle": "주기 #{{index}}", + "aiReasoning": "AI 추론 논리", + "operation": "작업 수행", + "empty": { + "title": "트레이딩 기록 없음", + "desc": "완료된 거래가 여기에 나타납니다" + }, + "details": { + "time": "시간", + "price": "가격", + "quantity": "수량", + "holdingTime": "보유 시간", + "tradingFee": "거래 수수료", + "reasoning": "추론" + } + } + } + }, + "rank": { + "title": "수익 순위표", + "days": { + "7": "7일", + "30": "1개월" + }, + "table": { + "rank": "순위", + "user": "사용자", + "pnl": "P&L", + "strategy": "전략", + "exchange": "거래소", + "model": "모델", + "details": "세부 정보", + "loading": "로드 중..." + } + }, + "home": { + "hello": "👋 안녕하세요 투자자님!", + "welcome": "👋 ValueCell에 오신 것을 환영합니다!", + "watchlist": "내 관심 목록", + "stock": { + "loading": "주식 데이터 로드 중...", + "error": "주식 데이터 로드 오류: {{message}}", + "remove": "제거", + "removing": "제거 중...", + "add": "주식 추가", + "about": "정보", + "sector": "섹터:", + "industry": "산업:", + "website": "웹사이트:", + "chart": { + "24h": "24시간", + "7d": "7일", + "30d": "30일" + } + }, + "search": { + "title": "주식 검색", + "placeholder": "주식 이름 또는 코드 검색", + "searching": "검색 중...", + "noResults": "관련 주식을 찾을 수 없습니다", + "action": { + "watch": "관심", + "watching": "관심 등록 중...", + "watched": "관심 등록됨" + } + }, + "suggestions": { + "research": { + "title": "심층 연구", + "description": "SEC 제출 서류를 분석하여 심층적인 주식 해석 보고서를 생성합니다." + }, + "strategy": { + "title": "자동 트레이딩", + "description": "다중 전략 스마트 트레이딩, 전략을 자동으로 실행합니다" + }, + "news": { + "title": "뉴스 푸시", + "description": "사용자 지정 일정에 따른 개인화된 뉴스 업데이트" + } + } + } +} diff --git a/frontend/public/locales/ms-MY/translation.json b/frontend/public/locales/ms-MY/translation.json new file mode 100644 index 000000000..2a6cb13ab --- /dev/null +++ b/frontend/public/locales/ms-MY/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Umum", + "description": "Urus pilihan dan tetapan aplikasi anda", + "account": { + "title": "Akaun", + "signInDesc": "Log masuk untuk mula menggunakan ciri Valuecell AI.", + "signOut": "Log Keluar", + "signIn": "Log Masuk" + }, + "language": { + "title": "Bahasa dan Wilayah", + "description": "Pilih bahasa pilihan dan format wilayah anda untuk aplikasi." + }, + "quotesColor": { + "title": "Warna Petikan", + "description": "Pilih cara pergerakan harga saham divisualisasikan di seluruh aplikasi.", + "greenUpRedDown": "Hijau Naik / Merah Turun", + "redUpGreenDown": "Merah Naik / Hijau Turun" + }, + "updates": { + "title": "Kemas Kini Apl", + "check": "Semak Kemas Kini" + } + }, + "settings": { + "title": "Tetapan", + "nav": { + "models": "Model", + "general": "Umum", + "memory": "Memori" + }, + "models": { + "title": "Penyedia Model", + "noProviders": "Tiada penyedia tersedia.", + "loading": "Memuatkan butiran penyedia...", + "defaultProvider": "Penyedia Lalai", + "apiKey": "Kunci API", + "enterApiKey": "Masukkan kunci API", + "getApiKey": "Klik di sini untuk mendapatkan kunci API", + "apiHost": "Hos API", + "models": "Model", + "add": "Tambah", + "addModel": "Tambah Model", + "modelId": "ID Model", + "enterModelId": "Masukkan ID model", + "modelName": "Nama Model", + "enterModelName": "Masukkan nama model", + "cancel": "Batal", + "confirm": "Sahkan", + "noModels": "Tiada model dikonfigurasi untuk penyedia ini." + }, + "memory": { + "title": "Memori tersimpan", + "description": "Saya akan ingat dan mengurus maklumat berguna secara automatik dalam sembang untuk meningkatkan pemperibadian dan kaitan balasan", + "loading": "Memuatkan...", + "noMemories": "Tiada memori lagi", + "delete": "Padam" + } + }, + "common": { + "back": "Kembali" + }, + "market": { + "title": "Pasaran Ejen" + }, + "agent": { + "welcome": "Selamat datang ke {{name}}!", + "unknown": "Ejen Tidak Diketahui", + "status": { + "running": "Sedang Berjalan" + }, + "action": { + "view": "Lihat" + }, + "config": { + "disable": "Lumpuhkan", + "chat": "Sembang", + "collectAndChat": "Kumpul dan sembang" + } + }, + "chat": { + "input": { + "placeholder": "Taip mesej anda..." + }, + "newConversation": "Perbualan Baru", + "settings": "Tetapan", + "conversationList": { + "title": "Senarai Perbualan", + "loading": "Memuatkan...", + "empty": "Tiada perbualan lagi" + }, + "action": { + "delete": "Padam" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Strategi Berasaskan Prompt", + "GridStrategy": "Strategi Grid" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Serasi OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Strategi Dagangan", + "add": "Tambah strategi dagangan", + "noStrategies": "Tiada strategi dagangan", + "createFirst": "Cipta strategi pertama anda untuk mula berdagang", + "status": { + "running": "Sedang Berjalan", + "stopped": "Berhenti", + "live": "Langsung", + "virtual": "Maya" + }, + "action": { + "stop": "Hentikan Strategi Dagangan?", + "stopDesc": "Menghentikan strategi \"{{name}}\" akan menghentikannya serta-merta dan mencetuskan pencairan paksa. Adakah anda mahu meneruskan?", + "confirmStop": "Sahkan Berhenti", + "delete": "Padam", + "deleteTitle": "Padam Strategi?", + "deleteDesc": "Memadamkan strategi \"{{name}}\" akan menghentikannya serta-merta dan mencetuskan pencairan paksa. Adakah anda mahu meneruskan?", + "confirmDelete": "Sahkan Padam", + "details": "Butiran", + "duplicate": "Duplikasi", + "cancel": "Batal", + "back": "Kembali", + "next": "Seterusnya", + "confirm": "Sahkan", + "publish": "Terbitkan", + "shareToSocial": "Kongsi ke Sosial", + "shareToRanking": "Kongsi ke Peringkat" + }, + "portfolio": { + "title": "Sejarah Nilai Portfolio", + "totalEquity": "Jumlah Ekuiti", + "availableBalance": "Baki Tersedia", + "totalPnl": "Jumlah P&L", + "noData": "Tiada data nilai portfolio", + "noDataDesc": "Carta nilai portfolio akan muncul sebaik sahaja dagangan bermula" + }, + "positions": { + "title": "Posisi", + "symbol": "Simbol", + "type": "Jenis", + "leverage": "Leveraj", + "quantity": "Kuantiti", + "pnl": "P&L", + "noOpen": "Tiada posisi terbuka", + "noOpenDesc": "Posisi akan muncul di sini apabila dagangan dibuka" + }, + "create": { + "title": "Tambah strategi dagangan", + "steps": { + "aiModels": "Model AI", + "exchanges": "Bursa", + "tradingStrategy": "Strategi dagangan" + }, + "error": "Ralat Mencipta Strategi" + }, + "form": { + "strategyType": { + "label": "Jenis Strategi", + "promptBased": "Strategi Berasaskan Prompt", + "grid": "Strategi Grid" + }, + "strategyName": { + "label": "Nama Strategi", + "placeholder": "Masukkan nama strategi" + }, + "initialCapital": { + "label": "Modal Permulaan", + "placeholder": "Masukkan Modal Permulaan" + }, + "maxLeverage": { + "label": "Leveraj Maksimum", + "placeholder": "Leveraj Maksimum" + }, + "decideInterval": { + "label": "Selang Keputusan (saat)", + "placeholder": "cth. 300" + }, + "tradingSymbols": { + "label": "Simbol Dagangan", + "placeholder": "Pilih simbol dagangan...", + "searchPlaceholder": "Cari atau tambah simbol...", + "emptyText": "Tiada simbol ditemui." + }, + "promptTemplate": { + "label": "Templat Prompt Sistem", + "new": "Prompt Baru", + "view": "Lihat Strategi" + }, + "aiModels": { + "platform": "Platform Model", + "model": "Pilih Model", + "noModels": "Tiada model tersedia", + "apiKey": { + "label": "Kunci API", + "placeholder": "Masukkan Kunci API" + } + }, + "exchanges": { + "transactionType": "Jenis Transaksi", + "liveTrading": "Dagangan Langsung", + "virtualTrading": "Dagangan Maya", + "selectExchange": "Pilih Bursa", + "walletAddress": "Alamat Dompet", + "privateKey": "Kunci Peribadi", + "apiKey": "Kunci API", + "secretKey": "Kunci Rahsia", + "passphrase": "Frasa Laluan", + "testConnection": "Uji Sambungan", + "test": { + "success": "Berjaya!", + "failed": "Sambungan gagal. Sila semak Kunci API, Kunci Rahasia, atau Frasa Laluan anda." + }, + "placeholder": { + "binance": { + "apiKey": "Masukkan Kunci API (64 aksara)", + "secretKey": "Masukkan Kunci Rahasia (64 aksara)" + }, + "okx": { + "apiKey": "Masukkan Kunci API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Masukkan Kunci Rahasia (32 huruf besar & nombor)", + "passphrase": "Masukkan Frasa Laluan (Ditetapkan semasa penciptaan API)" + }, + "gate": { + "apiKey": "Masukkan Kunci API (Bermula dengan 'key_')", + "secretKey": "Masukkan Kunci Rahasia (64 aksara)" + }, + "hyperliquid": { + "walletAddress": "Masukkan Alamat Dompet (Bermula dengan '0x')", + "privateKey": "Masukkan Kunci Peribadi (64 aksara)" + }, + "blockchain": { + "apiKey": "Masukkan Kunci API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Masukkan Kunci Rahasia" + }, + "coinbase": { + "apiKey": "Masukkan Kunci API (atau Nama Kunci)", + "secretKey": "Masukkan Rahsia API (atau Kunci Peribadi)", + "passphrase": "Masukkan Frasa Laluan (Diperlukan untuk API Pro Legacy)" + }, + "mexc": { + "apiKey": "Masukkan Kunci Akses (Bermula dengan 'mx0')", + "secretKey": "Masukkan Kunci Rahasia (Biasanya 32 aksara)" + }, + "default": { + "apiKey": "Tampal Kunci API anda di sini", + "secretKey": "Tampal Kunci Rahasia anda di sini", + "passphrase": "Masukkan Frasa Laluan", + "walletAddress": "Masukkan Alamat Dompet", + "privateKey": "Masukkan Kunci Peribadi" + } + } + }, + "prompt": { + "delete": { + "title": "Padam Prompt Strategi", + "description": "Adakah anda pasti mahu memadamkan prompt strategi ini? Tindakan ini tidak boleh dibuat asal dan akan mengalih keluar prompt secara kekal daripada sistem." + } + }, + "detail": { + "title": "Butiran Strategi", + "loading": "Memuatkan butiran...", + "returnRate": "Kadar Pulangan", + "strategyType": "Jenis Strategi", + "modelProvider": "Penyedia Model", + "modelId": "ID Model", + "initialCapital": "Modal Permulaan", + "maxLeverage": "Leveraj Maksimum", + "tradingSymbols": "Simbol Dagangan", + "prompt": "Prompt" + }, + "history": { + "title": "Sejarah Dagangan", + "live": "Dagangan Langsung", + "virtual": "Dagangan Maya", + "cycle": "Kitaran #{{index}}", + "aiReasoning": "Logik penaakulan AI", + "operation": "Lakukan operasi", + "empty": { + "title": "Tiada sejarah dagangan", + "desc": "Dagangan anda yang selesai akan muncul di sini" + }, + "details": { + "time": "Masa", + "price": "Harga", + "quantity": "Kuantiti", + "holdingTime": "Masa pegangan", + "tradingFee": "Yuran Dagangan", + "reasoning": "Penaakulan" + } + } + } + }, + "rank": { + "title": "Papan Pendahulu Keuntungan", + "days": { + "7": "7H", + "30": "1B" + }, + "table": { + "rank": "Kedudukan", + "user": "Pengguna", + "pnl": "P&L", + "strategy": "Strategi", + "exchange": "Bursa", + "model": "Model", + "details": "Butiran", + "loading": "Memuatkan..." + } + }, + "home": { + "hello": "👋 Hello Pelabur!", + "welcome": "👋 Selamat datang ke ValueCell!", + "watchlist": "Senarai Pantau Saya", + "stock": { + "loading": "Memuatkan data saham...", + "error": "Ralat memuatkan data saham: {{message}}", + "remove": "Alih Keluar", + "removing": "Mengalih keluar...", + "add": "Tambah Saham", + "about": "Tentang", + "sector": "Sektor:", + "industry": "Industri:", + "website": "Laman Web:", + "chart": { + "24h": "24j", + "7d": "7h", + "30d": "30h" + } + }, + "search": { + "title": "Carian Saham", + "placeholder": "Cari nama atau kod saham", + "searching": "Mencari...", + "noResults": "Tiada saham berkaitan ditemui", + "action": { + "watch": "Pantau", + "watching": "Memantau...", + "watched": "Dipantau" + } + }, + "suggestions": { + "research": { + "title": "Penyelidikan Mendalam", + "description": "Analisis pemfailan SEC untuk menjana laporan tafsiran saham yang mendalam." + }, + "strategy": { + "title": "Dagangan Automatik", + "description": "Dagangan pintar berbilang strategi, laksanakan strategi anda secara automatik" + }, + "news": { + "title": "Berita Push", + "description": "Kemas kini berita yang diperibadikan pada jadual tersuai" + } + } + } +} diff --git a/frontend/public/locales/pl-PL/translation.json b/frontend/public/locales/pl-PL/translation.json new file mode 100644 index 000000000..ea73dea31 --- /dev/null +++ b/frontend/public/locales/pl-PL/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Ogólne", + "description": "Zarządzaj swoimi preferencjami i ustawieniami aplikacji", + "account": { + "title": "Konto", + "signInDesc": "Zaloguj się, aby rozpocząć korzystanie z funkcji Valuecell AI.", + "signOut": "Wyloguj się", + "signIn": "Zaloguj się" + }, + "language": { + "title": "Język i Region", + "description": "Wybierz preferowany język i format regionalny dla aplikacji." + }, + "quotesColor": { + "title": "Kolor Notowań", + "description": "Wybierz sposób wizualizacji ruchów notowań giełdowych w aplikacji.", + "greenUpRedDown": "Zielony Wzrost / Czerwony Spadek", + "redUpGreenDown": "Czerwony Wzrost / Zielony Spadek" + }, + "updates": { + "title": "Aktualizacje Aplikacji", + "check": "Sprawdź aktualizacje" + } + }, + "settings": { + "title": "Ustawienia", + "nav": { + "models": "Modele", + "general": "Ogólne", + "memory": "Pamięć" + }, + "models": { + "title": "Dostawca Modelu", + "noProviders": "Brak dostępnych dostawców.", + "loading": "Ładowanie szczegółów dostawcy...", + "defaultProvider": "Domyślny Dostawca", + "apiKey": "Klucz API", + "enterApiKey": "Wprowadź klucz API", + "getApiKey": "Kliknij tutaj, aby uzyskać klucz API", + "apiHost": "Host API", + "models": "Modele", + "add": "Dodaj", + "addModel": "Dodaj Model", + "modelId": "ID Modelu", + "enterModelId": "Wprowadź ID modelu", + "modelName": "Nazwa Modelu", + "enterModelName": "Wprowadź nazwę modelu", + "cancel": "Anuluj", + "confirm": "Potwierdź", + "noModels": "Brak skonfigurowanych modeli dla tego dostawcy." + }, + "memory": { + "title": "Zachowane wspomnienia", + "description": "Będę zapamiętywać i automatycznie zarządzać przydatnymi informacjami w czatach, aby poprawić personalizację i trafność odpowiedzi", + "loading": "Ładowanie...", + "noMemories": "Brak wspomnień", + "delete": "Usuń" + } + }, + "common": { + "back": "Wstecz" + }, + "market": { + "title": "Rynek Agentów" + }, + "agent": { + "welcome": "Witaj w {{name}}!", + "unknown": "Nieznany Agent", + "status": { + "running": "Uruchomiony" + }, + "action": { + "view": "Zobacz" + }, + "config": { + "disable": "Wyłącz", + "chat": "Czat", + "collectAndChat": "Zbieraj i czatuj" + } + }, + "chat": { + "input": { + "placeholder": "Wpisz swoją wiadomość..." + }, + "newConversation": "Nowa Rozmowa", + "settings": "Ustawienia", + "conversationList": { + "title": "Lista Rozmów", + "loading": "Ładowanie...", + "empty": "Brak rozmów" + }, + "action": { + "delete": "Usuń" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Strategia oparta na Promptach", + "GridStrategy": "Strategia Siatki" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Kompatybilny z OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Strategie Handlowe", + "add": "Dodaj strategię handlową", + "noStrategies": "Brak strategii handlowych", + "createFirst": "Utwórz swoją pierwszą strategię, aby rozpocząć handel", + "status": { + "running": "Uruchomiona", + "stopped": "Zatrzymana", + "live": "Na żywo", + "virtual": "Wirtualna" + }, + "action": { + "stop": "Zatrzymać Strategię Handlową?", + "stopDesc": "Zatrzymanie strategii \"{{name}}\" spowoduje jej natychmiastowe zatrzymanie i wymusi likwidację pozycji. Czy chcesz kontynuować?", + "confirmStop": "Potwierdź Zatrzymanie", + "delete": "Usuń", + "deleteTitle": "Usunąć Strategię?", + "deleteDesc": "Usunięcie strategii \"{{name}}\" spowoduje jej natychmiastowe zatrzymanie i wymusi likwidację pozycji. Czy chcesz kontynuować?", + "confirmDelete": "Potwierdź Usunięcie", + "details": "Szczegóły", + "duplicate": "Duplikuj", + "cancel": "Anuluj", + "back": "Wstecz", + "next": "Dalej", + "confirm": "Potwierdź", + "publish": "Opublikuj", + "shareToSocial": "Udostępnij w mediach społecznościowych", + "shareToRanking": "Udostępnij w rankingu" + }, + "portfolio": { + "title": "Historia Wartości Portfela", + "totalEquity": "Całkowity Kapitał", + "availableBalance": "Dostępne Saldo", + "totalPnl": "Całkowity P&L", + "noData": "Brak danych o wartości portfela", + "noDataDesc": "Wykres wartości portfela pojawi się po rozpoczęciu handlu" + }, + "positions": { + "title": "Pozycje", + "symbol": "Symbol", + "type": "Typ", + "leverage": "Dźwignia", + "quantity": "Ilość", + "pnl": "P&L", + "noOpen": "Brak otwartych pozycji", + "noOpenDesc": "Pozycje pojawią się tutaj po otwarciu transakcji" + }, + "create": { + "title": "Dodaj strategię handlową", + "steps": { + "aiModels": "Modele AI", + "exchanges": "Giełdy", + "tradingStrategy": "Strategia handlowa" + }, + "error": "Błąd tworzenia strategii" + }, + "form": { + "strategyType": { + "label": "Typ Strategii", + "promptBased": "Strategia oparta na Promptach", + "grid": "Strategia Siatki" + }, + "strategyName": { + "label": "Nazwa Strategii", + "placeholder": "Wpisz nazwę strategii" + }, + "initialCapital": { + "label": "Kapitał Początkowy", + "placeholder": "Wpisz Kapitał Początkowy" + }, + "maxLeverage": { + "label": "Maksymalna Dźwignia", + "placeholder": "Maksymalna Dźwignia" + }, + "decideInterval": { + "label": "Interwał Decyzji (sekundy)", + "placeholder": "np. 300" + }, + "tradingSymbols": { + "label": "Symbole Handlowe", + "placeholder": "Wybierz symbole handlowe...", + "searchPlaceholder": "Szukaj lub dodaj symbole...", + "emptyText": "Nie znaleziono symboli." + }, + "promptTemplate": { + "label": "Szablon Promptu Systemowego", + "new": "Nowy Prompt", + "view": "Zobacz Strategię" + }, + "aiModels": { + "platform": "Platforma Modelu", + "model": "Wybierz Model", + "noModels": "Brak dostępnych modeli", + "apiKey": { + "label": "Klucz API", + "placeholder": "Wpisz Klucz API" + } + }, + "exchanges": { + "transactionType": "Typ Transakcji", + "liveTrading": "Handel Na Żywo", + "virtualTrading": "Handel Wirtualny", + "selectExchange": "Wybierz Giełdę", + "walletAddress": "Adres Portfela", + "privateKey": "Klucz Prywatny", + "apiKey": "Klucz API", + "secretKey": "Klucz Sekretny", + "passphrase": "Hasło (Passphrase)", + "testConnection": "Testuj Połączenie", + "test": { + "success": "Sukces!", + "failed": "Połączenie nieudane. Sprawdź swój Klucz API, Klucz Sekretny lub Hasło." + }, + "placeholder": { + "binance": { + "apiKey": "Wpisz Klucz API (64 znaki)", + "secretKey": "Wpisz Klucz Sekretny (64 znaki)" + }, + "okx": { + "apiKey": "Wpisz Klucz API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Wpisz Klucz Sekretny (32 wielkie litery i cyfry)", + "passphrase": "Wpisz Hasło (Ustawione podczas tworzenia API)" + }, + "gate": { + "apiKey": "Wpisz Klucz API (Zaczyna się od 'key_')", + "secretKey": "Wpisz Klucz Sekretny (64 znaki)" + }, + "hyperliquid": { + "walletAddress": "Wpisz Adres Portfela (Zaczyna się od '0x')", + "privateKey": "Wpisz Klucz Prywatny (64 znaki)" + }, + "blockchain": { + "apiKey": "Wpisz Klucz API (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Wpisz Klucz Sekretny" + }, + "coinbase": { + "apiKey": "Wpisz Klucz API (lub Nazwę Klucza)", + "secretKey": "Wpisz Sekret API (lub Klucz Prywatny)", + "passphrase": "Wpisz Hasło (Wymagane dla Legacy Pro API)" + }, + "mexc": { + "apiKey": "Wpisz Klucz Dostępu (Zaczyna się od 'mx0')", + "secretKey": "Wpisz Klucz Sekretny (Zazwyczaj 32 znaki)" + }, + "default": { + "apiKey": "Wklej swój Klucz API tutaj", + "secretKey": "Wklej swój Klucz Sekretny tutaj", + "passphrase": "Wpisz Hasło", + "walletAddress": "Wpisz Adres Portfela", + "privateKey": "Wpisz Klucz Prywatny" + } + } + } + }, + "prompt": { + "delete": { + "title": "Usuń Prompt Strategii", + "description": "Czy na pewno chcesz usunąć ten prompt strategii? Tej akcji nie można cofnąć, a prompt zostanie trwale usunięty z systemu." + } + }, + "detail": { + "title": "Szczegóły Strategii", + "loading": "Ładowanie szczegółów...", + "returnRate": "Stopa Zwrotu", + "strategyType": "Typ Strategii", + "modelProvider": "Dostawca Modelu", + "modelId": "ID Modelu", + "initialCapital": "Kapitał Początkowy", + "maxLeverage": "Maksymalna Dźwignia", + "tradingSymbols": "Symbole Handlowe", + "prompt": "Prompt" + }, + "history": { + "title": "Historia Handlu", + "live": "Handel Na Żywo", + "virtual": "Handel Wirtualny", + "cycle": "Cykl #{{index}}", + "aiReasoning": "Logika wnioskowania AI", + "operation": "Wykonaj operację", + "empty": { + "title": "Brak historii handlu", + "desc": "Twoje zakończone transakcje pojawią się tutaj" + }, + "details": { + "time": "Czas", + "price": "Cena", + "quantity": "Ilość", + "holdingTime": "Czas trzymania", + "tradingFee": "Opłata transakcyjna", + "reasoning": "Uzasadnienie" + } + } + }, + "rank": { + "title": "Ranking Zysków", + "days": { + "7": "7D", + "30": "1M" + }, + "table": { + "rank": "Pozycja", + "user": "Użytkownik", + "pnl": "P&L", + "strategy": "Strategia", + "exchange": "Giełda", + "model": "Model", + "details": "Szczegóły", + "loading": "Ładowanie..." + } + }, + "home": { + "hello": "👋 Witaj Inwestorze!", + "welcome": "👋 Witaj w ValueCell!", + "watchlist": "Moja Lista Obserwowanych", + "stock": { + "loading": "Ładowanie danych giełdowych...", + "error": "Błąd ładowania danych giełdowych: {{message}}", + "remove": "Usuń", + "removing": "Usuwanie...", + "add": "Dodaj Akcje", + "about": "O firmie", + "sector": "Sektor:", + "industry": "Branża:", + "website": "Strona WWW:", + "chart": { + "24h": "24h", + "7d": "7d", + "30d": "30d" + } + }, + "search": { + "title": "Wyszukiwanie Akcji", + "placeholder": "Szukaj po nazwie akcji lub kodzie", + "searching": "Szukanie...", + "noResults": "Nie znaleziono powiązanych akcji", + "action": { + "watch": "Obserwuj", + "watching": "Obserwowanie...", + "watched": "Obserwowane" + } + }, + "suggestions": { + "research": { + "title": "Dogłębna Analiza", + "description": "Analizuj dokumenty SEC, aby generować dogłębne raporty interpretacji akcji." + }, + "strategy": { + "title": "Zautomatyzowany Handel", + "description": "Inteligentny handel wielostrategiczny, automatycznie wykonuj swoje strategie" + }, + "news": { + "title": "Powiadomienia o Wiadomościach", + "description": "Spersonalizowane aktualizacje wiadomości według niestandardowego harmonogramu" + } + } + } +} diff --git a/frontend/public/locales/pt-PT/translation.json b/frontend/public/locales/pt-PT/translation.json new file mode 100644 index 000000000..df6fb998a --- /dev/null +++ b/frontend/public/locales/pt-PT/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Geral", + "description": "Gerir as suas preferências e definições da aplicação", + "account": { + "title": "Conta", + "signInDesc": "Inicie sessão para começar a utilizar as funcionalidades do Valuecell AI.", + "signOut": "Terminar Sessão", + "signIn": "Iniciar Sessão" + }, + "language": { + "title": "Idioma e Região", + "description": "Selecione o seu idioma preferido e o formato regional para a aplicação." + }, + "quotesColor": { + "title": "Cor das Cotações", + "description": "Escolha como os movimentos das cotações de ações são visualizados na aplicação.", + "greenUpRedDown": "Verde Sobe / Vermelho Desce", + "redUpGreenDown": "Vermelho Sobe / Verde Desce" + }, + "updates": { + "title": "Atualizações da App", + "check": "Verificar Atualizações" + } + }, + "settings": { + "title": "Definições", + "nav": { + "models": "Modelos", + "general": "Geral", + "memory": "Memória" + }, + "models": { + "title": "Fornecedor de Modelo", + "noProviders": "Nenhum fornecedor disponível.", + "loading": "A carregar detalhes do fornecedor...", + "defaultProvider": "Fornecedor Padrão", + "apiKey": "Chave API", + "enterApiKey": "Introduzir chave API", + "getApiKey": "Clique aqui para obter a chave API", + "apiHost": "Host da API", + "models": "Modelos", + "add": "Adicionar", + "addModel": "Adicionar Modelo", + "modelId": "ID do Modelo", + "enterModelId": "Introduzir ID do modelo", + "modelName": "Nome do Modelo", + "enterModelName": "Introduzir nome do modelo", + "cancel": "Cancelar", + "confirm": "Confirmar", + "noModels": "Nenhum modelo configurado para este fornecedor." + }, + "memory": { + "title": "Memórias preservadas", + "description": "Lembrar-me-ei e gerirei automaticamente informações úteis nos chats para melhorar a personalização e relevância das respostas", + "loading": "A carregar...", + "noMemories": "Ainda sem memórias", + "delete": "Eliminar" + } + }, + "common": { + "back": "Voltar" + }, + "market": { + "title": "Mercado de Agentes" + }, + "agent": { + "welcome": "Bem-vindo ao {{name}}!", + "unknown": "Agente Desconhecido", + "status": { + "running": "Em execução" + }, + "action": { + "view": "Ver" + }, + "config": { + "disable": "Desativar", + "chat": "Conversar", + "collectAndChat": "Recolher e conversar" + } + }, + "chat": { + "input": { + "placeholder": "Escreva a sua mensagem..." + }, + "newConversation": "Nova Conversa", + "settings": "Definições", + "conversationList": { + "title": "Lista de Conversas", + "loading": "A carregar...", + "empty": "Ainda sem conversas" + }, + "action": { + "delete": "Eliminar" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Estratégia Baseada em Prompt", + "GridStrategy": "Estratégia de Grelha" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Compatível com OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Estratégias de Negociação", + "add": "Adicionar estratégia de negociação", + "noStrategies": "Sem estratégias de negociação", + "createFirst": "Crie a sua primeira estratégia para começar a negociar", + "status": { + "running": "Em execução", + "stopped": "Parado", + "live": "Em direto", + "virtual": "Virtual" + }, + "action": { + "stop": "Parar Estratégia de Negociação?", + "stopDesc": "Parar a estratégia \"{{name}}\" irá pará-la imediatamente e desencadear uma liquidação forçada. Deseja continuar?", + "confirmStop": "Confirmar Paragem", + "delete": "Eliminar", + "deleteTitle": "Eliminar Estratégia?", + "deleteDesc": "Eliminar a estratégia \"{{name}}\" irá pará-la imediatamente e desencadear uma liquidação forçada. Deseja continuar?", + "confirmDelete": "Confirmar Eliminação", + "details": "Detalhes", + "duplicate": "Duplicar", + "cancel": "Cancelar", + "back": "Voltar", + "next": "Seguinte", + "confirm": "Confirmar", + "publish": "Publicar", + "shareToSocial": "Partilhar nas Redes Sociais", + "shareToRanking": "Partilhar no Ranking" + }, + "portfolio": { + "title": "Histórico de Valor do Portfólio", + "totalEquity": "Capital Total", + "availableBalance": "Saldo Disponível", + "totalPnl": "P&L Total", + "noData": "Sem dados de valor de portfólio", + "noDataDesc": "O gráfico de valor do portfólio aparecerá assim que a negociação começar" + }, + "positions": { + "title": "Posições", + "symbol": "Símbolo", + "type": "Tipo", + "leverage": "Alavancagem", + "quantity": "Quantidade", + "pnl": "P&L", + "noOpen": "Sem posições abertas", + "noOpenDesc": "As posições aparecerão aqui quando as negociações forem abertas" + }, + "create": { + "title": "Adicionar estratégia de negociação", + "steps": { + "aiModels": "Modelos de IA", + "exchanges": "Bolsas", + "tradingStrategy": "Estratégia de negociação" + }, + "error": "Erro ao Criar Estratégia" + }, + "form": { + "strategyType": { + "label": "Tipo de Estratégia", + "promptBased": "Estratégia Baseada em Prompt", + "grid": "Estratégia de Grelha" + }, + "strategyName": { + "label": "Nome da Estratégia", + "placeholder": "Introduzir nome da estratégia" + }, + "initialCapital": { + "label": "Capital Inicial", + "placeholder": "Introduzir Capital Inicial" + }, + "maxLeverage": { + "label": "Alavancagem Máxima", + "placeholder": "Alavancagem Máxima" + }, + "decideInterval": { + "label": "Intervalo de Decisão (segundos)", + "placeholder": "ex: 300" + }, + "tradingSymbols": { + "label": "Símbolos de Negociação", + "placeholder": "Selecionar símbolos de negociação...", + "searchPlaceholder": "Pesquisar ou adicionar símbolos...", + "emptyText": "Nenhum símbolo encontrado." + }, + "promptTemplate": { + "label": "Modelo de Prompt do Sistema", + "new": "Novo Prompt", + "view": "Ver Estratégia" + }, + "aiModels": { + "platform": "Plataforma de Modelo", + "model": "Selecionar Modelo", + "noModels": "Nenhum modelo disponível", + "apiKey": { + "label": "Chave API", + "placeholder": "Introduzir Chave API" + } + }, + "exchanges": { + "transactionType": "Tipo de Transação", + "liveTrading": "Negociação em Direto", + "virtualTrading": "Negociação Virtual", + "selectExchange": "Selecionar Bolsa", + "walletAddress": "Endereço da Carteira", + "privateKey": "Chave Privada", + "apiKey": "Chave API", + "secretKey": "Chave Secreta", + "passphrase": "Frase de Acesso", + "testConnection": "Testar Ligação", + "test": { + "success": "Sucesso!", + "failed": "Ligação falhou. Verifique a sua Chave API, Chave Secreta ou Frase de Acesso." + }, + "placeholder": { + "binance": { + "apiKey": "Introduzir Chave API (64 caracteres)", + "secretKey": "Introduzir Chave Secreta (64 caracteres)" + }, + "okx": { + "apiKey": "Introduzir Chave API (Formato: xxxxxxxx-xxxx-...)", + "secretKey": "Introduzir Chave Secreta (32 letras maiúsculas e números)", + "passphrase": "Introduzir Frase de Acesso (Definida durante a criação da API)" + }, + "gate": { + "apiKey": "Introduzir Chave API (Começa com 'key_')", + "secretKey": "Introduzir Chave Secreta (64 caracteres)" + }, + "hyperliquid": { + "walletAddress": "Introduzir Endereço da Carteira (Começa com '0x')", + "privateKey": "Introduzir Chave Privada (64 caracteres)" + }, + "blockchain": { + "apiKey": "Introduzir Chave API (Formato: xxxxxxxx-xxxx-...)", + "secretKey": "Introduzir Chave Secreta" + }, + "coinbase": { + "apiKey": "Introduzir Chave API (ou Nome da Chave)", + "secretKey": "Introduzir Segredo da API (ou Chave Privada)", + "passphrase": "Introduzir Frase de Acesso (Obrigatório para API Pro Legacy)" + }, + "mexc": { + "apiKey": "Introduzir Chave de Acesso (Começa com 'mx0')", + "secretKey": "Introduzir Chave Secreta (Geralmente 32 caracteres)" + }, + "default": { + "apiKey": "Cole a sua Chave API aqui", + "secretKey": "Cole a sua Chave Secreta aqui", + "passphrase": "Introduzir Frase de Acesso", + "walletAddress": "Introduzir Endereço da Carteira", + "privateKey": "Introduzir Chave Privada" + } + } + }, + "prompt": { + "delete": { + "title": "Eliminar Prompt de Estratégia", + "description": "Tem a certeza que deseja eliminar este prompt de estratégia? Esta ação não pode ser desfeita e removerá permanentemente o prompt do sistema." + } + }, + "detail": { + "title": "Detalhes da Estratégia", + "loading": "A carregar detalhes...", + "returnRate": "Taxa de Retorno", + "strategyType": "Tipo de Estratégia", + "modelProvider": "Fornecedor de Modelo", + "modelId": "ID do Modelo", + "initialCapital": "Capital Inicial", + "maxLeverage": "Alavancagem Máxima", + "tradingSymbols": "Símbolos de Negociação", + "prompt": "Prompt" + }, + "history": { + "title": "Histórico de Negociação", + "live": "Negociação em Direto", + "virtual": "Negociação Virtual", + "cycle": "Ciclo #{{index}}", + "aiReasoning": "Lógica de raciocínio da IA", + "operation": "Executar operação", + "empty": { + "title": "Sem histórico de negociação", + "desc": "As suas negociações concluídas aparecerão aqui" + }, + "details": { + "time": "Hora", + "price": "Preço", + "quantity": "Quantidade", + "holdingTime": "Tempo de detenção", + "tradingFee": "Taxa de Negociação", + "reasoning": "Raciocínio" + } + } + } + }, + "rank": { + "title": "Classificação de Lucro", + "days": { + "7": "7D", + "30": "1M" + }, + "table": { + "rank": "Posição", + "user": "Utilizador", + "pnl": "P&L", + "strategy": "Estratégia", + "exchange": "Bolsa", + "model": "Modelo", + "details": "Detalhes", + "loading": "A carregar..." + } + }, + "home": { + "hello": "👋 Olá Investidor!", + "welcome": "👋 Bem-vindo ao ValueCell!", + "watchlist": "A Minha Lista de Observação", + "stock": { + "loading": "A carregar dados de ações...", + "error": "Erro ao carregar dados de ações: {{message}}", + "remove": "Remover", + "removing": "A remover...", + "add": "Adicionar Ações", + "about": "Sobre", + "sector": "Setor:", + "industry": "Indústria:", + "website": "Website:", + "chart": { + "24h": "24h", + "7d": "7d", + "30d": "30d" + } + }, + "search": { + "title": "Pesquisa de Ações", + "placeholder": "Pesquisar por nome ou código da ação", + "searching": "A pesquisar...", + "noResults": "Nenhuma ação relacionada encontrada", + "action": { + "watch": "Observar", + "watching": "A observar...", + "watched": "Observado" + } + }, + "suggestions": { + "research": { + "title": "Investigação Profunda", + "description": "Analise os registos da SEC para gerar relatórios de interpretação de ações aprofundados." + }, + "strategy": { + "title": "Negociação Automatizada", + "description": "Negociação inteligente multi-estratégia, execute automaticamente as suas estratégias" + }, + "news": { + "title": "Notícias Push", + "description": "Atualizações de notícias personalizadas num horário personalizado" + } + } + } +} diff --git a/frontend/public/locales/ru-RU/translation.json b/frontend/public/locales/ru-RU/translation.json new file mode 100644 index 000000000..01608bcec --- /dev/null +++ b/frontend/public/locales/ru-RU/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Общие", + "description": "Управление предпочтениями и настройками приложения", + "account": { + "title": "Аккаунт", + "signInDesc": "Войдите, чтобы начать использовать функции Valuecell AI.", + "signOut": "Выйти", + "signIn": "Войти" + }, + "language": { + "title": "Язык и Регион", + "description": "Выберите предпочтительный язык и региональный формат для приложения." + }, + "quotesColor": { + "title": "Цвет Котировок", + "description": "Выберите, как визуализируются движения котировок акций в приложении.", + "greenUpRedDown": "Зеленый Вверх / Красный Вниз", + "redUpGreenDown": "Красный Вверх / Зеленый Вниз" + }, + "updates": { + "title": "Обновления Приложения", + "check": "Проверить обновления" + } + }, + "settings": { + "title": "Настройки", + "nav": { + "models": "Модели", + "general": "Общие", + "memory": "Память" + }, + "models": { + "title": "Провайдер Модели", + "noProviders": "Нет доступных провайдеров.", + "loading": "Загрузка деталей провайдера...", + "defaultProvider": "Провайдер по умолчанию", + "apiKey": "API Ключ", + "enterApiKey": "Введите API ключ", + "getApiKey": "Нажмите здесь, чтобы получить API ключ", + "apiHost": "API Хост", + "models": "Модели", + "add": "Добавить", + "addModel": "Добавить Модель", + "modelId": "ID Модели", + "enterModelId": "Введите ID модели", + "modelName": "Имя Модели", + "enterModelName": "Введите имя модели", + "cancel": "Отмена", + "confirm": "Подтвердить", + "noModels": "Нет настроенных моделей для этого провайдера." + }, + "memory": { + "title": "Сохраненные воспоминания", + "description": "Я буду запоминать и автоматически управлять полезной информацией в чатах для улучшения персонализации и релевантности ответов", + "loading": "Загрузка...", + "noMemories": "Пока нет воспоминаний", + "delete": "Удалить" + } + }, + "common": { + "back": "Назад" + }, + "market": { + "title": "Рынок Агентов" + }, + "agent": { + "welcome": "Добро пожаловать в {{name}}!", + "unknown": "Неизвестный Агент", + "status": { + "running": "Запущен" + }, + "action": { + "view": "Просмотр" + }, + "config": { + "disable": "Отключить", + "chat": "Чат", + "collectAndChat": "Собрать и общаться" + } + }, + "chat": { + "input": { + "placeholder": "Введите ваше сообщение..." + }, + "newConversation": "Новый Разговор", + "settings": "Настройки", + "conversationList": { + "title": "Список Разговоров", + "loading": "Загрузка...", + "empty": "Пока нет разговоров" + }, + "action": { + "delete": "Удалить" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Стратегия на основе Промпта", + "GridStrategy": "Сеточная Стратегия" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI Совместимый", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Торговые Стратегии", + "add": "Добавить торговую стратегию", + "noStrategies": "Нет торговых стратегий", + "createFirst": "Создайте свою первую стратегию, чтобы начать торговлю", + "status": { + "running": "Запущена", + "stopped": "Остановлена", + "live": "Реальная", + "virtual": "Виртуальная" + }, + "action": { + "stop": "Остановить Торговую Стратегию?", + "stopDesc": "Остановка стратегии \"{{name}}\" немедленно прекратит ее работу и вызовет принудительную ликвидацию. Вы хотите продолжить?", + "confirmStop": "Подтвердить Остановку", + "delete": "Удалить", + "deleteTitle": "Удалить Стратегию?", + "deleteDesc": "Удаление стратегии \"{{name}}\" немедленно прекратит ее работу и вызовет принудительную ликвидацию. Вы хотите продолжить?", + "confirmDelete": "Подтвердить Удаление", + "details": "Детали", + "duplicate": "Дублировать", + "cancel": "Отмена", + "back": "Назад", + "next": "Далее", + "confirm": "Подтвердить", + "publish": "Опубликовать", + "shareToSocial": "Поделиться в соцсетях", + "shareToRanking": "Поделиться в рейтинге" + }, + "portfolio": { + "title": "История Стоимости Портфеля", + "totalEquity": "Общий Капитал", + "availableBalance": "Доступный Баланс", + "totalPnl": "Общий P&L", + "noData": "Нет данных о стоимости портфеля", + "noDataDesc": "График стоимости портфеля появится после начала торговли" + }, + "positions": { + "title": "Позиции", + "symbol": "Символ", + "type": "Тип", + "leverage": "Плечо", + "quantity": "Количество", + "pnl": "P&L", + "noOpen": "Нет открытых позиций", + "noOpenDesc": "Позиции появятся здесь при открытии сделок" + }, + "create": { + "title": "Добавить торговую стратегию", + "steps": { + "aiModels": "ИИ Модели", + "exchanges": "Биржи", + "tradingStrategy": "Торговая стратегия" + }, + "error": "Ошибка создания стратегии" + }, + "form": { + "strategyType": { + "label": "Тип Стратегии", + "promptBased": "Стратегия на основе Промпта", + "grid": "Сеточная Стратегия" + }, + "strategyName": { + "label": "Имя Стратегии", + "placeholder": "Введите имя стратегии" + }, + "initialCapital": { + "label": "Начальный Капитал", + "placeholder": "Введите Начальный Капитал" + }, + "maxLeverage": { + "label": "Макс. Плечо", + "placeholder": "Макс. Плечо" + }, + "decideInterval": { + "label": "Интервал Решения (секунды)", + "placeholder": "например 300" + }, + "tradingSymbols": { + "label": "Торговые Символы", + "placeholder": "Выберите торговые символы...", + "searchPlaceholder": "Найти или добавить символы...", + "emptyText": "Символы не найдены." + }, + "promptTemplate": { + "label": "Шаблон Системного Промпта", + "new": "Новый Промпт", + "view": "Просмотр Стратегии" + }, + "aiModels": { + "platform": "Платформа Модели", + "model": "Выбрать Модель", + "noModels": "Нет доступных моделей", + "apiKey": { + "label": "API Ключ", + "placeholder": "Введите API Ключ" + } + }, + "exchanges": { + "transactionType": "Тип Транзакции", + "liveTrading": "Реальная Торговля", + "virtualTrading": "Виртуальная Торговля", + "selectExchange": "Выбрать Биржу", + "walletAddress": "Адрес Кошелька", + "privateKey": "Приватный Ключ", + "apiKey": "API Ключ", + "secretKey": "Секретный Ключ", + "passphrase": "Парольная Фраза", + "testConnection": "Проверить Соединение", + "test": { + "success": "Успех!", + "failed": "Соединение не удалось. Пожалуйста, проверьте ваш API Ключ, Секретный Ключ или Парольную Фразу." + }, + "placeholder": { + "binance": { + "apiKey": "Введите API Ключ (64 символа)", + "secretKey": "Введите Секретный Ключ (64 символа)" + }, + "okx": { + "apiKey": "Введите API Ключ (Формат: xxxxxxxx-xxxx-...)", + "secretKey": "Введите Секретный Ключ (32 заглавные буквы и цифры)", + "passphrase": "Введите Парольную Фразу (Установлена при создании API)" + }, + "gate": { + "apiKey": "Введите API Ключ (Начинается с 'key_')", + "secretKey": "Введите Секретный Ключ (64 символа)" + }, + "hyperliquid": { + "walletAddress": "Введите Адрес Кошелька (Начинается с '0x')", + "privateKey": "Введите Приватный Ключ (64 символа)" + }, + "blockchain": { + "apiKey": "Введите API Ключ (Формат: xxxxxxxx-xxxx-...)", + "secretKey": "Введите Секретный Ключ" + }, + "coinbase": { + "apiKey": "Введите API Ключ (или Имя Ключа)", + "secretKey": "Введите API Секрет (или Приватный Ключ)", + "passphrase": "Введите Парольную Фразу (Требуется для Legacy Pro API)" + }, + "mexc": { + "apiKey": "Введите Ключ Доступа (Начинается с 'mx0')", + "secretKey": "Введите Секретный Ключ (Обычно 32 символа)" + }, + "default": { + "apiKey": "Вставьте ваш API Ключ сюда", + "secretKey": "Вставьте ваш Секретный Ключ сюда", + "passphrase": "Введите Парольную Фразу", + "walletAddress": "Введите Адрес Кошелька", + "privateKey": "Введите Приватный Ключ" + } + } + } + }, + "prompt": { + "delete": { + "title": "Удалить Промпт Стратегии", + "description": "Вы уверены, что хотите удалить этот промпт стратегии? Это действие нельзя отменить, и промпт будет безвозвратно удален из системы." + } + }, + "detail": { + "title": "Детали Стратегии", + "loading": "Загрузка деталей...", + "returnRate": "Доходность", + "strategyType": "Тип Стратегии", + "modelProvider": "Провайдер Модели", + "modelId": "ID Модели", + "initialCapital": "Начальный Капитал", + "maxLeverage": "Макс. Плечо", + "tradingSymbols": "Торговые Символы", + "prompt": "Промпт" + }, + "history": { + "title": "История Торговли", + "live": "Реальная Торговля", + "virtual": "Виртуальная Торговля", + "cycle": "Цикл #{{index}}", + "aiReasoning": "Логика рассуждений ИИ", + "operation": "Выполнить операцию", + "empty": { + "title": "Нет истории торговли", + "desc": "Ваши завершенные сделки появятся здесь" + }, + "details": { + "time": "Время", + "price": "Цена", + "quantity": "Количество", + "holdingTime": "Время удержания", + "tradingFee": "Торговая Комиссия", + "reasoning": "Обоснование" + } + } + }, + "rank": { + "title": "Таблица Лидеров Прибыли", + "days": { + "7": "7Д", + "30": "1М" + }, + "table": { + "rank": "Ранг", + "user": "Пользователь", + "pnl": "P&L", + "strategy": "Стратегия", + "exchange": "Биржа", + "model": "Модель", + "details": "Детали", + "loading": "Загрузка..." + } + }, + "home": { + "hello": "👋 Привет, Инвестор!", + "welcome": "👋 Добро пожаловать в ValueCell!", + "watchlist": "Мой Список Наблюдения", + "stock": { + "loading": "Загрузка биржевых данных...", + "error": "Ошибка загрузки биржевых данных: {{message}}", + "remove": "Удалить", + "removing": "Удаление...", + "add": "Добавить Акции", + "about": "О компании", + "sector": "Сектор:", + "industry": "Индустрия:", + "website": "Веб-сайт:", + "chart": { + "24h": "24ч", + "7d": "7д", + "30d": "30д" + } + }, + "search": { + "title": "Поиск Акций", + "placeholder": "Поиск по названию акции или коду", + "searching": "Поиск...", + "noResults": "Похожие акции не найдены", + "action": { + "watch": "Отслеживать", + "watching": "Отслеживается...", + "watched": "Отслеживается" + } + }, + "suggestions": { + "research": { + "title": "Глубокое Исследование", + "description": "Анализируйте документы SEC для создания углубленных отчетов по интерпретации акций." + }, + "strategy": { + "title": "Автоматическая Торговля", + "description": "Мульти-стратегическая умная торговля, автоматическое выполнение ваших стратегий" + }, + "news": { + "title": "Новостной Пуш", + "description": "Персонализированные обновления новостей по пользовательскому расписанию" + } + } + } +} diff --git a/frontend/public/locales/th-TH/translation.json b/frontend/public/locales/th-TH/translation.json new file mode 100644 index 000000000..7f81b58c9 --- /dev/null +++ b/frontend/public/locales/th-TH/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "ทั่วไป", + "description": "จัดการการตั้งค่าและการกำหนดค่าแอปพลิเคชันของคุณ", + "account": { + "title": "บัญชี", + "signInDesc": "ลงชื่อเข้าใช้เพื่อเริ่มใช้งานฟีเจอร์ของ Valuecell AI", + "signOut": "ลงชื่อออก", + "signIn": "ลงชื่อเข้าใช้" + }, + "language": { + "title": "ภาษาและภูมิภาค", + "description": "เลือกภาษาและรูปแบบภูมิภาคที่คุณต้องการสำหรับแอป" + }, + "quotesColor": { + "title": "สีราคาหุ้น", + "description": "เลือกวิธีการแสดงการเคลื่อนไหวของราคาหุ้นในแอป", + "greenUpRedDown": "เขียวขึ้น / แดงลง", + "redUpGreenDown": "แดงขึ้น / เขียวลง" + }, + "updates": { + "title": "การอัปเดตแอป", + "check": "ตรวจสอบการอัปเดต" + } + }, + "settings": { + "title": "การตั้งค่า", + "nav": { + "models": "โมเดล", + "general": "ทั่วไป", + "memory": "ความจำ" + }, + "models": { + "title": "ผู้ให้บริการโมเดล", + "noProviders": "ไม่มีผู้ให้บริการ", + "loading": "กำลังโหลดรายละเอียดผู้ให้บริการ...", + "defaultProvider": "ผู้ให้บริการเริ่มต้น", + "apiKey": "คีย์ API", + "enterApiKey": "ป้อนคีย์ API", + "getApiKey": "คลิกที่นี่เพื่อรับคีย์ API", + "apiHost": "โฮสต์ API", + "models": "โมเดล", + "add": "เพิ่ม", + "addModel": "เพิ่มโมเดล", + "modelId": "รหัสโมเดล", + "enterModelId": "ป้อนรหัสโมเดล", + "modelName": "ชื่อโมเดล", + "enterModelName": "ป้อนชื่อโมเดล", + "cancel": "ยกเลิก", + "confirm": "ยืนยัน", + "noModels": "ไม่มีโมเดลที่กำหนดค่าสำหรับผู้ให้บริการนี้" + }, + "memory": { + "title": "ความทรงจำที่บันทึกไว้", + "description": "ฉันจะจดจำและจัดการข้อมูลที่เป็นประโยชน์ในการแชทโดยอัตโนมัติ เพื่อเพิ่มความเฉพาะตัวและความเกี่ยวข้องของคำตอบ", + "loading": "กำลังโหลด...", + "noMemories": "ยังไม่มีความทรงจำ", + "delete": "ลบ" + } + }, + "common": { + "back": "กลับ" + }, + "market": { + "title": "ตลาดเอเจนต์" + }, + "agent": { + "welcome": "ยินดีต้อนรับสู่ {{name}}!", + "unknown": "เอเจนต์ไม่ทราบชื่อ", + "status": { + "running": "กำลังทำงาน" + }, + "action": { + "view": "ดู" + }, + "config": { + "disable": "ปิดใช้งาน", + "chat": "แชท", + "collectAndChat": "รวบรวมและแชท" + } + }, + "chat": { + "input": { + "placeholder": "พิมพ์ข้อความของคุณ..." + }, + "newConversation": "การสนทนาใหม่", + "settings": "การตั้งค่า", + "conversationList": { + "title": "รายการการสนทนา", + "loading": "กำลังโหลด...", + "empty": "ยังไม่มีการสนทนา" + }, + "action": { + "delete": "ลบ" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "กลยุทธ์ตามพรอมต์", + "GridStrategy": "กลยุทธ์กริด" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "เข้ากันได้กับ OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "กลยุทธ์การเทรด", + "add": "เพิ่มกลยุทธ์การเทรด", + "noStrategies": "ไม่มีกลยุทธ์การเทรด", + "createFirst": "สร้างกลยุทธ์แรกของคุณเพื่อเริ่มเทรด", + "status": { + "running": "กำลังทำงาน", + "stopped": "หยุด", + "live": "จริง", + "virtual": "จำลอง" + }, + "action": { + "stop": "หยุดกลยุทธ์การเทรด?", + "stopDesc": "การหยุดกลยุทธ์ \"{{name}}\" จะหยุดทันทีและทำให้เกิดการบังคับขาย คุณต้องการดำเนินการต่อหรือไม่?", + "confirmStop": "ยืนยันการหยุด", + "delete": "ลบ", + "deleteTitle": "ลบกลยุทธ์?", + "deleteDesc": "การลบกลยุทธ์ \"{{name}}\" จะหยุดทันทีและทำให้เกิดการบังคับขาย คุณต้องการดำเนินการต่อหรือไม่?", + "confirmDelete": "ยืนยันการลบ", + "details": "รายละเอียด", + "duplicate": "ทำซ้ำ", + "cancel": "ยกเลิก", + "back": "กลับ", + "next": "ถัดไป", + "confirm": "ยืนยัน", + "publish": "เผยแพร่", + "shareToSocial": "แชร์ไปยังโซเชียล", + "shareToRanking": "แชร์ไปยังอันดับ" + }, + "portfolio": { + "title": "ประวัติมูลค่าพอร์ตโฟลิโอ", + "totalEquity": "ส่วนของผู้ถือหุ้นรวม", + "availableBalance": "ยอดเงินคงเหลือ", + "totalPnl": "กำไร/ขาดทุนรวม", + "noData": "ไม่มีข้อมูลมูลค่าพอร์ตโฟลิโอ", + "noDataDesc": "กราฟมูลค่าพอร์ตโฟลิโอจะปรากฏเมื่อการเทรดเริ่มต้น" + }, + "positions": { + "title": "สถานะ", + "symbol": "สัญลักษณ์", + "type": "ประเภท", + "leverage": "เลเวอเรจ", + "quantity": "จำนวน", + "pnl": "กำไร/ขาดทุน", + "noOpen": "ไม่มีสถานะเปิด", + "noOpenDesc": "สถานะจะปรากฏที่นี่เมื่อมีการเปิดเทรด" + }, + "create": { + "title": "เพิ่มกลยุทธ์การเทรด", + "steps": { + "aiModels": "โมเดล AI", + "exchanges": "กระดานเทรด", + "tradingStrategy": "กลยุทธ์การเทรด" + }, + "error": "เกิดข้อผิดพลาดในการสร้างกลยุทธ์" + }, + "form": { + "strategyType": { + "label": "ประเภทกลยุทธ์", + "promptBased": "กลยุทธ์ตามพรอมต์", + "grid": "กลยุทธ์กริด" + }, + "strategyName": { + "label": "ชื่อกลยุทธ์", + "placeholder": "ป้อนชื่อกลยุทธ์" + }, + "initialCapital": { + "label": "เงินทุนเริ่มต้น", + "placeholder": "ป้อนเงินทุนเริ่มต้น" + }, + "maxLeverage": { + "label": "เลเวอเรจสูงสุด", + "placeholder": "เลเวอเรจสูงสุด" + }, + "decideInterval": { + "label": "ช่วงเวลาตัดสินใจ (วินาที)", + "placeholder": "เช่น 300" + }, + "tradingSymbols": { + "label": "สัญลักษณ์การเทรด", + "placeholder": "เลือกสัญลักษณ์การเทรด...", + "searchPlaceholder": "ค้นหาหรือเพิ่มสัญลักษณ์...", + "emptyText": "ไม่พบสัญลักษณ์" + }, + "promptTemplate": { + "label": "เทมเพลตพรอมต์ระบบ", + "new": "พรอมต์ใหม่", + "view": "ดูกลยุทธ์" + }, + "aiModels": { + "platform": "แพลตฟอร์มโมเดล", + "model": "เลือกโมเดล", + "noModels": "ไม่มีโมเดลที่ใช้ได้", + "apiKey": { + "label": "คีย์ API", + "placeholder": "ป้อนคีย์ API" + } + }, + "exchanges": { + "transactionType": "ประเภทธุรกรรม", + "liveTrading": "เทรดจริง", + "virtualTrading": "เทรดจำลอง", + "selectExchange": "เลือกกระดานเทรด", + "walletAddress": "ที่อยู่กระเป๋าเงิน", + "privateKey": "คีย์ส่วนตัว", + "apiKey": "คีย์ API", + "secretKey": "คีย์ลับ", + "passphrase": "รหัสผ่าน", + "testConnection": "ทดสอบการเชื่อมต่อ", + "test": { + "success": "สำเร็จ!", + "failed": "การเชื่อมต่อล้มเหลว โปรดตรวจสอบคีย์ API, คีย์ลับ หรือรหัสผ่านของคุณ" + }, + "placeholder": { + "binance": { + "apiKey": "ป้อนคีย์ API (64 ตัวอักษร)", + "secretKey": "ป้อนคีย์ลับ (64 ตัวอักษร)" + }, + "okx": { + "apiKey": "ป้อนคีย์ API (รูปแบบ: xxxxxxxx-xxxx-...)", + "secretKey": "ป้อนคีย์ลับ (ตัวพิมพ์ใหญ่และตัวเลข 32 ตัว)", + "passphrase": "ป้อนรหัสผ่าน (ตั้งค่าระหว่างการสร้าง API)" + }, + "gate": { + "apiKey": "ป้อนคีย์ API (ขึ้นต้นด้วย 'key_')", + "secretKey": "ป้อนคีย์ลับ (64 ตัวอักษร)" + }, + "hyperliquid": { + "walletAddress": "ป้อนที่อยู่กระเป๋าเงิน (ขึ้นต้นด้วย '0x')", + "privateKey": "ป้อนคีย์ส่วนตัว (64 ตัวอักษร)" + }, + "blockchain": { + "apiKey": "ป้อนคีย์ API (รูปแบบ: xxxxxxxx-xxxx-...)", + "secretKey": "ป้อนคีย์ลับ" + }, + "coinbase": { + "apiKey": "ป้อนคีย์ API (หรือชื่อคีย์)", + "secretKey": "ป้อนความลับ API (หรือคีย์ส่วนตัว)", + "passphrase": "ป้อนรหัสผ่าน (จำเป็นสำหรับ API Pro Legacy)" + }, + "mexc": { + "apiKey": "ป้อนคีย์การเข้าถึง (ขึ้นต้นด้วย 'mx0')", + "secretKey": "ป้อนคีย์ลับ (โดยปกติ 32 ตัวอักษร)" + }, + "default": { + "apiKey": "วางคีย์ API ของคุณที่นี่", + "secretKey": "วางคีย์ลับของคุณที่นี่", + "passphrase": "ป้อนรหัสผ่าน", + "walletAddress": "ป้อนที่อยู่กระเป๋าเงิน", + "privateKey": "ป้อนคีย์ส่วนตัว" + } + } + }, + "prompt": { + "delete": { + "title": "ลบพรอมต์กลยุทธ์", + "description": "คุณแน่ใจหรือไม่ว่าต้องการลบพรอมต์กลยุทธ์นี้? การดำเนินการนี้ไม่สามารถย้อนกลับได้และจะลบพรอมต์ออกจากระบบอย่างถาวร" + } + }, + "detail": { + "title": "รายละเอียดกลยุทธ์", + "loading": "กำลังโหลดรายละเอียด...", + "returnRate": "อัตราผลตอบแทน", + "strategyType": "ประเภทกลยุทธ์", + "modelProvider": "ผู้ให้บริการโมเดล", + "modelId": "รหัสโมเดล", + "initialCapital": "เงินทุนเริ่มต้น", + "maxLeverage": "เลเวอเรจสูงสุด", + "tradingSymbols": "สัญลักษณ์การเทรด", + "prompt": "พรอมต์" + }, + "history": { + "title": "ประวัติการเทรด", + "live": "เทรดจริง", + "virtual": "เทรดจำลอง", + "cycle": "รอบ #{{index}}", + "aiReasoning": "ตรรกะการให้เหตุผล AI", + "operation": "ดำเนินการ", + "empty": { + "title": "ไม่มีประวัติการเทรด", + "desc": "การเทรดที่เสร็จสมบูรณ์ของคุณจะปรากฏที่นี่" + }, + "details": { + "time": "เวลา", + "price": "ราคา", + "quantity": "จำนวน", + "holdingTime": "เวลาถือครอง", + "tradingFee": "ค่าธรรมเนียมการเทรด", + "reasoning": "เหตุผล" + } + } + } + }, + "rank": { + "title": "ลีดเดอร์บอร์ดกำไร", + "days": { + "7": "7 วัน", + "30": "1 เดือน" + }, + "table": { + "rank": "อันดับ", + "user": "ผู้ใช้", + "pnl": "กำไร/ขาดทุน", + "strategy": "กลยุทธ์", + "exchange": "กระดานเทรด", + "model": "โมเดล", + "details": "รายละเอียด", + "loading": "กำลังโหลด..." + } + }, + "home": { + "hello": "👋 สวัสดี นักลงทุน!", + "welcome": "👋 ยินดีต้อนรับสู่ ValueCell!", + "watchlist": "รายการเฝ้าดูของฉัน", + "stock": { + "loading": "กำลังโหลดข้อมูลหุ้น...", + "error": "เกิดข้อผิดพลาดในการโหลดข้อมูลหุ้น: {{message}}", + "remove": "ลบออก", + "removing": "กำลังลบ...", + "add": "เพิ่มหุ้น", + "about": "เกี่ยวกับ", + "sector": "ภาคธุรกิจ:", + "industry": "อุตสาหกรรม:", + "website": "เว็บไซต์:", + "chart": { + "24h": "24 ชม.", + "7d": "7 วัน", + "30d": "30 วัน" + } + }, + "search": { + "title": "ค้นหาหุ้น", + "placeholder": "ค้นหาชื่อหุ้นหรือรหัส", + "searching": "กำลังค้นหา...", + "noResults": "ไม่พบหุ้นที่เกี่ยวข้อง", + "action": { + "watch": "เฝ้าดู", + "watching": "กำลังเฝ้าดู...", + "watched": "เฝ้าดูแล้ว" + } + }, + "suggestions": { + "research": { + "title": "การวิจัยเชิงลึก", + "description": "วิเคราะห์เอกสารยื่นต่อ SEC เพื่อสร้างรายงานการตีความหุ้นเชิงลึก" + }, + "strategy": { + "title": "การเทรดอัตโนมัติ", + "description": "การเทรดอัจฉริยะหลายกลยุทธ์ ดำเนินการกลยุทธ์ของคุณโดยอัตโนมัติ" + }, + "news": { + "title": "ข่าวด่วน", + "description": "อัปเดตข่าวสารส่วนบุคคลตามกำหนดเวลาที่กำหนดเอง" + } + } + } +} diff --git a/frontend/public/locales/tr-TR/translation.json b/frontend/public/locales/tr-TR/translation.json new file mode 100644 index 000000000..619732621 --- /dev/null +++ b/frontend/public/locales/tr-TR/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Genel", + "description": "Tercihlerinizi ve uygulama ayarlarınızı yönetin", + "account": { + "title": "Hesap", + "signInDesc": "Valuecell AI özelliklerini kullanmaya başlamak için oturum açın.", + "signOut": "Çıkış Yap", + "signIn": "Oturum Aç" + }, + "language": { + "title": "Dil ve Bölge", + "description": "Uygulama için tercih ettiğiniz dili ve bölgesel formatı seçin." + }, + "quotesColor": { + "title": "Fiyat Rengi", + "description": "Uygulama genelinde hisse senedi fiyat hareketlerinin nasıl görselleştirileceğini seçin.", + "greenUpRedDown": "Yeşil Yükseliş / Kırmızı Düşüş", + "redUpGreenDown": "Kırmızı Yükseliş / Yeşil Düşüş" + }, + "updates": { + "title": "Uygulama Güncellemeleri", + "check": "Güncellemeleri Kontrol Et" + } + }, + "settings": { + "title": "Ayarlar", + "nav": { + "models": "Modeller", + "general": "Genel", + "memory": "Hafıza" + }, + "models": { + "title": "Model Sağlayıcı", + "noProviders": "Kullanılabilir sağlayıcı yok.", + "loading": "Sağlayıcı detayları yükleniyor...", + "defaultProvider": "Varsayılan Sağlayıcı", + "apiKey": "API Anahtarı", + "enterApiKey": "API anahtarını girin", + "getApiKey": "API anahtarını almak için buraya tıklayın", + "apiHost": "API Ana Bilgisayarı", + "models": "Modeller", + "add": "Ekle", + "addModel": "Model Ekle", + "modelId": "Model Kimliği", + "enterModelId": "Model kimliğini girin", + "modelName": "Model Adı", + "enterModelName": "Model adını girin", + "cancel": "İptal", + "confirm": "Onayla", + "noModels": "Bu sağlayıcı için yapılandırılmış model yok." + }, + "memory": { + "title": "Korunan anılar", + "description": "Yanıtların kişiselleştirilmesini ve alaka düzeyini artırmak için sohbetlerdeki yararlı bilgileri hatırlayacak ve otomatik olarak yöneteceğim", + "loading": "Yükleniyor...", + "noMemories": "Henüz anı yok", + "delete": "Sil" + } + }, + "common": { + "back": "Geri" + }, + "market": { + "title": "Ajan Pazarı" + }, + "agent": { + "welcome": "{{name}}'e hoş geldiniz!", + "unknown": "Bilinmeyen Ajan", + "status": { + "running": "Çalışıyor" + }, + "action": { + "view": "Görüntüle" + }, + "config": { + "disable": "Devre Dışı Bırak", + "chat": "Sohbet", + "collectAndChat": "Topla ve sohbet et" + } + }, + "chat": { + "input": { + "placeholder": "Mesajınızı yazın..." + }, + "newConversation": "Yeni Sohbet", + "settings": "Ayarlar", + "conversationList": { + "title": "Sohbet Listesi", + "loading": "Yükleniyor...", + "empty": "Henüz sohbet yok" + }, + "action": { + "delete": "Sil" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "İstem Tabanlı Strateji", + "GridStrategy": "Izgara Stratejisi" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI Uyumlu", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Ticaret Stratejileri", + "add": "Ticaret stratejisi ekle", + "noStrategies": "Ticaret stratejisi yok", + "createFirst": "Ticarete başlamak için ilk stratejinizi oluşturun", + "status": { + "running": "Çalışıyor", + "stopped": "Durduruldu", + "live": "Canlı", + "virtual": "Sanal" + }, + "action": { + "stop": "Ticaret Stratejisini Durdur?", + "stopDesc": "\"{{name}}\" stratejisini durdurmak, onu hemen durduracak ve zorunlu tasfiyeyi tetikleyecektir. Devam etmek istiyor musunuz?", + "confirmStop": "Durdurmayı Onayla", + "delete": "Sil", + "deleteTitle": "Stratejiyi Sil?", + "deleteDesc": "\"{{name}}\" stratejisini silmek, onu hemen durduracak ve zorunlu tasfiyeyi tetikleyecektir. Devam etmek istiyor musunuz?", + "confirmDelete": "Silmeyi Onayla", + "details": "Detaylar", + "duplicate": "Çoğalt", + "cancel": "İptal", + "back": "Geri", + "next": "İleri", + "confirm": "Onayla", + "publish": "Yayınla", + "shareToSocial": "Sosyal medyada paylaş", + "shareToRanking": "Sıralamada paylaş" + }, + "portfolio": { + "title": "Portföy Değer Geçmişi", + "totalEquity": "Toplam Özkaynak", + "availableBalance": "Kullanılabilir Bakiye", + "totalPnl": "Toplam K&Z", + "noData": "Portföy değer verisi yok", + "noDataDesc": "Portföy değer grafiği ticaret başladığında görünecektir" + }, + "positions": { + "title": "Pozisyonlar", + "symbol": "Sembol", + "type": "Tip", + "leverage": "Kaldıraç", + "quantity": "Miktar", + "pnl": "K&Z", + "noOpen": "Açık pozisyon yok", + "noOpenDesc": "Pozisyonlar işlemler açıldığında burada görünecektir" + }, + "create": { + "title": "Ticaret stratejisi ekle", + "steps": { + "aiModels": "Yapay Zeka Modelleri", + "exchanges": "Borsalar", + "tradingStrategy": "Ticaret stratejisi" + }, + "error": "Strateji Oluşturma Hatası" + }, + "form": { + "strategyType": { + "label": "Strateji Tipi", + "promptBased": "İstem Tabanlı Strateji", + "grid": "Izgara Stratejisi" + }, + "strategyName": { + "label": "Strateji Adı", + "placeholder": "Strateji adını girin" + }, + "initialCapital": { + "label": "Başlangıç Sermayesi", + "placeholder": "Başlangıç Sermayesini Girin" + }, + "maxLeverage": { + "label": "Maksimum Kaldıraç", + "placeholder": "Maksimum Kaldıraç" + }, + "decideInterval": { + "label": "Karar Aralığı (saniye)", + "placeholder": "örn. 300" + }, + "tradingSymbols": { + "label": "Ticaret Sembolleri", + "placeholder": "Ticaret sembollerini seçin...", + "searchPlaceholder": "Sembol ara veya ekle...", + "emptyText": "Sembol bulunamadı." + }, + "promptTemplate": { + "label": "Sistem İstemi Şablonu", + "new": "Yeni İstem", + "view": "Stratejiyi Görüntüle" + }, + "aiModels": { + "platform": "Model Platformu", + "model": "Model Seç", + "noModels": "Kullanılabilir model yok", + "apiKey": { + "label": "API Anahtarı", + "placeholder": "API Anahtarını Girin" + } + }, + "exchanges": { + "transactionType": "İşlem Tipi", + "liveTrading": "Canlı Ticaret", + "virtualTrading": "Sanal Ticaret", + "selectExchange": "Borsa Seç", + "walletAddress": "Cüzdan Adresi", + "privateKey": "Özel Anahtar", + "apiKey": "API Anahtarı", + "secretKey": "Gizli Anahtar", + "passphrase": "Parola", + "testConnection": "Bağlantıyı Test Et", + "test": { + "success": "Başarılı!", + "failed": "Bağlantı başarısız. Lütfen API Anahtarınızı, Gizli Anahtarınızı veya Parolanızı kontrol edin." + }, + "placeholder": { + "binance": { + "apiKey": "API Anahtarını Girin (64 karakter)", + "secretKey": "Gizli Anahtarı Girin (64 karakter)" + }, + "okx": { + "apiKey": "API Anahtarını Girin (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Gizli Anahtarı Girin (32 büyük harf ve sayı)", + "passphrase": "Parolayı Girin (API oluşturma sırasında belirlenen)" + }, + "gate": { + "apiKey": "API Anahtarını Girin ('key_' ile başlar)", + "secretKey": "Gizli Anahtarı Girin (64 karakter)" + }, + "hyperliquid": { + "walletAddress": "Cüzdan Adresini Girin ('0x' ile başlar)", + "privateKey": "Özel Anahtarı Girin (64 karakter)" + }, + "blockchain": { + "apiKey": "API Anahtarını Girin (Format: xxxxxxxx-xxxx-...)", + "secretKey": "Gizli Anahtarı Girin" + }, + "coinbase": { + "apiKey": "API Anahtarını Girin (veya Anahtar Adı)", + "secretKey": "API Sırrını Girin (veya Özel Anahtar)", + "passphrase": "Parolayı Girin (Eski Pro API için Gerekli)" + }, + "mexc": { + "apiKey": "Erişim Anahtarını Girin ('mx0' ile başlar)", + "secretKey": "Gizli Anahtarı Girin (Genellikle 32 karakter)" + }, + "default": { + "apiKey": "API Anahtarınızı buraya yapıştırın", + "secretKey": "Gizli Anahtarınızı buraya yapıştırın", + "passphrase": "Parolayı Girin", + "walletAddress": "Cüzdan Adresini Girin", + "privateKey": "Özel Anahtarı Girin" + } + } + } + }, + "prompt": { + "delete": { + "title": "Strateji İstemini Sil", + "description": "Bu strateji istemini silmek istediğinizden emin misiniz? Bu işlem geri alınamaz ve istemi sistemden kalıcı olarak kaldırır." + } + }, + "detail": { + "title": "Strateji Detayları", + "loading": "Detaylar yükleniyor...", + "returnRate": "Getiri Oranı", + "strategyType": "Strateji Tipi", + "modelProvider": "Model Sağlayıcı", + "modelId": "Model Kimliği", + "initialCapital": "Başlangıç Sermayesi", + "maxLeverage": "Maksimum Kaldıraç", + "tradingSymbols": "Ticaret Sembolleri", + "prompt": "İstem" + }, + "history": { + "title": "Ticaret Geçmişi", + "live": "Canlı Ticaret", + "virtual": "Sanal Ticaret", + "cycle": "Döngü #{{index}}", + "aiReasoning": "Yapay zeka mantığı", + "operation": "İşlemi gerçekleştir", + "empty": { + "title": "Ticaret geçmişi yok", + "desc": "Tamamlanan işlemleriniz burada görünecektir" + }, + "details": { + "time": "Zaman", + "price": "Fiyat", + "quantity": "Miktar", + "holdingTime": "Tutma süresi", + "tradingFee": "İşlem Ücreti", + "reasoning": "Gerekçe" + } + } + }, + "rank": { + "title": "Kar Lider Tablosu", + "days": { + "7": "7G", + "30": "1A" + }, + "table": { + "rank": "Sıra", + "user": "Kullanıcı", + "pnl": "K&Z", + "strategy": "Strateji", + "exchange": "Borsa", + "model": "Model", + "details": "Detaylar", + "loading": "Yükleniyor..." + } + }, + "home": { + "hello": "👋 Merhaba Yatırımcı!", + "welcome": "👋 ValueCell'e Hoş Geldiniz!", + "watchlist": "İzleme Listem", + "stock": { + "loading": "Hisse senedi verileri yükleniyor...", + "error": "Hisse senedi verileri yüklenirken hata oluştu: {{message}}", + "remove": "Kaldır", + "removing": "Kaldırılıyor...", + "add": "Hisse Senedi Ekle", + "about": "Hakkında", + "sector": "Sektör:", + "industry": "Endüstri:", + "website": "Web Sitesi:", + "chart": { + "24h": "24s", + "7d": "7g", + "30d": "30g" + } + }, + "search": { + "title": "Hisse Senedi Arama", + "placeholder": "Hisse senedi adı veya kodu ile ara", + "searching": "Aranıyor...", + "noResults": "İlgili hisse senedi bulunamadı", + "action": { + "watch": "İzle", + "watching": "İzleniyor...", + "watched": "İzlendi" + } + }, + "suggestions": { + "research": { + "title": "Derinlemesine Araştırma", + "description": "Derinlemesine hisse senedi yorumlama raporları oluşturmak için SEC dosyalarını analiz edin." + }, + "strategy": { + "title": "Otomatik Ticaret", + "description": "Çok stratejili akıllı ticaret, stratejilerinizi otomatik olarak yürütün" + }, + "news": { + "title": "Haber Bildirimleri", + "description": "Özel bir programa göre kişiselleştirilmiş haber güncellemeleri" + } + } + } +} diff --git a/frontend/public/locales/vi-VN/translation.json b/frontend/public/locales/vi-VN/translation.json new file mode 100644 index 000000000..0c7590a40 --- /dev/null +++ b/frontend/public/locales/vi-VN/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "Chung", + "description": "Quản lý tùy chọn và cài đặt ứng dụng của bạn", + "account": { + "title": "Tài khoản", + "signInDesc": "Đăng nhập để bắt đầu sử dụng các tính năng của Valuecell AI.", + "signOut": "Đăng xuất", + "signIn": "Đăng nhập" + }, + "language": { + "title": "Ngôn ngữ và Khu vực", + "description": "Chọn ngôn ngữ và định dạng khu vực ưa thích của bạn cho ứng dụng." + }, + "quotesColor": { + "title": "Màu báo giá", + "description": "Chọn cách hiển thị biến động giá cổ phiếu trong ứng dụng.", + "greenUpRedDown": "Xanh Tăng / Đỏ Giảm", + "redUpGreenDown": "Đỏ Tăng / Xanh Giảm" + }, + "updates": { + "title": "Cập nhật ứng dụng", + "check": "Kiểm tra cập nhật" + } + }, + "settings": { + "title": "Cài đặt", + "nav": { + "models": "Mô hình", + "general": "Chung", + "memory": "Bộ nhớ" + }, + "models": { + "title": "Nhà cung cấp mô hình", + "noProviders": "Không có nhà cung cấp nào.", + "loading": "Đang tải chi tiết nhà cung cấp...", + "defaultProvider": "Nhà cung cấp mặc định", + "apiKey": "Khóa API", + "enterApiKey": "Nhập khóa API", + "getApiKey": "Nhấp vào đây để lấy khóa API", + "apiHost": "Máy chủ API", + "models": "Mô hình", + "add": "Thêm", + "addModel": "Thêm mô hình", + "modelId": "ID mô hình", + "enterModelId": "Nhập ID mô hình", + "modelName": "Tên mô hình", + "enterModelName": "Nhập tên mô hình", + "cancel": "Hủy", + "confirm": "Xác nhận", + "noModels": "Không có mô hình nào được cấu hình cho nhà cung cấp này." + }, + "memory": { + "title": "Ký ức đã lưu", + "description": "Tôi sẽ ghi nhớ và tự động quản lý thông tin hữu ích trong các cuộc trò chuyện để nâng cao tính cá nhân hóa và sự phù hợp của các câu trả lời", + "loading": "Đang tải...", + "noMemories": "Chưa có ký ức nào", + "delete": "Xóa" + } + }, + "common": { + "back": "Quay lại" + }, + "market": { + "title": "Chợ Đại lý" + }, + "agent": { + "welcome": "Chào mừng đến với {{name}}!", + "unknown": "Đại lý không xác định", + "status": { + "running": "Đang chạy" + }, + "action": { + "view": "Xem" + }, + "config": { + "disable": "Vô hiệu hóa", + "chat": "Trò chuyện", + "collectAndChat": "Thu thập và trò chuyện" + } + }, + "chat": { + "input": { + "placeholder": "Nhập tin nhắn của bạn..." + }, + "newConversation": "Cuộc trò chuyện mới", + "settings": "Cài đặt", + "conversationList": { + "title": "Danh sách cuộc trò chuyện", + "loading": "Đang tải...", + "empty": "Chưa có cuộc trò chuyện nào" + }, + "action": { + "delete": "Xóa" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Chiến lược dựa trên Prompt", + "GridStrategy": "Chiến lược Lưới" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "Tương thích OpenAI", + "openrouter": "OpenRouter", + "siliconflow": "SiliconFlow" + }, + "title": "Chiến lược giao dịch", + "add": "Thêm chiến lược giao dịch", + "noStrategies": "Không có chiến lược giao dịch", + "createFirst": "Tạo chiến lược đầu tiên của bạn để bắt đầu giao dịch", + "status": { + "running": "Đang chạy", + "stopped": "Đã dừng", + "live": "Thực", + "virtual": "Ảo" + }, + "action": { + "stop": "Dừng chiến lược giao dịch?", + "stopDesc": "Dừng chiến lược \"{{name}}\" sẽ dừng ngay lập tức và kích hoạt thanh lý bắt buộc. Bạn có muốn tiếp tục không?", + "confirmStop": "Xác nhận dừng", + "delete": "Xóa", + "deleteTitle": "Xóa chiến lược?", + "deleteDesc": "Xóa chiến lược \"{{name}}\" sẽ dừng ngay lập tức và kích hoạt thanh lý bắt buộc. Bạn có muốn tiếp tục không?", + "confirmDelete": "Xác nhận xóa", + "details": "Chi tiết", + "duplicate": "Nhân bản", + "cancel": "Hủy", + "back": "Quay lại", + "next": "Tiếp theo", + "confirm": "Xác nhận", + "publish": "Xuất bản", + "shareToSocial": "Chia sẻ lên Mạng xã hội", + "shareToRanking": "Chia sẻ lên Bảng xếp hạng" + }, + "portfolio": { + "title": "Lịch sử giá trị danh mục đầu tư", + "totalEquity": "Tổng vốn chủ sở hữu", + "availableBalance": "Số dư khả dụng", + "totalPnl": "Tổng P&L", + "noData": "Không có dữ liệu giá trị danh mục đầu tư", + "noDataDesc": "Biểu đồ giá trị danh mục đầu tư sẽ xuất hiện khi giao dịch bắt đầu" + }, + "positions": { + "title": "Vị thế", + "symbol": "Mã", + "type": "Loại", + "leverage": "Đòn bẩy", + "quantity": "Số lượng", + "pnl": "P&L", + "noOpen": "Không có vị thế mở", + "noOpenDesc": "Các vị thế sẽ xuất hiện ở đây khi giao dịch được mở" + }, + "create": { + "title": "Thêm chiến lược giao dịch", + "steps": { + "aiModels": "Mô hình AI", + "exchanges": "Sàn giao dịch", + "tradingStrategy": "Chiến lược giao dịch" + }, + "error": "Lỗi khi tạo chiến lược" + }, + "form": { + "strategyType": { + "label": "Loại chiến lược", + "promptBased": "Chiến lược dựa trên Prompt", + "grid": "Chiến lược Lưới" + }, + "strategyName": { + "label": "Tên chiến lược", + "placeholder": "Nhập tên chiến lược" + }, + "initialCapital": { + "label": "Vốn ban đầu", + "placeholder": "Nhập vốn ban đầu" + }, + "maxLeverage": { + "label": "Đòn bẩy tối đa", + "placeholder": "Đòn bẩy tối đa" + }, + "decideInterval": { + "label": "Khoảng thời gian quyết định (giây)", + "placeholder": "ví dụ: 300" + }, + "tradingSymbols": { + "label": "Mã giao dịch", + "placeholder": "Chọn mã giao dịch...", + "searchPlaceholder": "Tìm kiếm hoặc thêm mã...", + "emptyText": "Không tìm thấy mã nào." + }, + "promptTemplate": { + "label": "Mẫu Prompt hệ thống", + "new": "Prompt mới", + "view": "Xem chiến lược" + }, + "aiModels": { + "platform": "Nền tảng mô hình", + "model": "Chọn mô hình", + "noModels": "Không có mô hình nào khả dụng", + "apiKey": { + "label": "Khóa API", + "placeholder": "Nhập khóa API" + } + }, + "exchanges": { + "transactionType": "Loại giao dịch", + "liveTrading": "Giao dịch thực", + "virtualTrading": "Giao dịch ảo", + "selectExchange": "Chọn sàn giao dịch", + "walletAddress": "Địa chỉ ví", + "privateKey": "Khóa riêng tư", + "apiKey": "Khóa API", + "secretKey": "Khóa bí mật", + "passphrase": "Cụm mật khẩu", + "testConnection": "Kiểm tra kết nối", + "test": { + "success": "Thành công!", + "failed": "Kết nối thất bại. Vui lòng kiểm tra Khóa API, Khóa bí mật hoặc Cụm mật khẩu của bạn." + }, + "placeholder": { + "binance": { + "apiKey": "Nhập Khóa API (64 ký tự)", + "secretKey": "Nhập Khóa bí mật (64 ký tự)" + }, + "okx": { + "apiKey": "Nhập Khóa API (Định dạng: xxxxxxxx-xxxx-...)", + "secretKey": "Nhập Khóa bí mật (32 chữ cái in hoa & số)", + "passphrase": "Nhập Cụm mật khẩu (Được thiết lập khi tạo API)" + }, + "gate": { + "apiKey": "Nhập Khóa API (Bắt đầu bằng 'key_')", + "secretKey": "Nhập Khóa bí mật (64 ký tự)" + }, + "hyperliquid": { + "walletAddress": "Nhập Địa chỉ ví (Bắt đầu bằng '0x')", + "privateKey": "Nhập Khóa riêng tư (64 ký tự)" + }, + "blockchain": { + "apiKey": "Nhập Khóa API (Định dạng: xxxxxxxx-xxxx-...)", + "secretKey": "Nhập Khóa bí mật" + }, + "coinbase": { + "apiKey": "Nhập Khóa API (hoặc Tên khóa)", + "secretKey": "Nhập Bí mật API (hoặc Khóa riêng tư)", + "passphrase": "Nhập Cụm mật khẩu (Bắt buộc đối với API Pro Legacy)" + }, + "mexc": { + "apiKey": "Nhập Khóa truy cập (Bắt đầu bằng 'mx0')", + "secretKey": "Nhập Khóa bí mật (Thường là 32 ký tự)" + }, + "default": { + "apiKey": "Dán Khóa API của bạn vào đây", + "secretKey": "Dán Khóa bí mật của bạn vào đây", + "passphrase": "Nhập Cụm mật khẩu", + "walletAddress": "Nhập Địa chỉ ví", + "privateKey": "Nhập Khóa riêng tư" + } + } + }, + "prompt": { + "delete": { + "title": "Xóa Prompt chiến lược", + "description": "Bạn có chắc chắn muốn xóa prompt chiến lược này không? Hành động này không thể hoàn tác và sẽ xóa vĩnh viễn prompt khỏi hệ thống." + } + }, + "detail": { + "title": "Chi tiết chiến lược", + "loading": "Đang tải chi tiết...", + "returnRate": "Tỷ suất lợi nhuận", + "strategyType": "Loại chiến lược", + "modelProvider": "Nhà cung cấp mô hình", + "modelId": "ID mô hình", + "initialCapital": "Vốn ban đầu", + "maxLeverage": "Đòn bẩy tối đa", + "tradingSymbols": "Mã giao dịch", + "prompt": "Prompt" + }, + "history": { + "title": "Lịch sử giao dịch", + "live": "Giao dịch thực", + "virtual": "Giao dịch ảo", + "cycle": "Chu kỳ #{{index}}", + "aiReasoning": "Logic suy luận AI", + "operation": "Thực hiện thao tác", + "empty": { + "title": "Không có lịch sử giao dịch", + "desc": "Các giao dịch đã hoàn thành của bạn sẽ xuất hiện ở đây" + }, + "details": { + "time": "Thời gian", + "price": "Giá", + "quantity": "Số lượng", + "holdingTime": "Thời gian nắm giữ", + "tradingFee": "Phí giao dịch", + "reasoning": "Suy luận" + } + } + } + }, + "rank": { + "title": "Bảng xếp hạng lợi nhuận", + "days": { + "7": "7N", + "30": "1T" + }, + "table": { + "rank": "Thứ hạng", + "user": "Người dùng", + "pnl": "P&L", + "strategy": "Chiến lược", + "exchange": "Sàn giao dịch", + "model": "Mô hình", + "details": "Chi tiết", + "loading": "Đang tải..." + } + }, + "home": { + "hello": "👋 Xin chào Nhà đầu tư!", + "welcome": "👋 Chào mừng đến với ValueCell!", + "watchlist": "Danh sách theo dõi của tôi", + "stock": { + "loading": "Đang tải dữ liệu cổ phiếu...", + "error": "Lỗi khi tải dữ liệu cổ phiếu: {{message}}", + "remove": "Xóa", + "removing": "Đang xóa...", + "add": "Thêm cổ phiếu", + "about": "Giới thiệu", + "sector": "Lĩnh vực:", + "industry": "Ngành:", + "website": "Trang web:", + "chart": { + "24h": "24h", + "7d": "7n", + "30d": "30n" + } + }, + "search": { + "title": "Tìm kiếm cổ phiếu", + "placeholder": "Tìm kiếm tên hoặc mã cổ phiếu", + "searching": "Đang tìm kiếm...", + "noResults": "Không tìm thấy cổ phiếu liên quan", + "action": { + "watch": "Theo dõi", + "watching": "Đang theo dõi...", + "watched": "Đã theo dõi" + } + }, + "suggestions": { + "research": { + "title": "Nghiên cứu chuyên sâu", + "description": "Phân tích hồ sơ SEC để tạo báo cáo giải thích cổ phiếu chuyên sâu." + }, + "strategy": { + "title": "Giao dịch tự động", + "description": "Giao dịch thông minh đa chiến lược, tự động thực hiện các chiến lược của bạn" + }, + "news": { + "title": "Tin tức đẩy", + "description": "Cập nhật tin tức cá nhân hóa theo lịch trình tùy chỉnh" + } + } + } +} diff --git a/frontend/public/locales/zh-Hans/translation.json b/frontend/public/locales/zh-Hans/translation.json new file mode 100644 index 000000000..4af2381c8 --- /dev/null +++ b/frontend/public/locales/zh-Hans/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "通用", + "description": "管理您的首选项和应用程序设置", + "account": { + "title": "账户", + "signInDesc": "登录以开始使用 Valuecell AI 功能。", + "signOut": "退出登录", + "signIn": "登录" + }, + "language": { + "title": "语言和区域", + "description": "选择您喜欢的应用程序语言和区域格式。" + }, + "quotesColor": { + "title": "行情颜色", + "description": "选择股票行情涨跌的显示颜色。", + "greenUpRedDown": "绿涨红跌", + "redUpGreenDown": "红涨绿跌" + }, + "updates": { + "title": "应用更新", + "check": "检查更新" + } + }, + "settings": { + "title": "设置", + "nav": { + "models": "模型", + "general": "通用", + "memory": "记忆" + }, + "models": { + "title": "模型提供商", + "noProviders": "无可用提供商。", + "loading": "正在加载提供商详情...", + "defaultProvider": "默认提供商", + "apiKey": "API 密钥", + "enterApiKey": "输入 API 密钥", + "getApiKey": "点击此处获取 API 密钥", + "apiHost": "API 主机", + "models": "模型", + "add": "添加", + "addModel": "添加模型", + "modelId": "模型 ID", + "enterModelId": "输入模型 ID", + "modelName": "模型名称", + "enterModelName": "输入模型名称", + "cancel": "取消", + "confirm": "确认", + "noModels": "该提供商未配置任何模型。" + }, + "memory": { + "title": "保留记忆", + "description": "我将记住并自动管理聊天中的有用信息,以增强回复的个性化和相关性", + "loading": "加载中...", + "noMemories": "暂无记忆", + "delete": "删除" + } + }, + "common": { + "back": "返回" + }, + "market": { + "title": "Agent 市场" + }, + "agent": { + "welcome": "欢迎使用 {{name}}!", + "unknown": "未知 Agent", + "status": { + "running": "运行中" + }, + "action": { + "view": "查看" + }, + "config": { + "disable": "禁用", + "chat": "聊天", + "collectAndChat": "收藏并聊天" + } + }, + "chat": { + "input": { + "placeholder": "输入消息..." + }, + "newConversation": "新对话", + "settings": "设置", + "conversationList": { + "title": "对话列表", + "loading": "加载中...", + "empty": "暂无对话" + }, + "action": { + "delete": "删除" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Prompt 策略", + "GridStrategy": "网格策略" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "阿里云", + "deepseek": "深度求索", + "google": "谷歌云", + "openai": "OpenAI", + "openai-compatible": "OpenAI 兼容", + "openrouter": "OpenRouter", + "siliconflow": "硅基流动" + }, + "title": "交易策略", + "add": "添加交易策略", + "noStrategies": "暂无交易策略", + "createFirst": "创建您的第一个策略以开始交易", + "status": { + "running": "运行中", + "stopped": "已停止", + "live": "实盘", + "virtual": "虚拟" + }, + "action": { + "stop": "停止交易策略?", + "stopDesc": "停止策略 \"{{name}}\" 将立即停止它并触发强制平仓。您确定要继续吗?", + "confirmStop": "确认停止", + "delete": "删除", + "deleteTitle": "删除策略?", + "deleteDesc": "删除策略 \"{{name}}\" 将立即停止它并触发强制平仓。您确定要继续吗?", + "confirmDelete": "确认删除", + "details": "详情", + "duplicate": "复制", + "cancel": "取消", + "back": "返回", + "next": "下一步", + "confirm": "确认", + "publish": "发布", + "shareToSocial": "分享到社交媒体", + "shareToRanking": "分享到排行榜" + }, + "portfolio": { + "title": "投资组合价值历史", + "totalEquity": "总权益", + "availableBalance": "可用余额", + "totalPnl": "总盈亏", + "noData": "暂无投资组合价值数据", + "noDataDesc": "交易开始后将显示投资组合价值图表" + }, + "positions": { + "title": "持仓", + "symbol": "标的", + "type": "类型", + "leverage": "杠杆", + "quantity": "数量", + "pnl": "盈亏", + "noOpen": "暂无持仓", + "noOpenDesc": "开仓后将在此处显示持仓" + }, + "create": { + "title": "添加交易策略", + "steps": { + "aiModels": "AI 模型", + "exchanges": "交易所", + "tradingStrategy": "交易策略" + }, + "error": "创建策略失败" + }, + "form": { + "strategyType": { + "label": "策略类型", + "promptBased": "Prompt 策略", + "grid": "网格策略" + }, + "strategyName": { + "label": "策略名称", + "placeholder": "输入策略名称" + }, + "initialCapital": { + "label": "初始资金", + "placeholder": "输入初始资金" + }, + "maxLeverage": { + "label": "最大杠杆", + "placeholder": "最大杠杆" + }, + "decideInterval": { + "label": "决策间隔 (秒)", + "placeholder": "例如: 300" + }, + "tradingSymbols": { + "label": "交易对", + "placeholder": "选择交易对...", + "searchPlaceholder": "搜索或添加交易对...", + "emptyText": "未找到交易对。" + }, + "promptTemplate": { + "label": "系统 Prompt 模板", + "new": "新建 Prompt", + "view": "查看策略" + }, + "aiModels": { + "platform": "模型平台", + "model": "选择模型", + "noModels": "暂无可用模型", + "apiKey": { + "label": "API Key", + "placeholder": "输入 API Key" + } + }, + "exchanges": { + "transactionType": "交易类型", + "liveTrading": "实盘交易", + "virtualTrading": "模拟交易", + "selectExchange": "选择交易所", + "walletAddress": "钱包地址", + "privateKey": "私钥", + "apiKey": "API Key", + "secretKey": "Secret Key", + "passphrase": "Passphrase", + "testConnection": "测试连接", + "test": { + "success": "连接成功!", + "failed": "连接失败。请检查您的 API Key, Secret Key 或 Passphrase。" + }, + "placeholder": { + "binance": { + "apiKey": "输入 API Key (64 字符)", + "secretKey": "输入 Secret Key (64 字符)" + }, + "okx": { + "apiKey": "输入 API Key (格式: xxxxxxxx-xxxx-...)", + "secretKey": "输入 Secret Key (32 大写字母和数字)", + "passphrase": "输入 Passphrase (API 创建时设置)" + }, + "gate": { + "apiKey": "输入 API Key (以 'key_' 开头)", + "secretKey": "输入 Secret Key (64 字符)" + }, + "hyperliquid": { + "walletAddress": "输入钱包地址 (以 '0x' 开头)", + "privateKey": "输入私钥 (64 字符)" + }, + "blockchain": { + "apiKey": "输入 API Key (格式: xxxxxxxx-xxxx-...)", + "secretKey": "输入 Secret Key" + }, + "coinbase": { + "apiKey": "输入 API Key (或 Key Name)", + "secretKey": "输入 API Secret (或 Private Key)", + "passphrase": "输入 Passphrase (Legacy Pro API 需要)" + }, + "mexc": { + "apiKey": "输入 Access Key (以 'mx0' 开头)", + "secretKey": "输入 Secret Key (通常 32 字符)" + }, + "default": { + "apiKey": "在此粘贴 API Key", + "secretKey": "在此粘贴 Secret Key", + "passphrase": "输入 Passphrase", + "walletAddress": "输入钱包地址", + "privateKey": "输入私钥" + } + } + } + }, + "prompt": { + "delete": { + "title": "删除策略 Prompt", + "description": "您确定要删除此策略 Prompt 吗?此操作无法撤消,并将从系统中永久删除该 Prompt。" + } + }, + "detail": { + "title": "策略详情", + "loading": "加载详情中...", + "returnRate": "回报率", + "strategyType": "策略类型", + "modelProvider": "模型提供商", + "modelId": "模型 ID", + "initialCapital": "初始资金", + "maxLeverage": "最大杠杆", + "tradingSymbols": "交易对", + "prompt": "Prompt" + }, + "history": { + "title": "交易历史", + "live": "实盘交易", + "virtual": "模拟交易", + "cycle": "周期 #{{index}}", + "aiReasoning": "AI 推理逻辑", + "operation": "执行操作", + "empty": { + "title": "暂无交易历史", + "desc": "您完成的交易将显示在这里" + }, + "details": { + "time": "时间", + "price": "价格", + "quantity": "数量", + "holdingTime": "持仓时间", + "tradingFee": "交易费用", + "reasoning": "推理" + } + } + }, + "rank": { + "title": "收益排行榜", + "days": { + "7": "7天", + "30": "1月" + }, + "table": { + "rank": "排名", + "user": "用户", + "pnl": "盈亏", + "strategy": "策略", + "exchange": "交易所", + "model": "模型", + "details": "详情", + "loading": "加载中..." + } + }, + "home": { + "hello": "👋 您好,投资者!", + "welcome": "👋 欢迎来到 ValueCell !", + "watchlist": "我的自选股", + "stock": { + "loading": "正在加载股票数据...", + "error": "加载股票数据失败: {{message}}", + "remove": "移除", + "removing": "移除中...", + "add": "添加股票", + "about": "简介", + "sector": "板块:", + "industry": "行业:", + "website": "官网:", + "chart": { + "24h": "24小时", + "7d": "7天", + "30d": "30天" + } + }, + "search": { + "title": "搜索股票", + "placeholder": "搜索股票名称或代码", + "searching": "搜索中...", + "noResults": "未找到相关股票", + "action": { + "watch": "关注", + "watching": "关注中...", + "watched": "已关注" + } + }, + "suggestions": { + "research": { + "title": "深度研究", + "description": "分析 SEC 文件,生成深度股票解读报告。" + }, + "strategy": { + "title": "自动交易", + "description": "多策略智能交易,自动执行您的策略" + }, + "news": { + "title": "新闻推送", + "description": "按自定义时间表推送个性化新闻更新" + } + } + } +} diff --git a/frontend/public/locales/zh-Hant/translation.json b/frontend/public/locales/zh-Hant/translation.json new file mode 100644 index 000000000..fb35061bb --- /dev/null +++ b/frontend/public/locales/zh-Hant/translation.json @@ -0,0 +1,367 @@ +{ + "general": { + "title": "通用", + "description": "管理您的首選項和應用程式設定", + "account": { + "title": "帳戶", + "signInDesc": "登入以開始使用 Valuecell AI 功能。", + "signOut": "登出", + "signIn": "登入" + }, + "language": { + "title": "語言與區域", + "description": "選擇您偏好的應用程式語言和區域格式。" + }, + "quotesColor": { + "title": "行情顏色", + "description": "選擇股票行情漲跌的顯示顏色。", + "greenUpRedDown": "綠漲紅跌", + "redUpGreenDown": "紅漲綠跌" + }, + "updates": { + "title": "應用程式更新", + "check": "檢查更新" + } + }, + "settings": { + "title": "設定", + "nav": { + "models": "模型", + "general": "通用", + "memory": "記憶" + }, + "models": { + "title": "模型供應商", + "noProviders": "無可用供應商。", + "loading": "正在載入供應商詳情...", + "defaultProvider": "預設供應商", + "apiKey": "API 金鑰", + "enterApiKey": "輸入 API 金鑰", + "getApiKey": "點擊此處獲取 API 金鑰", + "apiHost": "API 主機", + "models": "模型", + "add": "新增", + "addModel": "新增模型", + "modelId": "模型 ID", + "enterModelId": "輸入模型 ID", + "modelName": "模型名稱", + "enterModelName": "輸入模型名稱", + "cancel": "取消", + "confirm": "確認", + "noModels": "該供應商未配置任何模型。" + }, + "memory": { + "title": "保留記憶", + "description": "我將記住並自動管理聊天中的有用資訊,以增強回覆的個人化和相關性", + "loading": "載入中...", + "noMemories": "暫無記憶", + "delete": "刪除" + } + }, + "common": { + "back": "返回" + }, + "market": { + "title": "Agent 市場" + }, + "agent": { + "welcome": "歡迎使用 {{name}}!", + "unknown": "未知 Agent", + "status": { + "running": "運行中" + }, + "action": { + "view": "查看" + }, + "config": { + "disable": "禁用", + "chat": "聊天", + "collectAndChat": "收藏並聊天" + } + }, + "chat": { + "input": { + "placeholder": "輸入訊息..." + }, + "newConversation": "新對話", + "settings": "設置", + "conversationList": { + "title": "對話列表", + "loading": "載入中...", + "empty": "暫無對話" + }, + "action": { + "delete": "刪除" + } + }, + "strategy": { + "types": { + "PromptBasedStrategy": "Prompt 策略", + "GridStrategy": "網格策略" + }, + "providers": { + "azure": "Azure OpenAI", + "dashscope": "阿里雲", + "deepseek": "深度求索", + "google": "Google Cloud", + "openai": "OpenAI", + "openai-compatible": "OpenAI 兼容", + "openrouter": "OpenRouter", + "siliconflow": "硅基流動" + }, + "title": "交易策略", + "add": "新增交易策略", + "noStrategies": "暫無交易策略", + "createFirst": "建立您的第一個策略以開始交易", + "status": { + "running": "運行中", + "stopped": "已停止", + "live": "實盤", + "virtual": "虛擬" + }, + "action": { + "stop": "停止交易策略?", + "stopDesc": "停止策略 \"{{name}}\" 將立即停止它並觸發強制平倉。您確定要繼續嗎?", + "confirmStop": "確認停止", + "delete": "刪除", + "deleteTitle": "刪除策略?", + "deleteDesc": "刪除策略 \"{{name}}\" 將立即停止它並觸發強制平倉。您確定要繼續嗎?", + "confirmDelete": "確認刪除", + "details": "詳情", + "duplicate": "複製", + "cancel": "取消", + "back": "返回", + "next": "下一步", + "confirm": "確認", + "publish": "發布", + "shareToSocial": "分享到社交媒體", + "shareToRanking": "分享到排行榜" + }, + "portfolio": { + "title": "投資組合價值歷史", + "totalEquity": "總權益", + "availableBalance": "可用餘額", + "totalPnl": "總盈虧", + "noData": "暫無投資組合價值數據", + "noDataDesc": "交易開始後將顯示投資組合價值圖表" + }, + "positions": { + "title": "持倉", + "symbol": "標的", + "type": "類型", + "leverage": "槓桿", + "quantity": "數量", + "pnl": "盈虧", + "noOpen": "暫無持倉", + "noOpenDesc": "開倉後將在此處顯示持倉" + }, + "create": { + "title": "新增交易策略", + "steps": { + "aiModels": "AI 模型", + "exchanges": "交易所", + "tradingStrategy": "交易策略" + }, + "error": "建立策略失敗" + }, + "form": { + "strategyType": { + "label": "策略類型", + "promptBased": "Prompt 策略", + "grid": "網格策略" + }, + "strategyName": { + "label": "策略名稱", + "placeholder": "輸入策略名稱" + }, + "initialCapital": { + "label": "初始資金", + "placeholder": "輸入初始資金" + }, + "maxLeverage": { + "label": "最大槓桿", + "placeholder": "最大槓桿" + }, + "decideInterval": { + "label": "決策間隔 (秒)", + "placeholder": "例如: 300" + }, + "tradingSymbols": { + "label": "交易對", + "placeholder": "選擇交易對...", + "searchPlaceholder": "搜尋或添加交易對...", + "emptyText": "未找到交易對。" + }, + "promptTemplate": { + "label": "系統 Prompt 模板", + "new": "新建 Prompt", + "view": "查看策略" + }, + "aiModels": { + "platform": "模型平台", + "model": "選擇模型", + "noModels": "暫無可用模型", + "apiKey": { + "label": "API Key", + "placeholder": "輸入 API Key" + } + }, + "exchanges": { + "transactionType": "交易類型", + "liveTrading": "實盤交易", + "virtualTrading": "模擬交易", + "selectExchange": "選擇交易所", + "walletAddress": "錢包地址", + "privateKey": "私鑰", + "apiKey": "API Key", + "secretKey": "Secret Key", + "passphrase": "Passphrase", + "testConnection": "測試連接", + "test": { + "success": "連接成功!", + "failed": "連接失敗。請檢查您的 API Key, Secret Key 或 Passphrase。" + }, + "placeholder": { + "binance": { + "apiKey": "輸入 API Key (64 字元)", + "secretKey": "輸入 Secret Key (64 字元)" + }, + "okx": { + "apiKey": "輸入 API Key (格式: xxxxxxxx-xxxx-...)", + "secretKey": "輸入 Secret Key (32 大寫字母和數字)", + "passphrase": "輸入 Passphrase (API 創建時設置)" + }, + "gate": { + "apiKey": "輸入 API Key (以 'key_' 開頭)", + "secretKey": "輸入 Secret Key (64 字元)" + }, + "hyperliquid": { + "walletAddress": "輸入錢包地址 (以 '0x' 開頭)", + "privateKey": "輸入私鑰 (64 字元)" + }, + "blockchain": { + "apiKey": "輸入 API Key (格式: xxxxxxxx-xxxx-...)", + "secretKey": "輸入 Secret Key" + }, + "coinbase": { + "apiKey": "輸入 API Key (或 Key Name)", + "secretKey": "輸入 API Secret (或 Private Key)", + "passphrase": "輸入 Passphrase (Legacy Pro API 需要)" + }, + "mexc": { + "apiKey": "輸入 Access Key (以 'mx0' 開頭)", + "secretKey": "輸入 Secret Key (通常 32 字元)" + }, + "default": { + "apiKey": "在此貼上 API Key", + "secretKey": "在此貼上 Secret Key", + "passphrase": "輸入 Passphrase", + "walletAddress": "輸入錢包地址", + "privateKey": "輸入私鑰" + } + } + } + }, + "prompt": { + "delete": { + "title": "刪除策略 Prompt", + "description": "您確定要刪除此策略 Prompt 嗎?此操作無法撤消,並將從系統中永久刪除該 Prompt。" + } + }, + "detail": { + "title": "策略詳情", + "loading": "載入詳情中...", + "returnRate": "回報率", + "strategyType": "策略類型", + "modelProvider": "模型供應商", + "modelId": "模型 ID", + "initialCapital": "初始資金", + "maxLeverage": "最大槓桿", + "tradingSymbols": "交易對", + "prompt": "Prompt" + }, + "history": { + "title": "交易歷史", + "live": "實盤交易", + "virtual": "模擬交易", + "cycle": "週期 #{{index}}", + "aiReasoning": "AI 推理邏輯", + "operation": "執行操作", + "empty": { + "title": "暫無交易歷史", + "desc": "您完成的交易將顯示在這裡" + }, + "details": { + "time": "時間", + "price": "價格", + "quantity": "數量", + "holdingTime": "持倉時間", + "tradingFee": "交易費用", + "reasoning": "推理" + } + } + }, + "rank": { + "title": "收益排行榜", + "days": { + "7": "7天", + "30": "1月" + }, + "table": { + "rank": "排名", + "user": "用戶", + "pnl": "盈虧", + "strategy": "策略", + "exchange": "交易所", + "model": "模型", + "details": "詳情", + "loading": "載入中..." + } + }, + "home": { + "hello": "👋 您好,投資者!", + "welcome": "👋 歡迎來到 ValueCell !", + "watchlist": "我的自選股", + "stock": { + "loading": "正在載入股票數據...", + "error": "載入股票數據失敗: {{message}}", + "remove": "移除", + "removing": "移除中...", + "add": "新增股票", + "about": "簡介", + "sector": "板塊:", + "industry": "行業:", + "website": "官網:", + "chart": { + "24h": "24小時", + "7d": "7天", + "30d": "30天" + } + }, + "search": { + "title": "搜尋股票", + "placeholder": "搜尋股票名稱或代碼", + "searching": "搜尋中...", + "noResults": "未找到相關股票", + "action": { + "watch": "關注", + "watching": "關注中...", + "watched": "已關注" + } + }, + "suggestions": { + "research": { + "title": "深度研究", + "description": "分析 SEC 文件,生成深度股票解讀報告。" + }, + "strategy": { + "title": "自動交易", + "description": "多策略智能交易,自動執行您的策略" + }, + "news": { + "title": "新聞推送", + "description": "按自定義時間表推送個性化新聞更新" + } + } + } +} diff --git a/frontend/src/api/agent.ts b/frontend/src/api/agent.ts index 54d9278f8..bf7efc191 100644 --- a/frontend/src/api/agent.ts +++ b/frontend/src/api/agent.ts @@ -2,11 +2,17 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { VALUECELL_AGENT } from "@/constants/agent"; import { API_QUERY_KEYS } from "@/constants/api"; import { type ApiResponse, apiClient } from "@/lib/api-client"; +import { useLanguage } from "@/store/settings-store"; import type { AgentInfo } from "@/types/agent"; export const useGetAgentInfo = (params: { agentName: string }) => { + const language = useLanguage(); + return useQuery({ - queryKey: API_QUERY_KEYS.AGENT.agentInfo(Object.values(params)), + queryKey: API_QUERY_KEYS.AGENT.agentInfo([ + ...Object.values(params), + language, + ]), queryFn: async () => { // Return hardcoded data for ValueCellAgent if (params.agentName === "ValueCellAgent") { @@ -14,7 +20,7 @@ export const useGetAgentInfo = (params: { agentName: string }) => { } // Fetch from API for other agents return apiClient.get>( - `/agents/by-name/${params.agentName}`, + `/agents/by-name/${params.agentName}?language=${language}`, ); }, select: (data) => data.data, @@ -24,11 +30,16 @@ export const useGetAgentInfo = (params: { agentName: string }) => { export const useGetAgentList = ( params: { enabled_only: string } = { enabled_only: "false" }, ) => { + const language = useLanguage(); + return useQuery({ - queryKey: API_QUERY_KEYS.AGENT.agentList(Object.values(params)), + queryKey: API_QUERY_KEYS.AGENT.agentList([ + ...Object.values(params), + language, + ]), queryFn: () => apiClient.get>( - `/agents/?enabled_only=${params.enabled_only}`, + `/agents/?enabled_only=${params.enabled_only}&language=${language}`, ), select: (data) => data.data.agents, }); diff --git a/frontend/src/api/setting.ts b/frontend/src/api/setting.ts index fc179de5a..443b8de8c 100644 --- a/frontend/src/api/setting.ts +++ b/frontend/src/api/setting.ts @@ -228,7 +228,7 @@ export const useGetSortedModelProviders = () => { const bHasKey = apiKeyMap.get(b.provider) ?? false; if (aHasKey && !bHasKey) return -1; if (!aHasKey && bHasKey) return 1; - return 0; + return a.provider.localeCompare(b.provider); }); })(); diff --git a/frontend/src/api/stock.ts b/frontend/src/api/stock.ts index 1e615b942..42321f29f 100644 --- a/frontend/src/api/stock.ts +++ b/frontend/src/api/stock.ts @@ -1,10 +1,7 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { - API_QUERY_KEYS, - USER_LANGUAGE, - VALUECELL_BACKEND_URL, -} from "@/constants/api"; +import { API_QUERY_KEYS, VALUECELL_BACKEND_URL } from "@/constants/api"; import { type ApiResponse, apiClient } from "@/lib/api-client"; +import { useLanguage } from "@/store/settings-store"; import { useSystemStore } from "@/store/system-store"; import type { Stock, @@ -22,17 +19,20 @@ export const useGetWatchlist = () => select: (data) => data.data, }); -export const useGetStocksList = (params: { query: string }) => - useQuery({ - queryKey: API_QUERY_KEYS.STOCK.stockSearch(Object.values(params)), +export const useGetStocksList = (params: { query: string }) => { + const language = useLanguage(); + + return useQuery({ + queryKey: API_QUERY_KEYS.STOCK.stockSearch([params.query, language]), queryFn: ({ signal }) => apiClient.get>( - `watchlist/asset/search?q=${params.query}&language=${USER_LANGUAGE}`, + `watchlist/asset/search?q=${params.query}&language=${language}`, { signal }, ), select: (data) => data.data.results, enabled: !!params.query, }); +}; export const useAddStockToWatchlist = () => { const queryClient = useQueryClient(); diff --git a/frontend/src/api/system.ts b/frontend/src/api/system.ts index e3d8c9bd1..bcdde1d7f 100644 --- a/frontend/src/api/system.ts +++ b/frontend/src/api/system.ts @@ -2,6 +2,7 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { API_QUERY_KEYS, VALUECELL_BACKEND_URL } from "@/constants/api"; import { type ApiResponse, apiClient } from "@/lib/api-client"; +import { useLanguage } from "@/store/settings-store"; import { useSystemStore } from "@/store/system-store"; import type { StrategyDetail, @@ -68,22 +69,29 @@ export const useSignOut = () => { export const useGetStrategyList = ( params: { limit: number; days: number } = { limit: 10, days: 7 }, ) => { + const language = useLanguage(); + return useQuery({ - queryKey: API_QUERY_KEYS.SYSTEM.strategyList(Object.values(params)), + queryKey: API_QUERY_KEYS.SYSTEM.strategyList([ + ...Object.values(params), + language, + ]), queryFn: () => apiClient.get>( - `${VALUECELL_BACKEND_URL}/strategy/list?limit=${params.limit}&days=${params.days}`, + `${VALUECELL_BACKEND_URL}/strategy/list?limit=${params.limit}&days=${params.days}&language=${language}`, ), select: (data) => data.data, }); }; export const useGetStrategyDetail = (id: number | null) => { + const language = useLanguage(); + return useQuery({ - queryKey: API_QUERY_KEYS.SYSTEM.strategyDetail([id ?? ""]), + queryKey: API_QUERY_KEYS.SYSTEM.strategyDetail([id ?? "", language]), queryFn: () => apiClient.get>( - `${VALUECELL_BACKEND_URL}/strategy/detail/${id}`, + `${VALUECELL_BACKEND_URL}/strategy/detail/${id}?language=${language}`, ), select: (data) => data.data, enabled: !!id, @@ -122,15 +130,21 @@ export const usePublishStrategy = () => { * @param region - Optional region override for testing (e.g., "cn" or "default"). * In development, you can set this to test different regions. */ -export const useGetDefaultTickers = (region?: string) => - useQuery({ - queryKey: ["system", "default-tickers", region], +export const useGetDefaultTickers = (region?: string) => { + const language = useLanguage(); + + return useQuery({ + queryKey: ["system", "default-tickers", region, language], queryFn: () => { - const params = region ? `?region=${region}` : ""; + const regionParam = region ? `region=${region}` : ""; + const langParam = `language=${language}`; + const params = [regionParam, langParam].filter(Boolean).join("&"); + return apiClient.get>( - `system/default-tickers${params}`, + `system/default-tickers?${params}`, ); }, select: (data) => data.data, staleTime: 1000 * 60 * 60, // Cache for 1 hour, region doesn't change frequently }); +}; diff --git a/frontend/src/app/agent/components/agent-view/common-agent-area.tsx b/frontend/src/app/agent/components/agent-view/common-agent-area.tsx index 9881b48a8..cd262d04c 100644 --- a/frontend/src/app/agent/components/agent-view/common-agent-area.tsx +++ b/frontend/src/app/agent/components/agent-view/common-agent-area.tsx @@ -1,5 +1,6 @@ import { useQueryClient } from "@tanstack/react-query"; import { type FC, memo, useCallback, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; import { Navigate, useLocation, @@ -42,6 +43,7 @@ interface CommonAgentAreaProps { } const CommonAgentAreaContent: FC = ({ agentName }) => { + const { t } = useTranslation(); const { data: agent, isLoading: isLoadingAgent } = useGetAgentInfo({ agentName: agentName ?? "", }); @@ -208,7 +210,7 @@ const CommonAgentAreaContent: FC = ({ agentName }) => { <> = ({ agentName }) => { value={inputValue} onChange={handleInputChange} onSend={handleSendMessage} - placeholder="Type your message..." + placeholder={t("chat.input.placeholder")} disabled={isStreaming} variant="chat" /> diff --git a/frontend/src/app/agent/components/agent-view/strategy-agent-area.tsx b/frontend/src/app/agent/components/agent-view/strategy-agent-area.tsx index bc4371f4b..9cf09f962 100644 --- a/frontend/src/app/agent/components/agent-view/strategy-agent-area.tsx +++ b/frontend/src/app/agent/components/agent-view/strategy-agent-area.tsx @@ -1,5 +1,6 @@ import { Plus } from "lucide-react"; import { type FC, useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; import { useDeleteStrategy, useGetStrategyDetails, @@ -34,6 +35,7 @@ const EmptyIllustration = () => ( ); const StrategyAgentArea: FC = () => { + const { t } = useTranslation(); const { data: strategies = [], isLoading: isLoadingStrategies } = useGetStrategyList(); const [selectedStrategy, setSelectedStrategy] = useState( @@ -80,7 +82,7 @@ const StrategyAgentArea: FC = () => {
{/* Left section: Strategy list */}
-

Trading Strategies

+

{t("strategy.title")}

{strategies && strategies.length > 0 ? ( = () => { ) : (
-
-

No trading strategies

-

Create your first trading strategy

+

{t("strategy.noStrategies")}

+

{t("strategy.createFirst")}

@@ -109,7 +110,7 @@ const StrategyAgentArea: FC = () => { className="w-full gap-3 rounded-lg py-4 text-base" > - Add trading strategy + {t("strategy.add")}
@@ -135,7 +136,7 @@ const StrategyAgentArea: FC = () => {

- No running strategies + {t("strategy.noStrategies")}

)} diff --git a/frontend/src/app/agent/components/chat-conversation/chat-conversation-header.tsx b/frontend/src/app/agent/components/chat-conversation/chat-conversation-header.tsx index d5582e148..03398376f 100644 --- a/frontend/src/app/agent/components/chat-conversation/chat-conversation-header.tsx +++ b/frontend/src/app/agent/components/chat-conversation/chat-conversation-header.tsx @@ -1,5 +1,6 @@ import { MessageCircle, Settings } from "lucide-react"; import { type FC, memo } from "react"; +import { useTranslation } from "react-i18next"; import { Link } from "react-router"; import { Button } from "@/components/ui/button"; import { @@ -16,6 +17,7 @@ interface ChatConversationHeaderProps { } const ChatConversationHeader: FC = ({ agent }) => { + const { t } = useTranslation(); return (
@@ -44,7 +46,7 @@ const ChatConversationHeader: FC = ({ agent }) => { - New Conversation + {t("chat.newConversation")} @@ -58,7 +60,7 @@ const ChatConversationHeader: FC = ({ agent }) => { - Settings + {t("chat.settings")}
diff --git a/frontend/src/app/agent/components/chat-conversation/chat-input-area.tsx b/frontend/src/app/agent/components/chat-conversation/chat-input-area.tsx index 4b8f43a70..4b86e9cc6 100644 --- a/frontend/src/app/agent/components/chat-conversation/chat-input-area.tsx +++ b/frontend/src/app/agent/components/chat-conversation/chat-input-area.tsx @@ -1,5 +1,6 @@ import { ArrowUp } from "lucide-react"; import { type FC, memo } from "react"; +import { useTranslation } from "react-i18next"; import { Button } from "@/components/ui/button"; import ScrollTextarea from "@/components/valuecell/scroll/scroll-textarea"; import { cn } from "@/lib/utils"; @@ -20,11 +21,14 @@ const ChatInputArea: FC = ({ onChange, onSend, onKeyDown, - placeholder = "Type your message...", + placeholder, disabled = false, className, variant = "chat", }) => { + const { t } = useTranslation(); + const resolvedPlaceholder = placeholder ?? t("chat.input.placeholder"); + const handleKeyDown = async (e: React.KeyboardEvent) => { // Send message on Enter key (excluding Shift+Enter line breaks and IME composition state) if (e.key === "Enter" && !e.shiftKey && !e.nativeEvent.isComposing) { @@ -56,7 +60,7 @@ const ChatInputArea: FC = ({ value={value} onInput={(e) => onChange(e.currentTarget.value)} onKeyDown={handleKeyDown} - placeholder={placeholder} + placeholder={resolvedPlaceholder} maxHeight={120} minHeight={24} disabled={disabled} diff --git a/frontend/src/app/agent/components/strategy-items/modals/create-strategy-modal.tsx b/frontend/src/app/agent/components/strategy-items/modals/create-strategy-modal.tsx index def7ed8f3..40542004f 100644 --- a/frontend/src/app/agent/components/strategy-items/modals/create-strategy-modal.tsx +++ b/frontend/src/app/agent/components/strategy-items/modals/create-strategy-modal.tsx @@ -2,6 +2,7 @@ import { useStore } from "@tanstack/react-form"; import { AlertCircleIcon } from "lucide-react"; import type { FC, RefObject } from "react"; import { memo, useImperativeHandle, useState } from "react"; +import { useTranslation } from "react-i18next"; import { useGetModelProviderDetail } from "@/api/setting"; import { useCreateStrategy, @@ -44,20 +45,21 @@ interface CreateStrategyModalProps { ref?: RefObject; } -const STEPS = [ - { step: 1, title: "AI Models" }, - { step: 2, title: "Exchanges" }, - { step: 3, title: "Trading strategy" }, -]; - const CreateStrategyModal: FC = ({ ref, children, }) => { + const { t } = useTranslation(); const [open, setOpen] = useState(false); const [currentStep, setCurrentStep] = useState(1); const [error, setError] = useState(null); + const STEPS = [ + { step: 1, title: t("strategy.create.steps.aiModels") }, + { step: 2, title: t("strategy.create.steps.exchanges") }, + { step: 3, title: t("strategy.create.steps.tradingStrategy") }, + ]; + const { data: prompts = [] } = useGetStrategyPrompts(); const { data: strategies = [] } = useGetStrategyList(); const { mutateAsync: createStrategy, isPending: isCreatingStrategy } = @@ -191,7 +193,9 @@ const CreateStrategyModal: FC = ({ >
-

Add trading strategy

+

+ {t("strategy.create.title")} +

@@ -220,7 +224,7 @@ const CreateStrategyModal: FC = ({ {error && ( - Error Creating Strategy + {t("strategy.create.error")} {error} )} @@ -232,7 +236,9 @@ const CreateStrategyModal: FC = ({ onClick={currentStep === 1 ? resetAll : handleBack} className="border-gray-100 py-4 font-semibold text-base" > - {currentStep === 1 ? "Cancel" : "Back"} + {currentStep === 1 + ? t("strategy.action.cancel") + : t("strategy.action.back")}
diff --git a/frontend/src/app/agent/components/strategy-items/modals/strategy-detail-modal.tsx b/frontend/src/app/agent/components/strategy-items/modals/strategy-detail-modal.tsx index 8756edc5a..8e6c42d57 100644 --- a/frontend/src/app/agent/components/strategy-items/modals/strategy-detail-modal.tsx +++ b/frontend/src/app/agent/components/strategy-items/modals/strategy-detail-modal.tsx @@ -6,6 +6,7 @@ import { useRef, useState, } from "react"; +import { useTranslation } from "react-i18next"; import { useStrategyPerformance } from "@/api/strategy"; import { ValueCellAgentPng } from "@/assets/png"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; @@ -32,6 +33,7 @@ interface StrategyDetailModalProps { } const StrategyDetailModal: FC = ({ ref }) => { + const { t } = useTranslation(); const stockColors = useStockColors(); const [open, setOpen] = useState(false); const [strategyId, setStrategyId] = useState(null); @@ -64,11 +66,13 @@ const StrategyDetailModal: FC = ({ ref }) => { aria-describedby={undefined} > - Strategy Details + {t("strategy.detail.title")}
{isLoadingStrategyDetail || !strategyDetail ? ( -
Loading details...
+
+ {t("strategy.detail.loading")} +
) : (
@@ -94,34 +98,43 @@ const StrategyDetailModal: FC = ({ ref }) => { > {numberFixed(strategyDetail.return_rate_pct, 2)}%
-
Return Rate
+
+ {t("strategy.detail.returnRate")} +
-

Strategy Type

- {strategyDetail.strategy_type} +

{t("strategy.detail.strategyType")}

+ + {t(`strategy.types.${strategyDetail.strategy_type}`)} + -

Model Provider

- {strategyDetail.llm_provider} +

{t("strategy.detail.modelProvider")}

+ + {t(`strategy.providers.${strategyDetail.llm_provider}`) || + strategyDetail.llm_provider} + -

Model ID

+

{t("strategy.detail.modelId")}

{strategyDetail.llm_model_id} -

Initial Capital

+

{t("strategy.detail.initialCapital")}

{strategyDetail.initial_capital} -

Max Leverage

+

{t("strategy.detail.maxLeverage")}

{strategyDetail.max_leverage}x -

Trading Symbols

+

{t("strategy.detail.tradingSymbols")}

{strategyDetail.symbols.join(", ")}
- Prompt + + {t("strategy.detail.prompt")} +

{strategyDetail.prompt}

@@ -163,7 +176,7 @@ const StrategyDetailModal: FC = ({ ref }) => { }); }} > - Duplicate + {t("strategy.action.duplicate")} diff --git a/frontend/src/app/agent/components/strategy-items/portfolio-positions-group.tsx b/frontend/src/app/agent/components/strategy-items/portfolio-positions-group.tsx index 41b7109d3..2ee02c0de 100644 --- a/frontend/src/app/agent/components/strategy-items/portfolio-positions-group.tsx +++ b/frontend/src/app/agent/components/strategy-items/portfolio-positions-group.tsx @@ -1,5 +1,6 @@ import { LineChart, Wallet } from "lucide-react"; import { type FC, memo, useRef } from "react"; +import { useTranslation } from "react-i18next"; import { useStrategyPerformance } from "@/api/strategy"; import { usePublishStrategy } from "@/api/system"; import { ValueCellAgentPng } from "@/assets/png"; @@ -101,6 +102,7 @@ const PortfolioPositionsGroup: FC = ({ positions, strategy, }) => { + const { t } = useTranslation(); const sharePortfolioModalRef = useRef(null); const stockColors = useStockColors(); @@ -149,19 +151,21 @@ const PortfolioPositionsGroup: FC = ({

- Portfolio Value History + {t("strategy.portfolio.title")}

{isTauriApp && (isLogin ? ( - Share to Social + {" "} + {t("strategy.action.shareToSocial")} = ({ ) : ( )}{" "} - Share to Ranking + {t("strategy.action.shareToRanking")} ) : ( ))} @@ -187,19 +192,25 @@ const PortfolioPositionsGroup: FC = ({
-

Total Equity

+

+ {t("strategy.portfolio.totalEquity")} +

{numberFixed(summary?.total_value, 4)}

-

Available Balance

+

+ {t("strategy.portfolio.availableBalance")} +

{numberFixed(summary?.cash, 4)}

-

Total P&L

+

+ {t("strategy.portfolio.totalPnl")} +

= ({

- No portfolio value data + {t("strategy.portfolio.noData")}

- Portfolio value chart will appear once trading begins + {t("strategy.portfolio.noDataDesc")}

@@ -234,25 +245,37 @@ const PortfolioPositionsGroup: FC = ({ {/* Positions Section */}
-

Positions

+

+ {t("strategy.positions.title")} +

{hasPositions ? ( -

Symbol

+

+ {t("strategy.positions.symbol")} +

-

Type

+

+ {t("strategy.positions.type")} +

-

Leverage

+

+ {t("strategy.positions.leverage")} +

-

Quantity

+

+ {t("strategy.positions.quantity")} +

-

P&L

+

+ {t("strategy.positions.pnl")} +

@@ -273,10 +296,10 @@ const PortfolioPositionsGroup: FC = ({

- No open positions + {t("strategy.positions.noOpen")}

- Positions will appear here when trades are opened + {t("strategy.positions.noOpenDesc")}

diff --git a/frontend/src/app/agent/components/strategy-items/strategy-compose-list.tsx b/frontend/src/app/agent/components/strategy-items/strategy-compose-list.tsx index 8d1ca7930..705bb4f5e 100644 --- a/frontend/src/app/agent/components/strategy-items/strategy-compose-list.tsx +++ b/frontend/src/app/agent/components/strategy-items/strategy-compose-list.tsx @@ -1,5 +1,6 @@ import { ChevronDown, History } from "lucide-react"; import { type FC, memo, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; import { ValueCellAgentPng } from "@/assets/png"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; @@ -30,13 +31,14 @@ interface StrategyComposeItemProps { } const StrategyComposeItem: FC = ({ compose }) => { + const { t } = useTranslation(); const [isReasoningOpen, setIsReasoningOpen] = useState(false); return (

- {`Cycle #${compose.cycle_index}`} + {t("strategy.history.cycle", { index: compose.cycle_index })}

{TimeUtils.formatUTC(compose.created_at, TIME_FORMATS.DATETIME)} @@ -44,7 +46,9 @@ const StrategyComposeItem: FC = ({ compose }) => {
{/* AI Reasoning Logic */} -

AI reasoning logic

+

+ {t("strategy.history.aiReasoning")} +

= ({ compose }) => { {/* Perform Operation */} {compose.actions.length > 0 && ( <> -

Perform operation

+

+ {t("strategy.history.operation")} +

{compose.actions.map((action) => ( ))} @@ -79,6 +85,7 @@ const StrategyComposeItem: FC = ({ compose }) => { }; const ActionItem: FC<{ action: StrategyAction }> = ({ action }) => { + const { t } = useTranslation(); const stockColors = useStockColors(); const formatHoldingTime = (ms?: number) => { @@ -166,7 +173,7 @@ const ActionItem: FC<{ action: StrategyAction }> = ({ action }) => { {/* Data Grid */}
- Time + {t("strategy.history.details.time")} {TimeUtils.formatUTC( action.exit_at ?? action.entry_at, @@ -174,24 +181,26 @@ const ActionItem: FC<{ action: StrategyAction }> = ({ action }) => { )} - Price + {t("strategy.history.details.price")} {priceRange} - Quantity + {t("strategy.history.details.quantity")} {action.quantity} - Holding time + {t("strategy.history.details.holdingTime")} {formatHoldingTime(action.holding_time_ms)} - Trading Fee + {t("strategy.history.details.tradingFee")} {-numberFixed(action.fee_cost, 4)}
{/* Reasoning Box */}
-

Reasoning

+

+ {t("strategy.history.details.reasoning")} +

{action.rationale}

@@ -210,15 +219,18 @@ const StrategyComposeList: FC = ({ composes, tradingMode, }) => { + const { t } = useTranslation(); return (

- Trading History + {t("strategy.history.title")}

- {tradingMode === "live" ? "Live Trading" : "Virtual Trading"} + {tradingMode === "live" + ? t("strategy.history.live") + : t("strategy.history.virtual")}

@@ -237,10 +249,10 @@ const StrategyComposeList: FC = ({

- No trade history + {t("strategy.history.empty.title")}

- Your completed trades will appear here + {t("strategy.history.empty.desc")}

diff --git a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx index b6ebe96cd..16ea1b930 100644 --- a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx +++ b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx @@ -1,5 +1,6 @@ import { Copy, Eye, MoreVertical, Plus, TrendingUp } from "lucide-react"; import { type FC, memo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import { useStrategyPerformance } from "@/api/strategy"; import { DeleteStrategy, StrategyStatus } from "@/assets/svg"; import { @@ -61,6 +62,7 @@ const TradeStrategyCard: FC = ({ onStop, onDelete, }) => { + const { t } = useTranslation(); const stockColors = useStockColors(); const changeType = getChangeType(strategy.total_pnl_pct); @@ -94,11 +96,13 @@ const TradeStrategyCard: FC = ({
{strategy.strategy_type && (

- {strategy.strategy_type} + {t(`strategy.types.${strategy.strategy_type}`)}

)}

- {strategy.trading_mode === "live" ? "Live" : "Virtual"} + {strategy.trading_mode === "live" + ? t("strategy.status.live") + : t("strategy.status.virtual")}

@@ -123,7 +127,9 @@ const TradeStrategyCard: FC = ({ {strategy.status === "stopped" && strategy.stop_reason ? ( -

Stopped

+

+ {t("strategy.status.stopped")} +

{strategy.stop_reason} @@ -142,23 +148,29 @@ const TradeStrategyCard: FC = ({ )}

- {strategy.status === "running" ? "Running" : "Stopped"} + {strategy.status === "running" + ? t("strategy.status.running") + : t("strategy.status.stopped")}

- Stop Trading Strategy? + + {t("strategy.action.stop")} + - Stopping the strategy "{strategy.strategy_name}" will stop - it immediately and trigger a forced liquidation. Do you want - to proceed? + {t("strategy.action.stopDesc", { + name: strategy.strategy_name, + })} - Cancel + + {t("strategy.action.cancel")} + - Confirm Stop + {t("strategy.action.confirmStop")} @@ -178,7 +190,7 @@ const TradeStrategyCard: FC = ({ } > - Details + {t("strategy.action.details")} { @@ -215,14 +227,16 @@ const TradeStrategyCard: FC = ({ }} > - Duplicate + {t("strategy.action.duplicate")} setIsDeleting(true)}> {" "} - Delete + + {t("strategy.action.delete")} + @@ -232,17 +246,19 @@ const TradeStrategyCard: FC = ({ - Delete Strategy? + + {t("strategy.action.deleteTitle")} + - Deleting the strategy "{strategy.strategy_name}" will stop it - immediately and trigger a forced liquidation. Do you want to - proceed? + {t("strategy.action.deleteDesc", { + name: strategy.strategy_name, + })} - Cancel + {t("strategy.action.cancel")} - Confirm Delete + {t("strategy.action.confirmDelete")} @@ -261,6 +277,7 @@ const TradeStrategyGroup: FC = ({ onStrategyStop, onStrategyDelete, }) => { + const { t } = useTranslation(); const hasStrategies = strategies.length > 0; return ( @@ -288,10 +305,10 @@ const TradeStrategyGroup: FC = ({

- No trading strategies + {t("strategy.noStrategies")}

- Create your first strategy to start trading + {t("strategy.createFirst")}

@@ -305,7 +322,7 @@ const TradeStrategyGroup: FC = ({ className="w-full gap-3 rounded-lg py-4 text-base" > - Add trading strategy + {t("strategy.create.title")} diff --git a/frontend/src/app/agent/config.tsx b/frontend/src/app/agent/config.tsx index 78b983c96..b7d17598f 100644 --- a/frontend/src/app/agent/config.tsx +++ b/frontend/src/app/agent/config.tsx @@ -1,4 +1,5 @@ import { ArrowRight } from "lucide-react"; +import { useTranslation } from "react-i18next"; import { Link, Navigate, useParams } from "react-router"; import { useEnableAgent, useGetAgentInfo } from "@/api/agent"; import { Button } from "@/components/ui/button"; @@ -8,6 +9,7 @@ import { MarkdownRenderer } from "@/components/valuecell/renderer"; import type { Route } from "./+types/config"; export default function AgentConfig() { + const { t } = useTranslation(); const { agentName } = useParams(); const { data: agent, isLoading: isLoadingAgent } = useGetAgentInfo({ agentName: agentName ?? "", @@ -52,14 +54,14 @@ export default function AgentConfig() {
{agentName !== "ValueCellAgent" && ( )} - Chat + {t("agent.config.chat")}
) : ( @@ -68,7 +70,7 @@ export default function AgentConfig() { to={`/agent/${agentName}`} onClick={handleEnableAgent} > - Collect and chat + {t("agent.config.collectAndChat")} )} diff --git a/frontend/src/app/home/_layout.tsx b/frontend/src/app/home/_layout.tsx index c61c32997..50ceed701 100644 --- a/frontend/src/app/home/_layout.tsx +++ b/frontend/src/app/home/_layout.tsx @@ -1,12 +1,14 @@ import { Plus } from "lucide-react"; +import { useTranslation } from "react-i18next"; import { Outlet } from "react-router"; import { Button } from "@/components/ui/button"; import { StockList, StockSearchModal } from "./components"; export default function HomeLayout() { + const { t } = useTranslation(); return (
-

👋 Welcome to ValueCell !

+

{t("home.welcome")}

@@ -22,7 +24,7 @@ export default function HomeLayout() { className="mx-5 mb-6 font-bold text-sm hover:bg-gray-200" > - Add Stocks + {t("home.stock.add")} diff --git a/frontend/src/app/home/components/stock-history-chart.tsx b/frontend/src/app/home/components/stock-history-chart.tsx index 53dfbfc0b..de6ec7d27 100644 --- a/frontend/src/app/home/components/stock-history-chart.tsx +++ b/frontend/src/app/home/components/stock-history-chart.tsx @@ -1,4 +1,5 @@ import { useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; import { useGetStockHistory } from "@/api/stock"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import Sparkline from "@/components/valuecell/charts/sparkline"; @@ -12,18 +13,22 @@ interface StockHistoryChartProps { className?: string; } -const INTERVALS: { label: string; value: StockInterval }[] = [ - { label: "24h", value: "1m" }, - { label: "7d", value: "1h" }, - { label: "30d", value: "1d" }, -]; - export const StockHistoryChart = ({ ticker, className, }: StockHistoryChartProps) => { + const { t } = useTranslation(); const [interval, setInterval] = useState("1h"); + const INTERVALS: { label: string; value: StockInterval }[] = useMemo( + () => [ + { label: t("home.stock.chart.24h"), value: "1m" }, + { label: t("home.stock.chart.7d"), value: "1h" }, + { label: t("home.stock.chart.30d"), value: "1d" }, + ], + [t], + ); + // Calculate date range based on interval const { startDate, endDate } = useMemo(() => { const now = TimeUtils.now(); diff --git a/frontend/src/app/home/components/stock-list.tsx b/frontend/src/app/home/components/stock-list.tsx index 88708cb87..23326001f 100644 --- a/frontend/src/app/home/components/stock-list.tsx +++ b/frontend/src/app/home/components/stock-list.tsx @@ -1,4 +1,5 @@ import { memo, useMemo } from "react"; +import { useTranslation } from "react-i18next"; import { useLocation } from "react-router"; import { useGetStockPrice, useGetWatchlist } from "@/api/stock"; import { @@ -9,6 +10,7 @@ import { import type { Stock } from "@/types/stock"; function StockList() { + const { t } = useTranslation(); const { pathname } = useLocation(); const { data: stockList } = useGetWatchlist(); @@ -46,7 +48,7 @@ function StockList() { return ( - My Watchlist + {t("home.watchlist")}
{stockData?.map((stock) => ( diff --git a/frontend/src/app/home/components/stock-search-modal.tsx b/frontend/src/app/home/components/stock-search-modal.tsx index e815a6783..a5cae80bd 100644 --- a/frontend/src/app/home/components/stock-search-modal.tsx +++ b/frontend/src/app/home/components/stock-search-modal.tsx @@ -1,5 +1,6 @@ import { Plus, Search, X } from "lucide-react"; import { useState } from "react"; +import { useTranslation } from "react-i18next"; import { useAddStockToWatchlist, useGetStocksList, @@ -23,6 +24,7 @@ interface StockSearchModalProps { } const StockItem = ({ stock }: { stock: Stock }) => { + const { t } = useTranslation(); const { mutateAsync: addStockToWatchlist, isPending: isPendingAddStockToWatchlist, @@ -60,22 +62,23 @@ const StockItem = ({ stock }: { stock: Stock }) => { {isPendingAddStockToWatchlist && ( <> - Watching... + {t("home.search.action.watching")} )} {!isStockInWatchlist && ( <> - Watchlist + {t("home.search.action.watch")} )} - {isStockInWatchlist && <>Watched} + {isStockInWatchlist && <>{t("home.search.action.watched")}}
); }; export default function StockSearchModal({ children }: StockSearchModalProps) { + const { t } = useTranslation(); const [query, setQuery] = useState(""); const debouncedQuery = useDebounce(query, 300); const { data: stockList, isLoading } = useGetStocksList({ @@ -110,7 +113,7 @@ export default function StockSearchModal({ children }: StockSearchModalProps) { >
- Stock Search + {t("home.search.title")}
@@ -133,7 +136,7 @@ export default function StockSearchModal({ children }: StockSearchModalProps) {
{isLoading ? (

- Searching... + {t("home.search.searching")}

) : filteredStockList && filteredStockList.length > 0 ? (
@@ -147,7 +150,7 @@ export default function StockSearchModal({ children }: StockSearchModalProps) { stockList && filteredStockList.length === 0 && (

- No related stocks found + {t("home.search.noResults")}

) )} diff --git a/frontend/src/app/home/home.tsx b/frontend/src/app/home/home.tsx index 0615eb06d..77e5cde31 100644 --- a/frontend/src/app/home/home.tsx +++ b/frontend/src/app/home/home.tsx @@ -1,8 +1,12 @@ import { useState } from "react"; +import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router"; import { useAllPollTaskList } from "@/api/conversation"; +import { IconGroupPng, MessageGroupPng, TrendPng } from "@/assets/png"; +import { AutoTrade, NewsPush, ResearchReport } from "@/assets/svg"; import TradingViewTickerTape from "@/components/tradingview/tradingview-ticker-tape"; -import { agentSuggestions } from "@/mock/agent-data"; +import SvgIcon from "@/components/valuecell/icon/svg-icon"; +import { getTradingViewLocale } from "@/lib/utils"; import ChatInputArea from "../agent/components/chat-conversation/chat-input-area"; import { AgentSuggestionsList, AgentTaskCards } from "./components"; @@ -17,6 +21,7 @@ const INDEX_SYMBOLS = [ ]; function Home() { + const { t, i18n } = useTranslation(); const navigate = useNavigate(); const [inputValue, setInputValue] = useState(""); @@ -26,11 +31,44 @@ function Home() { navigate(`/agent/${agentId}`); }; + const suggestions = [ + { + id: "ResearchAgent", + title: t("home.suggestions.research.title"), + icon: , + description: t("home.suggestions.research.description"), + bgColor: + "bg-gradient-to-r from-[#FFFFFF]/70 from-[5.05%] to-[#E7EFFF]/70 to-[100%]", + decorativeGraphics: IconGroup, + }, + { + id: "StrategyAgent", + title: t("home.suggestions.strategy.title"), + icon: , + description: t("home.suggestions.strategy.description"), + bgColor: + "bg-gradient-to-r from-[#FFFFFF]/70 from-[5.05%] to-[#EAE8FF]/70 to-[100%]", + decorativeGraphics: Trend, + }, + { + id: "NewsAgent", + title: t("home.suggestions.news.title"), + icon: , + description: t("home.suggestions.news.description"), + bgColor: + "bg-gradient-to-r from-[#FFFFFF]/70 from-[5.05%] to-[#FFE7FD]/70 to-[100%]", + decorativeGraphics: MessageGroup, + }, + ]; + return (
{allPollTaskList && allPollTaskList.length > 0 ? (
- +
@@ -50,10 +88,13 @@ function Home() {
) : (
- +

- 👋 Hello Investor! + {t("home.hello")}

({ + suggestions={suggestions.map((suggestion) => ({ ...suggestion, onClick: () => handleAgentClick(suggestion.id), }))} diff --git a/frontend/src/app/home/stock.tsx b/frontend/src/app/home/stock.tsx index 07861b92c..3a6c748db 100644 --- a/frontend/src/app/home/stock.tsx +++ b/frontend/src/app/home/stock.tsx @@ -1,14 +1,17 @@ import BackButton from "@valuecell/button/back-button"; import { memo } from "react"; +import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router"; import { useGetStockDetail, useRemoveStockFromWatchlist } from "@/api/stock"; import TradingViewAdvancedChart from "@/components/tradingview/tradingview-advanced-chart"; import { Button } from "@/components/ui/button"; import LinkButton from "@/components/valuecell/button/link-button"; +import { getTradingViewLocale } from "@/lib/utils"; import { useIsLoggedIn } from "@/store/system-store"; import type { Route } from "./+types/stock"; function Stock() { + const { t, i18n } = useTranslation(); const { stockId } = useParams(); const navigate = useNavigate(); // Use stockId as ticker to fetch real data from API @@ -41,7 +44,7 @@ function Stock() { if (isDetailLoading) { return (
-
Loading stock data...
+
{t("home.stock.loading")}
); } @@ -51,7 +54,7 @@ function Stock() { return (
- Error loading stock data: {detailError?.message} + {t("home.stock.error", { message: detailError?.message })}
); @@ -71,7 +74,9 @@ function Stock() { onClick={handleRemoveStock} disabled={isRemovingStock} > - {isRemovingStock ? "Removing..." : "Remove"} + {isRemovingStock + ? t("home.stock.removing") + : t("home.stock.remove")}
@@ -84,14 +89,14 @@ function Stock() { interval="D" minHeight={420} theme="light" - locale="en" + locale={getTradingViewLocale(i18n.language)} timezone="UTC" /> {/* )} */}
-

About

+

{t("home.stock.about")}

{stockDetailData?.properties.business_summary && (

@@ -102,20 +107,26 @@ function Stock() { {stockDetailData?.properties && (

- Sector: + + {t("home.stock.sector")} + {stockDetailData.properties.sector}
- Industry: + + {t("home.stock.industry")} + {stockDetailData.properties.industry}
{stockDetailData.properties.website && (
- Website: + + {t("home.stock.website")} + {/* Page Title */}

- Agent Market + {t("market.title")}

{/* Agent Cards Grid */} diff --git a/frontend/src/app/rank/board.tsx b/frontend/src/app/rank/board.tsx index 2be62975d..1f8b2b991 100644 --- a/frontend/src/app/rank/board.tsx +++ b/frontend/src/app/rank/board.tsx @@ -1,5 +1,6 @@ import { Eye } from "lucide-react"; import { useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; import { useGetStrategyList } from "@/api/system"; import { ValueCellAgentPng } from "@/assets/png"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; @@ -25,6 +26,7 @@ import StrategyRemoteModal, { } from "./components/strategy-remote-modal"; export default function RankBoard() { + const { t } = useTranslation(); const [days, setDays] = useState(7); const strategyRemoteModalRef = useRef(null); @@ -50,16 +52,14 @@ export default function RankBoard() {
- - Profit Leaderboard - + {t("rank.title")} setDays(Number(val))} > - 7D - 1M + {t("rank.days.7")} + {t("rank.days.30")} @@ -68,20 +68,22 @@ export default function RankBoard() {
- Rank - User - P&L - Strategy - Exchange - Model - Details + + {t("rank.table.rank")} + + {t("rank.table.user")} + {t("rank.table.pnl")} + {t("rank.table.strategy")} + {t("rank.table.exchange")} + {t("rank.table.model")} + {t("rank.table.details")} {isLoading ? ( - Loading... + {t("rank.table.loading")} ) : ( @@ -117,7 +119,9 @@ export default function RankBoard() { {numberFixed(strategy.return_rate_pct, 2)}% - {strategy.strategy_type} + + {t(`strategy.types.${strategy.strategy_type}`)} + - View + {t("agent.action.view")} diff --git a/frontend/src/app/rank/components/strategy-remote-modal.tsx b/frontend/src/app/rank/components/strategy-remote-modal.tsx index ee866b0f2..643040725 100644 --- a/frontend/src/app/rank/components/strategy-remote-modal.tsx +++ b/frontend/src/app/rank/components/strategy-remote-modal.tsx @@ -5,6 +5,7 @@ import { useRef, useState, } from "react"; +import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router"; import { useGetStrategyDetail } from "@/api/system"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; @@ -30,6 +31,7 @@ interface StrategyRemoteModalProps { } const StrategyRemoteModal: FC = ({ ref }) => { + const { t } = useTranslation(); const stockColors = useStockColors(); const navigate = useNavigate(); @@ -53,11 +55,13 @@ const StrategyRemoteModal: FC = ({ ref }) => { aria-describedby={undefined} > - Strategy Details + {t("strategy.detail.title")}
{isLoadingStrategyDetail || !strategyDetail ? ( -
Loading details...
+
+ {t("strategy.detail.loading")} +
) : (
@@ -81,34 +85,43 @@ const StrategyRemoteModal: FC = ({ ref }) => { > {numberFixed(strategyDetail.return_rate_pct, 2)}%
-
Return Rate
+
+ {t("strategy.detail.returnRate")} +
-

Strategy Type

- {strategyDetail.strategy_type} +

{t("strategy.detail.strategyType")}

+ + {t(`strategy.types.${strategyDetail.strategy_type}`)} + -

Model Provider

- {strategyDetail.llm_provider} +

{t("strategy.detail.modelProvider")}

+ + {t(`strategy.providers.${strategyDetail.llm_provider}`) || + strategyDetail.llm_provider} + -

Model ID

+

{t("strategy.detail.modelId")}

{strategyDetail.llm_model_id} -

Initial Capital

+

{t("strategy.detail.initialCapital")}

{strategyDetail.initial_capital} -

Max Leverage

+

{t("strategy.detail.maxLeverage")}

{strategyDetail.max_leverage}x -

Trading Symbols

+

{t("strategy.detail.tradingSymbols")}

{strategyDetail.symbols.join(", ")}
- Prompt + + {t("strategy.detail.prompt")} +

{strategyDetail.prompt}

@@ -120,7 +133,7 @@ const StrategyRemoteModal: FC = ({ ref }) => { diff --git a/frontend/src/app/setting/_layout.tsx b/frontend/src/app/setting/_layout.tsx index c81e83aaf..51b350009 100644 --- a/frontend/src/app/setting/_layout.tsx +++ b/frontend/src/app/setting/_layout.tsx @@ -1,4 +1,5 @@ import { Brain, Cpu, Settings } from "lucide-react"; +import { useTranslation } from "react-i18next"; import { NavLink, Outlet, useLocation } from "react-router"; import { Item, @@ -9,48 +10,39 @@ import { } from "@/components/ui/item"; import { cn } from "@/lib/utils"; -const settingNavItems = [ - { - id: "models", - icon: Cpu, - label: "Models", - path: "/setting", - }, - { - id: "general", - icon: Settings, - label: "General", - path: "/setting/general", - }, - { - id: "memory", - icon: Brain, - label: "Memory", - path: "/setting/memory", - }, - // { - // id: "language", - // icon: Globe, - // label: "Language", - // path: "/setting/language", - // }, - // { - // id: "about", - // icon: Info, - // label: "About us", - // path: "/setting/about", - // }, -]; - export default function SettingLayout() { + const { t } = useTranslation(); const location = useLocation(); + const settingNavItems = [ + { + id: "models", + icon: Cpu, + label: t("settings.nav.models"), + path: "/setting", + }, + { + id: "general", + icon: Settings, + label: t("settings.nav.general"), + path: "/setting/general", + }, + { + id: "memory", + icon: Brain, + label: t("settings.nav.memory"), + path: "/setting/memory", + }, + ]; + return (
{/* Left navigation */}