mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-06-22 14:32:07 +08:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b079b7d475 | |||
| 079ef999a3 | |||
| 4246f0c1a2 | |||
| 468e491135 | |||
| 38038203ea | |||
| 473d671f2b | |||
| ad6979485e | |||
| 69bef3401a |
+88
@@ -0,0 +1,88 @@
|
||||
```mermaid
|
||||
flowchart TD
|
||||
B000["devel-staging"] ---> CORE["core"]
|
||||
CORE ---> CORE_001["core-feat/params"]
|
||||
CORE_001 ---> CORE_002["core-feat/panel"]
|
||||
CORE_002 ---> CORE_003["core-feat/safety-ext"]
|
||||
CORE_003 ---> MIN["min"]
|
||||
MIN ---> MIN_001["min-feat/ui/display-mode"]
|
||||
MIN ---> MIN_002["min-feat/dev/model-selector"]
|
||||
MIN ---> MIN_003["min-feat/lat/lca"]
|
||||
MIN ---> MIN_004["min-feat/dev/on-off-road"]
|
||||
MIN ---> MIN_005["min-feat/ui/hide-hud"]
|
||||
MIN ---> MIN_006["min-feat/lon/ext-radar"]
|
||||
MIN ---> MIN_007["min-feat/lat/road-edge-detection"]
|
||||
MIN ---> MIN_008["min-feat/ui/rainbow-path"]
|
||||
MIN ---> MIN_009["min-feat/lon/acm"]
|
||||
MIN ---> MIN_010["min-feat/lon/aem"]
|
||||
MIN ---> MIN_011["min-feat/lon/dtsc"]
|
||||
MIN ---> MIN_012["min-feat/dev/alert-mode"]
|
||||
MIN ---> MIN_013["min-feat/dev/auto-shutdown"]
|
||||
MIN ---> MIN_014["min-feat/ui/lead-stats"]
|
||||
MIN ---> MIN_015["min-feat/ui/border-indicator"]
|
||||
MIN ---> MIN_016["min-feat/dev/dashy"]
|
||||
MIN ---> MIN_017["min-feat/dev/delay-loggerd"]
|
||||
MIN ---> MIN_018["min-feat/dev/disable-connect"]
|
||||
MIN ---> MIN_019["min-feat/dev/tether-on-boot"]
|
||||
MIN ---> MIN_020["min-feat/ui/torque-bar"]
|
||||
MIN ---> MIN_021["min-feat/ui/mici-ui-mode"]
|
||||
MIN_001 ---> FULL["full"]
|
||||
MIN_002 ---> FULL
|
||||
MIN_003 ---> FULL
|
||||
MIN_004 ---> FULL
|
||||
MIN_005 ---> FULL
|
||||
MIN_006 ---> FULL
|
||||
MIN_007 ---> FULL
|
||||
MIN_008 ---> FULL
|
||||
MIN_009 ---> FULL
|
||||
MIN_010 ---> FULL
|
||||
MIN_011 ---> FULL
|
||||
MIN_012 ---> FULL
|
||||
MIN_013 ---> FULL
|
||||
MIN_014 ---> FULL
|
||||
MIN_015 ---> FULL
|
||||
MIN_016 ---> FULL
|
||||
MIN_017 ---> FULL
|
||||
MIN_018 ---> FULL
|
||||
MIN_019 ---> FULL
|
||||
MIN_020 ---> FULL
|
||||
MIN_021 ---> FULL
|
||||
FULL ---> TOYOTA_001[brand/toyota/safety-common]
|
||||
FULL ---> TOYOTA_002[brand/toyota/door-auto-lock-unlock]
|
||||
FULL ---> TOYOTA_003[brand/toyota/tss1-sng]
|
||||
FULL ---> TOYOTA_004[brand/toyota/radar-filter]
|
||||
FULL ---> TOYOTA_005[brand/toyota/sdsu]
|
||||
FULL ---> TOYOTA_006[brand/toyota/dsu-bypass]
|
||||
FULL ---> TOYOTA_007[brand/toyota/zss]
|
||||
FULL ---> TOYOTA_008[brand/toyota/stock-lon]
|
||||
FULL ---> VAG_001[brand/vag/a0-sng]
|
||||
FULL ---> VAG_002[brand/vag/pq-steering-patch]
|
||||
FULL ---> VAG_003[brand/vag/pq-no-dashcam]
|
||||
FULL ---> VAG_004[brand/vag/avoid-eps-lockout]
|
||||
FULL ---> HKG_001[brand/hkg/smdps]
|
||||
FULL ---> HONDA_001[brand/honda/eps-mod]
|
||||
FULL ---> SUBARU_001[brand/subaru/torque-3071]
|
||||
TOYOTA_001 ---> TOYOTA[pre-toyota]
|
||||
TOYOTA_002 ---> TOYOTA
|
||||
TOYOTA_003 ---> TOYOTA
|
||||
TOYOTA_004 ---> TOYOTA
|
||||
TOYOTA_005 ---> TOYOTA
|
||||
TOYOTA_006 ---> TOYOTA
|
||||
TOYOTA_007 ---> TOYOTA
|
||||
TOYOTA_008 ---> TOYOTA
|
||||
VAG_001 ---> VAG[pre-vag]
|
||||
VAG_002 ---> VAG
|
||||
VAG_003 ---> VAG
|
||||
VAG_004 ---> VAG
|
||||
HKG_001 ---> HKG[pre-hkg]
|
||||
HONDA_001 ---> HONDA[pre-honda]
|
||||
SUBARU_001 ---> SUBARU[pre-subaru]
|
||||
TOYOTA ---> PRE[pre]
|
||||
VAG ---> PRE
|
||||
HKG ---> PRE
|
||||
HONDA ---> PRE
|
||||
SUBARU ---> PRE
|
||||
PRE ---> PRE_PATCH[pre-patch]
|
||||
PRE_PATCH ---> PREBUILD[pre-build]
|
||||
PREBUILD ---> VERSION[x.x.x]
|
||||
```
|
||||
+1823
File diff suppressed because it is too large
Load Diff
+26
@@ -0,0 +1,26 @@
|
||||
# Sponsors 贊助者
|
||||
|
||||
我們誠摯感謝以下贊助者提供的硬體資源,讓專案能夠在多種平台上進行測試與驗證。
|
||||
|
||||
We sincerely thank the following sponsors for providing hardware resources, which enable the project to be tested and validated across multiple platforms.
|
||||
|
||||
---
|
||||
|
||||
## 贊助者列表 Sponsors
|
||||
|
||||
| 贊助者 Sponsor | 設備 Deices | 備註 Notes |
|
||||
| -------------- | ----------- | ---------- |
|
||||
| BlueGood | <ul><li>Radar Filter x 2</li><li>sDSU x1</li></ul> | - |
|
||||
| Chia Chun Lee | <ul><li>C3 Quick Mount x1</li></ul> | - |
|
||||
| CloudJ | <ul><li>C3X x1</li></ul> | - |
|
||||
| FareWay | <ul><li>EON Quick Mount x1</li><li>C2/C3 Quick Mount x1</li></ul> | Special thanks for fixing my good old EON |
|
||||
| Fred Wang | <ul><li>Oneplus 3t x1</li></ul> | - |
|
||||
| Saber Huang | <ul><li>O3L x1</li></ul> | - |
|
||||
| [馬威 Mr. One](https://shop61532546.taobao.com/) | <ul><li>O3 x 1</li><li>O3 (Dev) x1</li><li>O3XL x1</li><li>Red Panda x1</li><li>Panda Jungle v1 x1</li></ul> | - |
|
||||
| 門文梁 | <ul><li>C1.5 x1</li></ul> | - |
|
||||
|
||||
---
|
||||
|
||||
🙏 沒有你們的支持,我們無法讓專案在這麼多硬體平台上持續成長與驗證。
|
||||
|
||||
Without your support, this project could not continue to grow and be validated across so many hardware platforms.
|
||||
+1
-30
@@ -24,36 +24,7 @@ struct ModelExt @0xf35cc4560bbf6ec2 {
|
||||
rightEdgeDetected @1 :Bool;
|
||||
}
|
||||
|
||||
struct LiveGPS @0xda96579883444c35 {
|
||||
# Position
|
||||
latitude @0 :Float64; # degrees
|
||||
longitude @1 :Float64; # degrees
|
||||
altitude @2 :Float64; # meters (WGS84)
|
||||
|
||||
# Motion
|
||||
speed @3 :Float32; # m/s (horizontal speed)
|
||||
bearingDeg @4 :Float32; # degrees (heading)
|
||||
|
||||
# Accuracy
|
||||
horizontalAccuracy @5 :Float32; # meters
|
||||
verticalAccuracy @6 :Float32; # meters
|
||||
|
||||
# Status
|
||||
gpsOK @7 :Bool; # livePose valid + GPS fresh
|
||||
status @8 :Status;
|
||||
|
||||
enum Status {
|
||||
noGps @0;
|
||||
initializing @1;
|
||||
calibrating @2;
|
||||
valid @3;
|
||||
recalibrating @4;
|
||||
gpsStale @5;
|
||||
}
|
||||
|
||||
# Metadata
|
||||
unixTimestampMillis @9 :Int64;
|
||||
lastGpsTimestamp @10 :UInt64; # logMonoTime of last GPS
|
||||
struct CustomReserved3 @0xda96579883444c35 {
|
||||
}
|
||||
|
||||
struct CustomReserved4 @0x80ae746ee2596b11 {
|
||||
|
||||
+1
-1
@@ -2628,7 +2628,7 @@ struct Event {
|
||||
controlsStateExt @107 :Custom.ControlsStateExt;
|
||||
carStateExt @108 :Custom.CarStateExt;
|
||||
modelExt @109 :Custom.ModelExt;
|
||||
liveGPS @110 :Custom.LiveGPS;
|
||||
customReserved3 @110 :Custom.CustomReserved3;
|
||||
customReserved4 @111 :Custom.CustomReserved4;
|
||||
customReserved5 @112 :Custom.CustomReserved5;
|
||||
customReserved6 @113 :Custom.CustomReserved6;
|
||||
|
||||
+2
-3
@@ -102,10 +102,9 @@ _services: dict[str, tuple] = {
|
||||
"customReservedRawData0": (True, 0.),
|
||||
"customReservedRawData1": (True, 0.),
|
||||
"customReservedRawData2": (True, 0.),
|
||||
"controlsStateExt": (True, 100.),
|
||||
"carStateExt": (True, 100.),
|
||||
"controlsStateExt": (False, 100.),
|
||||
"carStateExt": (False, 100.),
|
||||
"modelExt": (True, 20.),
|
||||
"liveGPS": (True, 20.),
|
||||
}
|
||||
SERVICE_LIST = {name: Service(*vals) for
|
||||
idx, (name, vals) in enumerate(_services.items())}
|
||||
|
||||
@@ -155,7 +155,6 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
|
||||
{"dp_dev_disable_connect", {PERSISTENT, BOOL, "0"}},
|
||||
{"dp_dev_tethering", {PERSISTENT, BOOL, "0"}},
|
||||
{"dp_ui_mici", {PERSISTENT, BOOL, "0"}},
|
||||
{"dp_lat_offset_cm", {PERSISTENT, INT, "0"}},
|
||||
{"dp_toyota_door_auto_lock_unlock", {PERSISTENT, BOOL, "0"}},
|
||||
{"dp_toyota_tss1_sng", {PERSISTENT, BOOL, "0"}},
|
||||
{"dp_toyota_stock_lon", {PERSISTENT, BOOL, "0"}},
|
||||
|
||||
+329
-408
@@ -1,216 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Copyright (c) 2025, Rick Lan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
for non-commercial purposes only, subject to the following conditions:
|
||||
|
||||
- The above copyright notice and this permission notice shall be included in
|
||||
- The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
- Commercial use (e.g. use in a product, service, or activity intended to
|
||||
generate revenue) is prohibited without explicit written permission from
|
||||
- Commercial use (e.g. use in a product, service, or activity intended to
|
||||
generate revenue) is prohibited without explicit written permission from
|
||||
the copyright holder.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
"""
|
||||
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import json
|
||||
# import asyncio
|
||||
# import json
|
||||
import os
|
||||
import logging
|
||||
import time
|
||||
from datetime import datetime
|
||||
from functools import wraps
|
||||
from urllib.parse import quote
|
||||
# import socket
|
||||
# import sys
|
||||
|
||||
from aiohttp import web, ClientSession, ClientTimeout
|
||||
from aiohttp import web
|
||||
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.system.hardware import PC, HARDWARE
|
||||
from openpilot.system.ui.lib.multilang import multilang as base_multilang
|
||||
from dragonpilot.settings import SETTINGS
|
||||
from openpilot.system.hardware import PC
|
||||
|
||||
# --- Configuration ---
|
||||
|
||||
# --- File Browser Settings ---
|
||||
DEFAULT_DIR = os.path.realpath(os.path.join(os.path.dirname(__file__), '..') if PC else '/data/media/0/realdata')
|
||||
WEB_DIST_PATH = os.path.join(os.path.dirname(__file__), "..", "web", "dist")
|
||||
WEBRTC_TIMEOUT = ClientTimeout(total=10)
|
||||
CAR_PARAMS_CACHE_TTL = 30 # seconds
|
||||
|
||||
logger = logging.getLogger("dashy")
|
||||
|
||||
|
||||
# --- Caching Layer ---
|
||||
class AppCache:
|
||||
"""Centralized cache for expensive operations."""
|
||||
|
||||
def __init__(self):
|
||||
self._params = None
|
||||
self._car_params = None
|
||||
self._car_params_time = 0
|
||||
self._context = None
|
||||
self._context_time = 0
|
||||
|
||||
@property
|
||||
def params(self) -> Params:
|
||||
"""Get shared Params instance."""
|
||||
if self._params is None:
|
||||
self._params = Params()
|
||||
return self._params
|
||||
|
||||
def get_car_params(self):
|
||||
"""Get cached CarParams data (brand, longitudinal control)."""
|
||||
now = time.time()
|
||||
if self._car_params is None or (now - self._car_params_time) > CAR_PARAMS_CACHE_TTL:
|
||||
self._car_params = self._parse_car_params()
|
||||
self._car_params_time = now
|
||||
return self._car_params
|
||||
|
||||
def _parse_car_params(self):
|
||||
"""Parse CarParams from Params store."""
|
||||
result = {'brand': '', 'openpilot_longitudinal_control': False}
|
||||
try:
|
||||
car_params_bytes = self.params.get("CarParams")
|
||||
if car_params_bytes:
|
||||
from cereal import car
|
||||
with car.CarParams.from_bytes(car_params_bytes) as cp:
|
||||
result['brand'] = cp.brand
|
||||
result['openpilot_longitudinal_control'] = cp.openpilotLongitudinalControl
|
||||
except Exception as e:
|
||||
logger.debug(f"Could not parse CarParams: {e}")
|
||||
return result
|
||||
|
||||
def get_settings_context(self):
|
||||
"""Get context dict for settings condition evaluation."""
|
||||
now = time.time()
|
||||
if self._context is None or (now - self._context_time) > CAR_PARAMS_CACHE_TTL:
|
||||
car_params = self.get_car_params()
|
||||
self._context = {
|
||||
'brand': car_params['brand'],
|
||||
'openpilotLongitudinalControl': car_params['openpilot_longitudinal_control'],
|
||||
'LITE': os.getenv("LITE") is not None,
|
||||
'MICI': self._check_mici()
|
||||
}
|
||||
self._context_time = now
|
||||
return self._context
|
||||
|
||||
def _check_mici(self):
|
||||
"""Check if device is MICI type."""
|
||||
try:
|
||||
return HARDWARE.get_device_type() == "mici"
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
def get_bool_safe(self, key, default=False):
|
||||
"""Safely get a boolean param with default."""
|
||||
try:
|
||||
return self.params.get_bool(key)
|
||||
except Exception:
|
||||
return default
|
||||
|
||||
def invalidate(self):
|
||||
"""Invalidate all caches."""
|
||||
self._car_params = None
|
||||
self._context = None
|
||||
|
||||
|
||||
# --- Helper Functions ---
|
||||
def api_handler(func):
|
||||
"""Decorator for API handlers with consistent error handling."""
|
||||
@wraps(func)
|
||||
async def wrapper(request):
|
||||
try:
|
||||
return await func(request)
|
||||
except web.HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"{func.__name__} error: {e}", exc_info=True)
|
||||
return web.json_response({'error': str(e)}, status=500)
|
||||
return wrapper
|
||||
|
||||
|
||||
def get_safe_path(requested_path):
|
||||
"""Ensures the requested path is within DEFAULT_DIR."""
|
||||
"""Ensures the requested path is within DEFAULT_DIR, preventing arbitrary file access"""
|
||||
combined_path = os.path.join(DEFAULT_DIR, requested_path.lstrip('/'))
|
||||
safe_path = os.path.realpath(combined_path)
|
||||
if os.path.commonpath((safe_path, DEFAULT_DIR)) == DEFAULT_DIR:
|
||||
return safe_path
|
||||
return None
|
||||
|
||||
|
||||
def eval_condition(condition, context):
|
||||
"""Safely evaluate a condition string."""
|
||||
if not condition:
|
||||
return True
|
||||
try:
|
||||
return eval(condition, {"__builtins__": {}}, context)
|
||||
except Exception as e:
|
||||
logger.debug(f"Condition evaluation failed: {condition}, error: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def resolve_value(value):
|
||||
"""Resolve callable values (lambdas) for JSON serialization."""
|
||||
return value() if callable(value) else value
|
||||
|
||||
|
||||
# --- API Endpoints ---
|
||||
@api_handler
|
||||
async def init_api(request):
|
||||
"""Provide initial data to the client."""
|
||||
cache: AppCache = request.app['cache']
|
||||
car_params = cache.get_car_params()
|
||||
|
||||
return web.json_response({
|
||||
'is_metric': cache.get_bool_safe("IsMetric"),
|
||||
'dp_dev_dashy': cache.get_bool_safe("dp_dev_dashy", True),
|
||||
'openpilot_longitudinal_control': car_params['openpilot_longitudinal_control'],
|
||||
'ublox_available': cache.get_bool_safe("UbloxAvailable", True),
|
||||
'dp_lat_alka': cache.get_bool_safe("dp_lat_alka", False),
|
||||
})
|
||||
|
||||
|
||||
@api_handler
|
||||
async def list_files_api(request):
|
||||
"""List files and folders."""
|
||||
path_param = request.query.get('path', '/')
|
||||
safe_path = get_safe_path(path_param)
|
||||
"""API endpoint to list files and folders"""
|
||||
try:
|
||||
path_param = request.query.get('path', '/')
|
||||
safe_path = get_safe_path(path_param)
|
||||
if not safe_path or not os.path.isdir(safe_path):
|
||||
return web.json_response({'error': 'Invalid or Not Found Path'}, status=404)
|
||||
items = []
|
||||
for entry in os.listdir(safe_path):
|
||||
full_path = os.path.join(safe_path, entry)
|
||||
try:
|
||||
stat = os.stat(full_path)
|
||||
is_dir = os.path.isdir(full_path)
|
||||
items.append({
|
||||
'name': entry,
|
||||
'is_dir': is_dir,
|
||||
'mtime': datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M'),
|
||||
'size': stat.st_size if not is_dir else 0
|
||||
})
|
||||
except FileNotFoundError:
|
||||
continue
|
||||
directories = sorted([item for item in items if item['is_dir']], key=lambda x: x['mtime'], reverse=True)
|
||||
files = sorted([item for item in items if not item['is_dir']], key=lambda x: x['mtime'], reverse=True)
|
||||
items = directories + files
|
||||
relative_path = os.path.relpath(safe_path, DEFAULT_DIR)
|
||||
if relative_path == '.':
|
||||
relative_path = ''
|
||||
return web.json_response({'path': relative_path, 'files': items})
|
||||
except Exception as e:
|
||||
return web.json_response({'error': str(e)}, status=500)
|
||||
|
||||
if not safe_path or not os.path.isdir(safe_path):
|
||||
return web.json_response({'error': 'Invalid or Not Found Path'}, status=404)
|
||||
|
||||
items = []
|
||||
for entry in os.listdir(safe_path):
|
||||
full_path = os.path.join(safe_path, entry)
|
||||
try:
|
||||
stat = os.stat(full_path)
|
||||
is_dir = os.path.isdir(full_path)
|
||||
items.append({
|
||||
'name': entry,
|
||||
'is_dir': is_dir,
|
||||
'mtime': datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M'),
|
||||
'size': stat.st_size if not is_dir else 0
|
||||
})
|
||||
except FileNotFoundError:
|
||||
continue
|
||||
|
||||
# Sort: directories first (by mtime desc), then files (by mtime desc)
|
||||
dirs = sorted([i for i in items if i['is_dir']], key=lambda x: x['mtime'], reverse=True)
|
||||
files = sorted([i for i in items if not i['is_dir']], key=lambda x: x['mtime'], reverse=True)
|
||||
|
||||
relative_path = os.path.relpath(safe_path, DEFAULT_DIR)
|
||||
return web.json_response({
|
||||
'path': '' if relative_path == '.' else relative_path,
|
||||
'files': dirs + files
|
||||
})
|
||||
|
||||
|
||||
@api_handler
|
||||
async def serve_player_api(request):
|
||||
"""Serve the HLS player page."""
|
||||
"""API endpoint to serve the HLS player page"""
|
||||
file_path = request.query.get('file')
|
||||
if not file_path:
|
||||
return web.Response(text="File parameter is required.", status=400)
|
||||
@@ -222,237 +90,314 @@ async def serve_player_api(request):
|
||||
except FileNotFoundError:
|
||||
return web.Response(text="Player HTML not found.", status=500)
|
||||
|
||||
html = html_template.replace('{{FILE_PATH}}', quote(file_path))
|
||||
encoded_path = quote(file_path)
|
||||
html = html_template.replace('{{FILE_PATH}}', encoded_path)
|
||||
return web.Response(text=html, content_type='text/html')
|
||||
|
||||
|
||||
@api_handler
|
||||
async def serve_manifest_api(request):
|
||||
"""Dynamically generate m3u8 playlist."""
|
||||
file_path = request.query.get('file', '').lstrip('/')
|
||||
"""API endpoint to dynamically generate m3u8 playlist"""
|
||||
file_path = request.query.get('file').lstrip('/')
|
||||
if not file_path:
|
||||
return web.Response(text="File parameter is required.", status=400)
|
||||
|
||||
encoded_path = quote(file_path)
|
||||
manifest = f"#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:60\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXTINF:60.0,\n/media/{encoded_path}\n#EXT-X-ENDLIST\n"
|
||||
manifest = f"""#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:60\n#EXT-X-PLAYLIST-TYPE:VOD\n#EXTINF:60.0,\n/media/{encoded_path}\n#EXT-X-ENDLIST\n"""
|
||||
return web.Response(text=manifest, content_type='application/vnd.apple.mpegurl')
|
||||
|
||||
async def save_settings_api(request):
|
||||
"""API endpoint to receive and save settings"""
|
||||
try:
|
||||
data = await request.json()
|
||||
logging.getLogger("web_ui").info(f"Received settings to save: {data}")
|
||||
return web.json_response({'status': 'success', 'message': 'Settings saved successfully!'})
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").error(f"Error saving settings: {e}")
|
||||
return web.json_response({'status': 'error', 'message': str(e)}, status=500)
|
||||
|
||||
@api_handler
|
||||
async def get_settings_config_api(request):
|
||||
"""Get the settings configuration from settings.py."""
|
||||
cache: AppCache = request.app['cache']
|
||||
params = cache.params
|
||||
"""API endpoint to get the settings configuration from settings.py"""
|
||||
try:
|
||||
# Import settings.py from dragonpilot
|
||||
import sys
|
||||
import os
|
||||
dp_path = os.path.join(os.path.dirname(__file__), '..', '..', 'dragonpilot')
|
||||
if dp_path not in sys.path:
|
||||
sys.path.insert(0, dp_path)
|
||||
|
||||
# Update language if changed
|
||||
current_lang = params.get("LanguageSetting")
|
||||
if current_lang:
|
||||
lang_str = current_lang.decode() if isinstance(current_lang, bytes) else str(current_lang)
|
||||
lang_str = lang_str.removeprefix("main_")
|
||||
if lang_str != base_multilang.language and lang_str in base_multilang.languages.values():
|
||||
base_multilang._language = lang_str
|
||||
base_multilang.setup()
|
||||
from dragonpilot.settings import SETTINGS
|
||||
from openpilot.system.ui.lib.multilang import multilang as base_multilang
|
||||
|
||||
context = cache.get_settings_context()
|
||||
settings_with_values = []
|
||||
# Get current values from Params
|
||||
params = Params()
|
||||
|
||||
for section in SETTINGS:
|
||||
if not eval_condition(section.get('condition'), context):
|
||||
continue
|
||||
# Sync language from params (server is separate process, doesn't see UI language changes)
|
||||
current_lang = params.get("LanguageSetting")
|
||||
if current_lang:
|
||||
lang_str = current_lang.decode() if isinstance(current_lang, bytes) else str(current_lang)
|
||||
lang_str = lang_str.removeprefix("main_")
|
||||
if lang_str != base_multilang.language and lang_str in base_multilang.languages.values():
|
||||
base_multilang._language = lang_str
|
||||
base_multilang.setup()
|
||||
|
||||
section_copy = section.copy()
|
||||
settings_list = []
|
||||
# Helper function to evaluate conditions
|
||||
def eval_condition(condition, context):
|
||||
if not condition:
|
||||
return True
|
||||
try:
|
||||
return eval(condition, {"__builtins__": {}}, context)
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").debug(f"Condition evaluation failed: {condition}, error: {e}")
|
||||
return False
|
||||
|
||||
for setting in section.get('settings', []):
|
||||
if not eval_condition(setting.get('condition'), context):
|
||||
# Build context for condition evaluation
|
||||
# Get car brand and longitudinal control from CarParams
|
||||
brand = ""
|
||||
openpilot_longitudinal_control = False
|
||||
|
||||
try:
|
||||
# Try to get CarParams from params
|
||||
car_params_bytes = params.get("CarParams")
|
||||
if car_params_bytes:
|
||||
# Import CarParams protobuf from cereal
|
||||
from cereal import car
|
||||
|
||||
# Parse the CarParams message using context manager
|
||||
with car.CarParams.from_bytes(car_params_bytes) as cp:
|
||||
brand = cp.brand
|
||||
openpilot_longitudinal_control = cp.openpilotLongitudinalControl
|
||||
logging.getLogger("web_ui").info(f"Got CarParams: brand={brand}, openpilotLongitudinalControl={openpilot_longitudinal_control}")
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").warning(f"Could not parse CarParams: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
# Fall back to showing all settings if we can't get CarParams
|
||||
pass
|
||||
|
||||
# Check for LITE and MICI
|
||||
lite = os.getenv("LITE") is not None
|
||||
|
||||
# Check for MICI device type
|
||||
mici = False
|
||||
try:
|
||||
from openpilot.system.hardware import HARDWARE
|
||||
mici = HARDWARE.get_device_type() == "mici"
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").debug(f"Could not check MICI device type: {e}")
|
||||
|
||||
context = {
|
||||
'brand': brand,
|
||||
'openpilotLongitudinalControl': openpilot_longitudinal_control,
|
||||
'LITE': lite,
|
||||
'MICI': mici
|
||||
}
|
||||
|
||||
logging.getLogger("web_ui").info(f"Settings context: {context}")
|
||||
|
||||
# Helper to resolve callable values (lambdas) for JSON serialization
|
||||
def resolve_value(value):
|
||||
return value() if callable(value) else value
|
||||
|
||||
# Process settings and add current values
|
||||
settings_with_values = []
|
||||
for section in SETTINGS:
|
||||
# Check section condition (e.g., brand == 'toyota')
|
||||
if not eval_condition(section.get('condition'), context):
|
||||
continue
|
||||
|
||||
setting_copy = setting.copy()
|
||||
key = setting['key']
|
||||
section_copy = section.copy()
|
||||
settings_list = []
|
||||
|
||||
# Resolve callable values
|
||||
for field in ['title', 'description', 'suffix', 'special_value_text']:
|
||||
if field in setting_copy:
|
||||
setting_copy[field] = resolve_value(setting_copy[field])
|
||||
if 'options' in setting_copy:
|
||||
setting_copy['options'] = [resolve_value(opt) for opt in setting_copy['options']]
|
||||
for setting in section.get('settings', []):
|
||||
# Check setting-level condition if it exists
|
||||
if not eval_condition(setting.get('condition'), context):
|
||||
continue
|
||||
setting_copy = setting.copy()
|
||||
key = setting['key']
|
||||
|
||||
# Get current value based on type
|
||||
setting_copy['current_value'] = _get_setting_value(params, setting)
|
||||
settings_list.append(setting_copy)
|
||||
# Resolve callable values for JSON serialization
|
||||
for field in ['title', 'description', 'suffix', 'special_value_text']:
|
||||
if field in setting_copy:
|
||||
setting_copy[field] = resolve_value(setting_copy[field])
|
||||
if 'options' in setting_copy:
|
||||
setting_copy['options'] = [resolve_value(opt) for opt in setting_copy['options']]
|
||||
|
||||
if settings_list:
|
||||
section_copy['settings'] = settings_list
|
||||
settings_with_values.append(section_copy)
|
||||
# Debug: Log the setting properties
|
||||
if key == 'dp_lat_lca_speed':
|
||||
logging.getLogger("web_ui").info(f"Setting {key}: min_val={setting_copy.get('min_val')}, max_val={setting_copy.get('max_val')}, step={setting_copy.get('step')}")
|
||||
|
||||
return web.json_response({'settings': settings_with_values})
|
||||
try:
|
||||
# Get current value from Params based on type
|
||||
if setting['type'] == 'toggle_item':
|
||||
setting_copy['current_value'] = params.get_bool(key)
|
||||
elif setting['type'] == 'spin_button_item':
|
||||
value = params.get(key)
|
||||
try:
|
||||
setting_copy['current_value'] = int(value) if value is not None else setting.get('default', 0)
|
||||
except:
|
||||
setting_copy['current_value'] = setting.get('default', 0)
|
||||
elif setting['type'] == 'double_spin_button_item':
|
||||
value = params.get(key)
|
||||
try:
|
||||
setting_copy['current_value'] = float(value) if value is not None else setting.get('default', 0.0)
|
||||
except:
|
||||
setting_copy['current_value'] = setting.get('default', 0.0)
|
||||
elif setting['type'] == 'text_spin_button_item':
|
||||
value = params.get(key)
|
||||
try:
|
||||
setting_copy['current_value'] = int(value) if value is not None else setting.get('default', 0)
|
||||
except:
|
||||
setting_copy['current_value'] = setting.get('default', 0)
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").warning(f"Error getting value for {key}: {e}")
|
||||
# Use default value if we can't get current value
|
||||
if setting['type'] == 'toggle_item':
|
||||
setting_copy['current_value'] = False
|
||||
elif setting['type'] in ['spin_button_item', 'text_spin_button_item']:
|
||||
setting_copy['current_value'] = setting.get('default', 0)
|
||||
elif setting['type'] == 'double_spin_button_item':
|
||||
setting_copy['current_value'] = setting.get('default', 0.0)
|
||||
|
||||
settings_list.append(setting_copy)
|
||||
|
||||
def _get_setting_value(params, setting):
|
||||
"""Get current value for a setting from Params."""
|
||||
key = setting['key']
|
||||
setting_type = setting['type']
|
||||
default = setting.get('default', 0)
|
||||
# Only add the section if it has settings
|
||||
if settings_list:
|
||||
section_copy['settings'] = settings_list
|
||||
settings_with_values.append(section_copy)
|
||||
|
||||
try:
|
||||
if setting_type == 'toggle_item':
|
||||
return params.get_bool(key)
|
||||
elif setting_type == 'double_spin_button_item':
|
||||
value = params.get(key)
|
||||
return float(value) if value is not None else float(default)
|
||||
else: # spin_button_item, text_spin_button_item
|
||||
value = params.get(key)
|
||||
return int(value) if value is not None else int(default)
|
||||
return web.json_response({'settings': settings_with_values})
|
||||
except Exception as e:
|
||||
logger.warning(f"Error getting value for {key}: {e}")
|
||||
if setting_type == 'toggle_item':
|
||||
return False
|
||||
elif setting_type == 'double_spin_button_item':
|
||||
return float(default)
|
||||
return int(default)
|
||||
logging.getLogger("web_ui").error(f"Error fetching settings config: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return web.json_response({'error': f"Error fetching settings config: {e}"}, status=500)
|
||||
|
||||
|
||||
@api_handler
|
||||
async def save_param_api(request):
|
||||
"""Save a single param value.
|
||||
|
||||
Usage: POST /api/settings/params/{name}
|
||||
Body: { "value": <value> }
|
||||
"""
|
||||
param_name = request.match_info.get('param_name')
|
||||
if not param_name:
|
||||
return web.json_response({'error': 'param_name is required'}, status=400)
|
||||
|
||||
cache: AppCache = request.app['cache']
|
||||
params = cache.params
|
||||
data = await request.json()
|
||||
|
||||
if 'value' not in data:
|
||||
return web.json_response({'error': 'value is required in body'}, status=400)
|
||||
|
||||
_save_param(params, param_name, data['value'])
|
||||
logger.info(f"Param saved: {param_name}={data['value']}")
|
||||
|
||||
return web.json_response({'status': 'success', 'key': param_name, 'value': data['value']})
|
||||
|
||||
|
||||
def _save_param(params, key, value):
|
||||
"""Save a single param value with proper type handling."""
|
||||
async def save_settings_values_api(request):
|
||||
"""API endpoint to save settings values to Params"""
|
||||
try:
|
||||
param_type = params.get_type(key)
|
||||
data = await request.json()
|
||||
params = Params()
|
||||
|
||||
if param_type == 1: # BOOL
|
||||
params.put_bool(key, bool(value))
|
||||
elif param_type == 2: # INT
|
||||
params.put(key, int(value))
|
||||
elif param_type == 3: # FLOAT
|
||||
params.put(key, float(value))
|
||||
elif isinstance(value, bool):
|
||||
params.put_bool(key, value)
|
||||
else:
|
||||
params.put(key, str(value) if not isinstance(value, str) else value)
|
||||
for key, value in data.items():
|
||||
try:
|
||||
# Get the parameter type from Params
|
||||
param_type = params.get_type(key)
|
||||
|
||||
logger.debug(f"Saved {key}={value} (type={param_type})")
|
||||
# Convert and save based on type
|
||||
if param_type == 1: # BOOL
|
||||
params.put_bool(key, bool(value))
|
||||
elif param_type == 2: # INT
|
||||
params.put(key, int(value))
|
||||
elif param_type == 3: # FLOAT
|
||||
params.put(key, float(value))
|
||||
else: # STRING, BYTES, JSON, TIME, or unknown
|
||||
if isinstance(value, bool):
|
||||
params.put_bool(key, value)
|
||||
elif isinstance(value, (int, float)):
|
||||
params.put(key, str(value))
|
||||
else:
|
||||
params.put(key, str(value))
|
||||
|
||||
logging.getLogger("web_ui").debug(f"Saved {key}={value} (type={param_type})")
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").error(f"Error saving param {key}={value}: {e}")
|
||||
raise
|
||||
|
||||
logging.getLogger("web_ui").info(f"Settings saved successfully: {list(data.keys())}")
|
||||
return web.json_response({'status': 'success', 'message': 'Settings saved successfully!'})
|
||||
except Exception as e:
|
||||
logger.error(f"Error saving param {key}={value}: {e}")
|
||||
raise
|
||||
logging.getLogger("web_ui").error(f"Error saving settings: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return web.json_response({'status': 'error', 'message': str(e)}, status=500)
|
||||
|
||||
|
||||
def _get_param_value(params, key):
|
||||
"""Get a single param value with proper type handling."""
|
||||
try:
|
||||
return params.get_bool(key)
|
||||
except Exception:
|
||||
raw_value = params.get(key)
|
||||
if raw_value is None:
|
||||
return None
|
||||
elif isinstance(raw_value, bytes):
|
||||
return raw_value.decode('utf-8')
|
||||
return raw_value
|
||||
|
||||
|
||||
@api_handler
|
||||
async def get_param_api(request):
|
||||
"""Get a single param value."""
|
||||
param_name = request.match_info.get('param_name')
|
||||
if not param_name:
|
||||
return web.json_response({'error': 'param_name is required'}, status=400)
|
||||
|
||||
cache: AppCache = request.app['cache']
|
||||
params = cache.params
|
||||
value = _get_param_value(params, param_name)
|
||||
|
||||
return web.json_response({'key': param_name, 'value': value})
|
||||
|
||||
|
||||
@api_handler
|
||||
async def get_model_list_api(request):
|
||||
"""Get the model list and current selection."""
|
||||
cache: AppCache = request.app['cache']
|
||||
params = cache.params
|
||||
|
||||
# Get model list
|
||||
model_list = {}
|
||||
"""API endpoint to get the model list and current selection."""
|
||||
try:
|
||||
model_list_raw = params.get("dp_dev_model_list")
|
||||
if model_list_raw:
|
||||
model_list = json.loads(model_list_raw)
|
||||
params = Params()
|
||||
import json
|
||||
|
||||
# Get model list from dp_dev_model_list
|
||||
model_list = {}
|
||||
try:
|
||||
model_list_raw = params.get("dp_dev_model_list")
|
||||
if model_list_raw:
|
||||
model_list = json.loads(model_list_raw)
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").debug(f"Could not parse dp_dev_model_list: {e}")
|
||||
|
||||
# Get current selection from dp_dev_model_selected
|
||||
selected_model = ""
|
||||
try:
|
||||
selected_raw = params.get("dp_dev_model_selected")
|
||||
if selected_raw:
|
||||
selected_model = selected_raw.decode('utf-8') if isinstance(selected_raw, bytes) else str(selected_raw)
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").debug(f"Could not get dp_dev_model_selected: {e}")
|
||||
|
||||
return web.json_response({
|
||||
'model_list': model_list,
|
||||
'selected_model': selected_model
|
||||
})
|
||||
except Exception as e:
|
||||
logger.debug(f"Could not parse dp_dev_model_list: {e}")
|
||||
logging.getLogger("web_ui").error(f"Error fetching model list: {e}")
|
||||
return web.json_response({'error': str(e)}, status=500)
|
||||
|
||||
# Get current selection
|
||||
selected_model = ""
|
||||
try:
|
||||
selected_raw = params.get("dp_dev_model_selected")
|
||||
if selected_raw:
|
||||
selected_model = selected_raw.decode('utf-8') if isinstance(selected_raw, bytes) else str(selected_raw)
|
||||
except Exception as e:
|
||||
logger.debug(f"Could not get dp_dev_model_selected: {e}")
|
||||
|
||||
return web.json_response({
|
||||
'model_list': model_list,
|
||||
'selected_model': selected_model
|
||||
})
|
||||
|
||||
|
||||
@api_handler
|
||||
async def save_model_selection_api(request):
|
||||
"""Save the selected model."""
|
||||
cache: AppCache = request.app['cache']
|
||||
params = cache.params
|
||||
data = await request.json()
|
||||
"""API endpoint to save the selected model."""
|
||||
try:
|
||||
data = await request.json()
|
||||
params = Params()
|
||||
|
||||
selected_model = data.get('selected_model', '')
|
||||
selected_model = data.get('selected_model', '')
|
||||
|
||||
if not selected_model or selected_model == "[AUTO]":
|
||||
params.put("dp_dev_model_selected", "")
|
||||
logger.info("Model selection cleared (AUTO mode)")
|
||||
else:
|
||||
params.put("dp_dev_model_selected", selected_model)
|
||||
logger.info(f"Model selection saved: {selected_model}")
|
||||
# If empty or "[AUTO]", clear the param
|
||||
if not selected_model or selected_model == "[AUTO]":
|
||||
params.put("dp_dev_model_selected", "")
|
||||
logging.getLogger("web_ui").info("Model selection cleared (AUTO mode)")
|
||||
else:
|
||||
params.put("dp_dev_model_selected", selected_model)
|
||||
logging.getLogger("web_ui").info(f"Model selection saved: {selected_model}")
|
||||
|
||||
return web.json_response({'status': 'success'})
|
||||
return web.json_response({'status': 'success'})
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").error(f"Error saving model selection: {e}")
|
||||
return web.json_response({'error': str(e)}, status=500)
|
||||
|
||||
async def init_api(request):
|
||||
"""API endpoint to provide initial data to the client."""
|
||||
try:
|
||||
params = Params()
|
||||
|
||||
@api_handler
|
||||
async def webrtc_stream_proxy(request):
|
||||
"""Proxy WebRTC stream requests to webrtcd."""
|
||||
host = request.host.split(':')[0]
|
||||
body = await request.read()
|
||||
session: ClientSession = request.app['http_session']
|
||||
# Get openpilotLongitudinalControl from CarParams
|
||||
openpilot_longitudinal_control = False
|
||||
try:
|
||||
car_params_bytes = params.get("CarParams")
|
||||
if car_params_bytes:
|
||||
from cereal import car
|
||||
with car.CarParams.from_bytes(car_params_bytes) as cp:
|
||||
openpilot_longitudinal_control = cp.openpilotLongitudinalControl
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").debug(f"Could not parse CarParams: {e}")
|
||||
|
||||
async with session.post(
|
||||
f'http://{host}:5001/stream',
|
||||
data=body,
|
||||
headers={'Content-Type': 'application/json'}
|
||||
) as resp:
|
||||
response_body = await resp.read()
|
||||
return web.Response(
|
||||
body=response_body,
|
||||
status=resp.status,
|
||||
content_type=resp.content_type
|
||||
)
|
||||
# dp_dev_dashy may not exist on all devices, default to True
|
||||
try:
|
||||
dp_dev_dashy = params.get_bool("dp_dev_dashy")
|
||||
except Exception:
|
||||
dp_dev_dashy = True
|
||||
|
||||
return web.json_response({
|
||||
'is_metric': params.get_bool("IsMetric"),
|
||||
'dp_dev_dashy': dp_dev_dashy,
|
||||
'openpilot_longitudinal_control': openpilot_longitudinal_control,
|
||||
})
|
||||
except Exception as e:
|
||||
logging.getLogger("web_ui").error(f"Error fetching initial data: {e}")
|
||||
return web.json_response({'error': f"Error fetching initial data: {e}"}, status=500)
|
||||
|
||||
async def on_startup(app):
|
||||
logging.getLogger("web_ui").info("Web UI application starting up...")
|
||||
|
||||
async def on_cleanup(app):
|
||||
logging.getLogger("web_ui").info("Web UI application shutting down...")
|
||||
|
||||
# --- CORS Middleware ---
|
||||
@web.middleware
|
||||
@@ -461,61 +406,35 @@ async def cors_middleware(request, handler):
|
||||
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
|
||||
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
|
||||
|
||||
# Disable caching for web assets
|
||||
path = request.path.lower()
|
||||
if path.endswith(('.html', '.js', '.css')) or path == '/':
|
||||
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
|
||||
response.headers['Pragma'] = 'no-cache'
|
||||
response.headers['Expires'] = '0'
|
||||
|
||||
return response
|
||||
|
||||
|
||||
async def handle_cors_preflight(request):
|
||||
return web.Response(status=200, headers={
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
||||
'Access-Control-Max-Age': '86400',
|
||||
})
|
||||
|
||||
|
||||
# --- Application Setup ---
|
||||
async def on_startup(app):
|
||||
"""Initialize app-level resources."""
|
||||
app['cache'] = AppCache()
|
||||
app['http_session'] = ClientSession(timeout=WEBRTC_TIMEOUT)
|
||||
logger.info("Dashy server started")
|
||||
|
||||
|
||||
async def on_cleanup(app):
|
||||
"""Cleanup app-level resources."""
|
||||
await app['http_session'].close()
|
||||
logger.info("Dashy server stopped")
|
||||
|
||||
if request.method == 'OPTIONS':
|
||||
headers = {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
||||
'Access-Control-Max-Age': '86400',
|
||||
}
|
||||
return web.Response(status=200, headers=headers)
|
||||
return await request.app['handler'](request)
|
||||
|
||||
def setup_aiohttp_app(host: str, port: int, debug: bool):
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG if debug else logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
)
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||
logging.getLogger("web_ui").setLevel(logging.DEBUG if debug else logging.INFO)
|
||||
|
||||
app = web.Application(middlewares=[cors_middleware])
|
||||
app['port'] = port
|
||||
|
||||
# API routes
|
||||
# Register API endpoints
|
||||
app.router.add_get("/api/init", init_api)
|
||||
app.router.add_get("/api/files", list_files_api)
|
||||
app.router.add_get("/api/play", serve_player_api)
|
||||
app.router.add_get("/api/manifest.m3u8", serve_manifest_api)
|
||||
app.router.add_get("/api/settings", get_settings_config_api)
|
||||
app.router.add_get("/api/settings/params/{param_name}", get_param_api)
|
||||
app.router.add_post("/api/settings/params/{param_name}", save_param_api)
|
||||
app.router.add_get("/api/settings/config", get_settings_config_api)
|
||||
app.router.add_post("/api/settings/save", save_settings_values_api)
|
||||
app.router.add_get("/api/models", get_model_list_api)
|
||||
app.router.add_post("/api/models/select", save_model_selection_api)
|
||||
app.router.add_post("/api/stream", webrtc_stream_proxy)
|
||||
app.router.add_route('OPTIONS', '/{tail:.*}', handle_cors_preflight)
|
||||
|
||||
# Static files
|
||||
app.router.add_static('/media', path=DEFAULT_DIR, name='media', show_index=False, follow_symlinks=False)
|
||||
@@ -526,10 +445,13 @@ def setup_aiohttp_app(host: str, port: int, debug: bool):
|
||||
app.on_startup.append(on_startup)
|
||||
app.on_cleanup.append(on_cleanup)
|
||||
|
||||
# Add CORS preflight handler
|
||||
app.router.add_route('OPTIONS', '/{tail:.*}', handle_cors_preflight)
|
||||
|
||||
return app
|
||||
|
||||
|
||||
def main():
|
||||
# rick - may need "sudo ufw allow 5088" to allow port access
|
||||
parser = argparse.ArgumentParser(description="Dashy Server")
|
||||
parser.add_argument("--host", type=str, default="0.0.0.0", help="Host to listen on")
|
||||
parser.add_argument("--port", type=int, default=5088, help="Port to listen on")
|
||||
@@ -539,6 +461,5 @@ def main():
|
||||
app = setup_aiohttp_app(args.host, args.port, args.debug)
|
||||
web.run_app(app, host=args.host, port=args.port)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
+1
-2
File diff suppressed because one or more lines are too long
+36
-64
@@ -1,87 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" data-theme="dark">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
<title>Dashy by dragonpilot</title>
|
||||
<link rel="icon" href="/icons/icon-192x192.png">
|
||||
<link rel="stylesheet" href="/css/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="app-container" class="w-full h-full">
|
||||
<div id="app-container">
|
||||
<nav>
|
||||
<button id="nav-files" class="active">Files</button>
|
||||
<button id="nav-hud">HUD</button>
|
||||
<!-- <button id="nav-settings">Settings</button> -->
|
||||
<button id="nav-local-settings">Local Settings</button>
|
||||
</nav>
|
||||
|
||||
<!-- HUD Page (full-screen, default when enabled) -->
|
||||
<div id="hud-page" class="hud-page">
|
||||
<div id="hud-page-content" class="relative w-full h-full">
|
||||
<video id="videoPlayer" class="absolute inset-0 w-full h-full object-cover" autoplay playsinline muted></video>
|
||||
<canvas id="uiCanvas" class="absolute inset-0 w-full h-full pointer-events-none z-10"></canvas>
|
||||
<main id="page-content" style="flex-grow: 1; min-height: 0;">
|
||||
<div id="files-page" class="page active">
|
||||
<div id="files-breadcrumbs"></div>
|
||||
<table id="files-table">
|
||||
<thead><tr><th></th><th>Name</th><th>Last Modified</th><th style="text-align:right;">Size</th><th></th></tr></thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Panel Backdrop -->
|
||||
<div id="panel-backdrop" class="panel-backdrop"></div>
|
||||
<div id="hud-page" class="page">
|
||||
<div id="hud-page-content">
|
||||
<video id="videoPlayer" autoplay playsinline muted></video>
|
||||
<canvas id="uiCanvas"></canvas>
|
||||
|
||||
<!-- Slide-up Panel -->
|
||||
<div id="panel" class="panel">
|
||||
<!-- Panel Header with Tabs -->
|
||||
<div class="panel-header">
|
||||
<div class="panel-handle"></div>
|
||||
<div class="flex items-center justify-between w-full gap-2">
|
||||
<div class="join flex-1 max-w-sm">
|
||||
<button id="panel-tab-controls" class="join-item btn btn-primary btn-sm sm:btn-md flex-1">Controls</button>
|
||||
<button id="panel-tab-settings" class="join-item btn btn-ghost btn-sm sm:btn-md flex-1">Settings</button>
|
||||
<button id="panel-tab-files" class="join-item btn btn-ghost btn-sm sm:btn-md flex-1">Files</button>
|
||||
</div>
|
||||
<button id="panel-close" class="btn btn-circle btn-ghost btn-sm sm:btn-md shrink-0" aria-label="Close panel">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="18" y1="6" x2="6" y2="18"></line>
|
||||
<line x1="6" y1="6" x2="18" y2="18"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Panel Content -->
|
||||
<div class="panel-content">
|
||||
<!-- Controls Tab -->
|
||||
<div id="controls-content" class="panel-page active">
|
||||
<div class="max-w-2xl landscape:max-w-5xl mx-auto space-y-4">
|
||||
<div id="controls-content-inner"></div>
|
||||
</div>
|
||||
<!--
|
||||
<div id="settings-page" class="page">
|
||||
<div class="settings-page-wrapper">
|
||||
<h1>Settings</h1>
|
||||
<div id="settings-content"></div>
|
||||
</div>
|
||||
|
||||
<!-- Settings Tab -->
|
||||
<div id="settings-content" class="panel-page">
|
||||
<div class="max-w-2xl landscape:max-w-5xl mx-auto">
|
||||
<div id="local-settings-content" class="space-y-6"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Files Tab -->
|
||||
<div id="files-content" class="panel-page">
|
||||
<div id="files-breadcrumbs" class="breadcrumbs text-sm mb-4">
|
||||
<ul></ul>
|
||||
</div>
|
||||
<div class="overflow-x-auto">
|
||||
<table id="files-table" class="table table-zebra w-full">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-12"></th>
|
||||
<th>Name</th>
|
||||
<th>Last Modified</th>
|
||||
<th class="text-right">Size</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div id="save-bar">
|
||||
<span id="save-status"></span>
|
||||
<button id="save-settings-btn">Save Settings</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
|
||||
<div id="local-settings-page" class="page">
|
||||
<div class="settings-page-wrapper">
|
||||
<h1>Local Settings</h1>
|
||||
<div id="local-settings-content"></div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- Main app -->
|
||||
|
||||
Vendored
+13
-137
File diff suppressed because one or more lines are too long
-24
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2025, Rick Lan
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
* for non-commercial purposes only, subject to the following conditions:
|
||||
*
|
||||
* - The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
* - Commercial use (e.g. use in a product, service, or activity intended to
|
||||
* generate revenue) is prohibited without explicit written permission from
|
||||
* the copyright holder.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
var C=Object.defineProperty;var B=(w,p,d)=>p in w?C(w,p,{enumerable:!0,configurable:!0,writable:!0,value:d}):w[p]=d;var _=(w,p,d)=>B(w,typeof p!="symbol"?p+"":p,d);(function(){"use strict";class w extends ModelRenderer{static getTopics(){return["modelV2","liveCalibration","carParams","longitudinalPlan","radarState"]}constructor(){super(),this._tunnelOffset=0}_draw_lane_lines(){}_draw_path(t){const h=this._path;if(!h||!h.raw_points||h.raw_points.length<4)return;const e=this.ctx,i=this._car_space_transform,R=this._path_offset_z,b=6,l=100,r=t.longitudinalPlan&&t.longitudinalPlan.allowThrottle||!this._longitudinal_control?{r:13,g:248,b:122}:{r:242,g:242,b:242};e.lineCap="round",e.lineJoin="round";const a=h.raw_points,f=1.2,v=.8,M=a[a.length-1][0];let g=Math.max(b,Math.min(l,M));const P=t.radarState,T=P?P.leadOne:null;if(T&&T.status){const c=T.dRel*2;g=Math.max(0,Math.min(c-Math.min(c*.35,10),g))}const S=10,k=b;if(g<=k)return;const F=(g-k)/S,W=t.carState?t.carState.vEgo:0;for(this._tunnelOffset+=W*.015;this._tunnelOffset>=F;)this._tunnelOffset-=F;const $=[];for(let c=0;c<S;c++){let o=k+c*F-this._tunnelOffset;o<k-1&&(o+=F*S);let m=null;for(let s=0;s<a.length-1;s++)if(a[s][0]<=o&&a[s+1][0]>=o){const D=(o-a[s][0])/(a[s+1][0]-a[s][0]);m=[o,a[s][1]+D*(a[s+1][1]-a[s][1]),a[s][2]+D*(a[s+1][2]-a[s][2])];break}if(!m)continue;const L=m[2]+R,u=L-v*3,A=[[o,m[1]-f,L],[o,m[1]+f,L],[o,m[1]-f,u],[o,m[1]+f,u]].map(s=>{const D=i[0][0]*s[0]+i[0][1]*s[1]+i[0][2]*s[2],O=i[1][0]*s[0]+i[1][1]*s[1]+i[1][2]*s[2],E=i[2][0]*s[0]+i[2][1]*s[1]+i[2][2]*s[2];return Math.abs(E)<1e-6?null:[D/E,O/E]});if(A.some(s=>!s))continue;const y=Math.max(0,1-(o-k)/(g-k));$.push({bottomLeft:A[0],bottomRight:A[1],topLeft:A[2],topRight:A[3],distFactor:y})}for(let c=$.length-1;c>=0;c--){const o=$[c],m=.2+o.distFactor*.5,L=1.5+o.distFactor*2;if(e.strokeStyle=`rgba(${r.r}, ${r.g}, ${r.b}, ${m})`,e.lineWidth=L,e.beginPath(),e.moveTo(o.bottomLeft[0],o.bottomLeft[1]),e.lineTo(o.bottomRight[0],o.bottomRight[1]),e.lineTo(o.topRight[0],o.topRight[1]),e.lineTo(o.topLeft[0],o.topLeft[1]),e.closePath(),e.stroke(),c<$.length-1){const u=$[c+1],I=m*.4;e.strokeStyle=`rgba(${r.r}, ${r.g}, ${r.b}, ${I})`,e.lineWidth=L*.5,e.beginPath(),e.moveTo(o.bottomLeft[0],o.bottomLeft[1]),e.lineTo(u.bottomLeft[0],u.bottomLeft[1]),e.stroke(),e.beginPath(),e.moveTo(o.bottomRight[0],o.bottomRight[1]),e.lineTo(u.bottomRight[0],u.bottomRight[1]),e.stroke(),e.beginPath(),e.moveTo(o.topLeft[0],o.topLeft[1]),e.lineTo(u.topLeft[0],u.topLeft[1]),e.stroke(),e.beginPath(),e.moveTo(o.topRight[0],o.topRight[1]),e.lineTo(u.topRight[0],u.topRight[1]),e.stroke()}}}_draw_lead_indicator(){const t=this.ctx,h=Date.now(),e=this._sm&&this._sm.radarState;this._lead_vehicles.forEach((i,R)=>{if(!i.chevron||i.chevron.length<3)return;const b=i.chevron[1][0],l=Math.abs(i.chevron[0][0]-i.chevron[2][0]),n=Math.abs(i.chevron[0][1]-i.chevron[1][1]),r=Math.max(l,n)*.8,a=i.chevron[1][1]-r*.6,f=e?R===0?e.leadOne:e.leadTwo:null,v=f?f.vRel:0,M=f?f.dRel:100;let g;v<-5?g="#ff3333":v<-2?g="#ffaa00":g="#00ff88";const P=1e3+M/100*3e3,T=.7+.3*Math.sin(h/P*Math.PI*2);this._drawTargetBrackets(t,b,a,r,g,T),this._drawTargetInfo(t,b,a+r*.7,M,v,g)})}_drawTargetInfo(t,h,e,i,R,b){var T,S;t.save(),t.font="bold 16px Arial",t.textAlign="center",t.textBaseline="top";const l=SmUtils.isMetric(),n=l?`${i.toFixed(1)}m`:`${(i*3.28084).toFixed(1)}ft`,a=(((S=(T=this._sm)==null?void 0:T.carState)==null?void 0:S.vEgo)||0)+R,f=Math.max(0,l?a*3.6:a*2.237),v=`${Math.round(f)}`,M=120,g=22,P=6;t.fillStyle="rgba(0, 0, 0, 0.5)",t.beginPath(),t.roundRect(h-M/2,e-2,M,g,4),t.fill(),t.fillStyle=b,t.fillText(`${n} ${v}`,h,e),t.restore()}_drawTargetBrackets(t,h,e,i,R,b){const l=i*.35,n=i*.5;t.strokeStyle=R,t.lineWidth=3,t.lineCap="square",t.save(),t.translate(h,e),t.beginPath(),t.moveTo(-n,-n+l),t.lineTo(-n,-n),t.lineTo(-n+l,-n),t.stroke(),t.beginPath(),t.moveTo(n-l,-n),t.lineTo(n,-n),t.lineTo(n,-n+l),t.stroke(),t.beginPath(),t.moveTo(n,n-l),t.lineTo(n,n),t.lineTo(n-l,n),t.stroke(),t.beginPath(),t.moveTo(-n+l,n),t.lineTo(-n,n),t.lineTo(-n,n-l),t.stroke();const r=i*.12;t.lineWidth=2,t.globalAlpha=b,t.beginPath(),t.moveTo(-r,0),t.lineTo(r,0),t.stroke(),t.beginPath(),t.moveTo(0,-r),t.lineTo(0,r),t.stroke(),t.globalAlpha=1,t.restore()}}window.FlightModelRenderer=w;class p extends HudRenderer{render(t,h,e){return!t||t.width<=0||t.height<=0||(window.EdgeIndicators&&EdgeIndicators.draw(e,t,h),window.FlightHud&&FlightHud.draw(e,t,h)),!1}}window.FlightHudRenderer=p;class d extends BaseTheme{}_(d,"layout",Layouts.fullResponsive),_(d,"requiresVideo",!0),_(d,"modules",["FlightHud","NavMap","EdgeIndicators"]),_(d,"layers",[]),_(d,"minimapConfig",{useGrid:!1,options:{responsiveThird:!0,zoom:16,interactive:!0,scale:1.5}}),_(d,"modelRenderer","FlightModelRenderer"),_(d,"hudRenderer","FlightHudRenderer"),window.FlightPanel=d})();
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2025, Rick Lan
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
* for non-commercial purposes only, subject to the following conditions:
|
||||
*
|
||||
* - The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
* - Commercial use (e.g. use in a product, service, or activity intended to
|
||||
* generate revenue) is prohibited without explicit written permission from
|
||||
* the copyright holder.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
var v=Object.defineProperty;var w=(t,i,e)=>i in t?v(t,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[i]=e;var l=(t,i,e)=>w(t,typeof i!="symbol"?i+"":i,e);var u=(t,i,e)=>new Promise((a,o)=>{var s=d=>{try{r(e.next(d))}catch(c){o(c)}},n=d=>{try{r(e.throw(d))}catch(c){o(c)}},r=d=>d.done?a(d.value):Promise.resolve(d.value).then(s,n);r((e=e.apply(t,i)).next())});(function(){"use strict";class t extends BaseTheme{constructor(){super(),this._mapReady=!1}init(e,a){return u(this,null,function*(){this._canvas=e,this._ctx=a,this._enabled=!0;const o=document.getElementById("videoPlayer");if(o&&(o.style.display="none"),window.NavMap&&NavMap.destroy(),window.NavigationFree&&NavigationFree.init(),window.NavMap){yield NavMap.init();const n=document.getElementById("hud-page-content");n&&(NavMap.show(n,{fullscreen:!0,scale:1.5,interactive:!0,enableRouting:!0,autoTileCache:!0,followResumeDelay:3e3}),this._mapReady=!0)}const s=document.getElementById("hud-page-content");return s&&window.NavSearch&&NavSearch.show(s),!0})}update(e){var s;const a=SmUtils.gps(e),o=SmUtils.speedKmh(e);if(this._mapReady&&window.NavMap&&a.lat!==0&&NavMap.setPosition(a.lat,a.lon,a.heading,o),window.NavSearch&&NavSearch.updatePosition(a.lat,a.lon),(s=window.NavigationFree)!=null&&s.isNavigating()){NavigationFree.updatePosition(a.lat,a.lon,a.heading);const n=NavigationFree.getRoute();n&&window.NavMap&&NavMap.setRoute(n)}}render(e,a,o){if(!this._enabled)return!1;e.clearRect(0,0,a,o);const s=window.sm||{};for(const n of this.constructor.layers){const r=window[n.module];if(r!=null&&r.draw){const d=this._layout.getRect(n.region||"full",a,o);r.draw(e,d,s)}}return!1}destroy(){this._enabled=!1,window.NavMap&&NavMap.destroy(),window.NavigationFree&&NavigationFree.clearRoute(),window.NavSearch&&NavSearch.hide();const e=document.getElementById("videoPlayer");e&&(e.style.display=""),this._mapReady=!1}}l(t,"layout",Layouts.full),l(t,"requiresVideo",!1),l(t,"modules",["NavSidebar","NavHud","NavMap","EdgeIndicators"]),l(t,"layers",[{module:"NavSidebar",region:"full"},{module:"NavHud",region:"full"},{module:"EdgeIndicators",region:"full"}]),window.NavFreeTheme=t})();
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2025, Rick Lan
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
* for non-commercial purposes only, subject to the following conditions:
|
||||
*
|
||||
* - The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
* - Commercial use (e.g. use in a product, service, or activity intended to
|
||||
* generate revenue) is prohibited without explicit written permission from
|
||||
* the copyright holder.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
var c=Object.defineProperty;var _=(s,r,t)=>r in s?c(s,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[r]=t;var l=(s,r,t)=>_(s,typeof r!="symbol"?r+"":r,t);var p=(s,r,t)=>new Promise((e,n)=>{var d=a=>{try{i(t.next(a))}catch(h){n(h)}},o=a=>{try{i(t.throw(a))}catch(h){n(h)}},i=a=>a.done?e(a.value):Promise.resolve(a.value).then(d,o);i((t=t.apply(s,r)).next())});(function(){"use strict";class s extends BaseTheme{constructor(){super(),this._splitContainer=null,this._mapContainer=null,this._videoContainer=null,this._videoCanvas=null,this._videoCtx=null,this._opModel=null,this._minimapReady=!1,this._isPortrait=!1,this._resizeHandler=null}init(t,e){return p(this,null,function*(){return this._canvas=t,this._ctx=e,this._enabled=!0,window.Minimap&&Minimap.destroy(),window.NavMap&&NavMap.destroy(),this._createSplitLayout(),yield this._initMap(),this._resizeHandler=()=>this._handleResize(),window.addEventListener("resize",this._resizeHandler),!0})}_handleResize(){const t=window.innerWidth,e=window.innerHeight,n=this._isPortrait;this._isPortrait=this._layout.isPortrait(t,e),n!==this._isPortrait&&this._rebuildLayout()}_rebuildLayout(){const t=this._minimapReady;this._minimapReady&&window.NavMap&&NavMap.destroy(),this._minimapReady=!1;const e=document.getElementById("videoPlayer"),n=document.getElementById("hud-page-content");e&&this._videoContainer&&n&&(e.style.cssText="",n.insertBefore(e,this._videoContainer),this._videoContainer.remove()),this._splitContainer&&this._splitContainer.remove(),this._createSplitLayout(),t&&this._initMap()}_createSplitLayout(){const t=document.getElementById("hud-page-content");if(!t)return;const e=t.offsetWidth||window.innerWidth,n=t.offsetHeight||window.innerHeight;this._isPortrait=this._layout.isPortrait(e,n);const d=this._layout.getRegionRect("primary",e,n),o=this._layout.getRegionRect("secondary",e,n),i=60;this._splitContainer=document.createElement("div"),this._splitContainer.id="op-split-container",this._splitContainer.style.cssText=`
|
||||
position: absolute; top: 0; left: 0; width: 100%; height: 100%;
|
||||
display: flex; pointer-events: none; z-index: 1;
|
||||
flex-direction: ${this._isPortrait?"column-reverse":"row-reverse"};
|
||||
`,this._mapContainer=document.createElement("div"),this._mapContainer.id="op-split-map",this._isPortrait?this._mapContainer.style.cssText=`
|
||||
width: ${d.width}px; height: ${d.height}px;
|
||||
position: relative; pointer-events: auto;
|
||||
-webkit-mask-image: linear-gradient(to top, black 0%, black calc(100% - ${i}px), transparent 100%);
|
||||
mask-image: linear-gradient(to top, black 0%, black calc(100% - ${i}px), transparent 100%);
|
||||
`:this._mapContainer.style.cssText=`
|
||||
width: ${d.width}px; height: ${d.height}px;
|
||||
position: relative; pointer-events: auto;
|
||||
-webkit-mask-image: linear-gradient(to left, black 0%, black calc(100% - ${i}px), transparent 100%);
|
||||
mask-image: linear-gradient(to left, black 0%, black calc(100% - ${i}px), transparent 100%);
|
||||
`,this._splitContainer.appendChild(this._mapContainer),t.appendChild(this._splitContainer);const a=document.getElementById("videoPlayer");a&&(this._videoContainer=document.createElement("div"),this._videoContainer.id="op-split-video",this._isPortrait?this._videoContainer.style.cssText=`
|
||||
position: absolute; left: ${o.x}px; top: 0;
|
||||
width: ${o.width}px; height: ${o.height+i}px;
|
||||
overflow: hidden;
|
||||
-webkit-mask-image: linear-gradient(to top, transparent 0%, black ${i}px, black 100%);
|
||||
mask-image: linear-gradient(to top, transparent 0%, black ${i}px, black 100%);
|
||||
`:this._videoContainer.style.cssText=`
|
||||
position: absolute; left: 0; top: ${o.y}px;
|
||||
width: ${o.width+i}px; height: ${o.height}px;
|
||||
overflow: hidden;
|
||||
-webkit-mask-image: linear-gradient(to left, transparent 0%, black ${i}px, black 100%);
|
||||
mask-image: linear-gradient(to left, transparent 0%, black ${i}px, black 100%);
|
||||
`,a.parentNode.insertBefore(this._videoContainer,a),this._videoContainer.appendChild(a),a.style.cssText=`
|
||||
position: absolute; top: 0; left: 0;
|
||||
width: 100%; height: 100%;
|
||||
object-fit: cover;
|
||||
`,this._videoCanvas=document.createElement("canvas"),this._videoCanvas.width=o.width,this._videoCanvas.height=o.height,this._videoCanvas.style.cssText=`
|
||||
position: absolute; top: 0; left: 0;
|
||||
width: 100%; height: 100%; pointer-events: none;
|
||||
`,this._videoContainer.appendChild(this._videoCanvas),this._videoCtx=this._videoCanvas.getContext("2d"),window.OpModel&&(this._opModel=OpModel.create()))}_initMap(){return p(this,null,function*(){!this._mapContainer||!window.NavMap||(NavMap.destroy(),yield NavMap.init(),NavMap.show(this._mapContainer,{fullscreen:!0,scale:1.5,zoom:16,interactive:!0}),this._minimapReady=!0)})}update(t){if(this._minimapReady&&window.NavMap&&NavMap.isVisible()){const e=SmUtils.gps(t);e.lat!==0&&NavMap.setPosition(e.lat,e.lon,e.heading,SmUtils.speedKmh(t))}}render(t,e,n){if(!this._enabled)return!1;const d=window.sm||{};this._opModel&&this._videoCtx&&(this._videoCtx.clearRect(0,0,this._videoCanvas.width,this._videoCanvas.height),this._opModel.draw(this._videoCtx,{x:0,y:0,width:this._videoCanvas.width,height:this._videoCanvas.height},d));for(const o of this.constructor.layers){const i=window[o.module];if(!(i!=null&&i.draw))continue;let a;o.region==="hud"?this._isPortrait?a={x:0,y:0,width:e,height:n*.5}:a={x:0,y:0,width:e*.5,height:n}:a={x:0,y:0,width:e,height:n},i.draw(t,a,d)}return!1}destroy(){this._enabled=!1,this._resizeHandler&&(window.removeEventListener("resize",this._resizeHandler),this._resizeHandler=null),this._minimapReady&&window.NavMap&&NavMap.destroy(),this._opModel&&this._opModel.destroy();const t=document.getElementById("videoPlayer"),e=document.getElementById("hud-page-content");t&&this._videoContainer&&e&&(t.style.cssText="",t.className="absolute inset-0 w-full h-full object-cover",e.insertBefore(t,this._videoContainer),this._videoContainer.remove()),this._splitContainer&&this._splitContainer.remove(),this._splitContainer=null,this._mapContainer=null,this._videoContainer=null,this._videoCanvas=null,this._videoCtx=null,this._opModel=null,this._minimapReady=!1,this._isPortrait=!1}}l(s,"layout",Layouts.splitResponsive),l(s,"requiresVideo",!0),l(s,"handlesOwnRendering",!0),l(s,"modules",["NavSidebar","NavMap","OpModel","OpBorder","OpAlerts","EdgeIndicators"]),l(s,"layers",[{module:"NavSidebar",region:"hud"},{module:"OpBorder",region:"full"},{module:"EdgeIndicators",region:"full"},{module:"OpAlerts",region:"full"}]),window.OpSplitTheme=s})();
|
||||
@@ -1,24 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2025, Rick Lan
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
* for non-commercial purposes only, subject to the following conditions:
|
||||
*
|
||||
* - The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
* - Commercial use (e.g. use in a product, service, or activity intended to
|
||||
* generate revenue) is prohibited without explicit written permission from
|
||||
* the copyright holder.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
var n=Object.defineProperty;var u=(r,e,d)=>e in r?n(r,e,{enumerable:!0,configurable:!0,writable:!0,value:d}):r[e]=d;var s=(r,e,d)=>u(r,typeof e!="symbol"?e+"":e,d);(function(){"use strict";class r extends HudRenderer{render(t,i,a){return super.render(t,i,a),window.EdgeIndicators&&EdgeIndicators.draw(a,t,i),!1}}window.OpenpilotHudRenderer=r;class e extends BaseTheme{}s(e,"layout",Layouts.fullResponsive),s(e,"requiresVideo",!0),s(e,"modules",["OpHud","OpBorder","OpAlerts","NavMap","EdgeIndicators"]),s(e,"layers",[]),s(e,"minimapConfig",{useGrid:!1,options:{responsiveThird:!0,zoom:16,interactive:!0,scale:1.5}}),s(e,"hudRenderer","OpenpilotHudRenderer"),window.OpenpilotTheme=e})();
|
||||
-101
@@ -1,101 +0,0 @@
|
||||
/**
|
||||
* Tile Cache Service Worker
|
||||
* Caches map tiles from OpenFreeMap for offline use
|
||||
*/
|
||||
|
||||
const CACHE_NAME = 'dashy-map-tiles-v1';
|
||||
const TILE_HOSTS = ['tiles.openfreemap.org'];
|
||||
const MAX_CACHE_SIZE = 2000; // Max tiles to cache
|
||||
const TRIM_INTERVAL = 60000; // Only trim cache every 60 seconds
|
||||
|
||||
// Debug mode - can be set via message from main thread
|
||||
let _debug = false;
|
||||
let _lastTrimTime = 0;
|
||||
|
||||
function debugLog(...args) {
|
||||
if (_debug) console.log(...args);
|
||||
}
|
||||
|
||||
// Listen for debug toggle from main thread
|
||||
self.addEventListener('message', (event) => {
|
||||
if (event.data && event.data.type === 'SET_DEBUG') {
|
||||
_debug = event.data.value;
|
||||
}
|
||||
});
|
||||
|
||||
self.addEventListener('install', (event) => {
|
||||
self.skipWaiting();
|
||||
});
|
||||
|
||||
self.addEventListener('activate', (event) => {
|
||||
event.waitUntil(
|
||||
caches.keys().then((cacheNames) => {
|
||||
return Promise.all(
|
||||
cacheNames.map((cacheName) => {
|
||||
if (cacheName.startsWith('dashy-map-tiles-') && cacheName !== CACHE_NAME) {
|
||||
debugLog('[TileCache SW] Deleting old cache:', cacheName);
|
||||
return caches.delete(cacheName);
|
||||
}
|
||||
})
|
||||
);
|
||||
})
|
||||
);
|
||||
self.clients.claim();
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', (event) => {
|
||||
const url = new URL(event.request.url);
|
||||
|
||||
// Only cache tile requests from OpenFreeMap
|
||||
const isTileRequest = TILE_HOSTS.some(host => url.hostname.includes(host));
|
||||
if (!isTileRequest) return;
|
||||
|
||||
event.respondWith(
|
||||
caches.open(CACHE_NAME).then((cache) => {
|
||||
return cache.match(event.request).then((cachedResponse) => {
|
||||
if (cachedResponse) {
|
||||
// Return cached, but also update cache in background
|
||||
fetchAndCache(event.request, cache);
|
||||
return cachedResponse;
|
||||
}
|
||||
|
||||
return fetchAndCache(event.request, cache);
|
||||
});
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
async function fetchAndCache(request, cache) {
|
||||
try {
|
||||
const networkResponse = await fetch(request);
|
||||
if (networkResponse.ok) {
|
||||
cache.put(request, networkResponse.clone());
|
||||
trimCache(cache);
|
||||
}
|
||||
return networkResponse;
|
||||
} catch (e) {
|
||||
// Return cached version if offline
|
||||
const cached = await cache.match(request);
|
||||
if (cached) return cached;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
async function trimCache(cache) {
|
||||
// Only trim every TRIM_INTERVAL to avoid constant overhead
|
||||
const now = Date.now();
|
||||
if (now - _lastTrimTime < TRIM_INTERVAL) {
|
||||
return;
|
||||
}
|
||||
_lastTrimTime = now;
|
||||
|
||||
const keys = await cache.keys();
|
||||
if (keys.length > MAX_CACHE_SIZE) {
|
||||
// Delete oldest entries
|
||||
const toDelete = keys.slice(0, keys.length - MAX_CACHE_SIZE);
|
||||
for (const key of toDelete) {
|
||||
await cache.delete(key);
|
||||
}
|
||||
debugLog('[TileCache SW] Trimmed', toDelete.length, 'old tiles');
|
||||
}
|
||||
}
|
||||
@@ -1,463 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Copyright (c) 2026, Rick Lan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, and/or sublicense,
|
||||
for non-commercial purposes only, subject to the following conditions:
|
||||
|
||||
- The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
- Commercial use (e.g. use in a product, service, or activity intended to
|
||||
generate revenue) is prohibited without explicit written permission from
|
||||
the copyright holder.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
GPS Location Service - Fuses GPS with livePose for smooth position output.
|
||||
|
||||
States:
|
||||
INITIALIZING: Waiting for first GPS fix
|
||||
CALIBRATING: Collecting yaw offset samples (need to be moving > 5 m/s)
|
||||
RUNNING: Outputting calibrated dead-reckoned position
|
||||
RECALIBRATING: Drift detected, blending back to GPS
|
||||
"""
|
||||
import json
|
||||
import numpy as np
|
||||
from enum import Enum
|
||||
|
||||
import cereal.messaging as messaging
|
||||
from openpilot.common.params import Params
|
||||
from openpilot.common.realtime import config_realtime_process
|
||||
from openpilot.common.transformations.coordinates import geodetic2ecef, ecef2geodetic, LocalCoord
|
||||
from openpilot.common.swaglog import cloudlog
|
||||
from openpilot.common.gps import get_gps_location_service
|
||||
|
||||
|
||||
class State(Enum):
|
||||
INITIALIZING = 0
|
||||
CALIBRATING = 1
|
||||
RUNNING = 2
|
||||
RECALIBRATING = 3
|
||||
|
||||
|
||||
class LiveGPS:
|
||||
# Calibration
|
||||
CALIB_MIN_SPEED = 5.0 # m/s - need speed for reliable GPS bearing
|
||||
CALIB_MIN_SAMPLES = 5 # yaw samples needed
|
||||
CALIB_MAX_TIME = 30.0 # seconds before timeout
|
||||
|
||||
# Recalibration triggers
|
||||
RECALIB_POS_ERROR = 30.0 # meters - triggers gradual recalib
|
||||
RECALIB_POS_HARD = 500.0 # meters - triggers hard reset
|
||||
RECALIB_YAW_ERROR = 0.785 # 45 degrees in radians
|
||||
RECALIB_YAW_HARD = 1.571 # 90 degrees in radians
|
||||
RECALIB_GPS_LOST = 10.0 # seconds
|
||||
|
||||
# GPS quality
|
||||
GPS_MAX_ACCURACY = 30.0 # meters - reject worse
|
||||
GPS_MAX_JUMP = 50.0 # meters - reject jumps
|
||||
GPS_MAX_SPEED = 100.0 # m/s (~360 km/h)
|
||||
|
||||
# Smoothing
|
||||
MAX_POS_CORRECTION = 10.0 # m/s max correction rate
|
||||
MAX_YAW_CORRECTION = 0.524 # 30 deg/s in radians
|
||||
STATIONARY_SPEED = 0.5 # m/s
|
||||
|
||||
def __init__(self):
|
||||
self.state = State.INITIALIZING
|
||||
|
||||
# GPS raw data
|
||||
self.last_gps_pos = None # [lat, lon, alt]
|
||||
self.gps_speed = 0.0
|
||||
self.gps_bearing = 0.0
|
||||
self.gps_accuracy_h = 100.0
|
||||
self.gps_accuracy_v = 100.0
|
||||
self.gps_quality = 1.0 # 0-1 weight
|
||||
self.unix_timestamp_millis = 0
|
||||
|
||||
# Position tracking (NED frame)
|
||||
self.local_coord = None
|
||||
self.pos_ned = np.zeros(3)
|
||||
self.pos_error = np.zeros(3)
|
||||
self.target_pos = np.zeros(3)
|
||||
|
||||
# livePose data
|
||||
self.orientation_ned = np.zeros(3)
|
||||
self.vel_device = np.zeros(3)
|
||||
|
||||
# Yaw calibration
|
||||
self.yaw_offset = 0.0
|
||||
self.yaw_offset_valid = False
|
||||
self.yaw_samples = []
|
||||
self.target_yaw = 0.0
|
||||
|
||||
# Timing
|
||||
self.last_t = None
|
||||
self.last_gps_t = 0.0
|
||||
self.calib_start_t = 0.0
|
||||
|
||||
def get_yaw(self):
|
||||
"""Get calibrated absolute yaw."""
|
||||
if self.yaw_offset_valid:
|
||||
return (self.orientation_ned[2] + self.yaw_offset) % (2 * np.pi)
|
||||
return np.radians(self.gps_bearing)
|
||||
|
||||
def _check_gps_valid(self, gps):
|
||||
"""Check if GPS data is usable."""
|
||||
if abs(gps.latitude) < 0.1 or abs(gps.longitude) < 0.1:
|
||||
return False
|
||||
if abs(gps.latitude) > 90 or abs(gps.longitude) > 180:
|
||||
return False
|
||||
return gps.hasFix or gps.unixTimestampMillis > 0
|
||||
|
||||
def _check_gps_quality(self, t, gps):
|
||||
"""Check quality and detect jumps. Returns (accept, weight)."""
|
||||
# Unknown accuracy = assume decent
|
||||
accuracy = gps.horizontalAccuracy if gps.horizontalAccuracy > 0 else 8.0
|
||||
|
||||
# Reject known bad accuracy
|
||||
if gps.horizontalAccuracy > self.GPS_MAX_ACCURACY:
|
||||
return False, 0.0
|
||||
|
||||
# Jump detection
|
||||
if self.last_gps_pos is not None and self.last_gps_t > 0:
|
||||
dt = t - self.last_gps_t
|
||||
if dt > 0.01:
|
||||
last_ecef = geodetic2ecef(self.last_gps_pos)
|
||||
curr_ecef = geodetic2ecef([gps.latitude, gps.longitude, gps.altitude])
|
||||
distance = np.linalg.norm(np.array(curr_ecef) - np.array(last_ecef))
|
||||
if distance > max(self.GPS_MAX_JUMP, self.GPS_MAX_SPEED * dt):
|
||||
return False, 0.0
|
||||
|
||||
# Weight by accuracy (5m = 1.0, 30m = 0.17)
|
||||
weight = min(1.0, 5.0 / max(accuracy, 1.0))
|
||||
return True, max(0.1, weight)
|
||||
|
||||
def handle_gps(self, t, gps):
|
||||
"""Process GPS update."""
|
||||
if not self._check_gps_valid(gps):
|
||||
return
|
||||
|
||||
accept, weight = self._check_gps_quality(t, gps)
|
||||
|
||||
# Always store for display (even if rejected)
|
||||
self.last_gps_pos = [gps.latitude, gps.longitude, gps.altitude]
|
||||
self.gps_speed = gps.speed
|
||||
self.gps_bearing = gps.bearingDeg
|
||||
|
||||
if not accept:
|
||||
# Allow poor GPS for initialization only
|
||||
if self.state == State.INITIALIZING:
|
||||
weight = 0.1
|
||||
else:
|
||||
return
|
||||
|
||||
# Store quality data
|
||||
self.gps_accuracy_h = gps.horizontalAccuracy if gps.horizontalAccuracy > 0 else 10.0
|
||||
self.gps_accuracy_v = gps.verticalAccuracy if gps.verticalAccuracy > 0 else 20.0
|
||||
self.gps_quality = weight
|
||||
self.last_gps_t = t
|
||||
self.unix_timestamp_millis = gps.unixTimestampMillis
|
||||
|
||||
# State machine
|
||||
if self.state == State.INITIALIZING:
|
||||
self._init_position(gps)
|
||||
self.state = State.CALIBRATING
|
||||
self.calib_start_t = t
|
||||
self.yaw_samples = []
|
||||
cloudlog.info("LiveGPS: GPS acquired, calibrating")
|
||||
|
||||
elif self.state == State.CALIBRATING:
|
||||
self._calibrate(t, gps)
|
||||
|
||||
elif self.state == State.RUNNING:
|
||||
self._update_running(t, gps)
|
||||
|
||||
elif self.state == State.RECALIBRATING:
|
||||
self._recalibrate(t, gps)
|
||||
|
||||
def _init_position(self, gps):
|
||||
"""Initialize local coordinate frame."""
|
||||
self.local_coord = LocalCoord.from_geodetic([gps.latitude, gps.longitude, gps.altitude])
|
||||
self.pos_ned = np.zeros(3)
|
||||
self.pos_error = np.zeros(3)
|
||||
|
||||
def _collect_yaw_sample(self, gps):
|
||||
"""Collect yaw calibration sample if conditions met."""
|
||||
if gps.speed > self.CALIB_MIN_SPEED and self.gps_quality > 0.3:
|
||||
gps_yaw = np.radians(gps.bearingDeg)
|
||||
pose_yaw = self.orientation_ned[2]
|
||||
offset = np.arctan2(np.sin(gps_yaw - pose_yaw), np.cos(gps_yaw - pose_yaw))
|
||||
self.yaw_samples.append(offset)
|
||||
|
||||
def _calibrate(self, t, gps):
|
||||
"""Calibration state: collect yaw samples."""
|
||||
self._collect_yaw_sample(gps)
|
||||
|
||||
if len(self.yaw_samples) >= self.CALIB_MIN_SAMPLES:
|
||||
self.yaw_offset = float(np.median(self.yaw_samples))
|
||||
self.yaw_offset_valid = True
|
||||
self._init_position(gps)
|
||||
self.state = State.RUNNING
|
||||
cloudlog.info(f"LiveGPS: calibrated, yaw_offset={np.degrees(self.yaw_offset):.1f}deg")
|
||||
|
||||
elif t - self.calib_start_t > self.CALIB_MAX_TIME:
|
||||
if self.yaw_samples:
|
||||
self.yaw_offset = float(np.median(self.yaw_samples))
|
||||
self.yaw_offset_valid = True
|
||||
self._init_position(gps)
|
||||
self.state = State.RUNNING
|
||||
cloudlog.warning("LiveGPS: calibration timeout")
|
||||
|
||||
def _update_running(self, t, gps):
|
||||
"""Running state: update position error and check for drift."""
|
||||
gps_ecef = geodetic2ecef([gps.latitude, gps.longitude, gps.altitude])
|
||||
gps_ned = self.local_coord.ecef2ned(gps_ecef)
|
||||
self.pos_error = gps_ned - self.pos_ned
|
||||
|
||||
pos_error_mag = np.linalg.norm(self.pos_error[:2])
|
||||
gps_age = t - self.last_gps_t
|
||||
|
||||
# Check for hard reset conditions
|
||||
if pos_error_mag > self.RECALIB_POS_HARD or gps_age > self.RECALIB_GPS_LOST * 3:
|
||||
cloudlog.warning(f"LiveGPS: hard reset, error={pos_error_mag:.1f}m")
|
||||
self._init_position(gps)
|
||||
self.yaw_offset_valid = False
|
||||
self.state = State.CALIBRATING
|
||||
self.calib_start_t = t
|
||||
self.yaw_samples = []
|
||||
return
|
||||
|
||||
# Check yaw drift
|
||||
if gps.speed > self.CALIB_MIN_SPEED and self.gps_quality > 0.3:
|
||||
gps_yaw = np.radians(gps.bearingDeg)
|
||||
new_offset = np.arctan2(np.sin(gps_yaw - self.orientation_ned[2]),
|
||||
np.cos(gps_yaw - self.orientation_ned[2]))
|
||||
diff = abs(np.arctan2(np.sin(new_offset - self.yaw_offset),
|
||||
np.cos(new_offset - self.yaw_offset)))
|
||||
|
||||
if diff > self.RECALIB_YAW_HARD:
|
||||
cloudlog.warning(f"LiveGPS: yaw reset, diff={np.degrees(diff):.1f}deg")
|
||||
self.yaw_offset = new_offset
|
||||
self._init_position(gps)
|
||||
elif diff > self.RECALIB_YAW_ERROR:
|
||||
cloudlog.warning(f"LiveGPS: yaw drift, diff={np.degrees(diff):.1f}deg")
|
||||
self.state = State.RECALIBRATING
|
||||
self.calib_start_t = t
|
||||
self.yaw_samples = []
|
||||
self.target_yaw = new_offset
|
||||
self.target_pos = gps_ned
|
||||
else:
|
||||
# Slow adaptation
|
||||
alpha = 0.1 * self.gps_quality
|
||||
self.yaw_offset += alpha * np.arctan2(np.sin(new_offset - self.yaw_offset),
|
||||
np.cos(new_offset - self.yaw_offset))
|
||||
|
||||
# Check position drift
|
||||
if pos_error_mag > self.RECALIB_POS_ERROR:
|
||||
cloudlog.warning(f"LiveGPS: pos drift, error={pos_error_mag:.1f}m")
|
||||
self.state = State.RECALIBRATING
|
||||
self.calib_start_t = t
|
||||
self.yaw_samples = []
|
||||
self.target_pos = gps_ned
|
||||
|
||||
# Reset anchor if drifted too far
|
||||
if np.linalg.norm(self.pos_ned[:2]) > 100:
|
||||
self._init_position(gps)
|
||||
|
||||
def _recalibrate(self, t, gps):
|
||||
"""Recalibrating state: blend back to GPS."""
|
||||
gps_ecef = geodetic2ecef([gps.latitude, gps.longitude, gps.altitude])
|
||||
self.target_pos = self.local_coord.ecef2ned(gps_ecef)
|
||||
|
||||
self._collect_yaw_sample(gps)
|
||||
if len(self.yaw_samples) >= 3:
|
||||
self.target_yaw = float(np.median(self.yaw_samples[-10:]))
|
||||
|
||||
# Check if done
|
||||
pos_error = np.linalg.norm(self.target_pos - self.pos_ned)
|
||||
if pos_error < 5.0 and len(self.yaw_samples) >= self.CALIB_MIN_SAMPLES:
|
||||
self.yaw_offset = self.target_yaw
|
||||
self.state = State.RUNNING
|
||||
cloudlog.info(f"LiveGPS: recalibrated, error={pos_error:.1f}m")
|
||||
elif t - self.calib_start_t > self.CALIB_MAX_TIME:
|
||||
if self.yaw_samples:
|
||||
self.yaw_offset = float(np.median(self.yaw_samples))
|
||||
self.state = State.RUNNING
|
||||
cloudlog.warning(f"LiveGPS: recalib timeout, error={pos_error:.1f}m")
|
||||
|
||||
def handle_pose(self, t, pose):
|
||||
"""Process livePose update - dead-reckon position."""
|
||||
if pose.orientationNED.valid:
|
||||
self.orientation_ned = np.array([pose.orientationNED.x, pose.orientationNED.y, pose.orientationNED.z])
|
||||
if pose.velocityDevice.valid:
|
||||
self.vel_device = np.array([pose.velocityDevice.x, pose.velocityDevice.y, pose.velocityDevice.z])
|
||||
|
||||
if self.state not in (State.RUNNING, State.RECALIBRATING) or self.local_coord is None:
|
||||
self.last_t = t
|
||||
return
|
||||
|
||||
if self.last_t is None:
|
||||
self.last_t = t
|
||||
return
|
||||
|
||||
dt = t - self.last_t
|
||||
if dt <= 0 or dt > 1.0:
|
||||
self.last_t = t
|
||||
return
|
||||
|
||||
# Stationary detection
|
||||
speed = np.linalg.norm(self.vel_device[:2])
|
||||
is_stationary = speed < self.STATIONARY_SPEED and self.gps_speed < self.STATIONARY_SPEED
|
||||
|
||||
# Yaw blending during recalibration
|
||||
if self.state == State.RECALIBRATING and self.yaw_samples:
|
||||
yaw_diff = np.arctan2(np.sin(self.target_yaw - self.yaw_offset),
|
||||
np.cos(self.target_yaw - self.yaw_offset))
|
||||
yaw_rate = 0.9 if abs(yaw_diff) > 0.5 else 0.5
|
||||
correction = np.clip(yaw_rate * dt * yaw_diff, -self.MAX_YAW_CORRECTION * dt, self.MAX_YAW_CORRECTION * dt)
|
||||
self.yaw_offset += correction
|
||||
|
||||
# Transform velocity to NED
|
||||
yaw = self.get_yaw()
|
||||
cos_yaw, sin_yaw = np.cos(yaw), np.sin(yaw)
|
||||
vel_ned = np.array([
|
||||
cos_yaw * self.vel_device[0] - sin_yaw * self.vel_device[1],
|
||||
sin_yaw * self.vel_device[0] + cos_yaw * self.vel_device[1],
|
||||
self.vel_device[2]
|
||||
])
|
||||
|
||||
# Integrate position (skip if stationary)
|
||||
if not is_stationary:
|
||||
self.pos_ned += vel_ned * dt
|
||||
|
||||
# Position correction
|
||||
if is_stationary:
|
||||
correction = self.pos_error * 0.05 * dt
|
||||
elif self.state == State.RECALIBRATING:
|
||||
error = self.target_pos - self.pos_ned
|
||||
rate = 0.95 if np.linalg.norm(error[:2]) > 50 else 0.4
|
||||
correction = error * rate * self.gps_quality * dt
|
||||
else:
|
||||
correction = self.pos_error * 0.8 * self.gps_quality * dt
|
||||
|
||||
# Cap correction
|
||||
mag = np.linalg.norm(correction[:2])
|
||||
max_corr = self.MAX_POS_CORRECTION * dt
|
||||
if mag > max_corr:
|
||||
correction *= max_corr / mag
|
||||
|
||||
self.pos_ned += correction
|
||||
if self.state == State.RUNNING:
|
||||
self.pos_error -= correction
|
||||
|
||||
self.last_t = t
|
||||
|
||||
def get_msg(self, log_mono_time):
|
||||
"""Build liveGPS message."""
|
||||
msg = messaging.new_message('liveGPS')
|
||||
msg.logMonoTime = log_mono_time
|
||||
gps = msg.liveGPS
|
||||
|
||||
t = log_mono_time * 1e-9
|
||||
gps_age = t - self.last_gps_t
|
||||
is_valid = self.state in (State.RUNNING, State.RECALIBRATING)
|
||||
gps_ok = is_valid and gps_age < 5.0
|
||||
|
||||
if is_valid and self.local_coord is not None:
|
||||
pos_ecef = self.local_coord.ned2ecef(self.pos_ned)
|
||||
geodetic = ecef2geodetic(pos_ecef)
|
||||
gps.latitude = float(geodetic[0])
|
||||
gps.longitude = float(geodetic[1])
|
||||
gps.altitude = float(geodetic[2])
|
||||
gps.bearingDeg = float(np.degrees(self.get_yaw()) % 360)
|
||||
gps.speed = float(np.linalg.norm(self.vel_device[:2]))
|
||||
gps.horizontalAccuracy = float(self.gps_accuracy_h + np.linalg.norm(self.pos_ned[:2]) * 0.1)
|
||||
gps.verticalAccuracy = float(self.gps_accuracy_v)
|
||||
gps.status = 'valid' if gps_ok else ('recalibrating' if self.state == State.RECALIBRATING else 'gpsStale')
|
||||
|
||||
elif self.last_gps_pos is not None:
|
||||
gps.latitude = float(self.last_gps_pos[0])
|
||||
gps.longitude = float(self.last_gps_pos[1])
|
||||
gps.altitude = float(self.last_gps_pos[2])
|
||||
gps.speed = float(self.gps_speed)
|
||||
gps.bearingDeg = float(self.gps_bearing)
|
||||
gps.horizontalAccuracy = float(self.gps_accuracy_h) if self.gps_accuracy_h > 0 else 50.0
|
||||
gps.verticalAccuracy = float(self.gps_accuracy_v) if self.gps_accuracy_v > 0 else 50.0
|
||||
gps.status = 'calibrating' if self.state == State.CALIBRATING else 'initializing'
|
||||
|
||||
else:
|
||||
gps.latitude = 0.0
|
||||
gps.longitude = 0.0
|
||||
gps.altitude = 0.0
|
||||
gps.speed = 0.0
|
||||
gps.bearingDeg = 0.0
|
||||
gps.horizontalAccuracy = 100.0
|
||||
gps.verticalAccuracy = 100.0
|
||||
gps.status = 'noGps'
|
||||
|
||||
gps.gpsOK = gps_ok
|
||||
gps.unixTimestampMillis = self.unix_timestamp_millis
|
||||
gps.lastGpsTimestamp = int(self.last_gps_t * 1e9) if self.last_gps_t > 0 else 0
|
||||
|
||||
return msg
|
||||
|
||||
|
||||
def main():
|
||||
config_realtime_process([0, 1, 2, 3], 5)
|
||||
|
||||
params = Params()
|
||||
gps_service = get_gps_location_service(params)
|
||||
cloudlog.info(f"LiveGPS: using {gps_service}")
|
||||
|
||||
pm = messaging.PubMaster(['liveGPS'])
|
||||
sm = messaging.SubMaster([gps_service, 'livePose'], poll='livePose', ignore_alive=[gps_service])
|
||||
|
||||
gps = LiveGPS()
|
||||
|
||||
# Load last GPS position or default to Taipei 101
|
||||
try:
|
||||
last_pos = params.get("LastGPSPosition")
|
||||
if last_pos:
|
||||
pos_data = json.loads(last_pos)
|
||||
gps.last_gps_pos = [pos_data['latitude'], pos_data['longitude'], pos_data['altitude']]
|
||||
cloudlog.info(f"LiveGPS: loaded last position: {gps.last_gps_pos}")
|
||||
else:
|
||||
raise ValueError("No saved position")
|
||||
except Exception:
|
||||
gps.last_gps_pos = [25.033976, 121.564472, 10.0] # Taipei 101
|
||||
cloudlog.info("LiveGPS: using default position (Taipei 101)")
|
||||
|
||||
while True:
|
||||
sm.update()
|
||||
|
||||
if sm.updated[gps_service] and sm.valid[gps_service]:
|
||||
gps.handle_gps(sm.logMonoTime[gps_service] * 1e-9, sm[gps_service])
|
||||
|
||||
if sm.updated['livePose']:
|
||||
if sm.valid['livePose']:
|
||||
gps.handle_pose(sm.logMonoTime['livePose'] * 1e-9, sm['livePose'])
|
||||
|
||||
msg = gps.get_msg(sm.logMonoTime['livePose'])
|
||||
pm.send('liveGPS', msg)
|
||||
|
||||
# Save position periodically
|
||||
if sm.frame % 1200 == 0 and gps.state == State.RUNNING and gps.last_gps_pos:
|
||||
if (sm.logMonoTime['livePose'] * 1e-9 - gps.last_gps_t) < 5.0:
|
||||
params.put("LastGPSPosition", json.dumps({
|
||||
'latitude': gps.last_gps_pos[0],
|
||||
'longitude': gps.last_gps_pos[1],
|
||||
'altitude': gps.last_gps_pos[2]
|
||||
}))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
+1
-15
@@ -1,7 +1,4 @@
|
||||
try:
|
||||
from dragonpilot.system.ui.lib.multilang import tr
|
||||
except:
|
||||
from openpilot.system.ui.lib.multilang import tr
|
||||
from dragonpilot.system.ui.lib.multilang import tr
|
||||
|
||||
SETTINGS = [
|
||||
{
|
||||
@@ -111,17 +108,6 @@ SETTINGS = [
|
||||
"title": lambda: tr("Road Edge Detection (RED)"),
|
||||
"description": lambda: tr("Block lane change assist when the system detects the road edge.<br>NOTE: This will show 'Car Detected in Blindspot' warning."),
|
||||
},
|
||||
{
|
||||
"key": "dp_lat_offset_cm",
|
||||
"type": "spin_button_item",
|
||||
"title": lambda: tr("Position Offset"),
|
||||
"description": lambda: tr("Fine-tune where the car drives within the lane. Positive values move the car left, negative values move right.<br>Recommended to start with small values (±5cm) and adjust based on preference."),
|
||||
"default": 0,
|
||||
"min_val": -15,
|
||||
"max_val": 15,
|
||||
"step": 1,
|
||||
"suffix": lambda: tr("cm"),
|
||||
},
|
||||
|
||||
],
|
||||
},
|
||||
|
||||
@@ -91,8 +91,6 @@ class Bus(StrEnum):
|
||||
party = auto()
|
||||
ap_party = auto()
|
||||
|
||||
sdsu = auto()
|
||||
|
||||
zss = auto()
|
||||
|
||||
def rate_limit(new_value, last_value, dw_step, up_step):
|
||||
|
||||
@@ -48,8 +48,6 @@ class CarState(CarStateBase):
|
||||
# When available we use cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] to populate vEgoCluster
|
||||
# However, on cars without a digital speedometer this is not always present (HRV, FIT, CRV 2016, ILX and RDX)
|
||||
self.dash_speed_seen = False
|
||||
self.is_metric = False
|
||||
self.v_cruise_factor = 1.
|
||||
|
||||
def update(self, can_parsers) -> structs.CarState:
|
||||
cp = can_parsers[Bus.pt]
|
||||
@@ -70,7 +68,7 @@ class CarState(CarStateBase):
|
||||
self.cruise_buttons = cp.vl["SCM_BUTTONS"]["CRUISE_BUTTONS"]
|
||||
|
||||
# used for car hud message
|
||||
self.is_metric = True if self.CP.carFingerprint in (CAR.HONDA_ODYSSEY_TWN) else not cp.vl["CAR_SPEED"]["IMPERIAL_UNIT"]
|
||||
self.is_metric = not cp.vl["CAR_SPEED"]["IMPERIAL_UNIT"]
|
||||
self.v_cruise_factor = CV.MPH_TO_MS if self.dynamic_v_cruise_units and not self.is_metric else CV.KPH_TO_MS
|
||||
|
||||
# ******************* parse out can *******************
|
||||
@@ -129,11 +127,10 @@ class CarState(CarStateBase):
|
||||
|
||||
ret.espDisabled = cp.vl["VSA_STATUS"]["ESP_DISABLED"] != 0
|
||||
|
||||
if self.CP.carFingerprint not in (CAR.HONDA_ODYSSEY_TWN):
|
||||
self.dash_speed_seen = self.dash_speed_seen or cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] > 1e-3
|
||||
if self.dash_speed_seen:
|
||||
conversion = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS
|
||||
ret.vEgoCluster = cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] * conversion
|
||||
self.dash_speed_seen = self.dash_speed_seen or cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] > 1e-3
|
||||
if self.dash_speed_seen:
|
||||
conversion = CV.KPH_TO_MS if self.is_metric else CV.MPH_TO_MS
|
||||
ret.vEgoCluster = cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] * conversion
|
||||
|
||||
ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE"]
|
||||
ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEER_ANGLE_RATE"]
|
||||
|
||||
@@ -577,17 +577,6 @@ FW_VERSIONS = {
|
||||
b'54008-THR-A020\x00\x00',
|
||||
],
|
||||
},
|
||||
CAR.HONDA_ODYSSEY_TWN: {
|
||||
(Ecu.eps, 0x18da30f1, None): [
|
||||
b'39990-T6A-J210\x00\x00',
|
||||
],
|
||||
(Ecu.srs, 0x18da53f1, None): [
|
||||
b'77959-T6A-P110\x00\x00',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x18dab0f1, None): [
|
||||
b'36161-T6A-P040\x00\x00',
|
||||
],
|
||||
},
|
||||
CAR.HONDA_ODYSSEY_5G_MMR: {
|
||||
(Ecu.vsa, 0x18da28f1, None): [
|
||||
b'57114-THR-A240\x00\x00',
|
||||
|
||||
@@ -163,10 +163,6 @@ class CarInterface(CarInterfaceBase):
|
||||
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]]
|
||||
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]]
|
||||
|
||||
elif candidate == CAR.HONDA_ODYSSEY_TWN:
|
||||
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]]
|
||||
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 32767], [0, 32767]] # TODO: determine if there is a dead zone at the top end
|
||||
|
||||
elif candidate in (CAR.HONDA_HRV, CAR.HONDA_HRV_3G):
|
||||
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]]
|
||||
if candidate == CAR.HONDA_HRV:
|
||||
@@ -239,7 +235,7 @@ class CarInterface(CarInterfaceBase):
|
||||
# to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not
|
||||
# conflict with PCM acc
|
||||
ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.HONDA_CIVIC})
|
||||
ret.minEnableSpeed = -1. #if ret.autoResumeSng else 25.51 * CV.MPH_TO_MS
|
||||
ret.minEnableSpeed = -1. if ret.autoResumeSng else 25.51 * CV.MPH_TO_MS
|
||||
|
||||
ret.steerLimitTimer = 0.8
|
||||
ret.radarDelay = 0.1
|
||||
|
||||
@@ -324,12 +324,6 @@ class CAR(Platforms):
|
||||
radar_dbc_dict('honda_odyssey_exl_2018_generated'),
|
||||
flags=HondaFlags.NIDEC_ALT_PCM_ACCEL | HondaFlags.HAS_ALL_DOOR_STATES,
|
||||
)
|
||||
HONDA_ODYSSEY_TWN = HondaNidecPlatformConfig(
|
||||
[],
|
||||
CarSpecs(mass=1865, wheelbase=2.9, steerRatio=14.35, centerToFrontRatio=0.44, tireStiffnessFactor=0.82),
|
||||
radar_dbc_dict('honda_odyssey_twn_2018_generated'),
|
||||
flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES,
|
||||
)
|
||||
ACURA_RDX = HondaNidecPlatformConfig(
|
||||
[HondaCarDocs("Acura RDX 2016-18", "AcuraWatch Plus or Advance Package", min_steer_speed=12. * CV.MPH_TO_MS)],
|
||||
CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38, tireStiffnessFactor=0.444), # as spec
|
||||
|
||||
@@ -51,7 +51,6 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
|
||||
"HONDA_CRV_EU" = "HONDA_CRV"
|
||||
"HONDA_CIVIC_BOSCH_DIESEL" = "HONDA_CIVIC_BOSCH"
|
||||
"HONDA_E" = "HONDA_CIVIC_BOSCH"
|
||||
"HONDA_ODYSSEY_TWN" = "HONDA_ODYSSEY"
|
||||
|
||||
"BUICK_LACROSSE" = "CHEVROLET_VOLT"
|
||||
"BUICK_REGAL" = "CHEVROLET_VOLT"
|
||||
|
||||
@@ -58,9 +58,6 @@ class CarState(CarStateBase):
|
||||
# depends on the firmware, we should be able to read most CAN directly from cp (not cp_cam, its empty)
|
||||
self.dp_radar_filter = bool(self.CP.flags & ToyotaFlags.RADAR_FILTER.value)
|
||||
|
||||
from opendbc.car.toyota.sdsu import SDSU
|
||||
self.sdsu = SDSU(CP.flags)
|
||||
|
||||
# rick - dsu_bypass from cydia2020: https://github.com/cydia2020/toyota-dsu-reroute-harness/
|
||||
# the idea is to "re-route" the DSU to Panda CAN2 (Which connects to ADAS Camera)
|
||||
# * when comma device is not available, the DSU message can still communicate with ADAS Camera, and over to car.
|
||||
@@ -217,15 +214,7 @@ class CarState(CarStateBase):
|
||||
buttonEvents.extend(create_button_events(1, 0, {1: ButtonType.lkas}) +
|
||||
create_button_events(0, 1, {1: ButtonType.lkas}))
|
||||
|
||||
if self.sdsu.enabled:
|
||||
# The follow distance button signal as forwarded by the sdsu
|
||||
self.sdsu.update_states(can_parsers[Bus.sdsu])
|
||||
prev_distance_button = self.distance_button
|
||||
self.distance_button = self.sdsu.dist_btn
|
||||
|
||||
buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
|
||||
|
||||
elif self.CP.carFingerprint not in (RADAR_ACC_CAR | SECOC_CAR):
|
||||
if self.CP.carFingerprint not in (RADAR_ACC_CAR | SECOC_CAR):
|
||||
# distance button is wired to the ACC module (camera or radar)
|
||||
prev_distance_button = self.distance_button
|
||||
self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"]
|
||||
@@ -250,9 +239,6 @@ class CarState(CarStateBase):
|
||||
Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
|
||||
}
|
||||
|
||||
if CP.flags & ToyotaFlags.SDSU:
|
||||
parsers[Bus.sdsu] = CANParser("toyota_sdsu", [("SDSU", 100)], 0)
|
||||
|
||||
if CP.flags & ToyotaFlags.ZSS:
|
||||
parsers[Bus.zss] = CANParser("toyota_zss", [("SECONDARY_STEER_ANGLE", float('nan'))], 0)
|
||||
|
||||
|
||||
@@ -163,8 +163,8 @@ class CarInterface(CarInterfaceBase):
|
||||
|
||||
ret.openpilotLongitudinalControl = (candidate in (TSS2_CAR - RADAR_ACC_CAR) or
|
||||
bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value) or \
|
||||
dsu_bypass or \
|
||||
sdsu_active)
|
||||
dsu_bypass) or \
|
||||
sdsu_active
|
||||
|
||||
if dp_params & structs.DPFlags.ToyotaStockLon:
|
||||
ret.openpilotLongitudinalControl = False
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
# Copyright (c) 2025, Rick Lan
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sublicense, for non-commercial purposes only, subject to the following conditions:
|
||||
|
||||
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
# Commercial use (e.g. use in a product, service, or activity intended to generate revenue) is prohibited without explicit written permission from the copyright holder.
|
||||
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from opendbc.car.toyota.values import ToyotaFlags
|
||||
from opendbc.can.parser import CANParser
|
||||
|
||||
class SDSU:
|
||||
def __init__(self, flags: int):
|
||||
self.enabled = flags & ToyotaFlags.SDSU.value
|
||||
self.dist_btn = 0
|
||||
|
||||
def update_states(self, cp: CANParser):
|
||||
self.dist_btn = cp.vl["SDSU"]["FD_BUTTON"]
|
||||
@@ -83,6 +83,7 @@ class ToyotaFlags(IntFlag):
|
||||
# these cars are speculated to allow stop and go when the DSU is unplugged
|
||||
SNG_WITHOUT_DSU_DEPRECATED = 512
|
||||
|
||||
ALKA = 2 ** 12
|
||||
LOCK_CTRL = 2 ** 13
|
||||
TSS1_SNG = 2 ** 14
|
||||
RADAR_FILTER = 2 ** 15
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
BO_ 404 STEERING_CONTROL: 4 EON
|
||||
SG_ SET_ME_X00 : 22|7@0+ (1,0) [0|127] "" EPS
|
||||
SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS
|
||||
SG_ COUNTER : 29|2@0+ (1,0) [0|15] "" EPS
|
||||
SG_ CHECKSUM : 27|4@0+ (1,0) [0|3] "" EPS
|
||||
SG_ STEER_TORQUE : 7|16@0- (-1,0) [-32767|32767] "" EPS
|
||||
|
||||
BO_ 399 STEER_STATUS: 7 EPS
|
||||
SG_ STEER_TORQUE_SENSOR : 7|16@0- (-1,0) [-2985|2985] "tbd" EON
|
||||
SG_ STEER_ANGLE_RATE : 23|16@0- (-0.1,0) [-31000|31000] "deg/s" EON
|
||||
SG_ STEER_STATUS : 43|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ STEER_CONTROL_ACTIVE : 35|1@0+ (1,0) [0|1] "" EON
|
||||
SG_ STEER_CONFIG_INDEX : 43|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ CHECKSUM : 51|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ COUNTER : 53|2@0+ (1,0) [0|3] "" EON
|
||||
|
||||
VAL_ 399 STEER_STATUS 7 "permanent_fault" 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_speed_lockout" 2 "no_torque_alert_1" 1 "driver_steering" 0 "normal" ;
|
||||
@@ -1,7 +0,0 @@
|
||||
CM_ "steer_angle_rate is negative vs _steering_sensors_b.dbc";
|
||||
|
||||
BO_ 342 STEERING_SENSORS: 6 EPS
|
||||
SG_ STEER_ANGLE : 7|16@0- (-0.1,0) [-500|500] "deg" EON
|
||||
SG_ STEER_ANGLE_RATE : 23|16@0- (1,0) [-3000|3000] "deg/s" EON
|
||||
SG_ COUNTER : 45|2@0+ (1,0) [0|3] "" EON
|
||||
SG_ CHECKSUM : 43|4@0+ (1,0) [0|15] "" EON
|
||||
@@ -1,7 +0,0 @@
|
||||
CM_ "IMPORT _honda_common.dbc";
|
||||
CM_ "IMPORT _nidec_common.dbc";
|
||||
CM_ "IMPORT _lkas_hud_5byte.dbc";
|
||||
CM_ "IMPORT _nidec_scm_group_a.dbc";
|
||||
CM_ "IMPORT _steering_sensors_c.dbc";
|
||||
CM_ "IMPORT _steering_control_c.dbc";
|
||||
CM_ "IMPORT _gearbox_common.dbc";
|
||||
@@ -1,8 +0,0 @@
|
||||
BO_ 767 SDSU: 8 XXX
|
||||
SG_ FD_BUTTON : 7|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ STATE : 23|4@0+ (1,0) [0|15] "" XXX
|
||||
|
||||
CM_ "BO_ SDSU: The sDSU is a modified DSU for use in TSS-P Toyotas. Learn more: https://github.com/RetroPilot/ocelot/tree/main/firmware/smart_dsu";
|
||||
CM_ SG_ 767 FD_BUTTON "The follow distance button signal as forwarded by the sdsu";
|
||||
|
||||
VAL_ 767 STATE 7 "STATE_AEB_CTRL" 6 "FAULT_INVALID" 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
|
||||
@@ -1877,7 +1877,7 @@ VAL_ 1088 GE1_WK 0 "WK_open" 1 "WK_regulated" 2 "WK_closed" 3 "Failure";
|
||||
VAL_ 1088 GE1_StSt_Info 0 "Engine_running_not_necessary_stop_release" 1 "Motor_start_not_mandatory_necessary_stop_prohibition" 2 "Motor_start_absolute_necessary_start_request" 3 "System_error";
|
||||
VAL_ 1088 GE1_EGS_Anf 0 "no_requirement" 1 "EGS_requirement";
|
||||
VAL_ 1088 GE1_Zielgang 0 "P (Park) | Disengaged" 1 "Gear 1 | Engaged" 2 "Gear 2 | Engaged" 3 "Gear 3 | Engaged" 4 "Gear 4 | Engaged" 5 "Gear 5 | Engaged" 6 "1m Gear" 7 "Gang_R" 8 "Gear 6 | Engaged" 9 "Gear 7 | Engaged" 10 "Gear 8 | Engaged" 14 "Speed Not Defined" 15 "Failure";
|
||||
VAL_ 1088 GE1_Wahl_Pos 8 "P" 7 "R" 6 "N" 5 "D" 9 "U" 12 "S" 14 "T" 10 "T" 11 "T";
|
||||
VAL_ 1088 GE1_Wahl_Pos 0 "Intermediate Position" 1 "Pos_1" 2 "Pos_2" 3 "Pos_3" 4 "Pos_4" 5 "D (Drive)" 6 "Pos_N" 7 "R (Reverse)" 8 "P (Park)" 9 "Tiptronic Override" 10 "Pos_Z1" 11 "Pos_Z2" 12 "S (Sport)" 13 "Pos_L" 14 "Gas Pedal Force Downshift" 15 "Failure";
|
||||
VAL_ 1088 GE1_Notlauf 0 "No Emergency" 1 "No Switching" 2 "Switch to Neutral" 3 "50% Shifting Capacity" 4 "Driving Without UK" 5 "No Emeregency" 6 "No Emergency" 7 "No Emergency, Target Shifting Reached" 15 "Failure";
|
||||
VAL_ 1088 GE1_Kuehlung 0 "No Additional Cooling Requested" 1 "20% Additional Fan Cooling Requested" 2 "40% Additional Fan Cooling Requested" 3 "Maximum Additional Fan Cooling Requested";
|
||||
VAL_ 1088 GE1_Sta_OBD 0 "MIL Off" 1 "MIL On";
|
||||
|
||||
+43
-20
@@ -16,17 +16,22 @@ if [ -z "$RELEASE_BRANCH" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$SOURCE_BRANCH" ]; then
|
||||
echo "SOURCE_BRANCH is not set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# set git identity
|
||||
source $DIR/identity.sh
|
||||
source /data/identity.sh
|
||||
|
||||
echo "[-] Setting up repo T=$SECONDS"
|
||||
rm -rf $BUILD_DIR
|
||||
mkdir -p $BUILD_DIR
|
||||
cd $BUILD_DIR
|
||||
git init
|
||||
git remote add origin git@github.com:commaai/openpilot.git
|
||||
git checkout --orphan $RELEASE_BRANCH
|
||||
git remote add origin https://github.com/dragonpilot/dev.git
|
||||
git checkout --orphan $SOURCE_BRANCH
|
||||
|
||||
# do the files copy
|
||||
echo "[-] copying files T=$SECONDS"
|
||||
@@ -42,19 +47,25 @@ rm -f panda/board/obj/panda_h7.bin.signed
|
||||
VERSION=$(cat common/version.h | awk -F[\"-] '{print $2}')
|
||||
echo "[-] committing version $VERSION T=$SECONDS"
|
||||
git add -f .
|
||||
git commit -a -m "openpilot v$VERSION release"
|
||||
git commit -a -m "dragonpilot v$VERSION release"
|
||||
|
||||
# Build
|
||||
export PYTHONPATH="$BUILD_DIR"
|
||||
scons -j$(nproc) --minimal
|
||||
|
||||
if [ -z "$PANDA_DEBUG_BUILD" ]; then
|
||||
# release panda fw
|
||||
CERT=/data/pandaextra/certs/release RELEASE=1 scons -j$(nproc) panda/
|
||||
else
|
||||
# build with ALLOW_DEBUG=1 to enable features like experimental longitudinal
|
||||
scons -j$(nproc) panda/
|
||||
fi
|
||||
#if [ -z "$PANDA_DEBUG_BUILD" ]; then
|
||||
# # release panda fw
|
||||
# CERT=/data/pandaextra/certs/release RELEASE=1 scons -j$(nproc) panda/
|
||||
#else
|
||||
# # build with ALLOW_DEBUG=1 to enable features like experimental longitudinal
|
||||
# scons -j$(nproc) panda/
|
||||
#fi
|
||||
scons -j$(nproc) panda/
|
||||
|
||||
# panda tici
|
||||
rm -f panda_tici/board/obj/panda.bin.signed
|
||||
rm -f panda_tici/board/obj/panda_h7.bin.signed
|
||||
scons -j$(nproc) panda_tici/
|
||||
|
||||
# Ensure no submodules in release
|
||||
if test "$(git submodule--helper list | wc -l)" -gt "0"; then
|
||||
@@ -85,18 +96,30 @@ git checkout third_party/
|
||||
# Mark as prebuilt release
|
||||
touch prebuilt
|
||||
|
||||
# dragonpilot customized
|
||||
find . -name '*.cc' -delete
|
||||
find selfdrive/ui/ -name '*.h' -delete
|
||||
# rick - some test codes are used in the code
|
||||
# find . -type d -name "tests" -exec rm -rf {} +
|
||||
find . -type d -name 'x86_64' -exec rm -rf {} +
|
||||
find . -type d -name 'Darwin' -exec rm -rf {} +
|
||||
rm -fr tinygrad_repo/docs/tinygrad_intro.pdf # 1.9M
|
||||
rm -fr cereal/gen/cpp/log.capnp.h # 2.5M
|
||||
rm -fr tinygrad_repo/extra/hip_gpu_driver/gc_10_3_0_offset.h # 1.4 M
|
||||
rm -fr tinygrad_repo/extra/accel/tpu/logs/tpu_driver.t1v-n-852cd0d5-w-0.taylor.log.INFO.20210619-062914.26926.gz # 1.3 M
|
||||
|
||||
# Add built files to git
|
||||
git add -f .
|
||||
git commit --amend -m "openpilot v$VERSION"
|
||||
git commit --amend -m "dragonpilot v$VERSION"
|
||||
|
||||
# Run tests
|
||||
cd $BUILD_DIR
|
||||
RELEASE=1 pytest -n0 -s selfdrive/test/test_onroad.py
|
||||
#pytest selfdrive/car/tests/test_car_interfaces.py
|
||||
|
||||
if [ ! -z "$RELEASE_BRANCH" ]; then
|
||||
echo "[-] pushing release T=$SECONDS"
|
||||
git push -f origin $RELEASE_BRANCH:$RELEASE_BRANCH
|
||||
fi
|
||||
#cd $BUILD_DIR
|
||||
#RELEASE=1 pytest -n0 -s selfdrive/test/test_onroad.py
|
||||
##pytest selfdrive/car/tests/test_car_interfaces.py
|
||||
git branch -m $RELEASE_BRANCH
|
||||
#if [ ! -z "$RELEASE_BRANCH" ]; then
|
||||
# echo "[-] pushing release T=$SECONDS"
|
||||
# git push -f origin $RELEASE_BRANCH:$RELEASE_BRANCH
|
||||
#fi
|
||||
|
||||
echo "[-] done T=$SECONDS"
|
||||
|
||||
@@ -48,7 +48,7 @@ MIN_LAT_CONTROL_SPEED = 0.3
|
||||
|
||||
|
||||
def get_action_from_model(model_output: dict[str, np.ndarray], prev_action: log.ModelDataV2.Action,
|
||||
lat_action_t: float, long_action_t: float, v_ego: float, dp_lat_offset_cm: int) -> log.ModelDataV2.Action:
|
||||
lat_action_t: float, long_action_t: float, v_ego: float) -> log.ModelDataV2.Action:
|
||||
plan = model_output['plan'][0]
|
||||
desired_accel, should_stop = get_accel_from_plan(plan[:,Plan.VELOCITY][:,0],
|
||||
plan[:,Plan.ACCELERATION][:,0],
|
||||
@@ -66,12 +66,6 @@ def get_action_from_model(model_output: dict[str, np.ndarray], prev_action: log.
|
||||
else:
|
||||
desired_curvature = prev_action.desiredCurvature
|
||||
|
||||
# Apply lateral offset (driving style adjustment)
|
||||
if dp_lat_offset_cm != 0:
|
||||
lat_offset_m = dp_lat_offset_cm / 100.0
|
||||
curvature_offset = 2.0 * lat_offset_m / 900.0
|
||||
desired_curvature += curvature_offset
|
||||
|
||||
return log.ModelDataV2.Action(desiredCurvature=float(desired_curvature),
|
||||
desiredAcceleration=float(desired_accel),
|
||||
shouldStop=bool(should_stop))
|
||||
@@ -307,8 +301,6 @@ def main(demo=False):
|
||||
dp_dev_is_rhd = params.get_bool("dp_dev_is_rhd")
|
||||
RED = RoadEdgeDetector(params.get_bool("dp_lat_road_edge_detection"))
|
||||
|
||||
dp_lat_offset_cm = int(params.get("dp_lat_offset_cm") or 0)
|
||||
|
||||
while True:
|
||||
# Keep receiving frames until we are at least 1 frame ahead of previous extra frame
|
||||
while meta_main.timestamp_sof < meta_extra.timestamp_sof + 25000000:
|
||||
@@ -393,7 +385,7 @@ def main(demo=False):
|
||||
posenet_send = messaging.new_message('cameraOdometry')
|
||||
model_ext_send = messaging.new_message('modelExt')
|
||||
|
||||
action = get_action_from_model(model_output, prev_action, lat_delay + DT_MDL, long_delay + DT_MDL, v_ego, dp_lat_offset_cm)
|
||||
action = get_action_from_model(model_output, prev_action, lat_delay + DT_MDL, long_delay + DT_MDL, v_ego)
|
||||
prev_action = action
|
||||
fill_model_msg(drivingdata_send, modelv2_send, model_output, action,
|
||||
publish_state, meta_main.frame_id, meta_extra.frame_id, frame_id,
|
||||
|
||||
@@ -35,7 +35,7 @@ class ConfidenceBall(Widget):
|
||||
return
|
||||
|
||||
# animate status dot in from bottom
|
||||
if ui_state.status == UIStatus.DISENGAGED:
|
||||
if ui_state.status == UIStatus.DISENGAGED and not ui_state.dp_alka_active:
|
||||
self._confidence_filter.update(-0.5)
|
||||
else:
|
||||
self._confidence_filter.update((1 - max(ui_state.sm['modelV2'].meta.disengagePredictions.brakeDisengageProbs or [1])) *
|
||||
@@ -54,7 +54,7 @@ class ConfidenceBall(Widget):
|
||||
dot_height = self._rect.y + dot_height
|
||||
|
||||
# confidence zones
|
||||
if ui_state.status == UIStatus.ENGAGED or self._demo:
|
||||
if ui_state.status == UIStatus.ENGAGED or self._demo or ui_state.dp_alka_active:
|
||||
if self._confidence_filter.x > 0.5:
|
||||
top_dot_color = rl.Color(0, 255, 204, 255)
|
||||
bottom_dot_color = rl.Color(0, 255, 38, 255)
|
||||
|
||||
@@ -186,13 +186,13 @@ class TorqueBar(Widget):
|
||||
|
||||
# animate alpha and angle span
|
||||
if not self._demo:
|
||||
self._torque_line_alpha_filter.update(ui_state.status != UIStatus.DISENGAGED)
|
||||
self._torque_line_alpha_filter.update(ui_state.status != UIStatus.DISENGAGED or ui_state.dp_alka_active)
|
||||
else:
|
||||
self._torque_line_alpha_filter.update(1.0)
|
||||
|
||||
torque_line_bg_alpha = np.interp(abs(self._torque_filter.x), [0.5, 1.0], [0.25, 0.5])
|
||||
torque_line_bg_color = rl.Color(255, 255, 255, int(255 * torque_line_bg_alpha * self._torque_line_alpha_filter.x))
|
||||
if ui_state.status != UIStatus.ENGAGED and not self._demo:
|
||||
if ui_state.status != UIStatus.ENGAGED and not self._demo and not ui_state.dp_alka_active:
|
||||
torque_line_bg_color = rl.Color(255, 255, 255, int(255 * 0.15 * self._torque_line_alpha_filter.x))
|
||||
|
||||
# draw curved line polygon torque bar
|
||||
@@ -240,7 +240,7 @@ class TorqueBar(Widget):
|
||||
max(0, abs(self._torque_filter.x) - 0.75) * 4,
|
||||
)
|
||||
|
||||
if ui_state.status != UIStatus.ENGAGED and not self._demo:
|
||||
if ui_state.status != UIStatus.ENGAGED and not self._demo and not ui_state.dp_alka_active:
|
||||
start_color = end_color = rl.Color(255, 255, 255, int(255 * 0.35 * self._torque_line_alpha_filter.x))
|
||||
|
||||
gradient = Gradient(
|
||||
|
||||
@@ -0,0 +1,389 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-26 12:47+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,442 @@
|
||||
# Arabic translations for dragonpilot.
|
||||
# Copyright (C) 2025 dragonpilot
|
||||
# This file is distributed under the same license as the dragonpilot package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dragonpilot\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:30+0800\n"
|
||||
"Last-Translator: dragonpilot\n"
|
||||
"Language-Team: Arabic\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ تغيير المسار تلقائياً بعد:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"وضع الانزلاق التكيفي (ACM) يقلل الفرملة للسماح بانزلاق أكثر سلاسة عند الحاجة."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "الوضع التجريبي التكيفي (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "مبدل الوضع التكيفي بين ACC ومختلط حسب سياق القيادة."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "الكل"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
"السماح لـ openpilot بالالتزام بقواعد المرور اليمنى على مقعد السائق الأيمن."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "مساعد الحفاظ على المسار الدائم (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "هل أنت متأكد من إعادة تعيين جميع إعدادات DP إلى الافتراضية؟"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "التنبيه الصوتي"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "الإيقاف التلقائي بعد"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "تجنب قفل نظام التوجيه الكهربائي"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"منع مساعد تغيير المسار عند اكتشاف النظام لحافة الطريق.<br>ملاحظة: سيظهر "
|
||||
"تحذير 'اكتشاف سيارة في النقطة العمياء'."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"يقوم DTSC بضبط السرعة المتوقعة للمركبة تلقائياً بناءً على انحناء الطريق القادم "
|
||||
"وظروف التماسك.<br>مأخوذ أصلاً من فرع openpilot TACO."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "تأخير تشغيل المسجل لمدة:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"يؤخر بدء تشغيل المسجل والعمليات المرتبطة به عند دخول الجهاز على الطريق."
|
||||
"<br>هذا يمنع تسجيل اللحظات الأولى من الرحلة، مما يحمي خصوصية الموقع في بداية "
|
||||
"الرحلة."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "تعطيل Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"تعطيل خدمة Comma Connect إذا كنت لا ترغب في الرفع / أو تتبعك من قبل الخدمة."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "عرض إحصائيات السيارة الأمامية"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "وضع العرض"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"عرض إحصائيات السيارة الأمامية و/أو نقاط تتبع الرادار.<br>أمامية: إحصائيات "
|
||||
"السيارة الأمامية فقط<br>رادار: إحصائيات نقاط تتبع الرادار فقط<br>الكل: "
|
||||
"إحصائيات السيارة الأمامية والرادار<br>ملاحظة: خيار الرادار يعمل فقط على بعض "
|
||||
"موديلات المركبات."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "قفل/فتح الأبواب تلقائياً"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "التحكم الديناميكي بسرعة الانعطاف (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "تفعيل وضع الانزلاق التكيفي (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "تفعيل الصفارة (تحذير)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "تفعيل وضع القيادة اليمنى"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "تفعيل تعديل TSS1 للتوقف والانطلاق"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"تفعيل التحكم الجانبي حتى عند إيقاف ACC/التثبيت، باستخدام زر ACC Main أو LKAS "
|
||||
"للتبديل. يجب أن تكون المركبة متحركة."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"تمكين openpilot من قفل الأبواب تلقائياً فوق 20 كم/س وفتحها تلقائياً عند "
|
||||
"التحويل إلى وضع الركن."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "إخفاء شاشة العرض عند الحركة فوق:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "مساعد تغيير المسار عند:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "أمامية"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "تعديل MQB A0 للتوقف والانطلاق"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "إيقاف"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "إيقاف = تعطيل تغيير المسار التلقائي."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "إيقاف = تعطيل مساعد تغيير المسار.<br>1 ميل/س = 1.2 كم/س."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "تصحيح توجيه PQ"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "إعادة تعيين"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "رادار"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "مسار قيادة قوس قزح مثل تسلا"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "إعادة تعيين"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "إعادة تعيين إعدادات DP"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "إعادة تعيين إعدادات dragonpilot إلى الافتراضية وإعادة تشغيل الجهاز."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "اكتشاف حافة الطريق (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"انظر https://github.com/eFiniLan/openpilot-ext-radar-addon لمزيد من "
|
||||
"المعلومات."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "قياسي"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"قياسي: السلوك الافتراضي.<br>MAIN+: تشغيل ACC MAIN = تشغيل العرض.<br>OP+: "
|
||||
"تفعيل OP = تشغيل العرض.<br>MAIN-: تشغيل ACC MAIN = إيقاف العرض.<br>OP-: "
|
||||
"تفعيل OP = إيقاف العرض."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"قياسي: السلوك الافتراضي.<br>تحذير: يصدر صوتاً فقط عند وجود تحذير.<br>إيقاف: "
|
||||
"لا يصدر أي صوت على الإطلاق."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"لمنع احتراق الشاشة، إخفاء السرعة والسرعة القصوى وأيقونات التوجيه/DM عند تحرك "
|
||||
"السيارة.<br>إيقاف = السلوك الافتراضي<br>1 كم/س = 0.6 ميل/س"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "استخدام الصفارة للتنبيهات الصوتية."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "استخدام رادار خارجي"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "استخدام واجهة MICI (comma four)"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "استخدام التحكم الطولي الافتراضي"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "تحذير"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "لم لا؟"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - مركز النظام الشامل من dragonpilot لك.<br><br>قم بزيارة http://"
|
||||
"<device_ip>:5088 للوصول.<br><br>فعّل هذا لاستخدام ميزة HUD (البث المباشر)."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "أو افتح المتصفح"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "امسح للوصول"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " كم/س"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " دقائق"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " ميل/س"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " ثانية"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " ثواني"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 دقائق = فوراً"
|
||||
@@ -0,0 +1,453 @@
|
||||
# German translations for PACKAGE package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:21+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ Automatischer Spurwechsel nach:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"Der adaptive Rollmodus (ACM) reduziert das Bremsen, um ein sanfteres Rollen "
|
||||
"zu ermöglichen, wenn dies angemessen ist."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "Adaptiver Experimentalmodus (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
"Adaptiver Moduswechsler zwischen ACC und Blended basierend auf dem "
|
||||
"Fahrkontext."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "Alle"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "Openpilot erlauben, Rechtsverkehrsregeln bei Rechtslenker zu befolgen."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "Dauerhafter Spurhalteassistent (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr ""
|
||||
"Möchten Sie wirklich ALLE DP-EINSTELLUNGEN auf die Standardwerte "
|
||||
"zurücksetzen?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "Akustische Warnung"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "Automatisches Herunterfahren nach"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "EPS-Sperre vermeiden"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"Spurwechselassistent blockieren, wenn das System den Straßenrand erkennt."
|
||||
"<br>HINWEIS: Dies zeigt die Warnung 'Fahrzeug im toten Winkel erkannt' an."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC passt die vorhergesagte Geschwindigkeit des Fahrzeugs automatisch an "
|
||||
"die bevorstehende Straßenkrümmung und Griffbedingungen an.<br>Ursprünglich "
|
||||
"aus dem openpilot TACO-Zweig."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "Loggerd-Start verzögern um:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"Verzögert den Start von loggerd und zugehörigen Prozessen, wenn das Gerät in "
|
||||
"Betrieb geht.<br>Dies verhindert, dass die ersten Momente einer Fahrt "
|
||||
"aufgezeichnet werden, wodurch die Standortprivatsphäre zu Beginn einer Fahrt "
|
||||
"geschützt wird."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Comma Connect deaktivieren"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"Comma Connect-Dienst deaktivieren, wenn Sie keine Daten hochladen / vom "
|
||||
"Dienst verfolgt werden möchten."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "Vorausfahrendes Fahrzeug-Statistiken anzeigen"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "Anzeigemodus"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"Zeigt Statistiken des vorausfahrenden Fahrzeugs und/oder Radar-"
|
||||
"Trackingpunkte an.<br>Lead: Nur Vorausfahrendes Fahrzeug<br>Radar: Nur Radar-"
|
||||
"Trackingpunkte<br>Alle: Vorausfahrendes Fahrzeug und Radar<br>HINWEIS: "
|
||||
"Radaroption funktioniert nur bei bestimmten Fahrzeugmodellen."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "Automatische Türverriegelung/-entriegelung"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "Dynamische Kurvengeschwindigkeitskontrolle (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "Adaptiven Rollmodus (ACM) aktivieren"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "Signalton aktivieren (Warnung)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "Rechtslenkermodus aktivieren"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "TSS1 SnG Mod aktivieren"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"Querregelung aktivieren, auch wenn ACC/Tempomat deaktiviert ist, mit ACC-"
|
||||
"Haupttaste oder LKAS-Taste umschalten. Fahrzeug muss in Bewegung sein."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"Openpilot erlauben, Türen über 20 km/h automatisch zu verriegeln und beim "
|
||||
"Einlegen von Park automatisch zu entriegeln."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "HUD ausblenden bei Bewegung über:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "Spurwechselassistent bei:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "Vorausfahrendes Fahrzeug"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "MQB A0 SnG Mod"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "Aus"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "Aus = Automatischen Spurwechsel deaktivieren."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "Aus = LCA deaktivieren.<br>1 mph = 1,2 km/h."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "PQ-Lenkungspatch"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "ZURÜCKSETZEN"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "Radar"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "Regenbogen-Fahrpfad wie Tesla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "Zurücksetzen"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "DP-Einstellungen zurücksetzen"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr ""
|
||||
"Dragonpilot-Einstellungen auf Standardwerte zurücksetzen und Gerät neu "
|
||||
"starten."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "Straßenranderkennung (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Siehe https://github.com/eFiniLan/openpilot-ext-radar-addon für weitere "
|
||||
"Informationen."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "Standard"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"Standard: Serienmäßiges Verhalten.<br>MAIN+: ACC MAIN ein = Anzeige EIN."
|
||||
"<br>OP+: OP aktiviert = Anzeige EIN.<br>MAIN-: ACC MAIN ein = Anzeige "
|
||||
"AUS<br>OP-: OP aktiviert = Anzeige AUS."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"Standard: Serienmäßiges Verhalten.<br>Warnung: Gibt nur bei Warnungen Ton "
|
||||
"aus.<br>Aus: Gibt überhaupt keinen Ton aus."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"Um Bildschirmeinbrennen zu verhindern, Geschwindigkeit, MAX-Geschwindigkeit "
|
||||
"und Lenk-/DM-Symbole ausblenden, wenn sich das Fahrzeug bewegt.<br>Aus = "
|
||||
"Serienmäßiges Verhalten<br>1 km/h = 0,6 mph"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "Signalton für hörbare Warnungen verwenden."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "Externes Radar verwenden"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "MICI (comma four) Benutzeroberfläche verwenden"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "Serienmäßige Längsregelung verwenden"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "Warnung"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "Warum nicht?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - dragonpilots All-in-One-System-Hub für Sie.<br><br>Besuchen Sie "
|
||||
"http://<device_ip>:5088 für den Zugriff.<br><br>Aktivieren Sie dies, um die "
|
||||
"HUD-Funktion (Live-Streaming) zu nutzen."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "oder Browser öffnen"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "scannen zum Zugriff"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/h"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " Min."
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mph"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " Sek."
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " Sek."
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 Min. = Sofort"
|
||||
@@ -0,0 +1,389 @@
|
||||
# English translations for PACKAGE package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:21+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: en\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ASCII\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "RESET"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "Reset"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "Reset DP Settings"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "Reset dragonpilot settings to default and restart the device."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "or open browser"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "scan to access"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,458 @@
|
||||
# Spanish translations for PACKAGE package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:21+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ Cambio automático de carril después de:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"El modo de rodaje adaptativo (ACM) reduce el frenado para permitir un rodaje "
|
||||
"más suave cuando sea apropiado."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "Modo experimental adaptativo (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
"Conmutador de modo adaptativo entre ACC y combinado según el contexto de "
|
||||
"conducción."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "Todo"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
"Permitir que openpilot obedezca las convenciones de tráfico por la derecha "
|
||||
"con el asiento del conductor a la derecha."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "Asistente de mantenimiento de carril permanente (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr ""
|
||||
"¿Está seguro de que desea restablecer TODOS LOS AJUSTES DE DP a los valores "
|
||||
"predeterminados?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "Alerta sonora"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "Apagado automático después de"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "Evitar bloqueo del EPS"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"Bloquear la asistencia de cambio de carril cuando el sistema detecte el "
|
||||
"borde de la carretera.<br>NOTA: Esto mostrará la advertencia 'Vehículo "
|
||||
"detectado en punto ciego'."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC ajusta automáticamente la velocidad prevista del vehículo en función de "
|
||||
"la curvatura de la carretera y las condiciones de agarre próximas."
|
||||
"<br>Originalmente de la rama TACO de openpilot."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "Retrasar inicio de Loggerd por:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"Retrasa el inicio de loggerd y sus procesos relacionados cuando el "
|
||||
"dispositivo está en la carretera.<br>Esto evita que se graben los momentos "
|
||||
"iniciales de un viaje, protegiendo la privacidad de la ubicación al inicio "
|
||||
"del trayecto."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Desactivar Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"Desactivar el servicio Comma Connect si no desea cargar datos / ser "
|
||||
"rastreado por el servicio."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "Mostrar estadísticas del vehículo delantero"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "Modo de visualización"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"Mostrar las estadísticas del vehículo delantero y/o puntos de seguimiento "
|
||||
"del radar.<br>Delantero: Solo estadísticas del delantero<br>Radar: Solo "
|
||||
"estadísticas de puntos de seguimiento del radar<br>Todo: Estadísticas del "
|
||||
"delantero y radar<br>NOTA: La opción de radar solo funciona en ciertos "
|
||||
"modelos de vehículos."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "Bloqueo/desbloqueo automático de puertas"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "Control dinámico de velocidad en curvas (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "Activar modo de rodaje adaptativo (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "Activar pitido (advertencia)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "Activar modo de conducción por la derecha"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "Activar mod TSS1 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"Activar control lateral incluso cuando ACC/cruise esté desactivado, usando "
|
||||
"el botón ACC Main o LKAS para alternar. El vehículo debe estar en movimiento."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"Permitir que openpilot bloquee automáticamente las puertas por encima de 20 "
|
||||
"km/h y desbloquee automáticamente al cambiar a estacionamiento."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "Ocultar HUD cuando se mueva por encima de:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "Asistente de cambio de carril a:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "Delantero"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "Mod MQB A0 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "Desactivado"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "Desactivado = Deshabilitar cambio automático de carril."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "Desactivado = Deshabilitar LCA.<br>1 mph = 1.2 km/h."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "Parche de dirección PQ"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "RESTABLECER"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "Radar"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "Trayectoria de conducción arcoíris como Tesla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "Restablecer"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "Restablecer configuración de DP"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr ""
|
||||
"Restablecer la configuración de dragonpilot a los valores predeterminados y "
|
||||
"reiniciar el dispositivo."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "Detección de borde de carretera (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Consulte https://github.com/eFiniLan/openpilot-ext-radar-addon para obtener "
|
||||
"más información."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "Estándar"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"Estándar: Comportamiento de fábrica.<br>MAIN+: ACC MAIN activado = Pantalla "
|
||||
"ACTIVADA.<br>OP+: OP activado = Pantalla ACTIVADA.<br>MAIN-: ACC MAIN "
|
||||
"activado = Pantalla DESACTIVADA<br>OP-: OP activado = Pantalla DESACTIVADA."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"Estándar: Comportamiento de fábrica.<br>Advertencia: Solo emite sonido "
|
||||
"cuando hay una advertencia.<br>Desactivado: No emite ningún sonido en "
|
||||
"absoluto."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"Para evitar el quemado de pantalla, ocultar velocidad, velocidad MAX e "
|
||||
"iconos de dirección/DM cuando el vehículo se mueva.<br>Desactivado = "
|
||||
"Comportamiento de fábrica<br>1 km/h = 0.6 mph"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "Usar zumbador para alertas audibles."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "Usar radar externo"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "Usar interfaz MICI (comma four)"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "Usar control longitudinal de fábrica"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "Advertencia"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "¿Por qué no?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - centro de sistema todo en uno de dragonpilot para usted."
|
||||
"<br><br>Visite http://<device_ip>:5088 para acceder.<br><br>Active esto para "
|
||||
"usar la función HUD (transmisión en vivo)."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "o abrir navegador"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "escanear para acceder"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/h"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " min"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mph"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " seg"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " segs"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 min = Inmediatamente"
|
||||
@@ -0,0 +1,460 @@
|
||||
# French translations for PACKAGE package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:21+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ Changement de voie automatique après :"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"Le mode de roue libre adaptatif (ACM) réduit le freinage pour permettre une "
|
||||
"décélération plus douce lorsque cela est approprié."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "Mode expérimental adaptatif (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
"Commutateur de mode adaptatif entre ACC et mixte en fonction du contexte de "
|
||||
"conduite."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "Tout"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
"Permet à openpilot de respecter les conventions de circulation à droite avec "
|
||||
"le volant à droite."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "Assistance au maintien de voie permanente (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr ""
|
||||
"Êtes-vous sûr de vouloir réinitialiser TOUS LES PARAMÈTRES DP par défaut ?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "Alerte sonore"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "Arrêt automatique après"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "Éviter le verrouillage EPS"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"Bloquer l'assistance au changement de voie lorsque le système détecte le "
|
||||
"bord de la route.<br>REMARQUE : Ceci affichera l'avertissement 'Véhicule "
|
||||
"détecté dans l'angle mort'."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC ajuste automatiquement la vitesse prédite du véhicule en fonction de la "
|
||||
"courbure de la route à venir et des conditions d'adhérence.<br>Provient "
|
||||
"initialement de la branche openpilot TACO."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "Retarder le démarrage de Loggerd de :"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"Retarde le démarrage de loggerd et de ses processus associés lorsque "
|
||||
"l'appareil commence à rouler.<br>Cela empêche l'enregistrement des premiers "
|
||||
"instants d'un trajet, protégeant ainsi la confidentialité de la localisation "
|
||||
"au début d'un voyage."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Désactiver Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"Désactiver le service Comma Connect si vous ne souhaitez pas télécharger / "
|
||||
"être suivi par le service."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "Afficher les stats du véhicule précédent"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "Mode d'affichage"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"Afficher les statistiques du véhicule précédent et/ou des points de suivi "
|
||||
"radar.<br>Précédent : Statistiques du véhicule précédent "
|
||||
"uniquement<br>Radar : Statistiques des points de suivi radar "
|
||||
"uniquement<br>Tout : Statistiques du véhicule précédent et du "
|
||||
"radar<br>REMARQUE : L'option radar ne fonctionne que sur certains modèles de "
|
||||
"véhicules."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "Verrouillage/déverrouillage automatique des portes"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "Contrôle dynamique de vitesse en virage (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "Activer le mode de roue libre adaptatif (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "Activer le bip (avertissement)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "Activer le mode conduite à droite"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "Activer le mod TSS1 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"Activer le contrôle latéral même lorsque l'ACC/régulateur est désactivé, en "
|
||||
"utilisant le bouton ACC Main ou LKAS pour basculer. Le véhicule doit être en "
|
||||
"mouvement."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"Permettre à openpilot de verrouiller automatiquement les portes au-dessus de "
|
||||
"20 km/h et de les déverrouiller automatiquement lors du passage en position "
|
||||
"Parking."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "Masquer le HUD au-dessus de :"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "Assistance au changement de voie à :"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "Précédent"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "Mod MQB A0 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "Désactivé"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "Désactivé = Désactiver le changement de voie automatique."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr ""
|
||||
"Désactivé = Désactiver l'assistance au changement de voie.<br>1 mph = 1,2 km/"
|
||||
"h."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "Correctif de direction PQ"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "RÉINITIALISER"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "Radar"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "Trajectoire arc-en-ciel comme Tesla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "Réinitialiser"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "Réinitialiser les paramètres DP"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr ""
|
||||
"Réinitialiser les paramètres dragonpilot par défaut et redémarrer l'appareil."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "Détection du bord de route (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Voir https://github.com/eFiniLan/openpilot-ext-radar-addon pour plus "
|
||||
"d'informations."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "Standard"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"Standard : Comportement d'origine.<br>MAIN+ : ACC MAIN activé = Affichage "
|
||||
"ACTIVÉ.<br>OP+ : OP activé = Affichage ACTIVÉ.<br>MAIN- : ACC MAIN activé = "
|
||||
"Affichage DÉSACTIVÉ<br>OP- : OP activé = Affichage DÉSACTIVÉ."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"Standard : Comportement d'origine.<br>Avertissement : Émet un son uniquement "
|
||||
"en cas d'avertissement.<br>Désactivé : N'émet aucun son."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"Pour éviter la rémanence d'écran, masquer la vitesse, la vitesse MAX et les "
|
||||
"icônes de direction/DM lorsque la voiture bouge.<br>Désactivé = Comportement "
|
||||
"d'origine<br>1 km/h = 0,6 mph"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "Utiliser le buzzer pour les alertes sonores."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "Utiliser un radar externe"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "Utiliser l'interface MICI (comma four)"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "Utiliser le contrôle longitudinal d'origine"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "Avertissement"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "Pourquoi pas ?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - le hub système tout-en-un de dragonpilot pour vous.<br><br>Visitez "
|
||||
"http://<adresse_ip_appareil>:5088 pour y accéder.<br><br>Activez cette "
|
||||
"option pour utiliser la fonctionnalité HUD (diffusion en direct)."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "HUD dashy"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "ou ouvrir le navigateur"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "scanner pour accéder"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/h"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " min"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mph"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " sec"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " sec"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 min = Immédiatement"
|
||||
@@ -0,0 +1,440 @@
|
||||
# Japanese translations for dragonpilot.
|
||||
# Copyright (C) 2025 dragonpilot
|
||||
# This file is distributed under the same license as the dragonpilot package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dragonpilot\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:30+0800\n"
|
||||
"Last-Translator: dragonpilot\n"
|
||||
"Language-Team: Japanese\n"
|
||||
"Language: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ 自動車線変更の遅延:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"アダプティブコースティングモード (ACM) は、適切な場合にブレーキを減らし、より"
|
||||
"スムーズなコースティングを実現します。"
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "アダプティブ実験モード (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "運転状況に基づいて ACC とブレンドモード間で自動切り替え。"
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "全て"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "右ハンドル車で右側通行規則に従うことを許可します。"
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "常時車線維持アシスト (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "すべての DP 設定をデフォルトにリセットしてもよろしいですか?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "音声アラート"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "自動シャットダウン遅延"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "EPS ロックアウトを回避"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"システムが道路端を検出したときに車線変更アシストをブロックします。<br>注意:"
|
||||
"「死角に車両検出」警告が表示されます。"
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC は前方の道路カーブとグリップ状態に基づいて車両の予測速度を自動調整しま"
|
||||
"す。<br>openpilot TACO ブランチ由来。"
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "ロガー起動遅延:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"デバイスが走行開始時にロガーと関連プロセスの起動を遅延させます。<br>運転開始"
|
||||
"時の記録を防ぎ、トリップ開始時の位置情報プライバシーを保護します。"
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Comma Connect を無効化"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"アップロードやサービスによる追跡を望まない場合、Comma Connect サービスを無効"
|
||||
"化します。"
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "先行車統計を表示"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "表示モード"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"先行車やレーダー追跡ポイントの統計を表示します。<br>先行車:先行車統計のみ"
|
||||
"<br>レーダー:レーダー追跡ポイント統計のみ<br>全て:先行車とレーダー統計<br>"
|
||||
"注意:レーダーオプションは特定の車種でのみ動作します。"
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "ドア自動ロック/解除"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "動的ターン速度制御 (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "アダプティブコースティングモード (ACM) を有効化"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "ビープ音を有効化(警告)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "右ハンドルモードを有効化"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "TSS1 SnG 修正を有効化"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"ACC/クルーズが無効でも横方向制御を有効化、ACC Main または LKAS ボタンで切り替"
|
||||
"え。車両は走行中である必要があります。"
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"時速 20 km 以上でドアを自動ロック、P レンジにシフトすると自動解除する "
|
||||
"openpilot を有効化します。"
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "HUD を非表示にする速度:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "車線変更アシスト有効速度:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "先行車"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "MQB A0 SnG 修正"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "オフ"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "オフ = 自動車線変更を無効化。"
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "オフ = 車線変更アシストを無効化。<br>1 mph = 1.2 km/h。"
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "PQ ステアリングパッチ"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "リセット"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "レーダー"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "レインボー走行経路(テスラ風)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "リセット"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "DP 設定をリセット"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "dragonpilot 設定をデフォルトにリセットしてデバイスを再起動します。"
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "道路端検出 (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"詳細は https://github.com/eFiniLan/openpilot-ext-radar-addon をご覧ください。"
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "標準"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"標準:純正動作。<br>MAIN+:ACC MAIN オン = ディスプレイ オン。<br>OP+:OP 有"
|
||||
"効 = ディスプレイ オン。<br>MAIN-:ACC MAIN オン = ディスプレイ オフ。"
|
||||
"<br>OP-:OP 有効 = ディスプレイ オフ。"
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"標準:純正動作。<br>警告:警告時のみ音を発します。<br>オフ:一切音を発しませ"
|
||||
"ん。"
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"画面の焼き付きを防ぐため、車両走行時に速度、最高速度、ステアリング/DM アイコ"
|
||||
"ンを非表示にします。<br>オフ = 純正動作<br>1 km/h = 0.6 mph"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "音声アラートにブザーを使用します。"
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "外部レーダーを使用"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "MICI (comma four) UI を使用"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "純正縦方向制御を使用"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "警告"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "なぜダメ?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - dragonpilot のオールインワンシステムハブ。<br><br>http://"
|
||||
"<device_ip>:5088 にアクセスしてください。<br><br>HUD 機能(ライブストリーミン"
|
||||
"グ)を使用するには、これを有効にしてください。"
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "またはブラウザで開く"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "スキャンしてアクセス"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/h"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " 分"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mph"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " 秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " 秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 分 = 即時"
|
||||
@@ -0,0 +1,441 @@
|
||||
# Korean translations for dragonpilot.
|
||||
# Copyright (C) 2025 dragonpilot
|
||||
# This file is distributed under the same license as the dragonpilot package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dragonpilot\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:30+0800\n"
|
||||
"Last-Translator: dragonpilot\n"
|
||||
"Language-Team: Korean\n"
|
||||
"Language: ko\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ 자동 차선 변경 지연 시간:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"적응형 관성 주행 모드(ACM)는 적절한 상황에서 제동을 줄여 부드러운 관성 주행"
|
||||
"을 가능하게 합니다."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "적응형 실험 모드 (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "주행 상황에 따라 ACC와 혼합 모드 간 자동 전환합니다."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "전체"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "우측 운전석 차량에서 openpilot이 우측 통행 규칙을 따르도록 허용합니다."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "상시 차선 유지 보조 (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "모든 DP 설정을 기본값으로 초기화하시겠습니까?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "소리 알림"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "자동 종료 대기 시간"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "EPS 잠금 방지"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"시스템이 도로 가장자리를 감지하면 차선 변경 보조를 차단합니다.<br>참고: '사각"
|
||||
"지대 차량 감지' 경고가 표시됩니다."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC는 다가오는 도로 곡률 및 접지 조건에 따라 차량의 예상 속도를 자동으로 조"
|
||||
"정합니다.<br>openpilot TACO 브랜치에서 유래했습니다."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "로거 시작 지연 시간:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"기기가 도로 주행을 시작할 때 로거 및 관련 프로세스의 시작을 지연시킵니다.<br>"
|
||||
"이를 통해 주행 시작 시점의 위치가 기록되지 않아 개인정보를 보호합니다."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Comma Connect 비활성화"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"데이터 업로드 또는 서비스 추적을 원하지 않는 경우 Comma Connect 서비스를 비활"
|
||||
"성화하세요."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "선행 차량 통계 표시"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "디스플레이 모드"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"선행 차량 및/또는 레이더 추적 포인트의 통계를 표시합니다.<br>선행: 선행 차량 "
|
||||
"통계만<br>레이더: 레이더 추적 포인트 통계만<br>전체: 선행 차량 및 레이더 통계"
|
||||
"<br>참고: 레이더 옵션은 특정 차량 모델에서만 작동합니다."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "도어 자동 잠금/해제"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "동적 회전 속도 제어 (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "적응형 관성 주행 모드 (ACM) 활성화"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "부저음 활성화 (경고)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "우측 운전석 모드 활성화"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "TSS1 정지 및 출발 모드 활성화"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"ACC/크루즈가 비활성화되어 있어도 횡방향 제어를 활성화합니다. ACC Main 또는 "
|
||||
"LKAS 버튼으로 전환합니다. 차량이 움직이고 있어야 합니다."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"openpilot이 시속 20km 이상에서 도어를 자동 잠금하고, P 기어로 변속 시 자동 해"
|
||||
"제하도록 활성화합니다."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "다음 속도 이상에서 HUD 숨기기:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "차선 변경 보조 활성화 속도:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "선행 차량"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "MQB A0 정지 및 출발 모드"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "끄기"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "끄기 = 자동 차선 변경 비활성화."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "끄기 = 차선 변경 보조 비활성화.<br>1 mph = 1.2 km/h."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "PQ 조향 패치"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "초기화"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "레이더"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "무지개 주행 경로 (테슬라 스타일)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "초기화"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "DP 설정 초기화"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "dragonpilot 설정을 기본값으로 초기화하고 기기를 재시작합니다."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "도로 가장자리 감지 (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"자세한 내용은 https://github.com/eFiniLan/openpilot-ext-radar-addon 을 참조하"
|
||||
"세요."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "표준"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"표준: 순정 동작.<br>MAIN+: ACC MAIN 켜짐 = 디스플레이 켜짐.<br>OP+: OP 활성"
|
||||
"화 = 디스플레이 켜짐.<br>MAIN-: ACC MAIN 켜짐 = 디스플레이 꺼짐.<br>OP-: OP "
|
||||
"활성화 = 디스플레이 꺼짐."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"표준: 순정 동작.<br>경고: 경고가 있을 때만 소리가 납니다.<br>끄기: 소리가 전"
|
||||
"혀 나지 않습니다."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"화면 번인 방지를 위해 차량 주행 시 속도, 최고 속도 및 조향/DM 아이콘을 숨깁니"
|
||||
"다.<br>끄기 = 순정 동작<br>1 km/h = 0.6 mph"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "소리 알림에 부저를 사용합니다."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "외부 레이더 사용"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "MICI (comma four) UI 사용"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "순정 종방향 제어 사용"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "경고"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "당연하죠!"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - dragonpilot의 올인원 시스템 허브입니다.<br><br>http://"
|
||||
"<device_ip>:5088 로 접속하세요.<br><br>HUD 기능(실시간 스트리밍)을 사용하려"
|
||||
"면 활성화하세요."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "또는 브라우저를 열어서"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "스캔하여 접속"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/h"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " 분"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mph"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " 초"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " 초"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0분 = 즉시"
|
||||
@@ -0,0 +1,454 @@
|
||||
# Portuguese (Brazil) translations for dragonpilot package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:21+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: pt-BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ Mudança Automática de Faixa após:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"O Modo de Desaceleração Adaptativa (ACM) reduz a frenagem para permitir uma "
|
||||
"desaceleração mais suave quando apropriado."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "Modo Experimental Adaptativo (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
"Alternador de modo adaptativo entre ACC e Misto baseado no contexto de "
|
||||
"direção."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "Todos"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
"Permitir que o openpilot obedeça às convenções de tráfego à direita com o "
|
||||
"motorista no lado direito."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "Assistente de Manutenção de Faixa Permanente (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr ""
|
||||
"Tem certeza de que deseja redefinir TODAS AS CONFIGURAÇÕES DP para o padrão?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "Alerta Sonoro"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "Desligamento Automático Após"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "Evitar Bloqueio do EPS"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"Bloquear assistência de mudança de faixa quando o sistema detecta a borda da "
|
||||
"estrada.<br>NOTA: Isso mostrará o aviso 'Carro Detectado no Ponto Cego'."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"O DTSC ajusta automaticamente a velocidade prevista do veículo com base na "
|
||||
"curvatura da estrada à frente e nas condições de aderência.<br>Originalmente "
|
||||
"do branch TACO do openpilot."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "Atrasar Início do Loggerd por:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"Atrasa a inicialização do loggerd e seus processos relacionados quando o "
|
||||
"dispositivo entra em operação.<br>Isso impede que os momentos iniciais de "
|
||||
"uma viagem sejam gravados, protegendo a privacidade de localização no início "
|
||||
"da viagem."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Desativar Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"Desative o serviço Comma Connect se você não deseja fazer upload / ser "
|
||||
"rastreado pelo serviço."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "Exibir Estatísticas do Líder"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "Modo de Exibição"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"Exibir as estatísticas do carro à frente e/ou pontos de rastreamento do "
|
||||
"radar.<br>Líder: Apenas estatísticas do líder<br>Radar: Apenas estatísticas "
|
||||
"dos pontos de rastreamento do radar<br>Todos: Estatísticas de líder e "
|
||||
"radar<br>NOTA: A opção Radar funciona apenas em certos modelos de veículos."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "Travamento/Destravamento Automático de Portas"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "Controle Dinâmico de Velocidade em Curvas (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "Ativar Modo de Desaceleração Adaptativa (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "Ativar Bip (Aviso)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "Ativar Modo de Direção à Direita"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "Ativar Mod TSS1 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"Ativar controle lateral mesmo quando ACC/cruise estiver desativado, usando o "
|
||||
"botão ACC Main ou LKAS para alternar. O veículo deve estar em movimento."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"Permitir que o openpilot trave automaticamente as portas acima de 20 km/h e "
|
||||
"destrave automaticamente ao mudar para Park."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "Ocultar HUD Quando Mover Acima de:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "Assistência de Mudança de Faixa em:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "Líder"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "Mod MQB A0 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "Desligado"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "Desligado = Desativar Mudança Automática de Faixa."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "Desligado = Desativar LCA.<br>1 mph = 1,2 km/h."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "Correção de Direção PQ"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "REDEFINIR"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "Radar"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "Caminho de Condução Arco-íris como Tesla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "Redefinir"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "Redefinir Configurações DP"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr ""
|
||||
"Redefinir as configurações do dragonpilot para o padrão e reiniciar o "
|
||||
"dispositivo."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "Detecção de Borda da Estrada (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Veja https://github.com/eFiniLan/openpilot-ext-radar-addon para mais "
|
||||
"informações."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "Padrão"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"Padrão: Comportamento original.<br>MAIN+: ACC MAIN ligado = Display LIGADO."
|
||||
"<br>OP+: OP ativado = Display LIGADO.<br>MAIN-: ACC MAIN ligado = Display "
|
||||
"DESLIGADO<br>OP-: OP ativado = Display DESLIGADO."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"Padrão: Comportamento original.<br>Aviso: Emite som apenas quando há um "
|
||||
"aviso.<br>Desligado: Não emite nenhum som."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"Para prevenir queima de tela, ocultar Velocidade, Velocidade MÁXIMA e Ícones "
|
||||
"de Direção/DM quando o carro se move.<br>Desligado = Comportamento "
|
||||
"Original<br>1 km/h = 0,6 mph"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "Usar buzzer para alertas sonoros."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "Usar Radar Externo"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "Usar Interface MICI (comma four)"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "Usar Controle Longitudinal Original"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "Aviso"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "Por que não?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - o hub do sistema tudo-em-um do dragonpilot para você.<br><br>Visite "
|
||||
"http://<device_ip>:5088 para acessar.<br><br>Ative isso para usar o recurso "
|
||||
"HUD (transmissão ao vivo)."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "HUD dashy"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "ou abra o navegador"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "escaneie para acessar"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/h"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " min"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mph"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " seg"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " seg"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 min = Imediatamente"
|
||||
@@ -0,0 +1,436 @@
|
||||
# Thai translations for dragonpilot.
|
||||
# Copyright (C) 2025 dragonpilot
|
||||
# This file is distributed under the same license as the dragonpilot package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dragonpilot\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:30+0800\n"
|
||||
"Last-Translator: dragonpilot\n"
|
||||
"Language-Team: Thai\n"
|
||||
"Language: th\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ เปลี่ยนเลนอัตโนมัติหลังจาก:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr "โหมดเลื่อนปรับตัว (ACM) ลดการเบรกเพื่อให้การเลื่อนราบรื่นขึ้นเมื่อเหมาะสม"
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "โหมดทดลองปรับตัว (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "สลับโหมดอัตโนมัติระหว่าง ACC และ Blended ตามสถานการณ์การขับขี่"
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "ทั้งหมด"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "อนุญาตให้ openpilot ปฏิบัติตามกฎจราจรฝั่งขวาสำหรับรถพวงมาลัยขวา"
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "ระบบช่วยรักษาเลนตลอดเวลา (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "คุณแน่ใจหรือไม่ว่าต้องการรีเซ็ตการตั้งค่า DP ทั้งหมดเป็นค่าเริ่มต้น?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "การแจ้งเตือนด้วยเสียง"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "ปิดเครื่องอัตโนมัติหลังจาก"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "หลีกเลี่ยงการล็อค EPS"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"ปิดกันการช่วยเปลี่ยนเลนเมื่อระบบตรวจพบขอบถนน<br>หมายเหตุ: จะแสดงคำเตือน "
|
||||
"'ตรวจพบรถในจุดอับสายตา'"
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC "
|
||||
"ปรับความเร็วที่คาดการณ์ของรถโดยอัตโนมัติตามความโค้งของถนนข้างหน้าและสภาพการยึดเกาะ<br>ต้นฉบับมาจาก "
|
||||
"openpilot TACO branch"
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "หน่วงเวลาการเริ่ม Loggerd:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"หน่วงเวลาการเริ่มต้น loggerd "
|
||||
"และกระบวนการที่เกี่ยวข้องเมื่ออุปกรณ์เริ่มใช้งานบนถนน<br>ช่วยป้องกันการบันทึกช่วงเวลาแรกของการขับขี่ "
|
||||
"เพื่อปกป้องความเป็นส่วนตัวของตำแหน่งที่เริ่มต้นการเดินทาง"
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "ปิดใช้งาน Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr "ปิดใช้งานบริการ Comma Connect หากคุณไม่ต้องการอัปโหลดข้อมูล / ถูกติดตามโดยบริการนี้"
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "แสดงสถิติรถคันหน้า"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "โหมดการแสดงผล"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"แสดงสถิติของรถคันหน้าและ/หรือจุดติดตามเรดาร์<br>รถคันหน้า: สถิติรถคันหน้าเท่านั้น<br>เรดาร์: "
|
||||
"สถิติจุดติดตามเรดาร์เท่านั้น<br>ทั้งหมด: สถิติรถคันหน้าและเรดาร์<br>หมายเหตุ: "
|
||||
"ตัวเลือกเรดาร์ใช้ได้เฉพาะบางรุ่นรถเท่านั้น"
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "ล็อค/ปลดล็อคประตูอัตโนมัติ"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "ควบคุมความเร็วเลี้ยวแบบไดนามิก (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "เปิดใช้งานโหมดเลื่อนปรับตัว (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "เปิดใช้งานเสียงบี๊บ (เตือน)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "เปิดใช้งานโหมดพวงมาลัยขวา"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "เปิดใช้งานการปรับแต่ง TSS1 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"เปิดใช้งานการควบคุมด้านข้างแม้ว่า ACC/ครูซจะปิดอยู่ ใช้ปุ่ม ACC Main หรือ LKAS เพื่อสลับ "
|
||||
"รถต้องกำลังเคลื่อนที่"
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"เปิดใช้งาน openpilot เพื่อล็อคประตูอัตโนมัติเมื่อความเร็วเกิน 20 กม./ชม. "
|
||||
"และปลดล็อคอัตโนมัติเมื่อเกียร์อยู่ที่ P"
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "ซ่อน HUD เมื่อความเร็วเกิน:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "ช่วยเปลี่ยนเลนที่ความเร็ว:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "รถคันหน้า"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "การปรับแต่ง MQB A0 SnG"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "ปิด"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "ปิด = ปิดใช้งานการเปลี่ยนเลนอัตโนมัติ"
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "ปิด = ปิดใช้งานการช่วยเปลี่ยนเลน<br>1 ไมล์/ชม. = 1.2 กม./ชม."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "แพตช์พวงมาลัย PQ"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "รีเซ็ต"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "เรดาร์"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "เส้นทางขับขี่สีรุ้งเหมือน Tesla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "รีเซ็ต"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "รีเซ็ตการตั้งค่า DP"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "รีเซ็ตการตั้งค่า dragonpilot เป็นค่าเริ่มต้นและรีสตาร์ทอุปกรณ์"
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "การตรวจจับขอบถนน (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr "ดูข้อมูลเพิ่มเติมที่ https://github.com/eFiniLan/openpilot-ext-radar-addon"
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "มาตรฐาน"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"มาตรฐาน: พฤติกรรมแบบเดิม<br>MAIN+: ACC MAIN เปิด = จอแสดงผลเปิด<br>OP+: OP "
|
||||
"เปิดใช้งาน = จอแสดงผลเปิด<br>MAIN-: ACC MAIN เปิด = จอแสดงผลปิด<br>OP-: OP "
|
||||
"เปิดใช้งาน = จอแสดงผลปิด"
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"มาตรฐาน: พฤติกรรมแบบเดิม<br>เตือน: ส่งเสียงเฉพาะเมื่อมีการเตือนเท่านั้น<br>ปิด: "
|
||||
"ไม่ส่งเสียงใดๆ เลย"
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"เพื่อป้องกันหน้าจอไหม้ ซ่อนความเร็ว, ความเร็วสูงสุด และไอคอนพวงมาลัย/DM "
|
||||
"เมื่อรถเคลื่อนที่<br>ปิด = พฤติกรรมแบบเดิม<br>1 กม./ชม. = 0.6 ไมล์/ชม."
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "ใช้บัซเซอร์สำหรับการแจ้งเตือนด้วยเสียง"
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "ใช้เรดาร์ภายนอก"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "ใช้ UI แบบ MICI (comma four)"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "ใช้การควบคุมแนวยาวแบบเดิม"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "เตือน"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "ทำไมไม่ล่ะ?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - ศูนย์กลางระบบแบบครบวงจรของ dragonpilot สำหรับคุณ<br><br>เข้าถึงที่ http://"
|
||||
"<device_ip>:5088<br><br>เปิดใช้งานเพื่อใช้ฟีเจอร์ HUD (ถ่ายทอดสด)"
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "หรือเปิดเบราว์เซอร์"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "สแกนเพื่อเข้าถึง"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " กม./ชม."
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " นาที"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " ไมล์/ชม."
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " วินาที"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " วินาที"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 นาที = ทันที"
|
||||
@@ -0,0 +1,446 @@
|
||||
# Turkish translations for PACKAGE package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:21+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ Otomatik Şerit Değiştirme:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
"Uyarlanabilir Serbest Sürüş Modu (ACM), uygun olduğunda daha yumuşak serbest "
|
||||
"sürüş için frenlemeyi azaltır."
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "Uyarlanabilir Deneysel Mod (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "Sürüş durumuna göre ACC ve Karışık mod arasında otomatik geçiş."
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "Tümü"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "Sağ direksiyon koltuğunda sağdan trafik kurallarına uymasını sağlar."
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "Sürekli Şerit Takip Asistanı (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "TÜM DP AYARLARINI varsayılana sıfırlamak istediğinizden emin misiniz?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "Sesli Uyarı"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "Otomatik Kapatma Süresi"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "EPS Kilitlenmesini Önle"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"Sistem yol kenarını algıladığında şerit değiştirme asistanını engeller."
|
||||
"<br>NOT: Bu 'Kör Noktada Araç Algılandı' uyarısını gösterecektir."
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC, yaklaşan yol virajı ve yol tutuş durumuna göre aracın öngörülen hızını "
|
||||
"otomatik olarak ayarlar.<br>Orijinal olarak openpilot TACO dalından."
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "Loggerd Başlatmayı Geciktir:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"Cihaz yola çıktığında loggerd ve ilgili işlemlerin başlatılmasını geciktirir."
|
||||
"<br>Bu, sürüşün ilk anlarının kaydedilmesini önleyerek yolculuğun başındaki "
|
||||
"konum gizliliğini korur."
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "Comma Connect'i Devre Dışı Bırak"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
"Veri yüklemek veya hizmet tarafından izlenmek istemiyorsanız Comma connect "
|
||||
"hizmetini devre dışı bırakın."
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "Öndeki Araç İstatistiklerini Göster"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "Görüntü Modu"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"Öndeki araç ve/veya radar takip noktalarının istatistiklerini gösterir."
|
||||
"<br>Öndeki: Sadece öndeki araç istatistikleri<br>Radar: Sadece radar takip "
|
||||
"noktası istatistikleri<br>Tümü: Öndeki araç ve Radar istatistikleri<br>NOT: "
|
||||
"Radar seçeneği sadece belirli araç modellerinde çalışır."
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "Otomatik Kapı Kilitleme/Açma"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "Dinamik Viraj Hız Kontrolü (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "Uyarlanabilir Serbest Sürüş Modunu Etkinleştir (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "Bip Sesini Etkinleştir (Uyarı)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "Sağ Direksiyon Modunu Etkinleştir"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "TSS1 SnG Modunu Etkinleştir"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"ACC/cruise devre dışı olsa bile yanal kontrolü etkinleştirir, ACC Ana veya "
|
||||
"LKAS düğmesi ile açılıp kapatılır. Araç hareket halinde olmalıdır."
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
"20 km/s'nin üzerinde kapıları otomatik kilitler ve Park konumuna "
|
||||
"geçildiğinde otomatik açar."
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "HUD'u Gizle Şu Hızın Üzerinde:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "Şerit Değiştirme Asistanı:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "Öndeki"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "ANA+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "ANA-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "MQB A0 SnG Modu"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "Kapalı"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "Kapalı = Otomatik Şerit Değiştirmeyi Devre Dışı Bırak."
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr ""
|
||||
"Kapalı = Şerit Değiştirme Asistanını Devre Dışı Bırak.<br>1 mil/s = 1.2 km/s."
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "PQ Direksiyon Yaması"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "SIFIRLA"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "Radar"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "Tesla Gibi Gökkuşağı Sürüş Yolu"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "Sıfırla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "DP Ayarlarını Sıfırla"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "Dragonpilot ayarlarını varsayılana sıfırla ve cihazı yeniden başlat."
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "Yol Kenarı Algılama (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Daha fazla bilgi için https://github.com/eFiniLan/openpilot-ext-radar-addon "
|
||||
"adresine bakın."
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "Std."
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"Std.: Standart davranış.<br>ANA+: ACC ANA açık = Ekran AÇIK.<br>OP+: OP "
|
||||
"etkin = Ekran AÇIK.<br>ANA-: ACC ANA açık = Ekran KAPALI<br>OP-: OP etkin = "
|
||||
"Ekran KAPALI."
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"Std.: Standart davranış.<br>Uyarı: Sadece uyarı olduğunda ses çıkarır."
|
||||
"<br>Kapalı: Hiç ses çıkarmaz."
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"Ekran yanmasını önlemek için, araç hareket halindeyken Hız, MAKS Hız ve "
|
||||
"Direksiyon/DM Simgelerini gizler.<br>Kapalı = Standart Davranış<br>1 km/s = "
|
||||
"0.6 mil/s"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "Sesli uyarılar için zil kullan."
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "Harici Radar Kullan"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "MICI (comma four) Arayüzünü Kullan"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "Standart Uzunlamasına Kontrolü Kullan"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "Uyarı"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "Neden olmasın?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - dragonpilot'un sizin için hepsi bir arada sistem merkezi."
|
||||
"<br><br>Erişmek için http://<cihaz_ip>:5088 adresini ziyaret edin."
|
||||
"<br><br>HUD özelliğini (canlı yayın) kullanmak için bunu etkinleştirin."
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "veya tarayıcıyı aç"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "erişmek için tara"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " km/s"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " dk"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " mil/s"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " sn"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " sn"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 dk = Hemen"
|
||||
@@ -0,0 +1,390 @@
|
||||
# Ukrainian translations for PACKAGE package.
|
||||
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# Automatically generated, 2025.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-26 12:36+0800\n"
|
||||
"PO-Revision-Date: 2025-12-19 21:35+0800\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: uk\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ASCII\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
|
||||
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr ""
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,429 @@
|
||||
# Simplified Chinese translations for dragonpilot.
|
||||
# Copyright (C) 2025 dragonpilot
|
||||
# This file is distributed under the same license as the dragonpilot package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dragonpilot\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:30+0800\n"
|
||||
"Last-Translator: dragonpilot\n"
|
||||
"Language-Team: Chinese (Simplified)\n"
|
||||
"Language: zh-CHS\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ 自动变换车道延迟:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr "0 分钟 = 立即"
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr "自适应滑行模式 (ACM) 在适当情况下减少刹车,实现更平顺的滑行。"
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "自适应实验模式 (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "根据驾驶情境自动在 ACC 和混合模式间切换。"
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "全部"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "允许 openpilot 在右驾车辆上遵循右侧通行规则。"
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "持续车道保持辅助 (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "确定要将所有 DP 设定重置为默认值吗?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "声音提示"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "自动关机延迟"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "避免 EPS 锁定"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"当系统侦测到道路边缘时阻止变换车道辅助。<br>注意:这将显示「侦测到盲点车辆」"
|
||||
"警告。"
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC 根据前方道路曲率和抓地力条件自动调整车辆预测速度。<br>源自 openpilot "
|
||||
"TACO 分支。"
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "延迟启动记录程序:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"当设备上路时延迟启动记录程序及相关进程。<br>这可防止行程开始时的位置被记录,"
|
||||
"保护隐私。"
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "停用 Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr "如果您不希望上传数据或被服务追踪,请停用 Comma Connect 服务。"
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "显示前车统计"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "显示模式"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"显示前车和/或雷达追踪点的统计数据。<br>前车:仅显示前车统计<br>雷达:仅显示雷"
|
||||
"达追踪点统计<br>全部:显示前车和雷达统计<br>注意:雷达选项仅适用于特定车型。"
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "车门自动锁定/解锁"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "动态转弯速度控制 (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "启用自适应滑行模式 (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "启用蜂鸣器(警告)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "启用右驾模式"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "启用 TSS1 走停修正"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"即使 ACC/巡航未启用也保持横向控制,使用 ACC Main 或 LKAS 按钮切换。车辆必须在"
|
||||
"行驶中。"
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr "启用 openpilot 在时速超过 20 公里时自动锁门,换至 P 档时自动解锁。"
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "行驶超过此速度时隐藏 HUD:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "变换车道辅助启用速度:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "前车"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "MQB A0 走停修正"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "关闭"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "关闭 = 停用自动变换车道。"
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "关闭 = 停用变换车道辅助。<br>1 英里/时 = 1.2 公里/时。"
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "PQ 转向修正"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "重置"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "雷达"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "彩虹行驶路径(类似特斯拉)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "重置"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "重置 DP 设定"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "将 dragonpilot 设定重置为默认值并重新启动设备。"
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "道路边缘侦测 (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr "详情请参阅 https://github.com/eFiniLan/openpilot-ext-radar-addon。"
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "标准"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"标准:原厂行为。<br>MAIN+:ACC MAIN 开启 = 屏幕开启。<br>OP+:OP 启用 = 屏幕"
|
||||
"开启。<br>MAIN-:ACC MAIN 开启 = 屏幕关闭。<br>OP-:OP 启用 = 屏幕关闭。"
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"标准:原厂行为。<br>警告:仅在有警告时发出声音。<br>关闭:完全不发出声音。"
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"为防止屏幕烙印,在车辆行驶时隐藏速度、最高速度和转向/DM 图标。<br>关闭 = 原厂"
|
||||
"行为<br>1 公里/时 = 0.6 英里/时"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "使用蜂鸣器进行声音提示。"
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "使用外部雷达"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "使用 MICI (comma four) 界面"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "使用原厂纵向控制"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "警告"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "有何不可?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - dragonpilot 的控制台。<br><br>请访问 http://<device_ip>:5088 "
|
||||
"进入。<br><br>启用此功能以使用 HUD 功能(即时串流)。"
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr "km/h"
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr "分钟"
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr "mph"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "或使用浏览器打开"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "扫描以访问"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr "秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " 公里/时"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " 分钟"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " 英里/时"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " 秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " 秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 分钟 = 立即"
|
||||
@@ -0,0 +1,429 @@
|
||||
# Traditional Chinese translations for dragonpilot.
|
||||
# Copyright (C) 2025 dragonpilot
|
||||
# This file is distributed under the same license as the dragonpilot package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: dragonpilot\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-19 09:07+0800\n"
|
||||
"PO-Revision-Date: 2025-12-18 12:30+0800\n"
|
||||
"Last-Translator: dragonpilot\n"
|
||||
"Language-Team: Chinese (Traditional)\n"
|
||||
"Language: zh-CHT\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: dragonpilot/settings.py:91
|
||||
#, python-format
|
||||
msgid "+ Auto Lane Change after:"
|
||||
msgstr "+ 自動變換車道延遲:"
|
||||
|
||||
#: dragonpilot/settings.py:240
|
||||
#, python-format
|
||||
msgid "0 min = Immediately"
|
||||
msgstr "0 分鐘 = 立即"
|
||||
|
||||
#: dragonpilot/settings.py:122
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive Coasting Mode (ACM) reduces braking to allow smoother coasting when "
|
||||
"appropriate."
|
||||
msgstr "自適應滑行模式 (ACM) 在適當情況下減少煞車,實現更平順的滑行。"
|
||||
|
||||
#: dragonpilot/settings.py:127
|
||||
#, python-format
|
||||
msgid "Adaptive Experimental Mode (AEM)"
|
||||
msgstr "自適應實驗模式 (AEM)"
|
||||
|
||||
#: dragonpilot/settings.py:128
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Adaptive mode switcher between ACC and Blended based on driving context."
|
||||
msgstr "根據駕駛情境自動在 ACC 和混合模式間切換。"
|
||||
|
||||
#: dragonpilot/settings.py:186
|
||||
#, python-format
|
||||
msgid "All"
|
||||
msgstr "全部"
|
||||
|
||||
#: dragonpilot/settings.py:207
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Allow openpilot to obey right-hand traffic conventions on right driver seat."
|
||||
msgstr "允許 openpilot 在右駕車輛上遵循右側通行規則。"
|
||||
|
||||
#: dragonpilot/settings.py:67
|
||||
#, python-format
|
||||
msgid "Always-on Lane Keeping Assist (ALKA)"
|
||||
msgstr "持續車道維持輔助 (ALKA)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Are you sure you want to reset ALL DP SETTINGS to default?"
|
||||
msgstr "確定要將所有 DP 設定重置為預設值嗎?"
|
||||
|
||||
#: dragonpilot/settings.py:226
|
||||
#, python-format
|
||||
msgid "Audible Alert"
|
||||
msgstr "聲音提示"
|
||||
|
||||
#: dragonpilot/settings.py:239
|
||||
#, python-format
|
||||
msgid "Auto Shutdown After"
|
||||
msgstr "自動關機延遲"
|
||||
|
||||
#: dragonpilot/settings.py:48
|
||||
#, python-format
|
||||
msgid "Avoid EPS Lockout"
|
||||
msgstr "避免 EPS 鎖定"
|
||||
|
||||
#: dragonpilot/settings.py:109
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Block lane change assist when the system detects the road edge.<br>NOTE: "
|
||||
"This will show 'Car Detected in Blindspot' warning."
|
||||
msgstr ""
|
||||
"當系統偵測到道路邊緣時阻止變換車道輔助。<br>注意:這將顯示「偵測到盲點車輛」"
|
||||
"警告。"
|
||||
|
||||
#: dragonpilot/settings.py:134
|
||||
#, python-format
|
||||
msgid ""
|
||||
"DTSC automatically adjusts the vehicle's predicted speed based on upcoming "
|
||||
"road curvature and grip conditions.<br>Originally from the openpilot TACO "
|
||||
"branch."
|
||||
msgstr ""
|
||||
"DTSC 根據前方道路曲率和抓地力條件自動調整車輛預測速度。<br>源自 openpilot "
|
||||
"TACO 分支。"
|
||||
|
||||
#: dragonpilot/settings.py:257
|
||||
#, python-format
|
||||
msgid "Delay Starting Loggerd for:"
|
||||
msgstr "延遲啟動記錄程式:"
|
||||
|
||||
#: dragonpilot/settings.py:258
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Delays the startup of loggerd and its related processes when the device goes "
|
||||
"on-road.<br>This prevents the initial moments of a drive from being "
|
||||
"recorded, protecting location privacy at the start of a trip."
|
||||
msgstr ""
|
||||
"當設備上路時延遲啟動記錄程式及相關程序。<br>這可防止行程開始時的位置被記錄,"
|
||||
"保護隱私。"
|
||||
|
||||
#: dragonpilot/settings.py:269
|
||||
#, python-format
|
||||
msgid "Disable Comma Connect"
|
||||
msgstr "停用 Comma Connect"
|
||||
|
||||
#: dragonpilot/settings.py:270
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Disable Comma connect service if you do not wish to upload / being tracked "
|
||||
"by the service."
|
||||
msgstr "如果您不希望上傳資料或被服務追蹤,請停用 Comma Connect 服務。"
|
||||
|
||||
#: dragonpilot/settings.py:179
|
||||
#, python-format
|
||||
msgid "Display Lead Stats"
|
||||
msgstr "顯示前車統計"
|
||||
|
||||
#: dragonpilot/settings.py:145
|
||||
#, python-format
|
||||
msgid "Display Mode"
|
||||
msgstr "顯示模式"
|
||||
|
||||
#: dragonpilot/settings.py:180
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Display the statistics of lead car and/or radar tracking points.<br>Lead: "
|
||||
"Lead stats only<br>Radar: Radar tracking point stats only<br>All: Lead and "
|
||||
"Radar stats<br>NOTE: Radar option only works on certain vehicle models."
|
||||
msgstr ""
|
||||
"顯示前車和/或雷達追蹤點的統計資料。<br>前車:僅顯示前車統計<br>雷達:僅顯示雷"
|
||||
"達追蹤點統計<br>全部:顯示前車和雷達統計<br>注意:雷達選項僅適用於特定車型。"
|
||||
|
||||
#: dragonpilot/settings.py:11
|
||||
#, python-format
|
||||
msgid "Door Auto Lock/Unlock"
|
||||
msgstr "車門自動鎖定/解鎖"
|
||||
|
||||
#: dragonpilot/settings.py:133
|
||||
#, python-format
|
||||
msgid "Dynamic Turn Speed Control (DTSC)"
|
||||
msgstr "動態轉彎速度控制 (DTSC)"
|
||||
|
||||
#: dragonpilot/settings.py:121
|
||||
#, python-format
|
||||
msgid "Enable Adaptive Coasting Mode (ACM)"
|
||||
msgstr "啟用自適應滑行模式 (ACM)"
|
||||
|
||||
#: dragonpilot/settings.py:213
|
||||
#, python-format
|
||||
msgid "Enable Beep (Warning)"
|
||||
msgstr "啟用蜂鳴器(警告)"
|
||||
|
||||
#: dragonpilot/settings.py:206
|
||||
#, python-format
|
||||
msgid "Enable Right-Hand Drive Mode"
|
||||
msgstr "啟用右駕模式"
|
||||
|
||||
#: dragonpilot/settings.py:17
|
||||
#, python-format
|
||||
msgid "Enable TSS1 SnG Mod"
|
||||
msgstr "啟用 TSS1 走停修正"
|
||||
|
||||
#: dragonpilot/settings.py:68
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable lateral control even when ACC/cruise is disengaged, using ACC Main or "
|
||||
"LKAS button to toggle. Vehicle must be moving."
|
||||
msgstr ""
|
||||
"即使 ACC/巡航未啟用也保持橫向控制,使用 ACC Main 或 LKAS 按鈕切換。車輛必須在"
|
||||
"行駛中。"
|
||||
|
||||
#: dragonpilot/settings.py:12
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Enable openpilot to auto-lock doors above 20 km/h and auto-unlock when "
|
||||
"shifting to Park."
|
||||
msgstr "啟用 openpilot 在時速超過 20 公里時自動鎖門,換至 P 檔時自動解鎖。"
|
||||
|
||||
#: dragonpilot/settings.py:160
|
||||
#, python-format
|
||||
msgid "Hide HUD When Moves above:"
|
||||
msgstr "行駛超過此速度時隱藏 HUD:"
|
||||
|
||||
#: dragonpilot/settings.py:74
|
||||
#, python-format
|
||||
msgid "Lane Change Assist At:"
|
||||
msgstr "變換車道輔助啟用速度:"
|
||||
|
||||
#: dragonpilot/settings.py:184
|
||||
#, python-format
|
||||
msgid "Lead"
|
||||
msgstr "前車"
|
||||
|
||||
#: dragonpilot/settings.py:150
|
||||
#, python-format
|
||||
msgid "MAIN+"
|
||||
msgstr "MAIN+"
|
||||
|
||||
#: dragonpilot/settings.py:152
|
||||
#, python-format
|
||||
msgid "MAIN-"
|
||||
msgstr "MAIN-"
|
||||
|
||||
#: dragonpilot/settings.py:36
|
||||
#, python-format
|
||||
msgid "MQB A0 SnG Mod"
|
||||
msgstr "MQB A0 走停修正"
|
||||
|
||||
#: dragonpilot/settings.py:151
|
||||
#, python-format
|
||||
msgid "OP+"
|
||||
msgstr "OP+"
|
||||
|
||||
#: dragonpilot/settings.py:153
|
||||
#, python-format
|
||||
msgid "OP-"
|
||||
msgstr "OP-"
|
||||
|
||||
#: dragonpilot/settings.py:81 dragonpilot/settings.py:98
|
||||
#: dragonpilot/settings.py:167 dragonpilot/settings.py:183
|
||||
#: dragonpilot/settings.py:232 dragonpilot/settings.py:246
|
||||
#: dragonpilot/settings.py:264
|
||||
#, python-format
|
||||
msgid "Off"
|
||||
msgstr "關閉"
|
||||
|
||||
#: dragonpilot/settings.py:92
|
||||
#, python-format
|
||||
msgid "Off = Disable Auto Lane Change."
|
||||
msgstr "關閉 = 停用自動變換車道。"
|
||||
|
||||
#: dragonpilot/settings.py:75
|
||||
#, python-format
|
||||
msgid "Off = Disable LCA.<br>1 mph = 1.2 km/h."
|
||||
msgstr "關閉 = 停用變換車道輔助。<br>1 英里/時 = 1.2 公里/時。"
|
||||
|
||||
#: dragonpilot/settings.py:42
|
||||
#, python-format
|
||||
msgid "PQ Steering Patch"
|
||||
msgstr "PQ 轉向修正"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:41
|
||||
#, python-format
|
||||
msgid "RESET"
|
||||
msgstr "重置"
|
||||
|
||||
#: dragonpilot/settings.py:185
|
||||
#, python-format
|
||||
msgid "Radar"
|
||||
msgstr "雷達"
|
||||
|
||||
#: dragonpilot/settings.py:172
|
||||
#, python-format
|
||||
msgid "Rainbow Driving Path like Tesla"
|
||||
msgstr "彩虹行駛路徑(類似特斯拉)"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:198
|
||||
#, python-format
|
||||
msgid "Reset"
|
||||
msgstr "重置"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:40
|
||||
#, python-format
|
||||
msgid "Reset DP Settings"
|
||||
msgstr "重置 DP 設定"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/layouts/settings/dragonpilot.py:42
|
||||
#, python-format
|
||||
msgid "Reset dragonpilot settings to default and restart the device."
|
||||
msgstr "將 dragonpilot 設定重置為預設值並重新啟動設備。"
|
||||
|
||||
#: dragonpilot/settings.py:108
|
||||
#, python-format
|
||||
msgid "Road Edge Detection (RED)"
|
||||
msgstr "道路邊緣偵測 (RED)"
|
||||
|
||||
#: dragonpilot/settings.py:221
|
||||
#, python-format
|
||||
msgid ""
|
||||
"See https://github.com/eFiniLan/openpilot-ext-radar-addon for more "
|
||||
"information."
|
||||
msgstr "詳情請參閱 https://github.com/eFiniLan/openpilot-ext-radar-addon。"
|
||||
|
||||
#: dragonpilot/settings.py:149 dragonpilot/settings.py:230
|
||||
#, python-format
|
||||
msgid "Std."
|
||||
msgstr "標準"
|
||||
|
||||
#: dragonpilot/settings.py:146
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behavior.<br>MAIN+: ACC MAIN on = Display ON.<br>OP+: OP enabled "
|
||||
"= Display ON.<br>MAIN-: ACC MAIN on = Display OFF<br>OP-: OP enabled = "
|
||||
"Display OFF."
|
||||
msgstr ""
|
||||
"標準:原廠行為。<br>MAIN+:ACC MAIN 開啟 = 螢幕開啟。<br>OP+:OP 啟用 = 螢幕"
|
||||
"開啟。<br>MAIN-:ACC MAIN 開啟 = 螢幕關閉。<br>OP-:OP 啟用 = 螢幕關閉。"
|
||||
|
||||
#: dragonpilot/settings.py:227
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Std.: Stock behaviour.<br>Warning: Only emits sound when there is a warning."
|
||||
"<br>Off: Does not emit any sound at all."
|
||||
msgstr ""
|
||||
"標準:原廠行為。<br>警告:僅在有警告時發出聲音。<br>關閉:完全不發出聲音。"
|
||||
|
||||
#: dragonpilot/settings.py:161
|
||||
#, python-format
|
||||
msgid ""
|
||||
"To prevent screen burn-in, hide Speed, MAX Speed, and Steering/DM Icons when "
|
||||
"the car moves.<br>Off = Stock Behavior<br>1 km/h = 0.6 mph"
|
||||
msgstr ""
|
||||
"為防止螢幕烙印,在車輛行駛時隱藏速度、最高速度和轉向/DM 圖示。<br>關閉 = 原廠"
|
||||
"行為<br>1 公里/時 = 0.6 英里/時"
|
||||
|
||||
#: dragonpilot/settings.py:214
|
||||
#, python-format
|
||||
msgid "Use Buzzer for audiable alerts."
|
||||
msgstr "使用蜂鳴器進行聲音提示。"
|
||||
|
||||
#: dragonpilot/settings.py:220
|
||||
#, python-format
|
||||
msgid "Use External Radar"
|
||||
msgstr "使用外部雷達"
|
||||
|
||||
#: dragonpilot/settings.py:193
|
||||
#, python-format
|
||||
msgid "Use MICI (comma four) UI"
|
||||
msgstr "使用 MICI (comma four) 介面"
|
||||
|
||||
#: dragonpilot/settings.py:23
|
||||
#, python-format
|
||||
msgid "Use Stock Longitudinal Control"
|
||||
msgstr "使用原廠縱向控制"
|
||||
|
||||
#: dragonpilot/settings.py:231
|
||||
#, python-format
|
||||
msgid "Warning"
|
||||
msgstr "警告"
|
||||
|
||||
#: dragonpilot/settings.py:173 dragonpilot/settings.py:194
|
||||
#, python-format
|
||||
msgid "Why not?"
|
||||
msgstr "有何不可?"
|
||||
|
||||
#: dragonpilot/settings.py:252
|
||||
#, python-format
|
||||
msgid ""
|
||||
"dashy - dragonpilot's all-in-one system hub for you.<br><br>Visit http://"
|
||||
"<device_ip>:5088 to access.<br><br>Enable this to use HUD feature (live "
|
||||
"streaming)."
|
||||
msgstr ""
|
||||
"dashy - dragonpilot 的控制中心。<br><br>請訪問 http://<device_ip>:5088 "
|
||||
"進入。<br><br>啟用此功能以使用 HUD 功能(即時串流)。"
|
||||
|
||||
#: dragonpilot/settings.py:251
|
||||
#, python-format
|
||||
msgid "dashy HUD"
|
||||
msgstr "dashy HUD"
|
||||
|
||||
#: dragonpilot/settings.py:166
|
||||
#, python-format
|
||||
msgid "km/h"
|
||||
msgstr "km/h"
|
||||
|
||||
#: dragonpilot/settings.py:245
|
||||
#, python-format
|
||||
msgid "min"
|
||||
msgstr "分鐘"
|
||||
|
||||
#: dragonpilot/settings.py:80
|
||||
#, python-format
|
||||
msgid "mph"
|
||||
msgstr "mph"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:18
|
||||
#, python-format
|
||||
msgid "or open browser"
|
||||
msgstr "或使用瀏覽器開啟"
|
||||
|
||||
#: dragonpilot/selfdrive/ui/mici/layouts/dashy_qrcode.py:14
|
||||
#, python-format
|
||||
msgid "scan to access"
|
||||
msgstr "掃描以存取"
|
||||
|
||||
#: dragonpilot/settings.py:97 dragonpilot/settings.py:263
|
||||
#, python-format
|
||||
msgid "sec"
|
||||
msgstr "秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " km/h"
|
||||
#~ msgstr " 公里/時"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mins"
|
||||
#~ msgstr " 分鐘"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " mph"
|
||||
#~ msgstr " 英里/時"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " sec"
|
||||
#~ msgstr " 秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid " secs"
|
||||
#~ msgstr " 秒"
|
||||
|
||||
#, python-format
|
||||
#~ msgid "0 mins = Immediately"
|
||||
#~ msgstr "0 分鐘 = 立即"
|
||||
@@ -12,7 +12,7 @@ CAR_VOLTAGE_LOW_PASS_K = 0.011 # LPF gain for 45s tau (dt/tau / (dt/tau + 1))
|
||||
CAR_BATTERY_CAPACITY_uWh = 30e6
|
||||
CAR_CHARGING_RATE_W = 45
|
||||
|
||||
VBATT_PAUSE_CHARGING = 11.8 # Lower limit on the LPF car battery voltage
|
||||
VBATT_PAUSE_CHARGING = 0. # Lower limit on the LPF car battery voltage
|
||||
MAX_TIME_OFFROAD_S = 30*3600
|
||||
MIN_ON_TIME_S = 3600
|
||||
DELAY_SHUTDOWN_TIME_S = 300 # Wait at least DELAY_SHUTDOWN_TIME_S seconds after offroad_time to shutdown.
|
||||
|
||||
@@ -125,7 +125,6 @@ procs = [
|
||||
PythonProcess("webjoystick", "tools.bodyteleop.web", notcar),
|
||||
PythonProcess("joystick", "tools.joystick.joystick_control", and_(joystick, iscar)),
|
||||
PythonProcess("dashy", "dragonpilot.dashy.backend.server", always_run),
|
||||
PythonProcess("gpsd", "dragonpilot.selfdrive.gpsd.gpsd", and_(dashy, only_onroad)),
|
||||
]
|
||||
|
||||
managed_processes = {p.name: p for p in procs}
|
||||
|
||||
@@ -70,8 +70,6 @@ class TextWindow(Widget):
|
||||
def _on_button_clicked():
|
||||
gui_app.request_close()
|
||||
if not PC:
|
||||
import os
|
||||
os.system("rm -rf /data/scons_cache/*")
|
||||
HARDWARE.reboot()
|
||||
|
||||
def _render(self, rect: rl.Rectangle):
|
||||
|
||||
@@ -83,7 +83,7 @@ def set_consistent_flag(consistent: bool) -> None:
|
||||
|
||||
def parse_release_notes(basedir: str) -> bytes:
|
||||
try:
|
||||
with open(os.path.join(basedir, "RELEASES.md"), "rb") as f:
|
||||
with open(os.path.join(basedir, "CHANGELOGS.md"), "rb") as f:
|
||||
r = f.read().split(b'\n\n', 1)[0] # Slice latest release notes
|
||||
try:
|
||||
return bytes(parse_markdown(r.decode("utf-8")), encoding="utf-8")
|
||||
@@ -370,7 +370,7 @@ class Updater:
|
||||
m = re.match(r'^(\d+)\.(\d+)\.(\d+)', name)
|
||||
|
||||
# Logic:
|
||||
# 1. Allow exactly 'pre-build'
|
||||
# 1. Allow exactly 'pre-build' or 'testing'
|
||||
# 2. OR Allow if it parses as a version AND that version is >= 0.9.8
|
||||
if name in ('testing', 'pre-build') or (m and tuple(map(int, m.groups())) >= (0, 9, 8)):
|
||||
self.branches[name] = x.group('commit_sha')
|
||||
|
||||
+1
-1
@@ -26,7 +26,7 @@ def get_version(path: str = BASEDIR) -> str:
|
||||
|
||||
|
||||
def get_release_notes(path: str = BASEDIR) -> str:
|
||||
with open(os.path.join(path, "RELEASES.md")) as f:
|
||||
with open(os.path.join(path, "CHANGELOGS.md")) as f:
|
||||
return f.read().split('\n\n', 1)[0]
|
||||
|
||||
|
||||
|
||||
+33
-16
@@ -26,9 +26,6 @@ class CerealOutgoingMessageProxy:
|
||||
def __init__(self, sm: messaging.SubMaster):
|
||||
self.sm = sm
|
||||
self.channels: list[RTCDataChannel] = []
|
||||
self.serializer = {
|
||||
'carParams': self._bytes_to_hex,
|
||||
}
|
||||
|
||||
def add_channel(self, channel: 'RTCDataChannel'):
|
||||
self.channels.append(channel)
|
||||
@@ -45,13 +42,7 @@ class CerealOutgoingMessageProxy:
|
||||
|
||||
return msg_dict
|
||||
|
||||
def _bytes_to_hex(self, obj):
|
||||
"""Convert bytes/bytearray to hex for JSON serialization."""
|
||||
if isinstance(obj, (bytes, bytearray)):
|
||||
return obj.hex()
|
||||
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
|
||||
|
||||
def update(self):
|
||||
async def update(self):
|
||||
# this is blocking in async context...
|
||||
self.sm.update(0)
|
||||
for service, updated in self.sm.updated.items():
|
||||
@@ -60,10 +51,12 @@ class CerealOutgoingMessageProxy:
|
||||
msg_dict = self.to_json(self.sm[service])
|
||||
mono_time, valid = self.sm.logMonoTime[service], self.sm.valid[service]
|
||||
outgoing_msg = {"type": service, "logMonoTime": mono_time, "valid": valid, "data": msg_dict}
|
||||
serializer = self.serializer.get(service)
|
||||
encoded_msg = json.dumps(outgoing_msg, default=serializer).encode()
|
||||
encoded_msg = json.dumps(outgoing_msg).encode()
|
||||
for channel in self.channels:
|
||||
channel.send(encoded_msg)
|
||||
if isinstance(channel, web.WebSocketResponse):
|
||||
await channel.send_bytes(encoded_msg)
|
||||
else:
|
||||
channel.send(encoded_msg)
|
||||
|
||||
|
||||
class CerealIncomingMessageProxy:
|
||||
@@ -104,7 +97,7 @@ class CerealProxyRunner:
|
||||
|
||||
while True:
|
||||
try:
|
||||
self.proxy.update()
|
||||
await self.proxy.update()
|
||||
except InvalidStateError:
|
||||
self.logger.warning("Cereal outgoing proxy invalid state (connection closed)")
|
||||
break
|
||||
@@ -239,7 +232,7 @@ async def get_stream(request: 'web.Request'):
|
||||
|
||||
stream_dict[session.identifier] = session
|
||||
|
||||
return web.json_response({"sdp": answer.sdp, "type": answer.type})
|
||||
return web.json_response({"sdp": answer.sdp, "type": answer.type}, headers={'Access-Control-Allow-Origin': '*'})
|
||||
|
||||
|
||||
async def get_schema(request: 'web.Request'):
|
||||
@@ -270,13 +263,33 @@ async def on_shutdown(app: 'web.Application'):
|
||||
del app['streams']
|
||||
|
||||
|
||||
|
||||
@web.middleware
|
||||
async def cors_middleware(request, handler):
|
||||
response = await handler(request)
|
||||
response.headers['Access-Control-Allow-Origin'] = '*'
|
||||
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
|
||||
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
|
||||
return response
|
||||
|
||||
async def handle_cors_preflight(request):
|
||||
if request.method == 'OPTIONS':
|
||||
headers = {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
||||
'Access-Control-Max-Age': '86400',
|
||||
}
|
||||
return web.Response(status=200, headers=headers)
|
||||
return await request.app['handler'](request)
|
||||
|
||||
def webrtcd_thread(host: str, port: int, debug: bool):
|
||||
logging.basicConfig(level=logging.CRITICAL, handlers=[logging.StreamHandler()])
|
||||
logging_level = logging.DEBUG if debug else logging.INFO
|
||||
logging.getLogger("WebRTCStream").setLevel(logging_level)
|
||||
logging.getLogger("webrtcd").setLevel(logging_level)
|
||||
|
||||
app = web.Application()
|
||||
app = web.Application(middlewares=[cors_middleware])
|
||||
|
||||
app['streams'] = dict()
|
||||
app['debug'] = debug
|
||||
@@ -284,10 +297,14 @@ def webrtcd_thread(host: str, port: int, debug: bool):
|
||||
app.router.add_post("/stream", get_stream)
|
||||
app.router.add_post("/notify", post_notify)
|
||||
app.router.add_get("/schema", get_schema)
|
||||
app.router.add_route('OPTIONS', '/{tail:.*}', handle_cors_preflight)
|
||||
|
||||
web.run_app(app, host=host, port=port)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="WebRTC daemon")
|
||||
parser.add_argument("--host", type=str, default="0.0.0.0", help="Host to listen on")
|
||||
|
||||
Reference in New Issue
Block a user