diff --git a/meshview/lang/en.json b/meshview/lang/en.json
new file mode 100644
index 0000000..2ffd4c3
--- /dev/null
+++ b/meshview/lang/en.json
@@ -0,0 +1,110 @@
+{
+ "base": {
+ "conversations": "Conversations",
+ "nodes": "Nodes",
+ "everything": "See Everything",
+ "graph": "Mesh Graphs",
+ "net": "Weekly Net",
+ "map": "Live Map",
+ "stats": "Stats",
+ "top": "Top Traffic Nodes",
+ "footer": "Visit Meshview on Github.",
+ "node id": "Node id",
+ "go to node": "Go to Node",
+ "all": "All",
+ "portnum_options": {
+ "1": "Text Message",
+ "3": "Position",
+ "4": "Node Info",
+ "67": "Telemetry",
+ "70": "Traceroute",
+ "71": "Neighbor Info"
+ },
+ "chat": {
+ "replying_to": "Replying to:",
+ "view_packet_details": "View packet details"
+ }
+ },
+ "nodelist": {
+ "search_placeholder": "Search by name or ID...",
+ "all_roles": "All Roles",
+ "all_channels": "All Channels",
+ "all_hw_models": "All HW Models",
+ "all_firmware": "All Firmware",
+ "export_csv": "Export CSV",
+ "clear_filters": "Clear Filters",
+ "showing": "Showing",
+ "nodes": "nodes",
+ "short": "Short",
+ "long_name": "Long Name",
+ "hw_model": "HW Model",
+ "firmware": "Firmware",
+ "role": "Role",
+ "last_lat": "Last Latitude",
+ "last_long": "Last Longitude",
+ "channel": "Channel",
+ "last_update": "Last Update",
+ "loading_nodes": "Loading nodes...",
+ "no_nodes": "No nodes found",
+ "error_nodes": "Error loading nodes"
+ },
+ "net": {
+ "number_of_checkins": "Number of Check-ins:",
+ "view_packet_details": "View packet details",
+ "view_all_packets_from_node": "View all packets from this node",
+ "no_packets_found": "No packets found."
+ },
+ "map": {
+ "channel": "Channel:",
+ "model": "Model:",
+ "role": "Role:",
+ "last_seen": "Last seen:",
+ "firmware": "Firmware:",
+ "show_routers_only": "Show Routers Only",
+ "share_view": "Share This View"
+ },
+ "stats":
+ {
+ "mesh_stats_summary": "Mesh Statistics - Summary (all available in Database)",
+ "total_nodes": "Total Nodes",
+ "total_packets": "Total Packets",
+ "total_packets_seen": "Total Packets Seen",
+ "packets_per_day_all": "Packets per Day - All Ports (Last 14 Days)",
+ "packets_per_day_text": "Packets per Day - Text Messages (Port 1, Last 14 Days)",
+ "packets_per_hour_all": "Packets per Hour - All Ports",
+ "packets_per_hour_text": "Packets per Hour - Text Messages (Port 1)",
+ "packet_types_last_24h": "Packet Types - Last 24 Hours",
+ "hardware_breakdown": "Hardware Breakdown",
+ "role_breakdown": "Role Breakdown",
+ "channel_breakdown": "Channel Breakdown",
+ "expand_chart": "Expand Chart",
+ "export_csv": "Export CSV",
+ "all_channels": "All Channels"
+ },
+ "top":
+ {
+ "top_traffic_nodes": "Top Traffic Nodes (last 24 hours)",
+ "chart_description_1": "This chart shows a bell curve (normal distribution) based on the total \"Times Seen\" values for all nodes. It helps visualize how frequently nodes are heard, relative to the average.",
+ "chart_description_2": "This \"Times Seen\" value is the closest that we can get to Mesh utilization by node.",
+ "mean_label": "Mean:",
+ "stddev_label": "Standard Deviation:",
+ "long_name": "Long Name",
+ "short_name": "Short Name",
+ "channel": "Channel",
+ "packets_sent": "Packets Sent",
+ "times_seen": "Times Seen",
+ "seen_percent": "Seen % of Mean",
+ "no_nodes": "No top traffic nodes available."
+ },
+ "nodegraph":
+ {
+ "channel_label": "Channel:",
+ "search_node_placeholder": "Search node...",
+ "search_button": "Search",
+ "long_name_label": "Long Name:",
+ "short_name_label": "Short Name:",
+ "role_label": "Role:",
+ "hw_model_label": "Hardware Model:",
+ "node_not_found": "Node not found in current channel!"
+ }
+}
\ No newline at end of file
diff --git a/meshview/lang/es.json b/meshview/lang/es.json
new file mode 100644
index 0000000..c78810d
--- /dev/null
+++ b/meshview/lang/es.json
@@ -0,0 +1,112 @@
+{
+ "base": {
+ "conversations": "Conversaciones",
+ "nodes": "Nodos",
+ "everything": "Mostrar Todo",
+ "graph": "Gráficos de la Malla",
+ "net": "Red Semanal",
+ "map": "Mapa en Vivo",
+ "stats": "Estadísticas",
+ "top": "Nodos con Mayor Tráfico",
+ "footer": "Visita Meshview en Github.",
+ "node id": "ID de Nodo",
+ "go to node": "Ir al nodo",
+ "all": "Todos",
+ "portnum_options": {
+ "1": "Mensaje de Texto",
+ "3": "Ubicación",
+ "4": "Información del Nodo",
+ "67": "Telemetría",
+ "70": "Traceroute",
+ "71": "Información de Vecinos"
+ }
+ },
+ "chat": {
+ "replying_to": "Respondiendo a:",
+ "view_packet_details": "Ver detalles del paquete"
+ },
+ "nodelist": {
+ "search_placeholder": "Buscar por nombre o ID...",
+ "all_roles": "Todos los Roles",
+ "all_channels": "Todos los Canales",
+ "all_hw_models": "Todos los Modelos",
+ "all_firmware": "Todo el Firmware",
+ "export_csv": "Exportar CSV",
+ "clear_filters": "Limpiar Filtros",
+ "showing": "Mostrando",
+ "nodes": "nodos",
+ "short": "Corto",
+ "long_name": "Largo",
+ "hw_model": "Modelo",
+ "firmware": "Firmware",
+ "role": "Rol",
+ "last_lat": "Última Latitud",
+ "last_long": "Última Longitud",
+ "channel": "Canal",
+ "last_update": "Última Actualización",
+ "loading_nodes": "Cargando nodos...",
+ "no_nodes": "No se encontraron nodos",
+ "error_nodes": "Error al cargar nodos"
+ },
+ "net": {
+ "number_of_checkins": "Número de registros:",
+ "view_packet_details": "Ver detalles del paquete",
+ "view_all_packets_from_node": "Ver todos los paquetes de este nodo",
+ "no_packets_found": "No se encontraron paquetes."
+ },
+ "map": {
+ "channel": "Canal:",
+ "model": "Modelo:",
+ "role": "Rol:",
+ "last_seen": "Visto por última vez:",
+ "firmware": "Firmware:",
+ "show_routers_only": "Mostrar solo enrutadores",
+ "share_view": "Compartir esta vista"
+ },
+ "stats": {
+ "mesh_stats_summary": "Estadísticas de la Malla - Resumen (completas en la base de datos)",
+ "total_nodes": "Nodos Totales",
+ "total_packets": "Paquetes Totales",
+ "total_packets_seen": "Paquetes Totales Vistos",
+ "packets_per_day_all": "Paquetes por Día - Todos los Puertos (Últimos 14 Días)",
+ "packets_per_day_text": "Paquetes por Día - Mensajes de Texto (Puerto 1, Últimos 14 Días)",
+ "packets_per_hour_all": "Paquetes por Hora - Todos los Puertos",
+ "packets_per_hour_text": "Paquetes por Hora - Mensajes de Texto (Puerto 1)",
+ "packet_types_last_24h": "Tipos de Paquetes - Últimas 24 Horas",
+ "hardware_breakdown": "Distribución de Hardware",
+ "role_breakdown": "Distribución de Roles",
+ "channel_breakdown": "Distribución de Canales",
+ "expand_chart": "Ampliar Gráfico",
+ "export_csv": "Exportar CSV",
+ "all_channels": "Todos los Canales"
+ },
+ "top": {
+ "top_traffic_nodes": "Tráfico (últimas 24 horas)",
+ "chart_description_1": "Este gráfico muestra una curva normal (distribución normal) basada en el valor total de \"Veces Visto\" para todos los nodos. Ayuda a visualizar con qué frecuencia se detectan los nodos en relación con el promedio.",
+ "chart_description_2": "Este valor de \"Veces Visto\" es lo más aproximado que tenemos al nivel de uso de la malla por nodo.",
+ "mean_label": "Media:",
+ "stddev_label": "Desviación Estándar:",
+ "long_name": "Nombre Largo",
+ "short_name": "Nombre Corto",
+ "channel": "Canal",
+ "packets_sent": "Paquetes Enviados",
+ "times_seen": "Veces Visto",
+ "seen_percent": "% Visto respecto a la Media",
+ "no_nodes": "No hay nodos con mayor tráfico disponibles."
+ },
+ "nodegraph":
+ {
+ "channel_label": "Canal:",
+ "search_placeholder": "Buscar nodo...",
+ "search_button": "Buscar",
+ "long_name_label": "Nombre completo:",
+ "short_name_label": "Nombre corto:",
+ "role_label": "Rol:",
+ "hw_model_label": "Modelo de hardware:",
+ "traceroute": "Traceroute",
+ "neighbor": "Vecino",
+ "other": "Otro",
+ "unknown": "Desconocido",
+ "node_not_found": "¡Nodo no encontrado en el canal actual!"
+ }
+}