fix: address review feedback on the distance unit setting

- server: allow distance_unit as an admin default (+ value validation) so the
  Admin "Default User Settings" toggle persists instead of returning 400
- i18n: add settings.distance to all 20 locales and translate the labels
  through t() instead of hardcoding "Distance"
- route legs: include the unit in the OSRM cache key and recompute on a unit
  switch, so map and sidebar distances refresh and never mix units
- keep wind speed tied to the temperature unit — a distance setting must not
  silently flip existing Fahrenheit users from mph to km/h
- restore the sub-1km metres reading for metric, convert GPX elevation to feet
  for imperial, and format distances with a '.' decimal in every locale
- add units.test.ts
This commit is contained in:
Maurice
2026-06-26 17:45:56 +02:00
committed by Maurice
parent 94dca8cad7
commit 3d65bb0c12
32 changed files with 109 additions and 23 deletions
+1
View File
@@ -51,6 +51,7 @@ const settings: TranslationStrings = {
'settings.auto': 'تلقائي',
'settings.language': 'اللغة',
'settings.temperature': 'وحدة الحرارة',
'settings.distance': 'وحدة المسافة',
'settings.timeFormat': 'تنسيق الوقت',
'settings.bookingLabels': 'تسميات مسارات الحجوزات',
'settings.bookingLabelsHint': 'عرض أسماء المحطات/المطارات على الخريطة. عند الإيقاف، يتم عرض الرمز فقط.',
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automático',
'settings.language': 'Idioma',
'settings.temperature': 'Unidade de temperatura',
'settings.distance': 'Unidade de distância',
'settings.timeFormat': 'Formato de hora',
'settings.blurBookingCodes': 'Ocultar códigos de reserva',
'settings.optimizeFromAccommodation': 'Otimizar rota a partir da hospedagem',
+1
View File
@@ -53,6 +53,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automatické',
'settings.language': 'Jazyk',
'settings.temperature': 'Jednotky teploty',
'settings.distance': 'Jednotky vzdálenosti',
'settings.timeFormat': 'Formát času',
'settings.blurBookingCodes': 'Skrýt rezervační kódy',
'settings.optimizeFromAccommodation': 'Optimalizovat trasu od ubytování',
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automatisch',
'settings.language': 'Sprache',
'settings.temperature': 'Temperatureinheit',
'settings.distance': 'Entfernungseinheit',
'settings.timeFormat': 'Zeitformat',
'settings.bookingLabels': 'Orts-Labels auf Buchungsrouten',
'settings.bookingLabelsHint': 'Zeigt Bahnhofs-/Flughafennamen auf der Karte. Wenn aus, wird nur das Icon angezeigt.',
+1
View File
@@ -53,6 +53,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Auto',
'settings.language': 'Language',
'settings.temperature': 'Temperature Unit',
'settings.distance': 'Distance Unit',
'settings.timeFormat': 'Time Format',
'settings.bookingLabels': 'Booking route labels',
'settings.bookingLabelsHint': 'Show station / airport names on the map. When off, only the icon is shown.',
+1
View File
@@ -55,6 +55,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automático',
'settings.language': 'Idioma',
'settings.temperature': 'Unidad de temperatura',
'settings.distance': 'Unidad de distancia',
'settings.timeFormat': 'Formato de hora',
'settings.blurBookingCodes': 'Difuminar códigos de reserva',
'settings.optimizeFromAccommodation': 'Optimizar la ruta desde el alojamiento',
+1
View File
@@ -56,6 +56,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Auto',
'settings.language': 'Langue',
'settings.temperature': 'Unité de température',
'settings.distance': 'Unité de distance',
'settings.timeFormat': "Format de l'heure",
'settings.blurBookingCodes': 'Masquer les codes de réservation',
'settings.optimizeFromAccommodation': "Optimiser l'itinéraire depuis l'hébergement",
+1
View File
@@ -57,6 +57,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Αυτόματο',
'settings.language': 'Γλώσσα',
'settings.temperature': 'Μονάδα Θερμοκρασίας',
'settings.distance': 'Μονάδα Απόστασης',
'settings.timeFormat': 'Μορφή Ώρας',
'settings.bookingLabels': 'Ετικέτες διαδρομής κρατήσεων',
'settings.bookingLabelsHint':
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automatikus',
'settings.language': 'Nyelv',
'settings.temperature': 'Hőmérséklet egység',
'settings.distance': 'Távolság egység',
'settings.timeFormat': 'Időformátum',
'settings.blurBookingCodes': 'Foglalási kódok elrejtése',
'settings.optimizeFromAccommodation': 'Útvonal optimalizálása a szállástól',
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Otomatis',
'settings.language': 'Bahasa',
'settings.temperature': 'Satuan Suhu',
'settings.distance': 'Satuan Jarak',
'settings.timeFormat': 'Format Waktu',
'settings.blurBookingCodes': 'Sembunyikan Kode Pemesanan',
'settings.optimizeFromAccommodation': 'Optimalkan rute dari akomodasi',
+1
View File
@@ -55,6 +55,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automatica',
'settings.language': 'Lingua',
'settings.temperature': 'Unità di Temperatura',
'settings.distance': 'Unità di Distanza',
'settings.timeFormat': 'Formato Ora',
'settings.blurBookingCodes': 'Nascondi codici di prenotazione',
'settings.optimizeFromAccommodation': "Ottimizza il percorso dall'alloggio",
+1
View File
@@ -52,6 +52,7 @@ const settings: TranslationStrings = {
'settings.auto': '自動',
'settings.language': '言語',
'settings.temperature': '温度単位',
'settings.distance': '距離単位',
'settings.timeFormat': '時刻形式',
'settings.bookingLabels': '予約ルートのラベル',
'settings.bookingLabelsHint': '地図に駅・空港名を表示。オフ時はアイコンのみ。',
+1
View File
@@ -53,6 +53,7 @@ const settings: TranslationStrings = {
'settings.auto': '자동',
'settings.language': '언어',
'settings.temperature': '온도 단위',
'settings.distance': '거리 단위',
'settings.timeFormat': '시간 형식',
'settings.bookingLabels': '예약 경로 레이블',
'settings.bookingLabelsHint': '지도에 역 / 공항 이름을 표시합니다. 끄면 아이콘만 표시됩니다.',
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automatisch',
'settings.language': 'Taal',
'settings.temperature': 'Temperatuureenheid',
'settings.distance': 'Afstandseenheid',
'settings.timeFormat': 'Tijdnotatie',
'settings.blurBookingCodes': 'Boekingscodes vervagen',
'settings.optimizeFromAccommodation': 'Route optimaliseren vanaf accommodatie',
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Automatyczny',
'settings.language': 'Język',
'settings.temperature': 'Jednostka temperatury',
'settings.distance': 'Jednostka odległości',
'settings.timeFormat': 'Format czasu',
'settings.blurBookingCodes': 'Rozmyj kody rezerwacji',
'settings.optimizeFromAccommodation': 'Optymalizuj trasę od zakwaterowania',
+1
View File
@@ -53,6 +53,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Авто',
'settings.language': 'Язык',
'settings.temperature': 'Единица температуры',
'settings.distance': 'Единица расстояния',
'settings.timeFormat': 'Формат времени',
'settings.blurBookingCodes': 'Скрыть коды бронирования',
'settings.optimizeFromAccommodation': 'Оптимизировать маршрут от места проживания',
+1
View File
@@ -53,6 +53,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Otomatik',
'settings.language': 'Dil',
'settings.temperature': 'Sıcaklık Birimi',
'settings.distance': 'Mesafe Birimi',
'settings.timeFormat': 'Saat Biçimi',
'settings.bookingLabels': 'Rezervasyon rota etiketleri',
'settings.bookingLabelsHint': 'Haritada istasyon / havalimanı adlarını göster. Kapalıyken yalnızca simge görünür.',
+1
View File
@@ -54,6 +54,7 @@ const settings: TranslationStrings = {
'settings.auto': 'Авто',
'settings.language': 'Мова',
'settings.temperature': 'Одиниця температури',
'settings.distance': 'Одиниця відстані',
'settings.timeFormat': 'Формат часу',
'settings.blurBookingCodes': 'Приховати коди бронювання',
'settings.optimizeFromAccommodation': 'Оптимізувати маршрут від житла',
+1
View File
@@ -52,6 +52,7 @@ const settings: TranslationStrings = {
'settings.auto': '自動',
'settings.language': '語言',
'settings.temperature': '溫度單位',
'settings.distance': '距離單位',
'settings.timeFormat': '時間格式',
'settings.blurBookingCodes': '模糊預訂程式碼',
'settings.optimizeFromAccommodation': '從住宿地點最佳化路線',
+1
View File
@@ -52,6 +52,7 @@ const settings: TranslationStrings = {
'settings.auto': '自动',
'settings.language': '语言',
'settings.temperature': '温度单位',
'settings.distance': '距离单位',
'settings.timeFormat': '时间格式',
'settings.blurBookingCodes': '模糊预订代码',
'settings.optimizeFromAccommodation': '从住宿地优化路线',