Browse Source

b端国际化 地图谷歌

master
hx 2 months ago
parent
commit
458df8c544
  1. 44
      src/lang/app-messages.js
  2. 449
      src/lang/device-flow-messages.js
  3. 861
      src/lang/device-messages.js
  4. 100
      src/lang/index.js
  5. 594
      src/lang/messages.js
  6. 244
      src/lang/profile-messages.js
  7. 9
      src/lang/system-messages.js
  8. 219
      src/lang/system-user-device-messages.js
  9. 65
      src/utils/loadLeaflet.js

44
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;

449
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;

861
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;

100
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;

594
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;

244
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;

9
src/lang/system-messages.js

File diff suppressed because one or more lines are too long

219
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;

65
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/[email protected]/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/[email protected]/dist/leaflet.js";
script.onload = handleResolve;
script.onerror = handleError;
document.head.appendChild(script);
});
return leafletPromise;
}
Loading…
Cancel
Save