diff --git a/starpilot/system/the_galaxy/assets/components/navigation/navigation_utilities.js b/starpilot/system/the_galaxy/assets/components/navigation/navigation_utilities.js
index c0868f34c2..3fa805a0f7 100644
--- a/starpilot/system/the_galaxy/assets/components/navigation/navigation_utilities.js
+++ b/starpilot/system/the_galaxy/assets/components/navigation/navigation_utilities.js
@@ -123,6 +123,7 @@ function handleRouteEvents(map, clickLayerId, onRouteSelect, routes, useMetric,
const routeId = feature.properties.routeId;
const route = routes.find((r, i) => (i === 0 ? 'main' : `alt-${i}`) === routeId);
onRouteSelect(route, routeId);
+ highlightRoute(map, routes, routeId);
showTooltip(e);
});
map.on('mouseenter', clickLayerId, showTooltip);
diff --git a/starpilot/system/the_galaxy/assets/mobile/css/material.css b/starpilot/system/the_galaxy/assets/mobile/css/material.css
index 1704438797..99812a651b 100644
--- a/starpilot/system/the_galaxy/assets/mobile/css/material.css
+++ b/starpilot/system/the_galaxy/assets/mobile/css/material.css
@@ -1548,6 +1548,62 @@ button.gx-chip:hover {
text-align: center;
}
+.gx-navigation-route-picker {
+ border-top: 1px solid var(--outline);
+ display: grid;
+ gap: var(--sp-2);
+ margin-top: var(--sp-2);
+ padding: var(--sp-3) var(--sp-2) 0;
+}
+
+.gx-navigation-route-picker__title {
+ color: var(--text-muted);
+ font-size: var(--fs-sm);
+ font-weight: var(--fw-bold);
+}
+
+.gx-navigation-route-option {
+ align-items: center;
+ background: var(--surface-container);
+ border: 1px solid var(--outline);
+ border-radius: var(--radius-sm);
+ color: var(--on-surface);
+ cursor: pointer;
+ display: flex;
+ gap: var(--sp-3);
+ justify-content: space-between;
+ min-height: 52px;
+ padding: var(--sp-2) var(--sp-3);
+ text-align: left;
+ width: 100%;
+}
+
+.gx-navigation-route-option > span {
+ display: grid;
+ gap: 2px;
+ min-width: 0;
+}
+
+.gx-navigation-route-option small {
+ color: var(--text-muted);
+ font-size: var(--fs-xs);
+}
+
+.gx-navigation-route-option > strong:last-child {
+ white-space: nowrap;
+}
+
+.gx-navigation-route-option:hover,
+.gx-navigation-route-option:focus-visible,
+.gx-navigation-route-option.selected {
+ background: var(--primary-container);
+ border-color: var(--primary);
+}
+
+.gx-navigation-route-option.selected > strong:first-child {
+ color: var(--primary);
+}
+
.gx-navigation-summary__actions {
display: flex;
flex-wrap: wrap;
diff --git a/starpilot/system/the_galaxy/assets/mobile/js/components/NavigationDestinationPanel.js b/starpilot/system/the_galaxy/assets/mobile/js/components/NavigationDestinationPanel.js
index 51a459bfd3..2b17a2bbe8 100644
--- a/starpilot/system/the_galaxy/assets/mobile/js/components/NavigationDestinationPanel.js
+++ b/starpilot/system/the_galaxy/assets/mobile/js/components/NavigationDestinationPanel.js
@@ -2,11 +2,12 @@ import { api, showSnackbar } from "../api.js"
import {
getMapboxSearchContext,
addRouteToMap,
+ highlightRoute,
removeRouteFromMap,
formatSecondsToHuman,
formatMetersToHuman,
formatMetersToMiles,
-} from "../../../components/navigation/navigation_utilities.js?v=nav-search-context-2"
+} from "../../../components/navigation/navigation_utilities.js?v=nav-route-selection-1"
const MAPBOX_STYLE = "mapbox://styles/frogsgomoo/cmcfv151j000o01rcdxebhl76"
@@ -91,6 +92,8 @@ export const NavigationDestinationPanel = {
favorites: [],
destination: null,
routeSummary: null,
+ routes: [],
+ selectedRouteId: "main",
navigationStarted: false,
isMetric: false,
mapboxPublic: "",
@@ -209,6 +212,8 @@ export const NavigationDestinationPanel = {
onInput(event) {
this.destination = null
this.routeSummary = null
+ this.routes = []
+ this.selectedRouteId = "main"
this.navigationStarted = false
if (this.map) removeRouteFromMap(this.map)
this.searchRequest += 1
@@ -299,6 +304,8 @@ export const NavigationDestinationPanel = {
this.navigationStarted = false
this.destination = null
this.routeSummary = null
+ this.routes = []
+ this.selectedRouteId = "main"
this.query = ""
this.suggestions = []
if (this.map) removeRouteFromMap(this.map)
@@ -340,6 +347,17 @@ export const NavigationDestinationPanel = {
const eta = new Date(Date.now() + Number(value || 0) * 1000)
return eta.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" })
},
+ routeId(index) { return index === 0 ? "main" : `alt-${index}` },
+ selectRoute(route, routeId = "main") {
+ if (!route) return
+ this.selectedRouteId = routeId
+ this.routeSummary = {
+ distance: Number(route.distance) || 0,
+ duration: Number(route.duration) || 0,
+ routeId,
+ }
+ if (this.map && this.routes.length) highlightRoute(this.map, this.routes, routeId)
+ },
async previewDestination(place) {
if (!this.mapReady || !this.map || !place) return
const mapboxgl = window.mapboxgl
@@ -347,6 +365,8 @@ export const NavigationDestinationPanel = {
this.destinationMarker = new mapboxgl.Marker({ color: "#9d72ff" }).setLngLat([place.longitude, place.latitude]).addTo(this.map)
if (!this.lastPosition) {
this.routeSummary = null
+ this.routes = []
+ this.selectedRouteId = "main"
this.map.flyTo({ center: [place.longitude, place.latitude], zoom: 14 })
return
}
@@ -354,20 +374,28 @@ export const NavigationDestinationPanel = {
const payload = await api.mapboxDirections(this.lastPosition, place, this.mapboxPublic)
const routes = Array.isArray(payload?.routes) ? payload.routes : []
if (routes.length) {
- const route = routes[0]
- this.routeSummary = {
- distance: Number(route.distance) || 0,
- duration: Number(route.duration) || 0,
- routeId: "main",
- }
+ this.routes = routes
+ this.selectRoute(routes[0], "main")
removeRouteFromMap(this.map)
- addRouteToMap(this.map, routes, [this.lastPosition.longitude, this.lastPosition.latitude], [place.longitude, place.latitude], () => {}, true, () => "main")
+ addRouteToMap(
+ this.map,
+ routes,
+ [this.lastPosition.longitude, this.lastPosition.latitude],
+ [place.longitude, place.latitude],
+ (route, routeId) => this.selectRoute(route, routeId),
+ this.isMetric,
+ () => this.selectedRouteId,
+ )
} else {
this.routeSummary = null
+ this.routes = []
+ this.selectedRouteId = "main"
this.map.fitBounds([[this.lastPosition.longitude, this.lastPosition.latitude], [place.longitude, place.latitude]], { padding: 80, duration: 500 })
}
} catch (e) {
this.routeSummary = null
+ this.routes = []
+ this.selectedRouteId = "main"
this.map.fitBounds([[this.lastPosition.longitude, this.lastPosition.latitude], [place.longitude, place.latitude]], { padding: 80, duration: 500 })
}
},
@@ -404,6 +432,16 @@ export const NavigationDestinationPanel = {
⌛Duration:{{ formatDuration(routeSummary.duration) }}
🕗ETA:{{ formatEta(routeSummary.duration) }}
+
+
Routes
+
+
diff --git a/starpilot/system/the_galaxy/assets/mobile/js/i18n.js b/starpilot/system/the_galaxy/assets/mobile/js/i18n.js
index b0fa1198fc..a9203ee86c 100644
--- a/starpilot/system/the_galaxy/assets/mobile/js/i18n.js
+++ b/starpilot/system/the_galaxy/assets/mobile/js/i18n.js
@@ -121,6 +121,7 @@ const MORE_TRANSLATIONS = {
"Lateral Tuning": "Ajuste lateral", "Miscellaneous steering control changes to fine-tune how openpilot drives.": "Cambios diversos del control de la dirección para ajustar cómo conduce openpilot.",
"Quality of Life": "Calidad de vida", "Steering control changes to fine-tune how openpilot drives.": "Cambios del control de la dirección para ajustar cómo conduce openpilot.",
"Enable V-ASM": "Activar V-ASM", "Favorites": "Favoritos", "Device & Data": "Dispositivo y datos",
+ Routes: "Rutas", Route: "Ruta", Selected: "Seleccionada", Recommended: "Recomendada", Alternative: "Alternativa", Select: "Seleccionar", "Choose a route": "Elegir una ruta",
},
fr: {
Favorites: "Favoris", "Lateral (Steering)": "Latéral (Direction)",
@@ -134,6 +135,7 @@ const MORE_TRANSLATIONS = {
"Lateral Tuning": "Réglage latéral", "Miscellaneous steering control changes to fine-tune how openpilot drives.": "Divers réglages de direction pour ajuster finement le comportement d’openpilot.",
"Quality of Life": "Confort d’utilisation", "Steering control changes to fine-tune how openpilot drives.": "Réglages de direction pour ajuster finement le comportement d’openpilot.",
"Enable V-ASM": "Activer V-ASM",
+ Routes: "Itinéraires", Route: "Itinéraire", Selected: "Sélectionné", Recommended: "Recommandé", Alternative: "Alternative", Select: "Sélectionner", "Choose a route": "Choisir un itinéraire",
},
ko: {
Favorites: "즐겨찾기", "Lateral (Steering)": "횡방향 (조향)",
@@ -147,6 +149,7 @@ const MORE_TRANSLATIONS = {
"Lateral Tuning": "횡방향 튜닝", "Miscellaneous steering control changes to fine-tune how openpilot drives.": "openpilot의 주행을 세밀하게 조정하는 기타 조향 제어 변경입니다.",
"Quality of Life": "편의 기능", "Steering control changes to fine-tune how openpilot drives.": "openpilot의 주행을 세밀하게 조정하는 조향 제어 변경입니다.",
"Enable V-ASM": "V-ASM 활성화",
+ Routes: "경로", Route: "경로", Selected: "선택됨", Recommended: "추천", Alternative: "대안", Select: "선택", "Choose a route": "경로 선택",
},
"zh-CHS": {
Favorites: "收藏", "Lateral (Steering)": "横向(转向)",
@@ -159,6 +162,7 @@ const MORE_TRANSLATIONS = {
"Miscellaneous steering control changes to fine-tune how openpilot drives.": "用于精细调整 openpilot 驾驶方式的其他转向控制设置。",
"Quality of Life": "使用体验", "Steering control changes to fine-tune how openpilot drives.": "用于精细调整 openpilot 驾驶方式的转向控制设置。",
"Enable V-ASM": "启用 V-ASM",
+ Routes: "路线", Route: "路线", Selected: "已选择", Recommended: "推荐", Alternative: "备选", Select: "选择", "Choose a route": "选择路线",
},
}
@@ -169,19 +173,24 @@ Object.keys(MORE_TRANSLATIONS).forEach((code) => Object.assign(TRANSLATIONS[code
// above always win; this fallback only runs for a non-English selection.
const TERM_TRANSLATIONS = {
es: {
- "Advanced": "Avanzado", "Always On": "Siempre activo", "Lateral": "Lateral", "Steering": "Dirección", "Longitudinal": "Longitudinal", "Speed": "Velocidad", "Following": "Seguimiento", "Vision": "Visión", "Limits": "Límites", "Visual": "Visual", "Display": "Pantalla", "Sounds": "Sonidos", "Alerts": "Alertas", "Vehicle": "Vehículo", "Wheel": "Volante", "Controls": "Controles", "Device": "Dispositivo", "Data": "Datos", "Developer": "Desarrollador", "Favorites": "Favoritos", "Main": "Principal", "Tools": "Herramientas", "Recordings": "Grabaciones", "Cameras": "Cámaras", "Monitoring": "monitoreo", "Logs": "Registros", "Diagnostics": "diagnósticos", "Model": "Modelo", "Manager": "administrador", "Navigation": "Navegación", "Maps": "mapas", "System": "Sistema", "Laboratory": "Laboratorio", "Plots": "Gráficas", "Testing": "Pruebas", "Ground": "Área", "Theme": "Tema", "Maker": "creador", "Home": "Inicio", "Toggles": "Interruptores", "Install": "Instalar", "Update": "Actualizar", "Available": "disponible", "Loading": "Cargando", "Error": "Error", "Retry": "Reintentar", "Save": "Guardar", "Cancel": "Cancelar", "Close": "Cerrar", "Delete": "Eliminar", "All": "todo", "Search": "Buscar", "Clear": "Borrar", "Manage": "Administrar", "Connected": "Conectado", "Disconnect": "Desconectar", "Connect": "Conectar", "Pair": "Emparejar", "Refresh": "Actualizar", "Status": "Estado", "Samples": "Muestras", "Duration": "Duración", "Distance": "Distancia", "drives": "viajes", "hours": "horas", "engaged": "activado", "Onroad": "En carretera", "Offroad": "Fuera de carretera", "Enabled": "Activado", "Disabled": "Desactivado", "Default": "Predeterminado", "Working": "Procesando", "Run": "Ejecutar", "Reset": "Restablecer", "Download": "Descargar", "Network": "Red", "Current": "Actual", "Change": "Cambiar", "Changes": "Cambios", "Allow": "Permitir", "Use": "Usar", "Show": "Mostrar", "Hide": "Ocultar", "Enable": "Activar", "Disable": "Desactivar", "Automatic": "Automático", "Settings": "Configuración", "Language": "Idioma",
+ "Advanced": "Avanzado", "Always On": "Siempre activo", "Lateral": "Lateral", "Steering": "Dirección", "Longitudinal": "Longitudinal", "Speed": "Velocidad", "Following": "Seguimiento", "Vision": "Visión", "Limits": "Límites", "Visual": "Visual", "Display": "Pantalla", "Sounds": "Sonidos", "Alerts": "Alertas", "Vehicle": "Vehículo", "Wheel": "Volante", "Controls": "Controles", "Device": "Dispositivo", "Data": "Datos", "Developer": "Desarrollador", "Favorites": "Favoritos", "Main": "Principal", "Tools": "Herramientas", "Recordings": "Grabaciones", "Cameras": "Cámaras", "Monitoring": "monitoreo", "Logs": "Registros", "Diagnostics": "diagnósticos", "Model": "Modelo", "Manager": "administrador", "Navigation": "Navegación", "Maps": "mapas", "System": "Sistema", "Laboratory": "Laboratorio", "Plots": "Gráficas", "Testing": "Pruebas", "Ground": "Área", "Theme": "Tema", "Maker": "creador", "Home": "Inicio", "Toggles": "Interruptores", "Install": "Instalar", "Update": "Actualizar", "Available": "disponible", "Loading": "Cargando", "Error": "Error", "Retry": "Reintentar", "Save": "Guardar", "Cancel": "Cancelar", "Close": "Cerrar", "Delete": "Eliminar", "All": "todo", "Search": "Buscar", "Clear": "Borrar", "Manage": "Administrar", "Connected": "Conectado", "Disconnect": "Desconectar", "Connect": "Conectar", "Pair": "Emparejar", "Refresh": "Actualizar", "Status": "Estado", "Samples": "Muestras", "Duration": "Duración", "Distance": "Distancia", "drives": "viajes", "hours": "horas", "engaged": "activado", "Onroad": "En carretera", "Offroad": "Fuera de carretera", "Enabled": "Activado", "Disabled": "Desactivado", "Default": "Predeterminado", "Working": "Procesando", "Run": "Ejecutar", "Reset": "Restablecer", "Download": "Descargar", "Network": "Red", "Current": "Actual", "Change": "Cambiar", "Changes": "Cambios", "Allow": "Permitir", "Use": "Usar", "Show": "Mostrar", "Hide": "Ocultar", "Enable": "Activar", "Disable": "Desactivar", "Automatic": "Automático", "Settings": "Configuración", "Language": "Idioma", "Routes": "Rutas", "Selected": "Seleccionada", "Recommended": "Recomendada", "Alternative": "Alternativa",
},
fr: {
- "Advanced": "Avancé", "Always On": "Toujours actif", "Lateral": "Latéral", "Steering": "Direction", "Longitudinal": "Longitudinal", "Speed": "Vitesse", "Following": "Suivi", "Vision": "Vision", "Limits": "Limites", "Visual": "Visuel", "Display": "Affichage", "Sounds": "Sons", "Alerts": "Alertes", "Vehicle": "Véhicule", "Wheel": "Volant", "Controls": "Commandes", "Device": "Appareil", "Data": "Données", "Developer": "Développeur", "Favorites": "Favoris", "Main": "Principal", "Tools": "Outils", "Recordings": "Enregistrements", "Cameras": "Caméras", "Monitoring": "surveillance", "Logs": "Journaux", "Diagnostics": "diagnostics", "Model": "Modèle", "Manager": "gestionnaire", "Navigation": "Navigation", "Maps": "cartes", "System": "Système", "Laboratory": "Laboratoire", "Plots": "Graphiques", "Testing": "Tests", "Ground": "Zone", "Theme": "Thème", "Maker": "créateur", "Home": "Accueil", "Toggles": "Options", "Install": "Installer", "Update": "Mettre à jour", "Available": "disponible", "Loading": "Chargement", "Error": "Erreur", "Retry": "Réessayer", "Save": "Enregistrer", "Cancel": "Annuler", "Close": "Fermer", "Delete": "Supprimer", "All": "tout", "Search": "Rechercher", "Clear": "Effacer", "Manage": "Gérer", "Connected": "Connecté", "Disconnect": "Déconnecter", "Connect": "Connecter", "Pair": "Associer", "Refresh": "Actualiser", "Status": "État", "Samples": "Échantillons", "Duration": "Durée", "Distance": "Distance", "drives": "trajets", "hours": "heures", "engaged": "activé", "Onroad": "En route", "Offroad": "Hors route", "Enabled": "Activé", "Disabled": "Désactivé", "Default": "Par défaut", "Working": "En cours", "Run": "Exécuter", "Reset": "Réinitialiser", "Download": "Télécharger", "Network": "Réseau", "Current": "Actuel", "Change": "Modifier", "Changes": "Modifications", "Allow": "Autoriser", "Use": "Utiliser", "Show": "Afficher", "Hide": "Masquer", "Enable": "Activer", "Disable": "Désactiver", "Automatic": "Automatique", "Settings": "Paramètres", "Language": "Langue",
+ "Advanced": "Avancé", "Always On": "Toujours actif", "Lateral": "Latéral", "Steering": "Direction", "Longitudinal": "Longitudinal", "Speed": "Vitesse", "Following": "Suivi", "Vision": "Vision", "Limits": "Limites", "Visual": "Visuel", "Display": "Affichage", "Sounds": "Sons", "Alerts": "Alertes", "Vehicle": "Véhicule", "Wheel": "Volant", "Controls": "Commandes", "Device": "Appareil", "Data": "Données", "Developer": "Développeur", "Favorites": "Favoris", "Main": "Principal", "Tools": "Outils", "Recordings": "Enregistrements", "Cameras": "Caméras", "Monitoring": "surveillance", "Logs": "Journaux", "Diagnostics": "diagnostics", "Model": "Modèle", "Manager": "gestionnaire", "Navigation": "Navigation", "Maps": "cartes", "System": "Système", "Laboratory": "Laboratoire", "Plots": "Graphiques", "Testing": "Tests", "Ground": "Zone", "Theme": "Thème", "Maker": "créateur", "Home": "Accueil", "Toggles": "Options", "Install": "Installer", "Update": "Mettre à jour", "Available": "disponible", "Loading": "Chargement", "Error": "Erreur", "Retry": "Réessayer", "Save": "Enregistrer", "Cancel": "Annuler", "Close": "Fermer", "Delete": "Supprimer", "All": "tout", "Search": "Rechercher", "Clear": "Effacer", "Manage": "Gérer", "Connected": "Connecté", "Disconnect": "Déconnecter", "Connect": "Connecter", "Pair": "Associer", "Refresh": "Actualiser", "Status": "État", "Samples": "Échantillons", "Duration": "Durée", "Distance": "Distance", "drives": "trajets", "hours": "heures", "engaged": "activé", "Onroad": "En route", "Offroad": "Hors route", "Enabled": "Activé", "Disabled": "Désactivé", "Default": "Par défaut", "Working": "En cours", "Run": "Exécuter", "Reset": "Réinitialiser", "Download": "Télécharger", "Network": "Réseau", "Current": "Actuel", "Change": "Modifier", "Changes": "Modifications", "Allow": "Autoriser", "Use": "Utiliser", "Show": "Afficher", "Hide": "Masquer", "Enable": "Activer", "Disable": "Désactiver", "Automatic": "Automatique", "Settings": "Paramètres", "Language": "Langue", "Routes": "Itinéraires", "Selected": "Sélectionné", "Recommended": "Recommandé", "Alternative": "Alternative",
},
ko: {
- "Advanced": "고급", "Always On": "항상 활성화", "Lateral": "횡방향", "Steering": "조향", "Longitudinal": "종방향", "Speed": "속도", "Following": "추종", "Vision": "비전", "Limits": "제한", "Visual": "시각", "Display": "디스플레이", "Sounds": "소리", "Alerts": "경고", "Vehicle": "차량", "Wheel": "휠", "Controls": "제어", "Device": "장치", "Data": "데이터", "Developer": "개발자", "Favorites": "즐겨찾기", "Main": "메인", "Tools": "도구", "Recordings": "녹화", "Cameras": "카메라", "Monitoring": "모니터링", "Logs": "로그", "Diagnostics": "진단", "Model": "모델", "Manager": "관리자", "Navigation": "내비게이션", "Maps": "지도", "System": "시스템", "Laboratory": "연구소", "Plots": "플롯", "Testing": "테스트", "Ground": "공간", "Theme": "테마", "Maker": "제작", "Home": "홈", "Toggles": "토글", "Install": "설치", "Update": "업데이트", "Available": "사용 가능", "Loading": "로드 중", "Error": "오류", "Retry": "재시도", "Save": "저장", "Cancel": "취소", "Close": "닫기", "Delete": "삭제", "All": "모두", "Search": "검색", "Clear": "지우기", "Manage": "관리", "Connected": "연결됨", "Disconnect": "연결 해제", "Connect": "연결", "Pair": "페어링", "Refresh": "새로 고침", "Status": "상태", "Samples": "샘플", "Duration": "시간", "Distance": "거리", "drives": "주행", "hours": "시간", "engaged": "활성화", "Onroad": "주행 중", "Offroad": "오프로드", "Enabled": "활성화", "Disabled": "비활성화", "Default": "기본값", "Working": "처리 중", "Run": "실행", "Reset": "초기화", "Download": "다운로드", "Network": "네트워크", "Current": "현재", "Change": "변경", "Changes": "변경 사항", "Allow": "허용", "Use": "사용", "Show": "표시", "Hide": "숨기기", "Enable": "활성화", "Disable": "비활성화", "Automatic": "자동", "Settings": "설정", "Language": "언어",
+ "Advanced": "고급", "Always On": "항상 활성화", "Lateral": "횡방향", "Steering": "조향", "Longitudinal": "종방향", "Speed": "속도", "Following": "추종", "Vision": "비전", "Limits": "제한", "Visual": "시각", "Display": "디스플레이", "Sounds": "소리", "Alerts": "경고", "Vehicle": "차량", "Wheel": "휠", "Controls": "제어", "Device": "장치", "Data": "데이터", "Developer": "개발자", "Favorites": "즐겨찾기", "Main": "메인", "Tools": "도구", "Recordings": "녹화", "Cameras": "카메라", "Monitoring": "모니터링", "Logs": "로그", "Diagnostics": "진단", "Model": "모델", "Manager": "관리자", "Navigation": "내비게이션", "Maps": "지도", "System": "시스템", "Laboratory": "연구소", "Plots": "플롯", "Testing": "테스트", "Ground": "공간", "Theme": "테마", "Maker": "제작", "Home": "홈", "Toggles": "토글", "Install": "설치", "Update": "업데이트", "Available": "사용 가능", "Loading": "로드 중", "Error": "오류", "Retry": "재시도", "Save": "저장", "Cancel": "취소", "Close": "닫기", "Delete": "삭제", "All": "모두", "Search": "검색", "Clear": "지우기", "Manage": "관리", "Connected": "연결됨", "Disconnect": "연결 해제", "Connect": "연결", "Pair": "페어링", "Refresh": "새로 고침", "Status": "상태", "Samples": "샘플", "Duration": "시간", "Distance": "거리", "drives": "주행", "hours": "시간", "engaged": "활성화", "Onroad": "주행 중", "Offroad": "오프로드", "Enabled": "활성화", "Disabled": "비활성화", "Default": "기본값", "Working": "처리 중", "Run": "실행", "Reset": "초기화", "Download": "다운로드", "Network": "네트워크", "Current": "현재", "Change": "변경", "Changes": "변경 사항", "Allow": "허용", "Use": "사용", "Show": "표시", "Hide": "숨기기", "Enable": "활성화", "Disable": "비활성화", "Automatic": "자동", "Settings": "설정", "Language": "언어", "Routes": "경로", "Selected": "선택됨", "Recommended": "추천", "Alternative": "대안",
},
"zh-CHS": {
- "Advanced": "高级", "Always On": "始终启用", "Lateral": "横向", "Steering": "转向", "Longitudinal": "纵向", "Speed": "速度", "Following": "跟车", "Vision": "视觉", "Limits": "限制", "Visual": "视觉", "Display": "显示", "Sounds": "声音", "Alerts": "提醒", "Vehicle": "车辆", "Wheel": "方向盘", "Controls": "控制", "Device": "设备", "Data": "数据", "Developer": "开发者", "Favorites": "收藏", "Main": "主菜单", "Tools": "工具", "Recordings": "录制", "Cameras": "摄像头", "Monitoring": "监控", "Logs": "日志", "Diagnostics": "诊断", "Model": "模型", "Manager": "管理器", "Navigation": "导航", "Maps": "地图", "System": "系统", "Laboratory": "实验室", "Plots": "图表", "Testing": "测试", "Ground": "区域", "Theme": "主题", "Maker": "制作器", "Home": "主页", "Toggles": "开关", "Install": "安装", "Update": "更新", "Available": "可用", "Loading": "加载中", "Error": "错误", "Retry": "重试", "Save": "保存", "Cancel": "取消", "Close": "关闭", "Delete": "删除", "All": "全部", "Search": "搜索", "Clear": "清除", "Manage": "管理", "Connected": "已连接", "Disconnect": "断开连接", "Connect": "连接", "Pair": "配对", "Refresh": "刷新", "Status": "状态", "Samples": "样本", "Duration": "时长", "Distance": "距离", "drives": "驾驶次数", "hours": "小时", "engaged": "已启用", "Onroad": "行驶中", "Offroad": "非行驶", "Enabled": "已启用", "Disabled": "已停用", "Default": "默认", "Working": "处理中", "Run": "运行", "Reset": "重置", "Download": "下载", "Network": "网络", "Current": "当前", "Change": "更改", "Changes": "更改内容", "Allow": "允许", "Use": "使用", "Show": "显示", "Hide": "隐藏", "Enable": "启用", "Disable": "停用", "Automatic": "自动", "Settings": "设置", "Language": "语言",
+ "Advanced": "高级", "Always On": "始终启用", "Lateral": "横向", "Steering": "转向", "Longitudinal": "纵向", "Speed": "速度", "Following": "跟车", "Vision": "视觉", "Limits": "限制", "Visual": "视觉", "Display": "显示", "Sounds": "声音", "Alerts": "提醒", "Vehicle": "车辆", "Wheel": "方向盘", "Controls": "控制", "Device": "设备", "Data": "数据", "Developer": "开发者", "Favorites": "收藏", "Main": "主菜单", "Tools": "工具", "Recordings": "录制", "Cameras": "摄像头", "Monitoring": "监控", "Logs": "日志", "Diagnostics": "诊断", "Model": "模型", "Manager": "管理器", "Navigation": "导航", "Maps": "地图", "System": "系统", "Laboratory": "实验室", "Plots": "图表", "Testing": "测试", "Ground": "区域", "Theme": "主题", "Maker": "制作器", "Home": "主页", "Toggles": "开关", "Install": "安装", "Update": "更新", "Available": "可用", "Loading": "加载中", "Error": "错误", "Retry": "重试", "Save": "保存", "Cancel": "取消", "Close": "关闭", "Delete": "删除", "All": "全部", "Search": "搜索", "Clear": "清除", "Manage": "管理", "Connected": "已连接", "Disconnect": "断开连接", "Connect": "连接", "Pair": "配对", "Refresh": "刷新", "Status": "状态", "Samples": "样本", "Duration": "时长", "Distance": "距离", "drives": "驾驶次数", "hours": "小时", "engaged": "已启用", "Onroad": "行驶中", "Offroad": "非行驶", "Enabled": "已启用", "Disabled": "已停用", "Default": "默认", "Working": "处理中", "Run": "运行", "Reset": "重置", "Download": "下载", "Network": "网络", "Current": "当前", "Change": "更改", "Changes": "更改内容", "Allow": "允许", "Use": "使用", "Show": "显示", "Hide": "隐藏", "Enable": "启用", "Disable": "停用", "Automatic": "自动", "Settings": "设置", "Language": "语言", "Routes": "路线", "Selected": "已选择", "Recommended": "推荐", "Alternative": "备选",
},
}
+Object.assign(TERM_TRANSLATIONS.es, { Route: "Ruta", Select: "Seleccionar" })
+Object.assign(TERM_TRANSLATIONS.fr, { Route: "Itinéraire", Select: "Sélectionner" })
+Object.assign(TERM_TRANSLATIONS.ko, { Route: "경로", Select: "선택" })
+Object.assign(TERM_TRANSLATIONS["zh-CHS"], { Route: "路线", Select: "选择" })
+
function escapeRegExp(value) {
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
}