feat: quality of life sweep from the feature discussions

Small requests from the discussions, each built end to end: planner and
map (cycling mode, date first headings, clear a day, stay times per day,
off-route stops, map lock, compact unplanned markers, pending stays,
cable car, transit quick picks), places (location filter, category from
OSM, open in maps, geo: link, image from an attachment, enrichment on
file import, places near a pin, place name language, Amap first in
China), lists and costs (packed counter, inherited sharing, Markdown
to-dos, payment notes, bookings CSV, my plan PDF), sharing (unplanned
places, travel only, without photos), journey (photo zoom, drafts,
photo order, trip suggestion, day jump), atlas (region counter, region
bucket list, places per country), vacay half company holidays, studio
copy and paste plus the book's own layouts, and RESTORE_FROM_BACKUP for
a first start restore.
This commit is contained in:
Maurice
2026-09-30 23:00:12 +02:00
parent 91dfab3f4b
commit 8fd46c4c18
691 changed files with 9491 additions and 927 deletions
@@ -48,6 +48,8 @@ export const assignmentSchema = z.object({
// not a place (booking arrival / morning hotel). null = inherit the day default.
// Inert when the previous timeline element is a place.
incoming_leg_transport_mode: z.string().nullable().optional(),
// Kept on the day and on the map, but not part of the day's route (#2532).
route_excluded: z.boolean().optional(),
// The lodging booking that put this stop on the day, when one did. The day
// planner already shows that booking as its own overnight block, so it hides
// this row and leaves it to road trip mode, which is the view that needs the
@@ -113,6 +115,12 @@ export const assignmentTransportRequestSchema = z.object({
});
export type AssignmentTransportRequest = z.infer<typeof assignmentTransportRequestSchema>;
/** Take a stop out of the day's route, or put it back (#2532). */
export const assignmentRouteRequestSchema = z.object({
excluded: z.boolean(),
});
export type AssignmentRouteRequest = z.infer<typeof assignmentRouteRequestSchema>;
export const assignmentParticipantsRequestSchema = z.object({
user_ids: z.array(z.number()),
});
+16
View File
@@ -33,6 +33,22 @@ describe('markRegionRequestSchema', () => {
});
describe('createBucketItemRequestSchema', () => {
it('accepts a region of the item country and refuses any other (#1901)', () => {
expect(
createBucketItemRequestSchema.safeParse({ name: 'Bayern', country_code: 'DE', region_code: 'DE-BY' }).success,
).toBe(true);
expect(
createBucketItemRequestSchema.safeParse({ name: 'Bayern', country_code: 'de', region_code: 'de-by' }).success,
).toBe(true);
expect(
createBucketItemRequestSchema.safeParse({ name: 'Berlin', country_code: 'FR', region_code: 'DE-BE' }).success,
).toBe(false);
expect(createBucketItemRequestSchema.safeParse({ name: 'Berlin', region_code: 'DE-BE' }).success).toBe(false);
expect(
createBucketItemRequestSchema.safeParse({ name: 'X', country_code: 'DE', region_code: 'not a code' }).success,
).toBe(false);
});
it('requires a name; coordinates and metadata optional/nullable', () => {
expect(createBucketItemRequestSchema.safeParse({ name: 'Tokyo' }).success).toBe(true);
expect(
+23 -8
View File
@@ -21,14 +21,29 @@ export const markRegionRequestSchema = z.object({
});
export type MarkRegionRequest = z.infer<typeof markRegionRequestSchema>;
export const createBucketItemRequestSchema = z.object({
name: z.string().min(1),
lat: z.number().nullable().optional(),
lng: z.number().nullable().optional(),
country_code: z.string().nullable().optional(),
notes: z.string().nullable().optional(),
target_date: z.string().nullable().optional(),
});
export const createBucketItemRequestSchema = z
.object({
name: z.string().min(1),
lat: z.number().nullable().optional(),
lng: z.number().nullable().optional(),
country_code: z.string().nullable().optional(),
notes: z.string().nullable().optional(),
target_date: z.string().nullable().optional(),
// A state or province wished for (#1901), ISO 3166-2 like "DE-BY". It belongs to
// the item's country, so it comes with one and starts with it.
region_code: z
.string()
.max(12)
.regex(/^[A-Za-z]{2}-[A-Za-z0-9]{1,8}$/)
.nullable()
.optional(),
})
.refine(
(b) =>
!b.region_code ||
(!!b.country_code && b.region_code.toUpperCase().startsWith(`${b.country_code.toUpperCase()}-`)),
{ message: 'region_code must belong to country_code', path: ['region_code'] },
);
export type CreateBucketItemRequest = z.infer<typeof createBucketItemRequestSchema>;
export const updateBucketItemRequestSchema = z.object({
+35
View File
@@ -1,5 +1,7 @@
import {
MAX_BOOK_LAYOUTS,
MAX_SPREAD_ELEMENTS,
bookLayoutSchema,
bookBadgeElementSchema,
bookIconElementSchema,
bookSpreadSchema,
@@ -153,6 +155,39 @@ describe('the figures a stats element carries', () => {
});
});
describe('the layouts a book keeps (#2316)', () => {
const layout = (over: Record<string, unknown> = {}) => ({
id: 'l1', name: 'Two up', pageWidth: 210, pageHeight: 210, elements: [text({ id: 'a' })], ...over,
});
it('is optional, so a document from before reads unchanged', () => {
expect(normalizeBookDocument(doc([text()])).layouts).toBeUndefined();
});
it('reads a layout back with its defaults', () => {
const out = normalizeBookDocument({ ...doc([]), layouts: [layout()] });
expect(out.layouts).toEqual([
expect.objectContaining({ id: 'l1', name: 'Two up', role: 'inner', background: null }),
]);
});
it('drops a layout it cannot read and keeps the book and the others', () => {
const out = normalizeBookDocument({
...doc([text({ id: 'kept' })]),
layouts: [layout({ id: 'bad', name: '' }), layout({ id: 'good' })],
});
expect(out.spreads[0]!.elements.map((el) => el.id)).toEqual(['kept']);
expect(out.layouts!.map((l) => l.id)).toEqual(['good']);
});
it('refuses more layouts than the cap in one parse, and keeps the first ones on salvage', () => {
const many = Array.from({ length: MAX_BOOK_LAYOUTS + 2 }, (_, i) => layout({ id: `l${i}` }));
expect(bookLayoutSchema.array().max(MAX_BOOK_LAYOUTS).safeParse(many).success).toBe(false);
const out = normalizeBookDocument({ ...doc([unreadable]), layouts: many });
expect(out.layouts).toHaveLength(MAX_BOOK_LAYOUTS);
});
});
describe('normalizeBookDocument', () => {
it('keeps the nine elements it can read when the tenth is from another version', () => {
const nine = Array.from({ length: 9 }, (_, i) => text({ id: `t${i + 1}`, text: `line ${i + 1}` }));
+29
View File
@@ -812,12 +812,38 @@ export const bookPageSetupSchema = z.object({
});
export type BookPageSetup = z.infer<typeof bookPageSetupSchema>;
/** How many layouts a book keeps for reuse (#2316). */
export const MAX_BOOK_LAYOUTS = 24;
/**
* A spread's arrangement, kept to lay other pages out with (#2316).
*
* The design as drawn, in the millimetres of the page it was drawn on, with the
* pictures taken out: applying it to another page pours that page's photos and
* words into it, and the page size it came from scales it onto a book whose
* trim changed since. Stored in the book rather than per person, so everyone
* editing the book sees and uses the same set.
*/
export const bookLayoutSchema = z.object({
id: z.string().min(1).max(40),
name: z.string().trim().min(1).max(60),
/** Double spread or single page: a layout only fits the kind it was drawn on. */
role: z.enum(['inner', 'single']).default('inner'),
pageWidth: z.number().positive().max(2000),
pageHeight: z.number().positive().max(2000),
background: hex.nullable().default(null),
elements: z.array(bookElementSchema).max(MAX_SPREAD_ELEMENTS).default([]),
});
export type BookLayout = z.infer<typeof bookLayoutSchema>;
export const bookDocumentSchema = z.object({
/** In the document, not in a column: a format bump must not need a migration. */
version: z.literal(1).catch(1).default(1),
title: z.string().max(MAX_BOOK_TITLE).default(''),
page: bookPageSetupSchema.default(() => bookPageSetupSchema.parse({})),
spreads: z.array(bookSpreadSchema).max(MAX_SPREADS).default([]),
/** The book's own layouts (#2316). Optional so a document from before still reads. */
layouts: z.array(bookLayoutSchema).max(MAX_BOOK_LAYOUTS).optional(),
});
export type BookDocument = z.infer<typeof bookDocumentSchema>;
@@ -866,8 +892,11 @@ function withoutUnreadableElements(raw: unknown): unknown {
? list.filter(el => bookElementSchema.safeParse(el).success).slice(0, MAX_SPREAD_ELEMENTS)
: list);
const layouts = (doc as { layouts?: unknown }).layouts;
return {
...doc,
// A saved layout is a convenience: one that no longer reads is dropped, not the book.
...(Array.isArray(layouts) ? { layouts: layouts.filter(l => bookLayoutSchema.safeParse(l).success).slice(0, MAX_BOOK_LAYOUTS) } : {}),
spreads: doc.spreads.map(sp => {
if (!sp || typeof sp !== 'object') return sp;
const spread = sp as { elements?: unknown; parked?: unknown };
+6
View File
@@ -263,6 +263,8 @@ export const budgetSettlementSchema = z.object({
// vs. created_at. Null/absent on rows recorded before this column existed; the
// ledger falls back to `created_at`'s date for those.
settled_at: z.string().nullable().optional(),
// A free-text note on the payment (#2340). Null when none was written.
note: z.string().nullable().optional(),
created_by_user_id: z.number().nullable().optional(),
from_username: z.string().optional(),
from_avatar_url: z.string().nullable().optional(),
@@ -280,6 +282,8 @@ export const budgetCreateSettlementRequestSchema = z.object({
// The day the transfer happened. Null when the caller sets none; the ledger then
// uses the day it was recorded, which is where every older payment already sits.
settled_at: z.string().nullable().optional(),
// A free-text note on the payment (#2340); blank stores none.
note: z.string().max(500).nullable().optional(),
// Rates to freeze `currency` with when the server has none of its own.
fallback_fx: budgetFallbackFxSchema.optional(),
});
@@ -292,6 +296,8 @@ export const budgetUpdateSettlementRequestSchema = z.object({
amount: z.number(),
currency: z.string().nullable().optional(),
settled_at: z.string().nullable().optional(),
// Omitted leaves the note as it is; null or blank clears it (#2340).
note: z.string().max(500).nullable().optional(),
fallback_fx: budgetFallbackFxSchema.optional(),
});
export type BudgetUpdateSettlementRequest = z.infer<typeof budgetUpdateSettlementRequestSchema>;
+4
View File
@@ -5,6 +5,9 @@ const atlas: TranslationStrings = {
'atlas.countries': 'الدول',
'atlas.trips': 'الرحلات',
'atlas.places': 'الأماكن',
'atlas.placesShow': 'عرض الأماكن في هذا البلد',
'atlas.placesSearch': 'البحث عن أماكن',
'atlas.placesNone': 'لا يوجد مكان مطابق',
'atlas.unmark': 'إزالة',
'atlas.confirmMark': 'تعيين هذا البلد كمُزار؟',
'atlas.confirmUnmark': 'إزالة هذا البلد من قائمة المُزارة؟',
@@ -33,6 +36,7 @@ const atlas: TranslationStrings = {
'atlas.days': 'الأيام',
'atlas.visitedCountries': 'الدول التي تمت زيارتها',
'atlas.cities': 'المدن',
'atlas.regions': 'المناطق',
'atlas.noData': 'لا توجد بيانات سفر بعد',
'atlas.noDataHint': 'أنشئ رحلة وأضف أماكن لرؤية خريطتك العالمية',
'atlas.nextTrip': 'الرحلة القادمة',
+1
View File
@@ -108,6 +108,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'مثل: عشاء، هدايا تذكارية، وقود…',
'costs.note': 'ملاحظة',
'costs.notePlaceholder': 'ما الذي شملته، ومن يدين بماذا…',
'costs.paymentNotePlaceholder': 'دُفع نقدًا، بتحويل بنكي…',
'costs.addNote': 'إضافة ملاحظة',
'costs.showNote': 'عرض الملاحظة',
'costs.hideNote': 'إخفاء الملاحظة',
+9
View File
@@ -59,6 +59,8 @@ const dayplan: TranslationStrings = {
'dayplan.confirmed': 'مؤكد',
'dayplan.pendingRes': 'قيد الانتظار',
'dayplan.pdfTooltip': 'تصدير خطة اليوم بصيغة PDF',
'dayplan.pdfMine': 'خطتي بصيغة PDF',
'dayplan.pdfMineSub': 'الأنشطة والحجوزات التي تشارك فيها فقط',
'dayplan.gpxTooltip': 'تصدير كملف GPX للخرائط دون اتصال وأجهزة GPS',
'dayplan.gpxAll': 'الرحلة كاملة',
'dayplan.gpxPlaces': 'الأماكن فقط',
@@ -91,6 +93,13 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'حذف اليوم',
'dayplan.deleteDayTitle': 'حذف {day}؟',
'dayplan.deleteDayBody': 'سيُزال اليوم من الرحلة. لا يمكن التراجع عن ذلك.',
'dayplan.excludeFromRoute': 'استبعاد من المسار',
'dayplan.includeInRoute': 'إعادة إلى المسار',
'dayplan.offRoute': 'خارج المسار',
'dayplan.offRouteHint': 'يبقى في اليوم وعلى الخريطة، لكن المسار يتخطاه',
'dayplan.clearDay': 'إفراغ اليوم',
'dayplan.clearDayTitle': 'إفراغ {day}؟',
'dayplan.clearDayBody': 'ستُزال كل الأماكن من هذا اليوم. تبقى الأماكن في الرحلة، ويحتفظ اليوم بملاحظاته وحجوزاته.',
'dayplan.deleteDayEmpty': 'لا يوجد شيء مخطط لهذا اليوم.',
'dayplan.impactPlaces': 'الأماكن المخططة: {count}',
'dayplan.impactPlacesHint': 'تبقى في قائمة الأماكن.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'حجز قيد الانتظار',
'inspector.google': 'Google Maps',
'inspector.navigation': 'التنقل',
'inspector.otherMapApp': 'تطبيق خرائط آخر',
'inspector.openWith': 'الفتح باستخدام',
'inspector.openStreetMap': 'OpenStreetMap',
'inspector.website': 'فتح الموقع الإلكتروني',
+21
View File
@@ -57,6 +57,9 @@ const journey: TranslationStrings = {
'journey.title': 'Journey', // en-fallback
'journey.subtitle': 'Track your travels as they happen', // en-fallback
'journey.new': 'New Journey', // en-fallback
'journey.lightbox.zoomIn': 'تكبير',
'journey.lightbox.zoomOut': 'تصغير',
'journey.lightbox.zoomReset': 'العودة إلى الصورة كاملة',
'journey.create': 'Create', // en-fallback
'journey.titlePlaceholder': 'Where are you going?', // en-fallback
'journey.empty': 'No journeys yet', // en-fallback
@@ -127,6 +130,8 @@ const journey: TranslationStrings = {
'journey.detail.addEntry': 'Add Entry', // en-fallback
'journey.detail.jumpToTop': 'العودة إلى الأعلى',
'journey.detail.jumpToLast': 'الانتقال إلى آخر مدخل',
'journey.detail.dayJump': 'الانتقال إلى يوم',
'journey.detail.dayJumpCount': 'الأيام: {count}',
'journey.detail.newEntry': 'New Entry', // en-fallback
'journey.detail.editEntry': 'Edit Entry', // en-fallback
'journey.detail.noEntries': 'No entries yet', // en-fallback
@@ -431,6 +436,17 @@ const journey: TranslationStrings = {
'journey.studio.kind.list': 'قائمة',
'journey.studio.kind.icon': 'أيقونة',
'journey.studio.duplicate': 'تكرار',
'journey.studio.copyToPage': 'نسخ للصق في أي صفحة (Ctrl+C)',
'journey.studio.paste': 'لصق (Ctrl+V)',
'journey.studio.pasteEmpty': 'انسخ شيئًا أولًا، ثم الصقه في أي صفحة',
'journey.studio.myLayouts': 'تخطيطاتي',
'journey.studio.myLayoutsEmpty': 'احتفظ بصفحة رتّبتها، ورتّب صفحات أخرى بالطريقة نفسها. تبقى صورها ونصوصها كما هي.',
'journey.studio.saveLayout': 'حفظ هذه الصفحة كتخطيط',
'journey.studio.saveLayoutHint': 'يحتفظ بالترتيب دون الصور، لكل محرري هذا الكتاب',
'journey.studio.saveLayoutFull': 'يحتفظ هذا الكتاب بما يصل إلى 24 تخطيطًا. احذف واحدًا لحفظ آخر.',
'journey.studio.deleteLayout': 'حذف التخطيط',
'journey.studio.layoutName': 'تخطيط',
'journey.studio.builtInLayouts': 'مدمجة',
'journey.studio.style': 'النمط',
'journey.studio.shows': 'المعروض',
'journey.studio.size': 'الحجم',
@@ -623,6 +639,11 @@ const journey: TranslationStrings = {
'journey.editor.statsExcludedHint':
'تبقى المحطة في اليوميات لكنها لا تُحتسب ضمن المسافة أو الدول أو الخريطة في Studio.',
'journey.entry.offRoute': 'خارج المسار',
'journey.entry.draft': 'مسودة',
'journey.editor.draft': 'مسودة',
'journey.editor.draftHint': 'لا يرى هذا المدخل سواك وسوى المساهمين الآخرين. تستبعده اليوميات المشتركة حتى توقف هذا الخيار.',
'journey.editor.tripSuggestionHint': 'يقع هذا اليوم ضمن هذه الرحلة. اربطه لتنضم أماكنها إلى هذه اليوميات.',
'journey.editor.tripSuggestionLater': 'ليس الآن',
'journey.suggestions.dismiss': 'تجاهل هذا الاقتراح',
'journey.suggestions.dismissed': 'تم تجاهل الاقتراح',
'journey.suggestions.restore': 'استعادة الاقتراحات المتجاهَلة',
+2
View File
@@ -24,6 +24,8 @@ const map: TranslationStrings = {
'map.location.unavailable': 'تعذر تحديد موقعك.',
'map.location.timeout': 'استغرق تحديد موقعك وقتًا طويلًا. حاول مرة أخرى تحت سماء مكشوفة.',
'map.overview.show': 'عرض الرحلة كاملة',
'map.lock.lock': 'قفل عرض الخريطة',
'map.lock.unlock': 'دع الخريطة تتبع التحديد',
'map.overview.hide': 'إخفاء الرحلة كاملة',
'map.overview.total': 'المسافة الإجمالية',
'map.attribution': 'مصادر الخريطة',
+1
View File
@@ -35,6 +35,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.onMap': 'على الخريطة',
'mobileTrip.profileDriving': 'بالسيارة',
'mobileTrip.profileWalking': 'سيرًا على الأقدام',
'mobileTrip.profileCycling': 'بالدراجة',
'mobileTrip.renameDay': 'إعادة تسمية اليوم',
'mobileTrip.resBadge': 'حجز',
'mobileTrip.showOnMap': 'إظهار على الخريطة',
+3
View File
@@ -9,6 +9,9 @@ const packing: TranslationStrings = {
'packing.editItem': 'تعديل العنصر',
'packing.itemName': 'الاسم',
'packing.itemQuantity': 'الكمية',
'packing.packedCount': 'تم حزم {packed} من {total}',
'packing.packedMore': 'حزم قطعة أخرى',
'packing.packedLess': 'حزم قطعة أقل',
'packing.itemWeight': 'الوزن (غ)',
'packing.title': 'قائمة التجهيز',
'packing.empty': 'قائمة التجهيز فارغة',
+10
View File
@@ -52,6 +52,8 @@ const places: TranslationStrings = {
'places.dayScopedClear': 'عرض الرحلة كاملة',
'places.filterTracks': 'المسارات',
'places.filterByRating': 'تصفية حسب التقييم',
'places.filterByLocation': 'تصفية حسب البلد أو المنطقة',
'places.allLocations': 'كل الدول',
'places.filterShow': 'عرض',
'places.clearSearch': 'مسح البحث',
'places.yourRating': 'تقييمك',
@@ -78,6 +80,7 @@ const places: TranslationStrings = {
'places.formCategory': 'الفئة',
'places.noCategory': 'بلا فئة',
'places.newCategory': 'فئة جديدة',
'places.openInMaps': 'فتح في الخرائط',
'places.categoryNamePlaceholder': 'اسم الفئة',
'places.formTime': 'الوقت',
'places.startTime': 'البداية',
@@ -94,6 +97,8 @@ const places: TranslationStrings = {
'places.mapsSearchPlaceholder': 'ابحث عن أماكن...',
'places.mapsSearchError': 'فشل البحث عن المكان.',
'places.searchGoogleInstead': 'ليس المكان الصحيح؟ ابحث في Google بدلًا من ذلك',
'places.nearby': 'أماكن قريبة من هذه العلامة',
'places.nearbyNone': 'لم يُعثر على شيء قرب هذه العلامة',
'places.loadingDetails': 'جارٍ تحميل تفاصيل المكان…',
'places.osmHint':
'يتم البحث عبر OpenStreetMap (بدون صور أو ساعات عمل أو تقييمات). أضف مفتاح Google API في الإعدادات للحصول على جميع التفاصيل.',
@@ -132,9 +137,14 @@ const places: TranslationStrings = {
'places.enrichOnImport': 'إثراء الأماكن عبر Google',
'places.enrichOnImportHint':
'يبحث عن كل مكان مستورد لإضافة الصور والعنوان وبيانات الاتصال. يتطلب مفتاح خرائط Google.',
'places.enrichOnImportFileHint':
'يبحث بعد الاستيراد عن كل نقطة مستوردة في Google ويضيف صورتها وعنوانها وموقعها الإلكتروني ورقم هاتفها. تبقى المسارات والخطوط كما هي.',
'places.uploadImage': 'رفع صورة',
'places.changeImage': 'تغيير الصورة',
'places.removeImage': 'إزالة الصورة',
'places.chooseImage': 'اختر صورة',
'places.uploadFromDevice': 'رفع من الجهاز',
'places.fromAttachedFiles': 'من الملفات المرفقة',
'places.imageUploadError': 'تعذّر رفع الصورة',
'places.imageRemoveError': 'تعذّر إزالة الصورة',
};
+11
View File
@@ -61,6 +61,7 @@ const reservations: TranslationStrings = {
'reservations.type.other': 'أخرى',
'reservations.type.bus': 'حافلة',
'reservations.type.ferry': 'عبّارة',
'reservations.type.cable_car': 'تلفريك',
'reservations.type.bicycle': 'دراجة',
'reservations.type.taxi': 'سيارة أجرة',
'reservations.type.transit': 'النقل العام',
@@ -194,6 +195,16 @@ const reservations: TranslationStrings = {
'reservations.resetFilters': 'إعادة ضبط عوامل التصفية',
'reservations.noMatches': 'لا شيء يطابق عوامل التصفية هذه',
'reservations.viewOptions': 'خيارات العرض',
'reservations.exportCsv': 'تصدير كجدول بيانات (CSV)',
'reservations.export.type': 'النوع',
'reservations.export.title': 'العنوان',
'reservations.export.start': 'البداية',
'reservations.export.end': 'النهاية',
'reservations.export.from': 'من',
'reservations.export.to': 'إلى',
'reservations.export.location': 'الموقع',
'reservations.export.confirmation': 'رقم التأكيد',
'reservations.export.notes': 'ملاحظات',
'reservations.resetView': 'إعادة ضبط العرض',
'reservations.group.label': 'التجميع حسب',
'reservations.group.status': 'الحالة',
+7
View File
@@ -325,6 +325,9 @@ const settings: TranslationStrings = {
'settings.currencyHint':
'تُعرض المبالغ في التكاليف محوّلة إلى هذه العملة للعرض فقط — تبقى المبالغ الأصلية دون تغيير.',
'settings.currencyTrip': 'عملة الرحلة',
'settings.placeLanguage': 'أسماء الأماكن',
'settings.placeLanguageApp': 'مثل لغة التطبيق',
'settings.placeLanguageHint': 'اللغة التي يجيب بها البحث عن الأماكن والاقتراحات والعناوين. إذا لم يكن للمكان اسم بهذه اللغة، يُعرض اسمه المحلي.',
'settings.passkey.title': 'مفاتيح المرور',
'settings.passkey.description':
'سجّل الدخول بشكل أسرع وأكثر مقاومة للتصيّد باستخدام مفتاح مرور — ببصمة إصبعك أو وجهك أو رمز PIN أو مفتاح أمان مادي. تبقى كلمة المرور كنسخة احتياطية.',
@@ -468,6 +471,10 @@ const settings: TranslationStrings = {
'settings.general.languageRegion': 'Language & region',
'settings.general.travelMap': 'Travel & map',
'settings.general.startup': 'البدء',
'settings.dayDateFirst': 'التاريخ أولًا في عناوين الأيام',
'settings.compactUnplanned': 'علامات مصغّرة للأماكن غير المخطط لها',
'settings.compactUnplannedHint': 'تظهر الأماكن غير المخطط لها في أي يوم كعلامات صغيرة بلا صورة، لتبرز المحطات المخطط لها.',
'settings.dayDateFirstHint': 'ابدأ كل يوم بتاريخه في التقويم، واعرض "اليوم 1" أو عنوان اليوم الخاص بجانبه.',
'settings.startPage': 'صفحة البدء',
'settings.startPageDashboard': 'لوحة التحكم',
'settings.startPageActiveTrip': 'الرحلة النشطة',
+5
View File
@@ -12,5 +12,10 @@ const share: TranslationStrings = {
'share.permPacking': 'الأمتعة',
'share.permBudget': 'التكاليف',
'share.permCollab': 'الدردشة',
'share.options': 'خيارات',
'share.optTravelOnly': 'التنقل والإقامة فقط',
'share.optTravelOnlyHint': 'يعرض التنقل والإقامة فقط، دون الأنشطة وملاحظات الأيام والأيام الفارغة',
'share.optHideImages': 'بدون صور',
'share.optHideImagesHint': 'يستبعد صور الأماكن من الصفحة المشتركة',
};
export default share;
+1
View File
@@ -14,6 +14,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'الدردشة',
'shared.days': 'أيام',
'shared.places': 'أماكن',
'shared.unplanned': 'لم يُخطَّط بعد',
'shared.other': 'أخرى',
'shared.totalBudget': 'إجمالي التكاليف',
'shared.messages': 'رسائل',
+1
View File
@@ -11,6 +11,7 @@ const todo: TranslationStrings = {
'todo.uncategorized': 'بلا قائمة',
'todo.namePlaceholder': 'اسم المهمة',
'todo.descriptionPlaceholder': 'وصف (اختياري)',
'todo.editDescription': 'انقر للتعديل، الروابط تُفتح مباشرة',
'todo.unassigned': 'غير مُسنَد',
'todo.noCategory': 'بلا قائمة',
'todo.hasDescription': 'له وصف',
+1
View File
@@ -5,6 +5,7 @@ const undo: TranslationStrings = {
'undo.tooltip': 'تراجع: {action}',
'undo.assignPlace': 'تم تعيين المكان لليوم',
'undo.removeAssignment': 'تم إزالة المكان من اليوم',
'undo.clearDay': 'تم إفراغ اليوم',
'undo.reorder': 'تمت إعادة ترتيب الأماكن',
'undo.optimize': 'تم تحسين المسار',
'undo.deletePlace': 'تم حذف المكان',
+4
View File
@@ -5,6 +5,9 @@ const atlas: TranslationStrings = {
'atlas.countries': 'Ölkələr',
'atlas.trips': 'Səyahətlər',
'atlas.places': 'Məkanlar',
'atlas.placesShow': 'Bu ölkədəki məkanları göstər',
'atlas.placesSearch': 'Məkanları axtar',
'atlas.placesNone': 'Uyğun məkan yoxdur',
'atlas.unmark': 'Sil',
'atlas.confirmMark':
@@ -46,6 +49,7 @@ const atlas: TranslationStrings = {
'atlas.days': 'Gün',
'atlas.visitedCountries': 'Ziyarət edilmiş ölkələr',
'atlas.cities': 'Şəhərlər',
'atlas.regions': 'Regionlar',
'atlas.noData': 'Hələ səyahət məlumatı yoxdur',
'atlas.noDataHint':
'Dünya xəritənizi görmək üçün səyahət yaradın və məkanlar əlavə edin',
+1
View File
@@ -123,6 +123,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'məs. Şam yeməyi, suvenirlər, yanacaq…',
'costs.note': 'Qeyd',
'costs.notePlaceholder': 'Nələri əhatə etdiyi, kimin nə qədər qaytarmalı olduğu…',
'costs.paymentNotePlaceholder': 'Nağd ödənilib, bank köçürməsi ilə…',
'costs.addNote': 'Qeyd əlavə et',
'costs.showNote': 'Qeydi göstər',
'costs.hideNote': 'Qeydi gizlət',
+10
View File
@@ -88,6 +88,8 @@ const dayplan: TranslationStrings = {
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Günlük planı PDF kimi ixrac et',
'dayplan.pdfMine': 'Mənim planım PDF kimi',
'dayplan.pdfMineSub': 'Yalnız iştirak etdiyiniz fəaliyyətlər və rezervasiyalar',
'dayplan.gpxTooltip':
'Oflayn xəritələr və GPS cihazları üçün GPX kimi ixrac et',
'dayplan.gpxAll': 'Bütün səyahət',
@@ -117,6 +119,14 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'Günü sil',
'dayplan.deleteDayTitle': '{day} silinsin?',
'dayplan.deleteDayBody': 'Gün səyahətdən silinəcək. Bunu geri qaytarmaq mümkün deyil.',
'dayplan.excludeFromRoute': 'Marşruta daxil etmə',
'dayplan.includeInRoute': 'Yenidən marşruta əlavə et',
'dayplan.offRoute': 'Marşrutdan kənar',
'dayplan.offRouteHint': 'Gündə və xəritədə qalır, lakin marşrut onu buraxır',
'dayplan.clearDay': 'Günü təmizlə',
'dayplan.clearDayTitle': '{day} təmizlənsin?',
'dayplan.clearDayBody':
'Bütün məkanlar bu gündən çıxarılır. Məkanlar səyahətdə qalır, gün isə öz qeydlərini və rezervasiyalarını saxlayır.',
'dayplan.deleteDayEmpty': 'Bu gün üçün heç nə planlaşdırılmayıb.',
'dayplan.impactPlaces': 'Planlaşdırılmış məkanlar: {count}',
'dayplan.impactPlacesHint': 'Onlar məkanlar siyahısında qalır.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'Gözləyən rezervasiya',
'inspector.google': 'Google Maps',
'inspector.navigation': 'Naviqasiya',
'inspector.otherMapApp': 'Başqa xəritə tətbiqi',
'inspector.openWith': 'Bununla aç',
'inspector.openStreetMap': 'OpenStreetMap',
'inspector.website': 'Veb-saytı aç',
+26
View File
@@ -6,6 +6,9 @@ const journey: TranslationStrings = {
'journey.title': 'Səyahət gündəliyi',
'journey.subtitle': 'Səyahətlərinizi baş verdiyi anda qeyd edin',
'journey.new': 'Yeni səyahət gündəliyi',
'journey.lightbox.zoomIn': 'Yaxınlaşdır',
'journey.lightbox.zoomOut': 'Uzaqlaşdır',
'journey.lightbox.zoomReset': 'Tam fotoya qayıt',
'journey.create': 'Yarat',
'journey.titlePlaceholder': 'Haraya gedirsiniz?',
'journey.empty': 'Hələ səyahət gündəliyi yoxdur',
@@ -95,6 +98,8 @@ const journey: TranslationStrings = {
'journey.detail.addEntry': 'Qeyd əlavə et',
'journey.detail.jumpToTop': 'Yuxarı qayıt',
'journey.detail.jumpToLast': 'Sonuncu qeydə keç',
'journey.detail.dayJump': 'Günə keç',
'journey.detail.dayJumpCount': '{count} gün',
'journey.detail.newEntry': 'Yeni qeyd',
'journey.detail.editEntry': 'Qeydi redaktə et',
'journey.detail.noEntries': 'Hələ qeyd yoxdur',
@@ -514,6 +519,20 @@ const journey: TranslationStrings = {
'journey.studio.kind.icon': 'İkon',
'journey.studio.duplicate': 'Dublikat yarat',
'journey.studio.copyToPage': 'İstənilən səhifəyə yapışdırmaq üçün kopyala (Ctrl+C)',
'journey.studio.paste': 'Yapışdır (Ctrl+V)',
'journey.studio.pasteEmpty': 'Əvvəlcə nəyisə kopyalayın, sonra onu istənilən səhifəyə yapışdırın',
'journey.studio.myLayouts': 'Mənim tərtibatlarım',
'journey.studio.myLayoutsEmpty':
'Tərtib etdiyiniz səhifəni saxlayın və digər səhifələri eyni şəkildə düzün. Onların fotoları və mətnləri qalır.',
'journey.studio.saveLayout': 'Bu səhifəni tərtibat kimi saxla',
'journey.studio.saveLayoutHint':
'Düzülüşü fotolar olmadan saxlayır, bu kitabın bütün redaktorları üçün',
'journey.studio.saveLayoutFull':
'Bu kitab ən çox 24 tərtibat saxlayır. Yenisini saxlamaq üçün birini silin.',
'journey.studio.deleteLayout': 'Tərtibatı sil',
'journey.studio.layoutName': 'Tərtibat',
'journey.studio.builtInLayouts': 'Daxili',
'journey.studio.style': 'Üslub',
'journey.studio.shows': 'Göstərir',
'journey.studio.size': 'Ölçü',
@@ -747,6 +766,13 @@ const journey: TranslationStrings = {
'journey.editor.statsExcludedHint':
'Dayanacaq gündəlikdə qalır, lakin məsafə, ölkələr və Studiodakı xəritənin hesablanmasına daxil edilmir.',
'journey.entry.offRoute': 'Marşrutdan kənar',
'journey.entry.draft': 'Qaralama',
'journey.editor.draft': 'Qaralama',
'journey.editor.draftHint':
'Bu qeydi yalnız siz və digər iştirakçılar görür. Siz bunu söndürənə qədər paylaşılan səyahət gündəliyi onu göstərmir.',
'journey.editor.tripSuggestionHint':
'Bu gün bu səyahətə düşür. Onu əlaqələndirin və məkanları bu səyahət gündəliyinə qoşulsun.',
'journey.editor.tripSuggestionLater': 'İndi yox',
'journey.suggestions.dismiss': 'Bu təklifi bağla',
'journey.suggestions.dismissed': 'Təklif bağlandı',
+2
View File
@@ -34,6 +34,8 @@ const map: TranslationStrings = {
'Məkanınızı müəyyən etmək çox vaxt apardı. Səmanın daha açıq göründüyü yerdə yenidən cəhd edin.',
'map.overview.show': 'Bütün səyahəti göstər',
'map.lock.lock': 'Xəritə görünüşünü kilidlə',
'map.lock.unlock': 'Xəritə seçimi izləsin',
'map.overview.hide': 'Bütün səyahəti gizlət',
'map.overview.total': 'Ümumi məsafə',
'map.attribution': 'Xəritə mənbələri',
+1
View File
@@ -35,6 +35,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.onMap': 'Xəritədə',
'mobileTrip.profileDriving': 'Avtomobillə',
'mobileTrip.profileWalking': 'Piyada',
'mobileTrip.profileCycling': 'Velosipedlə',
'mobileTrip.renameDay': 'Günün adını dəyiş',
'mobileTrip.resBadge': 'Rezervasiya',
'mobileTrip.showOnMap': 'Xəritədə göstər',
+3
View File
@@ -10,6 +10,9 @@ const packing: TranslationStrings = {
'packing.editItem': 'Elementi redaktə et',
'packing.itemName': 'Ad',
'packing.itemQuantity': 'Say',
'packing.packedCount': '{total} ədəddən {packed} yığılıb',
'packing.packedMore': 'Bir ədəd çox yığ',
'packing.packedLess': 'Bir ədəd az yığ',
'packing.itemWeight': 'Çəki (qram)',
'packing.title': 'Baqaj siyahısı',
+10
View File
@@ -61,6 +61,8 @@ const places: TranslationStrings = {
'places.filterTracks': 'İzlər',
'places.filterByRating': 'Reytinqə görə filtrlə',
'places.filterByLocation': 'Ölkə və ya regiona görə filtrlə',
'places.allLocations': 'Bütün ölkələr',
'places.filterShow': 'Göstər',
'places.clearSearch': 'Axtarışı təmizlə',
'places.yourRating': 'Sizin reytinqiniz',
@@ -88,6 +90,7 @@ const places: TranslationStrings = {
'places.formCategory': 'Kateqoriya',
'places.noCategory': 'Kateqoriya yoxdur',
'places.newCategory': 'Yeni kateqoriya',
'places.openInMaps': 'Xəritələrdə aç',
'places.categoryNamePlaceholder': 'Kateqoriyanın adı',
'places.formTime': 'Vaxt',
'places.startTime': 'Başlanğıc',
@@ -104,6 +107,8 @@ const places: TranslationStrings = {
'places.mapsSearchPlaceholder': 'Məkanları axtarın...',
'places.mapsSearchError': 'Məkan axtarışı uğursuz oldu.',
'places.searchGoogleInstead': 'Axtardığınız məkan deyil? Əvəzində Google-da axtarın',
'places.nearby': 'Bu nişanın yaxınlığındakı məkanlar',
'places.nearbyNone': 'Bu nişanın yaxınlığında heç nə tapılmadı',
'places.loadingDetails': 'Məkan təfərrüatları yüklənir…',
'places.osmHint':
'OpenStreetMap axtarışından istifadə edilir (fotolar, iş saatları və reytinqlər yoxdur). Tam təfərrüatlar üçün tənzimləmələrdə Google API açarı əlavə edin.',
@@ -145,10 +150,15 @@ const places: TranslationStrings = {
'places.enrichOnImport': 'Məkan məlumatlarını Google vasitəsilə tamamla',
'places.enrichOnImportHint':
'Foto, ünvan və əlaqə məlumatlarını əlavə etmək üçün idxal edilən hər məkanı axtarır. Google Maps açarınızdan istifadə edir.',
'places.enrichOnImportFileHint':
'İdxaldan sonra hər nöqtəni Google-da axtarır və onun fotosunu, ünvanını, veb saytını və telefonunu əlavə edir. Yollar və izlər olduğu kimi qalır.',
'places.uploadImage': 'Şəkil yüklə',
'places.changeImage': 'Şəkli dəyiş',
'places.removeImage': 'Şəkli sil',
'places.chooseImage': 'Şəkil seç',
'places.uploadFromDevice': 'Cihazdan yüklə',
'places.fromAttachedFiles': 'Əlavə edilmiş fayllardan',
'places.imageUploadError': 'Şəkli yükləmək mümkün olmadı',
'places.imageRemoveError': 'Şəkli silmək mümkün olmadı',
};
+11
View File
@@ -73,6 +73,7 @@ const reservations: TranslationStrings = {
'reservations.type.other': 'Digər',
'reservations.type.bus': 'Avtobus',
'reservations.type.ferry': 'Bərə',
'reservations.type.cable_car': 'Kanat yolu',
'reservations.type.bicycle': 'Velosiped',
'reservations.type.taxi': 'Taksi',
'reservations.type.transit': 'İctimai nəqliyyat',
@@ -228,6 +229,16 @@ const reservations: TranslationStrings = {
'reservations.resetFilters': 'Filtrləri sıfırla',
'reservations.noMatches': 'Bu filtrlərə uyğun heç nə yoxdur',
'reservations.viewOptions': 'Görünüş seçimləri',
'reservations.exportCsv': 'Cədvəl kimi ixrac et (CSV)',
'reservations.export.type': 'Növ',
'reservations.export.title': 'Başlıq',
'reservations.export.start': 'Başlanğıc',
'reservations.export.end': 'Son',
'reservations.export.from': 'Haradan',
'reservations.export.to': 'Haraya',
'reservations.export.location': 'Yer',
'reservations.export.confirmation': 'Təsdiq',
'reservations.export.notes': 'Qeydlər',
'reservations.resetView': 'Görünüşü sıfırla',
'reservations.group.label': 'Qruplaşdır',
'reservations.group.status': 'Status',
+10
View File
@@ -429,6 +429,10 @@ const settings: TranslationStrings = {
'settings.currencyHint':
'Xərclər bölməsindəki məbləğlər yalnız göstərilmək üçün bu valyutaya çevrilir — ilkin məbləğlər dəyişmir.',
'settings.currencyTrip': 'Səyahət valyutası',
'settings.placeLanguage': 'Məkan adları',
'settings.placeLanguageApp': 'Tətbiqlə eyni',
'settings.placeLanguageHint':
'Məkan axtarışı, təkliflər və ünvanların göstərildiyi dil. Məkanın bu dildə adı yoxdursa, yerli adı göstərilir.',
'settings.passkey.title': 'Keçid açarları',
'settings.passkey.description':
@@ -595,6 +599,12 @@ const settings: TranslationStrings = {
'settings.general.languageRegion': 'Dil və region',
'settings.general.travelMap': 'Səyahət və xəritə',
'settings.general.startup': 'Başlanğıc',
'settings.dayDateFirst': 'Gün başlıqlarında əvvəlcə tarix',
'settings.compactUnplanned': 'Planlaşdırılmamış məkanlar üçün kiçik nişanlar',
'settings.compactUnplannedHint':
'Heç bir günə planlaşdırılmamış məkanlar fotosuz kiçik nişanlar kimi göstərilir ki, planlaşdırılmış dayanacaqlar seçilsin.',
'settings.dayDateFirstHint':
'Hər günü təqvim tarixi ilə başlayın, yanında isə "Gün 1" və ya günün öz başlığını göstərin.',
'settings.startPage': 'Başlanğıc səhifəsi',
'settings.startPageDashboard': 'İdarə paneli',
'settings.startPageActiveTrip': 'Aktiv səyahət',
+6
View File
@@ -11,5 +11,11 @@ const share: TranslationStrings = {
'share.permPacking': 'Baqaj',
'share.permBudget': 'Xərclər',
'share.permCollab': 'Çat',
'share.options': 'Seçimlər',
'share.optTravelOnly': 'Yalnız səfər və qalma yerləri',
'share.optTravelOnlyHint':
'Fəaliyyətlər, gün qeydləri və boş günlər olmadan yalnız nəqliyyat və yaşayış yerlərini göstərir',
'share.optHideImages': 'Fotosuz',
'share.optHideImagesHint': 'Məkan fotolarını paylaşılan səhifəyə daxil etmir',
};
export default share;
+1
View File
@@ -14,6 +14,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Çat',
'shared.days': 'gün',
'shared.places': 'məkan',
'shared.unplanned': 'Hələ planlaşdırılmayıb',
'shared.other': 'Digər',
'shared.totalBudget': 'Ümumi xərclər',
'shared.messages': 'mesaj',
+1
View File
@@ -11,6 +11,7 @@ const todo: TranslationStrings = {
'todo.uncategorized': 'Siyahısız',
'todo.namePlaceholder': 'Tapşırığın adı',
'todo.descriptionPlaceholder': 'Təsvir (istəyə bağlı)',
'todo.editDescription': 'Redaktə etmək üçün klikləyin, keçidlər birbaşa açılır',
'todo.unassigned': 'Təyin edilməyib',
'todo.noCategory': 'Siyahı yoxdur',
'todo.hasDescription': 'Təsviri var',
+1
View File
@@ -5,6 +5,7 @@ const undo: TranslationStrings = {
'undo.tooltip': 'Geri qaytar: {action}',
'undo.assignPlace': 'Məkan günə təyin edildi',
'undo.removeAssignment': 'Məkan gündən çıxarıldı',
'undo.clearDay': 'Gün təmizləndi',
'undo.reorder': 'Məkanlar yenidən sıralandı',
'undo.optimize': 'Marşrut optimallaşdırıldı',
'undo.deletePlace': 'Məkan silindi',
+4
View File
@@ -5,6 +5,9 @@ const atlas: TranslationStrings = {
'atlas.countries': 'Países',
'atlas.trips': 'Viagens',
'atlas.places': 'Lugares',
'atlas.placesShow': 'Mostrar os lugares deste país',
'atlas.placesSearch': 'Buscar lugares',
'atlas.placesNone': 'Nenhum lugar corresponde',
'atlas.unmark': 'Remover',
'atlas.confirmMark': 'Marcar este país como visitado?',
'atlas.confirmUnmark': 'Remover este país da lista de visitados?',
@@ -33,6 +36,7 @@ const atlas: TranslationStrings = {
'atlas.days': 'Dias',
'atlas.visitedCountries': 'Países visitados',
'atlas.cities': 'Cidades',
'atlas.regions': 'Regiões',
'atlas.noData': 'Ainda sem dados de viagem',
'atlas.noDataHint': 'Crie uma viagem e adicione lugares para ver o mapa mundial',
'atlas.nextTrip': 'Próxima viagem',
+1
View File
@@ -108,6 +108,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'ex.: jantar, lembranças, gasolina…',
'costs.note': 'Nota',
'costs.notePlaceholder': 'O que incluía, quem deve o quê…',
'costs.paymentNotePlaceholder': 'Pago em dinheiro, por transferência…',
'costs.addNote': 'Adicionar nota',
'costs.showNote': 'Mostrar nota',
'costs.hideNote': 'Ocultar nota',
+10
View File
@@ -57,6 +57,8 @@ const dayplan: TranslationStrings = {
'dayplan.exportMaps': 'Mapas e GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportar plano do dia em PDF',
'dayplan.pdfMine': 'Meu plano em PDF',
'dayplan.pdfMineSub': 'Somente as atividades e reservas de que você participa',
'dayplan.gpxTooltip': 'Exportar como GPX para mapas offline e aparelhos de GPS',
'dayplan.gpxAll': 'Viagem inteira',
'dayplan.gpxPlaces': 'Somente lugares',
@@ -92,6 +94,14 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'Excluir dia',
'dayplan.deleteDayTitle': 'Excluir {day}?',
'dayplan.deleteDayBody': 'O dia é removido da viagem. Isso não pode ser desfeito.',
'dayplan.excludeFromRoute': 'Tirar da rota',
'dayplan.includeInRoute': 'Colocar de volta na rota',
'dayplan.offRoute': 'Fora da rota',
'dayplan.offRouteHint': 'Continua no dia e no mapa, mas a rota o ignora',
'dayplan.clearDay': 'Limpar dia',
'dayplan.clearDayTitle': 'Limpar {day}?',
'dayplan.clearDayBody':
'Todos os lugares saem deste dia. Os lugares continuam na viagem, e o dia mantém suas notas e reservas.',
'dayplan.deleteDayEmpty': 'Nada está planejado para este dia.',
'dayplan.impactPlaces': 'Lugares planejados: {count}',
'dayplan.impactPlacesHint': 'Eles continuam na lista de lugares.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'Reserva pendente',
'inspector.google': 'Google Maps',
'inspector.navigation': 'Navegação',
'inspector.otherMapApp': 'Outro app de mapas',
'inspector.openWith': 'Abrir com',
'inspector.openStreetMap': 'OpenStreetMap',
'inspector.saveToCollection': 'Salvar na Coleção',
+23
View File
@@ -6,6 +6,9 @@ const journey: TranslationStrings = {
'journey.title': 'Jornada',
'journey.subtitle': 'Registre suas viagens em tempo real',
'journey.new': 'Nova jornada',
'journey.lightbox.zoomIn': 'Aproximar',
'journey.lightbox.zoomOut': 'Afastar',
'journey.lightbox.zoomReset': 'Voltar à foto inteira',
'journey.create': 'Criar',
'journey.titlePlaceholder': 'Para onde você vai?',
'journey.empty': 'Nenhuma jornada ainda',
@@ -78,6 +81,8 @@ const journey: TranslationStrings = {
'journey.detail.addEntry': 'Adicionar entrada',
'journey.detail.jumpToTop': 'Voltar ao topo',
'journey.detail.jumpToLast': 'Ir para a última entrada',
'journey.detail.dayJump': 'Ir para um dia',
'journey.detail.dayJumpCount': '{count} dias',
'journey.detail.newEntry': 'Nova entrada',
'journey.detail.editEntry': 'Editar entrada',
'journey.detail.noEntries': 'Nenhuma entrada ainda',
@@ -432,6 +437,18 @@ const journey: TranslationStrings = {
'journey.studio.kind.list': 'Lista',
'journey.studio.kind.icon': 'Ícone',
'journey.studio.duplicate': 'Duplicar',
'journey.studio.copyToPage': 'Copiar, para colar em qualquer página (Ctrl+C)',
'journey.studio.paste': 'Colar (Ctrl+V)',
'journey.studio.pasteEmpty': 'Copie algo primeiro e depois cole em qualquer página',
'journey.studio.myLayouts': 'Minhas disposições',
'journey.studio.myLayoutsEmpty':
'Guarde uma página que você organizou e disponha outras páginas do mesmo jeito. As fotos e os textos delas continuam.',
'journey.studio.saveLayout': 'Salvar esta página como disposição',
'journey.studio.saveLayoutHint': 'Guarda a disposição sem as fotos, para todos que editam este livro',
'journey.studio.saveLayoutFull': 'Este livro guarda até 24 disposições. Exclua uma para salvar outra.',
'journey.studio.deleteLayout': 'Excluir disposição',
'journey.studio.layoutName': 'Disposição',
'journey.studio.builtInLayouts': 'Prontas',
'journey.studio.style': 'Estilo',
'journey.studio.shows': 'Mostrar',
'journey.studio.size': 'Tamanho',
@@ -626,6 +643,12 @@ const journey: TranslationStrings = {
'journey.editor.statsExcludedHint':
'A parada continua no diário, mas não conta para a distância, os países nem o mapa no Studio.',
'journey.entry.offRoute': 'Fora da rota',
'journey.entry.draft': 'Rascunho',
'journey.editor.draft': 'Rascunho',
'journey.editor.draftHint':
'Só você e os outros colaboradores veem esta entrada. A jornada compartilhada a deixa de fora até você desativar isto.',
'journey.editor.tripSuggestionHint': 'Este dia cai nesta viagem. Vincule-a, e os lugares dela entram nesta jornada.',
'journey.editor.tripSuggestionLater': 'Agora não',
'journey.suggestions.dismiss': 'Descartar esta sugestão',
'journey.suggestions.dismissed': 'Sugestão descartada',
'journey.suggestions.restore': 'Trazer de volta as sugestões descartadas',
+2
View File
@@ -24,6 +24,8 @@ const map: TranslationStrings = {
'map.location.unavailable': 'Não foi possível determinar sua localização.',
'map.location.timeout': 'A localização demorou demais. Tente de novo com uma visão mais aberta do céu.',
'map.overview.show': 'Mostrar a viagem inteira',
'map.lock.lock': 'Travar a visualização do mapa',
'map.lock.unlock': 'Deixar o mapa seguir a seleção',
'map.overview.hide': 'Ocultar a viagem inteira',
'map.overview.total': 'Distância total',
'map.attribution': 'Créditos do mapa',
+1
View File
@@ -35,6 +35,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.onMap': 'No mapa',
'mobileTrip.profileDriving': 'De carro',
'mobileTrip.profileWalking': 'A pé',
'mobileTrip.profileCycling': 'De bicicleta',
'mobileTrip.renameDay': 'Renomear dia',
'mobileTrip.resBadge': 'Reserva',
'mobileTrip.showOnMap': 'Mostrar no mapa',
+3
View File
@@ -9,6 +9,9 @@ const packing: TranslationStrings = {
'packing.editItem': 'Editar item',
'packing.itemName': 'Nome',
'packing.itemQuantity': 'Quantidade',
'packing.packedCount': '{packed} de {total} na mala',
'packing.packedMore': 'Pôr mais um na mala',
'packing.packedLess': 'Tirar um da mala',
'packing.itemWeight': 'Peso (g)',
'packing.title': 'Lista de mala',
'packing.empty': 'A lista de mala está vazia',
+10
View File
@@ -52,6 +52,8 @@ const places: TranslationStrings = {
'places.dayScopedClear': 'Mostrar a viagem inteira',
'places.filterTracks': 'Trilhas',
'places.filterByRating': 'Filtrar por avaliação',
'places.filterByLocation': 'Filtrar por país ou região',
'places.allLocations': 'Todos os países',
'places.filterShow': 'Mostrar',
'places.clearSearch': 'Limpar busca',
'places.yourRating': 'Sua avaliação',
@@ -78,6 +80,7 @@ const places: TranslationStrings = {
'places.formCategory': 'Categoria',
'places.noCategory': 'Sem categoria',
'places.newCategory': 'Nova categoria',
'places.openInMaps': 'Abrir em mapas',
'places.categoryNamePlaceholder': 'Nome da categoria',
'places.formTime': 'Horário',
'places.startTime': 'Início',
@@ -94,6 +97,8 @@ const places: TranslationStrings = {
'places.mapsSearchPlaceholder': 'Buscar lugares...',
'places.mapsSearchError': 'Falha na busca de lugares.',
'places.searchGoogleInstead': 'Não é o lugar certo? Pesquisar no Google',
'places.nearby': 'Lugares perto deste marcador',
'places.nearbyNone': 'Nada encontrado perto deste marcador',
'places.loadingDetails': 'Carregando detalhes do lugar…',
'places.osmHint':
'Busca via OpenStreetMap (sem fotos, horários ou avaliações). Adicione uma chave Google nas configurações para detalhes completos.',
@@ -132,9 +137,14 @@ const places: TranslationStrings = {
'places.enrichOnImport': 'Enriquecer lugares via Google',
'places.enrichOnImportHint':
'Busca cada lugar importado para adicionar fotos, endereço e contato. Usa sua chave do Google Maps.',
'places.enrichOnImportFileHint':
'Depois pesquisa cada ponto importado no Google e adiciona foto, endereço, site e telefone. Caminhos e trilhas ficam como estão.',
'places.uploadImage': 'Enviar imagem',
'places.changeImage': 'Alterar imagem',
'places.removeImage': 'Remover imagem',
'places.chooseImage': 'Escolher uma imagem',
'places.uploadFromDevice': 'Enviar do dispositivo',
'places.fromAttachedFiles': 'Dos arquivos anexados',
'places.imageUploadError': 'Não foi possível enviar a imagem',
'places.imageRemoveError': 'Não foi possível remover a imagem',
};
+11
View File
@@ -61,6 +61,7 @@ const reservations: TranslationStrings = {
'reservations.type.other': 'Outro',
'reservations.type.bus': 'Ônibus',
'reservations.type.ferry': 'Balsa',
'reservations.type.cable_car': 'Teleférico',
'reservations.type.bicycle': 'Bicicleta',
'reservations.type.taxi': 'Táxi',
'reservations.type.transit': 'Transporte público',
@@ -194,6 +195,16 @@ const reservations: TranslationStrings = {
'reservations.resetFilters': 'Limpar filtros',
'reservations.noMatches': 'Nada corresponde a esses filtros',
'reservations.viewOptions': 'Opções de visualização',
'reservations.exportCsv': 'Exportar como planilha (CSV)',
'reservations.export.type': 'Tipo',
'reservations.export.title': 'Título',
'reservations.export.start': 'Início',
'reservations.export.end': 'Fim',
'reservations.export.from': 'De',
'reservations.export.to': 'Para',
'reservations.export.location': 'Local',
'reservations.export.confirmation': 'Confirmação',
'reservations.export.notes': 'Notas',
'reservations.resetView': 'Redefinir visualização',
'reservations.group.label': 'Agrupar por',
'reservations.group.status': 'Status',
+10
View File
@@ -339,6 +339,10 @@ const settings: TranslationStrings = {
'settings.currencyHint':
'Os valores em Custos são exibidos convertidos para esta moeda apenas para visualização — os valores originais permanecem inalterados.',
'settings.currencyTrip': 'Moeda da viagem',
'settings.placeLanguage': 'Nomes de lugares',
'settings.placeLanguageApp': 'Igual ao app',
'settings.placeLanguageHint':
'O idioma em que a busca de lugares, as sugestões e os endereços respondem. Quando um lugar não tem nome nesse idioma, o nome local é exibido.',
'settings.passkey.title': 'Passkeys',
'settings.passkey.description':
'Entre mais rápido e com proteção contra phishing usando uma passkey — sua impressão digital, rosto, PIN ou uma chave de segurança física. Sua senha continua disponível como reserva.',
@@ -484,6 +488,12 @@ const settings: TranslationStrings = {
'settings.general.languageRegion': 'Language & region',
'settings.general.travelMap': 'Travel & map',
'settings.general.startup': 'Inicialização',
'settings.dayDateFirst': 'Data primeiro nos títulos dos dias',
'settings.compactUnplanned': 'Marcadores compactos para lugares não planejados',
'settings.compactUnplannedHint':
'Lugares que não estão planejados em nenhum dia aparecem como marcadores pequenos sem foto, para que as paradas planejadas se destaquem.',
'settings.dayDateFirstHint':
'Começar cada dia com a data do calendário e mostrar "Dia 1" ou o título próprio do dia ao lado.',
'settings.startPage': 'Página inicial',
'settings.startPageDashboard': 'Painel',
'settings.startPageActiveTrip': 'Viagem ativa',
+5
View File
@@ -12,5 +12,10 @@ const share: TranslationStrings = {
'share.permPacking': 'Mala',
'share.permBudget': 'Custos',
'share.permCollab': 'Chat',
'share.options': 'Opções',
'share.optTravelOnly': 'Só transporte e hospedagem',
'share.optTravelOnlyHint': 'Mostra apenas transporte e hospedagem, sem atividades, notas do dia e dias vazios',
'share.optHideImages': 'Sem fotos',
'share.optHideImagesHint': 'Deixa as fotos dos lugares fora da página compartilhada',
};
export default share;
+1
View File
@@ -15,6 +15,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Chat',
'shared.days': 'dias',
'shared.places': 'lugares',
'shared.unplanned': 'Ainda não planejado',
'shared.other': 'Outros',
'shared.totalBudget': 'Custos totais',
'shared.messages': 'mensagens',
+1
View File
@@ -11,6 +11,7 @@ const todo: TranslationStrings = {
'todo.uncategorized': 'Sem lista',
'todo.namePlaceholder': 'Nome da tarefa',
'todo.descriptionPlaceholder': 'Descrição (opcional)',
'todo.editDescription': 'Clique para editar, os links abrem direto',
'todo.unassigned': 'Não atribuído',
'todo.noCategory': 'Sem lista',
'todo.hasDescription': 'Com descrição',
+1
View File
@@ -5,6 +5,7 @@ const undo: TranslationStrings = {
'undo.tooltip': 'Desfazer: {action}',
'undo.assignPlace': 'Local atribuído ao dia',
'undo.removeAssignment': 'Local removido do dia',
'undo.clearDay': 'Dia limpo',
'undo.reorder': 'Locais reordenados',
'undo.optimize': 'Rota otimizada',
'undo.deletePlace': 'Local excluído',
+4
View File
@@ -5,9 +5,13 @@ const atlas: TranslationStrings = {
'atlas.countries': 'Països',
'atlas.trips': 'Viatges',
'atlas.places': 'Llocs',
'atlas.placesShow': 'Mostra els llocs d’aquest país',
'atlas.placesSearch': 'Cerca llocs',
'atlas.placesNone': 'Cap lloc coincideix',
'atlas.days': 'Dies',
'atlas.visitedCountries': 'Països visitats',
'atlas.cities': 'Ciutats',
'atlas.regions': 'Regions',
'atlas.noData': 'Encara no hi ha dades de viatge',
'atlas.noDataHint': 'Crea un viatge i afegeix llocs per veure el teu mapa del món',
'atlas.nextTrip': 'Proper viatge',
+1
View File
@@ -106,6 +106,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'p. ex. Sopar, records, benzina…',
'costs.note': 'Nota',
'costs.notePlaceholder': 'Què incloïa, qui deu què…',
'costs.paymentNotePlaceholder': 'Pagat en efectiu, per transferència…',
'costs.addNote': 'Afegeix una nota',
'costs.showNote': 'Mostra la nota',
'costs.hideNote': 'Amaga la nota',
+10
View File
@@ -57,6 +57,8 @@ const dayplan: TranslationStrings = {
'dayplan.exportMaps': 'Mapes i GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exporta el pla diari com a PDF',
'dayplan.pdfMine': 'El meu pla en PDF',
'dayplan.pdfMineSub': 'Només les activitats i reserves en què participes',
'dayplan.gpxTooltip': 'Exporta com a GPX per a mapes fora de línia i dispositius GPS',
'dayplan.gpxAll': 'Tot el viatge',
'dayplan.gpxPlaces': 'Només els llocs',
@@ -92,6 +94,14 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'Elimina el dia',
'dayplan.deleteDayTitle': 'Vols eliminar {day}?',
'dayplan.deleteDayBody': "El dia s'elimina del viatge. No es pot desfer.",
'dayplan.excludeFromRoute': 'Treu de la ruta',
'dayplan.includeInRoute': 'Torna a afegir a la ruta',
'dayplan.offRoute': 'Fora de ruta',
'dayplan.offRouteHint': 'Es manté al dia i al mapa, però la ruta el salta',
'dayplan.clearDay': 'Buida el dia',
'dayplan.clearDayTitle': 'Vols buidar {day}?',
'dayplan.clearDayBody':
'Tots els llocs surten d’aquest dia. Els llocs es queden al viatge, i el dia conserva les notes i les reserves.',
'dayplan.deleteDayEmpty': 'No hi ha res planificat aquest dia.',
'dayplan.impactPlaces': 'Llocs planificats: {count}',
'dayplan.impactPlacesHint': 'Es queden a la llista de llocs.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'Reserva pendent',
'inspector.google': 'Obre a Google Maps',
'inspector.navigation': 'Navegació',
'inspector.otherMapApp': 'Una altra app de mapes',
'inspector.openWith': 'Obre amb',
'inspector.website': 'Obre el lloc web',
'inspector.addRes': 'Reserva',
+25
View File
@@ -6,6 +6,9 @@ const journey: TranslationStrings = {
'journey.title': 'Travesia',
'journey.subtitle': 'Registra els teus viatges en temps real',
'journey.new': 'Travesia nova',
'journey.lightbox.zoomIn': 'Apropa',
'journey.lightbox.zoomOut': 'Allunya',
'journey.lightbox.zoomReset': 'Torna a la foto sencera',
'journey.create': 'Crea',
'journey.titlePlaceholder': 'A on vas?',
'journey.empty': 'Encara no hi ha travesies',
@@ -78,6 +81,8 @@ const journey: TranslationStrings = {
'journey.detail.addEntry': 'Afegeix una entrada',
'journey.detail.jumpToTop': 'Torna a dalt',
'journey.detail.jumpToLast': 'Ves a l’última entrada',
'journey.detail.dayJump': 'Ves a un dia',
'journey.detail.dayJumpCount': '{count} dies',
'journey.detail.newEntry': 'Entrada nova',
'journey.detail.editEntry': "Edita l'entrada",
'journey.detail.noEntries': 'Encara no hi ha entrades',
@@ -432,6 +437,19 @@ const journey: TranslationStrings = {
'journey.studio.kind.list': 'Llista',
'journey.studio.kind.icon': 'Icona',
'journey.studio.duplicate': 'Duplica',
'journey.studio.copyToPage': 'Copia, per enganxar a qualsevol pàgina (Ctrl+C)',
'journey.studio.paste': 'Enganxa (Ctrl+V)',
'journey.studio.pasteEmpty': 'Primer copia alguna cosa i després enganxa-la a qualsevol pàgina',
'journey.studio.myLayouts': 'Les meves disposicions',
'journey.studio.myLayoutsEmpty':
'Guarda una pàgina que hagis organitzat i disposa altres pàgines de la mateixa manera. Les seves fotos i textos es mantenen.',
'journey.studio.saveLayout': 'Desa aquesta pàgina com a disposició',
'journey.studio.saveLayoutHint': 'Conserva la disposició sense les fotos, per a tots els editors d’aquest llibre',
'journey.studio.saveLayoutFull':
'Aquest llibre conserva fins a 24 disposicions. Elimina’n una per desar-ne una altra.',
'journey.studio.deleteLayout': 'Elimina la disposició',
'journey.studio.layoutName': 'Disposició',
'journey.studio.builtInLayouts': 'Predefinides',
'journey.studio.style': 'Estil',
'journey.studio.shows': 'Mostra',
'journey.studio.size': 'Mida',
@@ -625,6 +643,13 @@ const journey: TranslationStrings = {
'journey.editor.statsExcludedHint':
'La parada es manté al diari, però no compta per a la distància, els països ni el mapa de Studio.',
'journey.entry.offRoute': 'Fora de ruta',
'journey.entry.draft': 'Esborrany',
'journey.editor.draft': 'Esborrany',
'journey.editor.draftHint':
'Només tu i els altres col·laboradors veieu aquesta entrada. La travesia compartida l’omet fins que ho desactivis.',
'journey.editor.tripSuggestionHint':
'Aquest dia cau dins d’aquest viatge. Enllaça’l i els seus llocs s’afegiran a aquesta travesia.',
'journey.editor.tripSuggestionLater': 'Ara no',
'journey.suggestions.dismiss': 'Descarta aquest suggeriment',
'journey.suggestions.dismissed': 'Suggeriment descartat',
'journey.suggestions.restore': 'Recupera els suggeriments descartats',
+2
View File
@@ -24,6 +24,8 @@ const map: TranslationStrings = {
'map.location.unavailable': 'No s’ha pogut determinar la teva ubicació.',
'map.location.timeout': 'La localització ha trigat massa. Torna-ho a provar amb una vista més clara del cel.',
'map.overview.show': 'Mostra tot el viatge',
'map.lock.lock': 'Bloqueja la vista del mapa',
'map.lock.unlock': 'Deixa que el mapa segueixi la selecció',
'map.overview.hide': 'Amaga tot el viatge',
'map.overview.total': 'Distància total',
'map.attribution': 'Crèdits del mapa',
+1
View File
@@ -35,6 +35,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.onMap': 'Al mapa',
'mobileTrip.profileDriving': 'En cotxe',
'mobileTrip.profileWalking': 'A peu',
'mobileTrip.profileCycling': 'En bicicleta',
'mobileTrip.renameDay': 'Canvia el nom del dia',
'mobileTrip.resBadge': 'Reserva',
'mobileTrip.showOnMap': 'Mostra al mapa',
+3
View File
@@ -92,6 +92,9 @@ const packing: TranslationStrings = {
'packing.editItem': "Edita l'element",
'packing.itemName': 'Nom',
'packing.itemQuantity': 'Quantitat',
'packing.packedCount': '{packed} de {total} preparats',
'packing.packedMore': 'Prepara’n un més',
'packing.packedLess': 'Prepara’n un menys',
'packing.itemWeight': 'Pes (g)',
'packing.bagLimit': 'Límit de pes',
'packing.setBagLimit': 'Defineix un límit',
+10
View File
@@ -51,6 +51,8 @@ const places: TranslationStrings = {
'places.dayScopedClear': 'Mostra tot el viatge',
'places.filterTracks': 'Rutes',
'places.filterByRating': 'Filtra per valoració',
'places.filterByLocation': 'Filtra per país o regió',
'places.allLocations': 'Tots els països',
'places.filterShow': 'Mostrar',
'places.clearSearch': 'Esborra la cerca',
'places.yourRating': 'La teva valoració',
@@ -77,6 +79,7 @@ const places: TranslationStrings = {
'places.formCategory': 'Categoria',
'places.noCategory': 'Sense categoria',
'places.newCategory': 'Categoria nova',
'places.openInMaps': 'Obre a mapes',
'places.categoryNamePlaceholder': 'Nom de la categoria',
'places.formTime': 'Hora',
'places.startTime': 'Inici',
@@ -93,6 +96,8 @@ const places: TranslationStrings = {
'places.mapsSearchPlaceholder': 'Cerca llocs...',
'places.mapsSearchError': 'La cerca de llocs ha fallat.',
'places.searchGoogleInstead': 'No és el lloc correcte? Cerca a Google',
'places.nearby': 'Llocs a prop d’aquest marcador',
'places.nearbyNone': 'No s’ha trobat res a prop d’aquest marcador',
'places.loadingDetails': 'Carregant els detalls del lloc…',
'places.osmHint':
"S'està utilitzant la cerca amb OpenStreetMap (sense fotos, horaris ni valoracions). Afegeix una clau API de Google a Configuració per obtenir tots els detalls.",
@@ -134,9 +139,14 @@ const places: TranslationStrings = {
'places.enrichOnImport': 'Enriquir llocs mitjançant Google',
'places.enrichOnImportHint':
"Obté automàticament adreces, puntuacions i horaris d'obertura des de Google en importar.",
'places.enrichOnImportFileHint':
'Després cerca cada punt importat a Google i n’afegeix la foto, l’adreça, el lloc web i el telèfon. Els camins i els tracks es queden com estan.',
'places.uploadImage': 'Puja una imatge',
'places.changeImage': 'Canvia la imatge',
'places.removeImage': 'Elimina la imatge',
'places.chooseImage': 'Tria una imatge',
'places.uploadFromDevice': 'Puja des del dispositiu',
'places.fromAttachedFiles': 'Dels fitxers adjunts',
'places.imageUploadError': "No s'ha pogut pujar la imatge",
'places.imageRemoveError': "No s'ha pogut eliminar la imatge",
};
+11
View File
@@ -34,6 +34,7 @@ const reservations: TranslationStrings = {
'reservations.type.other': 'Altres',
'reservations.type.bus': 'Autobús',
'reservations.type.ferry': 'Ferri',
'reservations.type.cable_car': 'Telefèric',
'reservations.type.bicycle': 'Bicicleta',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Transport públic',
@@ -197,6 +198,16 @@ const reservations: TranslationStrings = {
'reservations.resetFilters': 'Restablir els filtres',
'reservations.noMatches': 'Res no coincideix amb aquests filtres',
'reservations.viewOptions': 'Opcions de vista',
'reservations.exportCsv': 'Exporta com a full de càlcul (CSV)',
'reservations.export.type': 'Tipus',
'reservations.export.title': 'Títol',
'reservations.export.start': 'Inici',
'reservations.export.end': 'Final',
'reservations.export.from': 'Des de',
'reservations.export.to': 'Fins a',
'reservations.export.location': 'Ubicació',
'reservations.export.confirmation': 'Confirmació',
'reservations.export.notes': 'Notes',
'reservations.resetView': 'Restablir la vista',
'reservations.group.label': 'Agrupar per',
'reservations.group.status': 'Estat',
+10
View File
@@ -466,6 +466,12 @@ const settings: TranslationStrings = {
'settings.general.languageRegion': 'Idioma i regió',
'settings.general.travelMap': 'Viatge i mapa',
'settings.general.startup': 'Inici',
'settings.dayDateFirst': 'Data primer als títols dels dies',
'settings.compactUnplanned': 'Marcadors compactes per als llocs sense planificar',
'settings.compactUnplannedHint':
'Els llocs que no són a cap dia es mostren com a marcadors petits sense foto, perquè les parades planificades destaquin.',
'settings.dayDateFirstHint':
'Comença cada dia amb la seva data de calendari i mostra «Dia 1» o el títol propi del dia al costat.',
'settings.startPage': "Pàgina d'inici",
'settings.startPageDashboard': 'Tauler',
'settings.startPageActiveTrip': 'Viatge actiu',
@@ -565,6 +571,10 @@ const settings: TranslationStrings = {
'settings.notificationPreferences.pluginConfigured':
'Configurat. Gestiona les credencials a la configuració del connector.',
'settings.currencyTrip': 'Divisa del viatge',
'settings.placeLanguage': 'Noms de llocs',
'settings.placeLanguageApp': 'Igual que l’app',
'settings.placeLanguageHint':
'La llengua en què responen la cerca de llocs, els suggeriments i les adreces. Si un lloc no té nom en aquesta llengua, se’n mostra el nom local.',
'settings.alwaysShowRoutes': 'Mostra sempre les rutes de reserva',
'settings.alwaysShowRoutesHint':
'Dibuixa automàticament al mapa la ruta de cada vol, tren i altra reserva — no cal activar-la una per una.',
+5
View File
@@ -12,5 +12,10 @@ const share: TranslationStrings = {
'share.permPacking': 'Equipatge',
'share.permBudget': 'Pressupost',
'share.permCollab': 'Xat',
'share.options': 'Opcions',
'share.optTravelOnly': 'Només transport i allotjament',
'share.optTravelOnlyHint': 'Mostra només transport i allotjament, sense activitats, notes del dia ni dies buits',
'share.optHideImages': 'Sense fotos',
'share.optHideImagesHint': 'Omet les fotos dels llocs a la pàgina compartida',
};
export default share;
+1
View File
@@ -15,6 +15,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Xat',
'shared.days': 'dies',
'shared.places': 'llocs',
'shared.unplanned': 'Encara sense planificar',
'shared.other': 'Altres',
'shared.totalBudget': 'Pressupost total',
'shared.messages': 'missatges',
+1
View File
@@ -10,6 +10,7 @@ const todo: TranslationStrings = {
'todo.uncategorized': 'Sense categoria',
'todo.namePlaceholder': 'Nom de la tasca',
'todo.descriptionPlaceholder': 'Descripció (opcional)',
'todo.editDescription': 'Fes clic per editar, els enllaços s’obren directament',
'todo.unassigned': 'Sense assignar',
'todo.noCategory': 'Sense categoria',
'todo.hasDescription': 'Amb descripció',
+1
View File
@@ -5,6 +5,7 @@ const undo: TranslationStrings = {
'undo.tooltip': 'Desfés: {action}',
'undo.assignPlace': 'Lloc assignat al dia',
'undo.removeAssignment': 'Lloc eliminat del dia',
'undo.clearDay': 'Dia buidat',
'undo.reorder': 'Llocs reordenats',
'undo.optimize': 'Ruta optimitzada',
'undo.deletePlace': 'Lloc eliminat',
+4
View File
@@ -5,6 +5,9 @@ const atlas: TranslationStrings = {
'atlas.countries': 'Země',
'atlas.trips': 'Cesty',
'atlas.places': 'Místa',
'atlas.placesShow': 'Zobrazit místa v této zemi',
'atlas.placesSearch': 'Hledat místa',
'atlas.placesNone': 'Žádné místo neodpovídá',
'atlas.unmark': 'Odebrat',
'atlas.confirmMark': 'Označit tuto zemi jako navštívenou?',
'atlas.confirmUnmark': 'Odebrat tuto zemi ze seznamu navštívených?',
@@ -30,6 +33,7 @@ const atlas: TranslationStrings = {
'atlas.days': 'Dní',
'atlas.visitedCountries': 'Navštívené země',
'atlas.cities': 'Města',
'atlas.regions': 'Regiony',
'atlas.noData': 'Zatím žádná cestovatelská data',
'atlas.noDataHint': 'Vytvořte cestu a přidejte místa, abyste viděli svou mapu světa',
'atlas.nextTrip': 'Další cesta',
+1
View File
@@ -108,6 +108,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'např. večeře, suvenýry, benzín…',
'costs.note': 'Poznámka',
'costs.notePlaceholder': 'Co zahrnovalo, kdo co dluží…',
'costs.paymentNotePlaceholder': 'Zaplaceno hotově, bankovním převodem…',
'costs.addNote': 'Přidat poznámku',
'costs.showNote': 'Zobrazit poznámku',
'costs.hideNote': 'Skrýt poznámku',
+10
View File
@@ -57,6 +57,8 @@ const dayplan: TranslationStrings = {
'dayplan.exportMaps': 'Mapy a GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Exportovat denní plán do PDF',
'dayplan.pdfMine': 'Můj plán jako PDF',
'dayplan.pdfMineSub': 'Jen aktivity a rezervace, kterých se účastníte',
'dayplan.gpxTooltip': 'Exportovat jako GPX pro offline mapy a GPS zařízení',
'dayplan.gpxAll': 'Celá cesta',
'dayplan.gpxPlaces': 'Jen místa',
@@ -92,6 +94,14 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'Smazat den',
'dayplan.deleteDayTitle': 'Smazat {day}?',
'dayplan.deleteDayBody': 'Den bude z cesty odebrán. Tuto akci nelze vrátit zpět.',
'dayplan.excludeFromRoute': 'Vynechat z trasy',
'dayplan.includeInRoute': 'Vrátit do trasy',
'dayplan.offRoute': 'Mimo trasu',
'dayplan.offRouteHint': 'Zůstává ve dni i na mapě, ale trasa ho vynechá',
'dayplan.clearDay': 'Vyprázdnit den',
'dayplan.clearDayTitle': 'Vyprázdnit {day}?',
'dayplan.clearDayBody':
'Všechna místa se z tohoto dne odeberou. Místa zůstanou v cestě a den si ponechá své poznámky i rezervace.',
'dayplan.deleteDayEmpty': 'Na tento den není nic naplánováno.',
'dayplan.impactPlaces': 'Naplánovaná místa: {count}',
'dayplan.impactPlacesHint': 'Zůstanou v seznamu míst.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'Čekající rezervace',
'inspector.google': 'Google Maps',
'inspector.navigation': 'Navigace',
'inspector.otherMapApp': 'Jiná mapová aplikace',
'inspector.openWith': 'Otevřít v',
'inspector.openStreetMap': 'OpenStreetMap',
'inspector.website': 'Otevřít webové stránky',
+21
View File
@@ -6,6 +6,9 @@ const journey: TranslationStrings = {
'journey.title': 'Cestovní deník',
'journey.subtitle': 'Zaznamenávejte své cesty průběžně',
'journey.new': 'Nový cestovní deník',
'journey.lightbox.zoomIn': 'Přiblížit',
'journey.lightbox.zoomOut': 'Oddálit',
'journey.lightbox.zoomReset': 'Zpět na celou fotku',
'journey.create': 'Vytvořit',
'journey.titlePlaceholder': 'Kam jedete?',
'journey.empty': 'Zatím žádné cestovní deníky',
@@ -78,6 +81,8 @@ const journey: TranslationStrings = {
'journey.detail.addEntry': 'Přidat záznam',
'journey.detail.jumpToTop': 'Zpět nahoru',
'journey.detail.jumpToLast': 'Přejít na poslední záznam',
'journey.detail.dayJump': 'Přejít na den',
'journey.detail.dayJumpCount': '{count} dní',
'journey.detail.newEntry': 'Nový záznam',
'journey.detail.editEntry': 'Upravit záznam',
'journey.detail.noEntries': 'Zatím žádné záznamy',
@@ -432,6 +437,17 @@ const journey: TranslationStrings = {
'journey.studio.kind.list': 'Seznam',
'journey.studio.kind.icon': 'Ikona',
'journey.studio.duplicate': 'Duplikovat',
'journey.studio.copyToPage': 'Kopírovat pro vložení na libovolnou stranu (Ctrl+C)',
'journey.studio.paste': 'Vložit (Ctrl+V)',
'journey.studio.pasteEmpty': 'Nejprve něco zkopírujte a pak to vložte na libovolnou stranu',
'journey.studio.myLayouts': 'Moje rozvržení',
'journey.studio.myLayoutsEmpty': 'Uložte si stranu, kterou jste uspořádali, a rozvrhněte stejně i další strany. Jejich fotky a texty zůstanou.',
'journey.studio.saveLayout': 'Uložit tuto stranu jako rozvržení',
'journey.studio.saveLayoutHint': 'Uloží uspořádání bez fotek, pro všechny editory této knihy',
'journey.studio.saveLayoutFull': 'Tato kniha pojme až 24 rozvržení. Jedno smažte, abyste mohli uložit další.',
'journey.studio.deleteLayout': 'Smazat rozvržení',
'journey.studio.layoutName': 'Rozvržení',
'journey.studio.builtInLayouts': 'Vestavěná',
'journey.studio.style': 'Styl',
'journey.studio.shows': 'Zobrazení',
'journey.studio.size': 'Velikost',
@@ -625,6 +641,11 @@ const journey: TranslationStrings = {
'journey.editor.statsExcludedHint':
'Zastávka zůstane v deníku, ale nepočítá se do vzdálenosti, zemí ani do mapy v Studio.',
'journey.entry.offRoute': 'Mimo trasu',
'journey.entry.draft': 'Koncept',
'journey.editor.draft': 'Koncept',
'journey.editor.draftHint': 'Tento záznam vidíte jen vy a ostatní přispěvatelé. Sdílený deník ho vynechá, dokud tuto volbu nevypnete.',
'journey.editor.tripSuggestionHint': 'Tento den spadá do této cesty. Propojte ji a její místa se přidají do tohoto deníku.',
'journey.editor.tripSuggestionLater': 'Teď ne',
'journey.suggestions.dismiss': 'Zahodit tento návrh',
'journey.suggestions.dismissed': 'Návrh zahozen',
'journey.suggestions.restore': 'Vrátit zahozené návrhy',
+2
View File
@@ -24,6 +24,8 @@ const map: TranslationStrings = {
'map.location.unavailable': 'Vaši polohu se nepodařilo zjistit.',
'map.location.timeout': 'Zjišťování polohy trvalo příliš dlouho. Zkuste to znovu s volným výhledem na oblohu.',
'map.overview.show': 'Zobrazit celou cestu',
'map.lock.lock': 'Uzamknout zobrazení mapy',
'map.lock.unlock': 'Nechat mapu sledovat výběr',
'map.overview.hide': 'Skrýt celou cestu',
'map.overview.total': 'Celková vzdálenost',
'map.attribution': 'Zdroje mapy',
+1
View File
@@ -35,6 +35,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.onMap': 'Na mapě',
'mobileTrip.profileDriving': 'Autem',
'mobileTrip.profileWalking': 'Pěšky',
'mobileTrip.profileCycling': 'Na kole',
'mobileTrip.renameDay': 'Přejmenovat den',
'mobileTrip.resBadge': 'Rezervace',
'mobileTrip.showOnMap': 'Zobrazit na mapě',
+3
View File
@@ -9,6 +9,9 @@ const packing: TranslationStrings = {
'packing.editItem': 'Upravit položku',
'packing.itemName': 'Název',
'packing.itemQuantity': 'Množství',
'packing.packedCount': '{packed} z {total} zabaleno',
'packing.packedMore': 'Zabalit o jeden víc',
'packing.packedLess': 'Zabalit o jeden méně',
'packing.itemWeight': 'Hmotnost (g)',
'packing.title': 'Seznam věcí',
'packing.empty': 'Seznam věcí je prázdný',
+10
View File
@@ -52,6 +52,8 @@ const places: TranslationStrings = {
'places.dayScopedClear': 'Zobrazit celou cestu',
'places.filterTracks': 'Trasy',
'places.filterByRating': 'Filtrovat podle hodnocení',
'places.filterByLocation': 'Filtrovat podle země nebo regionu',
'places.allLocations': 'Všechny země',
'places.filterShow': 'Zobrazit',
'places.clearSearch': 'Vymazat hledání',
'places.yourRating': 'Tvé hodnocení',
@@ -78,6 +80,7 @@ const places: TranslationStrings = {
'places.formCategory': 'Kategorie',
'places.noCategory': 'Bez kategorie',
'places.newCategory': 'Nová kategorie',
'places.openInMaps': 'Otevřít v mapách',
'places.categoryNamePlaceholder': 'Název kategorie',
'places.formTime': 'Čas',
'places.startTime': 'Od',
@@ -94,6 +97,8 @@ const places: TranslationStrings = {
'places.mapsSearchPlaceholder': 'Hledat místa...',
'places.mapsSearchError': 'Hledání místa se nezdařilo.',
'places.searchGoogleInstead': 'Není to správné místo? Hledat na Googlu',
'places.nearby': 'Místa poblíž tohoto špendlíku',
'places.nearbyNone': 'Poblíž tohoto špendlíku nebylo nic nalezeno',
'places.loadingDetails': 'Načítání podrobností místa…',
'places.osmHint':
'Používáte hledání přes OpenStreetMap (bez fotek a hodnocení). Pro plné detaily přidejte Google API klíč v nastavení.',
@@ -132,9 +137,14 @@ const places: TranslationStrings = {
'places.enrichOnImport': 'Obohatit místa přes Google',
'places.enrichOnImportHint':
'Vyhledá každé importované místo a doplní fotky, adresu a kontakty. Vyžaduje klíč Google Maps.',
'places.enrichOnImportFileHint':
'Poté každý importovaný bod vyhledá na Google a doplní jeho fotku, adresu, web a telefon. Cesty a trasy zůstanou beze změny.',
'places.uploadImage': 'Nahrát obrázek',
'places.changeImage': 'Změnit obrázek',
'places.removeImage': 'Odebrat obrázek',
'places.chooseImage': 'Vybrat obrázek',
'places.uploadFromDevice': 'Nahrát ze zařízení',
'places.fromAttachedFiles': 'Z přiložených souborů',
'places.imageUploadError': 'Obrázek se nepodařilo nahrát',
'places.imageRemoveError': 'Obrázek se nepodařilo odebrat',
};
+11
View File
@@ -61,6 +61,7 @@ const reservations: TranslationStrings = {
'reservations.type.other': 'Jiné',
'reservations.type.bus': 'Autobus',
'reservations.type.ferry': 'Trajekt',
'reservations.type.cable_car': 'Lanovka',
'reservations.type.bicycle': 'Kolo',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'Veřejná doprava',
@@ -194,6 +195,16 @@ const reservations: TranslationStrings = {
'reservations.resetFilters': 'Zrušit filtry',
'reservations.noMatches': 'Těmto filtrům nic neodpovídá',
'reservations.viewOptions': 'Možnosti zobrazení',
'reservations.exportCsv': 'Exportovat jako tabulku (CSV)',
'reservations.export.type': 'Typ',
'reservations.export.title': 'Název',
'reservations.export.start': 'Začátek',
'reservations.export.end': 'Konec',
'reservations.export.from': 'Odkud',
'reservations.export.to': 'Kam',
'reservations.export.location': 'Místo',
'reservations.export.confirmation': 'Potvrzení',
'reservations.export.notes': 'Poznámky',
'reservations.resetView': 'Obnovit zobrazení',
'reservations.group.label': 'Seskupit podle',
'reservations.group.status': 'Stav',
+7
View File
@@ -332,6 +332,9 @@ const settings: TranslationStrings = {
'settings.currencyHint':
'Částky v Nákladech se do této měny přepočítávají pouze pro zobrazení – původní částky zůstávají beze změny.',
'settings.currencyTrip': 'Měna cesty',
'settings.placeLanguage': 'Názvy míst',
'settings.placeLanguageApp': 'Stejně jako aplikace',
'settings.placeLanguageHint': 'Jazyk, ve kterém odpovídá vyhledávání míst, návrhy a adresy. Pokud místo v tomto jazyce název nemá, zobrazí se jeho místní název.',
'settings.passkey.title': 'Přístupové klíče',
'settings.passkey.description':
'Přihlašujte se rychleji a s ochranou proti phishingu pomocí přístupového klíče — otiskem prstu, obličejem, PINem nebo hardwarovým klíčem. Vaše heslo zůstává jako záloha.',
@@ -476,6 +479,10 @@ const settings: TranslationStrings = {
'settings.general.languageRegion': 'Language & region',
'settings.general.travelMap': 'Travel & map',
'settings.general.startup': 'Spuštění',
'settings.dayDateFirst': 'Datum na začátku nadpisů dnů',
'settings.compactUnplanned': 'Kompaktní značky pro nenaplánovaná místa',
'settings.compactUnplannedHint': 'Místa, která nejsou naplánovaná v žádném dni, se zobrazí jako malé značky bez fotky, aby plánované zastávky vynikly.',
'settings.dayDateFirstHint': 'Každý den začne kalendářním datem a vedle něj se zobrazí „Den 1“ nebo vlastní název dne.',
'settings.startPage': 'Úvodní stránka',
'settings.startPageDashboard': 'Přehled',
'settings.startPageActiveTrip': 'Aktivní cesta',
+5
View File
@@ -12,5 +12,10 @@ const share: TranslationStrings = {
'share.permPacking': 'Balení',
'share.permBudget': 'Náklady',
'share.permCollab': 'Chat',
'share.options': 'Možnosti',
'share.optTravelOnly': 'Jen doprava a ubytování',
'share.optTravelOnlyHint': 'Zobrazí jen dopravu a ubytování, bez aktivit, poznámek ke dnům a prázdných dnů',
'share.optHideImages': 'Bez fotek',
'share.optHideImagesHint': 'Vynechá fotky míst ze sdílené stránky',
};
export default share;
+1
View File
@@ -14,6 +14,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Chat',
'shared.days': 'dní',
'shared.places': 'míst',
'shared.unplanned': 'Zatím nenaplánováno',
'shared.other': 'Ostatní',
'shared.totalBudget': 'Celkové náklady',
'shared.messages': 'zpráv',
+1
View File
@@ -11,6 +11,7 @@ const todo: TranslationStrings = {
'todo.uncategorized': 'Bez seznamu',
'todo.namePlaceholder': 'Název úkolu',
'todo.descriptionPlaceholder': 'Popis (volitelné)',
'todo.editDescription': 'Kliknutím upravíte, odkazy se otevřou přímo',
'todo.unassigned': 'Nepřiřazeno',
'todo.noCategory': 'Bez seznamu',
'todo.hasDescription': 'Má popis',
+1
View File
@@ -5,6 +5,7 @@ const undo: TranslationStrings = {
'undo.tooltip': 'Zpět: {action}',
'undo.assignPlace': 'Místo přiřazeno ke dni',
'undo.removeAssignment': 'Místo odebráno ze dne',
'undo.clearDay': 'Den vyprázdněn',
'undo.reorder': 'Místa přeseřazena',
'undo.optimize': 'Trasa optimalizována',
'undo.deletePlace': 'Místo smazáno',
+4
View File
@@ -5,6 +5,9 @@ const atlas: TranslationStrings = {
'atlas.countries': 'Länder',
'atlas.trips': 'Reisen',
'atlas.places': 'Orte',
'atlas.placesShow': 'Orte in diesem Land anzeigen',
'atlas.placesSearch': 'Orte suchen',
'atlas.placesNone': 'Kein Ort passt',
'atlas.unmark': 'Entfernen',
'atlas.confirmMark': 'Dieses Land als besucht markieren?',
'atlas.confirmUnmark': 'Dieses Land von der Liste entfernen?',
@@ -33,6 +36,7 @@ const atlas: TranslationStrings = {
'atlas.days': 'Tage',
'atlas.visitedCountries': 'Besuchte Länder',
'atlas.cities': 'Städte',
'atlas.regions': 'Regionen',
'atlas.noData': 'Noch keine Reisedaten',
'atlas.noDataHint': 'Erstelle einen Trip und füge Orte hinzu',
'atlas.nextTrip': 'Nächster Trip',
+1
View File
@@ -111,6 +111,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'z.B. Abendessen, Souvenirs, Benzin…',
'costs.note': 'Notiz',
'costs.notePlaceholder': 'Was darin enthalten war, wer was zurückzahlt…',
'costs.paymentNotePlaceholder': 'Bar bezahlt, per Überweisung…',
'costs.addNote': 'Notiz hinzufügen',
'costs.showNote': 'Notiz anzeigen',
'costs.hideNote': 'Notiz ausblenden',
+10
View File
@@ -68,6 +68,8 @@ const dayplan: TranslationStrings = {
'dayplan.exportMaps': 'Karten & GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Tagesplan als PDF exportieren',
'dayplan.pdfMine': 'Mein Plan als PDF',
'dayplan.pdfMineSub': 'Nur die Aktivitäten und Buchungen, an denen du teilnimmst',
'dayplan.gpxTooltip': 'Als GPX für Offline-Karten und GPS-Geräte exportieren',
'dayplan.gpxAll': 'Ganze Reise',
'dayplan.gpxPlaces': 'Nur Orte',
@@ -92,6 +94,14 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'Tag löschen',
'dayplan.deleteDayTitle': '{day} löschen?',
'dayplan.deleteDayBody': 'Der Tag wird aus der Reise entfernt. Das lässt sich nicht rückgängig machen.',
'dayplan.excludeFromRoute': 'Aus der Route nehmen',
'dayplan.includeInRoute': 'Wieder in die Route aufnehmen',
'dayplan.offRoute': 'Nicht auf der Route',
'dayplan.offRouteHint': 'Bleibt im Tag und auf der Karte, wird von der Route aber übersprungen',
'dayplan.clearDay': 'Tag leeren',
'dayplan.clearDayTitle': '{day} leeren?',
'dayplan.clearDayBody':
'Alle Orte werden von diesem Tag entfernt. Die Orte bleiben in der Reise, und der Tag behält seine Notizen und Buchungen.',
'dayplan.deleteDayEmpty': 'An diesem Tag ist nichts geplant.',
'dayplan.impactPlaces': 'Geplante Orte: {count}',
'dayplan.impactPlacesHint': 'Sie bleiben in der Ortsliste.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'Ausstehende Reservierung',
'inspector.google': 'Google Maps',
'inspector.navigation': 'Navigation',
'inspector.otherMapApp': 'Andere Karten-App',
'inspector.openWith': 'Öffnen mit',
'inspector.openStreetMap': 'OpenStreetMap',
'inspector.website': 'Webseite öffnen',
+25
View File
@@ -6,6 +6,9 @@ const journey: TranslationStrings = {
'journey.title': 'Journey',
'journey.subtitle': 'Dokumentiere deine Reisen unterwegs',
'journey.new': 'Neue Journey',
'journey.lightbox.zoomIn': 'Vergrößern',
'journey.lightbox.zoomOut': 'Verkleinern',
'journey.lightbox.zoomReset': 'Zurück zum ganzen Foto',
'journey.create': 'Erstellen',
'journey.titlePlaceholder': 'Wohin geht die Reise?',
'journey.empty': 'Noch keine Journeys',
@@ -78,6 +81,8 @@ const journey: TranslationStrings = {
'journey.detail.addEntry': 'Eintrag hinzufügen',
'journey.detail.jumpToTop': 'Nach oben',
'journey.detail.jumpToLast': 'Zum letzten Eintrag',
'journey.detail.dayJump': 'Zu einem Tag springen',
'journey.detail.dayJumpCount': '{count} Tage',
'journey.detail.newEntry': 'Neuer Eintrag',
'journey.detail.editEntry': 'Eintrag bearbeiten',
'journey.detail.noEntries': 'Noch keine Einträge',
@@ -432,6 +437,19 @@ const journey: TranslationStrings = {
'journey.studio.kind.list': 'Liste',
'journey.studio.kind.icon': 'Symbol',
'journey.studio.duplicate': 'Duplizieren',
'journey.studio.copyToPage': 'Kopieren, um es auf einer beliebigen Seite einzufügen (Ctrl+C)',
'journey.studio.paste': 'Einfügen (Ctrl+V)',
'journey.studio.pasteEmpty': 'Kopiere zuerst etwas und füge es dann auf einer beliebigen Seite ein',
'journey.studio.myLayouts': 'Meine Anordnungen',
'journey.studio.myLayoutsEmpty':
'Behalte eine Seite, die du angeordnet hast, und ordne andere Seiten genauso an. Ihre Fotos und Texte bleiben erhalten.',
'journey.studio.saveLayout': 'Diese Seite als Anordnung speichern',
'journey.studio.saveLayoutHint': 'Speichert die Anordnung ohne die Fotos, für alle, die dieses Buch bearbeiten',
'journey.studio.saveLayoutFull':
'Dieses Buch speichert bis zu 24 Anordnungen. Lösche eine, um eine weitere zu speichern.',
'journey.studio.deleteLayout': 'Anordnung löschen',
'journey.studio.layoutName': 'Anordnung',
'journey.studio.builtInLayouts': 'Vorgefertigt',
'journey.studio.style': 'Stil',
'journey.studio.shows': 'Anzeige',
'journey.studio.size': 'Größe',
@@ -626,6 +644,13 @@ const journey: TranslationStrings = {
'journey.editor.statsExcludedHint':
'Die Station bleibt im Tagebuch, zählt aber nicht für Distanz, Länder oder die Karte im Studio.',
'journey.entry.offRoute': 'Nicht auf der Route',
'journey.entry.draft': 'Entwurf',
'journey.editor.draft': 'Entwurf',
'journey.editor.draftHint':
'Nur du und die anderen Mitwirkenden sehen diesen Eintrag. Die geteilte Journey lässt ihn weg, bis du das ausschaltest.',
'journey.editor.tripSuggestionHint':
'Dieser Tag liegt in dieser Reise. Verknüpfe sie, dann kommen ihre Orte in diese Journey.',
'journey.editor.tripSuggestionLater': 'Nicht jetzt',
'journey.suggestions.dismiss': 'Diesen Vorschlag verwerfen',
'journey.suggestions.dismissed': 'Vorschlag verworfen',
'journey.suggestions.restore': 'Verworfene Vorschläge zurückholen',
+2
View File
@@ -24,6 +24,8 @@ const map: TranslationStrings = {
'map.location.unavailable': 'Dein Standort konnte nicht ermittelt werden.',
'map.location.timeout': 'Die Standortbestimmung hat zu lange gedauert. Versuche es mit freier Sicht zum Himmel erneut.',
'map.overview.show': 'Ganze Reise anzeigen',
'map.lock.lock': 'Kartenansicht fixieren',
'map.lock.unlock': 'Karte der Auswahl folgen lassen',
'map.overview.hide': 'Ganze Reise ausblenden',
'map.overview.total': 'Gesamtstrecke',
'map.attribution': 'Kartenquellen',
+1
View File
@@ -35,6 +35,7 @@ const mobileTrip: TranslationStrings = {
'mobileTrip.onMap': 'Auf Karte',
'mobileTrip.profileDriving': 'Auto',
'mobileTrip.profileWalking': 'Fußweg',
'mobileTrip.profileCycling': 'Fahrrad',
'mobileTrip.renameDay': 'Tag umbenennen',
'mobileTrip.resBadge': 'Buchung',
'mobileTrip.showOnMap': 'Auf Karte anzeigen',
+3
View File
@@ -10,6 +10,9 @@ const packing: TranslationStrings = {
'packing.editItem': 'Objekt bearbeiten',
'packing.itemName': 'Name',
'packing.itemQuantity': 'Menge',
'packing.packedCount': '{packed} von {total} gepackt',
'packing.packedMore': 'Eins mehr packen',
'packing.packedLess': 'Eins weniger packen',
'packing.itemWeight': 'Gewicht (g)',
'packing.title': 'Packliste',
'packing.empty': 'Packliste ist leer',
+10
View File
@@ -52,6 +52,8 @@ const places: TranslationStrings = {
'places.dayScopedClear': 'Ganze Reise anzeigen',
'places.filterTracks': 'Tracks',
'places.filterByRating': 'Nach Bewertung filtern',
'places.filterByLocation': 'Nach Land oder Region filtern',
'places.allLocations': 'Alle Länder',
'places.filterShow': 'Anzeigen',
'places.clearSearch': 'Suche leeren',
'places.yourRating': 'Deine Bewertung',
@@ -78,6 +80,7 @@ const places: TranslationStrings = {
'places.formCategory': 'Kategorie',
'places.noCategory': 'Keine Kategorie',
'places.newCategory': 'Neue Kategorie',
'places.openInMaps': 'In Karten öffnen',
'places.categoryNamePlaceholder': 'Kategoriename',
'places.formTime': 'Uhrzeit',
'places.startTime': 'Startzeit',
@@ -94,6 +97,8 @@ const places: TranslationStrings = {
'places.mapsSearchPlaceholder': 'Ortssuche...',
'places.mapsSearchError': 'Ortssuche fehlgeschlagen.',
'places.searchGoogleInstead': 'Nicht der richtige Ort? Stattdessen bei Google suchen',
'places.nearby': 'Orte in der Nähe dieser Markierung',
'places.nearbyNone': 'Nichts in der Nähe dieser Markierung gefunden',
'places.loadingDetails': 'Ortsdetails werden geladen…',
'places.osmHint':
'OpenStreetMap-Suche aktiv (ohne Bilder, Öffnungszeiten, Bewertungen). Für erweiterte Daten Google API Key in den Einstellungen hinterlegen.',
@@ -131,11 +136,16 @@ const places: TranslationStrings = {
'places.uploadImage': 'Bild hochladen',
'places.changeImage': 'Bild ändern',
'places.removeImage': 'Bild entfernen',
'places.chooseImage': 'Bild auswählen',
'places.uploadFromDevice': 'Vom Gerät hochladen',
'places.fromAttachedFiles': 'Aus angehängten Dateien',
'places.imageUploadError': 'Bild konnte nicht hochgeladen werden',
'places.imageRemoveError': 'Bild konnte nicht entfernt werden',
'places.addAnyway': 'Trotzdem hinzufügen',
'places.enrichOnImport': 'Orte über Google anreichern',
'places.enrichOnImportHint':
'Sucht jeden importierten Ort nach, um Fotos, Adresse und Kontaktdaten zu ergänzen. Nutzt deinen Google-Maps-Key.',
'places.enrichOnImportFileHint':
'Sucht jeden importierten Punkt danach bei Google und ergänzt Foto, Adresse, Website und Telefonnummer. Pfade und Tracks bleiben, wie sie sind.',
};
export default places;
+11
View File
@@ -64,6 +64,7 @@ const reservations: TranslationStrings = {
'reservations.type.other': 'Sonstiges',
'reservations.type.bus': 'Bus',
'reservations.type.ferry': 'Fähre',
'reservations.type.cable_car': 'Seilbahn',
'reservations.type.bicycle': 'Fahrrad',
'reservations.type.taxi': 'Taxi',
'reservations.type.transit': 'ÖPNV',
@@ -197,6 +198,16 @@ const reservations: TranslationStrings = {
'reservations.resetFilters': 'Filter zurücksetzen',
'reservations.noMatches': 'Nichts passt zu diesen Filtern',
'reservations.viewOptions': 'Ansicht anpassen',
'reservations.exportCsv': 'Als Tabelle exportieren (CSV)',
'reservations.export.type': 'Typ',
'reservations.export.title': 'Titel',
'reservations.export.start': 'Beginn',
'reservations.export.end': 'Ende',
'reservations.export.from': 'Von',
'reservations.export.to': 'Nach',
'reservations.export.location': 'Ort',
'reservations.export.confirmation': 'Bestätigung',
'reservations.export.notes': 'Notizen',
'reservations.resetView': 'Ansicht zurücksetzen',
'reservations.group.label': 'Gruppieren nach',
'reservations.group.status': 'Status',
+10
View File
@@ -341,6 +341,10 @@ const settings: TranslationStrings = {
'settings.currencyHint':
'Beträge unter Kosten werden nur zur Anzeige in diese Währung umgerechnet – die ursprünglichen Beträge bleiben unverändert.',
'settings.currencyTrip': 'Reisewährung',
'settings.placeLanguage': 'Ortsnamen',
'settings.placeLanguageApp': 'Wie die App',
'settings.placeLanguageHint':
'Die Sprache, in der Ortssuche, Vorschläge und Adressen antworten. Hat ein Ort keinen Namen in dieser Sprache, wird sein lokaler Name angezeigt.',
'settings.passkey.title': 'Passkeys',
'settings.passkey.description':
'Melde dich schneller und phishing-resistent mit einem Passkey an — per Fingerabdruck, Gesicht, PIN oder Hardware-Schlüssel. Dein Passwort bleibt als Backup erhalten.',
@@ -486,6 +490,12 @@ const settings: TranslationStrings = {
'settings.general.languageRegion': 'Sprache & Region',
'settings.general.travelMap': 'Reise & Karte',
'settings.general.startup': 'Start',
'settings.dayDateFirst': 'Datum zuerst in Tagesüberschriften',
'settings.compactUnplanned': 'Kompakte Markierungen für ungeplante Orte',
'settings.compactUnplannedHint':
'Orte, die keinem Tag zugeordnet sind, erscheinen als kleine Markierungen ohne Foto, damit die geplanten Stopps hervorstechen.',
'settings.dayDateFirstHint':
'Jeden Tag mit seinem Kalenderdatum beginnen und daneben „Tag 1“ oder den eigenen Titel des Tages anzeigen.',
'settings.startPage': 'Startseite',
'settings.startPageDashboard': 'Dashboard',
'settings.startPageActiveTrip': 'Aktive Reise',
+5
View File
@@ -12,5 +12,10 @@ const share: TranslationStrings = {
'share.permPacking': 'Packliste',
'share.permBudget': 'Kosten',
'share.permCollab': 'Chat',
'share.options': 'Optionen',
'share.optTravelOnly': 'Nur Transport und Unterkünfte',
'share.optTravelOnlyHint': 'Zeigt nur Transport und Unterkünfte, ohne Aktivitäten, Tagesnotizen und leere Tage',
'share.optHideImages': 'Ohne Fotos',
'share.optHideImagesHint': 'Lässt die Ortsfotos auf der geteilten Seite weg',
};
export default share;
+1
View File
@@ -15,6 +15,7 @@ const shared: TranslationStrings = {
'shared.tabChat': 'Chat',
'shared.days': 'Tage',
'shared.places': 'Orte',
'shared.unplanned': 'Noch nicht geplant',
'shared.other': 'Sonstiges',
'shared.totalBudget': 'Gesamtkosten',
'shared.messages': 'Nachrichten',
+1
View File
@@ -11,6 +11,7 @@ const todo: TranslationStrings = {
'todo.uncategorized': 'Keine Liste',
'todo.namePlaceholder': 'Aufgabenname',
'todo.descriptionPlaceholder': 'Beschreibung (optional)',
'todo.editDescription': 'Zum Bearbeiten klicken, Links öffnen sich direkt',
'todo.unassigned': 'Nicht zugewiesen',
'todo.noCategory': 'Keine Liste',
'todo.hasDescription': 'Hat Beschreibung',
+1
View File
@@ -5,6 +5,7 @@ const undo: TranslationStrings = {
'undo.tooltip': 'Rückgängig: {action}',
'undo.assignPlace': 'Ort einem Tag zugewiesen',
'undo.removeAssignment': 'Ort von Tag entfernt',
'undo.clearDay': 'Tag geleert',
'undo.reorder': 'Orte neu sortiert',
'undo.optimize': 'Route optimiert',
'undo.deletePlace': 'Ort gelöscht',
+4
View File
@@ -5,6 +5,9 @@ const atlas: TranslationStrings = {
'atlas.countries': 'Countries',
'atlas.trips': 'Trips',
'atlas.places': 'Places',
'atlas.placesShow': 'Show the places in this country',
'atlas.placesSearch': 'Search places',
'atlas.placesNone': 'No place matches',
'atlas.unmark': 'Remove',
'atlas.confirmMark': 'Mark this country as visited?',
'atlas.confirmUnmark': 'Remove this country from your visited list?',
@@ -33,6 +36,7 @@ const atlas: TranslationStrings = {
'atlas.days': 'Days',
'atlas.visitedCountries': 'Visited Countries',
'atlas.cities': 'Cities',
'atlas.regions': 'Regions',
'atlas.noData': 'No travel data yet',
'atlas.noDataHint': 'Create a trip and add places to see your world map',
'atlas.nextTrip': 'Next trip',
+1
View File
@@ -111,6 +111,7 @@ const budget: TranslationStrings = {
'costs.namePlaceholder': 'e.g. Dinner, souvenirs, gas…',
'costs.note': 'Note',
'costs.notePlaceholder': 'What it covered, who owes what back…',
'costs.paymentNotePlaceholder': 'Paid in cash, by bank transfer…',
'costs.addNote': 'Add note',
'costs.showNote': 'Show note',
'costs.hideNote': 'Hide note',
+10
View File
@@ -68,6 +68,8 @@ const dayplan: TranslationStrings = {
'dayplan.exportMaps': 'Maps & GPS',
'dayplan.pdf': 'PDF',
'dayplan.pdfTooltip': 'Export day plan as PDF',
'dayplan.pdfMine': 'My plan as PDF',
'dayplan.pdfMineSub': 'Only the activities and bookings you take part in',
'dayplan.gpxTooltip': 'Export as GPX for offline maps and GPS devices',
'dayplan.gpxAll': 'Whole trip',
'dayplan.gpxPlaces': 'Places only',
@@ -92,6 +94,14 @@ const dayplan: TranslationStrings = {
'dayplan.deleteDay': 'Delete day',
'dayplan.deleteDayTitle': 'Delete {day}?',
'dayplan.deleteDayBody': 'The day is removed from the trip. This cannot be undone.',
'dayplan.excludeFromRoute': 'Leave out of route',
'dayplan.includeInRoute': 'Add back to route',
'dayplan.offRoute': 'Off route',
'dayplan.offRouteHint': 'Stays on the day and the map, but the route skips it',
'dayplan.clearDay': 'Clear day',
'dayplan.clearDayTitle': 'Clear {day}?',
'dayplan.clearDayBody':
'Every place comes off this day. The places stay in the trip, and the day keeps its notes and bookings.',
'dayplan.deleteDayEmpty': 'Nothing is planned on this day.',
'dayplan.impactPlaces': 'Planned places: {count}',
'dayplan.impactPlacesHint': 'They stay in the place list.',
+1
View File
@@ -14,6 +14,7 @@ const inspector: TranslationStrings = {
'inspector.pendingRes': 'Pending Reservation',
'inspector.google': 'Google Maps',
'inspector.navigation': 'Navigation',
'inspector.otherMapApp': 'Other map app',
'inspector.openWith': 'Open with',
'inspector.openStreetMap': 'OpenStreetMap',
'inspector.website': 'Open Website',

Some files were not shown because too many files have changed in this diff Show More