diff --git a/package-lock.json b/package-lock.json index 170a7d3..961a223 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@vueuse/core": "^10.9.0", "ansi_up": "^6.0.2", - "element-plus": "^2.7.3", + "element-plus": "^2.8.1", "mitt": "^3.0.1", "pinia": "^2.1.7", "vue": "^3.4.21", @@ -979,31 +979,29 @@ } }, "node_modules/@volar/language-core": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.1.4.tgz", - "integrity": "sha512-ROfPepDxZ5Eq+Unbx3M9QcHT7MoE9tYdbkuzLTtxG5rfkEi5RwsDPncjANMOq/gHhIIDlWgqWwS2nXWMGsuj4w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0.tgz", + "integrity": "sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==", "dev": true, "dependencies": { - "@volar/source-map": "2.1.4" + "@volar/source-map": "2.4.0" } }, "node_modules/@volar/source-map": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.1.4.tgz", - "integrity": "sha512-mCg8IiPZmHZVzqL4Owg+BzQ5ZTG1cVwATxrkrFPZpcAin97Xa3MbchxVhHtHTWTT8ER8bJh5xVjeVxsSN++FUA==", - "dev": true, - "dependencies": { - "muggle-string": "^0.4.0" - } + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0.tgz", + "integrity": "sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==", + "dev": true }, "node_modules/@volar/typescript": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.1.4.tgz", - "integrity": "sha512-Mt7wOLPkomFnUfVpb5IHlPhSpD7FJAn+FHSsovePmqFNQzFLz16wrpHjAkorPiAnP0847w71NL5fIJyWbAsR8Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0.tgz", + "integrity": "sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==", "dev": true, "dependencies": { - "@volar/language-core": "2.1.4", - "path-browserify": "^1.0.1" + "@volar/language-core": "2.4.0", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { @@ -1052,6 +1050,16 @@ "@vue/shared": "3.4.21" } }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, "node_modules/@vue/devtools-api": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", @@ -1096,18 +1104,19 @@ } }, "node_modules/@vue/language-core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.7.tgz", - "integrity": "sha512-Vh1yZX3XmYjn9yYLkjU8DN6L0ceBtEcapqiyclHne8guG84IaTzqtvizZB1Yfxm3h6m7EIvjerLO5fvOZO6IIQ==", + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz", + "integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==", "dev": true, "dependencies": { - "@volar/language-core": "~2.1.3", + "@volar/language-core": "~2.4.0-alpha.18", "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" @@ -1977,9 +1986,9 @@ "dev": true }, "node_modules/element-plus": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.3.tgz", - "integrity": "sha512-OaqY1kQ2xzNyRFyge3fzM7jqMwux+464RBEqd+ybRV9xPiGxtgnj/sVK4iEbnKnzQIa9XK03DOIFzoToUhu1DA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.8.1.tgz", + "integrity": "sha512-p11/6w/O0+hGvPhiN3jrcgh+XG+eg5jZlLdQVYvcPHZYhhCh3J3YeZWW1JO/REPES1vevkboT6VAi+9wHA8Dsg==", "dependencies": { "@ctrl/tinycolor": "^3.4.1", "@element-plus/icons-vue": "^2.3.1", @@ -3249,9 +3258,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -5042,6 +5051,12 @@ "vue": ">=3.2.13" } }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, "node_modules/vue": { "version": "3.4.21", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", @@ -5132,31 +5147,21 @@ "vue": "^3.2.0" } }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/vue-tsc": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.7.tgz", - "integrity": "sha512-LYa0nInkfcDBB7y8jQ9FQ4riJTRNTdh98zK/hzt4gEpBZQmf30dPhP+odzCa+cedGz6B/guvJEd0BavZaRptjg==", + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.29.tgz", + "integrity": "sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==", "dev": true, "dependencies": { - "@volar/typescript": "~2.1.3", - "@vue/language-core": "2.0.7", + "@volar/typescript": "~2.4.0-alpha.18", + "@vue/language-core": "2.0.29", "semver": "^7.5.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" }, "peerDependencies": { - "typescript": "*" + "typescript": ">=5.0.0" } }, "node_modules/vuetify": { diff --git a/package.json b/package.json index 2a0690d..de3bf70 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "dependencies": { "@vueuse/core": "^10.9.0", "ansi_up": "^6.0.2", - "element-plus": "^2.7.3", + "element-plus": "^2.8.1", "mitt": "^3.0.1", "pinia": "^2.1.7", "vue": "^3.4.21", diff --git a/src/assets/icon/translate.svg b/src/assets/icon/translate.svg new file mode 100644 index 0000000..a8471d8 --- /dev/null +++ b/src/assets/icon/translate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/i18n.ts b/src/i18n.ts index 45a36b8..0d44ec0 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -1,19 +1,48 @@ -import { createI18n } from 'vue-i18n'; +import {createI18n} from 'vue-i18n'; import zh from '@/locales/zh' import en from '@/locales/en' +import fr from '@/locales/fr' -// const locale = localStorage.getItem('lang') || 'zh'; -export const locale = 'zh'; +const userLanguage = navigator.language || 'en'; + +// Get the language code (e.g., 'en' from 'en-US') +export const locale = userLanguage.split('-')[0]; +const messages = { + zh, + en, + fr, +} as const; + +type Locale = keyof typeof messages; + +export const availableLanguages = Object.keys(messages); + +// export const locale = 'zh'; +console.log(userLanguage, locale, availableLanguages) const i18n = createI18n({ globalInjection: true, legacy: false, locale: locale, fallbackLocale: 'zh', - messages: { - zh, - // en, - } + messages: messages }); +export function getFlagFromLang(lang: string) { + if (lang === 'zh') { + return '🇨🇳'; + } else if (lang === 'en') { + return '🇺🇸'; + } else if (lang === 'fr') { + return '🇫🇷'; + } + return '🏳️'; +} + +export function setLang(lang: string): void { + if (availableLanguages.includes(lang)) { + i18n.global.locale.value = lang as Locale; + } +} + export default i18n; diff --git a/src/locales/en.ts b/src/locales/en.ts index 9715b27..246a957 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -1,3 +1,127 @@ export default { - disconnected: "disconnected" + emoji: { + flag: "🇺🇸", + }, + disconnected: "Disconnected", + connected: "Connected", + connecting: "Connecting", + + ws: { + disconnected: "Disconnected", + connected: "Connected", + connecting: "Connecting", + }, + + page: { + home: "Home", + wifi: "Wi-Fi", + about: "About", + uart: "Uart", + feedback: "Feedback", + close: "Close", + update: "Update", + fullscreen: "Fullscreen", + windowed: "Windowed" + }, + + uart: { + port: "Port", + startCommunication: "Start Communication", + stopCommunication: "Stop Communication", + commonlyUsed: "Common", + baudrate: "Baud Rate", + customBaud: "Custom Baud", + use: "Use", + actual: "Actual", + dataBits: "Data Bits", + stopBits: "Stop Bits", + parity: "Parity", + parityNone: "None", + parityOdd: "Odd", + parityEven: "Even", + flowControl: "Flow Control", + send: "Send", + clear: "Clear", + clearTooltip: "Only clears the display area, can be restored with refresh.", + updateTooltip: "Sync with cache + filter", + autoUpdateTooltip: "Only stop refreshing the display area; the background continues to receive data.", + receive: "Receive", + + displayOptions: "Display Options", + display: "Display", + show: "Show", + text: "Text", + timestamp: "Timestamp", + enable: "Enable", + lineWrap: "Line Wrap", + highlight: "Highlight", + + frameBreakStrategy: "Frame Break Strategy", + priority: "Priority", + rule: "Rule", + ruleTips: + "

Timeout=-1: Disable timeout frame break

" + + "

Timeout=0: Immediate break, any received data is considered complete

" + + "

Match after break: Typical \\n scenario

" + + "

Match before break: For scenarios with special frame headers

" + + "

Fixed byte frame break: Useful for large data transfer, e.g., break frame every 1024 bytes for easy data viewing

", + value: "Value", + timeout: "Timeout", + match: "Match", + byte: "Byte", + begin: "b", + end: "b", + + other: "Other", + decodeAnsiEscapeCodes: "Decode ANSI Escape Codes", + ansiTooltips: + "

ANSI escape codes have many uses for terminals and text, such as changing text colors, among other effects.

\n" + + "

\n Learn more ->\n " + + "https://en.wikipedia.org/wiki/ANSI_escape_code\n

", + filter: "Filter", + textAndEscape: "Text with \\n\\x support", + autoUpdateNewData: "Auto-refresh new data", + updateFrequency: "Data Display Update Interval (ms)", + updateFrequencyTooltip: "Increasing the interval can reduce CPU usage.", + + addHeader: "Add Header", + addFooter: "Add Footer", + + passthrough: "Passthrough", + proxy: "Proxy", + serverPort: "Server Port", + connectedClient: "Connected Client", + refresh: "Refresh", + interface: "Interface", + noClientConnected: "No Client Connected", + + import: "Import", + export: "Export", + reset: "Reset", + resetTooltip: "Takes effect after refreshing the page.", + saveToLocal: "Save to Local", + saveToLocalTooltip: "If multiple pages exist, they will overwrite each other.", + add: "Add", + edit: "Edit", + drag: "Drag", + ipChangeAlert: "Changing the IP address will cause the configuration to be lost.", + + layout: "Layout", + landscape: "Landscape", + portrait: "Portrait", + responsive: "Responsive", + configPannel: "Config", + displayPannel: "Display", + macroPannel: "Quick Send", + autoScrollToBottom: "Auto Scroll", + clearScreen: "Clear", + autoUpdate: "Auto Update", + tempDisplayTooltip: "Data that does not meet the frame-break rules (e.g., not timed out) is temporarily displayed in real-time in this area. If it exceeds 8192 bytes, it will automatically break frames.", + loopSend: "Loop Send", + loopSendTooltip: "The actual frequency is affected by the interface refresh rate. For more accuracy, you can try turning off 'auto-refresh'.", + sendFormat: "Send Format", + cachedFrame: "Cached", + format: "Format", + } + }; \ No newline at end of file diff --git a/src/locales/fr.ts b/src/locales/fr.ts new file mode 100644 index 0000000..eee64ab --- /dev/null +++ b/src/locales/fr.ts @@ -0,0 +1,128 @@ +export default { + emoji: { + flag: "🇫🇷", + }, + disconnected: "Déconnecté", + connected: "Connecté", + connecting: "Connexion..", + + ws: { + disconnected: "Déconnecté", + connected: "Connecté", + connecting: "Connexion..", + }, + + page: { + home: "Accueil", + wifi: "Wi-Fi", + about: "À propos", + uart: "Uart", + feedback: "Feedback", + close: "Fermer", + update: "Mise à jour", + fullscreen: "Plein écran", + windowed: "Fenêtré", + }, + + uart: { + port: "Port", + startCommunication: "Démarrer la communication", + stopCommunication: "Arrêter la communication", + commonlyUsed: "Fréquemment utilisé", + baudrate: "Taux de Baud", + customBaud: "Baud", + use: "Utiliser", + actual: "Actuel", + dataBits: "Bits de Données", + stopBits: "Bits d'Arrêt", + parity: "Parité", + parityNone: "Aucune", + parityOdd: "Impair(Odd)", + parityEven: "Pair(Even)", + flowControl: "Contrôle de Flux", + send: "Envoyer", + clear: "Effacer", + clearTooltip: "Ne supprime que la zone d'affichage, peut être restaurée en actualisant.", + updateTooltip: "Synchroniser avec le cache + filtrer", + autoUpdateTooltip: "Arrête uniquement le rafraîchissement de la zone d'affichage ; l'arrière-plan continue de recevoir des données.", + receive: "Recevoir", + + displayOptions: "Options d'Affichage", + display: "Affichage", + show: "Afficher", + text: "Texte", + timestamp: "Horodatage", + enable: "Activer", + lineWrap: "Retour à la Ligne", + highlight: "Surligner", + + frameBreakStrategy: "Stratégie de Coupure de Trame", + priority: "Priorité", + rule: "Règle", + ruleTips: + "

Délai d'expiration=-1 : Désactiver la coupure de trame par délai d'expiration

" + + "

Délai d'expiration=0 : Coupure immédiate, toutes données reçues sont considérées complètes

" + + "

Match après coupure : Scénario typique \\n

" + + "

Match avant coupure : Pour des scénarios avec en-têtes de trame spécifiques

" + + "

Coupure de trame par octets fixes : Utile pour le transfert de grandes quantités de données, par exemple, couper la trame tous les 1024 octets pour faciliter la visualisation des données

", + value: "Valeur", + timeout: "Timeout", + match: "Match", + byte: "Byte", + begin: "b", + end: "b", + + other: "Autres", + decodeAnsiEscapeCodes: "Décode Échappement ANSI", + ansiTooltips: + "

Les codes d'échappement ANSI ont de nombreuses utilisations pour les terminaux et le texte, comme changer les couleurs du texte, entre autres effets.

" + + "

\n En savoir plus ->\n " + + "\n" + + "https://en.wikipedia.org/wiki/ANSI_escape_code\n \n

", + filter: "Filtrer", + textAndEscape: "Texte;supporte\\n\\x", + autoUpdateNewData: "Auto-update nouvelles données", + updateFrequency: "Délais rafraîchissement des Données (ms)", + updateFrequencyTooltip: "Augmenter l'intervalle peut réduire l'utilisation des ressources CPU.", + + addHeader: "Ajouter un En-tête", + addFooter: "Ajouter un Pied de page", + + passthrough: "Passage Direct", + proxy: "Proxy", + serverPort: "Port Serveur", + connectedClient: "Client Connecté", + refresh: "Rafraîchir", + interface: "Interface", + noClientConnected: "Aucun Client Connecté", + + import: "Importer", + export: "Exporter", + reset: "Réinitialiser", + resetTooltip: "Prend effet après le rafraîchissement de la page.", + saveToLocal: "Enregistrer Localement", + saveToLocalTooltip: "S'il existe plusieurs pages, elles se chevaucheront mutuellement.", + add: "Ajouter", + edit: "Éditer", + drag: "Glisser", + ipChangeAlert: "Le changement d'adresse IP entraînera la perte de la configuration.", + + layout: "Disposition", + landscape: "Paysage", + portrait: "Portrait", + responsive: "Résponsive", + configPannel: "Configuration", + displayPannel: "Données", + macroPannel: "Envoie Rapide", + autoScrollToBottom: "Auto Scroll", + clearScreen: "Effacer", + autoUpdate: "Auto Update", + tempDisplayTooltip: "es données qui ne respectent pas les règles de rupture de trame (par exemple : non expirées) s'affichent temporairement en temps réel dans cette zone. Au-delà de 8192 octets, une rupture de trame est automatique.", + loopSend: "Envoi en Boucle", + loopSendTooltip: "La fréquence réelle est influencée par le taux de rafraîchissement de l'interface. Pour plus de précision, vous pouvez essayer de désactiver 'l'actualisation automatique'.", + sendFormat: "Format d'Envoi", + cachedFrame: "Cache", + format: "Format", + } + +}; \ No newline at end of file diff --git a/src/locales/index.ts b/src/locales/index.ts index 0d4b347..7bff647 100644 --- a/src/locales/index.ts +++ b/src/locales/index.ts @@ -7,8 +7,8 @@ type NestedKeyOf = { : `${Key}` }[keyof ObjectType & (string | number)]; -type TranslationKeys = NestedKeyOf; +export type TranslationKeys = NestedKeyOf; -export function translate(key: K | string): string { - return i18n.global.t(key.toLowerCase()); +export function translate(key: TranslationKeys | string): string { + return i18n.global.t(key); } diff --git a/src/locales/zh.ts b/src/locales/zh.ts index d34f7f0..f8f19bb 100644 --- a/src/locales/zh.ts +++ b/src/locales/zh.ts @@ -1,7 +1,11 @@ export default { + emoji: { + flag: "🇨🇳", + }, disconnected: "未连接", connected: "已连接", connecting: "连接中", + use: "使用", ws: { disconnected: "未连接", @@ -13,9 +17,115 @@ export default { home: "主页", wifi: "Wi-Fi", about: "关于", - uart: "UART透传", + uart: "UART", feedback: "反馈", close: "关闭", update: "更新", + fullscreen: "全屏", + windowed: "窗口", }, + + uart: { + port: "接口", + startCommunication: "开始数据收发", + stopCommunication: "停止数据收发", + commonlyUsed: "常用", + baudrate: "波特率", + customBaud: "自定义波特率", + use: "使用", + actual: "实际", + dataBits: "数据位", + stopBits: "停止位", + parity: "校验位", + parityNone: "无(None)", + parityOdd: "奇(Odd)", + parityEven: "偶(Even)", + flowControl: "流控制", + send: "发送", + clear: "清空", + clearTooltip: "仅清除显示区域,可用刷新恢复", + updateTooltip: "与缓存同步+过滤", + autoUpdateTooltip: "仅停止刷新显示区,后台继续接收数据", + receive: "接收", + + displayOptions: "显示选项", + display: "显示框", + show: "显示", + text: "文本", + timestamp: "时间戳", + enable: "启用", + lineWrap: "换行", + highlight: "高亮", + + frameBreakStrategy: "断帧策略", + priority: "优先级", + rule: "规则", + ruleTips: + "

超时=-1: 禁用超时断帧

" + + "

超时=0: 当机立断,收到任何数据都视为完整数据

" + + "

匹配断后:典型\\n的场景

" + + "

匹配断前:用于有特殊帧头的场景

" + + "

固定字节断帧:传输大量数据,比如可以每隔1024字节断帧,方便查看数据

", + value: "值", + timeout: "超时", + match: "匹配", + byte: "字节", + begin: "断", + end: "断", + + other: "其他", + decodeAnsiEscapeCodes: "解码ANSI转义码", + ansiTooltips: + "

ANSI转义码对终端和文本有很多作用,比如改变文本颜色等。

\n" + + "

\n" + + " 简单了解->\n" + + " \n" + + " https://yunsi.studio/wireless-debugger/docs/uart-webhost/ansi-escape-code\n" + + " \n" + + "

", + filter: "过滤", + textAndEscape: "文本,支持\\n\\x", + autoUpdateNewData: "新数据自动刷新", + updateFrequency: "数据显示刷新间隔(ms)", + updateFrequencyTooltip: "提高间隔可减少CPU资源的使用", + + addHeader: "增加帧头", + addFooter: "增加帧尾", + + passthrough: "透传", + proxy: "透传", + serverPort: "服务器端口", + connectedClient: "已连接的客户端", + refresh: "刷新", + interface: "接口", + noClientConnected: "无客户端连接", + + import: "导入", + export: "导出", + reset: "重置", + resetTooltip: "刷新页面后生效", + saveToLocal: "保存到本地", + saveToLocalTooltip: "若存在多个页面,会相互覆盖", + add: "添加", + edit: "编辑", + drag: "拖拽", + ipChangeAlert: "IP地址改变会导致配置丢失", + + layout: "布局", + landscape: "横/行", + portrait: "竖/列", + responsive: "自适应", + configPannel: "设置窗", + displayPannel: "数据窗", + macroPannel: "快捷窗", + autoScrollToBottom: "自动滚动到底部", + clearScreen: "清屏", + autoUpdate: "自动刷新", + tempDisplayTooltip: "未满足断帧规则的数据(如:未超时),暂时实时显示在此区域。超过8192字节,自动断帧;", + loopSend: "循环发送", + loopSendTooltip: "实际频率受界面刷新率影响,如需要更精确,可以尝试关闭‘自动刷新’", + sendFormat: "发送格式", + cachedFrame: "缓存帧数", + format: "格式化", + } } \ No newline at end of file diff --git a/src/stores/dataViewerStore.ts b/src/stores/dataViewerStore.ts index febc5d0..3785750 100644 --- a/src/stores/dataViewerStore.ts +++ b/src/stores/dataViewerStore.ts @@ -364,18 +364,18 @@ export const useDataViewerStore = defineStore('text-viewer', () => { const frameBreakSize = ref(0); const frameBreakRules = ref([{ - name: '超时(ms)', + name: 'timeout', type: 'number', min: -1, draggable: false, transformData: breakDelay, }, { - name: '匹配', + name: 'match', type: 'text', draggable: true, transformData: breakSequence, }, { - name: '字节(B)', + name: 'byte', type: 'number', min: 0, draggable: true, @@ -437,9 +437,9 @@ export const useDataViewerStore = defineStore('text-viewer', () => { function reloadFrameBreak() { /* function and ref can not be stored in localStorage */ for (let i = 0; i < frameBreakRules.value.length; i++) { - if (frameBreakRules.value[i].name === "超时(ms)") { + if (frameBreakRules.value[i].name === "timeout") { frameBreakRules.value[i].transformData = breakDelay; - } else if (frameBreakRules.value[i].name === "匹配") { + } else if (frameBreakRules.value[i].name === "match") { frameBreakRules.value[i].transformData = breakSequence; } else { frameBreakRules.value[i].transformData = breakSize; diff --git a/src/views/Uart.vue b/src/views/Uart.vue index fa5d005..5481547 100644 --- a/src/views/Uart.vue +++ b/src/views/Uart.vue @@ -38,15 +38,24 @@
- - - - + + {{ $t('uart.responsive') }} + + + {{ $t("uart.configPannel") }} + + + {{ $t('uart.displayPannel') }} + + + {{ $t('uart.macroPannel') }} + @@ -56,7 +65,7 @@ @@ -217,5 +245,9 @@ if (isOTAEnabled()) { padding: 0; } +.el-select :deep(.el-select__wrapper) { + @apply h-full; +} + \ No newline at end of file diff --git a/src/views/text-data-viewer/textDataConfig.vue b/src/views/text-data-viewer/textDataConfig.vue index 272f2be..4e18858 100644 --- a/src/views/text-data-viewer/textDataConfig.vue +++ b/src/views/text-data-viewer/textDataConfig.vue @@ -1,14 +1,14 @@