mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-13 07:40:59 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9f5d01ee09 | |||
| 67ca58f2a5 | |||
| 9eab19ea6c | |||
| 50ea9a74c9 | |||
| 82295a1d3f | |||
| 3c78452c14 |
@@ -1,6 +1,6 @@
|
||||
import { Hotel, Utensils, ShoppingCart, Bus, Plane, Ticket, Camera, ShoppingBag, FileText, HeartPulse, Coins, MoreHorizontal, Fuel, ParkingCircle } from 'lucide-react'
|
||||
import type { LucideIcon } from 'lucide-react'
|
||||
import { COST_CATEGORIES, type CostCategory } from '@trek/shared'
|
||||
import { COST_CATEGORIES, costCategoryOf, type CostCategory } from '@trek/shared'
|
||||
|
||||
/**
|
||||
* The fixed Costs categories. Users can't add their own — every expense maps to
|
||||
@@ -34,34 +34,7 @@ export const COST_CAT_META: Record<CostCategory, CostCategoryMeta> = {
|
||||
|
||||
export const COST_CATEGORY_LIST: CostCategoryMeta[] = COST_CATEGORIES.map(k => COST_CAT_META[k])
|
||||
|
||||
/**
|
||||
* Legacy / English free-text categories (and reservation type labels) mapped to
|
||||
* the fixed keys. Bookings used to store labels like "Flight"/"Train"/"Other",
|
||||
* which never matched the lowercase keys and fell through to `other`.
|
||||
*/
|
||||
const LEGACY_CATEGORY_MAP: Record<string, CostCategory> = {
|
||||
flight: 'flights', flights: 'flights', plane: 'flights', flug: 'flights',
|
||||
train: 'transport', bus: 'transport', car: 'transport', 'car rental': 'transport',
|
||||
ferry: 'transport', boat: 'transport', taxi: 'transport', transfer: 'transport', cable_car: 'transport',
|
||||
transport: 'transport', transportation: 'transport',
|
||||
hotel: 'accommodation', accommodation: 'accommodation', lodging: 'accommodation', hostel: 'accommodation',
|
||||
restaurant: 'food', food: 'food', dining: 'food', meal: 'food', meals: 'food',
|
||||
grocery: 'groceries', groceries: 'groceries',
|
||||
activity: 'activities', activities: 'activities',
|
||||
sightseeing: 'sightseeing', sights: 'sightseeing',
|
||||
shop: 'shopping', shopping: 'shopping',
|
||||
fee: 'fees', fees: 'fees',
|
||||
health: 'health', medical: 'health',
|
||||
tip: 'tips', tips: 'tips',
|
||||
gas: 'fuel', fuel: 'fuel', petrol: 'fuel',
|
||||
parking: 'parking', parkings: 'parking', 'car park': 'parking',
|
||||
other: 'other', misc: 'other',
|
||||
}
|
||||
|
||||
/** Map any stored category (incl. legacy/localized free-text values) to a known meta. */
|
||||
export function catMeta(cat: string | null | undefined): CostCategoryMeta {
|
||||
if (!cat) return COST_CAT_META.other
|
||||
if (cat in COST_CAT_META) return COST_CAT_META[cat as CostCategory]
|
||||
const mapped = LEGACY_CATEGORY_MAP[cat.trim().toLowerCase()]
|
||||
return mapped ? COST_CAT_META[mapped] : COST_CAT_META.other
|
||||
return COST_CAT_META[costCategoryOf(cat) ?? 'other']
|
||||
}
|
||||
|
||||
@@ -169,6 +169,45 @@ describe('buildDayRouteRuns', () => {
|
||||
expect(hotelBookendOf(run[0], run[1])).toBe('morning')
|
||||
})
|
||||
|
||||
it("FE-MAP-DRP-017: the morning after a night away starts at the side trip's hotel, not the room kept at home", () => {
|
||||
// The first hotel stays booked over the whole trip and comes first in the list; the
|
||||
// side trip's hotel holds the night before. The day used to start with a 716 km drive
|
||||
// from the kept room to the side trip's first stop.
|
||||
const days = [1, 2, 3, 4, 5].map(n => buildDay({ id: n, day_number: n }))
|
||||
const kept = { id: 1, trip_id: 1, place_lat: 13.7466, place_lng: 100.5393, start_day_id: 1, end_day_id: 5 } as unknown as Accommodation
|
||||
const away = { id: 2, trip_id: 1, place_lat: 18.7883, place_lng: 98.9853, start_day_id: 2, end_day_id: 3 } as unknown as Accommodation
|
||||
const runs = buildDayRouteRuns(3, inputs({
|
||||
days,
|
||||
assignments: { '3': [buildAssignment({ day_id: 3, order_index: 0, place: buildPlace({ lat: 18.8048, lng: 98.9216, place_time: '10:00' }) })] },
|
||||
accommodations: [kept, away],
|
||||
optimizeFromAccommodation: true,
|
||||
}))
|
||||
expect(runs[0][0]).toMatchObject({ lat: 18.7883, lng: 98.9853, hotel: 'morning' })
|
||||
expect(runs.flat().some(p => p.hotel === 'morning' && p.lat === 13.7466)).toBe(false)
|
||||
})
|
||||
|
||||
it('FE-MAP-DRP-018: a taxi that leaves from the hotel adds no road from the hotel to itself', () => {
|
||||
const days = [1, 2, 3].map(n => buildDay({ id: n, day_number: n }))
|
||||
const hotel = { id: 1, trip_id: 1, place_lat: 13.7466, place_lng: 100.5393, start_day_id: 1, end_day_id: 3 } as unknown as Accommodation
|
||||
const taxi = {
|
||||
id: 9, trip_id: 1, type: 'taxi', title: 'Taxi', status: 'confirmed', day_id: 2, end_day_id: 2,
|
||||
reservation_time: '2026-12-02T09:00', reservation_end_time: '2026-12-02T09:40',
|
||||
endpoints: [
|
||||
{ role: 'from', sequence: 0, name: 'Hotel', lat: 13.7466, lng: 100.5393 },
|
||||
{ role: 'to', sequence: 1, name: 'Museum', lat: 13.7516, lng: 100.4927 },
|
||||
],
|
||||
} as unknown as Reservation
|
||||
const runs = buildDayRouteRuns(2, inputs({
|
||||
days,
|
||||
assignments: { '2': [buildAssignment({ day_id: 2, order_index: 0, place: buildPlace({ lat: 13.7563, lng: 100.5018, place_time: '12:00' }) })] },
|
||||
reservations: [taxi],
|
||||
accommodations: [hotel],
|
||||
optimizeFromAccommodation: true,
|
||||
}))
|
||||
const zeroLength = runs.filter(run => run.length === 2 && run[0].lat === run[1].lat && run[0].lng === run[1].lng)
|
||||
expect(zeroLength).toEqual([])
|
||||
})
|
||||
|
||||
it('FE-MAP-DRP-008: a day that is not in the trip has no route', () => {
|
||||
expect(buildDayRouteRuns(99, inputs({ assignments: { '1': [at(48.86, 2.35, 0)] } }))).toEqual([])
|
||||
})
|
||||
|
||||
@@ -196,7 +196,10 @@ export function buildDayRouteRuns(dayId: number, input: DayRouteInputs): DayRout
|
||||
const role: CarrierEdge = side === 'first'
|
||||
? (e.from ? 'departure' : 'arrival')
|
||||
: (e.to ? 'arrival' : 'departure')
|
||||
return { isPlace: false, time: null, carrierEdge: e.carrier ? role : null }
|
||||
// The booking's own point at this edge of the day, as the sidebar passes it: a taxi
|
||||
// that starts or ends at the hotel then adds no zero-length leg to it.
|
||||
const point = side === 'first' ? (e.from ?? e.to) : (e.to ?? e.from)
|
||||
return { isPlace: false, time: null, carrierEdge: e.carrier ? role : null, lat: point?.lat, lng: point?.lng }
|
||||
}
|
||||
// A carrier with a located endpoint today means the day changes geography by
|
||||
// air/rail/sea — the check-in hotel is then the day's destination and the
|
||||
|
||||
@@ -133,7 +133,7 @@ describe('ReservationModal', () => {
|
||||
expect(screen.getByRole('button', { name: /^Accommodation$/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: /^Restaurant$/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: /^Event$/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: /^Tour$/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: /^Guided tour$/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole('button', { name: /^Parking$/i })).toBeInTheDocument();
|
||||
// The pill reads "Booking Type: Other", so only its option is named plain "Other".
|
||||
expect(screen.getAllByRole('button', { name: /^Other$/i })).toHaveLength(1);
|
||||
@@ -708,7 +708,7 @@ describe('ReservationModal', () => {
|
||||
|
||||
it('FE-PLANNER-RESMODAL-045: tour type shows time pickers', async () => {
|
||||
render(<ReservationModal {...defaultProps} />);
|
||||
await pickType(/^Tour$/i);
|
||||
await pickType(/^Guided tour$/i);
|
||||
await waitFor(() => {
|
||||
expect(screen.getAllByTestId('time-picker').length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
@@ -121,7 +121,7 @@ describe('BookingsTimeline: trip view', () => {
|
||||
expect(screen.getByText('No date')).toBeInTheDocument();
|
||||
const metro = screen.getByRole('button', { name: /Metro ride/ });
|
||||
expect(metro).toHaveAttribute('aria-pressed', 'true');
|
||||
expect(screen.getByRole('button', { name: /Bonus tour/ })).toHaveTextContent('Tour, Pending');
|
||||
expect(screen.getByRole('button', { name: /Bonus tour/ })).toHaveTextContent('Guided tour, Pending');
|
||||
expect(screen.getByRole('button', { name: /Farewell dinner/ })).toHaveTextContent('Restaurant, Confirmed');
|
||||
await userEvent.click(screen.getByRole('button', { name: /Farewell dinner/ }));
|
||||
expect(onSelect).toHaveBeenCalledWith(early);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"src/db/repositories/Users.repository.ts": 1445,
|
||||
"src/nest/atlas/atlas.service.ts": 1177,
|
||||
"src/nest/auth/auth.service.ts": 1143,
|
||||
"src/nest/budget/budget.service.ts": 1613,
|
||||
"src/nest/budget/budget.service.ts": 1612,
|
||||
"src/nest/collections/collections.service.ts": 1426,
|
||||
"src/nest/doc-sync/doc-sync.service.ts": 1060,
|
||||
"src/nest/doc-sync/providers/synology-drive.client.ts": 1160,
|
||||
|
||||
@@ -26,7 +26,7 @@ import { BudgetWritesService } from './budget-writes.service';
|
||||
import { BudgetService } from './budget.service';
|
||||
import { ExchangeRatesService } from './exchange-rates.service';
|
||||
import { InjectRepository } from '@mikro-orm/nestjs';
|
||||
import { idSchema, sumMinor, toMinor } from '@trek/shared';
|
||||
import { COST_CATEGORY_HINT, idSchema, sumMinor, toMinor } from '@trek/shared';
|
||||
|
||||
import { z } from 'zod';
|
||||
|
||||
@@ -200,7 +200,7 @@ export class BudgetMcp {
|
||||
inputSchema: {
|
||||
tripId: idSchema,
|
||||
name: z.string().min(1).max(200),
|
||||
category: z.string().max(100).optional().describe('Budget category (e.g. Accommodation, Food, Transport)'),
|
||||
category: z.string().max(100).optional().describe(COST_CATEGORY_HINT),
|
||||
total_price: z.number().describe('Signed: a negative total records a refund/partial reimbursement (#2176)'),
|
||||
currency: z
|
||||
.string()
|
||||
@@ -341,7 +341,7 @@ export class BudgetMcp {
|
||||
tripId: idSchema,
|
||||
itemId: idSchema,
|
||||
name: z.string().min(1).max(200).optional(),
|
||||
category: z.string().max(100).optional(),
|
||||
category: z.string().max(100).optional().describe(COST_CATEGORY_HINT),
|
||||
total_price: z.number().optional(),
|
||||
currency: z
|
||||
.string()
|
||||
@@ -482,7 +482,7 @@ export class BudgetMcp {
|
||||
inputSchema: {
|
||||
tripId: idSchema,
|
||||
name: z.string().min(1).max(200),
|
||||
category: z.string().max(100).optional().describe('Budget category (e.g. Accommodation, Food, Transport)'),
|
||||
category: z.string().max(100).optional().describe(COST_CATEGORY_HINT),
|
||||
total_price: z.number().describe('Signed: a negative total records a refund/partial reimbursement (#2176)'),
|
||||
note: z.string().max(500).optional(),
|
||||
userIds: z
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@mikro-orm/nestjs';
|
||||
import type { BudgetFallbackFx, BudgetParticipantFinal, BudgetUnconverted, TrekWsPayload, TrekWsTripEventName } from '@trek/shared';
|
||||
import { splitEqualShares, sumMinor, toMinor } from '@trek/shared';
|
||||
import { costCategoryOf, splitEqualShares, storedCostCategory, sumMinor, toMinor } from '@trek/shared';
|
||||
import { RealtimeService } from '../realtime/realtime.service';
|
||||
import { PermissionsService } from '../permissions/permissions.service';
|
||||
import { avatarUrl } from '../common/avatarUrl';
|
||||
@@ -91,8 +91,7 @@ export function splitLegacyTicketNote(
|
||||
* queries instead of a full listSettlements() scan, settlement usernames use
|
||||
* COALESCE(display_name, username) like every item query, and updateMembers no
|
||||
* longer double-applies avatarUrl.
|
||||
*/
|
||||
@Injectable()
|
||||
*/@Injectable()
|
||||
export class BudgetService {
|
||||
constructor(
|
||||
private readonly permissions: PermissionsService,
|
||||
@@ -520,7 +519,7 @@ export class BudgetService {
|
||||
const maxOrder = await this.budgetItemsRepo.maxSortOrder(tripId);
|
||||
const sortOrder = (maxOrder !== null ? maxOrder : -1) + 1;
|
||||
|
||||
const cat = data.category || 'other';
|
||||
const cat = storedCostCategory(data.category);
|
||||
|
||||
// Ensure category has a sort_order entry
|
||||
const catExists = await this.budgetCategoryOrderRepo.exists(tripId, cat);
|
||||
@@ -660,7 +659,7 @@ export class BudgetService {
|
||||
// (the legacy `COALESCE(?, col)` truthy-wins shape), everything else
|
||||
// passes `present = <field> !== undefined` (a true presence sentinel).
|
||||
await this.budgetItemsRepo.update(id, {
|
||||
category: [!!data.category, data.category || ''],
|
||||
category: [!!data.category, data.category ? storedCostCategory(data.category) : ''],
|
||||
name: [!!data.name, data.name || ''],
|
||||
total_price: [data.total_price !== undefined, data.total_price !== undefined ? data.total_price : 0],
|
||||
currency: [data.currency !== undefined, data.currency !== undefined ? (data.currency || null) : null],
|
||||
@@ -705,11 +704,11 @@ export class BudgetService {
|
||||
|
||||
// If category changed, update category order table
|
||||
if (data.category) {
|
||||
const catExists = await this.budgetCategoryOrderRepo.exists(tripId, data.category);
|
||||
const catExists = await this.budgetCategoryOrderRepo.exists(tripId, storedCostCategory(data.category));
|
||||
if (!catExists) {
|
||||
const maxCatOrder = await this.budgetCategoryOrderRepo.maxSortOrder(tripId);
|
||||
const catOrder = (maxCatOrder !== null && maxCatOrder !== undefined ? maxCatOrder : -1) + 1;
|
||||
await this.budgetCategoryOrderRepo.insertIgnore(tripId, data.category, catOrder);
|
||||
await this.budgetCategoryOrderRepo.insertIgnore(tripId, storedCostCategory(data.category), catOrder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1037,7 +1036,7 @@ export class BudgetService {
|
||||
}
|
||||
const cents = toMinor(convert(r.total_price || 0));
|
||||
total += cents;
|
||||
const cat = r.category || '';
|
||||
const cat = costCategoryOf(r.category) ?? (r.category || '');
|
||||
byCategory[cat] = (byCategory[cat] || 0) + cents;
|
||||
}
|
||||
return {
|
||||
|
||||
@@ -383,7 +383,7 @@ export class JourneyMcp {
|
||||
tags: z.array(z.string()).optional(),
|
||||
pros_cons: PROS_CONS.optional().describe('The verdict on the place: what was worth it and what was not'),
|
||||
visibility: ENTRY_VISIBILITY.optional().describe(
|
||||
'Defaults to private; "shared" and "public" expose the entry through the journey share link',
|
||||
'Stored with the entry, defaults to private. It does not decide the share link: every entry that is not a draft shows on the journey share link. Use is_draft to keep an entry to the contributors',
|
||||
),
|
||||
type: ENTRY_TYPE.optional().describe(
|
||||
'Defaults to "entry"; "skeleton" is the stub TREK derives from a trip place and hides behind the hide-skeletons preference',
|
||||
|
||||
@@ -155,7 +155,8 @@ describe('Tool: create_budget_item', () => {
|
||||
});
|
||||
const data = parseToolResult(result) as any;
|
||||
expect(data.item.name).toBe('Hotel Paris');
|
||||
expect(data.item.category).toBe('Accommodation');
|
||||
// Stored as its fixed key, as the Costs tab shows it (#2835).
|
||||
expect(data.item.category).toBe('accommodation');
|
||||
expect(data.item.total_price).toBe(500);
|
||||
expect(data.item.note).toBe('Prepaid');
|
||||
});
|
||||
|
||||
@@ -565,10 +565,10 @@ describe('Prompt: budget-overview', () => {
|
||||
const client = await buildServer(user.id);
|
||||
const text = await invokePromptText(client, 'budget-overview', { tripId: trip.id });
|
||||
expect(text).toContain('Budget Trip');
|
||||
expect(text).toContain('Transport');
|
||||
expect(text).toContain('Accommodation');
|
||||
expect(text).toContain('550'); // Transport total
|
||||
expect(text).toContain('300'); // Accommodation total
|
||||
// Totals group by the fixed Costs key, whatever case the expense was stored in (#2835).
|
||||
expect(text).toContain('- transport: 250');
|
||||
expect(text).toContain('- accommodation: 300');
|
||||
expect(text).toContain('550');
|
||||
});
|
||||
|
||||
it('prints a foreign-currency bill at the rate it was booked at, not as that many euros (#2525)', async () => {
|
||||
@@ -588,8 +588,8 @@ describe('Prompt: budget-overview', () => {
|
||||
const text = await invokePromptText(client, 'budget-overview', { tripId: trip.id });
|
||||
// 801.76 USD at 1.17 is 685.26 EUR. Summed as stored it read "Total: 901.76 EUR".
|
||||
expect(text).toContain('Total: 785.26 EUR');
|
||||
expect(text).toContain('- Accommodation: 685.26 EUR');
|
||||
expect(text).toContain('- Food: 100 EUR');
|
||||
expect(text).toContain('- accommodation: 685.26 EUR');
|
||||
expect(text).toContain('- food: 100 EUR');
|
||||
expect(text).not.toContain('801.76');
|
||||
});
|
||||
|
||||
|
||||
@@ -291,7 +291,7 @@ describe('MCP transit tools', () => {
|
||||
arguments: { tripId: trip.id, dayId: day.id, from, to, itinerary, price: 230, budget_category: 'Transport' },
|
||||
}),
|
||||
) as { reservation: { id: number; metadata: string } };
|
||||
expect((await findRow(orm, BudgetItems, { reservation: paid.reservation.id }))?.category).toBe('Transport');
|
||||
expect((await findRow(orm, BudgetItems, { reservation: paid.reservation.id }))?.category).toBe('transport');
|
||||
|
||||
const free = parseToolResult(
|
||||
await harness.client.callTool({
|
||||
|
||||
@@ -349,7 +349,8 @@ describe('Transport tools: the price link', () => {
|
||||
const data = parseToolResult(result) as { reservation: { id: number } };
|
||||
|
||||
const item = await findRow(orm, BudgetItems, { reservation: data.reservation.id });
|
||||
expect(item).toMatchObject({ name: 'ZRH → CDG', category: 'Flights', total_price: 240 });
|
||||
// Stored as its fixed Costs key (#2835).
|
||||
expect(item).toMatchObject({ name: 'ZRH → CDG', category: 'flights', total_price: 240 });
|
||||
// The price also rides along in the reservation metadata, as the REST path does.
|
||||
expect(broadcastMock.mock.calls.some((c) => c[1] === 'budget:created')).toBe(true);
|
||||
});
|
||||
@@ -365,7 +366,8 @@ describe('Transport tools: the price link', () => {
|
||||
});
|
||||
const data = parseToolResult(result) as { reservation: { id: number } };
|
||||
const item = await findRow(orm, BudgetItems, { reservation: data.reservation.id });
|
||||
expect(item?.category).toBe('train');
|
||||
// The type is stored as its Costs key: a train is a transport (#2835).
|
||||
expect(item?.category).toBe('transport');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
// COST-CATEGORY-001 to COST-CATEGORY-005: a typed category read as one of the fixed keys.
|
||||
import { COST_CATEGORY_HINT, costCategoryOf, storedCostCategory } from './cost-category';
|
||||
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('costCategoryOf', () => {
|
||||
it('COST-CATEGORY-001: a key stays itself', () => {
|
||||
expect(costCategoryOf('food')).toBe('food');
|
||||
expect(costCategoryOf('accommodation')).toBe('accommodation');
|
||||
});
|
||||
|
||||
it('COST-CATEGORY-002: another case or a common name reads as its key', () => {
|
||||
expect(costCategoryOf('Food')).toBe('food');
|
||||
expect(costCategoryOf(' FOOD ')).toBe('food');
|
||||
expect(costCategoryOf('Flight')).toBe('flights');
|
||||
expect(costCategoryOf('Hotel')).toBe('accommodation');
|
||||
expect(costCategoryOf('Car park')).toBe('parking');
|
||||
});
|
||||
|
||||
it('COST-CATEGORY-003: anything else is no key', () => {
|
||||
expect(costCategoryOf('Comida')).toBeNull();
|
||||
expect(costCategoryOf('')).toBeNull();
|
||||
expect(costCategoryOf(null)).toBeNull();
|
||||
expect(costCategoryOf(undefined)).toBeNull();
|
||||
});
|
||||
|
||||
it('COST-CATEGORY-004: an expense is stored under the key, other text as given, nothing as other', () => {
|
||||
expect(storedCostCategory('Food')).toBe('food');
|
||||
expect(storedCostCategory('Train')).toBe('transport');
|
||||
expect(storedCostCategory('Comida')).toBe('Comida');
|
||||
expect(storedCostCategory('')).toBe('other');
|
||||
expect(storedCostCategory(null)).toBe('other');
|
||||
expect(storedCostCategory(undefined)).toBe('other');
|
||||
});
|
||||
|
||||
it('COST-CATEGORY-005: the hint an assistant reads names every key', () => {
|
||||
for (const key of ['accommodation', 'food', 'transport', 'flights', 'other'])
|
||||
expect(COST_CATEGORY_HINT).toContain(key);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,78 @@
|
||||
import { COST_CATEGORIES, type CostCategory } from './budget.schema';
|
||||
|
||||
/**
|
||||
* Free-text and legacy categories (and booking type labels) mapped to the fixed
|
||||
* keys. Bookings used to store labels like "Flight"/"Train"/"Other", and an
|
||||
* assistant writing through the MCP says "Food" where the key is "food".
|
||||
*/
|
||||
const CATEGORY_ALIASES: Record<string, CostCategory> = {
|
||||
flight: 'flights',
|
||||
flights: 'flights',
|
||||
plane: 'flights',
|
||||
flug: 'flights',
|
||||
train: 'transport',
|
||||
bus: 'transport',
|
||||
car: 'transport',
|
||||
'car rental': 'transport',
|
||||
ferry: 'transport',
|
||||
boat: 'transport',
|
||||
taxi: 'transport',
|
||||
transfer: 'transport',
|
||||
cable_car: 'transport',
|
||||
transport: 'transport',
|
||||
transportation: 'transport',
|
||||
hotel: 'accommodation',
|
||||
accommodation: 'accommodation',
|
||||
lodging: 'accommodation',
|
||||
hostel: 'accommodation',
|
||||
restaurant: 'food',
|
||||
food: 'food',
|
||||
dining: 'food',
|
||||
meal: 'food',
|
||||
meals: 'food',
|
||||
grocery: 'groceries',
|
||||
groceries: 'groceries',
|
||||
activity: 'activities',
|
||||
activities: 'activities',
|
||||
sightseeing: 'sightseeing',
|
||||
sights: 'sightseeing',
|
||||
shop: 'shopping',
|
||||
shopping: 'shopping',
|
||||
fee: 'fees',
|
||||
fees: 'fees',
|
||||
health: 'health',
|
||||
medical: 'health',
|
||||
tip: 'tips',
|
||||
tips: 'tips',
|
||||
gas: 'fuel',
|
||||
fuel: 'fuel',
|
||||
petrol: 'fuel',
|
||||
parking: 'parking',
|
||||
parkings: 'parking',
|
||||
'car park': 'parking',
|
||||
other: 'other',
|
||||
misc: 'other',
|
||||
};
|
||||
|
||||
const KEYS: ReadonlySet<string> = new Set(COST_CATEGORIES);
|
||||
|
||||
/**
|
||||
* The fixed key a stored or typed category stands for, whatever its case, or
|
||||
* null for a category that is none of them.
|
||||
*/
|
||||
export function costCategoryOf(category: string | null | undefined): CostCategory | null {
|
||||
if (!category) return null;
|
||||
if (KEYS.has(category)) return category as CostCategory;
|
||||
return CATEGORY_ALIASES[category.trim().toLowerCase()] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The category an expense is stored under: the fixed key when the text names one,
|
||||
* so "Food" and "food" are one category, and the text itself otherwise.
|
||||
*/
|
||||
export function storedCostCategory(category: string | null | undefined): string {
|
||||
return costCategoryOf(category) ?? (category || 'other');
|
||||
}
|
||||
|
||||
/** What the MCP tells an assistant about the category field. */
|
||||
export const COST_CATEGORY_HINT = `One of the Costs categories: ${COST_CATEGORIES.join(', ')}. Another case or a common name (Hotel, Flight, Food) is stored as its key; any other text is kept as given and shows as other`;
|
||||
@@ -120,6 +120,37 @@ describe('the hotels at both ends of a day', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('STAY-BOOKENDS-007: a night away on a side trip wakes up in the side trip and comes back to the room it kept', () => {
|
||||
// The first hotel stays booked over the whole trip and comes first in the list; the
|
||||
// side trip's hotel holds one night in between.
|
||||
const kept = stay(1, 10, 40, [13.7, 100.5]);
|
||||
const away = stay(2, 20, 30, [18.8, 99]);
|
||||
const list = [kept, away];
|
||||
// Day 2 leaves the kept room and sleeps away.
|
||||
expect(getDayBookendHotels(d2, days, list)).toEqual({
|
||||
morning: kept,
|
||||
evening: away,
|
||||
morningIsSleptHere: true,
|
||||
eveningIsOvernight: true,
|
||||
});
|
||||
// Day 3 wakes up away and goes back to the kept room for the night.
|
||||
expect(getDayBookendHotels(d3, days, list)).toEqual({
|
||||
morning: away,
|
||||
evening: kept,
|
||||
morningIsSleptHere: true,
|
||||
eveningIsOvernight: true,
|
||||
});
|
||||
// The order of the list no longer decides it.
|
||||
expect(getDayBookendHotels(d3, days, [away, kept])).toEqual(getDayBookendHotels(d3, days, list));
|
||||
// Day 4, the kept room's check-out day, wakes up there.
|
||||
expect(getDayBookendHotels(d4, days, list)).toEqual({
|
||||
morning: kept,
|
||||
evening: kept,
|
||||
morningIsSleptHere: true,
|
||||
eveningIsOvernight: false,
|
||||
});
|
||||
});
|
||||
|
||||
it('STAY-BOOKENDS-005: a stay without coordinates is left out, and the other stay answers on its own', () => {
|
||||
const unplaced = stay(1, 10, 20, null);
|
||||
const next = stay(2, 20, 30, [9, 9]);
|
||||
|
||||
@@ -102,17 +102,27 @@ export const getDayBookendHotels = <A extends StayRange>(
|
||||
return d ? getDayOrder(d, days) : dayOrd;
|
||||
};
|
||||
const checkIn = inRange.find((a) => a.start_day_id === day.id); // the hotel you arrive at tonight
|
||||
const sleptHere = inRange.find((a) => orderOf(a.start_day_id) < dayOrd); // the hotel you woke up in
|
||||
// Of the stays checked into on an earlier day, the latest is the one you woke up in: a
|
||||
// night away on a side trip while the first room stays booked sleeps in the side trip's
|
||||
// hotel, not in the one booked first. The earliest of them used to win, so the morning
|
||||
// after drove from the first hotel to the side trip's airport. Ties keep the list order.
|
||||
const before = inRange
|
||||
.filter((a) => orderOf(a.start_day_id) < dayOrd)
|
||||
.sort((a, b) => orderOf(b.start_day_id) - orderOf(a.start_day_id));
|
||||
const sleptHere = before[0];
|
||||
// Tonight's hotel without a check-in today: a stay that runs on past today, the latest
|
||||
// first, which brings the side trip back to the room that was kept.
|
||||
const continuing = before.find((a) => orderOf(a.end_day_id) > dayOrd);
|
||||
|
||||
return {
|
||||
morning: sleptHere ?? checkIn ?? inRange[0],
|
||||
evening: checkIn ?? sleptHere ?? inRange[0],
|
||||
evening: checkIn ?? continuing ?? sleptHere ?? inRange[0],
|
||||
// Provenance for the drawing consumers (map + sidebar). A hotel↔transport bookend
|
||||
// is only real when you actually used the hotel: morningIsSleptHere is true only
|
||||
// when you woke up there (not a check-in fallback on an arrival day), and
|
||||
// eveningIsOvernight is true only when you sleep there tonight (you check in today,
|
||||
// or an earlier stay continues past today). The optimizer keeps using the values.
|
||||
morningIsSleptHere: sleptHere != null,
|
||||
eveningIsOvernight: checkIn != null || (sleptHere != null && orderOf(sleptHere.end_day_id) > dayOrd),
|
||||
eveningIsOvernight: checkIn != null || continuing != null,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -3182,7 +3182,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'يضم هذا التبويب كل ما حُجز للرحلة عدا المواصلات: أماكن الإقامة، وحجوزات الطاولات، والتذاكر، والجولات، ومواقف السيارات. كل حجز يظهر كبطاقة أو صف في القائمة أو شريط على المخطط الزمني، مع رمزه ومستنداته ومسافريه وتكلفته. انقر على حجز لفتح تفاصيله.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'يفتح «حجز يدوي» في الطرف الأيمن من الشريط «حجز جديد». يمكنك إنشاء ستة أنواع من الحجوزات: «الإقامة» و«مطعم» و«فعالية» و«جولة» و«موقف سيارات» و«أخرى». أما الرحلات الجوية والقطارات ووسائل النقل الأخرى فتجدها في تبويب «المواصلات»، ولا تظهر هنا أبدًا.',
|
||||
'يفتح «حجز يدوي» في الطرف الأيمن من الشريط «حجز جديد». يمكنك إنشاء ستة أنواع من الحجوزات: «الإقامة» و«مطعم» و«فعالية» و«جولة مع مرشد» و«موقف سيارات» و«أخرى». أما الرحلات الجوية والقطارات ووسائل النقل الأخرى فتجدها في تبويب «المواصلات»، ولا تظهر هنا أبدًا.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'أيقونة التنزيل قبل «حجز يدوي»، «استيراد تأكيدات الحجز»، ترفع التأكيدات ليقرأها TREK تلقائيًا: EML أو PDF أو PKPass أو HTML أو TXT، حتى خمسة ملفات بحد أقصى 10 ميغابايت لكل منها، والصور إذا كان نموذج الذكاء الاصطناعي يقرأ الصور. ولا تظهر الأيقونة إلا إذا كان الخادم قادرًا على قراءتها.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3221,7 +3221,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.goal': 'أضف إلى الرحلة يدويًا مطعمًا أو فعالية أو جولة أو موقف سيارات أو أي شيء آخر.',
|
||||
'help.guide.create-booking.step.1': 'انقر «حجز يدوي» في طرف الشريط. تفتح نافذة «حجز جديد» وفي رأسها العنوان وشارتان.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'انقر على تسمية النوع في الشريط العلوي، وتظهر فيها «أخرى» في الحجز الجديد، ثم اختر «نوع الحجز». ينشئ هذا التبويب ستة أنواع: «الإقامة» و«مطعم» و«فعالية» و«جولة» و«موقف سيارات» و«أخرى». ويتغير النموذج حسب اختيارك: «الإقامة» وحدها تستخدم نطاقًا من الأيام بدل التواريخ.',
|
||||
'انقر على تسمية النوع في الشريط العلوي، وتظهر فيها «أخرى» في الحجز الجديد، ثم اختر «نوع الحجز». ينشئ هذا التبويب ستة أنواع: «الإقامة» و«مطعم» و«فعالية» و«جولة مع مرشد» و«موقف سيارات» و«أخرى». ويتغير النموذج حسب اختيارك: «الإقامة» وحدها تستخدم نطاقًا من الأيام بدل التواريخ.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'اكتب العنوان في الشريط العلوي، في الحقل فوق الشارات. إنه الحقل الإلزامي الوحيد، ويبقى «إضافة» رماديًا إلى أن تكتب فيه شيئًا.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'سيارة',
|
||||
'reservations.type.cruise': 'رحلة بحرية',
|
||||
'reservations.type.event': 'فعالية',
|
||||
'reservations.type.tour': 'جولة',
|
||||
'reservations.type.tour': 'جولة مع مرشد',
|
||||
'reservations.type.parking': 'موقف سيارات',
|
||||
'reservations.type.other': 'أخرى',
|
||||
'reservations.type.bus': 'حافلة',
|
||||
|
||||
@@ -7,7 +7,7 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'عرض الإضافة',
|
||||
'tours.title': 'الجولات',
|
||||
'tours.empty.title': 'لا توجد جولات بعد',
|
||||
'tours.empty.body': 'خطّط لجولة أو استورد ملف GPX أو KML للبدء.',
|
||||
'tours.empty.body': 'خطّط لجولة أو استورد ملف GPX أو KML للبدء. حجزت جولة مع مرشد؟ مكانها في الحجوزات.',
|
||||
'tours.addToDay': 'إضافة إلى يوم',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'استيراد GPX',
|
||||
|
||||
@@ -3145,7 +3145,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Bu tabda nəqliyyatdan başqa səyahət üçün rezerv olunan hər şey saxlanılır: qalacağınız yerlər, masalar, biletlər, turlar və parkinq. Hər rezervasiya kodu, sənədləri, səyahətçiləri və xərci ilə birlikdə kart, siyahı sətri və ya zaman xəttində zolaq kimi görünür. Təfərrüatları açmaq üçün rezervasiyaya klikləyin.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Panelin sağ ucundakı «Əl ilə rezervasiya et» «Yeni rezervasiya» pəncərəsini açır. Burada altı növ rezervasiya yaradılır: Yaşayış yeri, Restoran, Tədbir, Tur, Parkinq və Digər. Uçuşlar, qatarlar və digər nəqliyyat «Nəqliyyat» bölməsindədir və burada heç vaxt görünmür.',
|
||||
'Panelin sağ ucundakı «Əl ilə rezervasiya et» «Yeni rezervasiya» pəncərəsini açır. Burada altı növ rezervasiya yaradılır: Yaşayış yeri, Restoran, Tədbir, Bələdçili tur, Parkinq və Digər. Uçuşlar, qatarlar və digər nəqliyyat «Nəqliyyat» bölməsindədir və burada heç vaxt görünmür.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'«Əl ilə rezervasiya et» qarşısındakı endirmə işarəsi, «Rezervasiya təsdiqlərini idxal et», təsdiqləri yükləyir ki, TREK onları avtomatik oxusun: EML, PDF, PKPass, HTML və ya TXT, ən çoxu 10 MB-lıq beş fayl, AI modeli şəkilləri oxuya bilirsə, fotolar da. Bu işarə yalnız server onları oxuya bildikdə görünür.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3187,7 +3187,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Panelin sağ ucundakı «Əl ilə rezervasiya et» düyməsinə klikləyin. «Yeni rezervasiya» açılır, yuxarıdakı başlıqda ad və iki nişan olur.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Yuxarı zolaqdakı növ yazısına klikləyin (yeni rezervasiyada orada «Digər» yazılır) və «Rezervasiya növü»nü seçin. Bu bölmədə altı növ yaradılır: «Yaşayış yeri», «Restoran», «Tədbir», «Tur», «Parkinq» və «Digər». Forma seçiminizə görə dəyişir: yalnız «Yaşayış yeri» tarixlər əvəzinə günlər aralığından istifadə edir.',
|
||||
'Yuxarı zolaqdakı növ yazısına klikləyin (yeni rezervasiyada orada «Digər» yazılır) və «Rezervasiya növü»nü seçin. Bu bölmədə altı növ yaradılır: «Yaşayış yeri», «Restoran», «Tədbir», «Bələdçili tur», «Parkinq» və «Digər». Forma seçiminizə görə dəyişir: yalnız «Yaşayış yeri» tarixlər əvəzinə günlər aralığından istifadə edir.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Başlığı yuxarıdakı zolağa, nişanların üstündəki xanaya yazın. Bu, yeganə məcburi xanadır və nəsə yazmayana qədər «Əlavə et» boz qalır.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -72,7 +72,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Avtomobil',
|
||||
'reservations.type.cruise': 'Kruiz',
|
||||
'reservations.type.event': 'Tədbir',
|
||||
'reservations.type.tour': 'Tur',
|
||||
'reservations.type.tour': 'Bələdçili tur',
|
||||
'reservations.type.parking': 'Parkinq',
|
||||
'reservations.type.other': 'Digər',
|
||||
'reservations.type.bus': 'Avtobus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Əlavə etmə görünüşü',
|
||||
'tours.title': 'Turlar',
|
||||
'tours.empty.title': 'Hələ tur yoxdur',
|
||||
'tours.empty.body': 'Başlamaq üçün tur planlaşdırın və ya GPX ya KML faylı idxal edin.',
|
||||
'tours.empty.body':
|
||||
'Başlamaq üçün tur planlaşdırın və ya GPX ya KML faylı idxal edin. Bələdçili tur sifariş etmisiniz? Onun yeri Rezervasiyalar bölməsidir.',
|
||||
'tours.addToDay': 'Günə əlavə et',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX idxalı',
|
||||
|
||||
@@ -3419,7 +3419,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Esta aba reúne tudo o que foi reservado para a viagem, menos transporte: hospedagens, mesas, ingressos, passeios e estacionamentos. Cada reserva é um cartão, uma linha de lista ou uma barra na linha do tempo, com código, documentos, viajantes e custo. Clique em uma reserva para abrir os detalhes.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'“Reserva manual”, na ponta direita da barra, abre “Nova reserva”. Ela cria seis tipos de reserva: Hospedagem, Restaurante, Evento, Passeio, Estacionamento e Outro. Voos, trens e outros transportes ficam na aba Transportes e nunca aparecem aqui.',
|
||||
'“Reserva manual”, na ponta direita da barra, abre “Nova reserva”. Ela cria seis tipos de reserva: Hospedagem, Restaurante, Evento, Passeio guiado, Estacionamento e Outro. Voos, trens e outros transportes ficam na aba Transportes e nunca aparecem aqui.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'O ícone de download antes de “Reserva manual”, “Importar confirmações de reserva”, envia confirmações para o TREK ler automaticamente: EML, PDF, PKPass, HTML ou TXT, no máximo cinco arquivos de 10 MB, e fotos quando o modelo de IA lê imagens. O ícone só aparece quando o servidor consegue ler esses arquivos.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3461,7 +3461,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Clique em “Reserva manual”, na ponta direita da barra. Abre “Nova reserva”, com o título e dois selos num cabeçalho no topo.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Clique no rótulo do tipo na faixa do topo, que mostra “Outro” numa reserva nova, e escolha o “Tipo de reserva”. Esta aba cria seis tipos: Hospedagem, Restaurante, Evento, Passeio, Estacionamento e Outro. O formulário muda conforme a escolha: só Hospedagem usa um intervalo de dias em vez de datas.',
|
||||
'Clique no rótulo do tipo na faixa do topo, que mostra “Outro” numa reserva nova, e escolha o “Tipo de reserva”. Esta aba cria seis tipos: Hospedagem, Restaurante, Evento, Passeio guiado, Estacionamento e Outro. O formulário muda conforme a escolha: só Hospedagem usa um intervalo de dias em vez de datas.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Digite o título na faixa do topo, o campo acima das etiquetas. É o único campo obrigatório, e “Adicionar” fica cinza até você preencher algo.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Carro',
|
||||
'reservations.type.cruise': 'Cruzeiro',
|
||||
'reservations.type.event': 'Evento',
|
||||
'reservations.type.tour': 'Passeio',
|
||||
'reservations.type.tour': 'Passeio guiado',
|
||||
'reservations.type.parking': 'Estacionamento',
|
||||
'reservations.type.other': 'Outro',
|
||||
'reservations.type.bus': 'Ônibus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Adicionar visualização',
|
||||
'tours.title': 'Passeios',
|
||||
'tours.empty.title': 'Nenhum passeio ainda',
|
||||
'tours.empty.body': 'Planeje um passeio ou importe um arquivo GPX ou KML para começar.',
|
||||
'tours.empty.body':
|
||||
'Planeje um passeio ou importe um arquivo GPX ou KML para começar. Reservou um passeio guiado? Ele fica em Reservas.',
|
||||
'tours.addToDay': 'Adicionar a um dia',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Importação GPX',
|
||||
|
||||
@@ -3467,7 +3467,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
"Aquesta pestanya conté tot el que s'ha reservat per al viatge excepte el transport: allotjaments, taules, entrades, excursions i aparcaments. Cada reserva és una targeta, una fila de la llista o una barra de la cronologia, amb el seu codi, els documents, els viatgers i el cost. Fes clic a una reserva per obrir-ne els detalls.",
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'«Reserva manual», a l’extrem dret de la barra, obre «Reserva nova». Pots crear sis tipus de reserves: «Allotjament», «Restaurant», «Esdeveniment», «Excursió», «Aparcament» i «Altres». Els vols, els trens i la resta de transports són a la pestanya «Transports» i aquí no apareixen mai.',
|
||||
'«Reserva manual», a l’extrem dret de la barra, obre «Reserva nova». Pots crear sis tipus de reserves: «Allotjament», «Restaurant», «Esdeveniment», «Visita guiada», «Aparcament» i «Altres». Els vols, els trens i la resta de transports són a la pestanya «Transports» i aquí no apareixen mai.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
"La icona de baixada de davant de «Reserva manual», «Importa confirmacions de reserva», puja confirmacions perquè TREK les llegeixi automàticament: EML, PDF, PKPass, HTML o TXT, fins a cinc fitxers de 10 MB com a màxim, i fotos si el model d'IA llegeix imatges. La icona només apareix si el servidor les pot llegir.",
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3509,7 +3509,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
"Fes clic a «Reserva manual», a l'extrem dret de la barra. S'obre «Reserva nova», amb el títol i dues píndoles a la capçalera.",
|
||||
'help.guide.create-booking.step.2':
|
||||
'Fes clic a l’etiqueta del tipus a la franja superior, que en una reserva nova diu «Altres», i tria el «Tipus de reserva». Des d’aquesta pestanya pots crear sis tipus: «Allotjament», «Restaurant», «Esdeveniment», «Excursió», «Aparcament» i «Altres». El formulari canvia segons el que triïs: només «Allotjament» fa servir un interval de dies en lloc de dates.',
|
||||
'Fes clic a l’etiqueta del tipus a la franja superior, que en una reserva nova diu «Altres», i tria el «Tipus de reserva». Des d’aquesta pestanya pots crear sis tipus: «Allotjament», «Restaurant», «Esdeveniment», «Visita guiada», «Aparcament» i «Altres». El formulari canvia segons el que triïs: només «Allotjament» fa servir un interval de dies en lloc de dates.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Escriu el títol a la franja superior, al camp que hi ha sobre les etiquetes. És l’únic camp obligatori, i «Afegir» està desactivat fins que hi escriguis alguna cosa.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -29,7 +29,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Cotxe',
|
||||
'reservations.type.cruise': 'Creuer',
|
||||
'reservations.type.event': 'Esdeveniment',
|
||||
'reservations.type.tour': 'Excursió',
|
||||
'reservations.type.tour': 'Visita guiada',
|
||||
'reservations.type.parking': 'Aparcament',
|
||||
'reservations.type.other': 'Altres',
|
||||
'reservations.type.bus': 'Autobús',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Afegeix una vista',
|
||||
'tours.title': 'Excursions',
|
||||
'tours.empty.title': 'Encara no hi ha excursions',
|
||||
'tours.empty.body': 'Planifica una excursió o importa un fitxer GPX o KML per començar.',
|
||||
'tours.empty.body':
|
||||
'Planifica una excursió o importa un fitxer GPX o KML per començar. Has reservat una visita guiada? Va a Reserves.',
|
||||
'tours.addToDay': 'Afegeix a un dia',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Importació GPX',
|
||||
|
||||
@@ -3345,7 +3345,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Tato karta obsahuje vše, co je pro cestu zarezervované, kromě dopravy: ubytování, stoly, vstupenky, prohlídky a parkování. Každá rezervace je kartou, řádkem seznamu nebo pruhem na časové ose s kódem, dokumenty, cestujícími a cenou. Kliknutím na rezervaci otevřete její podrobnosti.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'„Ruční rezervace“ na pravém konci lišty otevře „Nová rezervace“. Vytvoříte tak šest druhů rezervací: Ubytování, Restaurace, Událost, Prohlídka, Parkování a Ostatní. Lety, vlaky a další doprava jsou na kartě „Doprava“ a tady se nikdy nezobrazí.',
|
||||
'„Ruční rezervace“ na pravém konci lišty otevře „Nová rezervace“. Vytvoříte tak šest druhů rezervací: Ubytování, Restaurace, Událost, Prohlídka s průvodcem, Parkování a Ostatní. Lety, vlaky a další doprava jsou na kartě „Doprava“ a tady se nikdy nezobrazí.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Ikona stažení před „Ruční rezervace“, „Importovat potvrzení rezervace“, nahraje potvrzení, aby je TREK mohl automaticky přečíst: EML, PDF, PKPass, HTML nebo TXT, nejvýše pět souborů po 10 MB, a fotky, pokud model AI umí číst obrázky. Ikona se zobrazuje, jen když je server umí číst.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3387,7 +3387,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Klikněte na „Ruční rezervace“ na pravém konci lišty. Otevře se „Nová rezervace“ se záhlavím nahoře, ve kterém je název a dva štítky.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Klikněte na štítek typu v horním pruhu, u nové rezervace je na něm „Ostatní“, a vyberte „Typ rezervace“. Na této kartě vytvoříte šest typů: Ubytování, Restaurace, Událost, Prohlídka, Parkování a Ostatní. Formulář se podle volby změní: jen Ubytování používá místo dat rozsah dnů.',
|
||||
'Klikněte na štítek typu v horním pruhu, u nové rezervace je na něm „Ostatní“, a vyberte „Typ rezervace“. Na této kartě vytvoříte šest typů: Ubytování, Restaurace, Událost, Prohlídka s průvodcem, Parkování a Ostatní. Formulář se podle volby změní: jen Ubytování používá místo dat rozsah dnů.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Napište název do pruhu nahoře, do pole nad štítky. Je to jediné povinné pole a tlačítko „Přidat“ zůstane šedé, dokud něco nevyplníte.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Auto',
|
||||
'reservations.type.cruise': 'Plavba',
|
||||
'reservations.type.event': 'Událost',
|
||||
'reservations.type.tour': 'Prohlídka',
|
||||
'reservations.type.tour': 'Prohlídka s průvodcem',
|
||||
'reservations.type.parking': 'Parkování',
|
||||
'reservations.type.other': 'Jiné',
|
||||
'reservations.type.bus': 'Autobus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Zobrazení pro přidávání',
|
||||
'tours.title': 'Výlety',
|
||||
'tours.empty.title': 'Zatím žádné výlety',
|
||||
'tours.empty.body': 'Začněte naplánováním výletu nebo importem souboru GPX či KML.',
|
||||
'tours.empty.body':
|
||||
'Začněte naplánováním výletu nebo importem souboru GPX či KML. Zarezervovali jste prohlídku s průvodcem? Ta patří do Rezervací.',
|
||||
'tours.addToDay': 'Přidat ke dni',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Import GPX',
|
||||
|
||||
@@ -3492,7 +3492,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Hier steht alles, was für die Reise gebucht ist, außer Transporten: Unterkünfte, Tischreservierungen, Tickets, Touren und Parkplätze. Jede Buchung ist eine Karte, eine Listenzeile oder ein Balken im Zeitstrahl, mit Code, Dokumenten, Reisenden und Kosten. Klick auf eine Buchung, um ihre Details zu öffnen.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'„Manuelle Buchung“ rechts in der Leiste öffnet „Neue Buchung“. Damit legst du sechs Arten von Buchungen an: „Unterkunft“, „Restaurant“, „Veranstaltung“, „Tour“, „Parken“ und „Andere“. Flüge, Züge und andere Verkehrsmittel gehören in den Tab „Transporte“ und erscheinen hier nie.',
|
||||
'„Manuelle Buchung“ rechts in der Leiste öffnet „Neue Buchung“. Damit legst du sechs Arten von Buchungen an: „Unterkunft“, „Restaurant“, „Veranstaltung“, „Geführte Tour“, „Parken“ und „Andere“. Flüge, Züge und andere Verkehrsmittel gehören in den Tab „Transporte“ und erscheinen hier nie.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Das Download-Symbol vor „Manuelle Buchung“, „Buchungsbestätigungen importieren“, gibt Bestätigungen an den Parser weiter: EML, PDF, PKPass, HTML oder TXT, höchstens fünf Dateien mit je bis zu 10 MB, und Fotos, wenn das KI-Modell Bilder lesen kann. Das Symbol erscheint nur, wenn der Server die Dateien auslesen kann.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3534,7 +3534,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Klick rechts in der Leiste auf „Manuelle Buchung“. „Neue Buchung“ öffnet sich, oben mit dem Titel und zwei Labels in einer Kopfzeile.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Klick oben in der Kopfzeile auf das Typ-Label, das bei einer neuen Buchung „Andere“ zeigt, und wähle die „Art der Buchung“. In diesem Tab legst du sechs Typen an: Unterkunft, Restaurant, Veranstaltung, Tour, Parken und Andere. Das Formular passt sich deiner Wahl an: Nur „Unterkunft“ nutzt einen Zeitraum aus Tagen statt einzelner Daten.',
|
||||
'Klick oben in der Kopfzeile auf das Typ-Label, das bei einer neuen Buchung „Andere“ zeigt, und wähle die „Art der Buchung“. In diesem Tab legst du sechs Typen an: Unterkunft, Restaurant, Veranstaltung, Geführte Tour, Parken und Andere. Das Formular passt sich deiner Wahl an: Nur „Unterkunft“ nutzt einen Zeitraum aus Tagen statt einzelner Daten.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Gib den Titel oben in der Kopfzeile ein, im Feld über den Labels. Er ist das einzige Pflichtfeld, und „Hinzufügen“ bleibt ausgegraut, bis du etwas eingibst.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -63,7 +63,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Auto',
|
||||
'reservations.type.cruise': 'Kreuzfahrt',
|
||||
'reservations.type.event': 'Veranstaltung',
|
||||
'reservations.type.tour': 'Tour', // same-as-en
|
||||
'reservations.type.tour': 'Geführte Tour',
|
||||
'reservations.type.parking': 'Parkplatz',
|
||||
'reservations.type.other': 'Sonstiges',
|
||||
'reservations.type.bus': 'Bus', // same-as-en
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Ansicht zum Hinzufügen',
|
||||
'tours.title': 'Touren',
|
||||
'tours.empty.title': 'Noch keine Touren',
|
||||
'tours.empty.body': 'Plane eine Tour oder importiere eine GPX- oder KML-Datei.',
|
||||
'tours.empty.body':
|
||||
'Plane eine Tour oder importiere eine GPX- oder KML-Datei. Eine geführte Tour gebucht? Die gehört unter Buchungen.',
|
||||
'tours.addToDay': 'Zum Tag hinzufügen',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX-Import',
|
||||
|
||||
@@ -3627,7 +3627,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'This tab holds everything booked for the trip except transport: places to stay, tables, tickets, tours and parking. Every booking is a card, a list row or a bar on the timeline, with its code, its documents, its travellers and its cost. Click a booking to open its details.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Manual Booking at the right end of the bar opens New Reservation. It creates six kinds of bookings: Accommodation, Restaurant, Event, Tour, Parking and Other. Flights, trains and other transport are on the Transports tab and never appear here.',
|
||||
'Manual Booking at the right end of the bar opens New Reservation. It creates six kinds of bookings: Accommodation, Restaurant, Event, Guided tour, Parking and Other. Flights, trains and other transport are on the Transports tab and never appear here.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'The download icon before Manual Booking, Import booking confirmations, uploads confirmations so TREK can read them automatically: EML, PDF, PKPass, HTML or TXT, five files of 10 MB at most, and photos when the AI model reads pictures. The icon is only there when the server can read them.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3684,7 +3684,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Click Manual Booking at the right end of the bar. New Reservation opens, with the title and two pills in a header at the top.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Click the type label in the top band, which reads Other on a new booking, and pick the Booking Type. This tab creates six types: Accommodation, Restaurant, Event, Tour, Parking and Other. The form changes with your choice: only Accommodation uses a range of days instead of dates.',
|
||||
'Click the type label in the top band, which reads Other on a new booking, and pick the Booking Type. This tab creates six types: Accommodation, Restaurant, Event, Guided tour, Parking and Other. The form changes with your choice: only Accommodation uses a range of days instead of dates.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Type the title into the band at the top, the field above the pills. It is the only required field, and Add stays greyed out until you enter something.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Car',
|
||||
'reservations.type.cruise': 'Cruise',
|
||||
'reservations.type.event': 'Event',
|
||||
'reservations.type.tour': 'Tour',
|
||||
'reservations.type.tour': 'Guided tour',
|
||||
'reservations.type.parking': 'Parking',
|
||||
'reservations.type.other': 'Other',
|
||||
'reservations.type.bus': 'Bus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Add view',
|
||||
'tours.title': 'Tours',
|
||||
'tours.empty.title': 'No tours yet',
|
||||
'tours.empty.body': 'Plan a tour or import a GPX or KML file to get started.',
|
||||
'tours.empty.body':
|
||||
'Plan a tour or import a GPX or KML file to get started. Booked a guided tour? That goes under Bookings.',
|
||||
'tours.addToDay': 'Add to day',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX import',
|
||||
|
||||
@@ -3477,7 +3477,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Esta pestaña recoge todo lo reservado para el viaje salvo el transporte: alojamientos, mesas, entradas, visitas guiadas y aparcamientos. Cada reserva es una tarjeta, una fila de lista o una barra en la cronología, con su código, sus documentos, sus viajeros y su coste. Haz clic en una reserva para ver sus detalles.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'«Reserva manual», en el extremo derecho de la barra, abre «Nueva reserva». Permite crear seis tipos de reservas: «Alojamiento», «Restaurante», «Evento», «Excursión», «Aparcamiento» y «Otros». Los vuelos, trenes y demás transportes están en la pestaña «Transportes» y nunca aparecen aquí.',
|
||||
'«Reserva manual», en el extremo derecho de la barra, abre «Nueva reserva». Permite crear seis tipos de reservas: «Alojamiento», «Restaurante», «Evento», «Visita guiada», «Aparcamiento» y «Otros». Los vuelos, trenes y demás transportes están en la pestaña «Transportes» y nunca aparecen aquí.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'El icono de descarga delante de «Reserva manual», «Importar confirmaciones de reserva», sube confirmaciones para que TREK las lea automáticamente: EML, PDF, PKPass, HTML o TXT, hasta cinco archivos de 10 MB como máximo, y fotos si el modelo de IA puede leer imágenes. El icono solo aparece si el servidor puede leerlas.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3519,7 +3519,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Haz clic en «Reserva manual», en el extremo derecho de la barra. Se abre «Nueva reserva», con el título y dos etiquetas en una cabecera arriba del todo.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Haz clic en la etiqueta del tipo, en la franja superior, que en una reserva nueva pone «Otros», y elige el «Tipo de reserva». Desde esta pestaña se crean seis tipos: «Alojamiento», «Restaurante», «Evento», «Excursión», «Aparcamiento» y «Otros». El formulario cambia según lo que elijas: solo «Alojamiento» usa un rango de días en lugar de fechas.',
|
||||
'Haz clic en la etiqueta del tipo, en la franja superior, que en una reserva nueva pone «Otros», y elige el «Tipo de reserva». Desde esta pestaña se crean seis tipos: «Alojamiento», «Restaurante», «Evento», «Visita guiada», «Aparcamiento» y «Otros». El formulario cambia según lo que elijas: solo «Alojamiento» usa un rango de días en lugar de fechas.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Escribe el título en la franja superior, el campo que hay encima de las etiquetas. Es el único campo obligatorio, y Añadir sigue en gris hasta que escribas algo.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -29,7 +29,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Coche',
|
||||
'reservations.type.cruise': 'Crucero',
|
||||
'reservations.type.event': 'Evento',
|
||||
'reservations.type.tour': 'Excursión',
|
||||
'reservations.type.tour': 'Visita guiada',
|
||||
'reservations.type.parking': 'Aparcamiento',
|
||||
'reservations.type.other': 'Otro',
|
||||
'reservations.type.bus': 'Autobús',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Añadir vista',
|
||||
'tours.title': 'Excursiones',
|
||||
'tours.empty.title': 'Aún no hay excursiones',
|
||||
'tours.empty.body': 'Planifica una excursión o importa un archivo GPX o KML para empezar.',
|
||||
'tours.empty.body':
|
||||
'Planifica una excursión o importa un archivo GPX o KML para empezar. ¿Has reservado una visita guiada? Va en Reservas.',
|
||||
'tours.addToDay': 'Añadir a un día',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Importación GPX',
|
||||
|
||||
@@ -3066,7 +3066,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Sellel vahekaardil on kõik reisi jaoks broneeritu peale transpordi: majutus, lauad, piletid, ekskursioonid ja parkimine. Iga broneering on kaart, loendi rida või riba ajajoonel koos koodi, dokumentide, reisijate ja maksumusega. Üksikasjade avamiseks klõpsa broneeringul.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Riba paremas otsas olev „Käsitsi broneering“ avab akna „Uus broneering“. Sellega saab luua kuut tüüpi broneeringuid: „Majutus“, „Restoran“, „Üritus“, „Ekskursioon“, „Parkimine“ ja „Muu“. Lennud, rongid ja muu transport on vahekaardil „Transport“ ega ilmu kunagi siia.',
|
||||
'Riba paremas otsas olev „Käsitsi broneering“ avab akna „Uus broneering“. Sellega saab luua kuut tüüpi broneeringuid: „Majutus“, „Restoran“, „Üritus“, „Giidiga ekskursioon“, „Parkimine“ ja „Muu“. Lennud, rongid ja muu transport on vahekaardil „Transport“ ega ilmu kunagi siia.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Nupu „Käsitsi broneering“ ees olev allalaadimisikoon „Impordi broneeringukinnitused“ laadib kinnitused üles, et TREK saaks need automaatselt läbi lugeda: EML, PDF, PKPass, HTML või TXT, kuni viis faili, igaüks kuni 10 MB, ning fotod, kui tehisintellekti mudel oskab pilte lugeda. Ikoon on olemas ainult siis, kui server oskab neid lugeda.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3107,7 +3107,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Klõpsa riba paremas otsas „Käsitsi broneering“. Avaneb „Uus broneering“, mille ülaosas on päis pealkirja ja kahe märgisega.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Klõpsa ülemisel ribal tüübisildil, millel on uue broneeringu puhul kirjas „Muu“, ja vali „Broneeringu tüüp“. Sellel vahekaardil saab luua kuut tüüpi: „Majutus“, „Restoran“, „Üritus“, „Ekskursioon“, „Parkimine“ ja „Muu“. Vorm muutub vastavalt valikule: ainult „Majutus“ kasutab kuupäevade asemel päevade vahemikku.',
|
||||
'Klõpsa ülemisel ribal tüübisildil, millel on uue broneeringu puhul kirjas „Muu“, ja vali „Broneeringu tüüp“. Sellel vahekaardil saab luua kuut tüüpi: „Majutus“, „Restoran“, „Üritus“, „Giidiga ekskursioon“, „Parkimine“ ja „Muu“. Vorm muutub vastavalt valikule: ainult „Majutus“ kasutab kuupäevade asemel päevade vahemikku.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Kirjuta pealkiri ülemisele ribale, kiipide kohal olevale väljale. See on ainus kohustuslik väli ja „Lisa“ jääb halliks, kuni oled midagi sisestanud.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Auto',
|
||||
'reservations.type.cruise': 'Kruiis',
|
||||
'reservations.type.event': 'Üritus',
|
||||
'reservations.type.tour': 'Ekskursioon',
|
||||
'reservations.type.tour': 'Giidiga ekskursioon',
|
||||
'reservations.type.parking': 'Parkimine',
|
||||
'reservations.type.other': 'Muu',
|
||||
'reservations.type.bus': 'Buss',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Lisamise vaade',
|
||||
'tours.title': 'Retked',
|
||||
'tours.empty.title': 'Retki veel pole',
|
||||
'tours.empty.body': 'Alustamiseks planeeri retk või impordi GPX- või KML-fail.',
|
||||
'tours.empty.body':
|
||||
'Alustamiseks planeeri retk või impordi GPX- või KML-fail. Broneerisid giidiga ekskursiooni? See käib Broneeringute alla.',
|
||||
'tours.addToDay': 'Lisa päevale',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX-import',
|
||||
|
||||
@@ -3524,7 +3524,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Cet onglet regroupe tout ce qui est réservé pour le voyage, hors transports : hébergements, tables, billets, visites et parkings. Chaque réservation est une carte, une ligne de liste ou une barre sur la chronologie, avec son code, ses documents, ses voyageurs et son coût. Cliquez sur une réservation pour ouvrir ses détails.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'« Réservation manuelle », tout à droite de la barre, ouvre « Nouvelle réservation ». Elle permet de créer six types de réservation : « Hébergement », Restaurant, « Événement », « Visite », Parking et « Autre ». Les vols, trains et autres transports se trouvent dans l’onglet « Transports » et n’apparaissent jamais ici.',
|
||||
'« Réservation manuelle », tout à droite de la barre, ouvre « Nouvelle réservation ». Elle permet de créer six types de réservation : « Hébergement », Restaurant, « Événement », « Visite guidée », Parking et « Autre ». Les vols, trains et autres transports se trouvent dans l’onglet « Transports » et n’apparaissent jamais ici.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'L’icône de téléchargement devant « Réservation manuelle », « Importer des confirmations de réservation », importe des confirmations que TREK lit automatiquement : EML, PDF, PKPass, HTML ou TXT, cinq fichiers de 10 Mo maximum, ainsi que des photos si le modèle d’IA sait lire les images. L’icône n’apparaît que si le serveur peut les lire.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3566,7 +3566,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
"Cliquez sur « Réservation manuelle » à droite de la barre. « Nouvelle réservation » s'ouvre, avec le titre et deux pastilles dans un en-tête en haut.",
|
||||
'help.guide.create-booking.step.2':
|
||||
"Cliquez sur l'étiquette de type dans le bandeau du haut, qui indique « Autre » sur une nouvelle réservation, et choisissez le « Type de réservation ». Cet onglet crée six types : « Hébergement », « Restaurant », « Événement », « Visite », « Parking » et « Autre ». Le formulaire s'adapte à votre choix : seul « Hébergement » utilise une plage de jours au lieu de dates.",
|
||||
"Cliquez sur l'étiquette de type dans le bandeau du haut, qui indique « Autre » sur une nouvelle réservation, et choisissez le « Type de réservation ». Cet onglet crée six types : « Hébergement », « Restaurant », « Événement », « Visite guidée », « Parking » et « Autre ». Le formulaire s'adapte à votre choix : seul « Hébergement » utilise une plage de jours au lieu de dates.",
|
||||
'help.guide.create-booking.step.3':
|
||||
"Saisissez le titre dans le bandeau du haut, le champ situé au-dessus des pastilles. C'est le seul champ obligatoire, et « Ajouter » reste grisé tant qu'il est vide.",
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Voiture',
|
||||
'reservations.type.cruise': 'Croisière',
|
||||
'reservations.type.event': 'Événement',
|
||||
'reservations.type.tour': 'Visite',
|
||||
'reservations.type.tour': 'Visite guidée',
|
||||
'reservations.type.parking': 'Parking', // same-as-en
|
||||
'reservations.type.other': 'Autre',
|
||||
'reservations.type.bus': 'Bus', // same-as-en
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Ajouter une vue',
|
||||
'tours.title': 'Sorties',
|
||||
'tours.empty.title': 'Aucune sortie pour le moment',
|
||||
'tours.empty.body': 'Planifiez une sortie ou importez un fichier GPX ou KML pour commencer.',
|
||||
'tours.empty.body':
|
||||
'Planifiez une sortie ou importez un fichier GPX ou KML pour commencer. Vous avez réservé une visite guidée ? Elle va dans Réservations.',
|
||||
'tours.addToDay': 'Ajouter à une journée',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Import GPX',
|
||||
|
||||
@@ -3513,7 +3513,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Αυτή η καρτέλα περιέχει όλες τις κρατήσεις του ταξιδιού εκτός από τις μεταφορές: καταλύματα, τραπέζια, εισιτήρια, περιηγήσεις και στάθμευση. Κάθε κράτηση είναι μια κάρτα, μια γραμμή σε λίστα ή μια μπάρα στο χρονολόγιο, με τον κωδικό της, τα έγγραφά της, τους ταξιδιώτες της και το κόστος της. Πατήστε μια κράτηση για να ανοίξουν οι λεπτομέρειές της.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Το «Χειροκίνητη Κράτηση» στο δεξί άκρο της γραμμής ανοίγει τη «Νέα Κράτηση». Δημιουργεί έξι είδη κρατήσεων: «Διαμονή», «Εστιατόριο», «Εκδήλωση», «Περιήγηση», «Στάθμευση» και «Άλλο». Πτήσεις, τρένα και άλλες μεταφορές βρίσκονται στην καρτέλα «Μεταφορές» και δεν εμφανίζονται ποτέ εδώ.',
|
||||
'Το «Χειροκίνητη Κράτηση» στο δεξί άκρο της γραμμής ανοίγει τη «Νέα Κράτηση». Δημιουργεί έξι είδη κρατήσεων: «Διαμονή», «Εστιατόριο», «Εκδήλωση», «Ξενάγηση», «Στάθμευση» και «Άλλο». Πτήσεις, τρένα και άλλες μεταφορές βρίσκονται στην καρτέλα «Μεταφορές» και δεν εμφανίζονται ποτέ εδώ.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Το εικονίδιο λήψης πριν από το «Χειροκίνητη Κράτηση», «Εισαγωγή επιβεβαιώσεων κράτησης», ανεβάζει επιβεβαιώσεις για να τις διαβάσει αυτόματα το TREK: EML, PDF, PKPass, HTML ή TXT, έως πέντε αρχεία των 10 MB, καθώς και φωτογραφίες όταν το μοντέλο AI διαβάζει εικόνες. Το εικονίδιο εμφανίζεται μόνο αν ο διακομιστής μπορεί να τις διαβάσει.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3555,7 +3555,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Κάντε κλικ στη «Χειροκίνητη Κράτηση» στη δεξιά άκρη της γραμμής. Ανοίγει η «Νέα Κράτηση», με τον τίτλο και δύο ενδείξεις σε μια κεφαλίδα στην κορυφή.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Κάντε κλικ στην ετικέτα τύπου στην επάνω λωρίδα, που σε νέα κράτηση γράφει «Άλλο», και διαλέξτε τον «Τύπο Κράτησης». Αυτή η καρτέλα δημιουργεί έξι τύπους: «Διαμονή», «Εστιατόριο», «Εκδήλωση», «Περιήγηση», «Στάθμευση» και «Άλλο». Η φόρμα αλλάζει ανάλογα με την επιλογή: μόνο η «Διαμονή» χρησιμοποιεί εύρος ημερών αντί για ημερομηνίες.',
|
||||
'Κάντε κλικ στην ετικέτα τύπου στην επάνω λωρίδα, που σε νέα κράτηση γράφει «Άλλο», και διαλέξτε τον «Τύπο Κράτησης». Αυτή η καρτέλα δημιουργεί έξι τύπους: «Διαμονή», «Εστιατόριο», «Εκδήλωση», «Ξενάγηση», «Στάθμευση» και «Άλλο». Η φόρμα αλλάζει ανάλογα με την επιλογή: μόνο η «Διαμονή» χρησιμοποιεί εύρος ημερών αντί για ημερομηνίες.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Γράψτε τον τίτλο στην επάνω λωρίδα, στο πεδίο πάνω από τις ενδείξεις. Είναι το μόνο υποχρεωτικό πεδίο, και η «Προσθήκη» μένει γκριζαρισμένη μέχρι να γράψετε κάτι.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Αυτοκίνητο',
|
||||
'reservations.type.cruise': 'Κρουαζιέρα',
|
||||
'reservations.type.event': 'Εκδήλωση',
|
||||
'reservations.type.tour': 'Περιήγηση',
|
||||
'reservations.type.tour': 'Ξενάγηση',
|
||||
'reservations.type.parking': 'Στάθμευση',
|
||||
'reservations.type.other': 'Άλλο',
|
||||
'reservations.type.bus': 'Λεωφορείο',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Προβολή προσθήκης',
|
||||
'tours.title': 'Εκδρομές',
|
||||
'tours.empty.title': 'Δεν υπάρχουν εκδρομές ακόμη',
|
||||
'tours.empty.body': 'Σχεδιάστε μια εκδρομή ή εισαγάγετε ένα αρχείο GPX ή KML για να ξεκινήσετε.',
|
||||
'tours.empty.body':
|
||||
'Σχεδιάστε μια εκδρομή ή εισαγάγετε ένα αρχείο GPX ή KML για να ξεκινήσετε. Κλείσατε ξενάγηση; Αυτή μπαίνει στις Κρατήσεις.',
|
||||
'tours.addToDay': 'Προσθήκη σε ημέρα',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Εισαγωγή GPX',
|
||||
|
||||
@@ -3362,7 +3362,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'הלשונית הזו מכילה את כל מה שהוזמן לטיול מלבד תחבורה: מקומות לינה, שולחנות במסעדות, כרטיסים, סיורים וחניה. כל הזמנה מופיעה ככרטיס, כשורה ברשימה או כפס בציר הזמן, עם הקוד, המסמכים, הנוסעים והעלות שלה. לחצו על הזמנה כדי לפתוח את הפרטים שלה.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'״הזמנה ידנית״ בקצה הימני של הסרגל פותחת את ״הזמנה חדשה״. אפשר ליצור בה שישה סוגי הזמנות: לינה, מסעדה, אירוע, סיור, חניה ואחר. טיסות, רכבות ושאר אמצעי התחבורה נמצאים בלשונית ״תחבורה״ ואינם מופיעים כאן.',
|
||||
'״הזמנה ידנית״ בקצה הימני של הסרגל פותחת את ״הזמנה חדשה״. אפשר ליצור בה שישה סוגי הזמנות: לינה, מסעדה, אירוע, סיור מודרך, חניה ואחר. טיסות, רכבות ושאר אמצעי התחבורה נמצאים בלשונית ״תחבורה״ ואינם מופיעים כאן.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'סמל ההורדה שלפני ״הזמנה ידנית״, ״ייבוא אישורי הזמנה״, מעלה אישורים כדי ש-TREK יוכל לקרוא אותם אוטומטית: EML, PDF, PKPass, HTML או TXT, עד חמישה קבצים בגודל של עד 10 MB כל אחד, וגם תמונות כשמודל ה-AI יכול לקרוא אותן. הסמל מופיע רק כשהשרת יכול לקרוא את האישורים.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3417,7 +3417,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'לחצו על ״הזמנה ידנית״ בקצה הימני של הסרגל. ״הזמנה חדשה״ נפתחת עם כותרת ושתי תגיות בחלק העליון.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'לחצו על תגית הסוג בפס העליון, שמציגה ״אחר״ בהזמנה חדשה, ובחרו את סוג ההזמנה. בלשונית הזו אפשר ליצור שישה סוגים: לינה, מסעדה, אירוע, סיור, חניה ואחר. הטופס משתנה לפי הבחירה: רק ״לינה״ משתמשת בטווח ימים במקום בתאריכים.',
|
||||
'לחצו על תגית הסוג בפס העליון, שמציגה ״אחר״ בהזמנה חדשה, ובחרו את סוג ההזמנה. בלשונית הזו אפשר ליצור שישה סוגים: לינה, מסעדה, אירוע, סיור מודרך, חניה ואחר. הטופס משתנה לפי הבחירה: רק ״לינה״ משתמשת בטווח ימים במקום בתאריכים.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'הקלידו את הכותרת בפס העליון, בשדה שמעל התגיות. זהו שדה החובה היחיד, והכפתור ״הוספה״ נשאר אפור עד שתזינו משהו.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'רכב',
|
||||
'reservations.type.cruise': 'שייט',
|
||||
'reservations.type.event': 'אירוע',
|
||||
'reservations.type.tour': 'סיור',
|
||||
'reservations.type.tour': 'סיור מודרך',
|
||||
'reservations.type.parking': 'חניה',
|
||||
'reservations.type.other': 'אחר',
|
||||
'reservations.type.bus': 'אוטובוס',
|
||||
|
||||
@@ -7,7 +7,7 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'הוספת תצוגה',
|
||||
'tours.title': 'מסלולים',
|
||||
'tours.empty.title': 'עדיין אין מסלולים',
|
||||
'tours.empty.body': 'תכננו מסלול או ייבאו קובץ GPX או KML כדי להתחיל.',
|
||||
'tours.empty.body': 'תכננו מסלול או ייבאו קובץ GPX או KML כדי להתחיל. הזמנתם סיור מודרך? מקומו בהזמנות.',
|
||||
'tours.addToDay': 'הוספה ליום',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'ייבוא GPX',
|
||||
|
||||
@@ -3484,7 +3484,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Ezen a fülön minden olyan foglalás megtalálható, amely nem közlekedés: szállások, asztalfoglalások, jegyek, túrák és parkolás. Minden foglalás egy kártya, egy listasor vagy egy sáv az idővonalon, a kódjával, dokumentumaival, utazóival és költségével. A részletek megnyitásához kattints egy foglalásra.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'A sáv jobb végén lévő „Kézi foglalás” megnyitja az „Új foglalás” ablakot. Hatféle foglalást hozhatsz létre: „Szállás”, „Étterem”, „Esemény”, „Túra”, „Parkolás” és „Egyéb”. A repülőjáratok, vonatok és egyéb közlekedési eszközök a „Közlekedés” fülön vannak, és itt sosem jelennek meg.',
|
||||
'A sáv jobb végén lévő „Kézi foglalás” megnyitja az „Új foglalás” ablakot. Hatféle foglalást hozhatsz létre: „Szállás”, „Étterem”, „Esemény”, „Vezetett túra”, „Parkolás” és „Egyéb”. A repülőjáratok, vonatok és egyéb közlekedési eszközök a „Közlekedés” fülön vannak, és itt sosem jelennek meg.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'A „Kézi foglalás” előtti letöltés ikonnal („Foglalási visszaigazolások importálása”) visszaigazolásokat tölthetsz fel, amelyeket a TREK automatikusan feldolgoz: EML, PDF, PKPass, HTML vagy TXT, legfeljebb öt fájl, egyenként 10 MB-ig, valamint fotók, ha az AI-modell képeket is tud olvasni. Az ikon csak akkor jelenik meg, ha a szerver képes feldolgozni őket.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3526,7 +3526,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Kattints a sáv jobb végén a „Kézi foglalás” gombra. Megnyílik az „Új foglalás” ablak, felül egy fejlécben a címmel és két címkével.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Kattints a felső sávban a típuscímkére (új foglalásnál „Egyéb” áll rajta), és válaszd ki a „Foglalás típusa” értékét. Ezen a fülön hat típust hozhatsz létre: „Szállás”, „Étterem”, „Esemény”, „Túra”, „Parkolás” és „Egyéb”. Az űrlap a választásodtól függően változik: csak a „Szállás” használ dátumok helyett naptartományt.',
|
||||
'Kattints a felső sávban a típuscímkére (új foglalásnál „Egyéb” áll rajta), és válaszd ki a „Foglalás típusa” értékét. Ezen a fülön hat típust hozhatsz létre: „Szállás”, „Étterem”, „Esemény”, „Vezetett túra”, „Parkolás” és „Egyéb”. Az űrlap a választásodtól függően változik: csak a „Szállás” használ dátumok helyett naptartományt.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Írd be a címet a felső sávba, a címkék fölötti mezőbe. Ez az egyetlen kötelező mező, és amíg nem írsz bele semmit, a „Hozzáadás” gomb szürke marad.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Autó',
|
||||
'reservations.type.cruise': 'Hajóút',
|
||||
'reservations.type.event': 'Esemény',
|
||||
'reservations.type.tour': 'Túra',
|
||||
'reservations.type.tour': 'Vezetett túra',
|
||||
'reservations.type.parking': 'Parkolás',
|
||||
'reservations.type.other': 'Egyéb',
|
||||
'reservations.type.bus': 'Busz',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Hozzáadási nézet',
|
||||
'tours.title': 'Túrák',
|
||||
'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- vagy KML-fájlt.',
|
||||
'tours.empty.body':
|
||||
'A kezdéshez tervezz egy túrát, vagy importálj egy GPX- vagy KML-fájlt. Vezetett túrát foglaltál? Annak a Foglalások között a helye.',
|
||||
'tours.addToDay': 'Hozzáadás egy naphoz',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX-import',
|
||||
|
||||
@@ -3432,7 +3432,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Tab ini berisi semua yang dipesan untuk perjalanan selain transportasi: penginapan, meja restoran, tiket, tur, dan parkir. Setiap pemesanan tampil sebagai kartu, baris daftar, atau bar di linimasa, lengkap dengan kode, dokumen, peserta, dan biayanya. Klik pemesanan untuk membuka detailnya.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'“Pemesanan Manual” di ujung kanan bar membuka “Reservasi Baru”. Di sana bisa dibuat enam jenis pemesanan: “Akomodasi”, “Restoran”, “Acara”, “Tur”, “Parkir”, dan “Lainnya”. Penerbangan, kereta, dan transportasi lainnya ada di tab “Transportasi” dan tidak pernah muncul di sini.',
|
||||
'“Pemesanan Manual” di ujung kanan bar membuka “Reservasi Baru”. Di sana bisa dibuat enam jenis pemesanan: “Akomodasi”, “Restoran”, “Acara”, “Tur berpemandu”, “Parkir”, dan “Lainnya”. Penerbangan, kereta, dan transportasi lainnya ada di tab “Transportasi” dan tidak pernah muncul di sini.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Ikon unduh sebelum “Pemesanan Manual”, “Impor konfirmasi pemesanan”, mengunggah konfirmasi agar TREK bisa membacanya secara otomatis: EML, PDF, PKPass, HTML, atau TXT, maksimal lima file masing-masing 10 MB, serta foto jika model AI bisa membaca gambar. Ikon ini hanya ada jika server bisa membacanya.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3474,7 +3474,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Klik “Pemesanan Manual” di ujung kanan bilah. “Reservasi Baru” terbuka, dengan judul dan dua label di header bagian atas.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Klik label jenis di pita atas, yang bertuliskan “Lainnya” pada pemesanan baru, lalu pilih “Jenis Pemesanan”. Tab ini bisa membuat enam jenis: “Akomodasi”, “Restoran”, “Acara”, “Tur”, “Parkir”, dan “Lainnya”. Formulir berubah sesuai pilihanmu: hanya “Akomodasi” yang memakai rentang hari, bukan tanggal.',
|
||||
'Klik label jenis di pita atas, yang bertuliskan “Lainnya” pada pemesanan baru, lalu pilih “Jenis Pemesanan”. Tab ini bisa membuat enam jenis: “Akomodasi”, “Restoran”, “Acara”, “Tur berpemandu”, “Parkir”, dan “Lainnya”. Formulir berubah sesuai pilihanmu: hanya “Akomodasi” yang memakai rentang hari, bukan tanggal.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Ketik judul di pita atas, yaitu kolom di atas label. Hanya kolom ini yang wajib diisi, dan “Tambah” tetap abu-abu sampai kamu mengisinya.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -61,7 +61,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Mobil',
|
||||
'reservations.type.cruise': 'Kapal Pesiar',
|
||||
'reservations.type.event': 'Acara',
|
||||
'reservations.type.tour': 'Tur',
|
||||
'reservations.type.tour': 'Tur berpemandu',
|
||||
'reservations.type.parking': 'Parkir',
|
||||
'reservations.type.other': 'Lainnya',
|
||||
'reservations.type.bus': 'Bus', // same-as-en
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Tampilan penambahan',
|
||||
'tours.title': 'Tur',
|
||||
'tours.empty.title': 'Belum ada tur',
|
||||
'tours.empty.body': 'Rencanakan tur atau impor berkas GPX atau KML untuk memulai.',
|
||||
'tours.empty.body':
|
||||
'Rencanakan tur atau impor berkas GPX atau KML untuk memulai. Sudah memesan tur berpemandu? Itu masuk ke Pemesanan.',
|
||||
'tours.addToDay': 'Tambahkan ke hari',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Impor GPX',
|
||||
|
||||
@@ -3459,7 +3459,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
"Questa scheda contiene tutto ciò che è prenotato per il viaggio, tranne i trasporti: alloggi, tavoli, biglietti, tour e parcheggi. Ogni prenotazione è una scheda, una riga dell'elenco o una barra nella cronologia, con codice, documenti, viaggiatori e costo. Clicca su una prenotazione per aprirne i dettagli.",
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
"«Prenotazione manuale», all'estremità destra della barra, apre «Nuova prenotazione». Crea sei tipi di prenotazione: «Alloggio», «Ristorante», «Evento», Tour, «Parcheggio» e «Altro». Voli, treni e altri trasporti si trovano nella scheda «Trasporti» e qui non compaiono mai.",
|
||||
"«Prenotazione manuale», all'estremità destra della barra, apre «Nuova prenotazione». Crea sei tipi di prenotazione: «Alloggio», «Ristorante», «Evento», Visita guidata, «Parcheggio» e «Altro». Voli, treni e altri trasporti si trovano nella scheda «Trasporti» e qui non compaiono mai.",
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
"L'icona di download prima di «Prenotazione manuale», «Importa conferme di prenotazione», carica le conferme perché TREK le legga automaticamente: EML, PDF, PKPass, HTML o TXT, al massimo cinque file da 10 MB, e foto se il modello di IA legge le immagini. L'icona compare solo se il server è in grado di leggerle.",
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3501,7 +3501,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
"Clicca «Prenotazione manuale» all'estremità destra della barra. Si apre «Nuova prenotazione», con il titolo e due etichette nell'intestazione in alto.",
|
||||
'help.guide.create-booking.step.2':
|
||||
"Clicca l'etichetta del tipo nella fascia in alto, che in una nuova prenotazione indica «Altro», e scegli il «Tipo di prenotazione». Da questa scheda puoi creare sei tipi: Alloggio, Ristorante, Evento, Tour, Parcheggio e Altro. Il modulo cambia in base alla scelta: solo «Alloggio» usa un intervallo di giorni invece delle date.",
|
||||
"Clicca l'etichetta del tipo nella fascia in alto, che in una nuova prenotazione indica «Altro», e scegli il «Tipo di prenotazione». Da questa scheda puoi creare sei tipi: Alloggio, Ristorante, Evento, Visita guidata, Parcheggio e Altro. Il modulo cambia in base alla scelta: solo «Alloggio» usa un intervallo di giorni invece delle date.",
|
||||
'help.guide.create-booking.step.3':
|
||||
"Scrivi il titolo nella fascia in alto, nel campo sopra le etichette. È l'unico campo obbligatorio e «Aggiungi» resta disattivato finché non inserisci qualcosa.",
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -61,7 +61,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Auto',
|
||||
'reservations.type.cruise': 'Crociera',
|
||||
'reservations.type.event': 'Evento',
|
||||
'reservations.type.tour': 'Tour', // same-as-en
|
||||
'reservations.type.tour': 'Visita guidata',
|
||||
'reservations.type.parking': 'Parcheggio',
|
||||
'reservations.type.other': 'Altro',
|
||||
'reservations.type.bus': 'Autobus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Aggiungi vista',
|
||||
'tours.title': 'Escursioni',
|
||||
'tours.empty.title': 'Nessuna escursione ancora',
|
||||
'tours.empty.body': "Pianifica un'escursione o importa un file GPX o KML per iniziare.",
|
||||
'tours.empty.body':
|
||||
"Pianifica un'escursione o importa un file GPX o KML per iniziare. Hai prenotato una visita guidata? Va in Prenotazioni.",
|
||||
'tours.addToDay': 'Aggiungi a un giorno',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Importazione GPX',
|
||||
|
||||
@@ -3297,7 +3297,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'このタブには、移動以外の旅行の予約がすべて入ります。宿泊、レストランの予約、チケット、ツアー、駐車場などです。予約はそれぞれカード、リストの行、タイムラインのバーで表示され、予約コード、書類、同行者、費用が含まれます。予約をクリックすると詳細が開きます。',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'バーの右端の「手動予約」で「新しい予約」が開きます。作成できる予約は「宿泊」「レストラン」「イベント」「ツアー」「駐車場」「その他」の6種類です。飛行機、電車などの移動は「移動」タブにあり、ここには表示されません。',
|
||||
'バーの右端の「手動予約」で「新しい予約」が開きます。作成できる予約は「宿泊」「レストラン」「イベント」「ガイドツアー」「駐車場」「その他」の6種類です。飛行機、電車などの移動は「移動」タブにあり、ここには表示されません。',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'「手動予約」の前にあるダウンロードアイコン「予約確認書のインポート」で確認書をアップロードすると、TREKが自動で読み取ります。対応形式はEML、PDF、PKPass、HTML、TXTで、1ファイル10 MBまで、最大5ファイルです。AIモデルが画像を読める場合は写真も使えます。このアイコンは、サーバーが読み取りに対応している場合だけ表示されます。',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3337,7 +3337,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'バーの右端にある「手動予約」をクリックします。「新しい予約」が開き、上部のヘッダーにタイトルと2つのラベルが表示されます。',
|
||||
'help.guide.create-booking.step.2':
|
||||
'上部の帯にあるタイプのラベル(新しい予約では「その他」)をクリックし、「予約タイプ」を選びます。このタブで作れるのは「宿泊」「レストラン」「イベント」「ツアー」「駐車場」「その他」の6種類です。選んだタイプに応じてフォームが変わります。日付ではなく日の範囲を使うのは「宿泊」だけです。',
|
||||
'上部の帯にあるタイプのラベル(新しい予約では「その他」)をクリックし、「予約タイプ」を選びます。このタブで作れるのは「宿泊」「レストラン」「イベント」「ガイドツアー」「駐車場」「その他」の6種類です。選んだタイプに応じてフォームが変わります。日付ではなく日の範囲を使うのは「宿泊」だけです。',
|
||||
'help.guide.create-booking.step.3':
|
||||
'上部の帯の、ラベルの上にある欄にタイトルを入力します。必須の項目はこれだけで、何か入力するまで「追加」はグレーのままです。',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'レンタカー',
|
||||
'reservations.type.cruise': 'クルーズ',
|
||||
'reservations.type.event': 'イベント',
|
||||
'reservations.type.tour': 'ツアー',
|
||||
'reservations.type.tour': 'ガイドツアー',
|
||||
'reservations.type.parking': '駐車場',
|
||||
'reservations.type.other': 'その他',
|
||||
'reservations.type.bus': 'バス',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': '追加する項目',
|
||||
'tours.title': 'ツアー',
|
||||
'tours.empty.title': 'ツアーはまだありません',
|
||||
'tours.empty.body': 'ツアーを計画するか、GPXまたはKMLファイルをインポートしてください。',
|
||||
'tours.empty.body':
|
||||
'ツアーを計画するか、GPXまたはKMLファイルをインポートしてください。ガイドツアーを予約済みですか?それは予約に入れてください。',
|
||||
'tours.addToDay': '日程に追加',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPXインポート',
|
||||
|
||||
@@ -3136,7 +3136,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'이 탭에는 교통을 뺀 여행 예약이 모두 있어요: 숙소, 식당 자리, 티켓, 투어, 주차. 예약마다 카드, 목록의 줄, 타임라인의 막대로 보이고, 코드, 문서, 동행자, 비용이 함께 있어요. 예약을 클릭하면 상세 정보가 열려요.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'바 오른쪽 끝의 ‘직접 예약’으로 ‘새 예약’을 열어요. 여섯 종류의 예약을 만들 수 있어요: ‘숙박’, ‘레스토랑’, ‘이벤트’, ‘투어’, ‘주차’, ‘기타’. 항공편, 기차 등 교통은 ‘교통’ 탭에 있고 여기에는 나오지 않아요.',
|
||||
'바 오른쪽 끝의 ‘직접 예약’으로 ‘새 예약’을 열어요. 여섯 종류의 예약을 만들 수 있어요: ‘숙박’, ‘레스토랑’, ‘이벤트’, ‘가이드 투어’, ‘주차’, ‘기타’. 항공편, 기차 등 교통은 ‘교통’ 탭에 있고 여기에는 나오지 않아요.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'‘직접 예약’ 앞의 다운로드 아이콘 ‘예약 확인서 가져오기’로 확인서를 올리면 TREK가 자동으로 읽어요: EML, PDF, PKPass, HTML, TXT 파일을 각 10MB까지 최대 다섯 개, AI 모델이 이미지를 읽을 수 있으면 사진도 돼요. 서버가 읽을 수 있을 때만 이 아이콘이 보여요.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3176,7 +3176,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'바 오른쪽 끝의 “직접 예약”을 클릭하세요. “새 예약”이 열리고, 맨 위 헤더에 제목과 배지 두 개가 있어요.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'맨 위 띠의 유형 라벨(새 예약에서는 “기타”)을 클릭하고 “예약 유형”을 고르세요. 이 탭에서는 “숙박”, “레스토랑”, “이벤트”, “투어”, “주차”, “기타” 여섯 가지를 만들 수 있어요. 고른 유형에 따라 양식이 바뀌고, 날짜 대신 기간을 쓰는 건 “숙박”뿐이에요.',
|
||||
'맨 위 띠의 유형 라벨(새 예약에서는 “기타”)을 클릭하고 “예약 유형”을 고르세요. 이 탭에서는 “숙박”, “레스토랑”, “이벤트”, “가이드 투어”, “주차”, “기타” 여섯 가지를 만들 수 있어요. 고른 유형에 따라 양식이 바뀌고, 날짜 대신 기간을 쓰는 건 “숙박”뿐이에요.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'맨 위 띠, 배지 위의 입력란에 제목을 입력하세요. 필수 항목은 제목뿐이고, 입력하기 전에는 “추가”가 회색으로 비활성화돼요.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': '차량',
|
||||
'reservations.type.cruise': '크루즈',
|
||||
'reservations.type.event': '이벤트',
|
||||
'reservations.type.tour': '투어',
|
||||
'reservations.type.tour': '가이드 투어',
|
||||
'reservations.type.parking': '주차',
|
||||
'reservations.type.other': '기타',
|
||||
'reservations.type.bus': '버스',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': '추가 항목 보기',
|
||||
'tours.title': '투어',
|
||||
'tours.empty.title': '아직 투어가 없습니다',
|
||||
'tours.empty.body': '투어를 계획하거나 GPX 또는 KML 파일을 가져와 시작하세요.',
|
||||
'tours.empty.body':
|
||||
'투어를 계획하거나 GPX 또는 KML 파일을 가져와 시작하세요. 가이드 투어를 예약했나요? 그건 예약에 넣으세요.',
|
||||
'tours.addToDay': '일정에 추가',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX 가져오기',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Weergave toevoegen',
|
||||
'tours.title': 'Tochten',
|
||||
'tours.empty.title': 'Nog geen tochten',
|
||||
'tours.empty.body': 'Plan een tocht of importeer een GPX- of KML-bestand om te beginnen.',
|
||||
'tours.empty.body':
|
||||
'Plan een tocht of importeer een GPX- of KML-bestand om te beginnen. Een rondleiding geboekt? Die hoort bij Boekingen.',
|
||||
'tours.addToDay': 'Aan dag toevoegen',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX-import',
|
||||
|
||||
@@ -3406,7 +3406,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Na tej karcie jest wszystko, co zarezerwowano na podróż, oprócz transportu: noclegi, stoliki, bilety, wycieczki i parkingi. Każda rezerwacja to karta, wiersz listy lub pasek na osi czasu, z kodem, dokumentami, podróżnymi i kosztem. Kliknij rezerwację, aby otworzyć szczegóły.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'„Rezerwacja ręczna” na prawym końcu paska otwiera „Nowa rezerwacja”. Można w ten sposób utworzyć sześć rodzajów rezerwacji: „Nocleg”, „Restauracja”, „Wydarzenie”, „Wycieczka”, parking i „Inne”. Loty, pociągi i inny transport są w zakładce „Transport” i nigdy się tu nie pojawiają.',
|
||||
'„Rezerwacja ręczna” na prawym końcu paska otwiera „Nowa rezerwacja”. Można w ten sposób utworzyć sześć rodzajów rezerwacji: „Nocleg”, „Restauracja”, „Wydarzenie”, „Wycieczka z przewodnikiem”, parking i „Inne”. Loty, pociągi i inny transport są w zakładce „Transport” i nigdy się tu nie pojawiają.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Ikona pobierania przed „Rezerwacja ręczna”, czyli „Importuj potwierdzenia rezerwacji”, przesyła potwierdzenia, żeby TREK mógł je automatycznie odczytać: EML, PDF, PKPass, HTML lub TXT, maksymalnie pięć plików po 10 MB, a także zdjęcia, jeśli model AI odczytuje obrazy. Ikona jest widoczna tylko wtedy, gdy serwer potrafi je odczytać.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3448,7 +3448,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Kliknij „Rezerwacja ręczna” na prawym końcu paska. Otworzy się „Nowa rezerwacja” z tytułem i dwiema plakietkami w nagłówku u góry.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Kliknij etykietę typu w górnym pasku, która przy nowej rezerwacji ma napis „Inne”, i wybierz „Rodzaj rezerwacji”. W tej zakładce utworzysz sześć typów: Nocleg, Restauracja, Wydarzenie, Wycieczka, Parking i Inne. Formularz zmienia się zależnie od wyboru: tylko „Nocleg” zamiast dat używa zakresu dni.',
|
||||
'Kliknij etykietę typu w górnym pasku, która przy nowej rezerwacji ma napis „Inne”, i wybierz „Rodzaj rezerwacji”. W tej zakładce utworzysz sześć typów: Nocleg, Restauracja, Wydarzenie, Wycieczka z przewodnikiem, Parking i Inne. Formularz zmienia się zależnie od wyboru: tylko „Nocleg” zamiast dat używa zakresu dni.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Wpisz tytuł w górnym pasku, w polu nad plakietkami. To jedyne wymagane pole, a przycisk „Dodaj” pozostaje wyszarzony, dopóki czegoś nie wpiszesz.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -61,7 +61,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.searchLocation': 'Szukaj stacji, portu, adresu...',
|
||||
'reservations.type.cruise': 'Rejs',
|
||||
'reservations.type.event': 'Wydarzenie',
|
||||
'reservations.type.tour': 'Wycieczka',
|
||||
'reservations.type.tour': 'Wycieczka z przewodnikiem',
|
||||
'reservations.type.parking': 'Parking', // same-as-en
|
||||
'reservations.type.other': 'Inne',
|
||||
'reservations.type.bus': 'Autobus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Widok dodawania',
|
||||
'tours.title': 'Wycieczki',
|
||||
'tours.empty.title': 'Nie ma jeszcze wycieczek',
|
||||
'tours.empty.body': 'Zaplanuj wycieczkę lub zaimportuj plik GPX albo KML, aby rozpocząć.',
|
||||
'tours.empty.body':
|
||||
'Zaplanuj wycieczkę lub zaimportuj plik GPX albo KML, aby rozpocząć. Zarezerwowano wycieczkę z przewodnikiem? Jej miejsce jest w Rezerwacjach.',
|
||||
'tours.addToDay': 'Dodaj do dnia',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Import GPX',
|
||||
|
||||
@@ -3405,7 +3405,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'На этой вкладке собрано всё забронированное для поездки, кроме транспорта: жильё, столики, билеты, экскурсии и парковки. Каждое бронирование показано карточкой, строкой списка или полосой на хронологии вместе с кодом, документами, путешественниками и стоимостью. Нажмите на бронирование, чтобы открыть подробности.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'«Ручное бронирование» у правого края панели открывает «Новое бронирование». Здесь создаются шесть видов бронирований: «Жильё», «Ресторан», «Мероприятие», «Экскурсия», «Парковка» и «Другое». Перелёты, поезда и прочий транспорт находятся на вкладке «Транспорт» и здесь никогда не появляются.',
|
||||
'«Ручное бронирование» у правого края панели открывает «Новое бронирование». Здесь создаются шесть видов бронирований: «Жильё», «Ресторан», «Мероприятие», «Экскурсия с гидом», «Парковка» и «Другое». Перелёты, поезда и прочий транспорт находятся на вкладке «Транспорт» и здесь никогда не появляются.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Значок загрузки перед «Ручное бронирование», «Импорт подтверждений бронирования», загружает подтверждения, чтобы TREK распознал их автоматически: EML, PDF, PKPass, HTML или TXT, не больше пяти файлов по 10 МБ, а также фото, если ИИ-модель умеет читать изображения. Значок виден, только если сервер может распознавать такие файлы.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3447,7 +3447,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Нажмите «Ручное бронирование» в правой части панели. Откроется окно «Новое бронирование» с названием и двумя метками в шапке.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Нажмите на метку типа в верхней полосе (у нового бронирования там написано «Другое») и выберите «Тип бронирования». На этой вкладке создаются шесть типов: «Проживание», «Ресторан», «Мероприятие», «Экскурсия», «Парковка» и «Другое». Форма меняется в зависимости от выбора: только у проживания вместо дат указывается диапазон дней.',
|
||||
'Нажмите на метку типа в верхней полосе (у нового бронирования там написано «Другое») и выберите «Тип бронирования». На этой вкладке создаются шесть типов: «Проживание», «Ресторан», «Мероприятие», «Экскурсия с гидом», «Парковка» и «Другое». Форма меняется в зависимости от выбора: только у проживания вместо дат указывается диапазон дней.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Введите название в верхнюю полосу, в поле над плашками. Это единственное обязательное поле, и пока оно пустое, кнопка «Добавить» остаётся серой.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Автомобиль',
|
||||
'reservations.type.cruise': 'Круиз',
|
||||
'reservations.type.event': 'Мероприятие',
|
||||
'reservations.type.tour': 'Экскурсия',
|
||||
'reservations.type.tour': 'Экскурсия с гидом',
|
||||
'reservations.type.parking': 'Парковка',
|
||||
'reservations.type.other': 'Другое',
|
||||
'reservations.type.bus': 'Автобус',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Режим добавления',
|
||||
'tours.title': 'Туры',
|
||||
'tours.empty.title': 'Туров пока нет',
|
||||
'tours.empty.body': 'Для начала спланируйте тур или импортируйте файл GPX или KML.',
|
||||
'tours.empty.body':
|
||||
'Для начала спланируйте тур или импортируйте файл GPX или KML. Забронировали экскурсию с гидом? Её место в разделе «Бронирования».',
|
||||
'tours.addToDay': 'Добавить к дню',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Импорт GPX',
|
||||
|
||||
@@ -3065,7 +3065,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Na tejto záložke je všetko, čo máte pre cestu rezervované okrem dopravy: ubytovanie, stoly v reštauráciách, vstupenky, prehliadky a parkovanie. Každá rezervácia je karta, riadok zoznamu alebo pruh na časovej osi so svojím kódom, dokumentmi, cestujúcimi a nákladmi. Kliknutím na rezerváciu otvoríte jej podrobnosti.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Ručná rezervácia na pravom konci lišty otvorí Nová rezervácia. Vytvára šesť druhov rezervácií: Ubytovanie, Reštaurácia, Udalosť, Prehliadka, Parkovanie a Iné. Lety, vlaky a ostatná doprava sú v záložke Doprava a tu sa nikdy nezobrazia.',
|
||||
'Ručná rezervácia na pravom konci lišty otvorí Nová rezervácia. Vytvára šesť druhov rezervácií: Ubytovanie, Reštaurácia, Udalosť, Prehliadka so sprievodcom, Parkovanie a Iné. Lety, vlaky a ostatná doprava sú v záložke Doprava a tu sa nikdy nezobrazia.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Ikona sťahovania pred Ručná rezervácia, Importovať potvrdenia rezervácií, nahrá potvrdenia, aby ich TREK vedel prečítať automaticky: EML, PDF, PKPass, HTML alebo TXT, najviac päť súborov po 10 MB, a fotky, ak AI model číta obrázky. Ikona sa zobrazí, iba ak ich server vie čítať.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3107,7 +3107,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Kliknite na „Ručná rezervácia“ na pravom konci lišty. Otvorí sa „Nová rezervácia“ s názvom a dvoma štítkami v hlavičke hore.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Kliknite na štítok typu v hornej časti, ktorý je pri novej rezervácii Ostatné, a vyberte Typ rezervácie. Táto záložka vytvára šesť typov: Ubytovanie, Reštaurácia, Udalosť, Prehliadka, Parkovanie a Ostatné. Formulár sa mení podľa vášho výberu: iba Ubytovanie používa namiesto dátumov rozsah dní.',
|
||||
'Kliknite na štítok typu v hornej časti, ktorý je pri novej rezervácii Ostatné, a vyberte Typ rezervácie. Táto záložka vytvára šesť typov: Ubytovanie, Reštaurácia, Udalosť, Prehliadka so sprievodcom, Parkovanie a Ostatné. Formulár sa mení podľa vášho výberu: iba Ubytovanie používa namiesto dátumov rozsah dní.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Zadajte názov do hornej časti, do poľa nad štítkami. Je to jediné povinné pole a Pridať zostane sivé, kým do neho niečo nezadáte.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -63,7 +63,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Auto',
|
||||
'reservations.type.cruise': 'Plavba',
|
||||
'reservations.type.event': 'Udalosť',
|
||||
'reservations.type.tour': 'Prehliadka',
|
||||
'reservations.type.tour': 'Prehliadka so sprievodcom',
|
||||
'reservations.type.parking': 'Parkovanie',
|
||||
'reservations.type.other': 'Iné',
|
||||
'reservations.type.bus': 'Autobus',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Zobrazenie pridávania',
|
||||
'tours.title': 'Túry',
|
||||
'tours.empty.title': 'Zatiaľ žiadne túry',
|
||||
'tours.empty.body': 'Začnite plánovaním túry alebo importom súboru GPX či KML.',
|
||||
'tours.empty.body':
|
||||
'Začnite plánovaním túry alebo importom súboru GPX či KML. Rezervovali ste si prehliadku so sprievodcom? Tá patrí do Rezervácií.',
|
||||
'tours.addToDay': 'Pridať k dňu',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Import GPX',
|
||||
|
||||
@@ -3376,7 +3376,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Den här fliken innehåller allt som är bokat för resan utom transport: boenden, bord, biljetter, turer och parkering. Varje bokning är ett kort, en rad i listan eller ett fält på tidslinjen, med sin kod, sina dokument, sina resenärer och sin kostnad. Klicka på en bokning för att öppna dess detaljer.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Manuell bokning längst till höger i fältet öppnar Ny bokning. Där skapar du sex sorters bokningar: Boende, Restaurang, Evenemang, Rundtur, Parkering och Övrigt. Flyg, tåg och andra transporter finns i fliken Transporter och visas aldrig här.',
|
||||
'Manuell bokning längst till höger i fältet öppnar Ny bokning. Där skapar du sex sorters bokningar: Boende, Restaurang, Evenemang, Guidad tur, Parkering och Övrigt. Flyg, tåg och andra transporter finns i fliken Transporter och visas aldrig här.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Nedladdningsikonen före Manuell bokning, Importera bokningsbekräftelser, laddar upp bekräftelser så att TREK kan läsa dem automatiskt: EML, PDF, PKPass, HTML eller TXT, högst fem filer på 10 MB, samt foton när AI-modellen läser bilder. Ikonen finns bara när servern kan läsa dem.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3418,7 +3418,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Klicka på Manuell bokning längst till höger i fältet. Ny bokning öppnas, med titeln och två brickor i en rubrik överst.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Klicka på typetiketten i det övre fältet, som visar ”Övrigt” på en ny bokning, och välj ”Bokningstyp”. Den här fliken skapar sex typer: Boende, Restaurang, Evenemang, Rundtur, Parkering och Övrigt. Formuläret ändras efter ditt val: bara Boende använder ett datumspann i stället för enskilda datum.',
|
||||
'Klicka på typetiketten i det övre fältet, som visar ”Övrigt” på en ny bokning, och välj ”Bokningstyp”. Den här fliken skapar sex typer: Boende, Restaurang, Evenemang, Guidad tur, Parkering och Övrigt. Formuläret ändras efter ditt val: bara Boende använder ett datumspann i stället för enskilda datum.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Skriv titeln i bandet överst, fältet ovanför brickorna. Det är det enda obligatoriska fältet, och ”Lägg till” är gråtonad tills du har skrivit något.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -61,7 +61,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Bil',
|
||||
'reservations.type.cruise': 'Kryssning',
|
||||
'reservations.type.event': 'Evenemang',
|
||||
'reservations.type.tour': 'Rundtur',
|
||||
'reservations.type.tour': 'Guidad tur',
|
||||
'reservations.type.parking': 'Parkering',
|
||||
'reservations.type.other': 'Övrigt',
|
||||
'reservations.type.bus': 'Buss',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Lägg till vy',
|
||||
'tours.title': 'Turer',
|
||||
'tours.empty.title': 'Inga turer ännu',
|
||||
'tours.empty.body': 'Planera en tur eller importera en GPX- eller KML-fil för att komma igång.',
|
||||
'tours.empty.body':
|
||||
'Planera en tur eller importera en GPX- eller KML-fil för att komma igång. Har du bokat en guidad tur? Den hör hemma under Bokningar.',
|
||||
'tours.addToDay': 'Lägg till på en dag',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX-import',
|
||||
|
||||
@@ -2899,7 +2899,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'แท็บที่เก็บทุกอย่างที่จองไว้สำหรับทริปซึ่งไม่ใช่การเดินทาง: ที่พัก โต๊ะอาหาร ตั๋ว ทัวร์ ที่จอดรถ การจองแต่ละรายการเป็นการ์ด แถวในรายการ หรือแถบบนไทม์ไลน์ พร้อมรหัส เอกสาร นักเดินทาง และค่าใช้จ่าย และคลิกเพื่อเปิดรายละเอียดได้',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'“การจองด้วยตนเอง” ที่ปลายขวาของแถบจะเปิด “การจองใหม่” สร้างการจองได้หกประเภท ได้แก่ ที่พัก ร้านอาหาร เหตุการณ์ ทัวร์ ที่จอดรถ และอื่นๆ ส่วนเที่ยวบิน รถไฟ และการขนส่งอื่นอยู่ในแท็บ “การขนส่ง” และจะไม่ขึ้นที่นี่',
|
||||
'“การจองด้วยตนเอง” ที่ปลายขวาของแถบจะเปิด “การจองใหม่” สร้างการจองได้หกประเภท ได้แก่ ที่พัก ร้านอาหาร เหตุการณ์ ทัวร์พร้อมไกด์ ที่จอดรถ และอื่นๆ ส่วนเที่ยวบิน รถไฟ และการขนส่งอื่นอยู่ในแท็บ “การขนส่ง” และจะไม่ขึ้นที่นี่',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'ไอคอนดาวน์โหลดหน้าปุ่ม “การจองด้วยตนเอง” (“นำเข้าการยืนยันการจอง”) ใช้อัปโหลดใบยืนยันให้ TREK อ่านให้อัตโนมัติ รองรับ EML, PDF, PKPass, HTML หรือ TXT ครั้งละไม่เกินห้าไฟล์ ไฟล์ละไม่เกิน 10 MB และรองรับรูปถ่ายเมื่อโมเดล AI อ่านรูปภาพได้ ไอคอนนี้จะมีเฉพาะเมื่อเซิร์ฟเวอร์อ่านไฟล์เหล่านี้ได้',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -2939,7 +2939,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'กด “การจองด้วยตนเอง” ที่ปลายขวาของแถบ “การจองใหม่” จะเปิดขึ้น โดยมีชื่อและป้ายสองอันอยู่ในส่วนหัวด้านบน',
|
||||
'help.guide.create-booking.step.2':
|
||||
'กดป้ายประเภทในแถบด้านบน ซึ่งเขียนว่า “อื่นๆ” ในการจองใหม่ แล้วเลือก “ประเภทการจอง” แท็บนี้สร้างได้หกประเภท: “ที่พัก” “ร้านอาหาร” “เหตุการณ์” “ทัวร์” “ที่จอดรถ” และ “อื่นๆ” ฟอร์มจะเปลี่ยนตามที่เลือก: เฉพาะ “ที่พัก” ที่ใช้ช่วงวันแทนวันที่เดียว',
|
||||
'กดป้ายประเภทในแถบด้านบน ซึ่งเขียนว่า “อื่นๆ” ในการจองใหม่ แล้วเลือก “ประเภทการจอง” แท็บนี้สร้างได้หกประเภท: “ที่พัก” “ร้านอาหาร” “เหตุการณ์” “ทัวร์พร้อมไกด์” “ที่จอดรถ” และ “อื่นๆ” ฟอร์มจะเปลี่ยนตามที่เลือก: เฉพาะ “ที่พัก” ที่ใช้ช่วงวันแทนวันที่เดียว',
|
||||
'help.guide.create-booking.step.3':
|
||||
'พิมพ์ชื่อในแถบด้านบน ซึ่งเป็นช่องเหนือป้าย นี่เป็นช่องเดียวที่ต้องกรอก และปุ่ม “เพิ่ม” จะเป็นสีเทาจนกว่าคุณจะพิมพ์อะไรลงไป',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -62,7 +62,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'รถ',
|
||||
'reservations.type.cruise': 'ล่องเรือ',
|
||||
'reservations.type.event': 'เหตุการณ์',
|
||||
'reservations.type.tour': 'ทัวร์',
|
||||
'reservations.type.tour': 'ทัวร์พร้อมไกด์',
|
||||
'reservations.type.parking': 'ที่จอดรถ',
|
||||
'reservations.type.other': 'อื่นๆ',
|
||||
'reservations.type.bus': 'รถบัส',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'มุมมองการเพิ่ม',
|
||||
'tours.title': 'ทัวร์',
|
||||
'tours.empty.title': 'ยังไม่มีทัวร์',
|
||||
'tours.empty.body': 'วางแผนทัวร์หรือนำเข้าไฟล์ GPX หรือ KML เพื่อเริ่มต้น',
|
||||
'tours.empty.body':
|
||||
'วางแผนทัวร์หรือนำเข้าไฟล์ GPX หรือ KML เพื่อเริ่มต้น จองทัวร์พร้อมไกด์ไว้แล้วใช่ไหม? ให้เพิ่มไว้ในการจอง',
|
||||
'tours.addToDay': 'เพิ่มไปยังวัน',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'นำเข้าจาก GPX',
|
||||
|
||||
@@ -3393,7 +3393,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Bu sekmede seyahat için ayrılan her şey var; ulaşım hariç: konaklamalar, masalar, biletler, turlar ve otopark. Her rezervasyon bir kart, bir liste satırı ya da zaman çizelgesinde bir çubuktur; kodu, belgeleri, yolcuları ve maliyeti de içerir. Ayrıntıları açmak için bir rezervasyona tıklayın.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'Çubuğun sağ ucundaki “Manuel Rezervasyon”, “Yeni Rezervasyon” formunu açar. Altı tür rezervasyon oluşturur: Konaklama, Restoran, Etkinlik, Tur, Otopark ve Diğer. Uçuşlar, trenler ve diğer ulaşım “Ulaşım” sekmesindedir ve burada hiç görünmez.',
|
||||
'Çubuğun sağ ucundaki “Manuel Rezervasyon”, “Yeni Rezervasyon” formunu açar. Altı tür rezervasyon oluşturur: Konaklama, Restoran, Etkinlik, Rehberli tur, Otopark ve Diğer. Uçuşlar, trenler ve diğer ulaşım “Ulaşım” sekmesindedir ve burada hiç görünmez.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
"Manuel Rezervasyon'un önündeki indirme simgesi (Rezervasyon onaylarını içe aktar), TREK'in otomatik okuyabilmesi için onayları yükler: EML, PDF, PKPass, HTML ya da TXT; en fazla 10 MB'lık beş dosya, yapay zeka modeli resim okuyabiliyorsa fotoğraflar da. Simge yalnızca sunucu bunları okuyabiliyorsa görünür.",
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3435,7 +3435,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Çubuğun sağ ucundaki “Manuel Rezervasyon” düğmesine tıklayın. “Yeni Rezervasyon” açılır, üstteki başlıkta başlık alanı ve iki rozet bulunur.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Üstteki bandda, yeni rezervasyonda “Diğer” yazan tür etiketine tıklayın ve “Rezervasyon Türü”nü seçin. Bu sekme altı tür oluşturur: Konaklama, Restoran, Etkinlik, Tur, Otopark ve Diğer. Form seçiminize göre değişir: yalnızca Konaklama, tarihler yerine bir gün aralığı kullanır.',
|
||||
'Üstteki bandda, yeni rezervasyonda “Diğer” yazan tür etiketine tıklayın ve “Rezervasyon Türü”nü seçin. Bu sekme altı tür oluşturur: Konaklama, Restoran, Etkinlik, Rehberli tur, Otopark ve Diğer. Form seçiminize göre değişir: yalnızca Konaklama, tarihler yerine bir gün aralığı kullanır.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Başlığı üstteki banda, rozetlerin üzerindeki alana yazın. Zorunlu tek alan budur ve bir şey yazana kadar “Ekle” gri kalır.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -61,7 +61,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Araba',
|
||||
'reservations.type.cruise': 'Dolaşmak',
|
||||
'reservations.type.event': 'Etkinlik',
|
||||
'reservations.type.tour': 'Tur',
|
||||
'reservations.type.tour': 'Rehberli tur',
|
||||
'reservations.type.parking': 'Otopark',
|
||||
'reservations.type.other': 'Diğer',
|
||||
'reservations.type.bus': 'Otobüs',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Ekleme görünümü',
|
||||
'tours.title': 'Turlar',
|
||||
'tours.empty.title': 'Henüz tur yok',
|
||||
'tours.empty.body': 'Başlamak için bir tur planlayın veya GPX ya da KML dosyası içe aktarın.',
|
||||
'tours.empty.body':
|
||||
'Başlamak için bir tur planlayın veya GPX ya da KML dosyası içe aktarın. Rehberli bir tur mu ayırttınız? Onun yeri Rezervasyonlar bölümü.',
|
||||
'tours.addToDay': 'Güne ekle',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX içe aktarımı',
|
||||
|
||||
@@ -3415,7 +3415,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'На цій вкладці зібрано все, що заброньовано для поїздки, крім транспорту: проживання, столики, квитки, екскурсії та паркування. Кожне бронювання це картка, рядок списку або смуга на хронології з кодом, документами, мандрівниками та вартістю. Клацніть бронювання, щоб відкрити подробиці.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'«Ручне бронювання» в правому кінці панелі відкриває «Нове бронювання». Воно створює шість видів бронювань: «Проживання», «Ресторан», «Заходи», «Екскурсія», «Паркування» та «Інше». Перельоти, потяги й інший транспорт належать до вкладки «Транспорт» і тут ніколи не з’являються.',
|
||||
'«Ручне бронювання» в правому кінці панелі відкриває «Нове бронювання». Воно створює шість видів бронювань: «Проживання», «Ресторан», «Заходи», «Екскурсія з гідом», «Паркування» та «Інше». Перельоти, потяги й інший транспорт належать до вкладки «Транспорт» і тут ніколи не з’являються.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Значок завантаження перед «Ручне бронювання», «Імпорт підтверджень бронювання», завантажує підтвердження, щоб TREK прочитав їх автоматично: EML, PDF, PKPass, HTML або TXT, не більше п’яти файлів по 10 МБ, а також фото, якщо ШІ-модель читає зображення. Значок є, лише коли сервер може їх прочитати.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3456,7 +3456,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Натисніть «Ручне бронювання» на правому краї панелі. Відкриється «Нове бронювання» з назвою та двома позначками в шапці вгорі.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Натисніть мітку типу у верхній смузі, на новому бронюванні там написано «Інше», і виберіть «Тип бронювання». Ця вкладка створює шість типів: «Проживання», «Ресторан», «Заходи», «Екскурсія», «Паркування» та «Інше». Форма змінюється залежно від вибору: лише «Проживання» використовує діапазон днів замість дат.',
|
||||
'Натисніть мітку типу у верхній смузі, на новому бронюванні там написано «Інше», і виберіть «Тип бронювання». Ця вкладка створює шість типів: «Проживання», «Ресторан», «Заходи», «Екскурсія з гідом», «Паркування» та «Інше». Форма змінюється залежно від вибору: лише «Проживання» використовує діапазон днів замість дат.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Введіть назву у верхню смугу, у поле над позначками. Це єдине обов’язкове поле, і «Додати» неактивна, доки ви нічого не введете.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Автомобіль',
|
||||
'reservations.type.cruise': 'Круїз',
|
||||
'reservations.type.event': 'Заходи',
|
||||
'reservations.type.tour': 'Екскурсія',
|
||||
'reservations.type.tour': 'Екскурсія з гідом',
|
||||
'reservations.type.parking': 'Паркування',
|
||||
'reservations.type.other': 'Інше',
|
||||
'reservations.type.bus': 'Автобус',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Режим додавання',
|
||||
'tours.title': 'Тури',
|
||||
'tours.empty.title': 'Турів поки немає',
|
||||
'tours.empty.body': 'Для початку сплануйте тур або імпортуйте файл GPX чи KML.',
|
||||
'tours.empty.body':
|
||||
'Для початку сплануйте тур або імпортуйте файл GPX чи KML. Забронювали екскурсію з гідом? Її місце в розділі «Бронювання».',
|
||||
'tours.addToDay': 'Додати до дня',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Імпорт GPX',
|
||||
|
||||
@@ -3374,7 +3374,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'Tab này chứa mọi thứ đã đặt cho chuyến đi, trừ phương tiện di chuyển: chỗ ở, bàn ăn, vé, tour và bãi đỗ xe. Mỗi đặt chỗ là một thẻ, một hàng trong danh sách hoặc một thanh trên dòng thời gian, kèm mã, tài liệu, người đi và chi phí. Nhấn vào một đặt chỗ để mở chi tiết.',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'“Thêm đặt chỗ” ở đầu bên phải của thanh mở “Đặt chỗ mới”. Nút này tạo sáu loại đặt chỗ: “Chỗ ở”, “Nhà hàng”, “Sự kiện”, “Chuyến du lịch”, “Bãi đỗ xe” và “Khác”. Chuyến bay, tàu hỏa và các phương tiện khác nằm ở tab “Di chuyển” và không bao giờ hiện ở đây.',
|
||||
'“Thêm đặt chỗ” ở đầu bên phải của thanh mở “Đặt chỗ mới”. Nút này tạo sáu loại đặt chỗ: “Chỗ ở”, “Nhà hàng”, “Sự kiện”, “Tour có hướng dẫn viên”, “Bãi đỗ xe” và “Khác”. Chuyến bay, tàu hỏa và các phương tiện khác nằm ở tab “Di chuyển” và không bao giờ hiện ở đây.',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'Biểu tượng tải xuống trước “Thêm đặt chỗ”, “Nhập xác nhận đặt chỗ”, tải xác nhận lên để TREK tự đọc: EML, PDF, PKPass, HTML hoặc TXT, tối đa năm tệp, mỗi tệp 10 MB, và cả ảnh nếu mô hình AI đọc được ảnh. Biểu tượng chỉ có khi máy chủ đọc được chúng.',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -3416,7 +3416,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'Bấm “Thêm đặt chỗ” ở cuối bên phải của thanh. “Đặt chỗ mới” mở ra, với tiêu đề và hai nhãn ở phần đầu.',
|
||||
'help.guide.create-booking.step.2':
|
||||
'Bấm vào nhãn loại ở phần đầu, nhãn này ghi “Khác” với đặt chỗ mới, rồi chọn “Loại đặt chỗ”. Tab này tạo được sáu loại: “Chỗ ở”, “Nhà hàng”, “Sự kiện”, “Chuyến du lịch”, “Bãi đỗ xe” và “Khác”. Biểu mẫu thay đổi theo lựa chọn của bạn: chỉ “Chỗ ở” dùng một khoảng các ngày thay cho ngày đơn.',
|
||||
'Bấm vào nhãn loại ở phần đầu, nhãn này ghi “Khác” với đặt chỗ mới, rồi chọn “Loại đặt chỗ”. Tab này tạo được sáu loại: “Chỗ ở”, “Nhà hàng”, “Sự kiện”, “Tour có hướng dẫn viên”, “Bãi đỗ xe” và “Khác”. Biểu mẫu thay đổi theo lựa chọn của bạn: chỉ “Chỗ ở” dùng một khoảng các ngày thay cho ngày đơn.',
|
||||
'help.guide.create-booking.step.3':
|
||||
'Gõ tiêu đề vào phần đầu, ô nằm phía trên các nhãn. Đây là trường duy nhất bắt buộc, và nút “Thêm” vẫn bị làm mờ cho đến khi bạn nhập gì đó.',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -61,7 +61,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': 'Xe hơi',
|
||||
'reservations.type.cruise': 'Du thuyền',
|
||||
'reservations.type.event': 'Sự kiện',
|
||||
'reservations.type.tour': 'Chuyến du lịch',
|
||||
'reservations.type.tour': 'Tour có hướng dẫn viên',
|
||||
'reservations.type.parking': 'Bãi đỗ xe',
|
||||
'reservations.type.other': 'Khác',
|
||||
'reservations.type.bus': 'xe buýt',
|
||||
|
||||
@@ -7,7 +7,8 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': 'Chế độ thêm',
|
||||
'tours.title': 'Chuyến tham quan',
|
||||
'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 hay KML để bắt đầu.',
|
||||
'tours.empty.body':
|
||||
'Lên kế hoạch cho một chuyến tham quan hoặc nhập tệp GPX hay KML để bắt đầu. Đã đặt tour có hướng dẫn viên? Hãy đưa vào mục Đặt chỗ.',
|
||||
'tours.addToDay': 'Thêm vào ngày',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'Nhập từ GPX',
|
||||
|
||||
@@ -2934,7 +2934,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'這個分頁收錄旅行中除了交通以外的所有預訂:住宿、餐廳訂位、票券、旅遊團和停車。每筆預訂可以是一張卡片、清單中的一列,或是時間線上的一條橫條,並附有預訂碼、文件、旅客和費用。點選預訂即可開啟詳細資料。',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'工具列右端的「手動新增」會開啟「新建預訂」。它可以建立六種預訂:「住宿」、「餐廳」、「活動」、「旅遊團」、「停車」和「其他」。航班、火車和其他交通請到「交通」分頁,不會出現在這裡。',
|
||||
'工具列右端的「手動新增」會開啟「新建預訂」。它可以建立六種預訂:「住宿」、「餐廳」、「活動」、「導覽行程」、「停車」和「其他」。航班、火車和其他交通請到「交通」分頁,不會出現在這裡。',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'「手動新增」前面的下載圖示「匯入訂位確認」會把確認信交給解析器:EML、PDF、PKPass、HTML 或 TXT,最多五個檔案,每個最大 10 MB,AI 模型可讀取圖片時也支援照片。只有在伺服器能讀取它們時才會有這個圖示。',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -2974,7 +2974,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.step.1':
|
||||
'點選工具列右端的「手動新增」。「新建預訂」會開啟,頂部的標題列有標題和兩個標籤。',
|
||||
'help.guide.create-booking.step.2':
|
||||
'點選頂部標題區的類型標籤(新預訂上顯示「其他」),然後選擇「預訂型別」。這個分頁可以建立六種類型:「住宿」「餐廳」「活動」「旅遊團」「停車」和「其他」。表單會隨你的選擇而改變:只有「住宿」使用日期範圍,而不是單一日期。',
|
||||
'點選頂部標題區的類型標籤(新預訂上顯示「其他」),然後選擇「預訂型別」。這個分頁可以建立六種類型:「住宿」「餐廳」「活動」「導覽行程」「停車」和「其他」。表單會隨你的選擇而改變:只有「住宿」使用日期範圍,而不是單一日期。',
|
||||
'help.guide.create-booking.step.3':
|
||||
'在頂部標題區、標籤上方的欄位輸入標題。這是唯一必填的欄位,在你輸入內容之前,「新增」會保持灰色。',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': '汽車',
|
||||
'reservations.type.cruise': '郵輪',
|
||||
'reservations.type.event': '活動',
|
||||
'reservations.type.tour': '旅遊團',
|
||||
'reservations.type.tour': '導覽行程',
|
||||
'reservations.type.parking': '停車',
|
||||
'reservations.type.other': '其他',
|
||||
'reservations.type.bus': '公車',
|
||||
|
||||
@@ -7,7 +7,7 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': '新增檢視',
|
||||
'tours.title': '遊程',
|
||||
'tours.empty.title': '尚無遊程',
|
||||
'tours.empty.body': '規劃遊程或匯入 GPX 或 KML 檔案,即可開始。',
|
||||
'tours.empty.body': '規劃遊程或匯入 GPX 或 KML 檔案,即可開始。已預訂導覽行程?請放在「預訂」裡。',
|
||||
'tours.addToDay': '加入某一天',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX 匯入',
|
||||
|
||||
@@ -2908,7 +2908,7 @@ const help: TranslationStrings = {
|
||||
'help.ctx.trip-bookings.summary':
|
||||
'这个标签页包含旅行中除交通外的所有预订:住宿、餐位、门票、旅游团和停车。每条预订都是一张卡片、列表中的一行或时间线上的一条横条,带有预订码、文档、同行人和费用。点击预订即可打开详情。',
|
||||
'help.ctx.trip-bookings.bullet.1':
|
||||
'栏右端的“手动添加”会打开“新建预订”。可以创建六种预订:“住宿”“餐厅”“活动”“旅游团”“停车”和“其他”。航班、火车和其他交通都在“交通”标签页,不会出现在这里。',
|
||||
'栏右端的“手动添加”会打开“新建预订”。可以创建六种预订:“住宿”“餐厅”“活动”“导览游”“停车”和“其他”。航班、火车和其他交通都在“交通”标签页,不会出现在这里。',
|
||||
'help.ctx.trip-bookings.bullet.2':
|
||||
'“手动添加”前面的下载图标即“导入预订确认”,会上传确认文件,让 TREK 自动读取:EML、PDF、PKPass、HTML 或 TXT,最多五个文件,每个不超过 10 MB;如果 AI 模型能读取图片,还支持照片。只有服务器能读取这些文件时,才会显示这个图标。',
|
||||
'help.ctx.trip-bookings.bullet.3':
|
||||
@@ -2947,7 +2947,7 @@ const help: TranslationStrings = {
|
||||
'help.guide.create-booking.goal': '手动把餐厅、活动、旅游团、车位或其他任何内容加入旅行。',
|
||||
'help.guide.create-booking.step.1': '点击工具栏最右侧的“手动添加”。“新建预订”会打开,顶部的头部里有标题和两个标签。',
|
||||
'help.guide.create-booking.step.2':
|
||||
'点击顶部色带中的类型标签(新预订上显示“其他”),然后选择“预订类型”。这个标签页可创建六种类型:“住宿”“餐厅”“活动”“旅游团”“停车”和“其他”。表单会随你的选择而变化:只有“住宿”使用日期范围,而不是单个日期。',
|
||||
'点击顶部色带中的类型标签(新预订上显示“其他”),然后选择“预订类型”。这个标签页可创建六种类型:“住宿”“餐厅”“活动”“导览游”“停车”和“其他”。表单会随你的选择而变化:只有“住宿”使用日期范围,而不是单个日期。',
|
||||
'help.guide.create-booking.step.3':
|
||||
'在顶部色带中、标签上方的字段里输入标题。这是唯一的必填项,填写之前“添加”按钮保持灰色。',
|
||||
'help.guide.create-booking.step.4':
|
||||
|
||||
@@ -60,7 +60,7 @@ const reservations: TranslationStrings = {
|
||||
'reservations.type.car': '汽车',
|
||||
'reservations.type.cruise': '邮轮',
|
||||
'reservations.type.event': '活动',
|
||||
'reservations.type.tour': '旅游团',
|
||||
'reservations.type.tour': '导览游',
|
||||
'reservations.type.parking': '停车',
|
||||
'reservations.type.other': '其他',
|
||||
'reservations.type.bus': '公交车',
|
||||
|
||||
@@ -7,7 +7,7 @@ const tours: TranslationStrings = {
|
||||
'tours.mode.label': '添加视图',
|
||||
'tours.title': '游览',
|
||||
'tours.empty.title': '暂无游览活动',
|
||||
'tours.empty.body': '规划游览路线或导入 GPX 或 KML 文件,即可开始。',
|
||||
'tours.empty.body': '规划游览路线或导入 GPX 或 KML 文件,即可开始。已预订导览游?请放在“预订”里。',
|
||||
'tours.addToDay': '添加到某天',
|
||||
'tours.badge.wanderer': 'wanderer',
|
||||
'tours.badge.gpx': 'GPX 导入',
|
||||
|
||||
@@ -38,6 +38,7 @@ export * from './packing/packed-count';
|
||||
export * from './packing/packing-placeholder';
|
||||
export * from './todo/todo.schema';
|
||||
export * from './budget/budget.schema';
|
||||
export * from './budget/cost-category';
|
||||
export * from './budget/receipt-scan.schema';
|
||||
export * from './reservation/reservation.schema';
|
||||
export * from './reservation/reservation-types';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user