Merge dev into fix/prettier

Brings in the Tours addon and the MikroORM follow-ups. Conflicts were
resolved to dev's content, then every file dev brought in was run through
prettier and eslint --fix so the branch stays uniformly formatted.
This commit is contained in:
Maurice
2026-10-07 15:43:13 +02:00
242 changed files with 22952 additions and 731 deletions
@@ -3,11 +3,44 @@ import {
assignmentEndDayRequestSchema,
assignmentMoveRequestSchema,
assignmentParticipantsRequestSchema,
assignmentSchema,
assignmentTransportRequestSchema,
} from './assignment.schema';
import { describe, it, expect } from 'vitest';
describe('assignment Tours read-model merge', () => {
const ordinary = { id: 1, day_id: 2, place_id: 3, order_index: 0, place: { id: 3, name: 'Place' } };
it('keeps ordinary and legacy track places non-Tours without a facet identity', () => {
expect(assignmentSchema.parse(ordinary).tour_place_id).toBeUndefined();
const legacy = assignmentSchema.parse({ ...ordinary, tour_place_id: null, tour_route_geometry: null });
expect(legacy.tour_place_id).toBeNull();
expect(legacy.tour_route_geometry).toBeNull();
});
it('preserves nullable Tour fields, exclusion and incoming/outgoing segment modes', () => {
const fields = {
tour_place_id: 3,
tour_route_geometry: '[[48,11],[49,12]]',
route_excluded: true,
leg_transport_mode: 'walking',
incoming_leg_transport_mode: 'cycling',
};
expect(assignmentSchema.parse({ ...ordinary, ...fields })).toMatchObject(fields);
expect(assignmentSchema.parse({ ...ordinary, tour_place_id: null, tour_route_geometry: null })).toMatchObject({
tour_place_id: null,
tour_route_geometry: null,
});
});
it('does not copy read-only joined Tours fields into create or move requests', () => {
const joined = { tour_place_id: 3, tour_route_geometry: '[[48,11],[49,12]]' };
expect(assignmentCreateRequestSchema.parse({ place_id: 3, ...joined })).toEqual({ place_id: 3 });
expect(assignmentMoveRequestSchema.parse({ new_day_id: 2, ...joined })).toEqual({ new_day_id: 2 });
});
});
it('requires a boolean for an explicit day end', () => {
expect(assignmentEndDayRequestSchema.parse({ end_day: true })).toEqual({ end_day: true });
expect(assignmentEndDayRequestSchema.parse({ end_day: false })).toEqual({ end_day: false });
@@ -55,6 +55,8 @@ export const assignmentSchema = z.object({
// this row and leaves it to road trip mode, which is the view that needs the
// hotel in the driving chain. Null for every stop a traveller placed.
accommodation_id: z.number().nullable().optional(),
tour_place_id: z.number().nullable().optional(),
tour_route_geometry: z.string().nullable().optional(),
participants: z.array(assignmentParticipantSchema).optional(),
created_at: z.string().optional(),
place: assignmentPlaceSchema,
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+131
View File
@@ -0,0 +1,131 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'الجولات',
'tours.mode.places': 'الأماكن',
'tours.mode.tours': 'الجولات',
'tours.mode.label': 'عرض الإضافة',
'tours.title': 'الجولات',
'tours.subtitle': 'جولات المشي الطويل وغيرها من الجولات اليومية ضمن هذه الرحلة',
'tours.empty.title': 'لا توجد جولات بعد',
'tours.empty.body': 'خطّط لجولة أو استورد ملف GPX للبدء.',
'tours.addToDay': 'إضافة إلى يوم',
'tours.addToDay.comingSoon': 'عيّن الجولات لأحد أيام الرحلة من قائمة الجولات.',
'tours.addToDay.pickDay': 'اختيار يوم',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'استيراد GPX',
'tours.badge.planned': 'مخطّطة في TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'يُرجى الاستخدام بحذر',
'tours.caution.tooltip': 'بيانات الارتفاع أو المقاييس غير مكتملة؛ تم الاستيراد مع تنبيه للحذر',
'tours.import.caution': 'تم الاستيراد مع تنبيه للحذر؛ بيانات الارتفاع أو المقاييس غير مكتملة',
'tours.import.success': 'تم استيراد {count} من الجولات من GPX',
'tours.import.successOne': 'تم استيراد جولة واحدة من GPX',
'tours.import.noTrack': 'لم يُعثر على أثر مسجّل أو مسار في ملف GPX هذا',
'tours.import.error': 'تعذّر استيراد ملف GPX',
'tours.delete.confirmBody':
'هل تريد حذف هذه الجولة نهائيًا؟ ستُحذف مساراتها ونقاطها القابلة للتحرير وتعييناتها للأيام. لا يمكن التراجع عن هذا الإجراء.',
'tours.delete.bulkConfirmBody':
'يتضمن هذا التحديد جولة واحدة على الأقل. ستُحذف جميع الأماكن المحددة نهائيًا ولن يمكن استعادتها. وستُحذف أيضًا مسارات الجولات ونقاطها القابلة للتحرير وتعييناتها للأيام.',
'tours.delete.confirmAction': 'حذف نهائي',
'tours.addedToDay': 'تمت الإضافة إلى اليوم {n}',
'tours.dayRoute.endpointUnknown': 'تعذّر تحديد نقطة نهاية الجولة. قد تكون وصلات المسار التالية غير مكتملة.',
'tours.detail.trackColor': 'لون الأثر المسجّل',
'tours.detail.distance': 'المسافة',
'tours.detail.minAltitude': 'أدنى ارتفاع',
'tours.detail.maxAltitude': 'أعلى ارتفاع',
'tours.detail.ascent': 'إجمالي الصعود',
'tours.detail.descent': 'إجمالي الهبوط',
'tours.detail.difficulty': 'مستوى الصعوبة',
'tours.detail.source': 'المصدر',
'tours.detail.gpxReadOnly': 'جولات GPX متاحة للعرض فقط، ولا يمكن تعديلها في أداة التخطيط بعد.',
'tours.detail.navigationHint': 'تفتح الملاحة نقطة بداية الدرب، ولا توفّر إرشادًا على طول مسار الجولة.',
'tours.planner.title': 'تخطيط جولة',
'tours.planner.newTour': 'تخطيط جولة جديدة',
'tours.planner.neutralTitle': 'تخطيط جولة',
'tours.planner.neutralBody': 'ابدأ جولة جديدة وانقر على الخريطة لتحديد نقاط المسار.',
'tours.planner.newTitle': 'جولة جديدة',
'tours.planner.editTitle': 'تعديل الجولة',
'tours.planner.gpxTitle': 'جولة GPX',
'tours.planner.backToTours': 'العودة إلى الجولات',
'tours.planner.restored': 'تمت استعادة المسودة غير المحفوظة',
'tours.planner.discardChanges': 'تجاهل التغييرات',
'tours.planner.discardUnsaved': 'تجاهل التغييرات غير المحفوظة',
'tours.planner.saveChanges': 'حفظ التغييرات',
'tours.planner.newTourConfirmTitle': 'هل تريد بدء جولة جديدة؟',
'tours.planner.newTourConfirmBody': 'ستُحذف تغييراتك غير المحفوظة على هذه الجولة. لن تتغيّر الجولات المحفوظة.',
'tours.planner.newTourConfirm': 'تجاهل التغييرات وبدء جولة جديدة',
'tours.planner.startingPoint': 'انقر على الخريطة لإضافة نقطة البداية.',
'tours.planner.firstUseDetails':
'أضف نقطة أخرى لحساب المسار. يتم تحديث المسار والارتفاع تلقائيًا؛ احفظ الجولة عندما تصبح جاهزة.',
'tours.planner.collapseElevation': 'طيّ مخطط الارتفاع',
'tours.planner.expandElevation': 'توسيع مخطط الارتفاع',
'tours.planner.name': 'اسم الجولة',
'tours.planner.namePlaceholder': 'جولة مشي بلا اسم',
'tours.planner.mapHint': 'انقر على الخريطة لإضافة نقاط.',
'tours.planner.waypoints': 'نقاط المرور',
'tours.planner.waypointLabel': 'نقطة المرور {n}',
'tours.durationMinutes': '{count} د',
'tours.planner.empty': 'أضف نقطتين على الأقل لحساب مسار للمشي.',
'tours.planner.start': 'البداية',
'tours.planner.via': 'المرور عبر',
'tours.planner.end': 'النهاية',
'tours.planner.moveUp': 'نقل نقطة المرور لأعلى',
'tours.planner.moveDown': 'نقل نقطة المرور لأسفل',
'tours.planner.remove': 'إزالة نقطة المرور',
'tours.planner.undo': 'التراجع عن تعديل نقطة المرور',
'tours.planner.redo': 'إعادة تعديل نقطة المرور',
'tours.planner.discard': 'تجاهل المسودة',
'tours.planner.discardTitle': 'هل تريد تجاهل تغييرات الجولة غير المحفوظة؟',
'tours.planner.discardBody':
'ستُحذف تعديلاتك غير المحفوظة. لن تتغيّر الجولة المحفوظة أو نقاط مرورها أو ملفاتها أو تعييناتها للأيام.',
'tours.planner.save': 'حفظ الجولة',
'tours.planner.saved': 'تم حفظ الجولة',
'tours.planner.planAnother': 'تخطيط جولة أخرى',
'tours.planner.assignToDay': 'تعيين ليوم',
'tours.planner.tripTours': 'جولات هذه الرحلة',
'tours.planner.safetyNote': 'حساب المسارات يساعد على التخطيط، ولا يضمن السلامة.',
'tours.planner.safetyNoteDetails':
'قد تكون وسوم الصعوبة في OSM مفقودة أو غير صحيحة. لا يتم تقييم الطقس أو إغلاق الدروب أو الظروف الحالية.',
'tours.planner.maxDifficulty': 'أقصى مستوى لصعوبة الدرب',
'tours.planner.difficulty.t1': 'T1: المشي الطويل',
'tours.planner.difficulty.t2': 'T2: المشي الجبلي',
'tours.planner.difficulty.t3': 'T3: المشي الجبلي الشاق',
'tours.planner.difficulty.t4': 'T4: المشي في التضاريس الألبية',
'tours.planner.difficulty.t5': 'T5: المشي الشاق في التضاريس الألبية',
'tours.planner.difficulty.t6': 'T6: المشي الصعب في التضاريس الألبية',
'tours.planner.difficulty.t3Warning':
'قد تتضمن مسارات T3 دروبًا جبلية مكشوفة لخطر السقوط أو تتطلب مهارات تقنية عالية. يلزم ثبات القدمين والقدرة على التعامل مع المرتفعات دون خوف.',
'tours.planner.difficulty.alpineTitle': 'هل تريد تفعيل حساب المسارات الألبية؟',
'tours.planner.difficulty.alpineBody':
'تم تفعيل حساب المسارات الألبية. قد تعبر المسارات تضاريس مكشوفة لخطر السقوط أو بلا علامات إرشادية أو صعبة تقنيًا. قد تكون بيانات الصعوبة في OSM مفقودة أو غير صحيحة.',
'tours.planner.difficulty.enable': 'تفعيل حساب المسارات الألبية',
'tours.planner.openFailed': 'تعذّر فتح الجولة المحفوظة للتعديل.',
'tours.planner.status.dirty': 'بانتظار الحساب',
'tours.planner.status.routing': 'جارٍ حساب مسار المشي…',
'tours.planner.status.routingFailed': 'فشل حساب المسار. لا يزال آخر مسار حُسب بنجاح معروضًا.',
'tours.planner.status.elevation': 'جارٍ تحميل الارتفاع…',
'tours.planner.status.elevationFailed': 'بيانات الارتفاع غير متاحة. لا يزال المسار المحسوب معروضًا.',
'tours.planner.status.ready': 'المسار والارتفاع جاهزان',
'tours.planner.status.saving': 'جارٍ الحفظ…',
'tours.planner.status.saveFailed': 'تعذّر حفظ الجولة. لا تزال مسودتك متاحة هنا.',
'tours.planner.retry': 'إعادة المحاولة',
'tours.planner.inspector.title': 'ملخص الجولة',
'tours.planner.inspector.empty': 'تظهر تفاصيل المسار هنا بعد توصيل نقطتي مرور.',
'tours.planner.inspector.distance': 'المسافة',
'tours.planner.inspector.duration': 'مدة المشي',
'tours.planner.inspector.elevation': 'مخطط الارتفاع',
'tours.planner.inspector.profileFocus': 'عند {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'يظهر المخطط عند توفّر بيانات ارتفاع المسار.',
'tours.planner.gpxNoGeometry': 'بيانات الشكل الهندسي للمسار غير متاحة لملف GPX المستورد هذا.',
'tours.planner.mobileHint':
'تخطيط الجولات متاح على الأجهزة اللوحية والحواسيب. يمكنك هنا عرض الجولات المحفوظة وجدولتها.',
'tourTypes.hike': 'مشي طويل',
'tourTypes.bike': 'جولة بالدراجة',
'tourTypes.run': 'جري',
'tourTypes.ski': 'جولة تزلج',
'tourTypes.kayak': 'تجديف بالكاياك',
'tourTypes.walk': 'مشي في المدينة / مشاهدة المعالم',
'tourTypes.food': 'جولة طعام / نبيذ',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -71,6 +72,7 @@ const locale = {
...collection,
...atlas,
...trip,
...tours,
...places,
...inspector,
...reservations,
+133
View File
@@ -0,0 +1,133 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Turlar',
'tours.mode.places': 'Məkanlar',
'tours.mode.tours': 'Turlar',
'tours.mode.label': 'Əlavə etmə görünüşü',
'tours.title': 'Turlar',
'tours.subtitle': 'Bu səyahət üçün yürüşlər və digər birgünlük turlar',
'tours.empty.title': 'Hələ tur yoxdur',
'tours.empty.body': 'Başlamaq üçün tur planlaşdırın və ya GPX faylı idxal edin.',
'tours.addToDay': 'Günə əlavə et',
'tours.addToDay.comingSoon': 'Tur siyahısından turları səyahət gününə təyin edin.',
'tours.addToDay.pickDay': 'Gün seç',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX idxalı',
'tours.badge.planned': 'TREK-də planlaşdırılıb',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'ehtiyatla istifadə edin',
'tours.caution.tooltip': 'Yüksəklik və göstəricilər natamamdır — ehtiyatla idxal edilib',
'tours.import.caution': 'Ehtiyatla idxal edilib — yüksəklik və göstəricilər natamamdır',
'tours.import.success': 'GPX-dən {count} tur idxal edildi',
'tours.import.successOne': 'GPX-dən 1 tur idxal edildi',
'tours.import.noTrack': 'Bu GPX faylında iz və ya marşrut tapılmadı',
'tours.import.error': 'GPX faylını idxal etmək mümkün olmadı',
'tours.delete.confirmBody':
'Bu tur həmişəlik silinsin? Onun marşrutu, redaktə edilə bilən nöqtələri və gün təyinatları silinəcək. Bu əməliyyatı geri qaytarmaq mümkün deyil.',
'tours.delete.bulkConfirmBody':
'Seçimə ən azı bir tur daxildir. Seçilmiş bütün məkanlar həmişəlik silinəcək və bərpa edilə bilməyəcək. Turların marşrutları, redaktə edilə bilən nöqtələri və gün təyinatları da silinəcək.',
'tours.delete.confirmAction': 'Həmişəlik sil',
'tours.addedToDay': '{n}-ci günə əlavə edildi',
'tours.dayRoute.endpointUnknown':
'Turun son nöqtəsini müəyyən etmək mümkün olmadı. Sonrakı bağlantılar natamam ola bilər.',
'tours.detail.trackColor': 'İzin rəngi',
'tours.detail.distance': 'Məsafə',
'tours.detail.minAltitude': 'Minimum yüksəklik',
'tours.detail.maxAltitude': 'Maksimum yüksəklik',
'tours.detail.ascent': 'Yüksəlmə',
'tours.detail.descent': 'Enmə',
'tours.detail.difficulty': 'Çətinlik',
'tours.detail.source': 'Mənbə',
'tours.detail.gpxReadOnly': 'GPX turlarına yalnız baxmaq olar; onları planlaşdırıcıda hələ redaktə etmək olmur.',
'tours.detail.navigationHint': 'Naviqasiya cığırın başlanğıcını açır; marşrut boyunca istiqamət göstərmir.',
'tours.planner.title': 'Tur planlaşdır',
'tours.planner.newTour': 'Yeni tur planlaşdır',
'tours.planner.neutralTitle': 'Tur planlaşdır',
'tours.planner.neutralBody': 'Yeni tur başladın və marşrut nöqtələrini qoymaq üçün xəritəyə klikləyin.',
'tours.planner.newTitle': 'Yeni tur',
'tours.planner.editTitle': 'Turu redaktə et',
'tours.planner.gpxTitle': 'GPX turu',
'tours.planner.backToTours': 'Turlara qayıt',
'tours.planner.restored': 'Saxlanılmamış qaralama bərpa edildi',
'tours.planner.discardChanges': 'Dəyişiklikləri ləğv et',
'tours.planner.discardUnsaved': 'Saxlanılmamış dəyişiklikləri ləğv et',
'tours.planner.saveChanges': 'Dəyişiklikləri saxla',
'tours.planner.newTourConfirmTitle': 'Yeni tur başlansın?',
'tours.planner.newTourConfirmBody':
'Bu turda saxlanılmamış dəyişiklikləriniz ləğv ediləcək. Saxlanılmış turlar dəyişməyəcək.',
'tours.planner.newTourConfirm': 'Dəyişiklikləri ləğv et və yeni tur başlat',
'tours.planner.startingPoint': 'Başlanğıc nöqtəsini əlavə etmək üçün xəritəyə klikləyin.',
'tours.planner.firstUseDetails':
'Marşrutu hesablamaq üçün başqa bir nöqtə əlavə edin. Marşrut və yüksəklik avtomatik yenilənir; hazır olduqda saxlayın.',
'tours.planner.collapseElevation': 'Yüksəklik profilini yığ',
'tours.planner.expandElevation': 'Yüksəklik profilini aç',
'tours.planner.name': 'Turun adı',
'tours.planner.namePlaceholder': 'Adsız yürüş',
'tours.planner.mapHint': 'Nöqtə əlavə etmək üçün xəritəyə klikləyin.',
'tours.planner.waypoints': 'Yol nöqtələri',
'tours.planner.waypointLabel': 'Yol nöqtəsi {n}',
'tours.durationMinutes': '{count} dəq.',
'tours.planner.empty': 'Piyada marşrutunu hesablamaq üçün ən azı iki nöqtə əlavə edin.',
'tours.planner.start': 'Başlanğıc',
'tours.planner.via': 'Aralıq nöqtə',
'tours.planner.end': 'Son',
'tours.planner.moveUp': 'Yol nöqtəsini yuxarı köçür',
'tours.planner.moveDown': 'Yol nöqtəsini aşağı köçür',
'tours.planner.remove': 'Yol nöqtəsini sil',
'tours.planner.undo': 'Yol nöqtəsi dəyişikliyini geri al',
'tours.planner.redo': 'Yol nöqtəsi dəyişikliyini təkrarla',
'tours.planner.discard': 'Qaralamanı ləğv et',
'tours.planner.discardTitle': 'Turun saxlanılmamış dəyişiklikləri ləğv edilsin?',
'tours.planner.discardBody':
'Saxlanılmamış düzəlişləriniz ləğv ediləcək. Saxlanılmış tur, onun yol nöqtələri, faylları və günlərə təyinatları dəyişməyəcək.',
'tours.planner.save': 'Turu saxla',
'tours.planner.saved': 'Tur saxlanıldı',
'tours.planner.planAnother': 'Başqa tur planlaşdır',
'tours.planner.assignToDay': 'Günə təyin et',
'tours.planner.tripTours': 'Bu səyahətin turları',
'tours.planner.safetyNote': 'Marşrutlaşdırma planlaşdırma köməyidir, təhlükəsizlik zəmanəti deyil.',
'tours.planner.safetyNoteDetails':
'OSM çətinlik etiketləri çatışmaya və ya yanlış ola bilər. Hava, yol bağlanmaları və cari şərait qiymətləndirilmir.',
'tours.planner.maxDifficulty': 'Maksimum cığır çətinliyi',
'tours.planner.difficulty.t1': 'T1 — Yürüş',
'tours.planner.difficulty.t2': 'T2 — Dağ yürüşü',
'tours.planner.difficulty.t3': 'T3 — Yüksək hazırlıq tələb edən dağ yürüşü',
'tours.planner.difficulty.t4': 'T4 — Alp yürüşü',
'tours.planner.difficulty.t5': 'T5 — Yüksək hazırlıq tələb edən alp yürüşü',
'tours.planner.difficulty.t6': 'T6 — Çətin alp yürüşü',
'tours.planner.difficulty.t3Warning':
'T3 marşrutlarında uçurum kənarından keçən və ya texniki cəhətdən çətin dağ cığırları ola bilər; ayağı yerə möhkəm basmaq bacarığı və hündürlükdən qorxmamaq tələb olunur.',
'tours.planner.difficulty.alpineTitle': 'Alp marşrutlaşdırması aktivləşdirilsin?',
'tours.planner.difficulty.alpineBody':
'Alp marşrutlaşdırması aktivdir. Marşrutlar uçurum kənarından, işarələnməmiş və ya texniki cəhətdən çətin ərazilərdən keçə bilər. OSM çətinlik məlumatları çatışmaya və ya yanlış ola bilər.',
'tours.planner.difficulty.enable': 'Alp marşrutlaşdırmasını aktivləşdir',
'tours.planner.openFailed': 'Saxlanılmış turu redaktə üçün açmaq mümkün olmadı.',
'tours.planner.status.dirty': 'Hesablama gözlənilir',
'tours.planner.status.routing': 'Piyada marşrutu hesablanır…',
'tours.planner.status.routingFailed': 'Marşrut hesablanmadı. Son uğurlu marşrut hələ göstərilir.',
'tours.planner.status.elevation': 'Yüksəklik yüklənir…',
'tours.planner.status.elevationFailed': 'Yüksəklik əlçatan deyil. Hesablanmış marşrut hələ göstərilir.',
'tours.planner.status.ready': 'Marşrut və yüksəklik hazırdır',
'tours.planner.status.saving': 'Saxlanılır…',
'tours.planner.status.saveFailed': 'Turu saxlamaq mümkün olmadı. Qaralamanız hələ buradadır.',
'tours.planner.retry': 'Yenidən cəhd et',
'tours.planner.inspector.title': 'Turun xülasəsi',
'tours.planner.inspector.empty': 'İki yol nöqtəsi birləşdirildikdən sonra marşrut təfərrüatları burada görünəcək.',
'tours.planner.inspector.distance': 'Məsafə',
'tours.planner.inspector.duration': 'Piyada gediş vaxtı',
'tours.planner.inspector.elevation': 'Yüksəklik profili',
'tours.planner.inspector.profileFocus': '{distance} məsafədə: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Marşrutun yüksəklik məlumatları olduqda profil göstərilir.',
'tours.planner.gpxNoGeometry': 'Bu GPX idxalı üçün marşrut həndəsəsi əlçatan deyil.',
'tours.planner.mobileHint':
'Tur planlaşdırmaq planşet və kompüterdə mümkündür. Burada saxlanılmış turlara baxmaq və onları günlərə təyin etmək olar.',
'tourTypes.hike': 'Yürüş',
'tourTypes.bike': 'Velosiped turu',
'tourTypes.run': 'Qaçış',
'tourTypes.ski': 'Xizək turu',
'tourTypes.kayak': 'Kayak gəzintisi',
'tourTypes.walk': 'Şəhər / görməli yerlər gəzintisi',
'tourTypes.food': 'Yemək/şərab turu',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+135
View File
@@ -0,0 +1,135 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Passeios',
'tours.mode.places': 'Lugares',
'tours.mode.tours': 'Passeios',
'tours.mode.label': 'Adicionar visualização',
'tours.title': 'Passeios',
'tours.subtitle': 'Trilhas e outros passeios de um dia para esta viagem',
'tours.empty.title': 'Nenhum passeio ainda',
'tours.empty.body': 'Planeje um passeio ou importe um arquivo GPX para começar.',
'tours.addToDay': 'Adicionar a um dia',
'tours.addToDay.comingSoon': 'Atribua passeios a um dia da viagem pela lista de passeios.',
'tours.addToDay.pickDay': 'Escolha um dia',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Importação GPX',
'tours.badge.planned': 'planejado no TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'use com cautela',
'tours.caution.tooltip': 'Elevação ou métricas incompletas: importado com ressalvas',
'tours.import.caution': 'Importado com ressalvas: elevação ou métricas incompletas',
'tours.import.success': '{count} passeios importados de GPX',
'tours.import.successOne': '1 passeio importado de GPX',
'tours.import.noTrack': 'Nenhum traçado ou rota encontrado nesse arquivo GPX',
'tours.import.error': 'Não foi possível importar o arquivo GPX',
'tours.delete.confirmBody':
'Excluir este passeio permanentemente? A rota, os pontos editáveis e as atribuições aos dias serão removidos. Esta ação não pode ser desfeita.',
'tours.delete.bulkConfirmBody':
'A seleção inclui pelo menos um passeio. Todos os lugares selecionados serão excluídos permanentemente e não poderão ser restaurados. As rotas, os pontos editáveis e as atribuições aos dias dos passeios também serão removidos.',
'tours.delete.confirmAction': 'Excluir permanentemente',
'tours.addedToDay': 'Adicionado ao dia {n}',
'tours.dayRoute.endpointUnknown':
'Não foi possível determinar o ponto final do passeio. As conexões seguintes podem estar incompletas.',
'tours.detail.trackColor': 'Cor do traçado',
'tours.detail.distance': 'Distância',
'tours.detail.minAltitude': 'Altitude mínima',
'tours.detail.maxAltitude': 'Altitude máxima',
'tours.detail.ascent': 'Ganho de elevação',
'tours.detail.descent': 'Perda de elevação',
'tours.detail.difficulty': 'Dificuldade',
'tours.detail.source': 'Origem',
'tours.detail.gpxReadOnly':
'Os passeios GPX são somente para visualização e ainda não podem ser editados no planejador.',
'tours.detail.navigationHint': 'A navegação abre o início da trilha; ela não orienta ao longo da rota.',
'tours.planner.title': 'Planejar um passeio',
'tours.planner.newTour': 'Planejar novo passeio',
'tours.planner.neutralTitle': 'Planejar um passeio',
'tours.planner.neutralBody': 'Comece um novo passeio e clique no mapa para marcar os pontos do percurso.',
'tours.planner.newTitle': 'Novo passeio',
'tours.planner.editTitle': 'Editar passeio',
'tours.planner.gpxTitle': 'Passeio GPX',
'tours.planner.backToTours': 'Voltar aos passeios',
'tours.planner.restored': 'Rascunho não salvo restaurado',
'tours.planner.discardChanges': 'Descartar alterações',
'tours.planner.discardUnsaved': 'Descartar alterações não salvas',
'tours.planner.saveChanges': 'Salvar alterações',
'tours.planner.newTourConfirmTitle': 'Começar um novo passeio?',
'tours.planner.newTourConfirmBody':
'As alterações não salvas deste passeio serão descartadas. Os passeios salvos não serão alterados.',
'tours.planner.newTourConfirm': 'Descartar e começar novo passeio',
'tours.planner.startingPoint': 'Clique no mapa para adicionar o ponto de partida.',
'tours.planner.firstUseDetails':
'Adicione outro ponto para calcular uma rota. A rota e a elevação são atualizadas automaticamente; salve quando terminar.',
'tours.planner.collapseElevation': 'Recolher perfil de elevação',
'tours.planner.expandElevation': 'Expandir perfil de elevação',
'tours.planner.name': 'Nome do passeio',
'tours.planner.namePlaceholder': 'Trilha sem título',
'tours.planner.mapHint': 'Clique no mapa para adicionar pontos.',
'tours.planner.waypoints': 'Pontos de passagem',
'tours.planner.waypointLabel': 'Ponto de passagem {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Adicione pelo menos dois pontos para calcular uma rota a pé.',
'tours.planner.start': 'Partida',
'tours.planner.via': 'Passagem por',
'tours.planner.end': 'Chegada',
'tours.planner.moveUp': 'Mover ponto de passagem para cima',
'tours.planner.moveDown': 'Mover ponto de passagem para baixo',
'tours.planner.remove': 'Remover ponto de passagem',
'tours.planner.undo': 'Desfazer edição do ponto de passagem',
'tours.planner.redo': 'Refazer edição do ponto de passagem',
'tours.planner.discard': 'Descartar rascunho',
'tours.planner.discardTitle': 'Descartar as alterações não salvas do passeio?',
'tours.planner.discardBody':
'As alterações não salvas serão descartadas. O passeio salvo, seus pontos de passagem, arquivos e atribuições não serão alterados.',
'tours.planner.save': 'Salvar passeio',
'tours.planner.saved': 'Passeio salvo',
'tours.planner.planAnother': 'Planejar outro',
'tours.planner.assignToDay': 'Atribuir a um dia',
'tours.planner.tripTours': 'Passeios desta viagem',
'tours.planner.safetyNote': 'O cálculo de rotas auxilia o planejamento, mas não garante a segurança.',
'tours.planner.safetyNoteDetails':
'As etiquetas de dificuldade do OSM podem estar ausentes ou incorretas. O clima, as interdições e as condições atuais não são avaliados.',
'tours.planner.maxDifficulty': 'Dificuldade máxima da trilha',
'tours.planner.difficulty.t1': 'T1 — Caminhada',
'tours.planner.difficulty.t2': 'T2 — Caminhada em montanha',
'tours.planner.difficulty.t3': 'T3 — Caminhada exigente em montanha',
'tours.planner.difficulty.t4': 'T4 — Caminhada alpina',
'tours.planner.difficulty.t5': 'T5 — Caminhada alpina exigente',
'tours.planner.difficulty.t6': 'T6 — Caminhada alpina difícil',
'tours.planner.difficulty.t3Warning':
'As rotas T3 podem incluir trilhas de montanha expostas ou tecnicamente exigentes que requerem firmeza nos passos e ausência de vertigem em altura.',
'tours.planner.difficulty.alpineTitle': 'Ativar o cálculo de rotas alpinas?',
'tours.planner.difficulty.alpineBody':
'O cálculo de rotas alpinas está ativado. As rotas podem atravessar terrenos expostos, sem sinalização ou tecnicamente difíceis. Os dados de dificuldade do OSM podem estar ausentes ou incorretos.',
'tours.planner.difficulty.enable': 'Ativar rotas alpinas',
'tours.planner.openFailed': 'Não foi possível abrir o passeio salvo para edição.',
'tours.planner.status.dirty': 'Aguardando cálculo',
'tours.planner.status.routing': 'Calculando rota a pé…',
'tours.planner.status.routingFailed': 'O cálculo da rota falhou. A última rota válida continua sendo exibida.',
'tours.planner.status.elevation': 'Carregando elevação…',
'tours.planner.status.elevationFailed': 'A elevação não está disponível. A rota calculada continua sendo exibida.',
'tours.planner.status.ready': 'Rota e elevação prontas',
'tours.planner.status.saving': 'Salvando…',
'tours.planner.status.saveFailed': 'Não foi possível salvar o passeio. Seu rascunho continua disponível.',
'tours.planner.retry': 'Tentar novamente',
'tours.planner.inspector.title': 'Resumo do passeio',
'tours.planner.inspector.empty': 'Os detalhes da rota aparecem aqui após conectar dois pontos de passagem.',
'tours.planner.inspector.distance': 'Distância',
'tours.planner.inspector.duration': 'Tempo de caminhada',
'tours.planner.inspector.elevation': 'Perfil de elevação',
'tours.planner.inspector.profileFocus': 'Em {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'O perfil é exibido quando os dados de elevação da rota estão disponíveis.',
'tours.planner.gpxNoGeometry': 'A geometria da rota não está disponível para esta importação GPX.',
'tours.planner.mobileHint':
'O planejamento de passeios está disponível em tablets e computadores. Aqui você pode visualizar os passeios salvos e atribuí-los a um dia.',
'tourTypes.hike': 'Trilha',
'tourTypes.bike': 'Passeio de bicicleta',
'tourTypes.run': 'Corrida',
'tourTypes.ski': 'Passeio de esqui',
'tourTypes.kayak': 'Passeio de caiaque',
'tourTypes.walk': 'Caminhada urbana / turística',
'tourTypes.food': 'Passeio gastronômico / enológico',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+134
View File
@@ -0,0 +1,134 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Excursions',
'tours.mode.places': 'Llocs',
'tours.mode.tours': 'Excursions',
'tours.mode.label': 'Afegeix una vista',
'tours.title': 'Excursions',
'tours.subtitle': "Rutes de senderisme i altres excursions d'un dia per a aquest viatge",
'tours.empty.title': 'Encara no hi ha excursions',
'tours.empty.body': 'Planifica una excursió o importa un fitxer GPX per començar.',
'tours.addToDay': 'Afegeix a un dia',
'tours.addToDay.comingSoon': "Assigna excursions a un dia del viatge des de la llista d'excursions.",
'tours.addToDay.pickDay': 'Tria un dia',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Importació GPX',
'tours.badge.planned': 'planificada a TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'fes-la servir amb precaució',
'tours.caution.tooltip': 'Altitud o mètriques incompletes: importada amb reserves',
'tours.import.caution': 'Importada amb reserves: altitud o mètriques incompletes',
'tours.import.success': '{count} excursions importades de GPX',
'tours.import.successOne': '1 excursió importada de GPX',
'tours.import.noTrack': "No s'ha trobat cap traça ni ruta en aquest fitxer GPX",
'tours.import.error': "No s'ha pogut importar el fitxer GPX",
'tours.delete.confirmBody':
'Vols eliminar aquest itinerari permanentment? Se n’eliminaran la ruta, els punts editables i les assignacions als dies. Aquesta acció no es pot desfer.',
'tours.delete.bulkConfirmBody':
'La selecció inclou almenys un itinerari. Tots els llocs seleccionats s’eliminaran permanentment i no es podran restaurar. També se n’eliminaran les rutes, els punts editables i les assignacions als dies.',
'tours.delete.confirmAction': 'Elimina permanentment',
'tours.addedToDay': 'Afegida al dia {n}',
'tours.dayRoute.endpointUnknown':
"No s'ha pogut determinar el punt final de l'excursió. Les connexions posteriors poden ser incompletes.",
'tours.detail.trackColor': 'Color de la traça',
'tours.detail.distance': 'Distància',
'tours.detail.minAltitude': 'Altitud mínima',
'tours.detail.maxAltitude': 'Altitud màxima',
'tours.detail.ascent': 'Desnivell positiu',
'tours.detail.descent': 'Desnivell negatiu',
'tours.detail.difficulty': 'Dificultat',
'tours.detail.source': 'Origen',
'tours.detail.gpxReadOnly': 'Les excursions GPX són de només lectura i encara no es poden editar al planificador.',
'tours.detail.navigationHint': "La navegació obre el punt d'inici del sender; no guia al llarg de la ruta.",
'tours.planner.title': 'Planifica una excursió',
'tours.planner.newTour': 'Planifica una nova excursió',
'tours.planner.neutralTitle': 'Planifica una excursió',
'tours.planner.neutralBody': 'Comença una ruta nova i fes clic al mapa per marcar-ne els punts.',
'tours.planner.newTitle': 'Nova excursió',
'tours.planner.editTitle': 'Edita excursió',
'tours.planner.gpxTitle': 'Excursió GPX',
'tours.planner.backToTours': 'Torna a excursions',
'tours.planner.restored': 'Esborrany sense desar restaurat',
'tours.planner.discardChanges': 'Descarta els canvis',
'tours.planner.discardUnsaved': 'Descarta els canvis sense desar',
'tours.planner.saveChanges': 'Desa els canvis',
'tours.planner.newTourConfirmTitle': 'Vols començar una nova excursió?',
'tours.planner.newTourConfirmBody':
"Es descartaran els canvis sense desar d'aquesta excursió. Les excursions desades no es modificaran.",
'tours.planner.newTourConfirm': 'Descarta i comença una nova excursió',
'tours.planner.startingPoint': "Fes clic al mapa per afegir el punt d'inici.",
'tours.planner.firstUseDetails':
"Afegeix un altre punt per calcular una ruta. La ruta i l'altitud s'actualitzen automàticament; desa quan hagis acabat.",
'tours.planner.collapseElevation': "Replega el perfil d'altitud",
'tours.planner.expandElevation': "Desplega el perfil d'altitud",
'tours.planner.name': "Nom de l'excursió",
'tours.planner.namePlaceholder': 'Ruta de senderisme sense títol',
'tours.planner.mapHint': 'Fes clic al mapa per afegir punts.',
'tours.planner.waypoints': 'Punts de pas',
'tours.planner.waypointLabel': 'Punt de pas {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Afegeix almenys dos punts per calcular una ruta a peu.',
'tours.planner.start': 'Inici',
'tours.planner.via': 'Pas per',
'tours.planner.end': 'Final',
'tours.planner.moveUp': 'Mou el punt de pas amunt',
'tours.planner.moveDown': 'Mou el punt de pas avall',
'tours.planner.remove': 'Elimina el punt de pas',
'tours.planner.undo': 'Desfés el canvi al punt de pas',
'tours.planner.redo': 'Refés el canvi al punt de pas',
'tours.planner.discard': "Descarta l'esborrany",
'tours.planner.discardTitle': "Vols descartar els canvis sense desar de l'excursió?",
'tours.planner.discardBody':
"Es descartaran els canvis sense desar. L'excursió desada, els seus punts de pas, fitxers i assignacions no es modificaran.",
'tours.planner.save': 'Desa excursió',
'tours.planner.saved': 'Excursió desada',
'tours.planner.planAnother': "Planifica'n una altra",
'tours.planner.assignToDay': 'Assigna a un dia',
'tours.planner.tripTours': "Excursions d'aquest viatge",
'tours.planner.safetyNote': 'El càlcul de rutes ajuda a planificar, però no garanteix la seguretat.',
'tours.planner.safetyNoteDetails':
"Les etiquetes de dificultat d'OSM poden faltar o ser incorrectes. No s'avaluen el temps, els tancaments ni les condicions actuals.",
'tours.planner.maxDifficulty': 'Dificultat màxima del sender',
'tours.planner.difficulty.t1': 'T1 — Senderisme',
'tours.planner.difficulty.t2': 'T2 — Senderisme de muntanya',
'tours.planner.difficulty.t3': 'T3 — Senderisme de muntanya exigent',
'tours.planner.difficulty.t4': 'T4 — Senderisme alpí',
'tours.planner.difficulty.t5': 'T5 — Senderisme alpí exigent',
'tours.planner.difficulty.t6': 'T6 — Senderisme alpí difícil',
'tours.planner.difficulty.t3Warning':
'Les rutes T3 poden incloure senders de muntanya exposats o tècnicament exigents que requereixen una trepitjada segura i no tenir vertigen.',
'tours.planner.difficulty.alpineTitle': 'Vols activar les rutes alpines?',
'tours.planner.difficulty.alpineBody':
"El càlcul de rutes alpines està activat. Les rutes poden travessar terrenys exposats, sense senyalitzar o tècnicament difícils. Les dades de dificultat d'OSM poden faltar o ser incorrectes.",
'tours.planner.difficulty.enable': 'Activa les rutes alpines',
'tours.planner.openFailed': "No s'ha pogut obrir l'excursió desada per editar-la.",
'tours.planner.status.dirty': 'Pendent de càlcul',
'tours.planner.status.routing': 'Calculant ruta a peu…',
'tours.planner.status.routingFailed': "El càlcul de la ruta ha fallat. Es continua mostrant l'última ruta vàlida.",
'tours.planner.status.elevation': 'Carregant altitud…',
'tours.planner.status.elevationFailed': "L'altitud no està disponible. Es continua mostrant la ruta calculada.",
'tours.planner.status.ready': 'Ruta i altitud a punt',
'tours.planner.status.saving': 'Desant…',
'tours.planner.status.saveFailed': "No s'ha pogut desar l'excursió. L'esborrany continua disponible.",
'tours.planner.retry': 'Torna-ho a provar',
'tours.planner.inspector.title': "Resum de l'excursió",
'tours.planner.inspector.empty': 'Els detalls de la ruta apareixen aquí després de connectar dos punts de pas.',
'tours.planner.inspector.distance': 'Distància',
'tours.planner.inspector.duration': 'Temps a peu',
'tours.planner.inspector.elevation': "Perfil d'altitud",
'tours.planner.inspector.profileFocus': 'A {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
"El perfil es mostra quan hi ha dades d'altitud de la ruta disponibles.",
'tours.planner.gpxNoGeometry': 'La geometria de la ruta no està disponible per a aquesta importació GPX.',
'tours.planner.mobileHint':
'La planificació d’excursions està disponible en tauletes i ordinadors. Aquí pots consultar les excursions desades i assignar-les a un dia.',
'tourTypes.hike': 'Senderisme',
'tourTypes.bike': 'Ruta en bicicleta',
'tourTypes.run': 'Córrer',
'tourTypes.ski': 'Esquí de muntanya',
'tourTypes.kayak': 'Ruta en caiac',
'tourTypes.walk': 'Passeig urbà / turístic',
'tourTypes.food': 'Ruta gastronòmica / enològica',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+131
View File
@@ -0,0 +1,131 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Výlety',
'tours.mode.places': 'Místa',
'tours.mode.tours': 'Výlety',
'tours.mode.label': 'Zobrazení pro přidávání',
'tours.title': 'Výlety',
'tours.subtitle': 'Pěší túry a další jednodenní výlety během této cesty',
'tours.empty.title': 'Zatím žádné výlety',
'tours.empty.body': 'Začněte naplánováním výletu nebo importem souboru GPX.',
'tours.addToDay': 'Přidat ke dni',
'tours.addToDay.comingSoon': 'Přiřaďte výlety ke dni cesty ze seznamu výletů.',
'tours.addToDay.pickDay': 'Vyberte den',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Import GPX',
'tours.badge.planned': 'naplánováno v TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'používejte s opatrností',
'tours.caution.tooltip': 'Neúplné výškové údaje nebo metriky – importováno s výhradou',
'tours.import.caution': 'Importováno s výhradou – neúplné výškové údaje nebo metriky',
'tours.import.success': 'Počet výletů importovaných z GPX: {count}',
'tours.import.successOne': 'Z GPX byl importován 1 výlet',
'tours.import.noTrack': 'V tomto souboru GPX nebyla nalezena stopa ani trasa',
'tours.import.error': 'Soubor GPX se nepodařilo importovat',
'tours.delete.confirmBody':
'Opravdu chcete tento výlet trvale odstranit? Jeho trasu, upravitelné body a přiřazení ke dnům odstraníte. Tuto akci nelze vrátit zpět.',
'tours.delete.bulkConfirmBody':
'Výběr obsahuje alespoň jeden výlet. Všechna vybraná místa budou trvale odstraněna a nepůjde je obnovit. Odstraní se také trasy, upravitelné body a přiřazení výletů ke dnům.',
'tours.delete.confirmAction': 'Trvale odstranit',
'tours.addedToDay': 'Přidáno ke dni {n}',
'tours.dayRoute.endpointUnknown': 'Koncový bod výletu se nepodařilo určit. Navazující úseky mohou být neúplné.',
'tours.detail.trackColor': 'Barva stopy',
'tours.detail.distance': 'Vzdálenost',
'tours.detail.minAltitude': 'Minimální nadmořská výška',
'tours.detail.maxAltitude': 'Maximální nadmořská výška',
'tours.detail.ascent': 'Stoupání',
'tours.detail.descent': 'Klesání',
'tours.detail.difficulty': 'Obtížnost',
'tours.detail.source': 'Zdroj',
'tours.detail.gpxReadOnly': 'Výlety GPX lze pouze prohlížet; v plánovači je zatím nelze upravovat.',
'tours.detail.navigationHint': 'Navigace otevře výchozí bod túry; nevede po její trase.',
'tours.planner.title': 'Naplánovat výlet',
'tours.planner.newTour': 'Naplánovat nový výlet',
'tours.planner.neutralTitle': 'Naplánovat výlet',
'tours.planner.neutralBody': 'Začněte novou túru a kliknutím do mapy umístěte její body.',
'tours.planner.newTitle': 'Nový výlet',
'tours.planner.editTitle': 'Upravit výlet',
'tours.planner.gpxTitle': 'Výlet GPX',
'tours.planner.backToTours': 'Zpět na výlety',
'tours.planner.restored': 'Neuložený koncept obnoven',
'tours.planner.discardChanges': 'Zahodit změny',
'tours.planner.discardUnsaved': 'Zahodit neuložené změny',
'tours.planner.saveChanges': 'Uložit změny',
'tours.planner.newTourConfirmTitle': 'Začít nový výlet?',
'tours.planner.newTourConfirmBody': 'Neuložené změny tohoto výletu budou zahozeny. Uložené výlety se nezmění.',
'tours.planner.newTourConfirm': 'Zahodit změny a začít nový výlet',
'tours.planner.startingPoint': 'Kliknutím na mapu přidejte výchozí bod.',
'tours.planner.firstUseDetails':
'Přidejte další bod pro výpočet trasy. Trasa a výškové údaje se aktualizují automaticky; hotový výlet uložte.',
'tours.planner.collapseElevation': 'Sbalit výškový profil',
'tours.planner.expandElevation': 'Rozbalit výškový profil',
'tours.planner.name': 'Název výletu',
'tours.planner.namePlaceholder': 'Túra bez názvu',
'tours.planner.mapHint': 'Kliknutím do mapy přidáte body.',
'tours.planner.waypoints': 'Průjezdní body',
'tours.planner.waypointLabel': 'Bod {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Pro výpočet pěší trasy přidejte alespoň dva body.',
'tours.planner.start': 'Start',
'tours.planner.via': 'Přes',
'tours.planner.end': 'Cíl',
'tours.planner.moveUp': 'Posunout bod nahoru',
'tours.planner.moveDown': 'Posunout bod dolů',
'tours.planner.remove': 'Odstranit bod',
'tours.planner.undo': 'Vrátit úpravu bodu',
'tours.planner.redo': 'Zopakovat úpravu bodu',
'tours.planner.discard': 'Zahodit koncept',
'tours.planner.discardTitle': 'Zahodit neuložené změny výletu?',
'tours.planner.discardBody':
'Neuložené úpravy budou zahozeny. Uložený výlet, jeho body, soubory a přiřazení se nezmění.',
'tours.planner.save': 'Uložit výlet',
'tours.planner.saved': 'Výlet uložen',
'tours.planner.planAnother': 'Naplánovat další',
'tours.planner.assignToDay': 'Přiřadit ke dni',
'tours.planner.tripTours': 'Výlety této cesty',
'tours.planner.safetyNote': 'Výpočet trasy pomáhá s plánováním, nezaručuje bezpečnost.',
'tours.planner.safetyNoteDetails':
'Značky obtížnosti OSM mohou chybět nebo být nesprávné. Počasí, uzavírky a aktuální podmínky se nevyhodnocují.',
'tours.planner.maxDifficulty': 'Maximální obtížnost stezky',
'tours.planner.difficulty.t1': 'T1 – Pěší turistika',
'tours.planner.difficulty.t2': 'T2 – Horská turistika',
'tours.planner.difficulty.t3': 'T3 – Náročná horská turistika',
'tours.planner.difficulty.t4': 'T4 – Vysokohorská turistika',
'tours.planner.difficulty.t5': 'T5 – Náročná vysokohorská turistika',
'tours.planner.difficulty.t6': 'T6 – Obtížná vysokohorská turistika',
'tours.planner.difficulty.t3Warning':
'Trasy T3 mohou vést po exponovaných nebo technicky náročných horských stezkách, které vyžadují jistý krok a odolnost vůči závratím z výšek.',
'tours.planner.difficulty.alpineTitle': 'Povolit vysokohorské trasy?',
'tours.planner.difficulty.alpineBody':
'Vysokohorské trasy jsou povoleny. Mohou vést exponovaným, neznačeným nebo technicky obtížným terénem. Údaje o obtížnosti v OSM mohou chybět nebo být nesprávné.',
'tours.planner.difficulty.enable': 'Povolit vysokohorské trasy',
'tours.planner.openFailed': 'Uložený výlet se nepodařilo otevřít pro úpravy.',
'tours.planner.status.dirty': 'Čeká na výpočet',
'tours.planner.status.routing': 'Výpočet pěší trasy…',
'tours.planner.status.routingFailed': 'Výpočet trasy selhal. Stále se zobrazuje poslední platná trasa.',
'tours.planner.status.elevation': 'Načítání výškových údajů…',
'tours.planner.status.elevationFailed': 'Výškové údaje nejsou dostupné. Vypočtená trasa se stále zobrazuje.',
'tours.planner.status.ready': 'Trasa a výškové údaje jsou připraveny',
'tours.planner.status.saving': 'Ukládání…',
'tours.planner.status.saveFailed': 'Výlet se nepodařilo uložit. Koncept zůstává zachován.',
'tours.planner.retry': 'Zkusit znovu',
'tours.planner.inspector.title': 'Přehled výletu',
'tours.planner.inspector.empty': 'Podrobnosti trasy se zde zobrazí po propojení dvou bodů.',
'tours.planner.inspector.distance': 'Vzdálenost',
'tours.planner.inspector.duration': 'Doba chůze',
'tours.planner.inspector.elevation': 'Výškový profil',
'tours.planner.inspector.profileFocus': 'Ve vzdálenosti {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Profil se zobrazí, až budou k dispozici výškové údaje trasy.',
'tours.planner.gpxNoGeometry': 'Pro tento import GPX není dostupná geometrie trasy.',
'tours.planner.mobileHint':
'Plánování výletů je dostupné na tabletu a počítači. Zde lze uložené výlety prohlížet a přiřazovat ke dnům.',
'tourTypes.hike': 'Pěší túra',
'tourTypes.bike': 'Cyklovýlet',
'tourTypes.run': 'Běh',
'tourTypes.ski': 'Skialpinistická túra',
'tourTypes.kayak': 'Kajak',
'tourTypes.walk': 'Procházka městem / po památkách',
'tourTypes.food': 'Gastronomický / vinařský výlet',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+136
View File
@@ -0,0 +1,136 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Touren',
'tours.mode.places': 'Orte',
'tours.mode.tours': 'Touren',
'tours.mode.label': 'Ansicht zum Hinzufügen',
'tours.title': 'Touren',
'tours.subtitle': 'Wanderungen und andere Tagestouren dieser Reise',
'tours.empty.title': 'Noch keine Touren',
'tours.empty.body': 'Plane eine Tour oder importiere eine GPX-Datei.',
'tours.addToDay': 'Zum Tag hinzufügen',
'tours.addToDay.comingSoon': 'Ordne Touren über die Tourenliste einem Reisetag zu.',
'tours.addToDay.pickDay': 'Tag auswählen',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX-Import',
'tours.badge.planned': 'in TREK geplant',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'mit Vorsicht verwenden',
'tours.caution.tooltip': 'Höhendaten oder Streckenwerte unvollständig – mit Vorsicht importiert',
'tours.import.caution': 'Mit Vorsicht importiert – Höhendaten oder Streckenwerte unvollständig',
'tours.import.success': '{count} Touren aus GPX importiert',
'tours.import.successOne': '1 Tour aus GPX importiert',
'tours.import.noTrack': 'Keine Strecke oder Route in dieser GPX-Datei gefunden',
'tours.import.error': 'GPX-Datei konnte nicht importiert werden',
'tours.delete.confirmBody':
'Diese Tour dauerhaft löschen? Ihre Route, bearbeitbaren Wegpunkte und Tageszuweisungen werden entfernt. Dieser Vorgang kann nicht rückgängig gemacht werden.',
'tours.delete.bulkConfirmBody':
'Diese Auswahl enthält mindestens eine Tour. Alle ausgewählten Orte werden dauerhaft gelöscht und können nicht wiederhergestellt werden. Tourrouten, bearbeitbare Wegpunkte und Tageszuweisungen werden ebenfalls entfernt.',
'tours.delete.confirmAction': 'Dauerhaft löschen',
'tours.addedToDay': 'Zu Tag {n} hinzugefügt',
'tours.dayRoute.endpointUnknown':
'Der Endpunkt der Tour konnte nicht ermittelt werden. Folgende Verbindungen sind möglicherweise unvollständig.',
'tours.detail.trackColor': 'Streckenfarbe',
'tours.detail.distance': 'Strecke',
'tours.detail.minAltitude': 'Niedrigster Punkt',
'tours.detail.maxAltitude': 'Höchster Punkt',
'tours.detail.ascent': 'Aufstieg',
'tours.detail.descent': 'Abstieg',
'tours.detail.difficulty': 'Schwierigkeit',
'tours.detail.source': 'Quelle',
'tours.detail.gpxReadOnly': 'GPX-Touren sind schreibgeschützt und können im Planer noch nicht bearbeitet werden.',
'tours.detail.navigationHint': 'Die Navigation führt zum Startpunkt, nicht entlang der Tour.',
'tours.planner.title': 'Tour planen',
'tours.planner.newTour': 'Neue Tour planen',
'tours.planner.neutralTitle': 'Tour planen',
'tours.planner.neutralBody': 'Starte eine neue Tour und klicke auf die Karte, um die Wegpunkte zu setzen.',
'tours.planner.newTitle': 'Neue Tour',
'tours.planner.editTitle': 'Tour bearbeiten',
'tours.planner.gpxTitle': 'GPX-Tour',
'tours.planner.backToTours': 'Zurück zu den Touren',
'tours.planner.restored': 'Ungespeicherter Entwurf wiederhergestellt',
'tours.planner.discardChanges': 'Änderungen verwerfen',
'tours.planner.discardUnsaved': 'Ungespeicherte Änderungen verwerfen',
'tours.planner.saveChanges': 'Änderungen speichern',
'tours.planner.newTourConfirmTitle': 'Neue Tour beginnen?',
'tours.planner.newTourConfirmBody':
'Ungespeicherte Änderungen an dieser Tour gehen verloren. Gespeicherte Touren bleiben erhalten.',
'tours.planner.newTourConfirm': 'Änderungen verwerfen und neue Tour beginnen',
'tours.planner.startingPoint': 'Klicke auf die Karte, um deinen Startpunkt zu setzen.',
'tours.planner.firstUseDetails':
'Setze einen weiteren Punkt, um eine Route zu berechnen. Route und Höhenprofil werden automatisch aktualisiert. Speichere die Tour, wenn sie fertig ist.',
'tours.planner.collapseElevation': 'Höhenprofil einklappen',
'tours.planner.expandElevation': 'Höhenprofil ausklappen',
'tours.planner.name': 'Name der Tour',
'tours.planner.namePlaceholder': 'Wanderung ohne Titel',
'tours.planner.mapHint': 'Klicke auf die Karte, um Punkte zu setzen.',
'tours.planner.waypoints': 'Wegpunkte',
'tours.planner.waypointLabel': 'Wegpunkt {n}',
'tours.durationMinutes': '{count} Min.',
'tours.planner.empty': 'Setze mindestens zwei Punkte, um eine Wanderroute zu berechnen.',
'tours.planner.start': 'Start',
'tours.planner.via': 'Zwischenstopp',
'tours.planner.end': 'Ziel',
'tours.planner.moveUp': 'Wegpunkt nach oben verschieben',
'tours.planner.moveDown': 'Wegpunkt nach unten verschieben',
'tours.planner.remove': 'Wegpunkt entfernen',
'tours.planner.undo': 'Wegpunkt-Änderung rückgängig machen',
'tours.planner.redo': 'Wegpunkt-Änderung wiederholen',
'tours.planner.discard': 'Entwurf verwerfen',
'tours.planner.discardTitle': 'Ungespeicherte Änderungen an der Tour verwerfen?',
'tours.planner.discardBody':
'Ungespeicherte Änderungen gehen verloren. Die gespeicherte Tour, ihre Wegpunkte, Dateien und Tageszuordnungen bleiben erhalten.',
'tours.planner.save': 'Tour speichern',
'tours.planner.saved': 'Tour gespeichert',
'tours.planner.planAnother': 'Weitere Tour planen',
'tours.planner.assignToDay': 'Einem Tag zuordnen',
'tours.planner.tripTours': 'Touren dieser Reise',
'tours.planner.safetyNote': 'TREK hilft bei der Planung, bewertet aber nicht die Sicherheit einer Route.',
'tours.planner.safetyNoteDetails':
'OSM-Angaben zur Schwierigkeit können fehlen oder falsch sein. Wetter, Sperrungen und aktuelle Bedingungen werden nicht berücksichtigt.',
'tours.planner.maxDifficulty': 'Maximale Wegschwierigkeit',
'tours.planner.difficulty.t1': 'T1 – Wandern',
'tours.planner.difficulty.t2': 'T2 – Bergwandern',
'tours.planner.difficulty.t3': 'T3 – Anspruchsvolles Bergwandern',
'tours.planner.difficulty.t4': 'T4 – Alpinwandern',
'tours.planner.difficulty.t5': 'T5 – Anspruchsvolles Alpinwandern',
'tours.planner.difficulty.t6': 'T6 – Schwieriges Alpinwandern',
'tours.planner.difficulty.t3Warning':
'T3-Routen können ausgesetzte oder technisch anspruchsvolle Bergwege enthalten. Trittsicherheit und Schwindelfreiheit sind erforderlich.',
'tours.planner.difficulty.alpineTitle': 'Alpine Routenplanung aktivieren?',
'tours.planner.difficulty.alpineBody':
'Alpine Routen können durch ausgesetztes, unmarkiertes oder technisch schwieriges Gelände führen. OSM-Angaben zur Schwierigkeit können fehlen oder falsch sein.',
'tours.planner.difficulty.enable': 'Alpine Routenplanung aktivieren',
'tours.planner.openFailed': 'Die gespeicherte Tour konnte nicht zur Bearbeitung geöffnet werden.',
'tours.planner.status.dirty': 'Berechnung ausstehend',
'tours.planner.status.routing': 'Wanderroute wird berechnet...',
'tours.planner.status.routingFailed':
'Route konnte nicht berechnet werden. Die letzte gültige Route bleibt sichtbar.',
'tours.planner.status.elevation': 'Höhendaten werden geladen...',
'tours.planner.status.elevationFailed': 'Höhendaten sind nicht verfügbar. Die berechnete Route bleibt sichtbar.',
'tours.planner.status.ready': 'Route und Höhendaten bereit',
'tours.planner.status.saving': 'Tour wird gespeichert...',
'tours.planner.status.saveFailed': 'Tour konnte nicht gespeichert werden. Dein Entwurf ist weiterhin vorhanden.',
'tours.planner.retry': 'Erneut versuchen',
'tours.planner.inspector.title': 'Tourenübersicht',
'tours.planner.inspector.empty': 'Routendetails erscheinen, sobald zwei Wegpunkte verbunden sind.',
'tours.planner.inspector.distance': 'Strecke',
'tours.planner.inspector.duration': 'Gehzeit',
'tours.planner.inspector.elevation': 'Höhenprofil',
'tours.planner.inspector.profileFocus': 'Bei {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'Das Höhenprofil erscheint, sobald Höhendaten für die Route verfügbar sind.',
'tours.planner.gpxNoGeometry': 'Für diesen GPX-Import sind keine Routendaten verfügbar.',
'tours.planner.mobileHint':
'Touren planen kannst du auf einem Tablet oder am Computer. Hier kannst du gespeicherte Touren ansehen und zuordnen.',
'tourTypes.hike': 'Wanderung',
'tourTypes.bike': 'Radtour',
'tourTypes.run': 'Lauf',
'tourTypes.ski': 'Skitour',
'tourTypes.kayak': 'Kajaktour',
'tourTypes.walk': 'Stadt- und Spaziergang',
'tourTypes.food': 'Genusstour',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+132
View File
@@ -0,0 +1,132 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Tours',
'tours.mode.places': 'Places',
'tours.mode.tours': 'Tours',
'tours.mode.label': 'Add view',
'tours.title': 'Tours',
'tours.subtitle': 'Hikes and other single-day tours for this trip',
'tours.empty.title': 'No tours yet',
'tours.empty.body': 'Plan a tour or import a GPX file to get started.',
'tours.addToDay': 'Add to day',
'tours.addToDay.comingSoon': 'Assign tours to a trip day from the tour list.',
'tours.addToDay.pickDay': 'Pick a day',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX import',
'tours.badge.planned': 'planned in TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'use with caution',
'tours.caution.tooltip': 'Elevation/metrics incomplete — imported with caution',
'tours.import.caution': 'Imported with caution — elevation/metrics incomplete',
'tours.import.success': '{count} tours imported from GPX',
'tours.import.successOne': '1 tour imported from GPX',
'tours.import.noTrack': 'No track or route found in that GPX file',
'tours.import.error': 'Could not import GPX file',
'tours.delete.confirmBody':
'Delete this Tour permanently? Its route, editable waypoints and day assignments will be removed. This action cannot be undone.',
'tours.delete.bulkConfirmBody':
'This selection includes at least one Tour. All selected places will be deleted permanently and cannot be restored. Tour routes, editable waypoints and day assignments will also be removed.',
'tours.delete.confirmAction': 'Delete permanently',
'tours.addedToDay': 'Added to day {n}',
'tours.dayRoute.endpointUnknown': 'Tour endpoint could not be determined. Following connections may be incomplete.',
'tours.detail.trackColor': 'Track colour',
'tours.detail.distance': 'Distance',
'tours.detail.minAltitude': 'Minimum altitude',
'tours.detail.maxAltitude': 'Maximum altitude',
'tours.detail.ascent': 'Ascent',
'tours.detail.descent': 'Descent',
'tours.detail.difficulty': 'Difficulty',
'tours.detail.source': 'Source',
'tours.detail.gpxReadOnly': 'GPX tours are view-only and cannot be edited in the planner yet.',
'tours.detail.navigationHint': 'Navigation opens the trailhead; it does not navigate along the route.',
'tours.planner.title': 'Plan a tour',
'tours.planner.newTour': 'Plan new tour',
'tours.planner.neutralTitle': 'Plan a tour',
'tours.planner.neutralBody': 'Start a new tour and click the map to place its waypoints.',
'tours.planner.newTitle': 'New tour',
'tours.planner.editTitle': 'Edit tour',
'tours.planner.gpxTitle': 'GPX tour',
'tours.planner.backToTours': 'Back to Tours',
'tours.planner.restored': 'Unsaved draft restored',
'tours.planner.discardChanges': 'Discard changes',
'tours.planner.discardUnsaved': 'Discard unsaved changes',
'tours.planner.saveChanges': 'Save changes',
'tours.planner.newTourConfirmTitle': 'Start a new tour?',
'tours.planner.newTourConfirmBody':
'Your unsaved changes to this tour will be discarded. Saved tours will not be changed.',
'tours.planner.newTourConfirm': 'Discard changes and start new tour',
'tours.planner.startingPoint': 'Click the map to add your starting point.',
'tours.planner.firstUseDetails':
'Add another point to calculate a route. The route and elevation update automatically; save when ready.',
'tours.planner.collapseElevation': 'Collapse elevation profile',
'tours.planner.expandElevation': 'Expand elevation profile',
'tours.planner.name': 'Tour name',
'tours.planner.namePlaceholder': 'Untitled hike',
'tours.planner.mapHint': 'Click the map to add points.',
'tours.planner.waypoints': 'Waypoints',
'tours.planner.waypointLabel': 'Waypoint {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Add at least two points to calculate a walking route.',
'tours.planner.start': 'Start',
'tours.planner.via': 'Via',
'tours.planner.end': 'End',
'tours.planner.moveUp': 'Move waypoint up',
'tours.planner.moveDown': 'Move waypoint down',
'tours.planner.remove': 'Remove waypoint',
'tours.planner.undo': 'Undo waypoint edit',
'tours.planner.redo': 'Redo waypoint edit',
'tours.planner.discard': 'Discard draft',
'tours.planner.discardTitle': 'Discard unsaved tour changes?',
'tours.planner.discardBody':
'Your unsaved edits will be discarded. The saved Tour, its waypoints, files and assignments will not be changed.',
'tours.planner.save': 'Save tour',
'tours.planner.saved': 'Tour saved',
'tours.planner.planAnother': 'Plan another',
'tours.planner.assignToDay': 'Assign to a day',
'tours.planner.tripTours': 'Tours of this trip',
'tours.planner.safetyNote': 'Routing is planning assistance, not a safety guarantee.',
'tours.planner.safetyNoteDetails':
'OSM difficulty tags may be missing or incorrect. Weather, closures and current conditions are not evaluated.',
'tours.planner.maxDifficulty': 'Maximum trail difficulty',
'tours.planner.difficulty.t1': 'T1 — Hiking',
'tours.planner.difficulty.t2': 'T2 — Mountain hiking',
'tours.planner.difficulty.t3': 'T3 — Demanding mountain hiking',
'tours.planner.difficulty.t4': 'T4 — Alpine hiking',
'tours.planner.difficulty.t5': 'T5 — Demanding alpine hiking',
'tours.planner.difficulty.t6': 'T6 — Difficult alpine hiking',
'tours.planner.difficulty.t3Warning':
'T3 routes may include exposed or technically demanding mountain trails requiring sure-footedness and a head for heights.',
'tours.planner.difficulty.alpineTitle': 'Enable alpine routing?',
'tours.planner.difficulty.alpineBody':
'Alpine routing enabled. Routes may cross exposed, unmarked or technically difficult terrain. OSM difficulty data can be missing or incorrect.',
'tours.planner.difficulty.enable': 'Enable alpine routing',
'tours.planner.openFailed': 'The saved tour could not be opened for editing.',
'tours.planner.status.dirty': 'Waiting to calculate',
'tours.planner.status.routing': 'Calculating walking route…',
'tours.planner.status.routingFailed': 'Route calculation failed. The last good route is still shown.',
'tours.planner.status.elevation': 'Loading elevation…',
'tours.planner.status.elevationFailed': 'Elevation is unavailable. The calculated route is still shown.',
'tours.planner.status.ready': 'Route and elevation ready',
'tours.planner.status.saving': 'Saving…',
'tours.planner.status.saveFailed': 'Tour could not be saved. Your draft is still here.',
'tours.planner.retry': 'Retry',
'tours.planner.inspector.title': 'Tour summary',
'tours.planner.inspector.empty': 'Route details appear here after two waypoints are connected.',
'tours.planner.inspector.distance': 'Distance',
'tours.planner.inspector.duration': 'Walking time',
'tours.planner.inspector.elevation': 'Elevation profile',
'tours.planner.inspector.profileFocus': 'At {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'The profile is shown when route elevation data is available.',
'tours.planner.gpxNoGeometry': 'Route geometry is unavailable for this GPX import.',
'tours.planner.mobileHint':
'Tour planning is available on tablet and desktop. Saved tours can be viewed and scheduled here.',
'tourTypes.hike': 'Hike',
'tourTypes.bike': 'Bike tour',
'tourTypes.run': 'Run',
'tourTypes.ski': 'Ski tour',
'tourTypes.kayak': 'Kayak',
'tourTypes.walk': 'City / sightseeing walk',
'tourTypes.food': 'Food/wine tour',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+133
View File
@@ -0,0 +1,133 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Excursiones',
'tours.mode.places': 'Lugares',
'tours.mode.tours': 'Excursiones',
'tours.mode.label': 'Añadir vista',
'tours.title': 'Excursiones',
'tours.subtitle': 'Rutas de senderismo y otras excursiones de un día para este viaje',
'tours.empty.title': 'Aún no hay excursiones',
'tours.empty.body': 'Planifica una excursión o importa un archivo GPX para empezar.',
'tours.addToDay': 'Añadir a un día',
'tours.addToDay.comingSoon': 'Asigna excursiones a un día del viaje desde la lista de excursiones.',
'tours.addToDay.pickDay': 'Elige un día',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Importación GPX',
'tours.badge.planned': 'planificada en TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'usar con precaución',
'tours.caution.tooltip': 'Altitud o métricas incompletas: importada con reservas',
'tours.import.caution': 'Importada con reservas: altitud o métricas incompletas',
'tours.import.success': '{count} excursiones importadas desde GPX',
'tours.import.successOne': '1 excursión importada desde GPX',
'tours.import.noTrack': 'No se ha encontrado ningún track ni ruta en ese archivo GPX',
'tours.import.error': 'No se ha podido importar el archivo GPX',
'tours.delete.confirmBody':
'¿Eliminar esta ruta permanentemente? Se eliminarán el recorrido, los puntos editables y las asignaciones a días. Esta acción no se puede deshacer.',
'tours.delete.bulkConfirmBody':
'La selección incluye al menos una ruta. Todos los lugares seleccionados se eliminarán permanentemente y no se podrán restaurar. También se eliminarán las rutas, los puntos editables y las asignaciones a días.',
'tours.delete.confirmAction': 'Eliminar permanentemente',
'tours.addedToDay': 'Añadida al día {n}',
'tours.dayRoute.endpointUnknown':
'No se ha podido determinar el punto final de la excursión. Las conexiones posteriores pueden estar incompletas.',
'tours.detail.trackColor': 'Color del track',
'tours.detail.distance': 'Distancia',
'tours.detail.minAltitude': 'Altitud mínima',
'tours.detail.maxAltitude': 'Altitud máxima',
'tours.detail.ascent': 'Desnivel positivo',
'tours.detail.descent': 'Desnivel negativo',
'tours.detail.difficulty': 'Dificultad',
'tours.detail.source': 'Origen',
'tours.detail.gpxReadOnly': 'Las excursiones GPX son de solo lectura y aún no se pueden editar en el planificador.',
'tours.detail.navigationHint': 'La navegación abre el punto de inicio; no guía a lo largo de la ruta.',
'tours.planner.title': 'Planificar una excursión',
'tours.planner.newTour': 'Planificar nueva excursión',
'tours.planner.neutralTitle': 'Planificar una excursión',
'tours.planner.neutralBody': 'Empieza una ruta nueva y haz clic en el mapa para colocar sus puntos.',
'tours.planner.newTitle': 'Nueva excursión',
'tours.planner.editTitle': 'Editar excursión',
'tours.planner.gpxTitle': 'Excursión GPX',
'tours.planner.backToTours': 'Volver a excursiones',
'tours.planner.restored': 'Borrador sin guardar restaurado',
'tours.planner.discardChanges': 'Descartar cambios',
'tours.planner.discardUnsaved': 'Descartar cambios sin guardar',
'tours.planner.saveChanges': 'Guardar cambios',
'tours.planner.newTourConfirmTitle': '¿Empezar una nueva excursión?',
'tours.planner.newTourConfirmBody':
'Se descartarán los cambios sin guardar de esta excursión. Las excursiones guardadas no se modificarán.',
'tours.planner.newTourConfirm': 'Descartar y empezar nueva excursión',
'tours.planner.startingPoint': 'Haz clic en el mapa para añadir el punto de inicio.',
'tours.planner.firstUseDetails':
'Añade otro punto para calcular una ruta. La ruta y la altitud se actualizan automáticamente; guarda cuando termines.',
'tours.planner.collapseElevation': 'Contraer perfil de altitud',
'tours.planner.expandElevation': 'Expandir perfil de altitud',
'tours.planner.name': 'Nombre de la excursión',
'tours.planner.namePlaceholder': 'Ruta de senderismo sin título',
'tours.planner.mapHint': 'Haz clic en el mapa para añadir puntos.',
'tours.planner.waypoints': 'Puntos de paso',
'tours.planner.waypointLabel': 'Punto de paso {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Añade al menos dos puntos para calcular una ruta a pie.',
'tours.planner.start': 'Inicio',
'tours.planner.via': 'Paso por',
'tours.planner.end': 'Final',
'tours.planner.moveUp': 'Subir punto de paso',
'tours.planner.moveDown': 'Bajar punto de paso',
'tours.planner.remove': 'Eliminar punto de paso',
'tours.planner.undo': 'Deshacer cambio de punto de paso',
'tours.planner.redo': 'Rehacer cambio de punto de paso',
'tours.planner.discard': 'Descartar borrador',
'tours.planner.discardTitle': '¿Descartar los cambios sin guardar de la excursión?',
'tours.planner.discardBody':
'Se descartarán los cambios sin guardar. La excursión guardada, sus puntos de paso, archivos y asignaciones no se modificarán.',
'tours.planner.save': 'Guardar excursión',
'tours.planner.saved': 'Excursión guardada',
'tours.planner.planAnother': 'Planificar otra',
'tours.planner.assignToDay': 'Asignar a un día',
'tours.planner.tripTours': 'Excursiones de este viaje',
'tours.planner.safetyNote': 'El cálculo de rutas ayuda a planificar, pero no garantiza la seguridad.',
'tours.planner.safetyNoteDetails':
'Las etiquetas de dificultad de OSM pueden faltar o ser incorrectas. No se evalúan el tiempo, los cierres ni las condiciones actuales.',
'tours.planner.maxDifficulty': 'Dificultad máxima del sendero',
'tours.planner.difficulty.t1': 'T1 — Senderismo',
'tours.planner.difficulty.t2': 'T2 — Senderismo de montaña',
'tours.planner.difficulty.t3': 'T3 — Senderismo de montaña exigente',
'tours.planner.difficulty.t4': 'T4 — Senderismo alpino',
'tours.planner.difficulty.t5': 'T5 — Senderismo alpino exigente',
'tours.planner.difficulty.t6': 'T6 — Senderismo alpino difícil',
'tours.planner.difficulty.t3Warning':
'Las rutas T3 pueden incluir senderos de montaña expuestos o técnicamente exigentes que requieren pisada segura y no tener vértigo.',
'tours.planner.difficulty.alpineTitle': '¿Activar rutas alpinas?',
'tours.planner.difficulty.alpineBody':
'El cálculo de rutas alpinas está activado. Las rutas pueden atravesar terrenos expuestos, sin señalizar o técnicamente difíciles. Los datos de dificultad de OSM pueden faltar o ser incorrectos.',
'tours.planner.difficulty.enable': 'Activar rutas alpinas',
'tours.planner.openFailed': 'No se ha podido abrir la excursión guardada para editarla.',
'tours.planner.status.dirty': 'Pendiente de cálculo',
'tours.planner.status.routing': 'Calculando ruta a pie…',
'tours.planner.status.routingFailed': 'No se ha podido calcular la ruta. Se sigue mostrando la última ruta válida.',
'tours.planner.status.elevation': 'Cargando altitud…',
'tours.planner.status.elevationFailed': 'La altitud no está disponible. Se sigue mostrando la ruta calculada.',
'tours.planner.status.ready': 'Ruta y altitud listas',
'tours.planner.status.saving': 'Guardando…',
'tours.planner.status.saveFailed': 'No se ha podido guardar la excursión. El borrador sigue disponible.',
'tours.planner.retry': 'Reintentar',
'tours.planner.inspector.title': 'Resumen de la excursión',
'tours.planner.inspector.empty': 'Los detalles de la ruta aparecen aquí tras conectar dos puntos de paso.',
'tours.planner.inspector.distance': 'Distancia',
'tours.planner.inspector.duration': 'Tiempo a pie',
'tours.planner.inspector.elevation': 'Perfil de altitud',
'tours.planner.inspector.profileFocus': 'A {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'El perfil se muestra cuando hay datos de altitud de la ruta.',
'tours.planner.gpxNoGeometry': 'La geometría de la ruta no está disponible para esta importación GPX.',
'tours.planner.mobileHint':
'La planificación de excursiones está disponible en tabletas y ordenadores. Aquí puedes consultar las excursiones guardadas y asignarlas a un día.',
'tourTypes.hike': 'Senderismo',
'tourTypes.bike': 'Ruta en bicicleta',
'tourTypes.run': 'Carrera a pie',
'tourTypes.ski': 'Esquí de travesía',
'tourTypes.kayak': 'Ruta en kayak',
'tourTypes.walk': 'Paseo urbano / turístico',
'tourTypes.food': 'Ruta gastronómica / enológica',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -71,6 +72,7 @@ const locale = {
...collection,
...atlas,
...trip,
...tours,
...places,
...inspector,
...reservations,
+133
View File
@@ -0,0 +1,133 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Retked',
'tours.mode.places': 'Kohad',
'tours.mode.tours': 'Retked',
'tours.mode.label': 'Lisamise vaade',
'tours.title': 'Retked',
'tours.subtitle': 'Selle reisi matkad ja muud ühepäevased retked',
'tours.empty.title': 'Retki veel pole',
'tours.empty.body': 'Alustamiseks planeeri retk või impordi GPX-fail.',
'tours.addToDay': 'Lisa päevale',
'tours.addToDay.comingSoon': 'Lisa retkede loendist retki reisipäevale.',
'tours.addToDay.pickDay': 'Vali päev',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX-import',
'tours.badge.planned': 'Planeeritud rakenduses TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'Kasuta ettevaatlikult',
'tours.caution.tooltip': 'Kõrgusandmed või mõõdikud on puudulikud — imporditud hoiatusega',
'tours.import.caution': 'Imporditud hoiatusega — kõrgusandmed või mõõdikud on puudulikud',
'tours.import.success': 'GPX-failist imporditi {count} retke',
'tours.import.successOne': 'GPX-failist imporditi 1 retk',
'tours.import.noTrack': 'Sellest GPX-failist ei leitud rada ega marsruuti',
'tours.import.error': 'GPX-faili importimine ebaõnnestus',
'tours.delete.confirmBody':
'Kas kustutada see matk jäädavalt? Selle marsruut, muudetavad vahepunktid ja päevadele määramised eemaldatakse. Seda toimingut ei saa tagasi võtta.',
'tours.delete.bulkConfirmBody':
'Valik sisaldab vähemalt üht matka. Kõik valitud kohad kustutatakse jäädavalt ja neid ei saa taastada. Eemaldatakse ka matkade marsruudid, muudetavad vahepunktid ja päevadele määramised.',
'tours.delete.confirmAction': 'Kustuta jäädavalt',
'tours.addedToDay': 'Lisatud päevale {n}',
'tours.dayRoute.endpointUnknown': 'Retke lõpp-punkti ei saanud määrata. Järgnevad ühendused võivad olla puudulikud.',
'tours.detail.trackColor': 'Raja värv',
'tours.detail.distance': 'Vahemaa',
'tours.detail.minAltitude': 'Madalaim kõrgus',
'tours.detail.maxAltitude': 'Kõrgeim kõrgus',
'tours.detail.ascent': 'Tõus',
'tours.detail.descent': 'Laskumine',
'tours.detail.difficulty': 'Raskusaste',
'tours.detail.source': 'Allikas',
'tours.detail.gpxReadOnly': 'GPX-retki saab ainult vaadata; planeerijas neid veel muuta ei saa.',
'tours.detail.navigationHint': 'Navigeerimine avab raja alguspunkti, mitte juhiseid mööda marsruuti.',
'tours.planner.title': 'Planeeri retk',
'tours.planner.newTour': 'Planeeri uus retk',
'tours.planner.neutralTitle': 'Planeeri retk',
'tours.planner.neutralBody': 'Alusta uut matka ja klõpsa kaardil, et selle punktid paigutada.',
'tours.planner.newTitle': 'Uus retk',
'tours.planner.editTitle': 'Muuda retke',
'tours.planner.gpxTitle': 'GPX-retk',
'tours.planner.backToTours': 'Tagasi retkede juurde',
'tours.planner.restored': 'Salvestamata mustand taastatud',
'tours.planner.discardChanges': 'Loobu muudatustest',
'tours.planner.discardUnsaved': 'Loobu salvestamata muudatustest',
'tours.planner.saveChanges': 'Salvesta muudatused',
'tours.planner.newTourConfirmTitle': 'Kas alustada uut retke?',
'tours.planner.newTourConfirmBody':
'Selle retke salvestamata muudatused lähevad kaotsi. Salvestatud retki ei muudeta.',
'tours.planner.newTourConfirm': 'Loobu muudatustest ja alusta uut retke',
'tours.planner.startingPoint': 'Klõpsa kaardil alguspunkti lisamiseks.',
'tours.planner.firstUseDetails':
'Lisa marsruudi arvutamiseks veel üks punkt. Marsruut ja kõrgusandmed uuenevad automaatselt; salvesta, kui oled valmis.',
'tours.planner.collapseElevation': 'Ahenda kõrgusprofiil',
'tours.planner.expandElevation': 'Laienda kõrgusprofiil',
'tours.planner.name': 'Retke nimi',
'tours.planner.namePlaceholder': 'Nimetu matk',
'tours.planner.mapHint': 'Klõpsa kaardil punktide lisamiseks.',
'tours.planner.waypoints': 'Teekonnapunktid',
'tours.planner.waypointLabel': 'Teekonnapunkt {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Lisa jalgsimarsruudi arvutamiseks vähemalt kaks punkti.',
'tours.planner.start': 'Algus',
'tours.planner.via': 'Vahepunkt',
'tours.planner.end': 'Lõpp',
'tours.planner.moveUp': 'Liiguta teekonnapunkt üles',
'tours.planner.moveDown': 'Liiguta teekonnapunkt alla',
'tours.planner.remove': 'Eemalda teekonnapunkt',
'tours.planner.undo': 'Võta teekonnapunkti muudatus tagasi',
'tours.planner.redo': 'Tee teekonnapunkti muudatus uuesti',
'tours.planner.discard': 'Loobu mustandist',
'tours.planner.discardTitle': 'Kas loobuda retke salvestamata muudatustest?',
'tours.planner.discardBody':
'Salvestamata muudatused lähevad kaotsi. Salvestatud retke, selle teekonnapunkte, faile ega päevadele lisamisi ei muudeta.',
'tours.planner.save': 'Salvesta retk',
'tours.planner.saved': 'Retk salvestatud',
'tours.planner.planAnother': 'Planeeri järgmine',
'tours.planner.assignToDay': 'Lisa päevale',
'tours.planner.tripTours': 'Selle reisi retked',
'tours.planner.safetyNote': 'Marsruudi arvutamine aitab planeerida, kuid ei taga ohutust.',
'tours.planner.safetyNoteDetails':
'OSM-i raskusastme märgendid võivad puududa või olla valed. Ilma, teesulge ega hetkeolusid ei hinnata.',
'tours.planner.maxDifficulty': 'Raja suurim raskusaste',
'tours.planner.difficulty.t1': 'T1 — Matkamine',
'tours.planner.difficulty.t2': 'T2 — Mägimatkamine',
'tours.planner.difficulty.t3': 'T3 — Nõudlik mägimatkamine',
'tours.planner.difficulty.t4': 'T4 — Alpimatkamine',
'tours.planner.difficulty.t5': 'T5 — Nõudlik alpimatkamine',
'tours.planner.difficulty.t6': 'T6 — Raske alpimatkamine',
'tours.planner.difficulty.t3Warning':
'T3-marsruudid võivad hõlmata kukkumisohuga või tehniliselt nõudlikke mägiradu, mis eeldavad kindlat sammu ja kõrguse talumist.',
'tours.planner.difficulty.alpineTitle': 'Kas lubada alpimarsruutide arvutamine?',
'tours.planner.difficulty.alpineBody':
'Alpimarsruutide arvutamine on lubatud. Marsruudid võivad läbida kukkumisohuga, märgistamata või tehniliselt rasket maastikku. OSM-i raskusastme andmed võivad puududa või olla valed.',
'tours.planner.difficulty.enable': 'Luba alpimarsruutide arvutamine',
'tours.planner.openFailed': 'Salvestatud retke avamine muutmiseks ebaõnnestus.',
'tours.planner.status.dirty': 'Arvutamise ootel',
'tours.planner.status.routing': 'Jalgsimarsruudi arvutamine…',
'tours.planner.status.routingFailed':
'Marsruudi arvutamine ebaõnnestus. Viimane õnnestunud marsruut on endiselt nähtav.',
'tours.planner.status.elevation': 'Kõrgusandmete laadimine…',
'tours.planner.status.elevationFailed': 'Kõrgusandmed pole saadaval. Arvutatud marsruut on endiselt nähtav.',
'tours.planner.status.ready': 'Marsruut ja kõrgusandmed on valmis',
'tours.planner.status.saving': 'Salvestamine…',
'tours.planner.status.saveFailed': 'Retke salvestamine ebaõnnestus. Mustand on alles.',
'tours.planner.retry': 'Proovi uuesti',
'tours.planner.inspector.title': 'Retke kokkuvõte',
'tours.planner.inspector.empty': 'Marsruudi üksikasjad ilmuvad siia pärast kahe teekonnapunkti ühendamist.',
'tours.planner.inspector.distance': 'Vahemaa',
'tours.planner.inspector.duration': 'Kõndimisaeg',
'tours.planner.inspector.elevation': 'Kõrgusprofiil',
'tours.planner.inspector.profileFocus': 'Kaugusel {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Profiil kuvatakse, kui marsruudi kõrgusandmed on saadaval.',
'tours.planner.gpxNoGeometry': 'Selle GPX-impordi marsruudi geomeetria pole saadaval.',
'tours.planner.mobileHint':
'Retki saab planeerida tahvel- ja lauaarvutis. Siin saab salvestatud retki vaadata ja päevadele lisada.',
'tourTypes.hike': 'Matk',
'tourTypes.bike': 'Rattaretk',
'tourTypes.run': 'Jooks',
'tourTypes.ski': 'Suusaretk',
'tourTypes.kayak': 'Süstaretk',
'tourTypes.walk': 'Linna- / vaatamisväärsuste jalutuskäik',
'tourTypes.food': 'Toidu- / veiniretk',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+138
View File
@@ -0,0 +1,138 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Sorties',
'tours.mode.places': 'Lieux',
'tours.mode.tours': 'Sorties',
'tours.mode.label': 'Ajouter une vue',
'tours.title': 'Sorties',
'tours.subtitle': 'Randonnées et autres sorties à la journée pour ce voyage',
'tours.empty.title': 'Aucune sortie pour le moment',
'tours.empty.body': 'Planifiez une sortie ou importez un fichier GPX pour commencer.',
'tours.addToDay': 'Ajouter à une journée',
'tours.addToDay.comingSoon': 'Affectez les sorties à une journée du voyage depuis la liste des sorties.',
'tours.addToDay.pickDay': 'Choisir une journée',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Import GPX',
'tours.badge.planned': 'planifiée dans TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'à utiliser avec prudence',
'tours.caution.tooltip': 'Altitude ou mesures incomplètes : importée avec réserves',
'tours.import.caution': 'Importée avec réserves : altitude ou mesures incomplètes',
'tours.import.success': '{count} sorties importées depuis GPX',
'tours.import.successOne': '1 sortie importée depuis GPX',
'tours.import.noTrack': 'Aucune trace ni aucun itinéraire trouvé dans ce fichier GPX',
'tours.import.error': "Impossible d'importer le fichier GPX",
'tours.delete.confirmBody':
'Supprimer définitivement cette randonnée ? Son itinéraire, ses points modifiables et ses affectations aux jours seront supprimés. Cette action est irréversible.',
'tours.delete.bulkConfirmBody':
'Cette sélection comprend au moins une randonnée. Tous les lieux sélectionnés seront supprimés définitivement et ne pourront pas être restaurés. Les itinéraires, points modifiables et affectations aux jours des randonnées seront également supprimés.',
'tours.delete.confirmAction': 'Supprimer définitivement',
'tours.addedToDay': 'Ajoutée au jour {n}',
'tours.dayRoute.endpointUnknown':
"Le point d'arrivée de la sortie n'a pas pu être déterminé. Les liaisons suivantes peuvent être incomplètes.",
'tours.detail.trackColor': 'Couleur de la trace',
'tours.detail.distance': 'Distance',
'tours.detail.minAltitude': 'Altitude minimale',
'tours.detail.maxAltitude': 'Altitude maximale',
'tours.detail.ascent': 'Dénivelé positif',
'tours.detail.descent': 'Dénivelé négatif',
'tours.detail.difficulty': 'Difficulté',
'tours.detail.source': 'Source',
'tours.detail.gpxReadOnly':
'Les sorties GPX sont en lecture seule et ne peuvent pas encore être modifiées dans le planificateur.',
'tours.detail.navigationHint':
"La navigation ouvre le point de départ du sentier ; elle ne vous guide pas le long de l'itinéraire.",
'tours.planner.title': 'Planifier une sortie',
'tours.planner.newTour': 'Planifier une nouvelle sortie',
'tours.planner.neutralTitle': 'Planifier une sortie',
'tours.planner.neutralBody': 'Commencez une nouvelle randonnée et cliquez sur la carte pour placer ses points.',
'tours.planner.newTitle': 'Nouvelle sortie',
'tours.planner.editTitle': 'Modifier la sortie',
'tours.planner.gpxTitle': 'Sortie GPX',
'tours.planner.backToTours': 'Retour aux sorties',
'tours.planner.restored': 'Brouillon non enregistré restauré',
'tours.planner.discardChanges': 'Abandonner les modifications',
'tours.planner.discardUnsaved': 'Abandonner les modifications non enregistrées',
'tours.planner.saveChanges': 'Enregistrer les modifications',
'tours.planner.newTourConfirmTitle': 'Commencer une nouvelle sortie ?',
'tours.planner.newTourConfirmBody':
'Les modifications non enregistrées de cette sortie seront perdues. Les sorties enregistrées resteront inchangées.',
'tours.planner.newTourConfirm': 'Abandonner et commencer une nouvelle sortie',
'tours.planner.startingPoint': 'Cliquez sur la carte pour ajouter votre point de départ.',
'tours.planner.firstUseDetails':
"Ajoutez un autre point pour calculer un itinéraire. L'itinéraire et l'altitude se mettent à jour automatiquement ; enregistrez quand vous avez terminé.",
'tours.planner.collapseElevation': 'Réduire le profil altimétrique',
'tours.planner.expandElevation': 'Déployer le profil altimétrique',
'tours.planner.name': 'Nom de la sortie',
'tours.planner.namePlaceholder': 'Randonnée sans titre',
'tours.planner.mapHint': 'Cliquez sur la carte pour ajouter des points.',
'tours.planner.waypoints': 'Points de passage',
'tours.planner.waypointLabel': 'Point de passage {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Ajoutez au moins deux points pour calculer un itinéraire à pied.',
'tours.planner.start': 'Départ',
'tours.planner.via': 'Passage par',
'tours.planner.end': 'Arrivée',
'tours.planner.moveUp': 'Monter le point de passage',
'tours.planner.moveDown': 'Descendre le point de passage',
'tours.planner.remove': 'Supprimer le point de passage',
'tours.planner.undo': 'Annuler la modification du point de passage',
'tours.planner.redo': 'Rétablir la modification du point de passage',
'tours.planner.discard': 'Abandonner le brouillon',
'tours.planner.discardTitle': 'Abandonner les modifications non enregistrées de la sortie ?',
'tours.planner.discardBody':
'Les modifications non enregistrées seront perdues. La sortie enregistrée, ses points de passage, ses fichiers et ses affectations resteront inchangés.',
'tours.planner.save': 'Enregistrer la sortie',
'tours.planner.saved': 'Sortie enregistrée',
'tours.planner.planAnother': 'En planifier une autre',
'tours.planner.assignToDay': 'Affecter à une journée',
'tours.planner.tripTours': 'Sorties de ce voyage',
'tours.planner.safetyNote': "Le calcul d'itinéraire aide à planifier, mais ne garantit pas la sécurité.",
'tours.planner.safetyNoteDetails':
'Les indications de difficulté dans OSM peuvent être absentes ou erronées. La météo, les fermetures et les conditions actuelles ne sont pas évaluées.',
'tours.planner.maxDifficulty': 'Difficulté maximale du sentier',
'tours.planner.difficulty.t1': 'T1 — Randonnée',
'tours.planner.difficulty.t2': 'T2 — Randonnée en montagne',
'tours.planner.difficulty.t3': 'T3 — Randonnée en montagne exigeante',
'tours.planner.difficulty.t4': 'T4 — Randonnée alpine',
'tours.planner.difficulty.t5': 'T5 — Randonnée alpine exigeante',
'tours.planner.difficulty.t6': 'T6 — Randonnée alpine difficile',
'tours.planner.difficulty.t3Warning':
'Les itinéraires T3 peuvent comporter des sentiers de montagne exposés ou techniquement exigeants, nécessitant un pied sûr et une bonne tolérance au vide.',
'tours.planner.difficulty.alpineTitle': "Activer le calcul d'itinéraires alpins ?",
'tours.planner.difficulty.alpineBody':
"Le calcul d'itinéraires alpins est activé. Les itinéraires peuvent traverser des terrains exposés, non balisés ou techniquement difficiles. Les données de difficulté dans OSM peuvent être absentes ou erronées.",
'tours.planner.difficulty.enable': 'Activer les itinéraires alpins',
'tours.planner.openFailed': "Impossible d'ouvrir la sortie enregistrée pour la modifier.",
'tours.planner.status.dirty': 'En attente du calcul',
'tours.planner.status.routing': "Calcul de l'itinéraire à pied…",
'tours.planner.status.routingFailed':
"Le calcul de l'itinéraire a échoué. Le dernier itinéraire valide reste affiché.",
'tours.planner.status.elevation': "Chargement de l'altitude…",
'tours.planner.status.elevationFailed': "L'altitude est indisponible. L'itinéraire calculé reste affiché.",
'tours.planner.status.ready': 'Itinéraire et altitude prêts',
'tours.planner.status.saving': 'Enregistrement…',
'tours.planner.status.saveFailed': "La sortie n'a pas pu être enregistrée. Votre brouillon est toujours disponible.",
'tours.planner.retry': 'Réessayer',
'tours.planner.inspector.title': 'Résumé de la sortie',
'tours.planner.inspector.empty':
"Les détails de l'itinéraire apparaissent ici une fois deux points de passage reliés.",
'tours.planner.inspector.distance': 'Distance',
'tours.planner.inspector.duration': 'Temps de marche',
'tours.planner.inspector.elevation': 'Profil altimétrique',
'tours.planner.inspector.profileFocus': 'À {distance} : {elevation}',
'tours.planner.inspector.elevationPlaceholder':
"Le profil s'affiche lorsque les données d'altitude de l'itinéraire sont disponibles.",
'tours.planner.gpxNoGeometry': "La géométrie de l'itinéraire est indisponible pour cet import GPX.",
'tours.planner.mobileHint':
'La planification des sorties est disponible sur tablette et ordinateur. Vous pouvez consulter les sorties enregistrées et les affecter à une journée ici.',
'tourTypes.hike': 'Randonnée',
'tourTypes.bike': 'Sortie à vélo',
'tourTypes.run': 'Course à pied',
'tourTypes.ski': 'Ski de randonnée',
'tourTypes.kayak': 'Sortie en kayak',
'tourTypes.walk': 'Balade urbaine / touristique',
'tourTypes.food': 'Circuit gastronomique / œnologique',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+139
View File
@@ -0,0 +1,139 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Εκδρομές',
'tours.mode.places': 'Μέρη',
'tours.mode.tours': 'Εκδρομές',
'tours.mode.label': 'Προβολή προσθήκης',
'tours.title': 'Εκδρομές',
'tours.subtitle': 'Πεζοπορίες και άλλες ημερήσιες εκδρομές σε αυτό το ταξίδι',
'tours.empty.title': 'Δεν υπάρχουν εκδρομές ακόμη',
'tours.empty.body': 'Σχεδιάστε μια εκδρομή ή εισαγάγετε ένα αρχείο GPX για να ξεκινήσετε.',
'tours.addToDay': 'Προσθήκη σε ημέρα',
'tours.addToDay.comingSoon': 'Αντιστοιχίστε εκδρομές σε ημέρες του ταξιδιού από τη λίστα εκδρομών.',
'tours.addToDay.pickDay': 'Επιλέξτε ημέρα',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Εισαγωγή GPX',
'tours.badge.planned': 'σχεδιάστηκε στο TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'χρήση με προσοχή',
'tours.caution.tooltip': 'Ελλιπή υψομετρικά δεδομένα ή μετρήσεις – εισαγωγή με επιφύλαξη',
'tours.import.caution': 'Εισαγωγή με επιφύλαξη – ελλιπή υψομετρικά δεδομένα ή μετρήσεις',
'tours.import.success': 'Αριθμός εκδρομών που εισήχθησαν από GPX: {count}',
'tours.import.successOne': 'Εισήχθη 1 εκδρομή από GPX',
'tours.import.noTrack': 'Δεν βρέθηκε ίχνος ή διαδρομή σε αυτό το αρχείο GPX',
'tours.import.error': 'Δεν ήταν δυνατή η εισαγωγή του αρχείου GPX',
'tours.delete.confirmBody':
'Να διαγραφεί οριστικά αυτή η διαδρομή; Η πορεία, τα επεξεργάσιμα σημεία και οι αναθέσεις σε ημέρες θα αφαιρεθούν. Αυτή η ενέργεια δεν αναιρείται.',
'tours.delete.bulkConfirmBody':
'Η επιλογή περιλαμβάνει τουλάχιστον μία διαδρομή. Όλα τα επιλεγμένα μέρη θα διαγραφούν οριστικά και δεν θα μπορούν να αποκατασταθούν. Θα αφαιρεθούν επίσης οι πορείες, τα επεξεργάσιμα σημεία και οι αναθέσεις των διαδρομών σε ημέρες.',
'tours.delete.confirmAction': 'Οριστική διαγραφή',
'tours.addedToDay': 'Προστέθηκε στην ημέρα {n}',
'tours.dayRoute.endpointUnknown':
'Δεν ήταν δυνατός ο προσδιορισμός του τελικού σημείου της εκδρομής. Τα επόμενα συνδετικά τμήματα ενδέχεται να είναι ελλιπή.',
'tours.detail.trackColor': 'Χρώμα ίχνους',
'tours.detail.distance': 'Απόσταση',
'tours.detail.minAltitude': 'Ελάχιστο υψόμετρο',
'tours.detail.maxAltitude': 'Μέγιστο υψόμετρο',
'tours.detail.ascent': 'Υψομετρική άνοδος',
'tours.detail.descent': 'Υψομετρική κάθοδος',
'tours.detail.difficulty': 'Δυσκολία',
'tours.detail.source': 'Πηγή',
'tours.detail.gpxReadOnly':
'Οι εκδρομές GPX είναι μόνο για προβολή και δεν μπορούν ακόμη να τροποποιηθούν στον σχεδιαστή.',
'tours.detail.navigationHint':
'Η πλοήγηση ανοίγει την αφετηρία του μονοπατιού· δεν σας καθοδηγεί κατά μήκος της διαδρομής.',
'tours.planner.title': 'Σχεδιασμός εκδρομής',
'tours.planner.newTour': 'Σχεδιασμός νέας εκδρομής',
'tours.planner.neutralTitle': 'Σχεδιασμός εκδρομής',
'tours.planner.neutralBody': 'Ξεκινήστε μια νέα διαδρομή και κάντε κλικ στον χάρτη για να ορίσετε τα σημεία της.',
'tours.planner.newTitle': 'Νέα εκδρομή',
'tours.planner.editTitle': 'Επεξεργασία εκδρομής',
'tours.planner.gpxTitle': 'Εκδρομή GPX',
'tours.planner.backToTours': 'Πίσω στις εκδρομές',
'tours.planner.restored': 'Το μη αποθηκευμένο πρόχειρο επαναφέρθηκε',
'tours.planner.discardChanges': 'Απόρριψη αλλαγών',
'tours.planner.discardUnsaved': 'Απόρριψη μη αποθηκευμένων αλλαγών',
'tours.planner.saveChanges': 'Αποθήκευση αλλαγών',
'tours.planner.newTourConfirmTitle': 'Έναρξη νέας εκδρομής;',
'tours.planner.newTourConfirmBody':
'Οι μη αποθηκευμένες αλλαγές αυτής της εκδρομής θα απορριφθούν. Οι αποθηκευμένες εκδρομές δεν θα αλλάξουν.',
'tours.planner.newTourConfirm': 'Απόρριψη αλλαγών και έναρξη νέας εκδρομής',
'tours.planner.startingPoint': 'Κάντε κλικ στον χάρτη για να προσθέσετε την αφετηρία.',
'tours.planner.firstUseDetails':
'Προσθέστε άλλο ένα σημείο για να υπολογιστεί η διαδρομή. Η διαδρομή και τα υψομετρικά δεδομένα ενημερώνονται αυτόματα· αποθηκεύστε όταν είναι έτοιμα.',
'tours.planner.collapseElevation': 'Σύμπτυξη υψομετρικού προφίλ',
'tours.planner.expandElevation': 'Ανάπτυξη υψομετρικού προφίλ',
'tours.planner.name': 'Όνομα εκδρομής',
'tours.planner.namePlaceholder': 'Πεζοπορία χωρίς όνομα',
'tours.planner.mapHint': 'Κάντε κλικ στον χάρτη για να προσθέσετε σημεία.',
'tours.planner.waypoints': 'Σημεία διέλευσης',
'tours.planner.waypointLabel': 'Σημείο διέλευσης {n}',
'tours.durationMinutes': '{count} λεπτά',
'tours.planner.empty': 'Προσθέστε τουλάχιστον δύο σημεία για να υπολογιστεί μια διαδρομή πεζοπορίας.',
'tours.planner.start': 'Αφετηρία',
'tours.planner.via': 'Μέσω',
'tours.planner.end': 'Τερματισμός',
'tours.planner.moveUp': 'Μετακίνηση σημείου πάνω',
'tours.planner.moveDown': 'Μετακίνηση σημείου κάτω',
'tours.planner.remove': 'Αφαίρεση σημείου',
'tours.planner.undo': 'Αναίρεση αλλαγής σημείου',
'tours.planner.redo': 'Επανάληψη αλλαγής σημείου',
'tours.planner.discard': 'Απόρριψη πρόχειρου',
'tours.planner.discardTitle': 'Απόρριψη μη αποθηκευμένων αλλαγών εκδρομής;',
'tours.planner.discardBody':
'Οι μη αποθηκευμένες αλλαγές θα απορριφθούν. Η αποθηκευμένη εκδρομή, τα σημεία, τα αρχεία και οι αντιστοιχίσεις της δεν θα αλλάξουν.',
'tours.planner.save': 'Αποθήκευση εκδρομής',
'tours.planner.saved': 'Η εκδρομή αποθηκεύτηκε',
'tours.planner.planAnother': 'Σχεδιασμός άλλης',
'tours.planner.assignToDay': 'Αντιστοίχιση σε ημέρα',
'tours.planner.tripTours': 'Εκδρομές αυτού του ταξιδιού',
'tours.planner.safetyNote': 'Ο υπολογισμός διαδρομών βοηθά στον σχεδιασμό, αλλά δεν εγγυάται την ασφάλεια.',
'tours.planner.safetyNoteDetails':
'Οι ετικέτες δυσκολίας του OSM ενδέχεται να λείπουν ή να είναι λανθασμένες. Ο καιρός, οι κλειστές διαδρομές και οι τρέχουσες συνθήκες δεν αξιολογούνται.',
'tours.planner.maxDifficulty': 'Μέγιστη δυσκολία μονοπατιού',
'tours.planner.difficulty.t1': 'T1 – Πεζοπορία',
'tours.planner.difficulty.t2': 'T2 – Ορεινή πεζοπορία',
'tours.planner.difficulty.t3': 'T3 – Απαιτητική ορεινή πεζοπορία',
'tours.planner.difficulty.t4': 'T4 – Αλπική πεζοπορία',
'tours.planner.difficulty.t5': 'T5 – Απαιτητική αλπική πεζοπορία',
'tours.planner.difficulty.t6': 'T6 – Δύσκολη αλπική πεζοπορία',
'tours.planner.difficulty.t3Warning':
'Οι διαδρομές T3 ενδέχεται να περιλαμβάνουν εκτεθειμένα ή τεχνικά απαιτητικά ορεινά μονοπάτια που χρειάζονται σταθερό πάτημα και εξοικείωση με τα ύψη χωρίς φόβο.',
'tours.planner.difficulty.alpineTitle': 'Ενεργοποίηση αλπικών διαδρομών;',
'tours.planner.difficulty.alpineBody':
'Οι αλπικές διαδρομές ενεργοποιήθηκαν. Μπορεί να διασχίζουν εκτεθειμένο, μη σηματοδοτημένο ή τεχνικά δύσκολο έδαφος. Τα δεδομένα δυσκολίας του OSM ενδέχεται να λείπουν ή να είναι λανθασμένα.',
'tours.planner.difficulty.enable': 'Ενεργοποίηση αλπικών διαδρομών',
'tours.planner.openFailed': 'Δεν ήταν δυνατό το άνοιγμα της αποθηκευμένης εκδρομής για επεξεργασία.',
'tours.planner.status.dirty': 'Αναμονή υπολογισμού',
'tours.planner.status.routing': 'Υπολογισμός διαδρομής πεζοπορίας…',
'tours.planner.status.routingFailed':
'Ο υπολογισμός διαδρομής απέτυχε. Εμφανίζεται ακόμη η τελευταία έγκυρη διαδρομή.',
'tours.planner.status.elevation': 'Φόρτωση υψομετρικών δεδομένων…',
'tours.planner.status.elevationFailed':
'Τα υψομετρικά δεδομένα δεν είναι διαθέσιμα. Η υπολογισμένη διαδρομή εξακολουθεί να εμφανίζεται.',
'tours.planner.status.ready': 'Η διαδρομή και τα υψομετρικά δεδομένα είναι έτοιμα',
'tours.planner.status.saving': 'Αποθήκευση…',
'tours.planner.status.saveFailed': 'Δεν ήταν δυνατή η αποθήκευση της εκδρομής. Το πρόχειρό σας παραμένει διαθέσιμο.',
'tours.planner.retry': 'Επανάληψη',
'tours.planner.inspector.title': 'Σύνοψη εκδρομής',
'tours.planner.inspector.empty':
'Οι λεπτομέρειες της διαδρομής εμφανίζονται εδώ μόλις συνδεθούν δύο σημεία διέλευσης.',
'tours.planner.inspector.distance': 'Απόσταση',
'tours.planner.inspector.duration': 'Χρόνος πεζοπορίας',
'tours.planner.inspector.elevation': 'Υψομετρικό προφίλ',
'tours.planner.inspector.profileFocus': 'Στην απόσταση {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'Το προφίλ εμφανίζεται όταν είναι διαθέσιμα τα υψομετρικά δεδομένα της διαδρομής.',
'tours.planner.gpxNoGeometry': 'Η γεωμετρία της διαδρομής δεν είναι διαθέσιμη για αυτήν την εισαγωγή GPX.',
'tours.planner.mobileHint':
'Ο σχεδιασμός εκδρομών είναι διαθέσιμος σε τάμπλετ και υπολογιστή. Εδώ μπορείτε να βλέπετε τις αποθηκευμένες εκδρομές και να τις αντιστοιχίζετε σε ημέρες.',
'tourTypes.hike': 'Πεζοπορία',
'tourTypes.bike': 'Ποδηλατική εκδρομή',
'tourTypes.run': 'Τρέξιμο',
'tourTypes.ski': 'Ορειβατικό σκι',
'tourTypes.kayak': 'Καγιάκ',
'tourTypes.walk': 'Περίπατος στην πόλη / στα αξιοθέατα',
'tourTypes.food': 'Γαστρονομική / οινική εκδρομή',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+135
View File
@@ -0,0 +1,135 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Túrák',
'tours.mode.places': 'Helyek',
'tours.mode.tours': 'Túrák',
'tours.mode.label': 'Hozzáadási nézet',
'tours.title': 'Túrák',
'tours.subtitle': 'Gyalogtúrák és más egynapos túrák ezen az utazáson',
'tours.empty.title': 'Még nincsenek túrák',
'tours.empty.body': 'A kezdéshez tervezz egy túrát, vagy importálj egy GPX-fájlt.',
'tours.addToDay': 'Hozzáadás egy naphoz',
'tours.addToDay.comingSoon': 'A túralistából rendelj túrákat az utazás valamelyik napjához.',
'tours.addToDay.pickDay': 'Válassz napot',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX-import',
'tours.badge.planned': 'TREK-ben tervezve',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'óvatosan használd',
'tours.caution.tooltip': 'Hiányos magassági adatok vagy mutatók – fenntartással importálva',
'tours.import.caution': 'Fenntartással importálva – hiányos magassági adatok vagy mutatók',
'tours.import.success': 'GPX-ből importált túrák száma: {count}',
'tours.import.successOne': '1 túra importálva GPX-ből',
'tours.import.noTrack': 'Ebben a GPX-fájlban nem található nyomvonal vagy útvonal',
'tours.import.error': 'Nem sikerült importálni a GPX-fájlt',
'tours.delete.confirmBody':
'Végleg törli ezt a túrát? Az útvonala, szerkeszthető útvonalpontjai és a napokhoz rendelései is törlődnek. A művelet nem vonható vissza.',
'tours.delete.bulkConfirmBody':
'A kijelölés legalább egy túrát tartalmaz. Minden kijelölt hely végleg törlődik, és nem állítható vissza. A túrák útvonalai, szerkeszthető pontjai és napokhoz rendelései is törlődnek.',
'tours.delete.confirmAction': 'Végleges törlés',
'tours.addedToDay': 'Hozzáadva a(z) {n}. naphoz',
'tours.dayRoute.endpointUnknown':
'A túra végpontja nem határozható meg. Az ezt követő összekötő szakaszok hiányosak lehetnek.',
'tours.detail.trackColor': 'Nyomvonal színe',
'tours.detail.distance': 'Távolság',
'tours.detail.minAltitude': 'Legkisebb tengerszint feletti magasság',
'tours.detail.maxAltitude': 'Legnagyobb tengerszint feletti magasság',
'tours.detail.ascent': 'Szintemelkedés',
'tours.detail.descent': 'Szintcsökkenés',
'tours.detail.difficulty': 'Nehézség',
'tours.detail.source': 'Forrás',
'tours.detail.gpxReadOnly': 'A GPX-túrák csak megtekinthetők, a tervezőben még nem szerkeszthetők.',
'tours.detail.navigationHint': 'A navigáció a túra kiindulópontját nyitja meg; nem vezet végig az útvonalon.',
'tours.planner.title': 'Túra tervezése',
'tours.planner.newTour': 'Új túra tervezése',
'tours.planner.neutralTitle': 'Túra tervezése',
'tours.planner.neutralBody': 'Indíts új túrát, és kattints a térképre a pontjai elhelyezéséhez.',
'tours.planner.newTitle': 'Új túra',
'tours.planner.editTitle': 'Túra szerkesztése',
'tours.planner.gpxTitle': 'GPX-túra',
'tours.planner.backToTours': 'Vissza a túrákhoz',
'tours.planner.restored': 'Nem mentett vázlat visszaállítva',
'tours.planner.discardChanges': 'Módosítások elvetése',
'tours.planner.discardUnsaved': 'Nem mentett módosítások elvetése',
'tours.planner.saveChanges': 'Módosítások mentése',
'tours.planner.newTourConfirmTitle': 'Új túrát kezdesz?',
'tours.planner.newTourConfirmBody': 'A túra nem mentett módosításai elvesznek. A mentett túrák nem változnak.',
'tours.planner.newTourConfirm': 'Módosítások elvetése és új túra kezdése',
'tours.planner.startingPoint': 'Kattints a térképre a kiindulópont hozzáadásához.',
'tours.planner.firstUseDetails':
'Adj hozzá még egy pontot az útvonal kiszámításához. Az útvonal és a magassági adatok automatikusan frissülnek; mentsd a túrát, ha elkészült.',
'tours.planner.collapseElevation': 'Magassági profil összecsukása',
'tours.planner.expandElevation': 'Magassági profil kibontása',
'tours.planner.name': 'Túra neve',
'tours.planner.namePlaceholder': 'Névtelen gyalogtúra',
'tours.planner.mapHint': 'Kattints a térképre pontok hozzáadásához.',
'tours.planner.waypoints': 'Útvonalpontok',
'tours.planner.waypointLabel': '{n}. útvonalpont',
'tours.durationMinutes': '{count} perc',
'tours.planner.empty': 'Adj hozzá legalább két pontot egy gyalogos útvonal kiszámításához.',
'tours.planner.start': 'Kezdőpont',
'tours.planner.via': 'Köztes pont',
'tours.planner.end': 'Végpont',
'tours.planner.moveUp': 'Útvonalpont feljebb',
'tours.planner.moveDown': 'Útvonalpont lejjebb',
'tours.planner.remove': 'Útvonalpont törlése',
'tours.planner.undo': 'Pontmódosítás visszavonása',
'tours.planner.redo': 'Pontmódosítás ismétlése',
'tours.planner.discard': 'Vázlat elvetése',
'tours.planner.discardTitle': 'Elveted a túra nem mentett módosításait?',
'tours.planner.discardBody':
'A nem mentett módosítások elvesznek. A mentett túra, útvonalpontjai, fájljai és napokhoz rendelései nem változnak.',
'tours.planner.save': 'Túra mentése',
'tours.planner.saved': 'Túra mentve',
'tours.planner.planAnother': 'Másik túra tervezése',
'tours.planner.assignToDay': 'Naphoz rendelés',
'tours.planner.tripTours': 'Az utazás túrái',
'tours.planner.safetyNote': 'Az útvonaltervezés tervezési segítség, nem biztonsági garancia.',
'tours.planner.safetyNoteDetails':
'Az OSM nehézségi címkéi hiányozhatnak vagy hibásak lehetnek. Az időjárást, lezárásokat és aktuális körülményeket a rendszer nem értékeli.',
'tours.planner.maxDifficulty': 'Ösvény legnagyobb nehézsége',
'tours.planner.difficulty.t1': 'T1 – Gyalogtúra',
'tours.planner.difficulty.t2': 'T2 – Hegyi túra',
'tours.planner.difficulty.t3': 'T3 – Megerőltető hegyi túra',
'tours.planner.difficulty.t4': 'T4 – Magashegyi túra',
'tours.planner.difficulty.t5': 'T5 – Megerőltető magashegyi túra',
'tours.planner.difficulty.t6': 'T6 – Nehéz magashegyi túra',
'tours.planner.difficulty.t3Warning':
'A T3 útvonalak kitett vagy technikailag nehéz hegyi ösvényeket is tartalmazhatnak, amelyek magasban is biztos lépést és szédülésmentességet igényelnek.',
'tours.planner.difficulty.alpineTitle': 'Engedélyezed a magashegyi útvonaltervezést?',
'tours.planner.difficulty.alpineBody':
'A magashegyi útvonaltervezés engedélyezve. Az útvonalak kitett, jelöletlen vagy technikailag nehéz terepen vezethetnek. Az OSM nehézségi adatai hiányozhatnak vagy hibásak lehetnek.',
'tours.planner.difficulty.enable': 'Magashegyi tervezés engedélyezése',
'tours.planner.openFailed': 'A mentett túrát nem sikerült megnyitni szerkesztésre.',
'tours.planner.status.dirty': 'Számításra vár',
'tours.planner.status.routing': 'Gyalogos útvonal kiszámítása…',
'tours.planner.status.routingFailed':
'Az útvonalszámítás sikertelen. Továbbra is az utolsó sikeresen kiszámított útvonal látható.',
'tours.planner.status.elevation': 'Magassági adatok betöltése…',
'tours.planner.status.elevationFailed':
'A magassági adatok nem érhetők el. A kiszámított útvonal továbbra is látható.',
'tours.planner.status.ready': 'Az útvonal és a magassági adatok elkészültek',
'tours.planner.status.saving': 'Mentés…',
'tours.planner.status.saveFailed': 'A túrát nem sikerült menteni. A vázlat megmaradt.',
'tours.planner.retry': 'Újra',
'tours.planner.inspector.title': 'Túra összefoglalója',
'tours.planner.inspector.empty': 'Az útvonal részletei két útvonalpont összekötése után jelennek meg itt.',
'tours.planner.inspector.distance': 'Távolság',
'tours.planner.inspector.duration': 'Gyaloglási idő',
'tours.planner.inspector.elevation': 'Magassági profil',
'tours.planner.inspector.profileFocus': '{distance} távolságnál: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'A profil akkor jelenik meg, ha rendelkezésre állnak az útvonal magassági adatai.',
'tours.planner.gpxNoGeometry': 'Ehhez a GPX-importhoz nem érhető el útvonalgeometria.',
'tours.planner.mobileHint':
'A túratervezés táblagépen és számítógépen érhető el. Itt megtekintheted és napokhoz rendelheted a mentett túrákat.',
'tourTypes.hike': 'Gyalogtúra',
'tourTypes.bike': 'Kerékpártúra',
'tourTypes.run': 'Futás',
'tourTypes.ski': 'Sítúra',
'tourTypes.kayak': 'Kajakozás',
'tourTypes.walk': 'Városi / városnéző séta',
'tourTypes.food': 'Gasztro- / bortúra',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+134
View File
@@ -0,0 +1,134 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Tur',
'tours.mode.places': 'Tempat',
'tours.mode.tours': 'Tur',
'tours.mode.label': 'Tampilan penambahan',
'tours.title': 'Tur',
'tours.subtitle': 'Pendakian dan tur sehari lainnya untuk perjalanan ini',
'tours.empty.title': 'Belum ada tur',
'tours.empty.body': 'Rencanakan tur atau impor berkas GPX untuk memulai.',
'tours.addToDay': 'Tambahkan ke hari',
'tours.addToDay.comingSoon': 'Tetapkan tur ke hari perjalanan dari daftar tur.',
'tours.addToDay.pickDay': 'Pilih hari',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Impor GPX',
'tours.badge.planned': 'direncanakan di TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'gunakan dengan hati-hati',
'tours.caution.tooltip': 'Data elevasi atau metrik belum lengkap; diimpor dengan peringatan',
'tours.import.caution': 'Diimpor dengan peringatan; data elevasi atau metrik belum lengkap',
'tours.import.success': '{count} tur diimpor dari GPX',
'tours.import.successOne': '1 tur diimpor dari GPX',
'tours.import.noTrack': 'Tidak ditemukan jejak atau rute dalam berkas GPX tersebut',
'tours.import.error': 'Berkas GPX tidak dapat diimpor',
'tours.delete.confirmBody':
'Hapus tur ini secara permanen? Rute, titik arah yang dapat diedit, dan penetapan harinya akan dihapus. Tindakan ini tidak dapat dibatalkan.',
'tours.delete.bulkConfirmBody':
'Pilihan ini mencakup setidaknya satu tur. Semua tempat yang dipilih akan dihapus secara permanen dan tidak dapat dipulihkan. Rute, titik arah yang dapat diedit, dan penetapan hari untuk tur juga akan dihapus.',
'tours.delete.confirmAction': 'Hapus permanen',
'tours.addedToDay': 'Ditambahkan ke hari ke-{n}',
'tours.dayRoute.endpointUnknown':
'Titik akhir tur tidak dapat ditentukan. Sambungan rute berikutnya mungkin tidak lengkap.',
'tours.detail.trackColor': 'Warna jejak',
'tours.detail.distance': 'Jarak',
'tours.detail.minAltitude': 'Ketinggian minimum',
'tours.detail.maxAltitude': 'Ketinggian maksimum',
'tours.detail.ascent': 'Total kenaikan elevasi',
'tours.detail.descent': 'Total penurunan elevasi',
'tours.detail.difficulty': 'Tingkat kesulitan',
'tours.detail.source': 'Sumber',
'tours.detail.gpxReadOnly': 'Tur GPX hanya dapat dilihat dan belum dapat diedit di perencana.',
'tours.detail.navigationHint': 'Navigasi membuka titik awal jalur, bukan memberikan panduan sepanjang rute.',
'tours.planner.title': 'Rencanakan tur',
'tours.planner.newTour': 'Rencanakan tur baru',
'tours.planner.neutralTitle': 'Rencanakan tur',
'tours.planner.neutralBody': 'Mulai tur baru dan klik peta untuk menempatkan titik-titiknya.',
'tours.planner.newTitle': 'Tur baru',
'tours.planner.editTitle': 'Edit tur',
'tours.planner.gpxTitle': 'Tur GPX',
'tours.planner.backToTours': 'Kembali ke daftar tur',
'tours.planner.restored': 'Draf yang belum disimpan telah dipulihkan',
'tours.planner.discardChanges': 'Buang perubahan',
'tours.planner.discardUnsaved': 'Buang perubahan yang belum disimpan',
'tours.planner.saveChanges': 'Simpan perubahan',
'tours.planner.newTourConfirmTitle': 'Mulai tur baru?',
'tours.planner.newTourConfirmBody':
'Perubahan yang belum disimpan pada tur ini akan dibuang. Tur yang sudah disimpan tidak akan diubah.',
'tours.planner.newTourConfirm': 'Buang perubahan dan mulai tur baru',
'tours.planner.startingPoint': 'Klik peta untuk menambahkan titik awal.',
'tours.planner.firstUseDetails':
'Tambahkan satu titik lagi untuk menghitung rute. Rute dan elevasi diperbarui otomatis; simpan setelah selesai.',
'tours.planner.collapseElevation': 'Ciutkan profil elevasi',
'tours.planner.expandElevation': 'Perluas profil elevasi',
'tours.planner.name': 'Nama tur',
'tours.planner.namePlaceholder': 'Pendakian tanpa judul',
'tours.planner.mapHint': 'Klik peta untuk menambahkan titik.',
'tours.planner.waypoints': 'Titik lintasan',
'tours.planner.waypointLabel': 'Titik lintasan {n}',
'tours.durationMinutes': '{count} menit',
'tours.planner.empty': 'Tambahkan setidaknya dua titik untuk menghitung rute berjalan kaki.',
'tours.planner.start': 'Awal',
'tours.planner.via': 'Melalui',
'tours.planner.end': 'Akhir',
'tours.planner.moveUp': 'Pindahkan titik lintasan ke atas',
'tours.planner.moveDown': 'Pindahkan titik lintasan ke bawah',
'tours.planner.remove': 'Hapus titik lintasan',
'tours.planner.undo': 'Urungkan perubahan titik lintasan',
'tours.planner.redo': 'Ulangi perubahan titik lintasan',
'tours.planner.discard': 'Buang draf',
'tours.planner.discardTitle': 'Buang perubahan tur yang belum disimpan?',
'tours.planner.discardBody':
'Edit yang belum disimpan akan dibuang. Tur tersimpan beserta titik lintasan, berkas, dan penetapan harinya tidak akan diubah.',
'tours.planner.save': 'Simpan tur',
'tours.planner.saved': 'Tur disimpan',
'tours.planner.planAnother': 'Rencanakan tur lain',
'tours.planner.assignToDay': 'Tetapkan ke hari',
'tours.planner.tripTours': 'Tur dalam perjalanan ini',
'tours.planner.safetyNote': 'Perhitungan rute hanya membantu perencanaan, bukan jaminan keselamatan.',
'tours.planner.safetyNoteDetails':
'Tag tingkat kesulitan OSM mungkin tidak tersedia atau keliru. Cuaca, penutupan jalur, dan kondisi terkini tidak dievaluasi.',
'tours.planner.maxDifficulty': 'Tingkat kesulitan jalur maksimum',
'tours.planner.difficulty.t1': 'T1 - Pendakian',
'tours.planner.difficulty.t2': 'T2 - Pendakian gunung',
'tours.planner.difficulty.t3': 'T3 - Pendakian gunung menantang',
'tours.planner.difficulty.t4': 'T4 - Pendakian alpin',
'tours.planner.difficulty.t5': 'T5 - Pendakian alpin menantang',
'tours.planner.difficulty.t6': 'T6 - Pendakian alpin sulit',
'tours.planner.difficulty.t3Warning':
'Rute T3 dapat mencakup jalur gunung terbuka dengan risiko jatuh atau jalur yang menuntut keterampilan teknis. Diperlukan pijakan yang mantap dan kemampuan menghadapi ketinggian tanpa rasa takut.',
'tours.planner.difficulty.alpineTitle': 'Aktifkan perhitungan rute alpin?',
'tours.planner.difficulty.alpineBody':
'Perhitungan rute alpin diaktifkan. Rute dapat melintasi medan terbuka dengan risiko jatuh, tanpa penanda, atau sulit secara teknis. Data tingkat kesulitan OSM mungkin tidak tersedia atau keliru.',
'tours.planner.difficulty.enable': 'Aktifkan perhitungan rute alpin',
'tours.planner.openFailed': 'Tur tersimpan tidak dapat dibuka untuk diedit.',
'tours.planner.status.dirty': 'Menunggu perhitungan',
'tours.planner.status.routing': 'Menghitung rute berjalan kaki...',
'tours.planner.status.routingFailed':
'Perhitungan rute gagal. Rute terakhir yang berhasil dihitung tetap ditampilkan.',
'tours.planner.status.elevation': 'Memuat elevasi...',
'tours.planner.status.elevationFailed': 'Elevasi tidak tersedia. Rute yang telah dihitung tetap ditampilkan.',
'tours.planner.status.ready': 'Rute dan elevasi siap',
'tours.planner.status.saving': 'Menyimpan...',
'tours.planner.status.saveFailed': 'Tur tidak dapat disimpan. Draf Anda tetap tersedia.',
'tours.planner.retry': 'Coba lagi',
'tours.planner.inspector.title': 'Ringkasan tur',
'tours.planner.inspector.empty': 'Detail rute muncul di sini setelah dua titik lintasan terhubung.',
'tours.planner.inspector.distance': 'Jarak',
'tours.planner.inspector.duration': 'Waktu berjalan kaki',
'tours.planner.inspector.elevation': 'Profil elevasi',
'tours.planner.inspector.profileFocus': 'Pada jarak {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Profil ditampilkan saat data elevasi rute tersedia.',
'tours.planner.gpxNoGeometry': 'Geometri rute tidak tersedia untuk impor GPX ini.',
'tours.planner.mobileHint':
'Perencanaan tur tersedia di tablet dan komputer. Tur tersimpan dapat dilihat dan dijadwalkan di sini.',
'tourTypes.hike': 'Pendakian',
'tourTypes.bike': 'Tur sepeda',
'tourTypes.run': 'Lari',
'tourTypes.ski': 'Tur ski',
'tourTypes.kayak': 'Berkayak',
'tourTypes.walk': 'Jalan-jalan kota / wisata',
'tourTypes.food': 'Tur kuliner / anggur',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+135
View File
@@ -0,0 +1,135 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Escursioni',
'tours.mode.places': 'Luoghi',
'tours.mode.tours': 'Escursioni',
'tours.mode.label': 'Aggiungi vista',
'tours.title': 'Escursioni',
'tours.subtitle': 'Escursioni a piedi e altre uscite in giornata per questo viaggio',
'tours.empty.title': 'Nessuna escursione ancora',
'tours.empty.body': "Pianifica un'escursione o importa un file GPX per iniziare.",
'tours.addToDay': 'Aggiungi a un giorno',
'tours.addToDay.comingSoon': 'Assegna le escursioni a un giorno del viaggio dalla lista delle escursioni.',
'tours.addToDay.pickDay': 'Scegli un giorno',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Importazione GPX',
'tours.badge.planned': 'pianificata in TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'usare con cautela',
'tours.caution.tooltip': 'Quote o metriche incomplete: importata con riserva',
'tours.import.caution': 'Importata con riserva: quote o metriche incomplete',
'tours.import.success': '{count} escursioni importate da GPX',
'tours.import.successOne': '1 escursione importata da GPX',
'tours.import.noTrack': 'Nessuna traccia o percorso trovato nel file GPX',
'tours.import.error': 'Impossibile importare il file GPX',
'tours.delete.confirmBody':
'Eliminare definitivamente questo tour? Verranno rimossi il percorso, i waypoint modificabili e le assegnazioni ai giorni. L’azione non può essere annullata.',
'tours.delete.bulkConfirmBody':
'La selezione include almeno un tour. Tutti i luoghi selezionati verranno eliminati definitivamente e non potranno essere ripristinati. Verranno rimossi anche i percorsi, i waypoint modificabili e le assegnazioni ai giorni dei tour.',
'tours.delete.confirmAction': 'Elimina definitivamente',
'tours.addedToDay': 'Aggiunta al giorno {n}',
'tours.dayRoute.endpointUnknown':
"Impossibile determinare il punto di arrivo dell'escursione. I collegamenti successivi potrebbero essere incompleti.",
'tours.detail.trackColor': 'Colore della traccia',
'tours.detail.distance': 'Distanza',
'tours.detail.minAltitude': 'Quota minima',
'tours.detail.maxAltitude': 'Quota massima',
'tours.detail.ascent': 'Dislivello positivo',
'tours.detail.descent': 'Dislivello negativo',
'tours.detail.difficulty': 'Difficoltà',
'tours.detail.source': 'Origine',
'tours.detail.gpxReadOnly':
'Le escursioni GPX sono di sola lettura e non possono ancora essere modificate nel pianificatore.',
'tours.detail.navigationHint': 'La navigazione apre il punto di partenza del sentiero; non guida lungo il percorso.',
'tours.planner.title': "Pianifica un'escursione",
'tours.planner.newTour': 'Pianifica nuova escursione',
'tours.planner.neutralTitle': "Pianifica un'escursione",
'tours.planner.neutralBody': 'Inizia un nuovo percorso e fai clic sulla mappa per posizionarne i punti.',
'tours.planner.newTitle': 'Nuova escursione',
'tours.planner.editTitle': 'Modifica escursione',
'tours.planner.gpxTitle': 'Escursione GPX',
'tours.planner.backToTours': 'Torna alle escursioni',
'tours.planner.restored': 'Bozza non salvata ripristinata',
'tours.planner.discardChanges': 'Scarta modifiche',
'tours.planner.discardUnsaved': 'Scarta modifiche non salvate',
'tours.planner.saveChanges': 'Salva modifiche',
'tours.planner.newTourConfirmTitle': 'Iniziare una nuova escursione?',
'tours.planner.newTourConfirmBody':
'Le modifiche non salvate a questa escursione verranno scartate. Le escursioni salvate non verranno modificate.',
'tours.planner.newTourConfirm': 'Scarta e inizia nuova escursione',
'tours.planner.startingPoint': 'Fai clic sulla mappa per aggiungere il punto di partenza.',
'tours.planner.firstUseDetails':
'Aggiungi un altro punto per calcolare un percorso. Il percorso e le quote si aggiornano automaticamente; salva quando hai finito.',
'tours.planner.collapseElevation': 'Comprimi profilo altimetrico',
'tours.planner.expandElevation': 'Espandi profilo altimetrico',
'tours.planner.name': "Nome dell'escursione",
'tours.planner.namePlaceholder': 'Escursione a piedi senza titolo',
'tours.planner.mapHint': 'Fai clic sulla mappa per aggiungere punti.',
'tours.planner.waypoints': 'Punti di passaggio',
'tours.planner.waypointLabel': 'Punto di passaggio {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Aggiungi almeno due punti per calcolare un percorso a piedi.',
'tours.planner.start': 'Partenza',
'tours.planner.via': 'Passaggio per',
'tours.planner.end': 'Arrivo',
'tours.planner.moveUp': 'Sposta punto di passaggio in alto',
'tours.planner.moveDown': 'Sposta punto di passaggio in basso',
'tours.planner.remove': 'Rimuovi punto di passaggio',
'tours.planner.undo': 'Annulla modifica al punto di passaggio',
'tours.planner.redo': 'Ripeti modifica al punto di passaggio',
'tours.planner.discard': 'Scarta bozza',
'tours.planner.discardTitle': "Scartare le modifiche non salvate all'escursione?",
'tours.planner.discardBody':
"Le modifiche non salvate verranno scartate. L'escursione salvata, i suoi punti di passaggio, file e assegnazioni non verranno modificati.",
'tours.planner.save': 'Salva escursione',
'tours.planner.saved': 'Escursione salvata',
'tours.planner.planAnother': "Pianificane un'altra",
'tours.planner.assignToDay': 'Assegna a un giorno',
'tours.planner.tripTours': 'Escursioni di questo viaggio',
'tours.planner.safetyNote': 'Il calcolo del percorso aiuta a pianificare, ma non garantisce la sicurezza.',
'tours.planner.safetyNoteDetails':
'Le indicazioni di difficoltà di OSM possono essere assenti o errate. Meteo, chiusure e condizioni attuali non vengono valutati.',
'tours.planner.maxDifficulty': 'Difficoltà massima del sentiero',
'tours.planner.difficulty.t1': 'T1 — Escursionismo',
'tours.planner.difficulty.t2': 'T2 — Escursionismo di montagna',
'tours.planner.difficulty.t3': 'T3 — Escursionismo di montagna impegnativo',
'tours.planner.difficulty.t4': 'T4 — Escursionismo alpino',
'tours.planner.difficulty.t5': 'T5 — Escursionismo alpino impegnativo',
'tours.planner.difficulty.t6': 'T6 — Escursionismo alpino difficile',
'tours.planner.difficulty.t3Warning':
'I percorsi T3 possono includere sentieri di montagna esposti o tecnicamente impegnativi che richiedono passo sicuro e assenza di vertigini.',
'tours.planner.difficulty.alpineTitle': 'Attivare il calcolo dei percorsi alpini?',
'tours.planner.difficulty.alpineBody':
'Il calcolo dei percorsi alpini è attivo. I percorsi possono attraversare terreni esposti, non segnalati o tecnicamente difficili. I dati di difficoltà di OSM possono essere assenti o errati.',
'tours.planner.difficulty.enable': 'Attiva percorsi alpini',
'tours.planner.openFailed': "Impossibile aprire l'escursione salvata per modificarla.",
'tours.planner.status.dirty': 'In attesa del calcolo',
'tours.planner.status.routing': 'Calcolo del percorso a piedi…',
'tours.planner.status.routingFailed': "Calcolo del percorso non riuscito. L'ultimo percorso valido resta visibile.",
'tours.planner.status.elevation': 'Caricamento delle quote…',
'tours.planner.status.elevationFailed': 'Le quote non sono disponibili. Il percorso calcolato resta visibile.',
'tours.planner.status.ready': 'Percorso e quote pronti',
'tours.planner.status.saving': 'Salvataggio…',
'tours.planner.status.saveFailed': "Impossibile salvare l'escursione. La bozza è ancora disponibile.",
'tours.planner.retry': 'Riprova',
'tours.planner.inspector.title': "Riepilogo dell'escursione",
'tours.planner.inspector.empty': 'I dettagli del percorso appaiono qui dopo aver collegato due punti di passaggio.',
'tours.planner.inspector.distance': 'Distanza',
'tours.planner.inspector.duration': 'Tempo di cammino',
'tours.planner.inspector.elevation': 'Profilo altimetrico',
'tours.planner.inspector.profileFocus': 'A {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'Il profilo viene mostrato quando sono disponibili i dati altimetrici del percorso.',
'tours.planner.gpxNoGeometry': 'La geometria del percorso non è disponibile per questa importazione GPX.',
'tours.planner.mobileHint':
'La pianificazione delle escursioni è disponibile su tablet e computer. Qui puoi visualizzare le escursioni salvate e assegnarle a un giorno.',
'tourTypes.hike': 'Escursione a piedi',
'tourTypes.bike': 'Escursione in bici',
'tourTypes.run': 'Corsa',
'tourTypes.ski': 'Escursione con gli sci',
'tourTypes.kayak': 'Escursione in kayak',
'tourTypes.walk': 'Passeggiata urbana / turistica',
'tourTypes.food': 'Tour enogastronomico',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+131
View File
@@ -0,0 +1,131 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'ツアー',
'tours.mode.places': 'スポット',
'tours.mode.tours': 'ツアー',
'tours.mode.label': '追加する項目',
'tours.title': 'ツアー',
'tours.subtitle': 'この旅行のハイキングと日帰りツアー',
'tours.empty.title': 'ツアーはまだありません',
'tours.empty.body': 'ツアーを計画するか、GPXファイルをインポートしてください。',
'tours.addToDay': '日程に追加',
'tours.addToDay.comingSoon': 'ツアー一覧から旅行の日程に割り当てます。',
'tours.addToDay.pickDay': '日程を選択',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPXインポート',
'tours.badge.planned': 'TREKで計画',
'tours.badge.trek': 'TREK',
'tours.caution.badge': '利用時は注意',
'tours.caution.tooltip': '標高・各種データが不完全です。注意が必要な状態でインポートされました。',
'tours.import.caution': '標高・各種データが不完全なため、注意が必要な状態でインポートしました。',
'tours.import.success': 'GPXから{count}件のツアーをインポートしました',
'tours.import.successOne': 'GPXから1件のツアーをインポートしました',
'tours.import.noTrack': 'このGPXファイルにトラックやルートが見つかりません',
'tours.import.error': 'GPXファイルをインポートできませんでした',
'tours.delete.confirmBody':
'このツアーを完全に削除しますか?ルート、編集可能な経由地点、日程への割り当ても削除されます。この操作は取り消せません。',
'tours.delete.bulkConfirmBody':
'選択内容にはツアーが1件以上含まれています。選択した場所はすべて完全に削除され、復元できません。ツアーのルート、編集可能な経由地点、日程への割り当ても削除されます。',
'tours.delete.confirmAction': '完全に削除',
'tours.addedToDay': '{n}日目に追加しました',
'tours.dayRoute.endpointUnknown': 'ツアーの終点を特定できませんでした。以降の接続ルートが不完全な場合があります。',
'tours.detail.trackColor': 'トラックの色',
'tours.detail.distance': '距離',
'tours.detail.minAltitude': '最低標高',
'tours.detail.maxAltitude': '最高標高',
'tours.detail.ascent': '累積上昇量',
'tours.detail.descent': '累積下降量',
'tours.detail.difficulty': '難易度',
'tours.detail.source': '出典',
'tours.detail.gpxReadOnly': 'GPXツアーは閲覧専用です。現時点ではプランナーで編集できません。',
'tours.detail.navigationHint': 'ナビには登山口が表示されます。ルートに沿った案内は行いません。',
'tours.planner.title': 'ツアーを計画',
'tours.planner.newTour': '新しいツアーを計画',
'tours.planner.neutralTitle': 'ツアーを計画',
'tours.planner.neutralBody': '新しいツアーを始めて、地図をクリックして経由地点を置きます。',
'tours.planner.newTitle': '新しいツアー',
'tours.planner.editTitle': 'ツアーを編集',
'tours.planner.gpxTitle': 'GPXツアー',
'tours.planner.backToTours': 'ツアー一覧に戻る',
'tours.planner.restored': '未保存の下書きを復元しました',
'tours.planner.discardChanges': '変更を破棄',
'tours.planner.discardUnsaved': '未保存の変更を破棄',
'tours.planner.saveChanges': '変更を保存',
'tours.planner.newTourConfirmTitle': '新しいツアーを開始しますか?',
'tours.planner.newTourConfirmBody': 'このツアーの未保存の変更は破棄されます。保存済みのツアーは変更されません。',
'tours.planner.newTourConfirm': '変更を破棄して新しいツアーを開始',
'tours.planner.startingPoint': '地図をクリックして出発地点を追加してください。',
'tours.planner.firstUseDetails':
'もう1地点追加するとルートを計算します。ルートと標高は自動更新されます。準備ができたら保存してください。',
'tours.planner.collapseElevation': '標高グラフを折りたたむ',
'tours.planner.expandElevation': '標高グラフを展開',
'tours.planner.name': 'ツアー名',
'tours.planner.namePlaceholder': '名前のないハイキング',
'tours.planner.mapHint': '地図をクリックして地点を追加します。',
'tours.planner.waypoints': 'ルート上の地点',
'tours.planner.waypointLabel': '地点{n}',
'tours.durationMinutes': '{count}分',
'tours.planner.empty': '徒歩ルートを計算するには、2地点以上追加してください。',
'tours.planner.start': '出発地点',
'tours.planner.via': '経由地点',
'tours.planner.end': '到着地点',
'tours.planner.moveUp': '地点を上へ移動',
'tours.planner.moveDown': '地点を下へ移動',
'tours.planner.remove': '地点を削除',
'tours.planner.undo': '地点の編集を元に戻す',
'tours.planner.redo': '地点の編集をやり直す',
'tours.planner.discard': '下書きを破棄',
'tours.planner.discardTitle': 'ツアーの未保存の変更を破棄しますか?',
'tours.planner.discardBody':
'未保存の編集内容は破棄されます。保存済みのツアー、地点、ファイル、日程への割り当ては変更されません。',
'tours.planner.save': 'ツアーを保存',
'tours.planner.saved': 'ツアーを保存しました',
'tours.planner.planAnother': '別のツアーを計画',
'tours.planner.assignToDay': '日程に割り当て',
'tours.planner.tripTours': 'この旅行のツアー',
'tours.planner.safetyNote': 'ルート検索は計画の補助であり、安全を保証するものではありません。',
'tours.planner.safetyNoteDetails':
'OSMの難易度タグは欠落していたり、誤っていたりする場合があります。天候、通行止め、現地の最新状況は評価されません。',
'tours.planner.maxDifficulty': '登山道の難易度上限',
'tours.planner.difficulty.t1': 'T1:ハイキング',
'tours.planner.difficulty.t2': 'T2:山岳ハイキング',
'tours.planner.difficulty.t3': 'T3:上級山岳ハイキング',
'tours.planner.difficulty.t4': 'T4:アルパインハイキング',
'tours.planner.difficulty.t5': 'T5:上級アルパインハイキング',
'tours.planner.difficulty.t6': 'T6:難度の高いアルパインハイキング',
'tours.planner.difficulty.t3Warning':
'T3のルートには、転落の危険がある箇所や技術を要する登山道が含まれる場合があります。確かな足運びと、高所でも動じないことが求められます。',
'tours.planner.difficulty.alpineTitle': 'アルパインルート検索を有効にしますか?',
'tours.planner.difficulty.alpineBody':
'アルパインルート検索が有効になります。転落の危険がある場所、道標や目印のない場所、技術的に難しい地形を通る場合があります。OSMの難易度データは欠落や誤りがある場合があります。',
'tours.planner.difficulty.enable': 'アルパインルート検索を有効にする',
'tours.planner.openFailed': '保存済みのツアーを編集用に開けませんでした。',
'tours.planner.status.dirty': '計算待ち',
'tours.planner.status.routing': '徒歩ルートを計算中…',
'tours.planner.status.routingFailed': 'ルートの計算に失敗しました。直前に計算できたルートを引き続き表示しています。',
'tours.planner.status.elevation': '標高を読み込み中…',
'tours.planner.status.elevationFailed': '標高を取得できません。計算済みのルートを引き続き表示しています。',
'tours.planner.status.ready': 'ルートと標高の準備完了',
'tours.planner.status.saving': '保存中…',
'tours.planner.status.saveFailed': 'ツアーを保存できませんでした。下書きは保持されています。',
'tours.planner.retry': '再試行',
'tours.planner.inspector.title': 'ツアーの概要',
'tours.planner.inspector.empty': '2地点を接続すると、ここにルートの詳細が表示されます。',
'tours.planner.inspector.distance': '距離',
'tours.planner.inspector.duration': '歩行時間',
'tours.planner.inspector.elevation': '標高グラフ',
'tours.planner.inspector.profileFocus': '距離{distance}:標高{elevation}',
'tours.planner.inspector.elevationPlaceholder': 'ルートの標高データが取得できると、グラフが表示されます。',
'tours.planner.gpxNoGeometry': 'このGPXインポートにはルートの形状データがありません。',
'tours.planner.mobileHint':
'ツアーの計画はタブレットとパソコンで利用できます。ここでは保存済みのツアーを閲覧し、日程に割り当てられます。',
'tourTypes.hike': 'ハイキング',
'tourTypes.bike': 'サイクリング',
'tourTypes.run': 'ランニング',
'tourTypes.ski': 'スキーツアー',
'tourTypes.kayak': 'カヤック',
'tourTypes.walk': '街歩き・観光',
'tourTypes.food': 'グルメ・ワインツアー',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+132
View File
@@ -0,0 +1,132 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': '투어',
'tours.mode.places': '장소',
'tours.mode.tours': '투어',
'tours.mode.label': '추가 항목 보기',
'tours.title': '투어',
'tours.subtitle': '이 여행의 하이킹과 당일 투어',
'tours.empty.title': '아직 투어가 없습니다',
'tours.empty.body': '투어를 계획하거나 GPX 파일을 가져와 시작하세요.',
'tours.addToDay': '일정에 추가',
'tours.addToDay.comingSoon': '투어 목록에서 여행의 특정 날짜에 투어를 배정하세요.',
'tours.addToDay.pickDay': '날짜 선택',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX 가져오기',
'tours.badge.planned': 'TREK에서 계획됨',
'tours.badge.trek': 'TREK',
'tours.caution.badge': '이용 시 주의',
'tours.caution.tooltip': '고도 또는 측정 데이터가 불완전하여 주의가 필요한 상태로 가져왔습니다',
'tours.import.caution': '고도 또는 측정 데이터가 불완전하여 주의가 필요한 상태로 가져왔습니다',
'tours.import.success': 'GPX에서 투어 {count}개를 가져왔습니다',
'tours.import.successOne': 'GPX에서 투어 1개를 가져왔습니다',
'tours.import.noTrack': '이 GPX 파일에서 트랙이나 경로를 찾을 수 없습니다',
'tours.import.error': 'GPX 파일을 가져오지 못했습니다',
'tours.delete.confirmBody':
'이 투어를 영구 삭제할까요? 경로, 편집 가능한 경유 지점 및 날짜 배정이 삭제됩니다. 이 작업은 되돌릴 수 없습니다.',
'tours.delete.bulkConfirmBody':
'선택 항목에 투어가 하나 이상 포함되어 있습니다. 선택한 장소가 모두 영구 삭제되며 복원할 수 없습니다. 투어의 경로, 편집 가능한 경유 지점 및 날짜 배정도 삭제됩니다.',
'tours.delete.confirmAction': '영구 삭제',
'tours.addedToDay': '{n}일차에 추가했습니다',
'tours.dayRoute.endpointUnknown': '투어의 종점을 확인할 수 없습니다. 이후 연결 경로가 불완전할 수 있습니다.',
'tours.detail.trackColor': '트랙 색상',
'tours.detail.distance': '거리',
'tours.detail.minAltitude': '최저 고도',
'tours.detail.maxAltitude': '최고 고도',
'tours.detail.ascent': '누적 상승 고도',
'tours.detail.descent': '누적 하강 고도',
'tours.detail.difficulty': '난이도',
'tours.detail.source': '출처',
'tours.detail.gpxReadOnly': 'GPX 투어는 조회만 가능하며, 아직 플래너에서 편집할 수 없습니다.',
'tours.detail.navigationHint': '길찾기는 탐방로 입구를 목적지로 엽니다. 투어 경로를 따라 안내하지는 않습니다.',
'tours.planner.title': '투어 계획',
'tours.planner.newTour': '새 투어 계획',
'tours.planner.neutralTitle': '투어 계획',
'tours.planner.neutralBody': '새 투어를 시작하고 지도를 클릭해 경유 지점을 놓으세요.',
'tours.planner.newTitle': '새 투어',
'tours.planner.editTitle': '투어 편집',
'tours.planner.gpxTitle': 'GPX 투어',
'tours.planner.backToTours': '투어 목록으로',
'tours.planner.restored': '저장하지 않은 초안을 복원했습니다',
'tours.planner.discardChanges': '변경 사항 버리기',
'tours.planner.discardUnsaved': '저장하지 않은 변경 사항 버리기',
'tours.planner.saveChanges': '변경 사항 저장',
'tours.planner.newTourConfirmTitle': '새 투어를 시작할까요?',
'tours.planner.newTourConfirmBody':
'이 투어의 저장하지 않은 변경 사항은 삭제됩니다. 저장된 투어는 변경되지 않습니다.',
'tours.planner.newTourConfirm': '변경 사항을 버리고 새 투어 시작',
'tours.planner.startingPoint': '지도를 클릭해 출발 지점을 추가하세요.',
'tours.planner.firstUseDetails':
'지점을 하나 더 추가하면 경로를 계산합니다. 경로와 고도는 자동으로 업데이트됩니다. 준비가 되면 저장하세요.',
'tours.planner.collapseElevation': '고도 그래프 접기',
'tours.planner.expandElevation': '고도 그래프 펼치기',
'tours.planner.name': '투어 이름',
'tours.planner.namePlaceholder': '이름 없는 하이킹',
'tours.planner.mapHint': '지도를 클릭해 지점을 추가하세요.',
'tours.planner.waypoints': '경로 지점',
'tours.planner.waypointLabel': '지점 {n}',
'tours.durationMinutes': '{count}분',
'tours.planner.empty': '도보 경로를 계산하려면 지점을 두 개 이상 추가하세요.',
'tours.planner.start': '출발',
'tours.planner.via': '경유',
'tours.planner.end': '도착',
'tours.planner.moveUp': '지점 위로 이동',
'tours.planner.moveDown': '지점 아래로 이동',
'tours.planner.remove': '지점 삭제',
'tours.planner.undo': '지점 편집 실행 취소',
'tours.planner.redo': '지점 편집 다시 실행',
'tours.planner.discard': '초안 버리기',
'tours.planner.discardTitle': '저장하지 않은 투어 변경 사항을 버릴까요?',
'tours.planner.discardBody':
'저장하지 않은 편집 내용은 삭제됩니다. 저장된 투어와 지점, 파일, 일정 배정은 변경되지 않습니다.',
'tours.planner.save': '투어 저장',
'tours.planner.saved': '투어를 저장했습니다',
'tours.planner.planAnother': '다른 투어 계획',
'tours.planner.assignToDay': '날짜에 배정',
'tours.planner.tripTours': '이 여행의 투어',
'tours.planner.safetyNote': '경로 계산은 계획을 돕는 기능이며 안전을 보장하지 않습니다.',
'tours.planner.safetyNoteDetails':
'OSM 난이도 태그는 누락되거나 잘못될 수 있습니다. 날씨, 통행 제한, 현재 현장 상태는 평가하지 않습니다.',
'tours.planner.maxDifficulty': '탐방로 최대 난이도',
'tours.planner.difficulty.t1': 'T1 - 하이킹',
'tours.planner.difficulty.t2': 'T2 - 산악 하이킹',
'tours.planner.difficulty.t3': 'T3 - 고난도 산악 하이킹',
'tours.planner.difficulty.t4': 'T4 - 고산 하이킹',
'tours.planner.difficulty.t5': 'T5 - 고난도 고산 하이킹',
'tours.planner.difficulty.t6': 'T6 - 매우 어려운 고산 하이킹',
'tours.planner.difficulty.t3Warning':
'T3 경로에는 추락 위험에 노출된 산길이나 높은 기술이 필요한 산길이 포함될 수 있습니다. 안정적인 발디딤과 높은 곳에서도 두려움 없이 움직이는 능력이 필요합니다.',
'tours.planner.difficulty.alpineTitle': '고산 경로 계산을 활성화할까요?',
'tours.planner.difficulty.alpineBody':
'고산 경로 계산이 활성화됩니다. 경로가 추락 위험에 노출된 지형, 표식이 없는 지형 또는 기술적으로 어려운 지형을 지날 수 있습니다. OSM 난이도 데이터는 누락되거나 잘못될 수 있습니다.',
'tours.planner.difficulty.enable': '고산 경로 계산 활성화',
'tours.planner.openFailed': '저장된 투어를 편집용으로 열지 못했습니다.',
'tours.planner.status.dirty': '계산 대기 중',
'tours.planner.status.routing': '도보 경로 계산 중…',
'tours.planner.status.routingFailed': '경로 계산에 실패했습니다. 마지막으로 계산에 성공한 경로를 계속 표시합니다.',
'tours.planner.status.elevation': '고도 불러오는 중…',
'tours.planner.status.elevationFailed': '고도를 불러올 수 없습니다. 계산된 경로를 계속 표시합니다.',
'tours.planner.status.ready': '경로와 고도 준비 완료',
'tours.planner.status.saving': '저장 중…',
'tours.planner.status.saveFailed': '투어를 저장하지 못했습니다. 초안은 그대로 남아 있습니다.',
'tours.planner.retry': '다시 시도',
'tours.planner.inspector.title': '투어 요약',
'tours.planner.inspector.empty': '두 지점을 연결하면 여기에 경로 정보가 표시됩니다.',
'tours.planner.inspector.distance': '거리',
'tours.planner.inspector.duration': '도보 소요 시간',
'tours.planner.inspector.elevation': '고도 그래프',
'tours.planner.inspector.profileFocus': '{distance} 지점: {elevation}',
'tours.planner.inspector.elevationPlaceholder': '경로의 고도 데이터가 있으면 그래프가 표시됩니다.',
'tours.planner.gpxNoGeometry': '이 GPX 가져오기에는 경로 형상 데이터가 없습니다.',
'tours.planner.mobileHint':
'투어 계획은 태블릿과 컴퓨터에서 이용할 수 있습니다. 여기에서는 저장된 투어를 보고 일정에 배정할 수 있습니다.',
'tourTypes.hike': '하이킹',
'tourTypes.bike': '자전거 투어',
'tourTypes.run': '달리기',
'tourTypes.ski': '스키 투어',
'tourTypes.kayak': '카약',
'tourTypes.walk': '도심 산책 / 관광',
'tourTypes.food': '미식 / 와인 투어',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+134
View File
@@ -0,0 +1,134 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Tochten',
'tours.mode.places': 'Plaatsen',
'tours.mode.tours': 'Tochten',
'tours.mode.label': 'Weergave toevoegen',
'tours.title': 'Tochten',
'tours.subtitle': 'Wandelingen en andere dagtochten voor deze reis',
'tours.empty.title': 'Nog geen tochten',
'tours.empty.body': 'Plan een tocht of importeer een GPX-bestand om te beginnen.',
'tours.addToDay': 'Aan dag toevoegen',
'tours.addToDay.comingSoon': 'Wijs tochten vanuit de tochtenlijst toe aan een reisdag.',
'tours.addToDay.pickDay': 'Kies een dag',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX-import',
'tours.badge.planned': 'gepland in TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'voorzichtig gebruiken',
'tours.caution.tooltip': 'Hoogtegegevens of meetwaarden onvolledig: met voorbehoud geïmporteerd',
'tours.import.caution': 'Met voorbehoud geïmporteerd: hoogtegegevens of meetwaarden onvolledig',
'tours.import.success': '{count} tochten geïmporteerd uit GPX',
'tours.import.successOne': '1 tocht geïmporteerd uit GPX',
'tours.import.noTrack': 'Geen track of route gevonden in dit GPX-bestand',
'tours.import.error': 'GPX-bestand kon niet worden geïmporteerd',
'tours.delete.confirmBody':
'Deze tour definitief verwijderen? De route, bewerkbare routepunten en dagtoewijzingen worden verwijderd. Dit kan niet ongedaan worden gemaakt.',
'tours.delete.bulkConfirmBody':
'Deze selectie bevat minstens één tour. Alle geselecteerde plaatsen worden definitief verwijderd en kunnen niet worden hersteld. Ook de routes, bewerkbare routepunten en dagtoewijzingen van de tours worden verwijderd.',
'tours.delete.confirmAction': 'Definitief verwijderen',
'tours.addedToDay': 'Toegevoegd aan dag {n}',
'tours.dayRoute.endpointUnknown':
'Het eindpunt van de tocht kon niet worden bepaald. Aansluitende verbindingen kunnen onvolledig zijn.',
'tours.detail.trackColor': 'Trackkleur',
'tours.detail.distance': 'Afstand',
'tours.detail.minAltitude': 'Minimale hoogte',
'tours.detail.maxAltitude': 'Maximale hoogte',
'tours.detail.ascent': 'Hoogtemeters omhoog',
'tours.detail.descent': 'Hoogtemeters omlaag',
'tours.detail.difficulty': 'Moeilijkheid',
'tours.detail.source': 'Bron',
'tours.detail.gpxReadOnly': 'GPX-tochten kunnen alleen worden bekeken en nog niet in de planner worden bewerkt.',
'tours.detail.navigationHint': 'De navigatie opent het startpunt van het pad; ze begeleidt je niet langs de route.',
'tours.planner.title': 'Een tocht plannen',
'tours.planner.newTour': 'Nieuwe tocht plannen',
'tours.planner.neutralTitle': 'Een tocht plannen',
'tours.planner.neutralBody': 'Begin een nieuwe tocht en klik op de kaart om de punten te plaatsen.',
'tours.planner.newTitle': 'Nieuwe tocht',
'tours.planner.editTitle': 'Tocht bewerken',
'tours.planner.gpxTitle': 'GPX-tocht',
'tours.planner.backToTours': 'Terug naar tochten',
'tours.planner.restored': 'Niet-opgeslagen concept hersteld',
'tours.planner.discardChanges': 'Wijzigingen verwerpen',
'tours.planner.discardUnsaved': 'Niet-opgeslagen wijzigingen verwerpen',
'tours.planner.saveChanges': 'Wijzigingen opslaan',
'tours.planner.newTourConfirmTitle': 'Een nieuwe tocht starten?',
'tours.planner.newTourConfirmBody':
'Je niet-opgeslagen wijzigingen aan deze tocht worden verworpen. Opgeslagen tochten blijven ongewijzigd.',
'tours.planner.newTourConfirm': 'Verwerpen en nieuwe tocht starten',
'tours.planner.startingPoint': 'Klik op de kaart om je startpunt toe te voegen.',
'tours.planner.firstUseDetails':
'Voeg nog een punt toe om een route te berekenen. De route en hoogtegegevens worden automatisch bijgewerkt; sla op wanneer je klaar bent.',
'tours.planner.collapseElevation': 'Hoogteprofiel inklappen',
'tours.planner.expandElevation': 'Hoogteprofiel uitklappen',
'tours.planner.name': 'Naam van de tocht',
'tours.planner.namePlaceholder': 'Naamloze wandeling',
'tours.planner.mapHint': 'Klik op de kaart om punten toe te voegen.',
'tours.planner.waypoints': 'Routepunten',
'tours.planner.waypointLabel': 'Routepunt {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Voeg minstens twee punten toe om een wandelroute te berekenen.',
'tours.planner.start': 'Vertrek',
'tours.planner.via': 'Via',
'tours.planner.end': 'Einde',
'tours.planner.moveUp': 'Routepunt omhoog verplaatsen',
'tours.planner.moveDown': 'Routepunt omlaag verplaatsen',
'tours.planner.remove': 'Routepunt verwijderen',
'tours.planner.undo': 'Routepuntbewerking ongedaan maken',
'tours.planner.redo': 'Routepuntbewerking opnieuw uitvoeren',
'tours.planner.discard': 'Concept verwerpen',
'tours.planner.discardTitle': 'Niet-opgeslagen wijzigingen aan de tocht verwerpen?',
'tours.planner.discardBody':
'Je niet-opgeslagen wijzigingen worden verworpen. De opgeslagen tocht, de routepunten, bestanden en toewijzingen blijven ongewijzigd.',
'tours.planner.save': 'Tocht opslaan',
'tours.planner.saved': 'Tocht opgeslagen',
'tours.planner.planAnother': 'Nog een tocht plannen',
'tours.planner.assignToDay': 'Aan een dag toewijzen',
'tours.planner.tripTours': 'Tochten van deze reis',
'tours.planner.safetyNote': 'Routeberekening helpt bij het plannen, maar biedt geen veiligheidsgarantie.',
'tours.planner.safetyNoteDetails':
'Moeilijkheidslabels in OSM kunnen ontbreken of onjuist zijn. Weer, afsluitingen en actuele omstandigheden worden niet beoordeeld.',
'tours.planner.maxDifficulty': 'Maximale moeilijkheid van het pad',
'tours.planner.difficulty.t1': 'T1 — Wandelen',
'tours.planner.difficulty.t2': 'T2 — Bergwandelen',
'tours.planner.difficulty.t3': 'T3 — Veeleisend bergwandelen',
'tours.planner.difficulty.t4': 'T4 — Alpien wandelen',
'tours.planner.difficulty.t5': 'T5 — Veeleisend alpien wandelen',
'tours.planner.difficulty.t6': 'T6 — Moeilijk alpien wandelen',
'tours.planner.difficulty.t3Warning':
'T3-routes kunnen blootgestelde of technisch veeleisende bergpaden bevatten die tredzekerheid en geen hoogtevrees vereisen.',
'tours.planner.difficulty.alpineTitle': 'Alpiene routeberekening inschakelen?',
'tours.planner.difficulty.alpineBody':
'Alpiene routeberekening is ingeschakeld. Routes kunnen over blootgesteld, ongemarkeerd of technisch moeilijk terrein lopen. Moeilijkheidsgegevens in OSM kunnen ontbreken of onjuist zijn.',
'tours.planner.difficulty.enable': 'Alpiene routes inschakelen',
'tours.planner.openFailed': 'De opgeslagen tocht kon niet worden geopend om te bewerken.',
'tours.planner.status.dirty': 'Wachten op berekening',
'tours.planner.status.routing': 'Wandelroute berekenen…',
'tours.planner.status.routingFailed': 'Routeberekening mislukt. De laatste geldige route blijft zichtbaar.',
'tours.planner.status.elevation': 'Hoogtegegevens laden…',
'tours.planner.status.elevationFailed': 'Hoogtegegevens zijn niet beschikbaar. De berekende route blijft zichtbaar.',
'tours.planner.status.ready': 'Route en hoogtegegevens gereed',
'tours.planner.status.saving': 'Opslaan…',
'tours.planner.status.saveFailed': 'De tocht kon niet worden opgeslagen. Je concept is nog beschikbaar.',
'tours.planner.retry': 'Opnieuw proberen',
'tours.planner.inspector.title': 'Tochtoverzicht',
'tours.planner.inspector.empty': 'Routedetails verschijnen hier zodra twee routepunten verbonden zijn.',
'tours.planner.inspector.distance': 'Afstand',
'tours.planner.inspector.duration': 'Wandeltijd',
'tours.planner.inspector.elevation': 'Hoogteprofiel',
'tours.planner.inspector.profileFocus': 'Bij {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'Het profiel wordt getoond zodra hoogtegegevens voor de route beschikbaar zijn.',
'tours.planner.gpxNoGeometry': 'De routegeometrie is niet beschikbaar voor deze GPX-import.',
'tours.planner.mobileHint':
'Tochten plannen kan op een tablet of computer. Hier kun je opgeslagen tochten bekijken en aan een dag toewijzen.',
'tourTypes.hike': 'Wandeling',
'tourTypes.bike': 'Fietstocht',
'tourTypes.run': 'Hardlooptocht',
'tourTypes.ski': 'Skitocht',
'tourTypes.kayak': 'Kajaktocht',
'tourTypes.walk': 'Stadswandeling / bezienswaardigheden',
'tourTypes.food': 'Culinaire tocht / wijntocht',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+133
View File
@@ -0,0 +1,133 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Wycieczki',
'tours.mode.places': 'Miejsca',
'tours.mode.tours': 'Wycieczki',
'tours.mode.label': 'Widok dodawania',
'tours.title': 'Wycieczki',
'tours.subtitle': 'Wędrówki i inne jednodniowe wycieczki podczas tej podróży',
'tours.empty.title': 'Nie ma jeszcze wycieczek',
'tours.empty.body': 'Zaplanuj wycieczkę lub zaimportuj plik GPX, aby rozpocząć.',
'tours.addToDay': 'Dodaj do dnia',
'tours.addToDay.comingSoon': 'Przypisz wycieczki do dnia podróży z listy wycieczek.',
'tours.addToDay.pickDay': 'Wybierz dzień',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Import GPX',
'tours.badge.planned': 'zaplanowano w TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'korzystaj ostrożnie',
'tours.caution.tooltip': 'Niepełne dane wysokościowe lub parametry – import z zastrzeżeniami',
'tours.import.caution': 'Import z zastrzeżeniami – niepełne dane wysokościowe lub parametry',
'tours.import.success': 'Liczba wycieczek zaimportowanych z GPX: {count}',
'tours.import.successOne': 'Zaimportowano 1 wycieczkę z GPX',
'tours.import.noTrack': 'W tym pliku GPX nie znaleziono śladu ani trasy',
'tours.import.error': 'Nie udało się zaimportować pliku GPX',
'tours.delete.confirmBody':
'Usunąć tę trasę na stałe? Jej przebieg, edytowalne punkty trasy i przypisania do dni zostaną usunięte. Tej czynności nie można cofnąć.',
'tours.delete.bulkConfirmBody':
'Ten wybór obejmuje co najmniej jedną trasę. Wszystkie wybrane miejsca zostaną trwale usunięte i nie będzie można ich przywrócić. Przebiegi tras, edytowalne punkty i przypisania do dni również zostaną usunięte.',
'tours.delete.confirmAction': 'Usuń na stałe',
'tours.addedToDay': 'Dodano do dnia {n}',
'tours.dayRoute.endpointUnknown':
'Nie udało się ustalić punktu końcowego wycieczki. Kolejne odcinki łączące mogą być niepełne.',
'tours.detail.trackColor': 'Kolor śladu',
'tours.detail.distance': 'Dystans',
'tours.detail.minAltitude': 'Minimalna wysokość n.p.m.',
'tours.detail.maxAltitude': 'Maksymalna wysokość n.p.m.',
'tours.detail.ascent': 'Suma podejść',
'tours.detail.descent': 'Suma zejść',
'tours.detail.difficulty': 'Trudność',
'tours.detail.source': 'Źródło',
'tours.detail.gpxReadOnly': 'Wycieczki GPX można tylko przeglądać; nie można ich jeszcze edytować w planerze.',
'tours.detail.navigationHint': 'Nawigacja otwiera punkt początkowy szlaku; nie prowadzi wzdłuż trasy.',
'tours.planner.title': 'Zaplanuj wycieczkę',
'tours.planner.newTour': 'Zaplanuj nową wycieczkę',
'tours.planner.neutralTitle': 'Zaplanuj wycieczkę',
'tours.planner.neutralBody': 'Rozpocznij nową trasę i kliknij mapę, aby wyznaczyć jej punkty.',
'tours.planner.newTitle': 'Nowa wycieczka',
'tours.planner.editTitle': 'Edytuj wycieczkę',
'tours.planner.gpxTitle': 'Wycieczka GPX',
'tours.planner.backToTours': 'Wróć do wycieczek',
'tours.planner.restored': 'Przywrócono niezapisany szkic',
'tours.planner.discardChanges': 'Odrzuć zmiany',
'tours.planner.discardUnsaved': 'Odrzuć niezapisane zmiany',
'tours.planner.saveChanges': 'Zapisz zmiany',
'tours.planner.newTourConfirmTitle': 'Rozpocząć nową wycieczkę?',
'tours.planner.newTourConfirmBody':
'Niezapisane zmiany tej wycieczki zostaną odrzucone. Zapisane wycieczki nie zostaną zmienione.',
'tours.planner.newTourConfirm': 'Odrzuć zmiany i rozpocznij nową wycieczkę',
'tours.planner.startingPoint': 'Kliknij mapę, aby dodać punkt początkowy.',
'tours.planner.firstUseDetails':
'Dodaj kolejny punkt, aby obliczyć trasę. Trasa i wysokości aktualizują się automatycznie; zapisz wycieczkę, gdy będzie gotowa.',
'tours.planner.collapseElevation': 'Zwiń profil wysokościowy',
'tours.planner.expandElevation': 'Rozwiń profil wysokościowy',
'tours.planner.name': 'Nazwa wycieczki',
'tours.planner.namePlaceholder': 'Wędrówka bez nazwy',
'tours.planner.mapHint': 'Kliknij mapę, aby dodać punkty.',
'tours.planner.waypoints': 'Punkty trasy',
'tours.planner.waypointLabel': 'Punkt trasy {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Dodaj co najmniej dwa punkty, aby obliczyć trasę pieszą.',
'tours.planner.start': 'Początek',
'tours.planner.via': 'Przez',
'tours.planner.end': 'Koniec',
'tours.planner.moveUp': 'Przesuń punkt w górę',
'tours.planner.moveDown': 'Przesuń punkt w dół',
'tours.planner.remove': 'Usuń punkt',
'tours.planner.undo': 'Cofnij zmianę punktu',
'tours.planner.redo': 'Ponów zmianę punktu',
'tours.planner.discard': 'Odrzuć szkic',
'tours.planner.discardTitle': 'Odrzucić niezapisane zmiany wycieczki?',
'tours.planner.discardBody':
'Niezapisane zmiany zostaną odrzucone. Zapisana wycieczka, jej punkty, pliki i przypisania pozostaną bez zmian.',
'tours.planner.save': 'Zapisz wycieczkę',
'tours.planner.saved': 'Wycieczka zapisana',
'tours.planner.planAnother': 'Zaplanuj kolejną',
'tours.planner.assignToDay': 'Przypisz do dnia',
'tours.planner.tripTours': 'Wycieczki w tej podróży',
'tours.planner.safetyNote': 'Wyznaczanie trasy pomaga w planowaniu, ale nie gwarantuje bezpieczeństwa.',
'tours.planner.safetyNoteDetails':
'Oznaczeń trudności w OSM może brakować lub mogą być błędne. Pogoda, zamknięcia szlaków i aktualne warunki nie są oceniane.',
'tours.planner.maxDifficulty': 'Maksymalna trudność szlaku',
'tours.planner.difficulty.t1': 'T1 – Turystyka piesza',
'tours.planner.difficulty.t2': 'T2 – Turystyka górska',
'tours.planner.difficulty.t3': 'T3 – Wymagająca turystyka górska',
'tours.planner.difficulty.t4': 'T4 – Turystyka wysokogórska',
'tours.planner.difficulty.t5': 'T5 – Wymagająca turystyka wysokogórska',
'tours.planner.difficulty.t6': 'T6 – Trudna turystyka wysokogórska',
'tours.planner.difficulty.t3Warning':
'Trasy T3 mogą obejmować eksponowane lub wymagające technicznie szlaki górskie, na których konieczne są pewny krok i odporność na lęk wysokości.',
'tours.planner.difficulty.alpineTitle': 'Włączyć trasy wysokogórskie?',
'tours.planner.difficulty.alpineBody':
'Trasy wysokogórskie są włączone. Mogą prowadzić przez eksponowany, nieoznakowany lub trudny technicznie teren. Danych o trudności w OSM może brakować lub mogą być błędne.',
'tours.planner.difficulty.enable': 'Włącz trasy wysokogórskie',
'tours.planner.openFailed': 'Nie udało się otworzyć zapisanej wycieczki do edycji.',
'tours.planner.status.dirty': 'Oczekiwanie na obliczenie',
'tours.planner.status.routing': 'Obliczanie trasy pieszej…',
'tours.planner.status.routingFailed': 'Nie udało się obliczyć trasy. Nadal widoczna jest ostatnia poprawna trasa.',
'tours.planner.status.elevation': 'Wczytywanie wysokości…',
'tours.planner.status.elevationFailed': 'Dane wysokościowe są niedostępne. Obliczona trasa nadal jest widoczna.',
'tours.planner.status.ready': 'Trasa i wysokości są gotowe',
'tours.planner.status.saving': 'Zapisywanie…',
'tours.planner.status.saveFailed': 'Nie udało się zapisać wycieczki. Szkic został zachowany.',
'tours.planner.retry': 'Spróbuj ponownie',
'tours.planner.inspector.title': 'Podsumowanie wycieczki',
'tours.planner.inspector.empty': 'Szczegóły trasy pojawią się tutaj po połączeniu dwóch punktów.',
'tours.planner.inspector.distance': 'Dystans',
'tours.planner.inspector.duration': 'Czas marszu',
'tours.planner.inspector.elevation': 'Profil wysokościowy',
'tours.planner.inspector.profileFocus': 'Na dystansie {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Profil pojawi się, gdy będą dostępne dane wysokościowe trasy.',
'tours.planner.gpxNoGeometry': 'Geometria trasy jest niedostępna dla tego importu GPX.',
'tours.planner.mobileHint':
'Planowanie wycieczek jest dostępne na tablecie i komputerze. Tutaj możesz przeglądać zapisane wycieczki i przypisywać je do dni.',
'tourTypes.hike': 'Wędrówka piesza',
'tourTypes.bike': 'Wycieczka rowerowa',
'tourTypes.run': 'Bieg',
'tourTypes.ski': 'Wycieczka skiturowa',
'tourTypes.kayak': 'Kajak',
'tourTypes.walk': 'Spacer po mieście / zwiedzanie',
'tourTypes.food': 'Wycieczka kulinarna / winiarska',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+134
View File
@@ -0,0 +1,134 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Туры',
'tours.mode.places': 'Места',
'tours.mode.tours': 'Туры',
'tours.mode.label': 'Режим добавления',
'tours.title': 'Туры',
'tours.subtitle': 'Походы и другие однодневные туры в этой поездке',
'tours.empty.title': 'Туров пока нет',
'tours.empty.body': 'Для начала спланируйте тур или импортируйте файл GPX.',
'tours.addToDay': 'Добавить к дню',
'tours.addToDay.comingSoon': 'Назначайте туры на дни поездки из списка туров.',
'tours.addToDay.pickDay': 'Выберите день',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Импорт GPX',
'tours.badge.planned': 'спланировано в TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'используйте с осторожностью',
'tours.caution.tooltip': 'Данные о высоте или показателях неполные — импорт с оговорками',
'tours.import.caution': 'Импорт с оговорками — данные о высоте или показателях неполные',
'tours.import.success': 'Импортировано туров из GPX: {count}',
'tours.import.successOne': 'Импортирован 1 тур из GPX',
'tours.import.noTrack': 'В этом файле GPX не найден трек или маршрут',
'tours.import.error': 'Не удалось импортировать файл GPX',
'tours.delete.confirmBody':
'Удалить этот маршрут навсегда? Его путь, редактируемые точки и назначения на дни будут удалены. Это действие нельзя отменить.',
'tours.delete.bulkConfirmBody':
'В выборке есть как минимум один маршрут. Все выбранные места будут удалены навсегда, восстановить их будет нельзя. Пути маршрутов, редактируемые точки и назначения на дни также будут удалены.',
'tours.delete.confirmAction': 'Удалить навсегда',
'tours.addedToDay': 'Добавлено к дню {n}',
'tours.dayRoute.endpointUnknown':
'Не удалось определить конечную точку тура. Следующие соединительные участки могут быть неполными.',
'tours.detail.trackColor': 'Цвет трека',
'tours.detail.distance': 'Расстояние',
'tours.detail.minAltitude': 'Минимальная высота',
'tours.detail.maxAltitude': 'Максимальная высота',
'tours.detail.ascent': 'Набор высоты',
'tours.detail.descent': 'Сброс высоты',
'tours.detail.difficulty': 'Сложность',
'tours.detail.source': 'Источник',
'tours.detail.gpxReadOnly': 'Туры GPX доступны только для просмотра; редактировать их в планировщике пока нельзя.',
'tours.detail.navigationHint': 'Навигация открывает начальную точку тропы, но не ведёт по маршруту.',
'tours.planner.title': 'Спланировать тур',
'tours.planner.newTour': 'Спланировать новый тур',
'tours.planner.neutralTitle': 'Спланировать тур',
'tours.planner.neutralBody': 'Начните новый маршрут и нажимайте на карту, чтобы расставить точки.',
'tours.planner.newTitle': 'Новый тур',
'tours.planner.editTitle': 'Редактировать тур',
'tours.planner.gpxTitle': 'Тур GPX',
'tours.planner.backToTours': 'К турам',
'tours.planner.restored': 'Несохранённый черновик восстановлен',
'tours.planner.discardChanges': 'Отменить изменения',
'tours.planner.discardUnsaved': 'Отменить несохранённые изменения',
'tours.planner.saveChanges': 'Сохранить изменения',
'tours.planner.newTourConfirmTitle': 'Начать новый тур?',
'tours.planner.newTourConfirmBody':
'Несохранённые изменения этого тура будут отменены. Сохранённые туры не изменятся.',
'tours.planner.newTourConfirm': 'Отменить изменения и начать новый тур',
'tours.planner.startingPoint': 'Нажмите на карту, чтобы добавить начальную точку.',
'tours.planner.firstUseDetails':
'Добавьте ещё одну точку для расчёта маршрута. Маршрут и высоты обновляются автоматически; сохраните тур, когда он будет готов.',
'tours.planner.collapseElevation': 'Свернуть профиль высот',
'tours.planner.expandElevation': 'Развернуть профиль высот',
'tours.planner.name': 'Название тура',
'tours.planner.namePlaceholder': 'Поход без названия',
'tours.planner.mapHint': 'Нажмите на карту, чтобы добавить точки.',
'tours.planner.waypoints': 'Путевые точки',
'tours.planner.waypointLabel': 'Путевая точка {n}',
'tours.durationMinutes': '{count} мин',
'tours.planner.empty': 'Добавьте хотя бы две точки для расчёта пешего маршрута.',
'tours.planner.start': 'Начало',
'tours.planner.via': 'Через',
'tours.planner.end': 'Конец',
'tours.planner.moveUp': 'Переместить точку выше',
'tours.planner.moveDown': 'Переместить точку ниже',
'tours.planner.remove': 'Удалить точку',
'tours.planner.undo': 'Отменить изменение точки',
'tours.planner.redo': 'Повторить изменение точки',
'tours.planner.discard': 'Удалить черновик',
'tours.planner.discardTitle': 'Отменить несохранённые изменения тура?',
'tours.planner.discardBody':
'Несохранённые изменения будут отменены. Сохранённый тур, его точки, файлы и назначения на дни не изменятся.',
'tours.planner.save': 'Сохранить тур',
'tours.planner.saved': 'Тур сохранён',
'tours.planner.planAnother': 'Спланировать ещё',
'tours.planner.assignToDay': 'Назначить на день',
'tours.planner.tripTours': 'Туры этой поездки',
'tours.planner.safetyNote': 'Расчёт маршрута помогает в планировании, но не гарантирует безопасность.',
'tours.planner.safetyNoteDetails':
'Теги сложности OSM могут отсутствовать или быть неверными. Погода, закрытые участки и текущие условия не оцениваются.',
'tours.planner.maxDifficulty': 'Максимальная сложность тропы',
'tours.planner.difficulty.t1': 'T1 — Пеший поход',
'tours.planner.difficulty.t2': 'T2 — Горный поход',
'tours.planner.difficulty.t3': 'T3 — Сложный горный поход',
'tours.planner.difficulty.t4': 'T4 — Высокогорный поход',
'tours.planner.difficulty.t5': 'T5 — Сложный высокогорный поход',
'tours.planner.difficulty.t6': 'T6 — Очень сложный высокогорный поход',
'tours.planner.difficulty.t3Warning':
'Маршруты T3 могут включать открытые участки над обрывами или технически сложные горные тропы, требующие уверенного шага и отсутствия боязни высоты.',
'tours.planner.difficulty.alpineTitle': 'Разрешить высокогорные маршруты?',
'tours.planner.difficulty.alpineBody':
'Высокогорные маршруты разрешены. Они могут проходить по открытым участкам над обрывами, немаркированной или технически сложной местности. Данные о сложности в OSM могут отсутствовать или быть неверными.',
'tours.planner.difficulty.enable': 'Разрешить высокогорные маршруты',
'tours.planner.openFailed': 'Не удалось открыть сохранённый тур для редактирования.',
'tours.planner.status.dirty': 'Ожидание расчёта',
'tours.planner.status.routing': 'Расчёт пешего маршрута…',
'tours.planner.status.routingFailed':
'Не удалось рассчитать маршрут. По-прежнему отображается последний успешно рассчитанный маршрут.',
'tours.planner.status.elevation': 'Загрузка высот…',
'tours.planner.status.elevationFailed': 'Данные о высоте недоступны. Рассчитанный маршрут по-прежнему отображается.',
'tours.planner.status.ready': 'Маршрут и высоты готовы',
'tours.planner.status.saving': 'Сохранение…',
'tours.planner.status.saveFailed': 'Не удалось сохранить тур. Черновик по-прежнему доступен здесь.',
'tours.planner.retry': 'Повторить',
'tours.planner.inspector.title': 'Сводка тура',
'tours.planner.inspector.empty': 'Сведения о маршруте появятся здесь после соединения двух путевых точек.',
'tours.planner.inspector.distance': 'Расстояние',
'tours.planner.inspector.duration': 'Время пешком',
'tours.planner.inspector.elevation': 'Профиль высот',
'tours.planner.inspector.profileFocus': 'На расстоянии {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Профиль появится, когда будут доступны данные о высоте маршрута.',
'tours.planner.gpxNoGeometry': 'Геометрия маршрута недоступна для этого импорта GPX.',
'tours.planner.mobileHint':
'Планирование туров доступно на планшете и компьютере. Здесь можно просматривать сохранённые туры и назначать их на дни.',
'tourTypes.hike': 'Пеший поход',
'tourTypes.bike': 'Велотур',
'tourTypes.run': 'Пробежка',
'tourTypes.ski': 'Лыжный тур',
'tourTypes.kayak': 'Каякинг',
'tourTypes.walk': 'Прогулка по городу / достопримечательностям',
'tourTypes.food': 'Гастрономический / винный тур',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -71,6 +72,7 @@ const locale = {
...collection,
...atlas,
...trip,
...tours,
...places,
...inspector,
...reservations,
+131
View File
@@ -0,0 +1,131 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Túry',
'tours.mode.places': 'Miesta',
'tours.mode.tours': 'Túry',
'tours.mode.label': 'Zobrazenie pridávania',
'tours.title': 'Túry',
'tours.subtitle': 'Pešie a ďalšie jednodňové túry počas tejto cesty',
'tours.empty.title': 'Zatiaľ žiadne túry',
'tours.empty.body': 'Začnite plánovaním túry alebo importom súboru GPX.',
'tours.addToDay': 'Pridať k dňu',
'tours.addToDay.comingSoon': 'Priraďte túry k dňu cesty zo zoznamu túr.',
'tours.addToDay.pickDay': 'Vyberte deň',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Import GPX',
'tours.badge.planned': 'Naplánované v TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'Používajte opatrne',
'tours.caution.tooltip': 'Neúplné výškové údaje alebo metriky – importované s upozornením',
'tours.import.caution': 'Importované s upozornením – neúplné výškové údaje alebo metriky',
'tours.import.success': 'Počet túr importovaných z GPX: {count}',
'tours.import.successOne': '1 túra importovaná z GPX',
'tours.import.noTrack': 'V tomto súbore GPX sa nenašla žiadna stopa ani trasa',
'tours.import.error': 'Súbor GPX sa nepodarilo importovať',
'tours.delete.confirmBody':
'Naozaj chcete tento výlet natrvalo odstrániť? Odstráni sa jeho trasa, upraviteľné body a priradenia k dňom. Túto akciu nemožno vrátiť späť.',
'tours.delete.bulkConfirmBody':
'Výber obsahuje aspoň jeden výlet. Všetky vybrané miesta sa natrvalo odstránia a nebude možné ich obnoviť. Odstránia sa aj trasy, upraviteľné body a priradenia výletov k dňom.',
'tours.delete.confirmAction': 'Odstrániť natrvalo',
'tours.addedToDay': 'Pridané k dňu {n}',
'tours.dayRoute.endpointUnknown': 'Koncový bod túry sa nepodarilo určiť. Nadväzujúce spojenia môžu byť neúplné.',
'tours.detail.trackColor': 'Farba stopy',
'tours.detail.distance': 'Vzdialenosť',
'tours.detail.minAltitude': 'Minimálna nadmorská výška',
'tours.detail.maxAltitude': 'Maximálna nadmorská výška',
'tours.detail.ascent': 'Stúpanie',
'tours.detail.descent': 'Klesanie',
'tours.detail.difficulty': 'Náročnosť',
'tours.detail.source': 'Zdroj',
'tours.detail.gpxReadOnly': 'Túry z GPX možno len prezerať, zatiaľ ich nemožno upravovať v plánovači.',
'tours.detail.navigationHint': 'Navigácia otvorí začiatok túry; nevedie po trase.',
'tours.planner.title': 'Naplánovať túru',
'tours.planner.newTour': 'Naplánovať novú túru',
'tours.planner.neutralTitle': 'Naplánovať túru',
'tours.planner.neutralBody': 'Začnite novú túru a kliknutím do mapy umiestnite jej body.',
'tours.planner.newTitle': 'Nová túra',
'tours.planner.editTitle': 'Upraviť túru',
'tours.planner.gpxTitle': 'Túra z GPX',
'tours.planner.backToTours': 'Späť na túry',
'tours.planner.restored': 'Neuložený návrh obnovený',
'tours.planner.discardChanges': 'Zahodiť zmeny',
'tours.planner.discardUnsaved': 'Zahodiť neuložené zmeny',
'tours.planner.saveChanges': 'Uložiť zmeny',
'tours.planner.newTourConfirmTitle': 'Začať novú túru?',
'tours.planner.newTourConfirmBody': 'Neuložené zmeny tejto túry sa zahodia. Uložené túry zostanú nezmenené.',
'tours.planner.newTourConfirm': 'Zahodiť zmeny a začať novú túru',
'tours.planner.startingPoint': 'Kliknite na mapu a pridajte začiatočný bod.',
'tours.planner.firstUseDetails':
'Pridajte ďalší bod na výpočet trasy. Trasa a výškové údaje sa aktualizujú automaticky; hotový návrh uložte.',
'tours.planner.collapseElevation': 'Zbaliť výškový profil',
'tours.planner.expandElevation': 'Rozbaliť výškový profil',
'tours.planner.name': 'Názov túry',
'tours.planner.namePlaceholder': 'Pešia túra bez názvu',
'tours.planner.mapHint': 'Kliknutím do mapy pridáte body.',
'tours.planner.waypoints': 'Body trasy',
'tours.planner.waypointLabel': 'Bod trasy {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Pridajte aspoň dva body na výpočet pešej trasy.',
'tours.planner.start': 'Začiatok',
'tours.planner.via': 'Cez',
'tours.planner.end': 'Koniec',
'tours.planner.moveUp': 'Posunúť bod trasy nahor',
'tours.planner.moveDown': 'Posunúť bod trasy nadol',
'tours.planner.remove': 'Odstrániť bod trasy',
'tours.planner.undo': 'Vrátiť úpravu bodu trasy',
'tours.planner.redo': 'Zopakovať úpravu bodu trasy',
'tours.planner.discard': 'Zahodiť návrh',
'tours.planner.discardTitle': 'Zahodiť neuložené zmeny túry?',
'tours.planner.discardBody':
'Neuložené úpravy sa zahodia. Uložená túra, jej body trasy, súbory a priradenia zostanú nezmenené.',
'tours.planner.save': 'Uložiť túru',
'tours.planner.saved': 'Túra uložená',
'tours.planner.planAnother': 'Naplánovať ďalšiu túru',
'tours.planner.assignToDay': 'Priradiť k dňu',
'tours.planner.tripTours': 'Túry tejto cesty',
'tours.planner.safetyNote': 'Výpočet trasy pomáha pri plánovaní, nezaručuje bezpečnosť.',
'tours.planner.safetyNoteDetails':
'Značky náročnosti v OSM môžu chýbať alebo byť nesprávne. Počasie, uzávery a aktuálne podmienky sa nevyhodnocujú.',
'tours.planner.maxDifficulty': 'Maximálna náročnosť chodníka',
'tours.planner.difficulty.t1': 'T1 – Pešia turistika',
'tours.planner.difficulty.t2': 'T2 – Horská turistika',
'tours.planner.difficulty.t3': 'T3 – Náročná horská turistika',
'tours.planner.difficulty.t4': 'T4 – Vysokohorská turistika',
'tours.planner.difficulty.t5': 'T5 – Náročná vysokohorská turistika',
'tours.planner.difficulty.t6': 'T6 – Veľmi náročná vysokohorská turistika',
'tours.planner.difficulty.t3Warning':
'Trasy T3 môžu viesť po exponovaných alebo technicky náročných horských chodníkoch, ktoré vyžadujú istý krok a odolnosť voči závratom vo výškach.',
'tours.planner.difficulty.alpineTitle': 'Povoliť vysokohorské trasy?',
'tours.planner.difficulty.alpineBody':
'Vysokohorské trasy sú povolené. Môžu viesť cez exponovaný, neznačený alebo technicky náročný terén. Údaje o náročnosti v OSM môžu chýbať alebo byť nesprávne.',
'tours.planner.difficulty.enable': 'Povoliť vysokohorské trasy',
'tours.planner.openFailed': 'Uloženú túru sa nepodarilo otvoriť na úpravu.',
'tours.planner.status.dirty': 'Čaká na výpočet',
'tours.planner.status.routing': 'Vypočítava sa pešia trasa…',
'tours.planner.status.routingFailed': 'Výpočet trasy zlyhal. Naďalej sa zobrazuje posledná úspešne vypočítaná trasa.',
'tours.planner.status.elevation': 'Načítavajú sa výškové údaje…',
'tours.planner.status.elevationFailed': 'Výškové údaje nie sú dostupné. Vypočítaná trasa sa naďalej zobrazuje.',
'tours.planner.status.ready': 'Trasa a výškové údaje sú pripravené',
'tours.planner.status.saving': 'Ukladá sa…',
'tours.planner.status.saveFailed': 'Túru sa nepodarilo uložiť. Návrh zostáva zachovaný.',
'tours.planner.retry': 'Skúsiť znova',
'tours.planner.inspector.title': 'Prehľad túry',
'tours.planner.inspector.empty': 'Podrobnosti trasy sa zobrazia po spojení dvoch bodov trasy.',
'tours.planner.inspector.distance': 'Vzdialenosť',
'tours.planner.inspector.duration': 'Čas chôdze',
'tours.planner.inspector.elevation': 'Výškový profil',
'tours.planner.inspector.profileFocus': 'Vo vzdialenosti {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Profil sa zobrazí, keď budú dostupné výškové údaje trasy.',
'tours.planner.gpxNoGeometry': 'Geometria trasy nie je pre tento import GPX dostupná.',
'tours.planner.mobileHint':
'Plánovanie túr je dostupné na tablete a počítači. Tu si môžete uložené túry prezerať a priraďovať k dňom.',
'tourTypes.hike': 'Pešia túra',
'tourTypes.bike': 'Cyklotúra',
'tourTypes.run': 'Beh',
'tourTypes.ski': 'Lyžiarska túra',
'tourTypes.kayak': 'Kajak',
'tourTypes.walk': 'Prechádzka mestom / po pamiatkach',
'tourTypes.food': 'Gastronomická / vínna túra',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+132
View File
@@ -0,0 +1,132 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Turer',
'tours.mode.places': 'Platser',
'tours.mode.tours': 'Turer',
'tours.mode.label': 'Lägg till vy',
'tours.title': 'Turer',
'tours.subtitle': 'Vandringar och andra dagsturer för den här resan',
'tours.empty.title': 'Inga turer ännu',
'tours.empty.body': 'Planera en tur eller importera en GPX-fil för att komma igång.',
'tours.addToDay': 'Lägg till på en dag',
'tours.addToDay.comingSoon': 'Tilldela turer till en resdag från turlistan.',
'tours.addToDay.pickDay': 'Välj en dag',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX-import',
'tours.badge.planned': 'planerad i TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'använd med försiktighet',
'tours.caution.tooltip': 'Ofullständiga höjddata eller mätvärden: importerad med förbehåll',
'tours.import.caution': 'Importerad med förbehåll: ofullständiga höjddata eller mätvärden',
'tours.import.success': '{count} turer importerade från GPX',
'tours.import.successOne': '1 tur importerad från GPX',
'tours.import.noTrack': 'Varken något spår eller någon rutt hittades i GPX-filen',
'tours.import.error': 'Det gick inte att importera GPX-filen',
'tours.delete.confirmBody':
'Ta bort den här turen permanent? Rutten, de redigerbara rutpunkterna och dagstilldelningarna tas bort. Åtgärden kan inte ångras.',
'tours.delete.bulkConfirmBody':
'Urvalet innehåller minst en tur. Alla valda platser tas bort permanent och kan inte återställas. Även turernas rutter, redigerbara rutpunkter och dagstilldelningar tas bort.',
'tours.delete.confirmAction': 'Ta bort permanent',
'tours.addedToDay': 'Tillagd på dag {n}',
'tours.dayRoute.endpointUnknown':
'Turens slutpunkt kunde inte fastställas. Efterföljande anslutningar kan vara ofullständiga.',
'tours.detail.trackColor': 'Spårfärg',
'tours.detail.distance': 'Avstånd',
'tours.detail.minAltitude': 'Lägsta höjd',
'tours.detail.maxAltitude': 'Högsta höjd',
'tours.detail.ascent': 'Höjdmeter uppför',
'tours.detail.descent': 'Höjdmeter nedför',
'tours.detail.difficulty': 'Svårighetsgrad',
'tours.detail.source': 'Källa',
'tours.detail.gpxReadOnly': 'GPX-turer kan bara visas och kan ännu inte redigeras i planeraren.',
'tours.detail.navigationHint': 'Navigeringen öppnar ledens startpunkt; den vägleder inte längs rutten.',
'tours.planner.title': 'Planera en tur',
'tours.planner.newTour': 'Planera ny tur',
'tours.planner.neutralTitle': 'Planera en tur',
'tours.planner.neutralBody': 'Starta en ny tur och klicka på kartan för att placera dess punkter.',
'tours.planner.newTitle': 'Ny tur',
'tours.planner.editTitle': 'Redigera tur',
'tours.planner.gpxTitle': 'GPX-tur',
'tours.planner.backToTours': 'Tillbaka till turer',
'tours.planner.restored': 'Osparat utkast återställt',
'tours.planner.discardChanges': 'Kasta ändringar',
'tours.planner.discardUnsaved': 'Kasta osparade ändringar',
'tours.planner.saveChanges': 'Spara ändringar',
'tours.planner.newTourConfirmTitle': 'Börja på en ny tur?',
'tours.planner.newTourConfirmBody': 'Dina osparade ändringar i den här turen kastas. Sparade turer ändras inte.',
'tours.planner.newTourConfirm': 'Kasta ändringar och börja på ny tur',
'tours.planner.startingPoint': 'Klicka på kartan för att lägga till din startpunkt.',
'tours.planner.firstUseDetails':
'Lägg till en punkt till för att beräkna en rutt. Rutten och höjddata uppdateras automatiskt; spara när du är klar.',
'tours.planner.collapseElevation': 'Fäll ihop höjdprofil',
'tours.planner.expandElevation': 'Fäll ut höjdprofil',
'tours.planner.name': 'Turens namn',
'tours.planner.namePlaceholder': 'Vandring utan namn',
'tours.planner.mapHint': 'Klicka på kartan för att lägga till punkter.',
'tours.planner.waypoints': 'Ruttpunkter',
'tours.planner.waypointLabel': 'Ruttpunkt {n}',
'tours.durationMinutes': '{count} min',
'tours.planner.empty': 'Lägg till minst två punkter för att beräkna en vandringsrutt.',
'tours.planner.start': 'Startpunkt',
'tours.planner.via': 'Via',
'tours.planner.end': 'Slutpunkt',
'tours.planner.moveUp': 'Flytta ruttpunkt uppåt',
'tours.planner.moveDown': 'Flytta ruttpunkt nedåt',
'tours.planner.remove': 'Ta bort ruttpunkt',
'tours.planner.undo': 'Ångra ändring av ruttpunkt',
'tours.planner.redo': 'Gör om ändring av ruttpunkt',
'tours.planner.discard': 'Kasta utkast',
'tours.planner.discardTitle': 'Kasta osparade ändringar i turen?',
'tours.planner.discardBody':
'Dina osparade ändringar kastas. Den sparade turen, dess ruttpunkter, filer och tilldelningar ändras inte.',
'tours.planner.save': 'Spara tur',
'tours.planner.saved': 'Tur sparad',
'tours.planner.planAnother': 'Planera en till',
'tours.planner.assignToDay': 'Tilldela till en dag',
'tours.planner.tripTours': 'Turer för den här resan',
'tours.planner.safetyNote': 'Ruttberäkningen hjälper till med planeringen, men garanterar inte säkerheten.',
'tours.planner.safetyNoteDetails':
'Svårighetstaggar i OSM kan saknas eller vara felaktiga. Väder, avstängningar och aktuella förhållanden bedöms inte.',
'tours.planner.maxDifficulty': 'Högsta svårighetsgrad för leden',
'tours.planner.difficulty.t1': 'T1 — Vandring',
'tours.planner.difficulty.t2': 'T2 — Bergsvandring',
'tours.planner.difficulty.t3': 'T3 — Krävande bergsvandring',
'tours.planner.difficulty.t4': 'T4 — Alpin vandring',
'tours.planner.difficulty.t5': 'T5 — Krävande alpin vandring',
'tours.planner.difficulty.t6': 'T6 — Svår alpin vandring',
'tours.planner.difficulty.t3Warning':
'T3-rutter kan innehålla exponerade eller tekniskt krävande bergsleder som kräver att du är stadig på foten och inte höjdrädd.',
'tours.planner.difficulty.alpineTitle': 'Aktivera alpin ruttberäkning?',
'tours.planner.difficulty.alpineBody':
'Alpin ruttberäkning är aktiverad. Rutter kan gå över exponerad, omarkerad eller tekniskt svår terräng. Svårighetsdata i OSM kan saknas eller vara felaktiga.',
'tours.planner.difficulty.enable': 'Aktivera alpina rutter',
'tours.planner.openFailed': 'Den sparade turen kunde inte öppnas för redigering.',
'tours.planner.status.dirty': 'Väntar på beräkning',
'tours.planner.status.routing': 'Beräknar vandringsrutt…',
'tours.planner.status.routingFailed': 'Ruttberäkningen misslyckades. Den senaste giltiga rutten visas fortfarande.',
'tours.planner.status.elevation': 'Läser in höjddata…',
'tours.planner.status.elevationFailed': 'Höjddata är inte tillgängliga. Den beräknade rutten visas fortfarande.',
'tours.planner.status.ready': 'Rutt och höjddata klara',
'tours.planner.status.saving': 'Sparar…',
'tours.planner.status.saveFailed': 'Turen kunde inte sparas. Ditt utkast finns kvar.',
'tours.planner.retry': 'Försök igen',
'tours.planner.inspector.title': 'Turöversikt',
'tours.planner.inspector.empty': 'Ruttdetaljer visas här när två ruttpunkter har kopplats ihop.',
'tours.planner.inspector.distance': 'Avstånd',
'tours.planner.inspector.duration': 'Vandringstid',
'tours.planner.inspector.elevation': 'Höjdprofil',
'tours.planner.inspector.profileFocus': 'Vid {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Profilen visas när höjddata för rutten finns tillgängliga.',
'tours.planner.gpxNoGeometry': 'Ruttgeometrin är inte tillgänglig för den här GPX-importen.',
'tours.planner.mobileHint':
'Turplanering är tillgänglig på surfplatta och dator. Här kan du visa sparade turer och tilldela dem till en dag.',
'tourTypes.hike': 'Vandring',
'tourTypes.bike': 'Cykeltur',
'tourTypes.run': 'Löptur',
'tourTypes.ski': 'Skidtur',
'tourTypes.kayak': 'Kajaktur',
'tourTypes.walk': 'Stadspromenad / sightseeing',
'tourTypes.food': 'Mat- och vintur',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -71,6 +72,7 @@ const locale = {
...collection,
...atlas,
...trip,
...tours,
...places,
...inspector,
...reservations,
+131
View File
@@ -0,0 +1,131 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'ทัวร์',
'tours.mode.places': 'สถานที่',
'tours.mode.tours': 'ทัวร์',
'tours.mode.label': 'มุมมองการเพิ่ม',
'tours.title': 'ทัวร์',
'tours.subtitle': 'เดินป่าและทัวร์แบบวันเดียวอื่นๆ ในทริปนี้',
'tours.empty.title': 'ยังไม่มีทัวร์',
'tours.empty.body': 'วางแผนทัวร์หรือนำเข้าไฟล์ GPX เพื่อเริ่มต้น',
'tours.addToDay': 'เพิ่มไปยังวัน',
'tours.addToDay.comingSoon': 'เพิ่มทัวร์จากรายการลงในวันของทริป',
'tours.addToDay.pickDay': 'เลือกวัน',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'นำเข้าจาก GPX',
'tours.badge.planned': 'วางแผนใน TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'ใช้ด้วยความระมัดระวัง',
'tours.caution.tooltip': 'ข้อมูลระดับความสูงหรือค่าสถิติไม่ครบถ้วน ใช้ข้อมูลที่นำเข้าด้วยความระมัดระวัง',
'tours.import.caution': 'นำเข้าแล้ว แต่ข้อมูลระดับความสูงหรือค่าสถิติไม่ครบถ้วน โปรดใช้ด้วยความระมัดระวัง',
'tours.import.success': 'นำเข้าทัวร์ {count} รายการจาก GPX แล้ว',
'tours.import.successOne': 'นำเข้าทัวร์ 1 รายการจาก GPX แล้ว',
'tours.import.noTrack': 'ไม่พบแทร็กหรือเส้นทางในไฟล์ GPX นี้',
'tours.import.error': 'ไม่สามารถนำเข้าไฟล์ GPX ได้',
'tours.delete.confirmBody':
'ลบทัวร์นี้อย่างถาวรหรือไม่? เส้นทาง จุดแวะที่แก้ไขได้ และการจัดตารางลงวันจะถูกลบ การดำเนินการนี้ไม่สามารถยกเลิกได้',
'tours.delete.bulkConfirmBody':
'รายการที่เลือกมีทัวร์อย่างน้อยหนึ่งรายการ สถานที่ที่เลือกทั้งหมดจะถูกลบอย่างถาวรและกู้คืนไม่ได้ รวมถึงเส้นทาง จุดแวะที่แก้ไขได้ และการจัดตารางลงวันของทัวร์ด้วย',
'tours.delete.confirmAction': 'ลบอย่างถาวร',
'tours.addedToDay': 'เพิ่มไปยังวันที่ {n} แล้ว',
'tours.dayRoute.endpointUnknown': 'ไม่สามารถระบุจุดสิ้นสุดของทัวร์ได้ เส้นทางเชื่อมต่อถัดไปอาจไม่ครบถ้วน',
'tours.detail.trackColor': 'สีแทร็ก',
'tours.detail.distance': 'ระยะทาง',
'tours.detail.minAltitude': 'ระดับความสูงต่ำสุด',
'tours.detail.maxAltitude': 'ระดับความสูงสูงสุด',
'tours.detail.ascent': 'ความสูงสะสมขาขึ้น',
'tours.detail.descent': 'ความสูงสะสมขาลง',
'tours.detail.difficulty': 'ระดับความยาก',
'tours.detail.source': 'แหล่งข้อมูล',
'tours.detail.gpxReadOnly': 'ทัวร์ GPX ดูได้อย่างเดียว ยังแก้ไขในตัววางแผนไม่ได้',
'tours.detail.navigationHint': 'การนำทางจะเปิดจุดเริ่มต้นทางเดิน ไม่ได้นำทางตามเส้นทางทัวร์',
'tours.planner.title': 'วางแผนทัวร์',
'tours.planner.newTour': 'วางแผนทัวร์ใหม่',
'tours.planner.neutralTitle': 'วางแผนทัวร์',
'tours.planner.neutralBody': 'เริ่มทัวร์ใหม่ แล้วคลิกแผนที่เพื่อวางจุดของเส้นทาง',
'tours.planner.newTitle': 'ทัวร์ใหม่',
'tours.planner.editTitle': 'แก้ไขทัวร์',
'tours.planner.gpxTitle': 'ทัวร์ GPX',
'tours.planner.backToTours': 'กลับไปที่ทัวร์',
'tours.planner.restored': 'กู้คืนฉบับร่างที่ยังไม่บันทึกแล้ว',
'tours.planner.discardChanges': 'ยกเลิกการเปลี่ยนแปลง',
'tours.planner.discardUnsaved': 'ทิ้งการเปลี่ยนแปลงที่ยังไม่บันทึก',
'tours.planner.saveChanges': 'บันทึกการเปลี่ยนแปลง',
'tours.planner.newTourConfirmTitle': 'เริ่มทัวร์ใหม่ไหม?',
'tours.planner.newTourConfirmBody':
'การเปลี่ยนแปลงของทัวร์นี้ที่ยังไม่บันทึกจะถูกทิ้ง ทัวร์ที่บันทึกแล้วจะไม่เปลี่ยนแปลง',
'tours.planner.newTourConfirm': 'ทิ้งการเปลี่ยนแปลงและเริ่มทัวร์ใหม่',
'tours.planner.startingPoint': 'คลิกแผนที่เพื่อเพิ่มจุดเริ่มต้น',
'tours.planner.firstUseDetails':
'เพิ่มอีกจุดเพื่อคำนวณเส้นทาง เส้นทางและระดับความสูงจะอัปเดตอัตโนมัติ บันทึกเมื่อพร้อม',
'tours.planner.collapseElevation': 'ยุบกราฟระดับความสูง',
'tours.planner.expandElevation': 'ขยายกราฟระดับความสูง',
'tours.planner.name': 'ชื่อทัวร์',
'tours.planner.namePlaceholder': 'เส้นทางเดินป่าที่ยังไม่มีชื่อ',
'tours.planner.mapHint': 'คลิกแผนที่เพื่อเพิ่มจุด',
'tours.planner.waypoints': 'จุดแวะ',
'tours.planner.waypointLabel': 'จุดแวะ {n}',
'tours.durationMinutes': '{count} นาที',
'tours.planner.empty': 'เพิ่มอย่างน้อยสองจุดเพื่อคำนวณเส้นทางเดิน',
'tours.planner.start': 'เริ่มต้น',
'tours.planner.via': 'ผ่าน',
'tours.planner.end': 'สิ้นสุด',
'tours.planner.moveUp': 'เลื่อนจุดแวะขึ้น',
'tours.planner.moveDown': 'เลื่อนจุดแวะลง',
'tours.planner.remove': 'ลบจุดแวะ',
'tours.planner.undo': 'เลิกทำการแก้ไขจุดแวะ',
'tours.planner.redo': 'ทำซ้ำการแก้ไขจุดแวะ',
'tours.planner.discard': 'ทิ้งฉบับร่าง',
'tours.planner.discardTitle': 'ทิ้งการเปลี่ยนแปลงทัวร์ที่ยังไม่บันทึกไหม?',
'tours.planner.discardBody':
'การแก้ไขที่ยังไม่บันทึกจะถูกทิ้ง ทัวร์ที่บันทึกแล้ว รวมถึงจุดแวะ ไฟล์ และการจัดลงวันจะไม่เปลี่ยนแปลง',
'tours.planner.save': 'บันทึกทัวร์',
'tours.planner.saved': 'บันทึกทัวร์แล้ว',
'tours.planner.planAnother': 'วางแผนทัวร์อื่น',
'tours.planner.assignToDay': 'เพิ่มไปยังวัน',
'tours.planner.tripTours': 'ทัวร์ในทริปนี้',
'tours.planner.safetyNote': 'การคำนวณเส้นทางเป็นตัวช่วยวางแผน ไม่ใช่การรับประกันความปลอดภัย',
'tours.planner.safetyNoteDetails':
'แท็กระดับความยากใน OSM อาจไม่มีหรือไม่ถูกต้อง ระบบไม่ได้ประเมินสภาพอากาศ การปิดเส้นทาง หรือสภาพพื้นที่ปัจจุบัน',
'tours.planner.maxDifficulty': 'ระดับความยากสูงสุดของทางเดิน',
'tours.planner.difficulty.t1': 'T1 - เดินป่า',
'tours.planner.difficulty.t2': 'T2 - เดินป่าบนภูเขา',
'tours.planner.difficulty.t3': 'T3 - เดินป่าบนภูเขาระดับท้าทาย',
'tours.planner.difficulty.t4': 'T4 - เดินป่าแบบอัลไพน์',
'tours.planner.difficulty.t5': 'T5 - เดินป่าแบบอัลไพน์ระดับท้าทาย',
'tours.planner.difficulty.t6': 'T6 - เดินป่าแบบอัลไพน์ระดับยาก',
'tours.planner.difficulty.t3Warning':
'เส้นทาง T3 อาจมีทางเดินบนภูเขาที่เสี่ยงตกจากที่สูงหรือต้องใช้ทักษะทางเทคนิค ต้องก้าวเดินได้มั่นคงและไม่กลัวความสูง',
'tours.planner.difficulty.alpineTitle': 'เปิดใช้การคำนวณเส้นทางอัลไพน์ไหม?',
'tours.planner.difficulty.alpineBody':
'เปิดใช้การคำนวณเส้นทางอัลไพน์แล้ว เส้นทางอาจผ่านพื้นที่ที่เสี่ยงตกจากที่สูง ไม่มีเครื่องหมายบอกทาง หรือต้องใช้ทักษะทางเทคนิคสูง ข้อมูลระดับความยากใน OSM อาจไม่มีหรือไม่ถูกต้อง',
'tours.planner.difficulty.enable': 'เปิดใช้การคำนวณเส้นทางอัลไพน์',
'tours.planner.openFailed': 'ไม่สามารถเปิดทัวร์ที่บันทึกไว้เพื่อแก้ไขได้',
'tours.planner.status.dirty': 'รอคำนวณ',
'tours.planner.status.routing': 'กำลังคำนวณเส้นทางเดิน...',
'tours.planner.status.routingFailed': 'คำนวณเส้นทางไม่สำเร็จ ยังคงแสดงเส้นทางล่าสุดที่คำนวณสำเร็จ',
'tours.planner.status.elevation': 'กำลังโหลดระดับความสูง...',
'tours.planner.status.elevationFailed': 'ไม่มีข้อมูลระดับความสูง ยังคงแสดงเส้นทางที่คำนวณแล้ว',
'tours.planner.status.ready': 'เส้นทางและระดับความสูงพร้อมแล้ว',
'tours.planner.status.saving': 'กำลังบันทึก...',
'tours.planner.status.saveFailed': 'ไม่สามารถบันทึกทัวร์ได้ ฉบับร่างยังอยู่',
'tours.planner.retry': 'ลองอีกครั้ง',
'tours.planner.inspector.title': 'สรุปทัวร์',
'tours.planner.inspector.empty': 'รายละเอียดเส้นทางจะแสดงที่นี่เมื่อเชื่อมต่อจุดแวะสองจุดแล้ว',
'tours.planner.inspector.distance': 'ระยะทาง',
'tours.planner.inspector.duration': 'เวลาเดิน',
'tours.planner.inspector.elevation': 'กราฟระดับความสูง',
'tours.planner.inspector.profileFocus': 'ที่ระยะ {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'กราฟจะแสดงเมื่อมีข้อมูลระดับความสูงของเส้นทาง',
'tours.planner.gpxNoGeometry': 'ไม่มีข้อมูลรูปทรงเส้นทางสำหรับทัวร์ที่นำเข้าจาก GPX นี้',
'tours.planner.mobileHint': 'วางแผนทัวร์ได้บนแท็บเล็ตและคอมพิวเตอร์ ที่นี่สามารถดูทัวร์ที่บันทึกไว้และจัดลงวันได้',
'tourTypes.hike': 'เดินป่า',
'tourTypes.bike': 'ทัวร์จักรยาน',
'tourTypes.run': 'วิ่ง',
'tourTypes.ski': 'ทัวร์สกี',
'tourTypes.kayak': 'พายเรือคายัก',
'tourTypes.walk': 'เดินชมเมือง / สถานที่ท่องเที่ยว',
'tourTypes.food': 'ทัวร์อาหาร/ไวน์',
};
export default tours;
+79
View File
@@ -0,0 +1,79 @@
/// <reference types="node" />
/// <reference types="vite/client" />
import { SUPPORTED_LANGUAGE_CODES } from './languages';
import type { TranslationStrings } from './types';
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import ts from 'typescript';
import { describe, expect, it } from 'vitest';
const domains = import.meta.glob<{ default: TranslationStrings }>('./*/tours.ts', { eager: true });
const aggregates = import.meta.glob<{ default: TranslationStrings }>('./*/index.ts', { eager: true });
const englishModule = domains['./en/tours.ts'];
if (!englishModule) throw new Error('Missing English Tours domain');
const english = englishModule.default;
const tokens = (value: string) => [...value.matchAll(/\{[^{}]+\}/g)].map((match) => match[0]).sort();
function literalKeys(source: string): string[] {
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
const keys: string[] = [];
function visit(node: ts.Node): void {
if (ts.isPropertyAssignment(node) && ts.isStringLiteral(node.name)) keys.push(node.name.text);
ts.forEachChild(node, visit);
}
visit(tree);
return keys;
}
describe('Tours locale contracts', () => {
it('covers all 27 supported locales with 118 source keys', () => {
expect(Object.keys(domains)).toHaveLength(27);
expect(Object.keys(domains).sort()).toEqual(SUPPORTED_LANGUAGE_CODES.map((code) => `./${code}/tours.ts`).sort());
expect(Object.keys(english)).toHaveLength(118);
});
for (const [path, { default: strings }] of Object.entries(domains)) {
it(`${path} imports, preserves placeholders and registers every key exactly once`, () => {
const domainSource = readFileSync(fileURLToPath(new URL(path, import.meta.url)), 'utf8');
const domainKeys = literalKeys(domainSource);
expect(domainKeys).toHaveLength(118);
expect(new Set(domainKeys).size).toBe(118);
expect(Object.keys(strings).sort()).toEqual(Object.keys(english).sort());
expect(domainSource).not.toMatch(/export\s*\{\s*default\s*\}\s*from/);
const indexPath = path.replace('/tours.ts', '/index.ts');
const indexSource = readFileSync(fileURLToPath(new URL(indexPath, import.meta.url)), 'utf8');
const indexTree = ts.createSourceFile(indexPath, indexSource, ts.ScriptTarget.Latest, true);
expect(indexSource.match(/import tours from ['"]\.\/tours['"]/g)).toHaveLength(1);
expect(indexSource.match(/\.\.\.tours\b/g)).toHaveLength(1);
const registeredKeys: string[] = [];
for (const statement of indexTree.statements) {
if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) continue;
const relativePath = statement.moduleSpecifier.text;
if (!relativePath.startsWith('./')) continue;
const domainUrl = new URL(`${relativePath}.ts`, new URL(indexPath, import.meta.url));
registeredKeys.push(...literalKeys(readFileSync(fileURLToPath(domainUrl), 'utf8')));
}
for (const [key, reference] of Object.entries(english)) {
expect(typeof strings[key], key).toBe('string');
const value = strings[key] as string;
expect(value.trim(), key).not.toBe('');
expect(value, key).not.toBe(key);
expect(tokens(value), key).toEqual(tokens(reference as string));
expect(
registeredKeys.filter((registered) => registered === key),
key,
).toHaveLength(1);
expect(aggregates[indexPath]?.default[key], key).toBe(value);
}
for (const key of [
'tours.planner.safetyNote',
'tours.planner.safetyNoteDetails',
'tours.planner.difficulty.t3Warning',
'tours.planner.difficulty.alpineBody',
]) {
expect(strings[key], key).toBeTruthy();
}
});
}
});
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+133
View File
@@ -0,0 +1,133 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Turlar',
'tours.mode.places': 'Yerler',
'tours.mode.tours': 'Turlar',
'tours.mode.label': 'Ekleme görünümü',
'tours.title': 'Turlar',
'tours.subtitle': 'Bu seyahatteki doğa yürüyüşleri ve diğer günübirlik turlar',
'tours.empty.title': 'Henüz tur yok',
'tours.empty.body': 'Başlamak için bir tur planlayın veya GPX dosyası içe aktarın.',
'tours.addToDay': 'Güne ekle',
'tours.addToDay.comingSoon': 'Tur listesinden turları seyahatin bir gününe atayın.',
'tours.addToDay.pickDay': 'Gün seçin',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX içe aktarımı',
'tours.badge.planned': 'TREK ile planlandı',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'dikkatli kullanın',
'tours.caution.tooltip': 'Yükseklik verileri veya ölçümler eksik – çekinceyle içe aktarıldı',
'tours.import.caution': 'Çekinceyle içe aktarıldı – yükseklik verileri veya ölçümler eksik',
'tours.import.success': 'GPX dosyasından içe aktarılan tur sayısı: {count}',
'tours.import.successOne': 'GPX dosyasından 1 tur içe aktarıldı',
'tours.import.noTrack': 'Bu GPX dosyasında iz veya rota bulunamadı',
'tours.import.error': 'GPX dosyası içe aktarılamadı',
'tours.delete.confirmBody':
'Bu tur kalıcı olarak silinsin mi? Rotası, düzenlenebilir ara noktaları ve gün atamaları kaldırılacak. Bu işlem geri alınamaz.',
'tours.delete.bulkConfirmBody':
'Bu seçim en az bir tur içeriyor. Seçilen tüm yerler kalıcı olarak silinecek ve geri yüklenemeyecek. Turların rotaları, düzenlenebilir ara noktaları ve gün atamaları da kaldırılacak.',
'tours.delete.confirmAction': 'Kalıcı olarak sil',
'tours.addedToDay': '{n}. güne eklendi',
'tours.dayRoute.endpointUnknown': 'Turun bitiş noktası belirlenemedi. Sonraki bağlantı bölümleri eksik olabilir.',
'tours.detail.trackColor': 'İz rengi',
'tours.detail.distance': 'Mesafe',
'tours.detail.minAltitude': 'En düşük rakım',
'tours.detail.maxAltitude': 'En yüksek rakım',
'tours.detail.ascent': 'Toplam yükselme',
'tours.detail.descent': 'Toplam alçalma',
'tours.detail.difficulty': 'Zorluk',
'tours.detail.source': 'Kaynak',
'tours.detail.gpxReadOnly': 'GPX turları yalnızca görüntülenebilir; henüz planlayıcıda düzenlenemez.',
'tours.detail.navigationHint': 'Navigasyon yürüyüşün başlangıç noktasını açar; rota boyunca yol tarifi vermez.',
'tours.planner.title': 'Tur planla',
'tours.planner.newTour': 'Yeni tur planla',
'tours.planner.neutralTitle': 'Tur planla',
'tours.planner.neutralBody': 'Yeni bir tur başlatın ve noktalarını yerleştirmek için haritaya tıklayın.',
'tours.planner.newTitle': 'Yeni tur',
'tours.planner.editTitle': 'Turu düzenle',
'tours.planner.gpxTitle': 'GPX turu',
'tours.planner.backToTours': 'Turlara dön',
'tours.planner.restored': 'Kaydedilmemiş taslak geri yüklendi',
'tours.planner.discardChanges': 'Değişiklikleri sil',
'tours.planner.discardUnsaved': 'Kaydedilmemiş değişiklikleri sil',
'tours.planner.saveChanges': 'Değişiklikleri kaydet',
'tours.planner.newTourConfirmTitle': 'Yeni bir tur başlatılsın mı?',
'tours.planner.newTourConfirmBody':
'Bu turdaki kaydedilmemiş değişiklikler silinecek. Kaydedilmiş turlar değişmeyecek.',
'tours.planner.newTourConfirm': 'Değişiklikleri sil ve yeni tur başlat',
'tours.planner.startingPoint': 'Başlangıç noktasını eklemek için haritaya tıklayın.',
'tours.planner.firstUseDetails':
'Rotayı hesaplamak için bir nokta daha ekleyin. Rota ve yükseklik verileri otomatik güncellenir; hazır olduğunda kaydedin.',
'tours.planner.collapseElevation': 'Yükseklik profilini daralt',
'tours.planner.expandElevation': 'Yükseklik profilini genişlet',
'tours.planner.name': 'Tur adı',
'tours.planner.namePlaceholder': 'Adsız doğa yürüyüşü',
'tours.planner.mapHint': 'Nokta eklemek için haritaya tıklayın.',
'tours.planner.waypoints': 'Rota noktaları',
'tours.planner.waypointLabel': 'Rota noktası {n}',
'tours.durationMinutes': '{count} dk',
'tours.planner.empty': 'Yürüyüş rotasını hesaplamak için en az iki nokta ekleyin.',
'tours.planner.start': 'Başlangıç',
'tours.planner.via': 'Ara nokta',
'tours.planner.end': 'Bitiş',
'tours.planner.moveUp': 'Rota noktasını yukarı taşı',
'tours.planner.moveDown': 'Rota noktasını aşağı taşı',
'tours.planner.remove': 'Rota noktasını kaldır',
'tours.planner.undo': 'Nokta düzenlemesini geri al',
'tours.planner.redo': 'Nokta düzenlemesini yinele',
'tours.planner.discard': 'Taslağı sil',
'tours.planner.discardTitle': 'Kaydedilmemiş tur değişiklikleri silinsin mi?',
'tours.planner.discardBody':
'Kaydedilmemiş düzenlemeler silinecek. Kaydedilmiş tur, rota noktaları, dosyaları ve gün atamaları değişmeyecek.',
'tours.planner.save': 'Turu kaydet',
'tours.planner.saved': 'Tur kaydedildi',
'tours.planner.planAnother': 'Başka tur planla',
'tours.planner.assignToDay': 'Güne ata',
'tours.planner.tripTours': 'Bu seyahatin turları',
'tours.planner.safetyNote': 'Rota hesaplama planlamaya yardımcı olur, güvenlik garantisi vermez.',
'tours.planner.safetyNoteDetails':
'OSM zorluk etiketleri eksik veya hatalı olabilir. Hava durumu, kapalı yollar ve güncel koşullar değerlendirilmez.',
'tours.planner.maxDifficulty': 'En yüksek patika zorluğu',
'tours.planner.difficulty.t1': 'T1 – Doğa yürüyüşü',
'tours.planner.difficulty.t2': 'T2 – Dağ yürüyüşü',
'tours.planner.difficulty.t3': 'T3 – Zorlu dağ yürüyüşü',
'tours.planner.difficulty.t4': 'T4 – Yüksek dağ yürüyüşü',
'tours.planner.difficulty.t5': 'T5 – Zorlu yüksek dağ yürüyüşü',
'tours.planner.difficulty.t6': 'T6 – Çok zor yüksek dağ yürüyüşü',
'tours.planner.difficulty.t3Warning':
'T3 rotaları, sağlam adım atmayı ve yükseklik korkusu olmamasını gerektiren, uçurum kenarında açıkta kalan veya teknik açıdan zorlu dağ patikaları içerebilir.',
'tours.planner.difficulty.alpineTitle': 'Yüksek dağ rotaları etkinleştirilsin mi?',
'tours.planner.difficulty.alpineBody':
'Yüksek dağ rotaları etkinleştirildi. Rotalar uçurum kenarında açıkta kalan, işaretsiz veya teknik açıdan zor araziden geçebilir. OSM zorluk verileri eksik veya hatalı olabilir.',
'tours.planner.difficulty.enable': 'Yüksek dağ rotalarını etkinleştir',
'tours.planner.openFailed': 'Kaydedilmiş tur düzenleme için açılamadı.',
'tours.planner.status.dirty': 'Hesaplama bekleniyor',
'tours.planner.status.routing': 'Yürüyüş rotası hesaplanıyor…',
'tours.planner.status.routingFailed': 'Rota hesaplanamadı. Son başarılı rota hâlâ gösteriliyor.',
'tours.planner.status.elevation': 'Yükseklik verileri yükleniyor…',
'tours.planner.status.elevationFailed': 'Yükseklik verileri kullanılamıyor. Hesaplanan rota hâlâ gösteriliyor.',
'tours.planner.status.ready': 'Rota ve yükseklik verileri hazır',
'tours.planner.status.saving': 'Kaydediliyor…',
'tours.planner.status.saveFailed': 'Tur kaydedilemedi. Taslağınız hâlâ burada.',
'tours.planner.retry': 'Yeniden dene',
'tours.planner.inspector.title': 'Tur özeti',
'tours.planner.inspector.empty': 'İki rota noktası bağlandığında rota ayrıntıları burada görünür.',
'tours.planner.inspector.distance': 'Mesafe',
'tours.planner.inspector.duration': 'Yürüyüş süresi',
'tours.planner.inspector.elevation': 'Yükseklik profili',
'tours.planner.inspector.profileFocus': '{distance} mesafede: {elevation}',
'tours.planner.inspector.elevationPlaceholder':
'Rotanın yükseklik verileri kullanılabilir olduğunda profil gösterilir.',
'tours.planner.gpxNoGeometry': 'Bu GPX içe aktarımı için rota geometrisi kullanılamıyor.',
'tours.planner.mobileHint':
'Tur planlama tablet ve bilgisayarda kullanılabilir. Burada kaydedilmiş turları görüntüleyebilir ve günlere atayabilirsiniz.',
'tourTypes.hike': 'Doğa yürüyüşü',
'tourTypes.bike': 'Bisiklet turu',
'tourTypes.run': 'Koşu',
'tourTypes.ski': 'Kayak turu',
'tourTypes.kayak': 'Kayak kanosu',
'tourTypes.walk': 'Şehir / gezi yürüyüşü',
'tourTypes.food': 'Yemek / şarap turu',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+133
View File
@@ -0,0 +1,133 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Тури',
'tours.mode.places': 'Місця',
'tours.mode.tours': 'Тури',
'tours.mode.label': 'Режим додавання',
'tours.title': 'Тури',
'tours.subtitle': 'Походи та інші одноденні тури під час цієї подорожі',
'tours.empty.title': 'Турів поки немає',
'tours.empty.body': 'Для початку сплануйте тур або імпортуйте файл GPX.',
'tours.addToDay': 'Додати до дня',
'tours.addToDay.comingSoon': 'Призначайте тури на дні подорожі зі списку турів.',
'tours.addToDay.pickDay': 'Виберіть день',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Імпорт GPX',
'tours.badge.planned': 'сплановано в TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'використовуйте обережно',
'tours.caution.tooltip': 'Дані про висоту або показники неповні — імпорт із застереженнями',
'tours.import.caution': 'Імпорт із застереженнями — дані про висоту або показники неповні',
'tours.import.success': 'Імпортовано турів із GPX: {count}',
'tours.import.successOne': 'Імпортовано 1 тур із GPX',
'tours.import.noTrack': 'У цьому файлі GPX не знайдено треку або маршруту',
'tours.import.error': 'Не вдалося імпортувати файл GPX',
'tours.delete.confirmBody':
'Видалити цей маршрут назавжди? Його шлях, редаговані точки та призначення на дні буде видалено. Цю дію не можна скасувати.',
'tours.delete.bulkConfirmBody':
'Вибір містить щонайменше один маршрут. Усі вибрані місця буде видалено назавжди, і їх не можна буде відновити. Шляхи маршрутів, редаговані точки та призначення на дні також буде видалено.',
'tours.delete.confirmAction': 'Видалити назавжди',
'tours.addedToDay': 'Додано до дня {n}',
'tours.dayRoute.endpointUnknown':
'Не вдалося визначити кінцеву точку туру. Наступні з’єднувальні ділянки можуть бути неповними.',
'tours.detail.trackColor': 'Колір треку',
'tours.detail.distance': 'Відстань',
'tours.detail.minAltitude': 'Мінімальна висота',
'tours.detail.maxAltitude': 'Максимальна висота',
'tours.detail.ascent': 'Набір висоти',
'tours.detail.descent': 'Втрата висоти',
'tours.detail.difficulty': 'Складність',
'tours.detail.source': 'Джерело',
'tours.detail.gpxReadOnly': 'Тури GPX доступні лише для перегляду; редагувати їх у планувальнику поки не можна.',
'tours.detail.navigationHint': 'Навігація відкриває початкову точку стежки, але не веде вздовж маршруту.',
'tours.planner.title': 'Спланувати тур',
'tours.planner.newTour': 'Спланувати новий тур',
'tours.planner.neutralTitle': 'Спланувати тур',
'tours.planner.neutralBody': 'Почніть новий маршрут і натискайте на карту, щоб розставити точки.',
'tours.planner.newTitle': 'Новий тур',
'tours.planner.editTitle': 'Редагувати тур',
'tours.planner.gpxTitle': 'Тур GPX',
'tours.planner.backToTours': 'До турів',
'tours.planner.restored': 'Незбережену чернетку відновлено',
'tours.planner.discardChanges': 'Скасувати зміни',
'tours.planner.discardUnsaved': 'Скасувати незбережені зміни',
'tours.planner.saveChanges': 'Зберегти зміни',
'tours.planner.newTourConfirmTitle': 'Почати новий тур?',
'tours.planner.newTourConfirmBody': 'Незбережені зміни цього туру буде скасовано. Збережені тури не зміняться.',
'tours.planner.newTourConfirm': 'Скасувати зміни й почати новий тур',
'tours.planner.startingPoint': 'Натисніть на карту, щоб додати початкову точку.',
'tours.planner.firstUseDetails':
'Додайте ще одну точку для розрахунку маршруту. Маршрут і висоти оновлюються автоматично; збережіть тур, коли він буде готовий.',
'tours.planner.collapseElevation': 'Згорнути профіль висот',
'tours.planner.expandElevation': 'Розгорнути профіль висот',
'tours.planner.name': 'Назва туру',
'tours.planner.namePlaceholder': 'Похід без назви',
'tours.planner.mapHint': 'Натисніть на карту, щоб додати точки.',
'tours.planner.waypoints': 'Маршрутні точки',
'tours.planner.waypointLabel': 'Маршрутна точка {n}',
'tours.durationMinutes': '{count} хв',
'tours.planner.empty': 'Додайте щонайменше дві точки для розрахунку пішого маршруту.',
'tours.planner.start': 'Початок',
'tours.planner.via': 'Через',
'tours.planner.end': 'Кінець',
'tours.planner.moveUp': 'Перемістити точку вгору',
'tours.planner.moveDown': 'Перемістити точку вниз',
'tours.planner.remove': 'Видалити точку',
'tours.planner.undo': 'Скасувати зміну точки',
'tours.planner.redo': 'Повторити зміну точки',
'tours.planner.discard': 'Видалити чернетку',
'tours.planner.discardTitle': 'Скасувати незбережені зміни туру?',
'tours.planner.discardBody':
'Незбережені зміни буде скасовано. Збережений тур, його точки, файли та призначення на дні не зміняться.',
'tours.planner.save': 'Зберегти тур',
'tours.planner.saved': 'Тур збережено',
'tours.planner.planAnother': 'Спланувати ще',
'tours.planner.assignToDay': 'Призначити на день',
'tours.planner.tripTours': 'Тури цієї подорожі',
'tours.planner.safetyNote': 'Розрахунок маршруту допомагає в плануванні, але не гарантує безпеки.',
'tours.planner.safetyNoteDetails':
'Теги складності OSM можуть бути відсутні або хибні. Погода, закриті ділянки й поточні умови не оцінюються.',
'tours.planner.maxDifficulty': 'Максимальна складність стежки',
'tours.planner.difficulty.t1': 'T1 — Піший похід',
'tours.planner.difficulty.t2': 'T2 — Гірський похід',
'tours.planner.difficulty.t3': 'T3 — Складний гірський похід',
'tours.planner.difficulty.t4': 'T4 — Високогірний похід',
'tours.planner.difficulty.t5': 'T5 — Складний високогірний похід',
'tours.planner.difficulty.t6': 'T6 — Дуже складний високогірний похід',
'tours.planner.difficulty.t3Warning':
'Маршрути T3 можуть містити відкриті ділянки над урвищами або технічно складні гірські стежки, які потребують впевненого кроку та відсутності страху висоти.',
'tours.planner.difficulty.alpineTitle': 'Дозволити високогірні маршрути?',
'tours.planner.difficulty.alpineBody':
'Високогірні маршрути дозволено. Вони можуть проходити відкритими ділянками над урвищами, немаркованою або технічно складною місцевістю. Дані про складність в OSM можуть бути відсутні або хибні.',
'tours.planner.difficulty.enable': 'Дозволити високогірні маршрути',
'tours.planner.openFailed': 'Не вдалося відкрити збережений тур для редагування.',
'tours.planner.status.dirty': 'Очікування розрахунку',
'tours.planner.status.routing': 'Розрахунок пішого маршруту…',
'tours.planner.status.routingFailed':
'Не вдалося розрахувати маршрут. Далі відображається останній успішно розрахований маршрут.',
'tours.planner.status.elevation': 'Завантаження висот…',
'tours.planner.status.elevationFailed': 'Дані про висоту недоступні. Розрахований маршрут далі відображається.',
'tours.planner.status.ready': 'Маршрут і висоти готові',
'tours.planner.status.saving': 'Збереження…',
'tours.planner.status.saveFailed': 'Не вдалося зберегти тур. Чернетка залишилася доступною.',
'tours.planner.retry': 'Повторити',
'tours.planner.inspector.title': 'Огляд туру',
'tours.planner.inspector.empty': 'Відомості про маршрут з’являться тут після з’єднання двох маршрутних точок.',
'tours.planner.inspector.distance': 'Відстань',
'tours.planner.inspector.duration': 'Час ходьби',
'tours.planner.inspector.elevation': 'Профіль висот',
'tours.planner.inspector.profileFocus': 'На відстані {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Профіль з’явиться, коли будуть доступні дані про висоту маршруту.',
'tours.planner.gpxNoGeometry': 'Геометрія маршруту недоступна для цього імпорту GPX.',
'tours.planner.mobileHint':
'Планування турів доступне на планшеті й комп’ютері. Тут можна переглядати збережені тури та призначати їх на дні.',
'tourTypes.hike': 'Піший похід',
'tourTypes.bike': 'Велотур',
'tourTypes.run': 'Пробіжка',
'tourTypes.ski': 'Лижний тур',
'tourTypes.kayak': 'Каякінг',
'tourTypes.walk': 'Прогулянка містом / визначними місцями',
'tourTypes.food': 'Гастрономічний / винний тур',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+134
View File
@@ -0,0 +1,134 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': 'Chuyến tham quan',
'tours.mode.places': 'Địa điểm',
'tours.mode.tours': 'Chuyến tham quan',
'tours.mode.label': 'Chế độ thêm',
'tours.title': 'Chuyến tham quan',
'tours.subtitle': 'Các chuyến đi bộ đường dài và chuyến tham quan trong ngày của chuyến đi này',
'tours.empty.title': 'Chưa có chuyến tham quan',
'tours.empty.body': 'Lên kế hoạch cho một chuyến tham quan hoặc nhập tệp GPX để bắt đầu.',
'tours.addToDay': 'Thêm vào ngày',
'tours.addToDay.comingSoon': 'Gán chuyến tham quan vào một ngày của chuyến đi từ danh sách chuyến tham quan.',
'tours.addToDay.pickDay': 'Chọn ngày',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'Nhập từ GPX',
'tours.badge.planned': 'lên kế hoạch trong TREK',
'tours.badge.trek': 'TREK',
'tours.caution.badge': 'cần thận trọng khi sử dụng',
'tours.caution.tooltip': 'Dữ liệu độ cao hoặc thông số chưa đầy đủ; đã nhập kèm cảnh báo',
'tours.import.caution': 'Đã nhập kèm cảnh báo; dữ liệu độ cao hoặc thông số chưa đầy đủ',
'tours.import.success': 'Đã nhập {count} chuyến tham quan từ GPX',
'tours.import.successOne': 'Đã nhập 1 chuyến tham quan từ GPX',
'tours.import.noTrack': 'Không tìm thấy vệt hành trình hoặc tuyến đường trong tệp GPX này',
'tours.import.error': 'Không thể nhập tệp GPX',
'tours.delete.confirmBody':
'Xóa vĩnh viễn chuyến đi này? Tuyến đường, các điểm trung gian có thể chỉnh sửa và lịch gán ngày sẽ bị xóa. Không thể hoàn tác thao tác này.',
'tours.delete.bulkConfirmBody':
'Lựa chọn này có ít nhất một chuyến đi. Tất cả địa điểm đã chọn sẽ bị xóa vĩnh viễn và không thể khôi phục. Tuyến đường, điểm trung gian có thể chỉnh sửa và lịch gán ngày của các chuyến đi cũng sẽ bị xóa.',
'tours.delete.confirmAction': 'Xóa vĩnh viễn',
'tours.addedToDay': 'Đã thêm vào ngày {n}',
'tours.dayRoute.endpointUnknown':
'Không xác định được điểm kết thúc của chuyến tham quan. Các đoạn nối tiếp theo có thể chưa đầy đủ.',
'tours.detail.trackColor': 'Màu vệt hành trình',
'tours.detail.distance': 'Quãng đường',
'tours.detail.minAltitude': 'Độ cao thấp nhất',
'tours.detail.maxAltitude': 'Độ cao cao nhất',
'tours.detail.ascent': 'Tổng độ cao leo lên',
'tours.detail.descent': 'Tổng độ cao đi xuống',
'tours.detail.difficulty': 'Độ khó',
'tours.detail.source': 'Nguồn',
'tours.detail.gpxReadOnly': 'Chuyến tham quan GPX chỉ có thể xem, chưa thể chỉnh sửa trong công cụ lập kế hoạch.',
'tours.detail.navigationHint': 'Chỉ đường sẽ mở điểm bắt đầu đường mòn, không hướng dẫn đi dọc theo tuyến đường.',
'tours.planner.title': 'Lên kế hoạch tham quan',
'tours.planner.newTour': 'Lên kế hoạch tham quan mới',
'tours.planner.neutralTitle': 'Lên kế hoạch tham quan',
'tours.planner.neutralBody': 'Bắt đầu chuyến đi mới và nhấp vào bản đồ để đặt các điểm.',
'tours.planner.newTitle': 'Chuyến tham quan mới',
'tours.planner.editTitle': 'Chỉnh sửa chuyến tham quan',
'tours.planner.gpxTitle': 'Chuyến tham quan GPX',
'tours.planner.backToTours': 'Về danh sách chuyến tham quan',
'tours.planner.restored': 'Đã khôi phục bản nháp chưa lưu',
'tours.planner.discardChanges': 'Bỏ thay đổi',
'tours.planner.discardUnsaved': 'Bỏ thay đổi chưa lưu',
'tours.planner.saveChanges': 'Lưu thay đổi',
'tours.planner.newTourConfirmTitle': 'Bắt đầu chuyến tham quan mới?',
'tours.planner.newTourConfirmBody':
'Các thay đổi chưa lưu của chuyến tham quan này sẽ bị bỏ. Các chuyến tham quan đã lưu sẽ không thay đổi.',
'tours.planner.newTourConfirm': 'Bỏ thay đổi và bắt đầu chuyến tham quan mới',
'tours.planner.startingPoint': 'Nhấp vào bản đồ để thêm điểm xuất phát.',
'tours.planner.firstUseDetails':
'Thêm một điểm nữa để tính tuyến đường. Tuyến đường và độ cao được cập nhật tự động; hãy lưu khi hoàn tất.',
'tours.planner.collapseElevation': 'Thu gọn biểu đồ độ cao',
'tours.planner.expandElevation': 'Mở rộng biểu đồ độ cao',
'tours.planner.name': 'Tên chuyến tham quan',
'tours.planner.namePlaceholder': 'Chuyến đi bộ đường dài chưa có tên',
'tours.planner.mapHint': 'Nhấp vào bản đồ để thêm điểm.',
'tours.planner.waypoints': 'Các điểm trên tuyến',
'tours.planner.waypointLabel': 'Điểm {n}',
'tours.durationMinutes': '{count} phút',
'tours.planner.empty': 'Thêm ít nhất hai điểm để tính tuyến đi bộ.',
'tours.planner.start': 'Xuất phát',
'tours.planner.via': 'Đi qua',
'tours.planner.end': 'Kết thúc',
'tours.planner.moveUp': 'Di chuyển điểm lên trên',
'tours.planner.moveDown': 'Di chuyển điểm xuống dưới',
'tours.planner.remove': 'Xóa điểm',
'tours.planner.undo': 'Hoàn tác chỉnh sửa điểm',
'tours.planner.redo': 'Làm lại chỉnh sửa điểm',
'tours.planner.discard': 'Bỏ bản nháp',
'tours.planner.discardTitle': 'Bỏ các thay đổi chưa lưu của chuyến tham quan?',
'tours.planner.discardBody':
'Các chỉnh sửa chưa lưu sẽ bị bỏ. Chuyến tham quan đã lưu cùng các điểm, tệp và ngày được gán sẽ không thay đổi.',
'tours.planner.save': 'Lưu chuyến tham quan',
'tours.planner.saved': 'Đã lưu chuyến tham quan',
'tours.planner.planAnother': 'Lên kế hoạch chuyến khác',
'tours.planner.assignToDay': 'Gán vào ngày',
'tours.planner.tripTours': 'Các chuyến tham quan của chuyến đi này',
'tours.planner.safetyNote': 'Việc tính tuyến đường chỉ hỗ trợ lập kế hoạch, không bảo đảm an toàn.',
'tours.planner.safetyNoteDetails':
'Nhãn độ khó trên OSM có thể bị thiếu hoặc sai. Thời tiết, việc đóng đường và điều kiện hiện tại không được đánh giá.',
'tours.planner.maxDifficulty': 'Độ khó tối đa của đường mòn',
'tours.planner.difficulty.t1': 'T1 - Đi bộ đường dài',
'tours.planner.difficulty.t2': 'T2 - Đi bộ đường dài trên núi',
'tours.planner.difficulty.t3': 'T3 - Đi bộ đường dài trên núi đòi hỏi kỹ năng cao',
'tours.planner.difficulty.t4': 'T4 - Đi bộ đường dài trên núi cao',
'tours.planner.difficulty.t5': 'T5 - Đi bộ đường dài trên núi cao đòi hỏi kỹ năng cao',
'tours.planner.difficulty.t6': 'T6 - Đi bộ đường dài trên núi cao rất khó',
'tours.planner.difficulty.t3Warning':
'Tuyến T3 có thể có đường mòn trên núi ở vị trí cheo leo, có nguy cơ rơi ngã hoặc đòi hỏi kỹ thuật cao. Cần bước chân vững vàng và khả năng giữ bình tĩnh ở độ cao lớn.',
'tours.planner.difficulty.alpineTitle': 'Bật tính tuyến đường núi cao?',
'tours.planner.difficulty.alpineBody':
'Tính tuyến đường núi cao được bật. Tuyến có thể đi qua địa hình cheo leo có nguy cơ rơi ngã, không có dấu chỉ đường hoặc khó về kỹ thuật. Dữ liệu độ khó trên OSM có thể bị thiếu hoặc sai.',
'tours.planner.difficulty.enable': 'Bật tính tuyến đường núi cao',
'tours.planner.openFailed': 'Không thể mở chuyến tham quan đã lưu để chỉnh sửa.',
'tours.planner.status.dirty': 'Đang chờ tính toán',
'tours.planner.status.routing': 'Đang tính tuyến đi bộ...',
'tours.planner.status.routingFailed':
'Tính tuyến đường thất bại. Tuyến được tính thành công gần nhất vẫn được hiển thị.',
'tours.planner.status.elevation': 'Đang tải độ cao...',
'tours.planner.status.elevationFailed': 'Không có dữ liệu độ cao. Tuyến đường đã tính vẫn được hiển thị.',
'tours.planner.status.ready': 'Tuyến đường và độ cao đã sẵn sàng',
'tours.planner.status.saving': 'Đang lưu...',
'tours.planner.status.saveFailed': 'Không thể lưu chuyến tham quan. Bản nháp vẫn được giữ lại.',
'tours.planner.retry': 'Thử lại',
'tours.planner.inspector.title': 'Tóm tắt chuyến tham quan',
'tours.planner.inspector.empty': 'Chi tiết tuyến đường sẽ xuất hiện ở đây sau khi hai điểm được nối với nhau.',
'tours.planner.inspector.distance': 'Quãng đường',
'tours.planner.inspector.duration': 'Thời gian đi bộ',
'tours.planner.inspector.elevation': 'Biểu đồ độ cao',
'tours.planner.inspector.profileFocus': 'Tại {distance}: {elevation}',
'tours.planner.inspector.elevationPlaceholder': 'Biểu đồ sẽ hiển thị khi có dữ liệu độ cao của tuyến đường.',
'tours.planner.gpxNoGeometry': 'Không có dữ liệu hình dạng tuyến đường cho bản nhập GPX này.',
'tours.planner.mobileHint':
'Có thể lập kế hoạch tham quan trên máy tính bảng và máy tính. Tại đây, bạn có thể xem và xếp lịch cho các chuyến tham quan đã lưu.',
'tourTypes.hike': 'Đi bộ đường dài',
'tourTypes.bike': 'Chuyến đạp xe',
'tourTypes.run': 'Chạy bộ',
'tourTypes.ski': 'Chuyến trượt tuyết',
'tourTypes.kayak': 'Chèo kayak',
'tourTypes.walk': 'Đi bộ trong thành phố / ngắm cảnh',
'tourTypes.food': 'Chuyến khám phá ẩm thực / rượu vang',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+126
View File
@@ -0,0 +1,126 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': '遊程',
'tours.mode.places': '地點',
'tours.mode.tours': '遊程',
'tours.mode.label': '新增檢視',
'tours.title': '遊程',
'tours.subtitle': '這趟旅行的健行與其他一日遊活動',
'tours.empty.title': '尚無遊程',
'tours.empty.body': '規劃遊程或匯入 GPX 檔案,即可開始。',
'tours.addToDay': '加入某一天',
'tours.addToDay.comingSoon': '從遊程清單將活動安排到旅行的某一天。',
'tours.addToDay.pickDay': '選擇日期',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX 匯入',
'tours.badge.planned': '在 TREK 中規劃',
'tours.badge.trek': 'TREK',
'tours.caution.badge': '請謹慎使用',
'tours.caution.tooltip': '海拔或指標資料不完整,已附警告匯入',
'tours.import.caution': '已附警告匯入,海拔或指標資料不完整',
'tours.import.success': '已從 GPX 匯入 {count} 個遊程',
'tours.import.successOne': '已從 GPX 匯入 1 個遊程',
'tours.import.noTrack': '這個 GPX 檔案中找不到軌跡或路線',
'tours.import.error': '無法匯入 GPX 檔案',
'tours.delete.confirmBody': '要永久刪除此行程嗎?其路線、可編輯的途經點和日期指派都會一併移除。此操作無法復原。',
'tours.delete.bulkConfirmBody':
'所選內容至少包含一個行程。所有選取的地點都會永久刪除且無法復原;行程路線、可編輯的途經點和日期指派也會一併移除。',
'tours.delete.confirmAction': '永久刪除',
'tours.addedToDay': '已加入第 {n} 天',
'tours.dayRoute.endpointUnknown': '無法判定遊程的終點。後續銜接路線可能不完整。',
'tours.detail.trackColor': '軌跡顏色',
'tours.detail.distance': '距離',
'tours.detail.minAltitude': '最低海拔',
'tours.detail.maxAltitude': '最高海拔',
'tours.detail.ascent': '累計爬升',
'tours.detail.descent': '累計下降',
'tours.detail.difficulty': '難度',
'tours.detail.source': '來源',
'tours.detail.gpxReadOnly': 'GPX 遊程僅供檢視,目前還無法在規劃工具中編輯。',
'tours.detail.navigationHint': '導航會開啟登山口或步道入口,不會沿著遊程路線提供導航。',
'tours.planner.title': '規劃遊程',
'tours.planner.newTour': '規劃新遊程',
'tours.planner.neutralTitle': '規劃遊程',
'tours.planner.neutralBody': '開始新路線,點選地圖放置路線點。',
'tours.planner.newTitle': '新遊程',
'tours.planner.editTitle': '編輯遊程',
'tours.planner.gpxTitle': 'GPX 遊程',
'tours.planner.backToTours': '返回遊程清單',
'tours.planner.restored': '已還原尚未儲存的草稿',
'tours.planner.discardChanges': '捨棄變更',
'tours.planner.discardUnsaved': '捨棄尚未儲存的變更',
'tours.planner.saveChanges': '儲存變更',
'tours.planner.newTourConfirmTitle': '開始新的遊程?',
'tours.planner.newTourConfirmBody': '這個遊程中尚未儲存的變更將被捨棄。已儲存的遊程不會變更。',
'tours.planner.newTourConfirm': '捨棄變更並開始新遊程',
'tours.planner.startingPoint': '點選地圖加入起點。',
'tours.planner.firstUseDetails': '再加入一個點即可計算路線。路線與海拔會自動更新,完成後請儲存。',
'tours.planner.collapseElevation': '收合海拔剖面圖',
'tours.planner.expandElevation': '展開海拔剖面圖',
'tours.planner.name': '遊程名稱',
'tours.planner.namePlaceholder': '未命名的健行',
'tours.planner.mapHint': '點選地圖以加入地點。',
'tours.planner.waypoints': '路線點',
'tours.planner.waypointLabel': '路線點 {n}',
'tours.durationMinutes': '{count} 分鐘',
'tours.planner.empty': '至少加入兩個點才能計算步行路線。',
'tours.planner.start': '起點',
'tours.planner.via': '途經',
'tours.planner.end': '終點',
'tours.planner.moveUp': '上移路線點',
'tours.planner.moveDown': '下移路線點',
'tours.planner.remove': '刪除路線點',
'tours.planner.undo': '復原路線點編輯',
'tours.planner.redo': '重做路線點編輯',
'tours.planner.discard': '捨棄草稿',
'tours.planner.discardTitle': '捨棄遊程中尚未儲存的變更?',
'tours.planner.discardBody': '尚未儲存的編輯內容將被捨棄。已儲存的遊程及其路線點、檔案與日期安排不會變更。',
'tours.planner.save': '儲存遊程',
'tours.planner.saved': '遊程已儲存',
'tours.planner.planAnother': '規劃另一個遊程',
'tours.planner.assignToDay': '安排到某一天',
'tours.planner.tripTours': '這趟旅行的遊程',
'tours.planner.safetyNote': '路線計算僅協助規劃,不保證安全。',
'tours.planner.safetyNoteDetails': 'OSM 難度標籤可能缺漏或有誤。系統不會評估天候、封路情形及當前現場狀況。',
'tours.planner.maxDifficulty': '步道最高難度',
'tours.planner.difficulty.t1': 'T1:健行',
'tours.planner.difficulty.t2': 'T2:山區健行',
'tours.planner.difficulty.t3': 'T3:具挑戰性的山區健行',
'tours.planner.difficulty.t4': 'T4:高山健行',
'tours.planner.difficulty.t5': 'T5:具挑戰性的高山健行',
'tours.planner.difficulty.t6': 'T6:高難度高山健行',
'tours.planner.difficulty.t3Warning':
'T3 路線可能包含有墜落風險的暴露山區步道,或技術要求較高的山區步道。需要穩健的步伐,以及不懼高、能在高處保持鎮定的能力。',
'tours.planner.difficulty.alpineTitle': '啟用高山路線規劃?',
'tours.planner.difficulty.alpineBody':
'已啟用高山路線規劃。路線可能穿越有墜落風險的暴露地形、沒有路線標記的地形,或技術難度較高的地形。OSM 難度資料可能缺漏或有誤。',
'tours.planner.difficulty.enable': '啟用高山路線規劃',
'tours.planner.openFailed': '無法開啟已儲存的遊程進行編輯。',
'tours.planner.status.dirty': '等待計算',
'tours.planner.status.routing': '正在計算步行路線…',
'tours.planner.status.routingFailed': '路線計算失敗。仍顯示上次成功計算的路線。',
'tours.planner.status.elevation': '正在載入海拔…',
'tours.planner.status.elevationFailed': '無法取得海拔資料。仍顯示已計算的路線。',
'tours.planner.status.ready': '路線與海拔已就緒',
'tours.planner.status.saving': '正在儲存…',
'tours.planner.status.saveFailed': '無法儲存遊程。草稿仍保留在這裡。',
'tours.planner.retry': '重試',
'tours.planner.inspector.title': '遊程摘要',
'tours.planner.inspector.empty': '連接兩個路線點後,這裡會顯示路線詳情。',
'tours.planner.inspector.distance': '距離',
'tours.planner.inspector.duration': '步行時間',
'tours.planner.inspector.elevation': '海拔剖面圖',
'tours.planner.inspector.profileFocus': '距離 {distance} 處:{elevation}',
'tours.planner.inspector.elevationPlaceholder': '取得路線的海拔資料後,會顯示剖面圖。',
'tours.planner.gpxNoGeometry': '這次 GPX 匯入沒有可用的路線幾何資料。',
'tours.planner.mobileHint': '可在平板電腦與電腦上規劃遊程。在這裡可以檢視已儲存的遊程並安排日期。',
'tourTypes.hike': '健行',
'tourTypes.bike': '單車遊程',
'tourTypes.run': '跑步',
'tourTypes.ski': '滑雪登山',
'tourTypes.kayak': '獨木舟',
'tourTypes.walk': '城市散步 / 觀光',
'tourTypes.food': '美食 / 葡萄酒之旅',
};
export default tours;
+2
View File
@@ -48,6 +48,7 @@ import stats from './stats';
import storage from './storage';
import system_notice from './system_notice';
import todo from './todo';
import tours from './tours';
import transport from './transport';
import trip from './trip';
import trips from './trips';
@@ -60,6 +61,7 @@ const locale = {
...nav,
...dashboard,
...roadtrip,
...tours,
...settings,
...admin,
...dayplan,
+126
View File
@@ -0,0 +1,126 @@
import type { TranslationStrings } from '../types';
const tours: TranslationStrings = {
'trip.tabs.tourPlanner': '游览',
'tours.mode.places': '地点',
'tours.mode.tours': '游览',
'tours.mode.label': '添加视图',
'tours.title': '游览',
'tours.subtitle': '本次旅行的徒步及其他一日游活动',
'tours.empty.title': '暂无游览活动',
'tours.empty.body': '规划游览路线或导入 GPX 文件,即可开始。',
'tours.addToDay': '添加到某天',
'tours.addToDay.comingSoon': '从游览列表将活动安排到旅行的某一天。',
'tours.addToDay.pickDay': '选择日期',
'tours.badge.wanderer': 'wanderer',
'tours.badge.gpx': 'GPX 导入',
'tours.badge.planned': '在 TREK 中规划',
'tours.badge.trek': 'TREK',
'tours.caution.badge': '请谨慎使用',
'tours.caution.tooltip': '海拔或指标数据不完整,已带警告导入',
'tours.import.caution': '已带警告导入,海拔或指标数据不完整',
'tours.import.success': '已从 GPX 导入 {count} 项游览活动',
'tours.import.successOne': '已从 GPX 导入 1 项游览活动',
'tours.import.noTrack': '该 GPX 文件中未找到轨迹或路线',
'tours.import.error': '无法导入 GPX 文件',
'tours.delete.confirmBody': '要永久删除此行程吗?其路线、可编辑的途经点和日期安排都将被删除。此操作无法撤销。',
'tours.delete.bulkConfirmBody':
'所选内容至少包含一个行程。所有选中的地点都将被永久删除且无法恢复;行程路线、可编辑的途经点和日期安排也会一并删除。',
'tours.delete.confirmAction': '永久删除',
'tours.addedToDay': '已添加到第 {n} 天',
'tours.dayRoute.endpointUnknown': '无法确定游览路线的终点。后续连接路线可能不完整。',
'tours.detail.trackColor': '轨迹颜色',
'tours.detail.distance': '距离',
'tours.detail.minAltitude': '最低海拔',
'tours.detail.maxAltitude': '最高海拔',
'tours.detail.ascent': '累计爬升',
'tours.detail.descent': '累计下降',
'tours.detail.difficulty': '难度',
'tours.detail.source': '来源',
'tours.detail.gpxReadOnly': 'GPX 游览路线仅供查看,暂时无法在规划器中编辑。',
'tours.detail.navigationHint': '导航打开的是步道起点,不会沿游览路线提供导航。',
'tours.planner.title': '规划游览路线',
'tours.planner.newTour': '规划新游览路线',
'tours.planner.neutralTitle': '规划游览路线',
'tours.planner.neutralBody': '开始新路线,点击地图放置路线点。',
'tours.planner.newTitle': '新游览路线',
'tours.planner.editTitle': '编辑游览路线',
'tours.planner.gpxTitle': 'GPX 游览路线',
'tours.planner.backToTours': '返回游览列表',
'tours.planner.restored': '已恢复未保存的草稿',
'tours.planner.discardChanges': '放弃更改',
'tours.planner.discardUnsaved': '放弃未保存的更改',
'tours.planner.saveChanges': '保存更改',
'tours.planner.newTourConfirmTitle': '开始规划新游览路线?',
'tours.planner.newTourConfirmBody': '此游览路线中未保存的更改将被丢弃。已保存的游览路线不会改变。',
'tours.planner.newTourConfirm': '放弃更改并开始新游览路线',
'tours.planner.startingPoint': '点击地图添加起点。',
'tours.planner.firstUseDetails': '再添加一个点即可计算路线。路线和海拔会自动更新,完成后请保存。',
'tours.planner.collapseElevation': '收起海拔剖面图',
'tours.planner.expandElevation': '展开海拔剖面图',
'tours.planner.name': '游览名称',
'tours.planner.namePlaceholder': '未命名的徒步活动',
'tours.planner.mapHint': '点击地图添加地点。',
'tours.planner.waypoints': '路线点',
'tours.planner.waypointLabel': '路线点 {n}',
'tours.durationMinutes': '{count} 分钟',
'tours.planner.empty': '至少添加两个点才能计算步行路线。',
'tours.planner.start': '起点',
'tours.planner.via': '途经',
'tours.planner.end': '终点',
'tours.planner.moveUp': '上移路线点',
'tours.planner.moveDown': '下移路线点',
'tours.planner.remove': '删除路线点',
'tours.planner.undo': '撤销路线点编辑',
'tours.planner.redo': '重做路线点编辑',
'tours.planner.discard': '丢弃草稿',
'tours.planner.discardTitle': '放弃游览路线中未保存的更改?',
'tours.planner.discardBody': '未保存的编辑内容将被丢弃。已保存的游览路线及其路线点、文件和日期安排不会改变。',
'tours.planner.save': '保存游览路线',
'tours.planner.saved': '游览路线已保存',
'tours.planner.planAnother': '规划另一条路线',
'tours.planner.assignToDay': '安排到某天',
'tours.planner.tripTours': '本次旅行的游览活动',
'tours.planner.safetyNote': '路线计算仅辅助规划,不保证安全。',
'tours.planner.safetyNoteDetails': 'OSM 难度标签可能缺失或有误。系统不会评估天气、道路封闭情况及当前环境状况。',
'tours.planner.maxDifficulty': '步道最高难度',
'tours.planner.difficulty.t1': 'T1:徒步',
'tours.planner.difficulty.t2': 'T2:山地徒步',
'tours.planner.difficulty.t3': 'T3:挑战性山地徒步',
'tours.planner.difficulty.t4': 'T4:高山徒步',
'tours.planner.difficulty.t5': 'T5:挑战性高山徒步',
'tours.planner.difficulty.t6': 'T6:高难度高山徒步',
'tours.planner.difficulty.t3Warning':
'T3 路线可能包含存在坠落风险的暴露山地步道,或技术要求较高的山地步道。需要稳健的脚步,以及在高处不畏高、能保持镇定的能力。',
'tours.planner.difficulty.alpineTitle': '启用高山路线规划?',
'tours.planner.difficulty.alpineBody':
'已启用高山路线规划。路线可能穿越存在坠落风险的暴露地形、无路线标记的地形或技术难度较高的地形。OSM 难度数据可能缺失或有误。',
'tours.planner.difficulty.enable': '启用高山路线规划',
'tours.planner.openFailed': '无法打开已保存的游览路线进行编辑。',
'tours.planner.status.dirty': '等待计算',
'tours.planner.status.routing': '正在计算步行路线…',
'tours.planner.status.routingFailed': '路线计算失败。仍显示上次成功计算的路线。',
'tours.planner.status.elevation': '正在加载海拔…',
'tours.planner.status.elevationFailed': '无法获取海拔数据。仍显示已计算的路线。',
'tours.planner.status.ready': '路线和海拔已就绪',
'tours.planner.status.saving': '正在保存…',
'tours.planner.status.saveFailed': '无法保存游览路线。草稿仍保留在此处。',
'tours.planner.retry': '重试',
'tours.planner.inspector.title': '游览概览',
'tours.planner.inspector.empty': '连接两个路线点后,此处会显示路线详情。',
'tours.planner.inspector.distance': '距离',
'tours.planner.inspector.duration': '步行时间',
'tours.planner.inspector.elevation': '海拔剖面图',
'tours.planner.inspector.profileFocus': '距离 {distance} 处:{elevation}',
'tours.planner.inspector.elevationPlaceholder': '获取到路线海拔数据后将显示剖面图。',
'tours.planner.gpxNoGeometry': '本次 GPX 导入没有可用的路线几何数据。',
'tours.planner.mobileHint': '可在平板电脑和电脑上规划游览路线。在这里可以查看已保存的游览活动并安排日期。',
'tourTypes.hike': '徒步',
'tourTypes.bike': '骑行',
'tourTypes.run': '跑步',
'tourTypes.ski': '滑雪穿越',
'tourTypes.kayak': '皮划艇',
'tourTypes.walk': '城市漫步 / 观光',
'tourTypes.food': '美食 / 葡萄酒之旅',
};
export default tours;
+1
View File
@@ -47,6 +47,7 @@ export * from './place/place-match';
export * from './place/place-website';
export * from './roadtrip/roadtrip.schema';
export * from './place/track-colors';
export * from './tours/tours.schema';
export * from './collection/collection.schema';
export * from './collection/collection-file.schema';
export * from './trip/trip.schema';
+2
View File
@@ -156,6 +156,8 @@ export const placeSchema = z.object({
*/
source: z.string().nullable().optional(),
route_geometry: z.string().nullable().optional(),
/** Present on the trip Place list when this Place has a Tours facet. */
tour_place_id: z.number().nullable().optional(),
// Manual track colour (#776). null = inherit the category colour like before.
route_color: hexColorSchema.nullable().optional(),
/**
+3 -2
View File
@@ -19,6 +19,7 @@ const FIXTURES: Record<TrekWsEventName, Record<string, unknown>> = {
'place:created': { place: { id: 3, name: 'Louvre' } },
'place:updated': { place: { id: 3, name: 'Louvre' } },
'place:deleted': { placeId: 3 },
'tours:changed': { placeIds: [3] },
'assignment:created': { assignment: { id: 9, day_id: 2 } },
'assignment:updated': { assignment: { id: 9, day_id: 2 } },
'assignment:deleted': { assignmentId: 9, dayId: 2 },
@@ -153,9 +154,9 @@ describe('@trek/shared realtime event registry', () => {
// panel without every member polling for it.
// 33rd user event: journey:photos:updated, so the gallery re-sorts once the
// capture times of an import have landed (#1587).
expect(TREK_WS_TRIP_EVENT_NAMES).toHaveLength(74);
expect(TREK_WS_TRIP_EVENT_NAMES).toHaveLength(75);
expect(TREK_WS_USER_EVENT_NAMES).toHaveLength(33);
expect(TREK_WS_EVENT_NAMES).toHaveLength(107);
expect(TREK_WS_EVENT_NAMES).toHaveLength(108);
});
it('WSEVT-REG-002: every name is domain:action shaped and outside the reserved plugin: namespace', () => {
+2
View File
@@ -63,6 +63,8 @@ export const TREK_WS_EVENTS = {
'place:created': { scope: 'trip', payload: z.object({ place: entity }) },
'place:updated': { scope: 'trip', payload: z.object({ place: entity }) },
'place:deleted': { scope: 'trip', payload: z.object({ placeId: id }) },
// Invalidate the trip's Tours list; affected ids let peers exclude new Tours immediately.
'tours:changed': { scope: 'trip', payload: z.object({ placeIds: idList.optional() }) },
// ── Assignments ──────────────────────────────────────────────────────────
'assignment:created': { scope: 'trip', payload: z.object({ assignment: entity }) },
+30
View File
@@ -0,0 +1,30 @@
import { tourCreateRequestSchema, tourMaxHikingDifficultySchema } from './tours.schema';
import { describe, expect, it } from 'vitest';
const baseRequest = {
name: 'Ridge walk',
route_geometry: [
[48, 11, 600],
[48.01, 11.02, 650],
],
waypoints: [
{ lat: 48, lng: 11, role: 'start' as const, sequence: 0 },
{ lat: 48.01, lng: 11.02, role: 'end' as const, sequence: 1 },
],
};
describe('Tours maximum hiking difficulty', () => {
it('defaults create requests to T2', () => {
expect(tourCreateRequestSchema.parse(baseRequest).max_hiking_difficulty).toBe(2);
});
it('accepts only integer values from T1 through T6', () => {
for (const value of [1, 2, 3, 4, 5, 6]) {
expect(tourMaxHikingDifficultySchema.parse(value)).toBe(value);
}
for (const value of [0, -1, 7, 1.5, '2', null]) {
expect(() => tourMaxHikingDifficultySchema.parse(value)).toThrow();
}
});
});
+134
View File
@@ -0,0 +1,134 @@
import { z } from 'zod';
/**
* Tours contracts — the generalisation of "hike" into a domain of self-contained,
* single-day, non-motorized activities that follow a track (hike, bike, run, ski,
* kayak, city walk, food tour, ...). Tour types use a controlled key list.
*
* Isolated bounded context:
* no columns on `places`/`days`/`users`. A tour is a Place (route_geometry reused
* as-is) plus a day_assignments row (reused as-is, `assignPlaceToDay`) plus this
* facet table keyed by place_id. Boundary vs. Road-Trip: Tours = non-motorized +
* single-day, Road-Trip = motorized + multi-day.
*/
export const tourTypeKeySchema = z.enum(['hike', 'bike', 'run', 'ski', 'kayak', 'walk', 'food']);
export type TourTypeKey = z.infer<typeof tourTypeKeySchema>;
export const tourMaxHikingDifficultySchema = z.number().int().min(1).max(6);
export type TourMaxHikingDifficulty = z.infer<typeof tourMaxHikingDifficultySchema>;
export const tourTypeSchema = z.object({
key: tourTypeKeySchema,
label_key: z.string(),
icon: z.string(),
color: z.string(),
/** NULL = no engine routing (e.g. kayak — manual waypoints only). */
routing_profile: z.string().nullable(),
is_sport: z.boolean(),
enabled: z.boolean(),
sort_order: z.number().int(),
});
export type TourType = z.infer<typeof tourTypeSchema>;
export const tourSchema = z.object({
place_id: z.number().int().positive(),
tour_type: tourTypeKeySchema,
distance: z.number().nullable(),
elevation_gain: z.number().nullable(),
elevation_loss: z.number().nullable(),
duration: z.number().nullable(),
difficulty: z.string().nullable(),
// Nullable reference to a tour in wanderer.
wanderer_ref: z.string().nullable(),
match_confidence: z.number().min(0).max(1).nullable(),
tour_group_id: z.number().int().nullable(),
max_hiking_difficulty: tourMaxHikingDifficultySchema,
});
export type Tour = z.infer<typeof tourSchema>;
export const tourTypeListResponseSchema = z.object({
tourTypes: z.array(tourTypeSchema),
});
export type TourTypeListResponse = z.infer<typeof tourTypeListResponseSchema>;
/**
* A tour as shown in the Tours selection list: the `tours` facet joined with
* its owning place's name, plus
* two read-model-only fields the list needs and the facet table does not carry:
* `planned` (whether the place already has a day_assignments row — the same
* "attach only" fact PlacesSidebar's All/Unplanned/Planned filter uses) and
* `caution` (derived from match_confidence < 0.5, the "use with caution"
* threshold — surfaced as a badge instead of making the client re-derive it).
*/
export const tourListItemSchema = tourSchema.extend({
name: z.string(),
planned: z.boolean(),
caution: z.boolean(),
/** Read-model provenance signal: planner-authored tours persist routing controls; GPX imports do not. */
has_waypoints: z.boolean().optional(),
});
export type TourListItem = z.infer<typeof tourListItemSchema>;
export const tourListResponseSchema = z.object({
tours: z.array(tourListItemSchema),
});
export type TourListResponse = z.infer<typeof tourListResponseSchema>;
export const tourWaypointRoleSchema = z.enum(['start', 'via', 'end']);
export type TourWaypointRole = z.infer<typeof tourWaypointRoleSchema>;
export const tourWaypointSchema = z.object({
lat: z.number().finite().min(-90).max(90),
lng: z.number().finite().min(-180).max(180),
role: tourWaypointRoleSchema,
sequence: z.number().int().nonnegative(),
});
export type TourWaypoint = z.infer<typeof tourWaypointSchema>;
const enrichedRoutePointSchema = z.tuple([
z.number().finite().min(-90).max(90),
z.number().finite().min(-180).max(180),
z.number().finite(),
]);
export const tourCreateRequestSchema = z
.object({
name: z.string().trim().min(1).max(255),
tour_type: z.literal('hike').default('hike'),
route_geometry: z.array(enrichedRoutePointSchema).min(2),
waypoints: z.array(tourWaypointSchema).min(2),
max_hiking_difficulty: tourMaxHikingDifficultySchema.default(2),
duration_seconds: z.number().finite().nonnegative().nullable().optional(),
})
.superRefine((value, ctx) => {
value.waypoints.forEach((point, index) => {
const expectedRole: TourWaypointRole =
index === 0 ? 'start' : index === value.waypoints.length - 1 ? 'end' : 'via';
if (point.sequence !== index || point.role !== expectedRole) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ['waypoints', index],
message: `Waypoint ${index} must be ${expectedRole} with sequence ${index}`,
});
}
});
});
export type TourCreateRequest = z.infer<typeof tourCreateRequestSchema>;
export const tourCreateResponseSchema = z.object({
tour: tourListItemSchema,
waypoints: z.array(tourWaypointSchema),
});
export type TourCreateResponse = z.infer<typeof tourCreateResponseSchema>;
/** Saved-tour editor payload: list metadata plus its persisted routing controls. */
export const tourDetailResponseSchema = tourCreateResponseSchema;
export type TourDetailResponse = z.infer<typeof tourDetailResponseSchema>;
export const tourImportGpxResponseSchema = z.object({
tours: z.array(tourListItemSchema),
caution: z.boolean(),
skipped: z.number().int(),
});
export type TourImportGpxResponse = z.infer<typeof tourImportGpxResponseSchema>;