From 458df8c54441fb40b271a3fc822dce68220fed4d Mon Sep 17 00:00:00 2001 From: hx <190679152@qq.com> Date: Mon, 23 Mar 2026 10:43:36 +0800 Subject: [PATCH] =?UTF-8?q?b=E7=AB=AF=E5=9B=BD=E9=99=85=E5=8C=96=20?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E8=B0=B7=E6=AD=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lang/app-messages.js | 44 ++ src/lang/device-flow-messages.js | 449 ++++++++++++ src/lang/device-messages.js | 861 ++++++++++++++++++++++++ src/lang/index.js | 100 +++ src/lang/messages.js | 594 ++++++++++++++++ src/lang/profile-messages.js | 244 +++++++ src/lang/system-messages.js | 9 + src/lang/system-user-device-messages.js | 219 ++++++ src/utils/loadLeaflet.js | 65 ++ 9 files changed, 2585 insertions(+) create mode 100644 src/lang/app-messages.js create mode 100644 src/lang/device-flow-messages.js create mode 100644 src/lang/device-messages.js create mode 100644 src/lang/index.js create mode 100644 src/lang/messages.js create mode 100644 src/lang/profile-messages.js create mode 100644 src/lang/system-messages.js create mode 100644 src/lang/system-user-device-messages.js create mode 100644 src/utils/loadLeaflet.js diff --git a/src/lang/app-messages.js b/src/lang/app-messages.js new file mode 100644 index 0000000..d6a683e --- /dev/null +++ b/src/lang/app-messages.js @@ -0,0 +1,44 @@ +const appMessages = { + "zh-CN": { + app: { + sidebarTitle: "\u5ba2\u6237 GeoTag\u7ba1\u7406\u7cfb\u7edf", + headerSearch: { + placeholder: "\u83dc\u5355\u641c\u7d22\uff0c\u652f\u6301\u6807\u9898\u3001URL\u6a21\u7cca\u67e5\u8be2", + }, + }, + }, + "en-US": { + app: { + sidebarTitle: "GeoTag Customer Management System", + headerSearch: { + placeholder: "Search menu by title or URL", + }, + }, + }, + "fr-FR": { + app: { + sidebarTitle: "Systeme de gestion des clients GeoTag", + headerSearch: { + placeholder: "Rechercher un menu par titre ou URL", + }, + }, + }, + "es-ES": { + app: { + sidebarTitle: "Sistema de gestion de clientes GeoTag", + headerSearch: { + placeholder: "Buscar menu por titulo o URL", + }, + }, + }, + "pt-BR": { + app: { + sidebarTitle: "Sistema de gestao de clientes GeoTag", + headerSearch: { + placeholder: "Pesquisar menu por titulo ou URL", + }, + }, + }, +}; + +export default appMessages; diff --git a/src/lang/device-flow-messages.js b/src/lang/device-flow-messages.js new file mode 100644 index 0000000..7901659 --- /dev/null +++ b/src/lang/device-flow-messages.js @@ -0,0 +1,449 @@ +const deviceFlowMessages = { + "zh-CN": { + device: { + table: { + mac: "\u8bbe\u5907MAC", + }, + dialog: { + detail: { + id: "\u8bbe\u5907ID", + }, + }, + claim: { + dialogTitle: "\u8ba4\u9886\u8bbe\u5907", + query: { + orderCode: "\u8ba2\u5355\u53f7", + }, + placeholder: { + orderCode: "\u8bf7\u8f93\u5165\u8ba2\u5355\u53f7", + }, + tip: "\u8bf7\u6839\u636e\u8ba2\u5355\u53f7\u67e5\u627e\u8bbe\u5907\u5e76\u9009\u62e9\u9700\u8981\u8ba4\u9886\u7684\u8bbe\u5907", + empty: "\u6682\u65e0\u5339\u914d\u7684\u8bbe\u5907\u6570\u636e", + selectedCount: "\u5df2\u9009\u62e9\u8bbe\u5907\uff1a{count} \u53f0", + confirmButton: "\u786e\u8ba4\u8ba4\u9886", + detailTitle: "\u8bbe\u5907\u8be6\u60c5", + detail: { + batchNo: "\u6279\u6b21\u53f7", + }, + message: { + enterOrderCode: "\u8bf7\u5148\u8f93\u5165\u8ba2\u5355\u53f7", + queryFirst: "\u8bf7\u5148\u6839\u636e\u8ba2\u5355\u53f7\u67e5\u8be2\u8bbe\u5907", + selectAtLeastOne: "\u8bf7\u81f3\u5c11\u9009\u62e9\u4e00\u53f0\u8bbe\u5907", + confirmClaim: "\u786e\u8ba4\u8ba4\u9886\u5df2\u9009\u4e2d\u7684 {count} \u53f0\u8bbe\u5907\u5417\uff1f", + claimSuccess: "\u8ba4\u9886\u6210\u529f", + }, + }, + trajectory: { + dialogTitle: "\u8bbe\u5907\u8f68\u8ff9", + dialogTitleWithSn: "\u8bbe\u5907\u8f68\u8ff9 - {sn}", + summary: { + id: "\u8bbe\u5907ID", + sn: "\u5e8f\u5217\u53f7", + alias: "\u540d\u79f0", + remark: "\u8bbe\u5907\u5907\u6ce8", + pointCount: "\u5df2\u5c55\u793a\u8f68\u8ff9\u70b9", + totalLimit: "\u5171 {total} \u6761\uff0c\u5f53\u524d\u4ec5\u5c55\u793a\u6700\u8fd1 {count} \u6761", + }, + filter: { + locationTime: "\u4f4d\u7f6e\u65f6\u95f4", + startPlaceholder: "\u5f00\u59cb\u65f6\u95f4", + endPlaceholder: "\u7ed3\u675f\u65f6\u95f4", + }, + tabs: { + map: "\u5730\u56fe\u8f68\u8ff9", + table: "\u8f68\u8ff9\u660e\u7ec6", + }, + provider: { + label: "\u5730\u56fe\u670d\u52a1", + maptiler: "MapTiler", + amap: "\u9ad8\u5fb7\u5730\u56fe", + google: "\u8c37\u6b4c\u5730\u56fe", + }, + empty: "\u6682\u65e0\u8f68\u8ff9\u6570\u636e", + table: { + time: "\u4f4d\u7f6e\u65f6\u95f4", + coordinates: "\u7ecf\u7eac\u5ea6", + address: "\u5730\u5740", + battery: "\u7535\u91cf", + }, + marker: { + startShort: "\u8d77", + endShort: "\u7ec8", + }, + message: { + missingDevice: "\u672a\u83b7\u53d6\u5230\u8bbe\u5907\u4fe1\u606f\uff0c\u65e0\u6cd5\u67e5\u770b\u8f68\u8ff9", + missingMapKey: "\u5f53\u524d\u4f01\u4e1a\u672a\u914d\u7f6e\u5730\u56fe Key", + mapConfigLoadFailed: "\u5730\u56fe\u914d\u7f6e\u52a0\u8f7d\u5931\u8d25", + trajectoryLoadFailed: "\u8f68\u8ff9\u52a0\u8f7d\u5931\u8d25", + missingAmapKey: "\u5f53\u524d\u4f01\u4e1a\u672a\u914d\u7f6e\u9ad8\u5fb7\u5730\u56fe Key", + amapLoadFailed: "\u9ad8\u5fb7\u5730\u56fe\u52a0\u8f7d\u5931\u8d25", + missingGoogleKey: "\u5f53\u524d\u4f01\u4e1a\u672a\u914d\u7f6e\u8c37\u6b4c\u5730\u56fe Key", + googleLoadFailed: "\u8c37\u6b4c\u5730\u56fe\u52a0\u8f7d\u5931\u8d25", + missingMaptilerKey: "\u5f53\u524d\u4f01\u4e1a\u672a\u914d\u7f6e MapTiler Key", + maptilerLoadFailed: "MapTiler \u5730\u56fe\u52a0\u8f7d\u5931\u8d25", + amapConvertFailed: "\u9ad8\u5fb7\u5750\u6807\u8f6c\u6362\u5931\u8d25", + startTime: "\u5f00\u59cb\u65f6\u95f4", + endTime: "\u7ed3\u675f\u65f6\u95f4", + }, + }, + }, + }, + "en-US": { + device: { + table: { + mac: "Device MAC", + }, + dialog: { + detail: { + id: "Device ID", + }, + }, + claim: { + dialogTitle: "Claim Device", + query: { + orderCode: "Order No.", + }, + placeholder: { + orderCode: "Enter order no.", + }, + tip: "Search devices by order number and select the devices to claim.", + empty: "No matching device data", + selectedCount: "Selected devices: {count}", + confirmButton: "Confirm Claim", + detailTitle: "Device Detail", + detail: { + batchNo: "Batch No.", + }, + message: { + enterOrderCode: "Please enter the order number first", + queryFirst: "Please query devices by order number first", + selectAtLeastOne: "Please select at least one device", + confirmClaim: "Confirm claiming {count} selected devices?", + claimSuccess: "Claim successful", + }, + }, + trajectory: { + dialogTitle: "Device Trajectory", + dialogTitleWithSn: "Device Trajectory - {sn}", + summary: { + id: "Device ID", + sn: "Serial No.", + alias: "Name", + remark: "Device Remark", + pointCount: "Displayed Points", + totalLimit: "Total {total}, currently showing the latest {count}", + }, + filter: { + locationTime: "Location Time", + startPlaceholder: "Start Time", + endPlaceholder: "End Time", + }, + tabs: { + map: "Map Trajectory", + table: "Trajectory Details", + }, + provider: { + label: "Map Service", + maptiler: "MapTiler", + amap: "Amap", + google: "Google Maps", + }, + empty: "No trajectory data", + table: { + time: "Location Time", + coordinates: "Coordinates", + address: "Address", + battery: "Battery", + }, + marker: { + startShort: "S", + endShort: "E", + }, + message: { + missingDevice: "Device information is unavailable, so the trajectory cannot be displayed", + missingMapKey: "No map key is configured for the current business", + mapConfigLoadFailed: "Failed to load map configuration", + trajectoryLoadFailed: "Failed to load trajectory", + missingAmapKey: "No Amap key is configured for the current business", + amapLoadFailed: "Failed to load Amap", + missingGoogleKey: "No Google Maps key is configured for the current business", + googleLoadFailed: "Failed to load Google Maps", + missingMaptilerKey: "No MapTiler key is configured for the current business", + maptilerLoadFailed: "Failed to load MapTiler map", + amapConvertFailed: "Failed to convert Amap coordinates", + startTime: "Start Time", + endTime: "End Time", + }, + }, + }, + }, + "fr-FR": { + device: { + table: { + mac: "MAC appareil", + }, + dialog: { + detail: { + id: "ID appareil", + }, + }, + claim: { + dialogTitle: "Reclamer appareil", + query: { + orderCode: "Numero de commande", + }, + placeholder: { + orderCode: "Saisir le numero de commande", + }, + tip: "Recherchez les appareils par numero de commande puis selectionnez ceux a reclamer.", + empty: "Aucune donnee appareil correspondante", + selectedCount: "Appareils selectionnes : {count}", + confirmButton: "Confirmer la reclamation", + detailTitle: "Detail appareil", + detail: { + batchNo: "Numero de lot", + }, + message: { + enterOrderCode: "Veuillez d'abord saisir le numero de commande", + queryFirst: "Veuillez d'abord rechercher les appareils par numero de commande", + selectAtLeastOne: "Veuillez selectionner au moins un appareil", + confirmClaim: "Confirmer la reclamation des {count} appareils selectionnes ?", + claimSuccess: "Reclamation reussie", + }, + }, + trajectory: { + dialogTitle: "Trajectoire appareil", + dialogTitleWithSn: "Trajectoire appareil - {sn}", + summary: { + id: "ID appareil", + sn: "Numero de serie", + alias: "Nom", + remark: "Remarque appareil", + pointCount: "Points affiches", + totalLimit: "Total {total}, seuls les {count} plus recents sont affiches", + }, + filter: { + locationTime: "Heure de position", + startPlaceholder: "Heure de debut", + endPlaceholder: "Heure de fin", + }, + tabs: { + map: "Trajectoire carte", + table: "Details de trajectoire", + }, + provider: { + label: "Service de carte", + maptiler: "MapTiler", + amap: "Amap", + google: "Google Maps", + }, + empty: "Aucune donnee de trajectoire", + table: { + time: "Heure de position", + coordinates: "Coordonnees", + address: "Adresse", + battery: "Batterie", + }, + marker: { + startShort: "D", + endShort: "F", + }, + message: { + missingDevice: "Les informations appareil sont indisponibles, impossible d'afficher la trajectoire", + missingMapKey: "Aucune cle de carte n'est configuree pour l'entreprise actuelle", + mapConfigLoadFailed: "Echec du chargement de la configuration de carte", + trajectoryLoadFailed: "Echec du chargement de la trajectoire", + missingAmapKey: "Aucune cle Amap n'est configuree pour l'entreprise actuelle", + amapLoadFailed: "Echec du chargement d'Amap", + missingGoogleKey: "Aucune cle Google Maps n'est configuree pour l'entreprise actuelle", + googleLoadFailed: "Echec du chargement de Google Maps", + missingMaptilerKey: "Aucune cle MapTiler n'est configuree pour l'entreprise actuelle", + maptilerLoadFailed: "Echec du chargement de la carte MapTiler", + amapConvertFailed: "Echec de conversion des coordonnees Amap", + startTime: "Heure de debut", + endTime: "Heure de fin", + }, + }, + }, + }, + "es-ES": { + device: { + table: { + mac: "MAC del dispositivo", + }, + dialog: { + detail: { + id: "ID del dispositivo", + }, + }, + claim: { + dialogTitle: "Reclamar dispositivo", + query: { + orderCode: "Numero de pedido", + }, + placeholder: { + orderCode: "Ingrese el numero de pedido", + }, + tip: "Busque dispositivos por numero de pedido y seleccione los que desea reclamar.", + empty: "No hay datos de dispositivos coincidentes", + selectedCount: "Dispositivos seleccionados: {count}", + confirmButton: "Confirmar reclamo", + detailTitle: "Detalle del dispositivo", + detail: { + batchNo: "Numero de lote", + }, + message: { + enterOrderCode: "Primero ingrese el numero de pedido", + queryFirst: "Primero consulte los dispositivos por numero de pedido", + selectAtLeastOne: "Seleccione al menos un dispositivo", + confirmClaim: "Confirmar el reclamo de {count} dispositivos seleccionados?", + claimSuccess: "Reclamo exitoso", + }, + }, + trajectory: { + dialogTitle: "Trayectoria del dispositivo", + dialogTitleWithSn: "Trayectoria del dispositivo - {sn}", + summary: { + id: "ID del dispositivo", + sn: "Numero de serie", + alias: "Nombre", + remark: "Observacion del dispositivo", + pointCount: "Puntos mostrados", + totalLimit: "Total {total}, actualmente solo se muestran los ultimos {count}", + }, + filter: { + locationTime: "Hora de ubicacion", + startPlaceholder: "Hora de inicio", + endPlaceholder: "Hora de fin", + }, + tabs: { + map: "Trayectoria en mapa", + table: "Detalle de trayectoria", + }, + provider: { + label: "Servicio de mapa", + maptiler: "MapTiler", + amap: "Amap", + google: "Google Maps", + }, + empty: "No hay datos de trayectoria", + table: { + time: "Hora de ubicacion", + coordinates: "Coordenadas", + address: "Direccion", + battery: "Bateria", + }, + marker: { + startShort: "I", + endShort: "F", + }, + message: { + missingDevice: "No se dispone de informacion del dispositivo, no es posible mostrar la trayectoria", + missingMapKey: "La empresa actual no tiene configurada una clave de mapa", + mapConfigLoadFailed: "No se pudo cargar la configuracion del mapa", + trajectoryLoadFailed: "No se pudo cargar la trayectoria", + missingAmapKey: "La empresa actual no tiene configurada una clave de Amap", + amapLoadFailed: "No se pudo cargar Amap", + missingGoogleKey: "La empresa actual no tiene configurada una clave de Google Maps", + googleLoadFailed: "No se pudo cargar Google Maps", + missingMaptilerKey: "La empresa actual no tiene configurada una clave de MapTiler", + maptilerLoadFailed: "No se pudo cargar el mapa de MapTiler", + amapConvertFailed: "No se pudieron convertir las coordenadas de Amap", + startTime: "Hora de inicio", + endTime: "Hora de fin", + }, + }, + }, + }, + "pt-BR": { + device: { + table: { + mac: "MAC do dispositivo", + }, + dialog: { + detail: { + id: "ID do dispositivo", + }, + }, + claim: { + dialogTitle: "Reivindicar dispositivo", + query: { + orderCode: "Numero do pedido", + }, + placeholder: { + orderCode: "Digite o numero do pedido", + }, + tip: "Pesquise dispositivos pelo numero do pedido e selecione os que deseja reivindicar.", + empty: "Nenhum dado de dispositivo correspondente", + selectedCount: "Dispositivos selecionados: {count}", + confirmButton: "Confirmar reivindicacao", + detailTitle: "Detalhe do dispositivo", + detail: { + batchNo: "Numero do lote", + }, + message: { + enterOrderCode: "Digite primeiro o numero do pedido", + queryFirst: "Pesquise primeiro os dispositivos pelo numero do pedido", + selectAtLeastOne: "Selecione pelo menos um dispositivo", + confirmClaim: "Confirmar a reivindicacao de {count} dispositivos selecionados?", + claimSuccess: "Reivindicacao concluida com sucesso", + }, + }, + trajectory: { + dialogTitle: "Trajetoria do dispositivo", + dialogTitleWithSn: "Trajetoria do dispositivo - {sn}", + summary: { + id: "ID do dispositivo", + sn: "Numero de serie", + alias: "Nome", + remark: "Observacao do dispositivo", + pointCount: "Pontos exibidos", + totalLimit: "Total {total}, atualmente sao exibidos apenas os ultimos {count}", + }, + filter: { + locationTime: "Horario da posicao", + startPlaceholder: "Horario inicial", + endPlaceholder: "Horario final", + }, + tabs: { + map: "Trajetoria no mapa", + table: "Detalhes da trajetoria", + }, + provider: { + label: "Servico de mapa", + maptiler: "MapTiler", + amap: "Amap", + google: "Google Maps", + }, + empty: "Nenhum dado de trajetoria", + table: { + time: "Horario da posicao", + coordinates: "Coordenadas", + address: "Endereco", + battery: "Bateria", + }, + marker: { + startShort: "I", + endShort: "F", + }, + message: { + missingDevice: "As informacoes do dispositivo nao estao disponiveis, nao e possivel exibir a trajetoria", + missingMapKey: "Nenhuma chave de mapa foi configurada para a empresa atual", + mapConfigLoadFailed: "Falha ao carregar a configuracao do mapa", + trajectoryLoadFailed: "Falha ao carregar a trajetoria", + missingAmapKey: "Nenhuma chave do Amap foi configurada para a empresa atual", + amapLoadFailed: "Falha ao carregar o Amap", + missingGoogleKey: "Nenhuma chave do Google Maps foi configurada para a empresa atual", + googleLoadFailed: "Falha ao carregar o Google Maps", + missingMaptilerKey: "Nenhuma chave do MapTiler foi configurada para a empresa atual", + maptilerLoadFailed: "Falha ao carregar o mapa do MapTiler", + amapConvertFailed: "Falha ao converter as coordenadas do Amap", + startTime: "Horario inicial", + endTime: "Horario final", + }, + }, + }, + }, +}; + +export default deviceFlowMessages; diff --git a/src/lang/device-messages.js b/src/lang/device-messages.js new file mode 100644 index 0000000..500c6db --- /dev/null +++ b/src/lang/device-messages.js @@ -0,0 +1,861 @@ +const deviceZh = { + query: { + orderCode: "\u8ba2\u5355\u53f7", + model: "\u578b\u53f7", + sn: "\u5e8f\u5217\u53f7", + alias: "\u540d\u79f0", + lastAddress: "\u5730\u5740", + remark: "\u8bbe\u5907\u5907\u6ce8", + activationStatus: "\u662f\u5426\u542f\u7528", + }, + placeholder: { + orderCode: "\u8bf7\u8f93\u5165\u8ba2\u5355\u53f7", + model: "\u8bf7\u8f93\u5165\u578b\u53f7", + sn: "\u8bf7\u8f93\u5165\u5e8f\u5217\u53f7", + alias: "\u8bf7\u8f93\u5165\u540d\u79f0", + lastAddress: "\u8bf7\u8f93\u5165\u5730\u5740", + remark: "\u8bf7\u8f93\u5165\u8bbe\u5907\u5907\u6ce8", + activationStatus: "\u8bf7\u9009\u62e9\u542f\u7528\u72b6\u6001", + macAddress: "\u8bf7\u8f93\u5165MAC\u5730\u5740", + privateKey: "\u8bf7\u8f93\u5165\u79c1\u94a5", + batchNo: "\u8bf7\u8f93\u5165\u6240\u5c5e\u6279\u6b21", + hashId: "\u8bf7\u8f93\u5165\u8bbe\u5907\u552f\u4e00\u54c8\u5e0c ID", + bindBusinessId: "\u8bf7\u8f93\u5165\u7ed1\u5b9a\u4f01\u4e1aID", + remarkSimple: "\u8bf7\u8f93\u5165\u5907\u6ce8", + locateUpdateTime: "\u9009\u62e9\u6700\u540e\u4f4d\u7f6e\u66f4\u65b0\u65f6\u95f4", + lastLat: "\u8bf7\u8f93\u5165\u6700\u540e\u7eac\u5ea6", + lastLng: "\u8bf7\u8f93\u5165\u6700\u540e\u7ecf\u5ea6", + battery: "\u8bf7\u8f93\u5165\u7535\u91cf", + lastReportedTime: "\u9009\u62e9\u6700\u540e\u4e0a\u62a5\u65f6\u95f4", + lastLocationTime: "\u9009\u62e9\u6700\u540e\u4f4d\u7f6e\u65f6\u95f4", + createTime: "\u9009\u62e9\u521b\u5efa\u65f6\u95f4", + }, + status: { + enabled: "\u542f\u7528", + disabled: "\u7981\u7528", + }, + button: { + import: "\u5bfc\u5165", + claim: "\u8ba4\u9886\u8bbe\u5907", + batchEnable: "\u6279\u91cf\u542f\u7528", + batchDisable: "\u6279\u91cf\u7981\u7528", + assign: "\u5206\u914d\u8bbe\u5907", + export: "\u5bfc\u51fa", + detail: "\u8be6\u60c5", + trajectory: "\u8f68\u8ff9", + close: "\u5173\u95ed", + }, + table: { + orderCode: "\u8ba2\u5355\u53f7", + deviceStatus: "\u8bbe\u5907\u72b6\u6001", + model: "\u578b\u53f7", + sn: "\u5e8f\u5217\u53f7", + alias: "\u540d\u79f0", + lastAddress: "\u5730\u5740", + updateTime: "\u66f4\u65b0\u65f6\u95f4", + coordinates: "\u7ecf\u7eac\u5ea6", + remark: "\u5907\u6ce8", + actions: "\u64cd\u4f5c", + }, + dialog: { + import: { + title: "\u8bbe\u5907Excel\u5bfc\u5165", + fileLabel: "Excel\u6587\u4ef6", + dragText: "\u5c06Excel\u6587\u4ef6\u62d6\u5230\u6b64\u5904\uff0c\u6216", + clickUpload: "\u70b9\u51fb\u4e0a\u4f20", + tip: "\u4ec5\u652f\u6301 .xlsx / .xls \u683c\u5f0f\u6587\u4ef6\uff0c\u4e14\u53ea\u80fd\u4e0a\u4f201\u4e2a\u6587\u4ef6", + templateTitle: "\u5bfc\u5165\u6a21\u677f", + templateDesc: "\u8bf7\u5148\u4e0b\u8f7d\u6a21\u677f\uff0c\u6309\u6a21\u677f\u683c\u5f0f\u586b\u5199\u8bbe\u5907\u5e8f\u5217\u53f7\u540e\u518d\u5bfc\u5165", + downloadTemplate: "\u4e0b\u8f7d\u6a21\u677f", + fieldExample: "\u6a21\u677f\u5b57\u6bb5\uff1aserial_number", + sampleExample: "\u793a\u4f8b\u503c\uff1aSAMPLE_SN_001", + }, + importResult: { + title: "\u5bfc\u5165\u7ed3\u679c", + status: "\u72b6\u6001", + total: "\u603b\u6570", + successCount: "\u6210\u529f\u6570", + failCount: "\u5931\u8d25\u6570", + startTime: "\u5f00\u59cb\u65f6\u95f4", + finishTime: "\u7ed3\u675f\u65f6\u95f4", + requestErrors: "\u8bf7\u6c42\u9519\u8bef", + failDetails: "\u5931\u8d25\u660e\u7ec6", + rowIndex: "\u884c\u53f7", + errorMessage: "\u9519\u8bef\u4fe1\u606f", + }, + assign: { + title: "\u5206\u914d\u8bbe\u5907", + selectedUsers: "\u5df2\u9009\u62e9\u5458\u5de5\uff1a{count} \u4eba", + }, + detail: { + title: "\u8bbe\u5907\u8be6\u60c5", + macAddress: "MAC\u5730\u5740", + business: "\u4f01\u4e1a", + lastAddressName: "\u6700\u540e\u5730\u5740\u540d\u79f0", + assignedUsers: "\u5206\u914d\u5458\u5de5", + locateUpdateTime: "\u6700\u540e\u4f4d\u7f6e\u66f4\u65b0\u65f6\u95f4", + lastCoordinates: "\u6700\u540e\u7ecf\u7eac\u5ea6", + battery: "\u7535\u91cf", + lastReportedTime: "\u6700\u540e\u4e0a\u62a5\u65f6\u95f4", + lastLocationTime: "\u6700\u540e\u4f4d\u7f6e\u65f6\u95f4", + }, + editInfo: { + title: "\u4fee\u6539\u8bbe\u5907\u4fe1\u606f", + }, + form: { + addTitle: "\u6dfb\u52a0\u7cfb\u7edf\u8bbe\u5907", + editTitle: "\u4fee\u6539\u7cfb\u7edf\u8bbe\u5907", + }, + }, + form: { + privateKey: "\u79c1\u94a5", + batchNo: "\u6240\u5c5e\u6279\u6b21", + hashId: "\u8bbe\u5907\u7684\u552f\u4e00\u54c8\u5e0c ID", + bindBusinessId: "\u7ed1\u5b9a\u4f01\u4e1aID", + locateUpdateTime: "\u6700\u540e\u4f4d\u7f6e\u66f4\u65b0\u65f6\u95f4", + lastLat: "\u6700\u540e\u7eac\u5ea6", + lastLng: "\u6700\u540e\u7ecf\u5ea6", + }, + validation: { + aliasMax: "\u540d\u79f0\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc764\u4e2a\u5b57\u7b26", + remarkMax: "\u8bbe\u5907\u5907\u6ce8\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc7255\u4e2a\u5b57\u7b26", + fileRequired: "\u8bf7\u9009\u62e9\u8981\u4e0a\u4f20\u7684Excel\u6587\u4ef6", + snRequired: "\u5e8f\u5217\u53f7\u4e0d\u80fd\u4e3a\u7a7a", + macRequired: "MAC\u5730\u5740\u4e0d\u80fd\u4e3a\u7a7a", + orderCodeRequired: "\u8ba2\u5355\u53f7\u4e0d\u80fd\u4e3a\u7a7a", + privateKeyRequired: "\u79c1\u94a5\u4e0d\u80fd\u4e3a\u7a7a", + batchNoRequired: "\u6240\u5c5e\u6279\u6b21\u4e0d\u80fd\u4e3a\u7a7a", + hashIdRequired: "\u8bbe\u5907\u7684\u552f\u4e00\u54c8\u5e0c ID\u4e0d\u80fd\u4e3a\u7a7a", + remarkRequired: "\u5907\u6ce8\u4e0d\u80fd\u4e3a\u7a7a", + }, + importStatus: { + SUCCESS: "\u5bfc\u5165\u6210\u529f", + PARTIAL_SUCCESS: "\u90e8\u5206\u6210\u529f", + FAILED: "\u5bfc\u5165\u5931\u8d25", + REQUEST_INVALID: "\u8bf7\u6c42\u6821\u9a8c\u5931\u8d25", + UNKNOWN: "\u672a\u77e5\u72b6\u6001", + }, + message: { + selectDeviceForAssign: "\u8bf7\u5148\u52fe\u9009\u9700\u8981\u5206\u914d\u7684\u8bbe\u5907", + selectUserForAssign: "\u8bf7\u9009\u62e9\u5458\u5de5\u8d26\u6237", + invalidUserSelection: "\u672a\u83b7\u53d6\u5230\u6709\u6548\u7684\u5458\u5de5\u8d26\u53f7", + confirmAssign: + "\u786e\u8ba4\u5c06\u9009\u4e2d\u7684 {deviceCount} \u53f0\u8bbe\u5907\u5206\u914d\u7ed9 {userCount} \u540d\u5458\u5de5\u5417\uff1f", + assignSuccess: "\u5206\u914d\u6210\u529f", + selectDeviceForEnable: "\u8bf7\u5148\u52fe\u9009\u9700\u8981\u542f\u7528\u7684\u8bbe\u5907", + confirmBatchEnable: "\u786e\u8ba4\u542f\u7528\u9009\u4e2d\u7684 {count} \u53f0\u8bbe\u5907\u5417\uff1f", + batchEnableSuccess: "\u6279\u91cf\u542f\u7528\u6210\u529f", + selectDeviceForDisable: "\u8bf7\u5148\u52fe\u9009\u9700\u8981\u7981\u7528\u7684\u8bbe\u5907", + confirmBatchDisable: "\u786e\u8ba4\u7981\u7528\u9009\u4e2d\u7684 {count} \u53f0\u8bbe\u5907\u5417\uff1f", + batchDisableSuccess: "\u6279\u91cf\u7981\u7528\u6210\u529f", + deviceInfoMissing: "\u672a\u83b7\u53d6\u5230\u8bbe\u5907\u4fe1\u606f", + updateSuccess: "\u4fee\u6539\u6210\u529f", + addSuccess: "\u65b0\u589e\u6210\u529f", + warning: "\u8b66\u544a", + confirmDelete: + "\u662f\u5426\u786e\u8ba4\u5220\u9664\u7cfb\u7edf\u8bbe\u5907\u4e3b\u7f16\u53f7\u4e3a\"{ids}\"\u7684\u6570\u636e\u9879?", + deleteSuccess: "\u5220\u9664\u6210\u529f", + confirmExport: "\u662f\u5426\u786e\u8ba4\u5bfc\u51fa\u6240\u6709\u7cfb\u7edf\u8bbe\u5907\u4e3b\u6570\u636e\u9879?", + fetchBatchNoFailed: "\u83b7\u53d6\u6279\u6b21\u53f7\u5931\u8d25\uff1a", + apiException: "\u63a5\u53e3\u5f02\u5e38", + exceedFileLimit: + "\u6700\u591a\u53ea\u80fd\u4e0a\u4f201\u4e2aExcel\u6587\u4ef6\uff0c\u5f53\u524d\u5df2\u9009\u62e9 {count} \u4e2a", + invalidFileType: + "\u53ea\u80fd\u4e0a\u4f20 .xlsx \u6216 .xls \u683c\u5f0f\u7684Excel\u6587\u4ef6\uff01", + selectOneExcel: + "\u8bf7\u9009\u62e9\u8981\u4e0a\u4f20\u7684Excel\u6587\u4ef6\uff08\u4ec5\u652f\u63011\u4e2a\u6587\u4ef6\uff09\uff01", + removeExtraFiles: + "\u6700\u591a\u53ea\u80fd\u4e0a\u4f201\u4e2aExcel\u6587\u4ef6\uff0c\u8bf7\u5220\u9664\u591a\u4f59\u6587\u4ef6\uff01", + importSuccess: "\u5bfc\u5165\u6210\u529f\uff01", + importFailed: "\u5bfc\u5165\u5931\u8d25\uff1a", + serverException: "\u670d\u52a1\u5668\u5f02\u5e38", + importStatusSummary: + "{status}\uff0c\u6210\u529f {successCount} \u6761\uff0c\u5931\u8d25 {failCount} \u6761", + }, +}; + +const deviceEn = { + query: { + orderCode: "Order No.", + model: "Model", + sn: "Serial No.", + alias: "Name", + lastAddress: "Address", + remark: "Remark", + activationStatus: "Activation", + }, + placeholder: { + orderCode: "Enter order no.", + model: "Enter model", + sn: "Enter serial no.", + alias: "Enter name", + lastAddress: "Enter address", + remark: "Enter device remark", + activationStatus: "Select activation status", + macAddress: "Enter MAC address", + privateKey: "Enter private key", + batchNo: "Enter batch no.", + hashId: "Enter unique hash ID", + bindBusinessId: "Enter business ID", + remarkSimple: "Enter remark", + locateUpdateTime: "Select locate update time", + lastLat: "Enter last latitude", + lastLng: "Enter last longitude", + battery: "Enter battery", + lastReportedTime: "Select last reported time", + lastLocationTime: "Select last location time", + createTime: "Select create time", + }, + status: { + enabled: "Enabled", + disabled: "Disabled", + }, + button: { + import: "Import", + claim: "Claim Device", + batchEnable: "Batch Enable", + batchDisable: "Batch Disable", + assign: "Assign Device", + export: "Export", + detail: "Detail", + trajectory: "Trajectory", + close: "Close", + }, + table: { + orderCode: "Order No.", + deviceStatus: "Device Status", + model: "Model", + sn: "Serial No.", + alias: "Name", + lastAddress: "Address", + updateTime: "Update Time", + coordinates: "Coordinates", + remark: "Remark", + actions: "Actions", + }, + dialog: { + import: { + title: "Device Excel Import", + fileLabel: "Excel File", + dragText: "Drag Excel file here, or ", + clickUpload: "click upload", + tip: "Only .xlsx/.xls is supported, and only one file is allowed", + templateTitle: "Import Template", + templateDesc: "Download the template first, fill in the device serial numbers using the template format, and then import it.", + downloadTemplate: "Download Template", + fieldExample: "Template field: serial_number", + sampleExample: "Sample value: SAMPLE_SN_001", + }, + importResult: { + title: "Import Result", + status: "Status", + total: "Total", + successCount: "Success", + failCount: "Failed", + startTime: "Start Time", + finishTime: "Finish Time", + requestErrors: "Request Errors", + failDetails: "Failure Details", + rowIndex: "Row", + errorMessage: "Error Message", + }, + assign: { + title: "Assign Device", + selectedUsers: "Selected employees: {count}", + }, + detail: { + title: "Device Detail", + macAddress: "MAC Address", + business: "Business", + lastAddressName: "Last Address Name", + assignedUsers: "Assigned Employees", + locateUpdateTime: "Last Locate Update Time", + lastCoordinates: "Last Coordinates", + battery: "Battery", + lastReportedTime: "Last Reported Time", + lastLocationTime: "Last Location Time", + }, + editInfo: { + title: "Edit Device Info", + }, + form: { + addTitle: "Add Device", + editTitle: "Edit Device", + }, + }, + form: { + privateKey: "Private Key", + batchNo: "Batch No.", + hashId: "Unique Hash ID", + bindBusinessId: "Bind Business ID", + locateUpdateTime: "Locate Update Time", + lastLat: "Last Latitude", + lastLng: "Last Longitude", + }, + validation: { + aliasMax: "Name length cannot exceed 64 characters", + remarkMax: "Remark length cannot exceed 255 characters", + fileRequired: "Please select an Excel file", + snRequired: "Serial number is required", + macRequired: "MAC address is required", + orderCodeRequired: "Order number is required", + privateKeyRequired: "Private key is required", + batchNoRequired: "Batch number is required", + hashIdRequired: "Unique hash ID is required", + remarkRequired: "Remark is required", + }, + importStatus: { + SUCCESS: "Import Success", + PARTIAL_SUCCESS: "Partial Success", + FAILED: "Import Failed", + REQUEST_INVALID: "Request Invalid", + UNKNOWN: "Unknown Status", + }, + message: { + selectDeviceForAssign: "Please select devices to assign first", + selectUserForAssign: "Please select employee accounts", + invalidUserSelection: "No valid employee account selected", + confirmAssign: "Assign {deviceCount} devices to {userCount} employees?", + assignSuccess: "Assigned successfully", + selectDeviceForEnable: "Please select devices to enable first", + confirmBatchEnable: "Enable {count} selected devices?", + batchEnableSuccess: "Batch enable success", + selectDeviceForDisable: "Please select devices to disable first", + confirmBatchDisable: "Disable {count} selected devices?", + batchDisableSuccess: "Batch disable success", + deviceInfoMissing: "Device information not found", + updateSuccess: "Updated successfully", + addSuccess: "Added successfully", + warning: "Warning", + confirmDelete: "Delete device record with id \"{ids}\"?", + deleteSuccess: "Deleted successfully", + confirmExport: "Export all device data?", + fetchBatchNoFailed: "Failed to fetch batch no: ", + apiException: "API exception", + exceedFileLimit: "Only one Excel file is allowed, currently selected: {count}", + invalidFileType: "Only .xlsx or .xls files are allowed", + selectOneExcel: "Please select one Excel file", + removeExtraFiles: "Only one Excel file is allowed, please remove extra files", + importSuccess: "Import successful", + importFailed: "Import failed: ", + serverException: "Server exception", + importStatusSummary: "{status}, success {successCount}, failed {failCount}", + }, +}; + +const deviceFr = { + query: { + orderCode: "Numero de commande", + model: "Modele", + sn: "Numero de serie", + alias: "Nom", + lastAddress: "Adresse", + remark: "Remarque appareil", + activationStatus: "Etat d'activation", + }, + placeholder: { + orderCode: "Saisir le numero de commande", + model: "Saisir le modele", + sn: "Saisir le numero de serie", + alias: "Saisir le nom", + lastAddress: "Saisir l'adresse", + remark: "Saisir la remarque appareil", + activationStatus: "Selectionner l'etat d'activation", + macAddress: "Saisir l'adresse MAC", + privateKey: "Saisir la cle privee", + batchNo: "Saisir le lot", + hashId: "Saisir l'ID hash unique", + bindBusinessId: "Saisir l'ID entreprise liee", + remarkSimple: "Saisir la remarque", + locateUpdateTime: "Selectionner l'heure de mise a jour de position", + lastLat: "Saisir la derniere latitude", + lastLng: "Saisir la derniere longitude", + battery: "Saisir la batterie", + lastReportedTime: "Selectionner la derniere heure de rapport", + lastLocationTime: "Selectionner la derniere heure de position", + createTime: "Selectionner l'heure de creation", + }, + status: { + enabled: "Active", + disabled: "Desactive", + }, + button: { + import: "Importer", + claim: "Reclamer appareil", + batchEnable: "Activation en lot", + batchDisable: "Desactivation en lot", + assign: "Affecter appareil", + export: "Exporter", + detail: "Detail", + trajectory: "Trajectoire", + close: "Fermer", + }, + table: { + orderCode: "Numero de commande", + deviceStatus: "Etat appareil", + model: "Modele", + sn: "Numero de serie", + alias: "Nom", + lastAddress: "Adresse", + updateTime: "Heure de mise a jour", + coordinates: "Coordonnees", + remark: "Remarque", + actions: "Actions", + }, + dialog: { + import: { + title: "Import Excel appareil", + fileLabel: "Fichier Excel", + dragText: "Glissez le fichier Excel ici, ou ", + clickUpload: "cliquez pour televerser", + tip: "Seuls les fichiers .xlsx/.xls sont pris en charge, et un seul fichier est autorise", + templateTitle: "Modele d'import", + templateDesc: "Telechargez d'abord le modele, renseignez les numeros de serie des appareils selon ce format, puis importez le fichier.", + downloadTemplate: "Telecharger le modele", + fieldExample: "Champ du modele : serial_number", + sampleExample: "Valeur d'exemple : SAMPLE_SN_001", + }, + importResult: { + title: "Resultat d'import", + status: "Statut", + total: "Total", + successCount: "Succes", + failCount: "Echecs", + startTime: "Heure de debut", + finishTime: "Heure de fin", + requestErrors: "Erreurs de requete", + failDetails: "Details des echecs", + rowIndex: "Ligne", + errorMessage: "Message d'erreur", + }, + assign: { + title: "Affecter appareil", + selectedUsers: "Employes selectionnes : {count}", + }, + detail: { + title: "Detail appareil", + macAddress: "Adresse MAC", + business: "Entreprise", + lastAddressName: "Dernier nom d'adresse", + assignedUsers: "Employes affectes", + locateUpdateTime: "Derniere mise a jour de position", + lastCoordinates: "Dernieres coordonnees", + battery: "Batterie", + lastReportedTime: "Derniere heure de rapport", + lastLocationTime: "Derniere heure de position", + }, + editInfo: { + title: "Modifier les infos appareil", + }, + form: { + addTitle: "Ajouter un appareil", + editTitle: "Modifier un appareil", + }, + }, + form: { + privateKey: "Cle privee", + batchNo: "Lot", + hashId: "ID hash unique", + bindBusinessId: "ID entreprise liee", + locateUpdateTime: "Heure de mise a jour de position", + lastLat: "Derniere latitude", + lastLng: "Derniere longitude", + }, + validation: { + aliasMax: "Le nom ne peut pas depasser 64 caracteres", + remarkMax: "La remarque ne peut pas depasser 255 caracteres", + fileRequired: "Veuillez selectionner un fichier Excel", + snRequired: "Le numero de serie est requis", + macRequired: "L'adresse MAC est requise", + orderCodeRequired: "Le numero de commande est requis", + privateKeyRequired: "La cle privee est requise", + batchNoRequired: "Le lot est requis", + hashIdRequired: "L'ID hash unique est requis", + remarkRequired: "La remarque est requise", + }, + importStatus: { + SUCCESS: "Import reussi", + PARTIAL_SUCCESS: "Succes partiel", + FAILED: "Import echoue", + REQUEST_INVALID: "Requete invalide", + UNKNOWN: "Statut inconnu", + }, + message: { + selectDeviceForAssign: "Veuillez d'abord selectionner les appareils a affecter", + selectUserForAssign: "Veuillez selectionner les comptes employes", + invalidUserSelection: "Aucun compte employe valide selectionne", + confirmAssign: "Confirmer l'affectation de {deviceCount} appareils a {userCount} employes ?", + assignSuccess: "Affectation reussie", + selectDeviceForEnable: "Veuillez d'abord selectionner les appareils a activer", + confirmBatchEnable: "Confirmer l'activation des {count} appareils selectionnes ?", + batchEnableSuccess: "Activation en lot reussie", + selectDeviceForDisable: "Veuillez d'abord selectionner les appareils a desactiver", + confirmBatchDisable: "Confirmer la desactivation des {count} appareils selectionnes ?", + batchDisableSuccess: "Desactivation en lot reussie", + deviceInfoMissing: "Informations appareil introuvables", + updateSuccess: "Modification reussie", + addSuccess: "Ajout reussi", + warning: "Avertissement", + confirmDelete: "Confirmer la suppression de l'enregistrement appareil avec l'ID \"{ids}\" ?", + deleteSuccess: "Suppression reussie", + confirmExport: "Confirmer l'export de toutes les donnees appareil ?", + fetchBatchNoFailed: "Echec de recuperation du numero de lot : ", + apiException: "Exception d'API", + exceedFileLimit: "Un seul fichier Excel est autorise, selection actuelle : {count}", + invalidFileType: "Seuls les fichiers .xlsx ou .xls sont autorises", + selectOneExcel: "Veuillez selectionner un fichier Excel", + removeExtraFiles: "Un seul fichier Excel est autorise, veuillez supprimer les fichiers en trop", + importSuccess: "Import reussi", + importFailed: "Import echoue : ", + serverException: "Exception serveur", + importStatusSummary: "{status}, succes {successCount}, echecs {failCount}", + }, +}; + +const deviceEs = { + query: { + orderCode: "Numero de pedido", + model: "Modelo", + sn: "Numero de serie", + alias: "Nombre", + lastAddress: "Direccion", + remark: "Observacion del dispositivo", + activationStatus: "Estado de activacion", + }, + placeholder: { + orderCode: "Ingrese numero de pedido", + model: "Ingrese modelo", + sn: "Ingrese numero de serie", + alias: "Ingrese nombre", + lastAddress: "Ingrese direccion", + remark: "Ingrese observacion del dispositivo", + activationStatus: "Seleccione estado de activacion", + macAddress: "Ingrese direccion MAC", + privateKey: "Ingrese clave privada", + batchNo: "Ingrese lote", + hashId: "Ingrese ID hash unico", + bindBusinessId: "Ingrese ID de empresa vinculada", + remarkSimple: "Ingrese observacion", + locateUpdateTime: "Seleccione hora de actualizacion de posicion", + lastLat: "Ingrese ultima latitud", + lastLng: "Ingrese ultima longitud", + battery: "Ingrese bateria", + lastReportedTime: "Seleccione ultima hora de reporte", + lastLocationTime: "Seleccione ultima hora de posicion", + createTime: "Seleccione hora de creacion", + }, + status: { + enabled: "Habilitado", + disabled: "Deshabilitado", + }, + button: { + import: "Importar", + claim: "Reclamar dispositivo", + batchEnable: "Habilitar en lote", + batchDisable: "Deshabilitar en lote", + assign: "Asignar dispositivo", + export: "Exportar", + detail: "Detalle", + trajectory: "Trayectoria", + close: "Cerrar", + }, + table: { + orderCode: "Numero de pedido", + deviceStatus: "Estado del dispositivo", + model: "Modelo", + sn: "Numero de serie", + alias: "Nombre", + lastAddress: "Direccion", + updateTime: "Hora de actualizacion", + coordinates: "Coordenadas", + remark: "Observacion", + actions: "Acciones", + }, + dialog: { + import: { + title: "Importacion Excel de dispositivos", + fileLabel: "Archivo Excel", + dragText: "Arrastre el archivo Excel aqui, o ", + clickUpload: "haga clic para cargar", + tip: "Solo se admiten archivos .xlsx/.xls y solo se permite un archivo", + templateTitle: "Plantilla de importacion", + templateDesc: "Primero descargue la plantilla, complete los numeros de serie del dispositivo segun ese formato y luego importe el archivo.", + downloadTemplate: "Descargar plantilla", + fieldExample: "Campo de la plantilla: serial_number", + sampleExample: "Valor de ejemplo: SAMPLE_SN_001", + }, + importResult: { + title: "Resultado de importacion", + status: "Estado", + total: "Total", + successCount: "Exitos", + failCount: "Fallos", + startTime: "Hora de inicio", + finishTime: "Hora de fin", + requestErrors: "Errores de solicitud", + failDetails: "Detalle de fallos", + rowIndex: "Fila", + errorMessage: "Mensaje de error", + }, + assign: { + title: "Asignar dispositivo", + selectedUsers: "Empleados seleccionados: {count}", + }, + detail: { + title: "Detalle del dispositivo", + macAddress: "Direccion MAC", + business: "Empresa", + lastAddressName: "Nombre de ultima direccion", + assignedUsers: "Empleados asignados", + locateUpdateTime: "Ultima actualizacion de posicion", + lastCoordinates: "Ultimas coordenadas", + battery: "Bateria", + lastReportedTime: "Ultima hora de reporte", + lastLocationTime: "Ultima hora de posicion", + }, + editInfo: { + title: "Editar informacion del dispositivo", + }, + form: { + addTitle: "Agregar dispositivo", + editTitle: "Editar dispositivo", + }, + }, + form: { + privateKey: "Clave privada", + batchNo: "Lote", + hashId: "ID hash unico", + bindBusinessId: "ID de empresa vinculada", + locateUpdateTime: "Hora de actualizacion de posicion", + lastLat: "Ultima latitud", + lastLng: "Ultima longitud", + }, + validation: { + aliasMax: "El nombre no puede superar 64 caracteres", + remarkMax: "La observacion no puede superar 255 caracteres", + fileRequired: "Seleccione un archivo Excel", + snRequired: "El numero de serie es obligatorio", + macRequired: "La direccion MAC es obligatoria", + orderCodeRequired: "El numero de pedido es obligatorio", + privateKeyRequired: "La clave privada es obligatoria", + batchNoRequired: "El lote es obligatorio", + hashIdRequired: "El ID hash unico es obligatorio", + remarkRequired: "La observacion es obligatoria", + }, + importStatus: { + SUCCESS: "Importacion exitosa", + PARTIAL_SUCCESS: "Exito parcial", + FAILED: "Importacion fallida", + REQUEST_INVALID: "Solicitud invalida", + UNKNOWN: "Estado desconocido", + }, + message: { + selectDeviceForAssign: "Primero seleccione los dispositivos a asignar", + selectUserForAssign: "Seleccione cuentas de empleados", + invalidUserSelection: "No se obtuvo ninguna cuenta de empleado valida", + confirmAssign: "Confirmar asignar {deviceCount} dispositivos a {userCount} empleados?", + assignSuccess: "Asignacion exitosa", + selectDeviceForEnable: "Primero seleccione los dispositivos a habilitar", + confirmBatchEnable: "Confirmar habilitar {count} dispositivos seleccionados?", + batchEnableSuccess: "Habilitacion en lote exitosa", + selectDeviceForDisable: "Primero seleccione los dispositivos a deshabilitar", + confirmBatchDisable: "Confirmar deshabilitar {count} dispositivos seleccionados?", + batchDisableSuccess: "Deshabilitacion en lote exitosa", + deviceInfoMissing: "No se encontro informacion del dispositivo", + updateSuccess: "Actualizacion exitosa", + addSuccess: "Alta exitosa", + warning: "Advertencia", + confirmDelete: "Confirmar eliminar el registro de dispositivo con ID \"{ids}\"?", + deleteSuccess: "Eliminacion exitosa", + confirmExport: "Confirmar exportar todos los datos de dispositivos?", + fetchBatchNoFailed: "No se pudo obtener el numero de lote: ", + apiException: "Excepcion de API", + exceedFileLimit: "Solo se permite un archivo Excel, seleccion actual: {count}", + invalidFileType: "Solo se permiten archivos .xlsx o .xls", + selectOneExcel: "Seleccione un archivo Excel", + removeExtraFiles: "Solo se permite un archivo Excel, elimine los archivos adicionales", + importSuccess: "Importacion exitosa", + importFailed: "Importacion fallida: ", + serverException: "Excepcion del servidor", + importStatusSummary: "{status}, exitos {successCount}, fallos {failCount}", + }, +}; + +const devicePt = { + query: { + orderCode: "Numero do pedido", + model: "Modelo", + sn: "Numero de serie", + alias: "Nome", + lastAddress: "Endereco", + remark: "Observacao do dispositivo", + activationStatus: "Status de ativacao", + }, + placeholder: { + orderCode: "Digite o numero do pedido", + model: "Digite o modelo", + sn: "Digite o numero de serie", + alias: "Digite o nome", + lastAddress: "Digite o endereco", + remark: "Digite a observacao do dispositivo", + activationStatus: "Selecione o status de ativacao", + macAddress: "Digite o endereco MAC", + privateKey: "Digite a chave privada", + batchNo: "Digite o lote", + hashId: "Digite o ID hash unico", + bindBusinessId: "Digite o ID da empresa vinculada", + remarkSimple: "Digite a observacao", + locateUpdateTime: "Selecione a hora da ultima atualizacao de posicao", + lastLat: "Digite a ultima latitude", + lastLng: "Digite a ultima longitude", + battery: "Digite a bateria", + lastReportedTime: "Selecione a ultima hora de reporte", + lastLocationTime: "Selecione a ultima hora de posicao", + createTime: "Selecione a hora de criacao", + }, + status: { + enabled: "Ativado", + disabled: "Desativado", + }, + button: { + import: "Importar", + claim: "Reivindicar dispositivo", + batchEnable: "Ativar em lote", + batchDisable: "Desativar em lote", + assign: "Atribuir dispositivo", + export: "Exportar", + detail: "Detalhe", + trajectory: "Trajetoria", + close: "Fechar", + }, + table: { + orderCode: "Numero do pedido", + deviceStatus: "Status do dispositivo", + model: "Modelo", + sn: "Numero de serie", + alias: "Nome", + lastAddress: "Endereco", + updateTime: "Hora da atualizacao", + coordinates: "Coordenadas", + remark: "Observacao", + actions: "Acoes", + }, + dialog: { + import: { + title: "Importacao Excel de dispositivos", + fileLabel: "Arquivo Excel", + dragText: "Arraste o arquivo Excel aqui, ou ", + clickUpload: "clique para enviar", + tip: "Apenas arquivos .xlsx/.xls sao suportados e somente um arquivo e permitido", + templateTitle: "Modelo de importacao", + templateDesc: "Baixe primeiro o modelo, preencha os numeros de serie do dispositivo no formato indicado e depois importe o arquivo.", + downloadTemplate: "Baixar modelo", + fieldExample: "Campo do modelo: serial_number", + sampleExample: "Valor de exemplo: SAMPLE_SN_001", + }, + importResult: { + title: "Resultado da importacao", + status: "Status", + total: "Total", + successCount: "Sucessos", + failCount: "Falhas", + startTime: "Hora de inicio", + finishTime: "Hora de fim", + requestErrors: "Erros de requisicao", + failDetails: "Detalhes das falhas", + rowIndex: "Linha", + errorMessage: "Mensagem de erro", + }, + assign: { + title: "Atribuir dispositivo", + selectedUsers: "Funcionarios selecionados: {count}", + }, + detail: { + title: "Detalhe do dispositivo", + macAddress: "Endereco MAC", + business: "Empresa", + lastAddressName: "Nome do ultimo endereco", + assignedUsers: "Funcionarios atribuidos", + locateUpdateTime: "Ultima atualizacao de posicao", + lastCoordinates: "Ultimas coordenadas", + battery: "Bateria", + lastReportedTime: "Ultima hora de reporte", + lastLocationTime: "Ultima hora de posicao", + }, + editInfo: { + title: "Editar informacoes do dispositivo", + }, + form: { + addTitle: "Adicionar dispositivo", + editTitle: "Editar dispositivo", + }, + }, + form: { + privateKey: "Chave privada", + batchNo: "Lote", + hashId: "ID hash unico", + bindBusinessId: "ID da empresa vinculada", + locateUpdateTime: "Hora da ultima atualizacao de posicao", + lastLat: "Ultima latitude", + lastLng: "Ultima longitude", + }, + validation: { + aliasMax: "O nome nao pode exceder 64 caracteres", + remarkMax: "A observacao nao pode exceder 255 caracteres", + fileRequired: "Selecione um arquivo Excel", + snRequired: "O numero de serie e obrigatorio", + macRequired: "O endereco MAC e obrigatorio", + orderCodeRequired: "O numero do pedido e obrigatorio", + privateKeyRequired: "A chave privada e obrigatoria", + batchNoRequired: "O lote e obrigatorio", + hashIdRequired: "O ID hash unico e obrigatorio", + remarkRequired: "A observacao e obrigatoria", + }, + importStatus: { + SUCCESS: "Importacao bem-sucedida", + PARTIAL_SUCCESS: "Sucesso parcial", + FAILED: "Falha na importacao", + REQUEST_INVALID: "Requisicao invalida", + UNKNOWN: "Status desconhecido", + }, + message: { + selectDeviceForAssign: "Selecione primeiro os dispositivos para atribuicao", + selectUserForAssign: "Selecione as contas de funcionarios", + invalidUserSelection: "Nenhuma conta valida de funcionario foi encontrada", + confirmAssign: "Confirmar atribuicao de {deviceCount} dispositivos para {userCount} funcionarios?", + assignSuccess: "Atribuicao concluida com sucesso", + selectDeviceForEnable: "Selecione primeiro os dispositivos para ativar", + confirmBatchEnable: "Confirmar ativacao de {count} dispositivos selecionados?", + batchEnableSuccess: "Ativacao em lote concluida com sucesso", + selectDeviceForDisable: "Selecione primeiro os dispositivos para desativar", + confirmBatchDisable: "Confirmar desativacao de {count} dispositivos selecionados?", + batchDisableSuccess: "Desativacao em lote concluida com sucesso", + deviceInfoMissing: "Informacoes do dispositivo nao encontradas", + updateSuccess: "Atualizacao concluida com sucesso", + addSuccess: "Adicao concluida com sucesso", + warning: "Aviso", + confirmDelete: "Confirmar exclusao do registro do dispositivo com ID \"{ids}\"?", + deleteSuccess: "Exclusao concluida com sucesso", + confirmExport: "Confirmar exportacao de todos os dados de dispositivos?", + fetchBatchNoFailed: "Falha ao obter numero do lote: ", + apiException: "Excecao de API", + exceedFileLimit: "Apenas um arquivo Excel e permitido, selecao atual: {count}", + invalidFileType: "Apenas arquivos .xlsx ou .xls sao permitidos", + selectOneExcel: "Selecione um arquivo Excel", + removeExtraFiles: "Apenas um arquivo Excel e permitido, remova os arquivos extras", + importSuccess: "Importacao concluida com sucesso", + importFailed: "Falha na importacao: ", + serverException: "Excecao do servidor", + importStatusSummary: "{status}, sucessos {successCount}, falhas {failCount}", + }, +}; + +const deviceMessages = { + "zh-CN": { device: deviceZh }, + "en-US": { device: deviceEn }, + "fr-FR": { device: deviceFr }, + "es-ES": { device: deviceEs }, + "pt-BR": { device: devicePt }, +}; + +export default deviceMessages; diff --git a/src/lang/index.js b/src/lang/index.js new file mode 100644 index 0000000..134132b --- /dev/null +++ b/src/lang/index.js @@ -0,0 +1,100 @@ +import messages from "./messages"; +import deviceMessages from "./device-messages"; +import deviceFlowMessages from "./device-flow-messages"; +import appMessages from "./app-messages"; +import systemMessages from "./system-messages"; +import systemUserDeviceMessages from "./system-user-device-messages"; +import profileMessages from "./profile-messages"; +import { getLanguage } from "@/utils/language"; + +const DEFAULT_LANGUAGE = "zh-CN"; + +function isPlainObject(value) { + return Object.prototype.toString.call(value) === "[object Object]"; +} + +function deepMerge(target, source) { + const output = { ...target }; + Object.keys(source || {}).forEach((key) => { + const sourceValue = source[key]; + const targetValue = output[key]; + if (isPlainObject(sourceValue) && isPlainObject(targetValue)) { + output[key] = deepMerge(targetValue, sourceValue); + return; + } + output[key] = sourceValue; + }); + return output; +} + +function mergeLocaleMessages(baseMessages, extraMessages) { + const merged = { ...baseMessages }; + Object.keys(extraMessages || {}).forEach((locale) => { + merged[locale] = deepMerge(merged[locale] || {}, extraMessages[locale]); + }); + return merged; +} + +const mergedMessages = mergeLocaleMessages( + mergeLocaleMessages( + mergeLocaleMessages( + mergeLocaleMessages( + mergeLocaleMessages( + mergeLocaleMessages(messages, deviceMessages), + deviceFlowMessages + ), + appMessages + ), + systemMessages + ), + systemUserDeviceMessages + ), + profileMessages +); + +function getByPath(obj, path) { + if (!obj || !path) { + return undefined; + } + return path.split(".").reduce((acc, item) => (acc && acc[item] !== undefined ? acc[item] : undefined), obj); +} + +function formatTemplate(text, params = {}) { + if (!text || typeof text !== "string") { + return text; + } + return text.replace(/\{(\w+)\}/g, (full, key) => { + if (params[key] === undefined || params[key] === null) { + return full; + } + return String(params[key]); + }); +} + +export function t(key, params = {}) { + const currentLanguage = getLanguage() || DEFAULT_LANGUAGE; + const currentMessages = mergedMessages[currentLanguage] || {}; + const defaultMessages = mergedMessages[DEFAULT_LANGUAGE] || {}; + + const fromCurrent = getByPath(currentMessages, key); + if (fromCurrent !== undefined) { + return formatTemplate(fromCurrent, params); + } + + const fromDefault = getByPath(defaultMessages, key); + if (fromDefault !== undefined) { + return formatTemplate(fromDefault, params); + } + + return key; +} + +const I18nPlugin = { + install(Vue) { + Vue.prototype.$t = function translate(key, params = {}) { + return t(key, params); + }; + }, +}; + +export default I18nPlugin; diff --git a/src/lang/messages.js b/src/lang/messages.js new file mode 100644 index 0000000..4bd0a73 --- /dev/null +++ b/src/lang/messages.js @@ -0,0 +1,594 @@ +const messages = { + "zh-CN": { + common: { + confirm: "确定", + cancel: "取消", + tips: "提示", + home: "首页", + search: "搜索", + reset: "重置", + add: "新增", + edit: "修改", + remove: "删除", + status: "状态", + createTime: "创建时间", + actions: "操作", + }, + lang: { + title: "语言", + "zh-CN": "中文", + "en-US": "英语", + "fr-FR": "法语", + "es-ES": "西班牙语", + "pt-BR": "葡萄牙语", + }, + navbar: { + layoutSize: "布局大小", + profile: "个人中心", + logout: "退出登录", + logoutConfirm: "确定注销并退出系统吗?", + }, + login: { + title: "GeoTag 企业客户后台", + usernamePlaceholder: "账号", + passwordPlaceholder: "密码", + googleCodePlaceholder: "谷歌验证码", + login: "登 录", + loggingIn: "登 录 中...", + usernameRequired: "用户名不能为空", + passwordRequired: "密码不能为空", + codeRequired: "验证码不能为空", + humanVerifyRequired: "请进行人机验证", + }, + menu: { + menuName: "菜单名称", + status: "状态", + search: "搜索", + reset: "重置", + add: "新增", + expandCollapse: "展开/折叠", + icon: "图标", + orderNum: "排序", + perms: "权限标识", + component: "组件路径", + createTime: "创建时间", + actions: "操作", + edit: "修改", + delete: "删除", + parentMenu: "上级菜单", + selectParentMenu: "选择上级菜单", + menuType: "菜单类型", + menuTypeM: "目录", + menuTypeC: "菜单", + menuTypeF: "按钮", + menuIcon: "菜单图标", + clickSelectIcon: "点击选择图标", + displayOrder: "显示排序", + defaultName: "默认名称", + defaultNamePlaceholder: "请输入默认菜单名称(中文)", + path: "路由地址", + pathPlaceholder: "请输入路由地址", + componentPath: "组件路径", + componentPathPlaceholder: "请输入组件路径", + permsLabel: "权限字符", + permsPlaceholder: "请输入权限标识", + isFrame: "是否外链", + yes: "是", + no: "否", + isCache: "是否缓存", + cache: "缓存", + noCache: "不缓存", + visible: "显示状态", + show: "显示", + hide: "隐藏", + menuStatus: "菜单状态", + normal: "正常", + disable: "停用", + i18nTitle: "菜单多语言名称", + zhCN: "中文 (zh-CN)", + enUS: "英文 (en-US)", + frFR: "法语 (fr-FR)", + esES: "西语 (es-ES)", + ptBR: "葡语 (pt-BR)", + zhCNPlaceholder: "默认将与菜单名称同步", + enUSPlaceholder: "请输入英文菜单名称", + frFRPlaceholder: "请输入法语菜单名称", + esESPlaceholder: "请输入西语菜单名称", + ptBRPlaceholder: "请输入葡语菜单名称", + rootCategory: "主类目", + titleAdd: "添加菜单", + titleEdit: "修改菜单", + formNameRequired: "菜单名称不能为空", + formOrderRequired: "菜单排序不能为空", + formPathRequired: "路由地址不能为空", + msgEditSuccess: "修改成功", + msgAddSuccess: "新增成功", + msgDeleteSuccess: "删除成功", + confirmDelete: "是否确认删除名称为\"{name}\"的数据项?", + }, + request: { + reloginTip: "登录状态已过期,您可以继续留在该页面,或者重新登录", + relogin: "重新登录", + invalidSession: "无效的会话,或者会话已过期,请重新登录。", + backendConnectError: "后端接口连接异常", + requestTimeout: "系统接口请求超时", + apiErrorStatus: "系统接口{status}异常", + downloading: "正在下载数据,请稍候", + downloadError: "下载文件出现错误,请联系管理员!", + }, + }, + "en-US": { + common: { + confirm: "Confirm", + cancel: "Cancel", + tips: "Notice", + home: "Home", + search: "Search", + reset: "Reset", + add: "Add", + edit: "Edit", + remove: "Delete", + status: "Status", + createTime: "Created Time", + actions: "Actions", + }, + lang: { + title: "Language", + "zh-CN": "Chinese", + "en-US": "English", + "fr-FR": "French", + "es-ES": "Spanish", + "pt-BR": "Portuguese", + }, + navbar: { + layoutSize: "Layout Size", + profile: "Profile", + logout: "Logout", + logoutConfirm: "Are you sure you want to log out?", + }, + login: { + title: "GeoTag Enterprise Portal", + usernamePlaceholder: "Username", + passwordPlaceholder: "Password", + googleCodePlaceholder: "Google Auth Code", + login: "Log In", + loggingIn: "Logging In...", + usernameRequired: "Username is required", + passwordRequired: "Password is required", + codeRequired: "Verification code is required", + humanVerifyRequired: "Please complete human verification", + }, + menu: { + menuName: "Menu Name", + status: "Status", + search: "Search", + reset: "Reset", + add: "Add", + expandCollapse: "Expand/Collapse", + icon: "Icon", + orderNum: "Order", + perms: "Permission Key", + component: "Component Path", + createTime: "Created Time", + actions: "Actions", + edit: "Edit", + delete: "Delete", + parentMenu: "Parent Menu", + selectParentMenu: "Select Parent Menu", + menuType: "Menu Type", + menuTypeM: "Directory", + menuTypeC: "Menu", + menuTypeF: "Button", + menuIcon: "Menu Icon", + clickSelectIcon: "Click to select icon", + displayOrder: "Display Order", + defaultName: "Default Name", + defaultNamePlaceholder: "Enter default menu name (Chinese)", + path: "Route Path", + pathPlaceholder: "Enter route path", + componentPath: "Component Path", + componentPathPlaceholder: "Enter component path", + permsLabel: "Permission Key", + permsPlaceholder: "Enter permission key", + isFrame: "External Link", + yes: "Yes", + no: "No", + isCache: "Cache", + cache: "Cache", + noCache: "No Cache", + visible: "Visibility", + show: "Show", + hide: "Hide", + menuStatus: "Menu Status", + normal: "Normal", + disable: "Disabled", + i18nTitle: "Menu I18n Names", + zhCN: "Chinese (zh-CN)", + enUS: "English (en-US)", + frFR: "French (fr-FR)", + esES: "Spanish (es-ES)", + ptBR: "Portuguese (pt-BR)", + zhCNPlaceholder: "Will sync with menu name by default", + enUSPlaceholder: "Enter English menu name", + frFRPlaceholder: "Enter French menu name", + esESPlaceholder: "Enter Spanish menu name", + ptBRPlaceholder: "Enter Portuguese menu name", + rootCategory: "Root", + titleAdd: "Add Menu", + titleEdit: "Edit Menu", + formNameRequired: "Menu name is required", + formOrderRequired: "Display order is required", + formPathRequired: "Route path is required", + msgEditSuccess: "Updated successfully", + msgAddSuccess: "Added successfully", + msgDeleteSuccess: "Deleted successfully", + confirmDelete: "Delete item \"{name}\"?", + }, + request: { + reloginTip: "Session expired. Stay on this page or log in again.", + relogin: "Log In Again", + invalidSession: "Invalid session, please log in again.", + backendConnectError: "Backend connection error", + requestTimeout: "Request timeout", + apiErrorStatus: "API error {status}", + downloading: "Downloading, please wait...", + downloadError: "Download failed, please contact administrator.", + }, + }, + "fr-FR": { + common: { + confirm: "Confirmer", + cancel: "Annuler", + tips: "Info", + home: "Accueil", + search: "Rechercher", + reset: "Réinitialiser", + add: "Ajouter", + edit: "Modifier", + remove: "Supprimer", + status: "Statut", + createTime: "Date de création", + actions: "Actions", + }, + lang: { + title: "Langue", + "zh-CN": "Chinois", + "en-US": "Anglais", + "fr-FR": "Français", + "es-ES": "Espagnol", + "pt-BR": "Portugais", + }, + navbar: { + layoutSize: "Taille de mise en page", + profile: "Profil", + logout: "Se déconnecter", + logoutConfirm: "Confirmer la déconnexion ?", + }, + login: { + title: "Portail Entreprise GeoTag", + usernamePlaceholder: "Compte", + passwordPlaceholder: "Mot de passe", + googleCodePlaceholder: "Code Google Auth", + login: "Connexion", + loggingIn: "Connexion...", + usernameRequired: "Le nom d'utilisateur est requis", + passwordRequired: "Le mot de passe est requis", + codeRequired: "Le code est requis", + humanVerifyRequired: "Veuillez effectuer la vérification humaine", + }, + menu: { + menuName: "Nom du menu", + status: "Statut", + search: "Rechercher", + reset: "Réinitialiser", + add: "Ajouter", + expandCollapse: "Déplier/Replier", + icon: "Icône", + orderNum: "Ordre", + perms: "Clé de permission", + component: "Chemin du composant", + createTime: "Date de création", + actions: "Actions", + edit: "Modifier", + delete: "Supprimer", + parentMenu: "Menu parent", + selectParentMenu: "Choisir le menu parent", + menuType: "Type de menu", + menuTypeM: "Répertoire", + menuTypeC: "Menu", + menuTypeF: "Bouton", + menuIcon: "Icône du menu", + clickSelectIcon: "Cliquer pour choisir une icône", + displayOrder: "Ordre d'affichage", + defaultName: "Nom par défaut", + defaultNamePlaceholder: "Saisir le nom par défaut (chinois)", + path: "Chemin de route", + pathPlaceholder: "Saisir le chemin de route", + componentPath: "Chemin du composant", + componentPathPlaceholder: "Saisir le chemin du composant", + permsLabel: "Clé de permission", + permsPlaceholder: "Saisir la clé de permission", + isFrame: "Lien externe", + yes: "Oui", + no: "Non", + isCache: "Cache", + cache: "Cache", + noCache: "Sans cache", + visible: "Visibilité", + show: "Afficher", + hide: "Masquer", + menuStatus: "Statut du menu", + normal: "Normal", + disable: "Désactivé", + i18nTitle: "Noms multilingues du menu", + zhCN: "Chinois (zh-CN)", + enUS: "Anglais (en-US)", + frFR: "Français (fr-FR)", + esES: "Espagnol (es-ES)", + ptBR: "Portugais (pt-BR)", + zhCNPlaceholder: "Synchronisé avec le nom par défaut", + enUSPlaceholder: "Saisir le nom anglais", + frFRPlaceholder: "Saisir le nom français", + esESPlaceholder: "Saisir le nom espagnol", + ptBRPlaceholder: "Saisir le nom portugais", + rootCategory: "Racine", + titleAdd: "Ajouter un menu", + titleEdit: "Modifier le menu", + formNameRequired: "Le nom du menu est requis", + formOrderRequired: "L'ordre est requis", + formPathRequired: "Le chemin est requis", + msgEditSuccess: "Modification réussie", + msgAddSuccess: "Ajout réussi", + msgDeleteSuccess: "Suppression réussie", + confirmDelete: "Supprimer l'élément \"{name}\" ?", + }, + request: { + reloginTip: "Session expirée, veuillez vous reconnecter.", + relogin: "Se reconnecter", + invalidSession: "Session invalide, veuillez vous reconnecter.", + backendConnectError: "Erreur de connexion au backend", + requestTimeout: "Délai de requête dépassé", + apiErrorStatus: "Erreur API {status}", + downloading: "Téléchargement en cours...", + downloadError: "Échec du téléchargement, contactez l'administrateur.", + }, + }, + "es-ES": { + common: { + confirm: "Confirmar", + cancel: "Cancelar", + tips: "Aviso", + home: "Inicio", + search: "Buscar", + reset: "Restablecer", + add: "Agregar", + edit: "Editar", + remove: "Eliminar", + status: "Estado", + createTime: "Fecha de creación", + actions: "Acciones", + }, + lang: { + title: "Idioma", + "zh-CN": "Chino", + "en-US": "Inglés", + "fr-FR": "Francés", + "es-ES": "Español", + "pt-BR": "Portugués", + }, + navbar: { + layoutSize: "Tamaño de diseño", + profile: "Perfil", + logout: "Cerrar sesión", + logoutConfirm: "¿Confirmar cierre de sesión?", + }, + login: { + title: "Portal Empresarial GeoTag", + usernamePlaceholder: "Cuenta", + passwordPlaceholder: "Contraseña", + googleCodePlaceholder: "Código de Google", + login: "Iniciar sesión", + loggingIn: "Iniciando sesión...", + usernameRequired: "El usuario es obligatorio", + passwordRequired: "La contraseña es obligatoria", + codeRequired: "El código es obligatorio", + humanVerifyRequired: "Complete la verificación humana", + }, + menu: { + menuName: "Nombre del menú", + status: "Estado", + search: "Buscar", + reset: "Restablecer", + add: "Agregar", + expandCollapse: "Expandir/Contraer", + icon: "Icono", + orderNum: "Orden", + perms: "Clave de permiso", + component: "Ruta del componente", + createTime: "Fecha de creación", + actions: "Acciones", + edit: "Editar", + delete: "Eliminar", + parentMenu: "Menú padre", + selectParentMenu: "Seleccionar menú padre", + menuType: "Tipo de menú", + menuTypeM: "Directorio", + menuTypeC: "Menú", + menuTypeF: "Botón", + menuIcon: "Icono del menú", + clickSelectIcon: "Haga clic para seleccionar icono", + displayOrder: "Orden de visualización", + defaultName: "Nombre predeterminado", + defaultNamePlaceholder: "Ingrese nombre predeterminado (chino)", + path: "Ruta", + pathPlaceholder: "Ingrese ruta", + componentPath: "Ruta del componente", + componentPathPlaceholder: "Ingrese ruta del componente", + permsLabel: "Clave de permiso", + permsPlaceholder: "Ingrese clave de permiso", + isFrame: "Enlace externo", + yes: "Sí", + no: "No", + isCache: "Cache", + cache: "Cache", + noCache: "Sin cache", + visible: "Visibilidad", + show: "Mostrar", + hide: "Ocultar", + menuStatus: "Estado del menú", + normal: "Normal", + disable: "Deshabilitado", + i18nTitle: "Nombres multilingües del menú", + zhCN: "Chino (zh-CN)", + enUS: "Inglés (en-US)", + frFR: "Francés (fr-FR)", + esES: "Español (es-ES)", + ptBR: "Portugués (pt-BR)", + zhCNPlaceholder: "Se sincroniza con el nombre del menú", + enUSPlaceholder: "Ingrese nombre en inglés", + frFRPlaceholder: "Ingrese nombre en francés", + esESPlaceholder: "Ingrese nombre en español", + ptBRPlaceholder: "Ingrese nombre en portugués", + rootCategory: "Raíz", + titleAdd: "Agregar menú", + titleEdit: "Editar menú", + formNameRequired: "El nombre del menú es obligatorio", + formOrderRequired: "El orden es obligatorio", + formPathRequired: "La ruta es obligatoria", + msgEditSuccess: "Actualizado correctamente", + msgAddSuccess: "Agregado correctamente", + msgDeleteSuccess: "Eliminado correctamente", + confirmDelete: "¿Eliminar el elemento \"{name}\"?", + }, + request: { + reloginTip: "La sesión expiró, vuelva a iniciar sesión.", + relogin: "Iniciar sesión de nuevo", + invalidSession: "Sesión inválida, inicie sesión de nuevo.", + backendConnectError: "Error de conexión con el backend", + requestTimeout: "Tiempo de espera agotado", + apiErrorStatus: "Error API {status}", + downloading: "Descargando, espere...", + downloadError: "Error al descargar, contacte al administrador.", + }, + }, + "pt-BR": { + common: { + confirm: "Confirmar", + cancel: "Cancelar", + tips: "Aviso", + home: "Início", + search: "Pesquisar", + reset: "Redefinir", + add: "Adicionar", + edit: "Editar", + remove: "Excluir", + status: "Status", + createTime: "Data de criação", + actions: "Ações", + }, + lang: { + title: "Idioma", + "zh-CN": "Chinês", + "en-US": "Inglês", + "fr-FR": "Francês", + "es-ES": "Espanhol", + "pt-BR": "Português", + }, + navbar: { + layoutSize: "Tamanho do layout", + profile: "Perfil", + logout: "Sair", + logoutConfirm: "Confirmar saída do sistema?", + }, + login: { + title: "Portal Empresarial GeoTag", + usernamePlaceholder: "Conta", + passwordPlaceholder: "Senha", + googleCodePlaceholder: "Código Google", + login: "Entrar", + loggingIn: "Entrando...", + usernameRequired: "Usuário é obrigatório", + passwordRequired: "Senha é obrigatória", + codeRequired: "Código é obrigatório", + humanVerifyRequired: "Conclua a verificação humana", + }, + menu: { + menuName: "Nome do menu", + status: "Status", + search: "Pesquisar", + reset: "Redefinir", + add: "Adicionar", + expandCollapse: "Expandir/Recolher", + icon: "Ícone", + orderNum: "Ordem", + perms: "Chave de permissão", + component: "Caminho do componente", + createTime: "Data de criação", + actions: "Ações", + edit: "Editar", + delete: "Excluir", + parentMenu: "Menu pai", + selectParentMenu: "Selecionar menu pai", + menuType: "Tipo de menu", + menuTypeM: "Diretório", + menuTypeC: "Menu", + menuTypeF: "Botão", + menuIcon: "Ícone do menu", + clickSelectIcon: "Clique para selecionar ícone", + displayOrder: "Ordem de exibição", + defaultName: "Nome padrão", + defaultNamePlaceholder: "Digite o nome padrão (chinês)", + path: "Rota", + pathPlaceholder: "Digite a rota", + componentPath: "Caminho do componente", + componentPathPlaceholder: "Digite o caminho do componente", + permsLabel: "Chave de permissão", + permsPlaceholder: "Digite a chave de permissão", + isFrame: "Link externo", + yes: "Sim", + no: "Não", + isCache: "Cache", + cache: "Cache", + noCache: "Sem cache", + visible: "Visibilidade", + show: "Mostrar", + hide: "Ocultar", + menuStatus: "Status do menu", + normal: "Normal", + disable: "Desativado", + i18nTitle: "Nomes multilíngues do menu", + zhCN: "Chinês (zh-CN)", + enUS: "Inglês (en-US)", + frFR: "Francês (fr-FR)", + esES: "Espanhol (es-ES)", + ptBR: "Português (pt-BR)", + zhCNPlaceholder: "Sincroniza com nome padrão", + enUSPlaceholder: "Digite nome em inglês", + frFRPlaceholder: "Digite nome em francês", + esESPlaceholder: "Digite nome em espanhol", + ptBRPlaceholder: "Digite nome em português", + rootCategory: "Raiz", + titleAdd: "Adicionar menu", + titleEdit: "Editar menu", + formNameRequired: "Nome do menu é obrigatório", + formOrderRequired: "Ordem é obrigatória", + formPathRequired: "Rota é obrigatória", + msgEditSuccess: "Atualizado com sucesso", + msgAddSuccess: "Adicionado com sucesso", + msgDeleteSuccess: "Excluído com sucesso", + confirmDelete: "Excluir o item \"{name}\"?", + }, + request: { + reloginTip: "Sessão expirada, faça login novamente.", + relogin: "Entrar novamente", + invalidSession: "Sessão inválida, faça login novamente.", + backendConnectError: "Erro de conexão com o backend", + requestTimeout: "Tempo de requisição esgotado", + apiErrorStatus: "Erro da API {status}", + downloading: "Baixando, aguarde...", + downloadError: "Erro ao baixar, contate o administrador.", + }, + }, +}; + +export default messages; diff --git a/src/lang/profile-messages.js b/src/lang/profile-messages.js new file mode 100644 index 0000000..42e6ba2 --- /dev/null +++ b/src/lang/profile-messages.js @@ -0,0 +1,244 @@ +const profileMessages = { + "zh-CN": { + profile: { + title: "基本资料", + tabs: { + basic: "基本资料", + password: "修改密码", + }, + form: { + account: "登录账户", + businessName: "所属企业", + nickName: "昵称", + googleKey: "谷歌地图 Key", + gaodeKey: "高德地图 Key", + gaodeSecurityKey: "高德安全密钥", + oldPassword: "旧密码", + newPassword: "新密码", + confirmPassword: "确认密码", + }, + placeholder: { + googleKey: "请输入谷歌地图 Key", + gaodeKey: "请输入高德地图 Key", + gaodeSecurityKey: "请输入高德安全密钥", + oldPassword: "请输入旧密码", + newPassword: "请输入新密码", + confirmPassword: "请再次输入新密码", + }, + tip: { + businessConfigReadonly: "当前账号只能修改自己的昵称,企业地图 Key 仅企业管理员可修改。", + }, + button: { + saveProfile: "保存资料", + reset: "重置", + changePassword: "修改密码", + }, + message: { + profileUpdated: "基本资料已更新", + passwordUpdated: "密码修改成功", + }, + validation: { + nickNameRequired: "昵称不能为空", + oldPasswordRequired: "旧密码不能为空", + newPasswordRequired: "新密码不能为空", + newPasswordLength: "长度在 6 到 20 个字符", + confirmPasswordRequired: "确认密码不能为空", + confirmPasswordMismatch: "两次输入的新密码不一致", + }, + }, + }, + "en-US": { + profile: { + title: "Basic Information", + tabs: { + basic: "Basic Information", + password: "Change Password", + }, + form: { + account: "Login Account", + businessName: "Business", + nickName: "Nickname", + googleKey: "Google Maps Key", + gaodeKey: "Amap Key", + gaodeSecurityKey: "Amap Security Key", + oldPassword: "Old Password", + newPassword: "New Password", + confirmPassword: "Confirm Password", + }, + placeholder: { + googleKey: "Enter Google Maps Key", + gaodeKey: "Enter Amap Key", + gaodeSecurityKey: "Enter Amap Security Key", + oldPassword: "Enter old password", + newPassword: "Enter new password", + confirmPassword: "Enter the new password again", + }, + tip: { + businessConfigReadonly: "This account can only update its own nickname. Business map keys can only be updated by enterprise administrators.", + }, + button: { + saveProfile: "Save Profile", + reset: "Reset", + changePassword: "Change Password", + }, + message: { + profileUpdated: "Profile updated successfully", + passwordUpdated: "Password changed successfully", + }, + validation: { + nickNameRequired: "Nickname is required", + oldPasswordRequired: "Old password is required", + newPasswordRequired: "New password is required", + newPasswordLength: "Length must be between 6 and 20 characters", + confirmPasswordRequired: "Please confirm the password", + confirmPasswordMismatch: "The two passwords do not match", + }, + }, + }, + "fr-FR": { + profile: { + title: "Informations de base", + tabs: { + basic: "Informations de base", + password: "Modifier le mot de passe", + }, + form: { + account: "Compte de connexion", + businessName: "Entreprise", + nickName: "Surnom", + googleKey: "Cle Google Maps", + gaodeKey: "Cle Amap", + gaodeSecurityKey: "Cle de securite Amap", + oldPassword: "Ancien mot de passe", + newPassword: "Nouveau mot de passe", + confirmPassword: "Confirmer le mot de passe", + }, + placeholder: { + googleKey: "Saisissez la cle Google Maps", + gaodeKey: "Saisissez la cle Amap", + gaodeSecurityKey: "Saisissez la cle de securite Amap", + oldPassword: "Saisissez l'ancien mot de passe", + newPassword: "Saisissez le nouveau mot de passe", + confirmPassword: "Saisissez a nouveau le nouveau mot de passe", + }, + tip: { + businessConfigReadonly: "Ce compte peut uniquement modifier son propre surnom. Les cles de carte de l'entreprise ne peuvent etre modifiees que par les administrateurs d'entreprise.", + }, + button: { + saveProfile: "Enregistrer", + reset: "Reinitialiser", + changePassword: "Modifier le mot de passe", + }, + message: { + profileUpdated: "Informations mises a jour avec succes", + passwordUpdated: "Mot de passe modifie avec succes", + }, + validation: { + nickNameRequired: "Le surnom est requis", + oldPasswordRequired: "L'ancien mot de passe est requis", + newPasswordRequired: "Le nouveau mot de passe est requis", + newPasswordLength: "La longueur doit etre comprise entre 6 et 20 caracteres", + confirmPasswordRequired: "Veuillez confirmer le mot de passe", + confirmPasswordMismatch: "Les deux mots de passe ne correspondent pas", + }, + }, + }, + "es-ES": { + profile: { + title: "Informacion basica", + tabs: { + basic: "Informacion basica", + password: "Cambiar contrasena", + }, + form: { + account: "Cuenta de acceso", + businessName: "Empresa", + nickName: "Apodo", + googleKey: "Clave de Google Maps", + gaodeKey: "Clave de Amap", + gaodeSecurityKey: "Clave de seguridad de Amap", + oldPassword: "Contrasena anterior", + newPassword: "Nueva contrasena", + confirmPassword: "Confirmar contrasena", + }, + placeholder: { + googleKey: "Ingrese la clave de Google Maps", + gaodeKey: "Ingrese la clave de Amap", + gaodeSecurityKey: "Ingrese la clave de seguridad de Amap", + oldPassword: "Ingrese la contrasena anterior", + newPassword: "Ingrese la nueva contrasena", + confirmPassword: "Ingrese nuevamente la nueva contrasena", + }, + tip: { + businessConfigReadonly: "Esta cuenta solo puede modificar su propio apodo. Las claves de mapa de la empresa solo pueden ser modificadas por administradores empresariales.", + }, + button: { + saveProfile: "Guardar datos", + reset: "Restablecer", + changePassword: "Cambiar contrasena", + }, + message: { + profileUpdated: "Informacion actualizada correctamente", + passwordUpdated: "Contrasena cambiada correctamente", + }, + validation: { + nickNameRequired: "El apodo es obligatorio", + oldPasswordRequired: "La contrasena anterior es obligatoria", + newPasswordRequired: "La nueva contrasena es obligatoria", + newPasswordLength: "La longitud debe estar entre 6 y 20 caracteres", + confirmPasswordRequired: "Confirme la contrasena", + confirmPasswordMismatch: "Las dos contrasenas no coinciden", + }, + }, + }, + "pt-BR": { + profile: { + title: "Informacoes basicas", + tabs: { + basic: "Informacoes basicas", + password: "Alterar senha", + }, + form: { + account: "Conta de acesso", + businessName: "Empresa", + nickName: "Apelido", + googleKey: "Chave do Google Maps", + gaodeKey: "Chave da Amap", + gaodeSecurityKey: "Chave de seguranca da Amap", + oldPassword: "Senha antiga", + newPassword: "Nova senha", + confirmPassword: "Confirmar senha", + }, + placeholder: { + googleKey: "Digite a chave do Google Maps", + gaodeKey: "Digite a chave da Amap", + gaodeSecurityKey: "Digite a chave de seguranca da Amap", + oldPassword: "Digite a senha antiga", + newPassword: "Digite a nova senha", + confirmPassword: "Digite novamente a nova senha", + }, + tip: { + businessConfigReadonly: "Esta conta so pode alterar o proprio apelido. As chaves de mapa da empresa so podem ser alteradas por administradores empresariais.", + }, + button: { + saveProfile: "Salvar dados", + reset: "Redefinir", + changePassword: "Alterar senha", + }, + message: { + profileUpdated: "Informacoes atualizadas com sucesso", + passwordUpdated: "Senha alterada com sucesso", + }, + validation: { + nickNameRequired: "O apelido e obrigatorio", + oldPasswordRequired: "A senha antiga e obrigatoria", + newPasswordRequired: "A nova senha e obrigatoria", + newPasswordLength: "O comprimento deve estar entre 6 e 20 caracteres", + confirmPasswordRequired: "Confirme a senha", + confirmPasswordMismatch: "As duas senhas nao coincidem", + }, + }, + }, +}; + +export default profileMessages; diff --git a/src/lang/system-messages.js b/src/lang/system-messages.js new file mode 100644 index 0000000..ff64984 --- /dev/null +++ b/src/lang/system-messages.js @@ -0,0 +1,9 @@ +const systemMessages={ +"zh-CN":{systemUser:{query:{account:"\u7528\u6237\u540d\u79f0",nickName:"\u6635\u79f0",status:"\u72b6\u6001"},placeholder:{account:"\u8bf7\u8f93\u5165\u7528\u6237\u540d\u79f0",nickName:"\u8bf7\u8f93\u5165\u6635\u79f0",status:"\u7528\u6237\u72b6\u6001",password:"\u8bf7\u8f93\u5165\u7528\u6237\u5bc6\u7801",userNickName:"\u8bf7\u8f93\u5165\u7528\u6237\u6635\u79f0",remark:"\u8bf7\u8f93\u5165\u5185\u5bb9",loginAccount:"\u8bf7\u8f93\u5165\u767b\u5f55\u8d26\u6237",employeePassword:"\u8bf7\u8f93\u5165\u5bc6\u7801",roleAll:"\u8bf7\u9009\u62e9\u89d2\u8272\uff08\u5168\u90e8\u89d2\u8272\uff09",role:"\u8bf7\u9009\u62e9\u89d2\u8272"},status:{enabled:"\u542f\u7528",disabled:"\u7981\u7528"},button:{addEmployee:"\u65b0\u589e\u5458\u5de5",export:"\u5bfc\u51fa",resetPassword:"\u91cd\u7f6e"},table:{id:"\u7528\u6237ID",account:"\u7528\u6237\u540d\u79f0",nickName:"\u7528\u6237\u6635\u79f0",dept:"\u90e8\u95e8",phone:"\u624b\u673a\u53f7\u7801",status:"\u72b6\u6001",googleAuthSecret:"\u8c37\u6b4c\u4ee4\u724c",createTime:"\u521b\u5efa\u65f6\u95f4",actions:"\u64cd\u4f5c"},dialog:{addTitle:"\u6dfb\u52a0\u7528\u6237",editTitle:"\u4fee\u6539\u7528\u6237",addEmployeeTitle:"\u65b0\u589e\u5458\u5de5",importTitle:"\u7528\u6237\u5bfc\u5165",importResultTitle:"\u5bfc\u5165\u7ed3\u679c"},form:{account:"\u7528\u6237\u540d\u79f0",password:"\u7528\u6237\u5bc6\u7801",nickName:"\u7528\u6237\u6635\u79f0",role:"\u89d2\u8272",status:"\u72b6\u6001",remark:"\u5907\u6ce8",loginAccount:"\u767b\u5f55\u8d26\u6237",employeeNickName:"\u6635\u79f0",employeePassword:"\u5bc6\u7801"},upload:{dragText:"\u5c06\u6587\u4ef6\u62d6\u5230\u6b64\u5904\uff0c\u6216",clickUpload:"\u70b9\u51fb\u4e0a\u4f20",updateSupport:"\u662f\u5426\u66f4\u65b0\u5df2\u7ecf\u5b58\u5728\u7684\u7528\u6237\u6570\u636e",downloadTemplate:"\u4e0b\u8f7d\u6a21\u677f",fileTip:"\u63d0\u793a\uff1a\u4ec5\u5141\u8bb8\u5bfc\u5165\u201cxls\u201d\u6216\u201cxlsx\u201d\u683c\u5f0f\u6587\u4ef6\uff01"},message:{warningTitle:"\u8b66\u544a",confirmStatusChange:"\u786e\u8ba4\u8981\u5c06\u7528\u6237\u201c{account}\u201d\u8bbe\u4e3a{action}\u5417\uff1f",statusChangeSuccess:"{action}\u6210\u529f",resetPwdPrompt:"\u8bf7\u8f93\u5165\u201c{account}\u201d\u7684\u65b0\u5bc6\u7801",resetPwdSuccess:"\u4fee\u6539\u6210\u529f\uff0c\u65b0\u5bc6\u7801\u662f\uff1a{password}",selectRoleFirst:"\u8bf7\u5148\u9009\u62e9\u89d2\u8272",editSuccess:"\u4fee\u6539\u6210\u529f",addSuccess:"\u65b0\u589e\u6210\u529f",addEmployeeSuccess:"\u65b0\u589e\u5458\u5de5\u6210\u529f",confirmDelete:"\u662f\u5426\u786e\u8ba4\u5220\u9664\u7528\u6237\u7f16\u53f7\u4e3a\u201c{ids}\u201d\u7684\u6570\u636e\u9879\uff1f",deleteSuccess:"\u5220\u9664\u6210\u529f",confirmExport:"\u662f\u5426\u786e\u8ba4\u5bfc\u51fa\u6240\u6709\u7528\u6237\u6570\u636e\u9879\uff1f"},validation:{accountRequired:"\u7528\u6237\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a",nickNameRequired:"\u7528\u6237\u6635\u79f0\u4e0d\u80fd\u4e3a\u7a7a",roleRequired:"\u8bf7\u9009\u62e9\u89d2\u8272",passwordRequired:"\u7528\u6237\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a",emailInvalid:"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u90ae\u7bb1\u5730\u5740",phoneInvalid:"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7\u7801",employeeNickNameRequired:"\u6635\u79f0\u4e0d\u80fd\u4e3a\u7a7a",loginAccountRequired:"\u767b\u5f55\u8d26\u6237\u4e0d\u80fd\u4e3a\u7a7a",employeePasswordRequired:"\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a"},roleOptionPrefix:"\u89d2\u8272"},systemRole:{query:{roleName:"\u89d2\u8272\u540d\u79f0",roleKey:"\u6743\u9650\u5b57\u7b26",status:"\u72b6\u6001"},placeholder:{roleName:"\u8bf7\u8f93\u5165\u89d2\u8272\u540d\u79f0",roleKey:"\u8bf7\u8f93\u5165\u6743\u9650\u5b57\u7b26",status:"\u89d2\u8272\u72b6\u6001",permissionKey:"\u8bf7\u8f93\u5165\u6743\u9650\u5b57\u7b26",remark:"\u8bf7\u8f93\u5165\u5185\u5bb9"},status:{normal:"\u6b63\u5e38",disabled:"\u505c\u7528"},button:{export:"\u5bfc\u51fa"},table:{roleId:"\u89d2\u8272\u7f16\u53f7",roleName:"\u89d2\u8272\u540d\u79f0",roleKey:"\u6743\u9650\u5b57\u7b26",roleSort:"\u663e\u793a\u987a\u5e8f",status:"\u72b6\u6001",createTime:"\u521b\u5efa\u65f6\u95f4",actions:"\u64cd\u4f5c"},dialog:{addTitle:"\u6dfb\u52a0\u89d2\u8272",editTitle:"\u4fee\u6539\u89d2\u8272",dataScopeTitle:"\u5206\u914d\u6570\u636e\u6743\u9650"},form:{roleName:"\u89d2\u8272\u540d\u79f0",roleKey:"\u6743\u9650\u5b57\u7b26",roleSort:"\u89d2\u8272\u987a\u5e8f",status:"\u72b6\u6001",menuPermission:"\u83dc\u5355\u6743\u9650",remark:"\u5907\u6ce8",scopeRoleName:"\u89d2\u8272\u540d\u79f0",scopeRoleKey:"\u6743\u9650\u5b57\u7b26",permissionRange:"\u6743\u9650\u8303\u56f4",dataPermission:"\u6570\u636e\u6743\u9650"},tree:{expandCollapse:"\u5c55\u5f00/\u6298\u53e0",selectAll:"\u5168\u9009/\u5168\u4e0d\u9009",parentChildLinkage:"\u7236\u5b50\u8054\u52a8",loading:"\u52a0\u8f7d\u4e2d\uff0c\u8bf7\u7a0d\u5019"},dataScope:{all:"\u5168\u90e8\u6570\u636e\u6743\u9650",custom:"\u81ea\u5b9a\u6570\u636e\u6743\u9650",dept:"\u672c\u90e8\u95e8\u6570\u636e\u6743\u9650",deptAndChild:"\u672c\u90e8\u95e8\u53ca\u4ee5\u4e0b\u6570\u636e\u6743\u9650",self:"\u4ec5\u672c\u4eba\u6570\u636e\u6743\u9650"},dropdown:{dataScope:"\u6570\u636e\u6743\u9650",assignUser:"\u5206\u914d\u7528\u6237"},tooltip:{roleKey:"\u63a7\u5236\u5668\u4e2d\u5b9a\u4e49\u7684\u6743\u9650\u5b57\u7b26\uff0c\u5982\uff1a@PreAuthorize(`@ss.hasRole('admin')`)"},message:{confirmStatusChange:"\u786e\u8ba4\u8981\u5c06\u89d2\u8272\u201c{roleName}\u201d\u8bbe\u4e3a{action}\u5417\uff1f",statusChangeSuccess:"{action}\u6210\u529f",editSuccess:"\u4fee\u6539\u6210\u529f",addSuccess:"\u65b0\u589e\u6210\u529f",confirmDelete:"\u662f\u5426\u786e\u8ba4\u5220\u9664\u89d2\u8272\u7f16\u53f7\u4e3a\u201c{roleIds}\u201d\u7684\u6570\u636e\u9879\uff1f",deleteSuccess:"\u5220\u9664\u6210\u529f"},validation:{roleNameRequired:"\u89d2\u8272\u540d\u79f0\u4e0d\u80fd\u4e3a\u7a7a",roleKeyRequired:"\u6743\u9650\u5b57\u7b26\u4e0d\u80fd\u4e3a\u7a7a",roleSortRequired:"\u89d2\u8272\u987a\u5e8f\u4e0d\u80fd\u4e3a\u7a7a"}}}, +"en-US":{systemUser:{query:{account:"User Name",nickName:"Nickname",status:"Status"},placeholder:{account:"Enter user name",nickName:"Enter nickname",status:"Select user status",password:"Enter user password",userNickName:"Enter user nickname",remark:"Enter remark",loginAccount:"Enter login account",employeePassword:"Enter password",roleAll:"Select role (all roles)",role:"Select role"},status:{enabled:"Enabled",disabled:"Disabled"},button:{addEmployee:"Add Employee",export:"Export",resetPassword:"Reset"},table:{id:"User ID",account:"User Name",nickName:"User Nickname",dept:"Department",phone:"Phone Number",status:"Status",googleAuthSecret:"Google Token",createTime:"Created Time",actions:"Actions"},dialog:{addTitle:"Add User",editTitle:"Edit User",addEmployeeTitle:"Add Employee",importTitle:"Import Users",importResultTitle:"Import Result"},form:{account:"User Name",password:"User Password",nickName:"User Nickname",role:"Role",status:"Status",remark:"Remark",loginAccount:"Login Account",employeeNickName:"Nickname",employeePassword:"Password"},upload:{dragText:"Drop the file here, or",clickUpload:"click to upload",updateSupport:"Update existing user data",downloadTemplate:"Download Template",fileTip:"Tip: only xls or xlsx files are allowed."},message:{warningTitle:"Warning",confirmStatusChange:"Confirm setting user \"{account}\" to {action}?",statusChangeSuccess:"{action} successfully",resetPwdPrompt:"Enter a new password for \"{account}\"",resetPwdSuccess:"Updated successfully. New password: {password}",selectRoleFirst:"Please select at least one role",editSuccess:"Updated successfully",addSuccess:"Added successfully",addEmployeeSuccess:"Employee added successfully",confirmDelete:"Delete the user item with ID \"{ids}\"?",deleteSuccess:"Deleted successfully",confirmExport:"Export all user data items?"},validation:{accountRequired:"User name is required",nickNameRequired:"User nickname is required",roleRequired:"Please select at least one role",passwordRequired:"User password is required",emailInvalid:"Enter a valid email address",phoneInvalid:"Enter a valid phone number",employeeNickNameRequired:"Nickname is required",loginAccountRequired:"Login account is required",employeePasswordRequired:"Password is required"},roleOptionPrefix:"Role "},systemRole:{query:{roleName:"Role Name",roleKey:"Permission Key",status:"Status"},placeholder:{roleName:"Enter role name",roleKey:"Enter permission key",status:"Select role status",permissionKey:"Enter permission key",remark:"Enter remark"},status:{normal:"Normal",disabled:"Disabled"},button:{export:"Export"},table:{roleId:"Role ID",roleName:"Role Name",roleKey:"Permission Key",roleSort:"Display Order",status:"Status",createTime:"Created Time",actions:"Actions"},dialog:{addTitle:"Add Role",editTitle:"Edit Role",dataScopeTitle:"Assign Data Scope"},form:{roleName:"Role Name",roleKey:"Permission Key",roleSort:"Role Order",status:"Status",menuPermission:"Menu Permission",remark:"Remark",scopeRoleName:"Role Name",scopeRoleKey:"Permission Key",permissionRange:"Permission Scope",dataPermission:"Data Permission"},tree:{expandCollapse:"Expand/Collapse",selectAll:"Select All/Clear",parentChildLinkage:"Parent-Child Linkage",loading:"Loading, please wait"},dataScope:{all:"All Data Scope",custom:"Custom Data Scope",dept:"Department Data Scope",deptAndChild:"Department and Children Data Scope",self:"Personal Data Scope"},dropdown:{dataScope:"Data Scope",assignUser:"Assign User"},tooltip:{roleKey:"Permission key defined in the controller, for example: @PreAuthorize(`@ss.hasRole('admin')`)"},message:{confirmStatusChange:"Confirm setting role \"{roleName}\" to {action}?",statusChangeSuccess:"{action} successfully",editSuccess:"Updated successfully",addSuccess:"Added successfully",confirmDelete:"Delete the role item with ID \"{roleIds}\"?",deleteSuccess:"Deleted successfully"},validation:{roleNameRequired:"Role name is required",roleKeyRequired:"Permission key is required",roleSortRequired:"Role order is required"}}}, +"fr-FR":{systemUser:{query:{account:"Nom d'utilisateur",nickName:"Surnom",status:"Statut"},placeholder:{account:"Saisissez le nom d'utilisateur",nickName:"Saisissez le surnom",status:"Selectionnez le statut utilisateur",password:"Saisissez le mot de passe utilisateur",userNickName:"Saisissez le surnom utilisateur",remark:"Saisissez une remarque",loginAccount:"Saisissez le compte de connexion",employeePassword:"Saisissez le mot de passe",roleAll:"Selectionnez le role (tous les roles)",role:"Selectionnez le role"},status:{enabled:"Active",disabled:"Desactive"},button:{addEmployee:"Ajouter employe",export:"Exporter",resetPassword:"Reinitialiser"},table:{id:"ID utilisateur",account:"Nom d'utilisateur",nickName:"Surnom utilisateur",dept:"Departement",phone:"Numero de telephone",status:"Statut",googleAuthSecret:"Jeton Google",createTime:"Date de creation",actions:"Actions"},dialog:{addTitle:"Ajouter utilisateur",editTitle:"Modifier utilisateur",addEmployeeTitle:"Ajouter employe",importTitle:"Importer des utilisateurs",importResultTitle:"Resultat d'import"},form:{account:"Nom d'utilisateur",password:"Mot de passe utilisateur",nickName:"Surnom utilisateur",role:"Role",status:"Statut",remark:"Remarque",loginAccount:"Compte de connexion",employeeNickName:"Surnom",employeePassword:"Mot de passe"},upload:{dragText:"Deposez le fichier ici, ou",clickUpload:"cliquez pour televerser",updateSupport:"Mettre a jour les donnees utilisateur existantes",downloadTemplate:"Telecharger le modele",fileTip:"Astuce : seuls les fichiers xls ou xlsx sont autorises."},message:{warningTitle:"Avertissement",confirmStatusChange:"Confirmer le passage de l'utilisateur \"{account}\" a l'etat {action} ?",statusChangeSuccess:"Operation {action} reussie",resetPwdPrompt:"Saisissez un nouveau mot de passe pour \"{account}\"",resetPwdSuccess:"Modification reussie. Nouveau mot de passe : {password}",selectRoleFirst:"Veuillez selectionner au moins un role",editSuccess:"Modification reussie",addSuccess:"Ajout reussi",addEmployeeSuccess:"Employe ajoute avec succes",confirmDelete:"Supprimer l'element utilisateur avec l'ID \"{ids}\" ?",deleteSuccess:"Suppression reussie",confirmExport:"Exporter toutes les donnees utilisateur ?"},validation:{accountRequired:"Le nom d'utilisateur est requis",nickNameRequired:"Le surnom utilisateur est requis",roleRequired:"Veuillez selectionner au moins un role",passwordRequired:"Le mot de passe utilisateur est requis",emailInvalid:"Saisissez une adresse e-mail valide",phoneInvalid:"Saisissez un numero de telephone valide",employeeNickNameRequired:"Le surnom est requis",loginAccountRequired:"Le compte de connexion est requis",employeePasswordRequired:"Le mot de passe est requis"},roleOptionPrefix:"Role "},systemRole:{query:{roleName:"Nom du role",roleKey:"Cle de permission",status:"Statut"},placeholder:{roleName:"Saisissez le nom du role",roleKey:"Saisissez la cle de permission",status:"Selectionnez le statut du role",permissionKey:"Saisissez la cle de permission",remark:"Saisissez une remarque"},status:{normal:"Normal",disabled:"Desactive"},button:{export:"Exporter"},table:{roleId:"ID role",roleName:"Nom du role",roleKey:"Cle de permission",roleSort:"Ordre d'affichage",status:"Statut",createTime:"Date de creation",actions:"Actions"},dialog:{addTitle:"Ajouter role",editTitle:"Modifier role",dataScopeTitle:"Affecter la portee des donnees"},form:{roleName:"Nom du role",roleKey:"Cle de permission",roleSort:"Ordre du role",status:"Statut",menuPermission:"Permission du menu",remark:"Remarque",scopeRoleName:"Nom du role",scopeRoleKey:"Cle de permission",permissionRange:"Portee de permission",dataPermission:"Permission des donnees"},tree:{expandCollapse:"Developper/Replier",selectAll:"Tout selectionner/Tout annuler",parentChildLinkage:"Liaison parent-enfant",loading:"Chargement en cours, veuillez patienter"},dataScope:{all:"Toutes les donnees",custom:"Portee personnalisee",dept:"Donnees du departement",deptAndChild:"Donnees du departement et sous-departements",self:"Donnees personnelles uniquement"},dropdown:{dataScope:"Permission des donnees",assignUser:"Affecter utilisateur"},tooltip:{roleKey:"Cle de permission definie dans le controleur, par exemple : @PreAuthorize(`@ss.hasRole('admin')`)"},message:{confirmStatusChange:"Confirmer le passage du role \"{roleName}\" a l'etat {action} ?",statusChangeSuccess:"Operation {action} reussie",editSuccess:"Modification reussie",addSuccess:"Ajout reussi",confirmDelete:"Supprimer l'element role avec l'ID \"{roleIds}\" ?",deleteSuccess:"Suppression reussie"},validation:{roleNameRequired:"Le nom du role est requis",roleKeyRequired:"La cle de permission est requise",roleSortRequired:"L'ordre du role est requis"}}}, +"es-ES":{systemUser:{query:{account:"Nombre de usuario",nickName:"Apodo",status:"Estado"},placeholder:{account:"Ingrese el nombre de usuario",nickName:"Ingrese el apodo",status:"Seleccione el estado del usuario",password:"Ingrese la contrasena del usuario",userNickName:"Ingrese el apodo del usuario",remark:"Ingrese una observacion",loginAccount:"Ingrese la cuenta de acceso",employeePassword:"Ingrese la contrasena",roleAll:"Seleccione el rol (todos los roles)",role:"Seleccione el rol"},status:{enabled:"Activo",disabled:"Inactivo"},button:{addEmployee:"Agregar empleado",export:"Exportar",resetPassword:"Restablecer"},table:{id:"ID de usuario",account:"Nombre de usuario",nickName:"Apodo del usuario",dept:"Departamento",phone:"Numero de telefono",status:"Estado",googleAuthSecret:"Token de Google",createTime:"Fecha de creacion",actions:"Acciones"},dialog:{addTitle:"Agregar usuario",editTitle:"Editar usuario",addEmployeeTitle:"Agregar empleado",importTitle:"Importar usuarios",importResultTitle:"Resultado de importacion"},form:{account:"Nombre de usuario",password:"Contrasena del usuario",nickName:"Apodo del usuario",role:"Rol",status:"Estado",remark:"Observacion",loginAccount:"Cuenta de acceso",employeeNickName:"Apodo",employeePassword:"Contrasena"},upload:{dragText:"Suelte el archivo aqui, o",clickUpload:"haga clic para cargarlo",updateSupport:"Actualizar los datos de usuario existentes",downloadTemplate:"Descargar plantilla",fileTip:"Consejo: solo se permiten archivos xls o xlsx."},message:{warningTitle:"Advertencia",confirmStatusChange:"Confirme cambiar el usuario \"{account}\" a {action}.",statusChangeSuccess:"Cambio a {action} realizado correctamente",resetPwdPrompt:"Ingrese una nueva contrasena para \"{account}\"",resetPwdSuccess:"Modificacion correcta. Nueva contrasena: {password}",selectRoleFirst:"Seleccione al menos un rol",editSuccess:"Modificacion correcta",addSuccess:"Agregado correctamente",addEmployeeSuccess:"Empleado agregado correctamente",confirmDelete:"Eliminar el elemento de usuario con ID \"{ids}\"?",deleteSuccess:"Eliminado correctamente",confirmExport:"Exportar todos los datos de usuario?"},validation:{accountRequired:"El nombre de usuario es obligatorio",nickNameRequired:"El apodo del usuario es obligatorio",roleRequired:"Seleccione al menos un rol",passwordRequired:"La contrasena del usuario es obligatoria",emailInvalid:"Ingrese un correo electronico valido",phoneInvalid:"Ingrese un numero de telefono valido",employeeNickNameRequired:"El apodo es obligatorio",loginAccountRequired:"La cuenta de acceso es obligatoria",employeePasswordRequired:"La contrasena es obligatoria"},roleOptionPrefix:"Rol "},systemRole:{query:{roleName:"Nombre del rol",roleKey:"Clave de permiso",status:"Estado"},placeholder:{roleName:"Ingrese el nombre del rol",roleKey:"Ingrese la clave de permiso",status:"Seleccione el estado del rol",permissionKey:"Ingrese la clave de permiso",remark:"Ingrese una observacion"},status:{normal:"Normal",disabled:"Inactivo"},button:{export:"Exportar"},table:{roleId:"ID del rol",roleName:"Nombre del rol",roleKey:"Clave de permiso",roleSort:"Orden de visualizacion",status:"Estado",createTime:"Fecha de creacion",actions:"Acciones"},dialog:{addTitle:"Agregar rol",editTitle:"Editar rol",dataScopeTitle:"Asignar alcance de datos"},form:{roleName:"Nombre del rol",roleKey:"Clave de permiso",roleSort:"Orden del rol",status:"Estado",menuPermission:"Permiso del menu",remark:"Observacion",scopeRoleName:"Nombre del rol",scopeRoleKey:"Clave de permiso",permissionRange:"Rango de permiso",dataPermission:"Permiso de datos"},tree:{expandCollapse:"Expandir/Contraer",selectAll:"Seleccionar todo/Limpiar",parentChildLinkage:"Vinculacion padre-hijo",loading:"Cargando, por favor espere"},dataScope:{all:"Alcance total de datos",custom:"Alcance personalizado",dept:"Datos del departamento",deptAndChild:"Datos del departamento y subordinados",self:"Solo datos personales"},dropdown:{dataScope:"Permiso de datos",assignUser:"Asignar usuario"},tooltip:{roleKey:"Clave de permiso definida en el controlador, por ejemplo: @PreAuthorize(`@ss.hasRole('admin')`)"},message:{confirmStatusChange:"Confirme cambiar el rol \"{roleName}\" a {action}.",statusChangeSuccess:"Cambio a {action} realizado correctamente",editSuccess:"Modificacion correcta",addSuccess:"Agregado correctamente",confirmDelete:"Eliminar el elemento de rol con ID \"{roleIds}\"?",deleteSuccess:"Eliminado correctamente"},validation:{roleNameRequired:"El nombre del rol es obligatorio",roleKeyRequired:"La clave de permiso es obligatoria",roleSortRequired:"El orden del rol es obligatorio"}}}, +"pt-BR":{systemUser:{query:{account:"Nome do usuario",nickName:"Apelido",status:"Status"},placeholder:{account:"Digite o nome do usuario",nickName:"Digite o apelido",status:"Selecione o status do usuario",password:"Digite a senha do usuario",userNickName:"Digite o apelido do usuario",remark:"Digite uma observacao",loginAccount:"Digite a conta de acesso",employeePassword:"Digite a senha",roleAll:"Selecione a funcao (todas as funcoes)",role:"Selecione a funcao"},status:{enabled:"Ativo",disabled:"Inativo"},button:{addEmployee:"Adicionar funcionario",export:"Exportar",resetPassword:"Redefinir"},table:{id:"ID do usuario",account:"Nome do usuario",nickName:"Apelido do usuario",dept:"Departamento",phone:"Numero de telefone",status:"Status",googleAuthSecret:"Token do Google",createTime:"Data de criacao",actions:"Acoes"},dialog:{addTitle:"Adicionar usuario",editTitle:"Editar usuario",addEmployeeTitle:"Adicionar funcionario",importTitle:"Importar usuarios",importResultTitle:"Resultado da importacao"},form:{account:"Nome do usuario",password:"Senha do usuario",nickName:"Apelido do usuario",role:"Funcao",status:"Status",remark:"Observacao",loginAccount:"Conta de acesso",employeeNickName:"Apelido",employeePassword:"Senha"},upload:{dragText:"Solte o arquivo aqui, ou",clickUpload:"clique para enviar",updateSupport:"Atualizar os dados de usuario existentes",downloadTemplate:"Baixar modelo",fileTip:"Dica: apenas arquivos xls ou xlsx sao permitidos."},message:{warningTitle:"Aviso",confirmStatusChange:"Confirmar a alteracao do usuario \"{account}\" para {action}?",statusChangeSuccess:"Alteracao para {action} concluida com sucesso",resetPwdPrompt:"Digite uma nova senha para \"{account}\"",resetPwdSuccess:"Alteracao concluida. Nova senha: {password}",selectRoleFirst:"Selecione pelo menos uma funcao",editSuccess:"Alteracao concluida com sucesso",addSuccess:"Adicionado com sucesso",addEmployeeSuccess:"Funcionario adicionado com sucesso",confirmDelete:"Excluir o item de usuario com ID \"{ids}\"?",deleteSuccess:"Excluido com sucesso",confirmExport:"Exportar todos os dados de usuario?"},validation:{accountRequired:"O nome do usuario e obrigatorio",nickNameRequired:"O apelido do usuario e obrigatorio",roleRequired:"Selecione pelo menos uma funcao",passwordRequired:"A senha do usuario e obrigatoria",emailInvalid:"Digite um e-mail valido",phoneInvalid:"Digite um numero de telefone valido",employeeNickNameRequired:"O apelido e obrigatorio",loginAccountRequired:"A conta de acesso e obrigatoria",employeePasswordRequired:"A senha e obrigatoria"},roleOptionPrefix:"Funcao "},systemRole:{query:{roleName:"Nome da funcao",roleKey:"Chave de permissao",status:"Status"},placeholder:{roleName:"Digite o nome da funcao",roleKey:"Digite a chave de permissao",status:"Selecione o status da funcao",permissionKey:"Digite a chave de permissao",remark:"Digite uma observacao"},status:{normal:"Normal",disabled:"Inativo"},button:{export:"Exportar"},table:{roleId:"ID da funcao",roleName:"Nome da funcao",roleKey:"Chave de permissao",roleSort:"Ordem de exibicao",status:"Status",createTime:"Data de criacao",actions:"Acoes"},dialog:{addTitle:"Adicionar funcao",editTitle:"Editar funcao",dataScopeTitle:"Atribuir escopo de dados"},form:{roleName:"Nome da funcao",roleKey:"Chave de permissao",roleSort:"Ordem da funcao",status:"Status",menuPermission:"Permissao do menu",remark:"Observacao",scopeRoleName:"Nome da funcao",scopeRoleKey:"Chave de permissao",permissionRange:"Faixa de permissao",dataPermission:"Permissao de dados"},tree:{expandCollapse:"Expandir/Recolher",selectAll:"Selecionar tudo/Limpar",parentChildLinkage:"Vinculo pai-filho",loading:"Carregando, aguarde"},dataScope:{all:"Escopo total de dados",custom:"Escopo personalizado",dept:"Dados do departamento",deptAndChild:"Dados do departamento e subordinados",self:"Apenas dados pessoais"},dropdown:{dataScope:"Permissao de dados",assignUser:"Atribuir usuario"},tooltip:{roleKey:"Chave de permissao definida no controlador, por exemplo: @PreAuthorize(`@ss.hasRole('admin')`)"},message:{confirmStatusChange:"Confirmar a alteracao da funcao \"{roleName}\" para {action}?",statusChangeSuccess:"Alteracao para {action} concluida com sucesso",editSuccess:"Alteracao concluida com sucesso",addSuccess:"Adicionado com sucesso",confirmDelete:"Excluir o item de funcao com ID \"{roleIds}\"?",deleteSuccess:"Excluido com sucesso"},validation:{roleNameRequired:"O nome da funcao e obrigatorio",roleKeyRequired:"A chave de permissao e obrigatoria",roleSortRequired:"A ordem da funcao e obrigatoria"}}} +}; + +export default systemMessages; diff --git a/src/lang/system-user-device-messages.js b/src/lang/system-user-device-messages.js new file mode 100644 index 0000000..e922310 --- /dev/null +++ b/src/lang/system-user-device-messages.js @@ -0,0 +1,219 @@ +const systemUserDeviceMessages = { + "zh-CN": { + systemUser: { + button: { + viewDevices: "查看设备", + unbindDevices: "解绑设备", + }, + deviceDialog: { + title: "员工设备", + selectedUser: "当前员工", + empty: "暂无已分配设备", + query: { + sn: "序列号", + model: "型号", + orderCode: "订单号", + alias: "设备别名", + }, + placeholder: { + sn: "请输入序列号", + model: "请输入型号", + orderCode: "请输入订单号", + alias: "请输入设备别名", + }, + table: { + id: "设备ID", + sn: "序列号", + model: "型号", + orderCode: "订单号", + alias: "设备别名", + activationStatus: "激活状态", + lastLocationTime: "位置时间", + }, + status: { + activated: "已激活", + notActivated: "未激活", + }, + message: { + selectDeviceFirst: "请先选择需要解绑的设备", + confirmUnbind: "确认解绑员工“{account}”选中的 {count} 台设备吗?", + unbindSuccess: "解绑成功", + }, + }, + }, + }, + "en-US": { + systemUser: { + button: { + viewDevices: "View Devices", + unbindDevices: "Unbind Devices", + }, + deviceDialog: { + title: "Employee Devices", + selectedUser: "Current Employee", + empty: "No assigned devices", + query: { + sn: "Serial Number", + model: "Model", + orderCode: "Order Code", + alias: "Device Alias", + }, + placeholder: { + sn: "Enter serial number", + model: "Enter model", + orderCode: "Enter order code", + alias: "Enter device alias", + }, + table: { + id: "Device ID", + sn: "Serial Number", + model: "Model", + orderCode: "Order Code", + alias: "Device Alias", + activationStatus: "Activation Status", + lastLocationTime: "Location Time", + }, + status: { + activated: "Activated", + notActivated: "Not Activated", + }, + message: { + selectDeviceFirst: "Please select devices to unbind first", + confirmUnbind: "Unbind the selected {count} devices from employee \"{account}\"?", + unbindSuccess: "Devices unbound successfully", + }, + }, + }, + }, + "fr-FR": { + systemUser: { + button: { + viewDevices: "Voir appareils", + unbindDevices: "Dissocier appareils", + }, + deviceDialog: { + title: "Appareils de l'employe", + selectedUser: "Employe actuel", + empty: "Aucun appareil attribue", + query: { + sn: "Numero de serie", + model: "Modele", + orderCode: "Code de commande", + alias: "Alias de l'appareil", + }, + placeholder: { + sn: "Saisissez le numero de serie", + model: "Saisissez le modele", + orderCode: "Saisissez le code de commande", + alias: "Saisissez l'alias de l'appareil", + }, + table: { + id: "ID appareil", + sn: "Numero de serie", + model: "Modele", + orderCode: "Code de commande", + alias: "Alias de l'appareil", + activationStatus: "Statut d'activation", + lastLocationTime: "Heure de position", + }, + status: { + activated: "Active", + notActivated: "Non active", + }, + message: { + selectDeviceFirst: "Veuillez d'abord selectionner les appareils a dissocier", + confirmUnbind: "Confirmer la dissociation de {count} appareils de l'employe \"{account}\" ?", + unbindSuccess: "Dissociation reussie", + }, + }, + }, + }, + "es-ES": { + systemUser: { + button: { + viewDevices: "Ver dispositivos", + unbindDevices: "Desvincular dispositivos", + }, + deviceDialog: { + title: "Dispositivos del empleado", + selectedUser: "Empleado actual", + empty: "No hay dispositivos asignados", + query: { + sn: "Numero de serie", + model: "Modelo", + orderCode: "Codigo de pedido", + alias: "Alias del dispositivo", + }, + placeholder: { + sn: "Ingrese el numero de serie", + model: "Ingrese el modelo", + orderCode: "Ingrese el codigo de pedido", + alias: "Ingrese el alias del dispositivo", + }, + table: { + id: "ID del dispositivo", + sn: "Numero de serie", + model: "Modelo", + orderCode: "Codigo de pedido", + alias: "Alias del dispositivo", + activationStatus: "Estado de activacion", + lastLocationTime: "Hora de ubicacion", + }, + status: { + activated: "Activado", + notActivated: "No activado", + }, + message: { + selectDeviceFirst: "Primero seleccione los dispositivos que desea desvincular", + confirmUnbind: "Confirma desvincular {count} dispositivos del empleado \"{account}\"?", + unbindSuccess: "Desvinculacion completada", + }, + }, + }, + }, + "pt-BR": { + systemUser: { + button: { + viewDevices: "Ver dispositivos", + unbindDevices: "Desvincular dispositivos", + }, + deviceDialog: { + title: "Dispositivos do funcionario", + selectedUser: "Funcionario atual", + empty: "Nenhum dispositivo vinculado", + query: { + sn: "Numero de serie", + model: "Modelo", + orderCode: "Codigo do pedido", + alias: "Alias do dispositivo", + }, + placeholder: { + sn: "Digite o numero de serie", + model: "Digite o modelo", + orderCode: "Digite o codigo do pedido", + alias: "Digite o alias do dispositivo", + }, + table: { + id: "ID do dispositivo", + sn: "Numero de serie", + model: "Modelo", + orderCode: "Codigo do pedido", + alias: "Alias do dispositivo", + activationStatus: "Status de ativacao", + lastLocationTime: "Horario da posicao", + }, + status: { + activated: "Ativado", + notActivated: "Nao ativado", + }, + message: { + selectDeviceFirst: "Selecione primeiro os dispositivos que deseja desvincular", + confirmUnbind: "Confirmar a desvinculacao de {count} dispositivos do funcionario \"{account}\"?", + unbindSuccess: "Desvinculacao concluida com sucesso", + }, + }, + }, + }, +}; + +export default systemUserDeviceMessages; diff --git a/src/utils/loadLeaflet.js b/src/utils/loadLeaflet.js new file mode 100644 index 0000000..9820027 --- /dev/null +++ b/src/utils/loadLeaflet.js @@ -0,0 +1,65 @@ +let leafletPromise = null; + +function ensureLeafletCss() { + const styleId = "geotag-leaflet-style"; + if (document.getElementById(styleId)) { + return; + } + const link = document.createElement("link"); + link.id = styleId; + link.rel = "stylesheet"; + link.href = "https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"; + document.head.appendChild(link); +} + +export function loadLeaflet() { + if (typeof window === "undefined") { + return Promise.reject(new Error("当前环境不支持加载 Leaflet")); + } + + if (window.L && typeof window.L.map === "function") { + return Promise.resolve(window.L); + } + + if (leafletPromise) { + return leafletPromise; + } + + leafletPromise = new Promise((resolve, reject) => { + ensureLeafletCss(); + + const scriptId = "geotag-leaflet-script"; + const existingScript = document.getElementById(scriptId); + + const handleResolve = () => { + if (window.L && typeof window.L.map === "function") { + resolve(window.L); + return; + } + leafletPromise = null; + reject(new Error("Leaflet 脚本加载失败")); + }; + + const handleError = () => { + leafletPromise = null; + reject(new Error("Leaflet 脚本加载失败")); + }; + + if (existingScript) { + existingScript.addEventListener("load", handleResolve, { once: true }); + existingScript.addEventListener("error", handleError, { once: true }); + return; + } + + const script = document.createElement("script"); + script.id = scriptId; + script.async = true; + script.defer = true; + script.src = "https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"; + script.onload = handleResolve; + script.onerror = handleError; + document.head.appendChild(script); + }); + + return leafletPromise; +}