mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 14:21:46 +00:00
6d2dd37414
* feat(dashboard): mobile layout, glass tiles, plain-text countdown, place photos - Rework the mobile dashboard: cover hero, separate boarding-pass card, trimmed atlas (trips + days only), stacked widgets - New floating bottom tab bar with a centred context-aware + button (new trip / place / journey / entry depending on the page) - Move profile + notifications into a small top strip on the dashboard - Desktop: glassmorphic tiles (light + dark), neutral dark palette, plain-text countdown module, real place photos in the boarding pass * i18n(dashboard): translate new dashboard keys across all locales Fill the dashboard-rework keys (hero, atlas, fx, tz, upcoming, copy dialog, aria labels, countdown) that were left as English placeholders, plus the new startsIn/aria keys, for all 19 languages. * feat(oidc): send PKCE (S256) in the OIDC login flow The OIDC client now generates a code_verifier per login, sends the S256 code_challenge on the authorize request and the code_verifier on the token exchange. Works whether the provider has PKCE optional or required (fixes login against providers that require PKCE, e.g. Pocket ID).
168 lines
10 KiB
TypeScript
168 lines
10 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const dashboard: TranslationStrings = {
|
||
'dashboard.title': 'Мои поездки',
|
||
'dashboard.subtitle.loading': 'Загрузка поездок...',
|
||
'dashboard.subtitle.trips': '{count} поездок ({archived} в архиве)',
|
||
'dashboard.subtitle.empty': 'Начните свою первую поездку',
|
||
'dashboard.subtitle.activeOne': '{count} активная поездка',
|
||
'dashboard.subtitle.activeMany': '{count} активных поездок',
|
||
'dashboard.subtitle.archivedSuffix': ' · {count} в архиве',
|
||
'dashboard.newTrip': 'Новая поездка',
|
||
'dashboard.newTripSub': 'Спланируйте новую поездку с нуля',
|
||
'dashboard.gridView': 'Плитка',
|
||
'dashboard.listView': 'Список',
|
||
'dashboard.currency': 'Валюта',
|
||
'dashboard.timezone': 'Часовые пояса',
|
||
'dashboard.localTime': 'Местное',
|
||
'dashboard.timezoneCustomTitle': 'Свой часовой пояс',
|
||
'dashboard.timezoneCustomLabelPlaceholder': 'Название (необязательно)',
|
||
'dashboard.timezoneCustomTzPlaceholder': 'напр. America/New_York',
|
||
'dashboard.timezoneCustomAdd': 'Добавить',
|
||
'dashboard.timezoneCustomErrorEmpty': 'Введите идентификатор часового пояса',
|
||
'dashboard.timezoneCustomErrorInvalid':
|
||
'Неверный часовой пояс. Используйте формат Europe/Berlin',
|
||
'dashboard.timezoneCustomErrorDuplicate': 'Уже добавлен',
|
||
'dashboard.emptyTitle': 'Нет поездок',
|
||
'dashboard.emptyText': 'Создайте свою первую поездку и начните планировать!',
|
||
'dashboard.emptyButton': 'Создать первую поездку',
|
||
'dashboard.nextTrip': 'Следующая поездка',
|
||
'dashboard.shared': 'Общая',
|
||
'dashboard.sharedBy': 'Поделился {name}',
|
||
'dashboard.days': 'Дни',
|
||
'dashboard.places': 'Места',
|
||
'dashboard.members': 'Попутчики',
|
||
'dashboard.archive': 'Архивировать',
|
||
'dashboard.copyTrip': 'Копировать',
|
||
'dashboard.copySuffix': 'копия',
|
||
'dashboard.restore': 'Восстановить',
|
||
'dashboard.archived': 'В архиве',
|
||
'dashboard.status.ongoing': 'В процессе',
|
||
'dashboard.status.today': 'Сегодня',
|
||
'dashboard.status.tomorrow': 'Завтра',
|
||
'dashboard.status.past': 'Прошло',
|
||
'dashboard.status.daysLeft': 'осталось {count} дн.',
|
||
'dashboard.toast.loadError': 'Не удалось загрузить поездки',
|
||
'dashboard.toast.created': 'Поездка создана!',
|
||
'dashboard.toast.createError': 'Не удалось создать поездку',
|
||
'dashboard.toast.updated': 'Поездка обновлена!',
|
||
'dashboard.toast.updateError': 'Не удалось обновить поездку',
|
||
'dashboard.toast.deleted': 'Поездка удалена',
|
||
'dashboard.toast.deleteError': 'Не удалось удалить поездку',
|
||
'dashboard.toast.archived': 'Поездка архивирована',
|
||
'dashboard.toast.archiveError': 'Не удалось архивировать поездку',
|
||
'dashboard.toast.restored': 'Поездка восстановлена',
|
||
'dashboard.toast.restoreError': 'Не удалось восстановить поездку',
|
||
'dashboard.toast.copied': 'Поездка скопирована!',
|
||
'dashboard.toast.copyError': 'Не удалось скопировать поездку',
|
||
'dashboard.confirm.delete':
|
||
'Удалить поездку «{title}»? Все места и планы будут безвозвратно удалены.',
|
||
'dashboard.editTrip': 'Редактировать поездку',
|
||
'dashboard.createTrip': 'Создать новую поездку',
|
||
'dashboard.tripTitle': 'Название',
|
||
'dashboard.tripTitlePlaceholder': 'напр. Лето в Японии',
|
||
'dashboard.tripDescription': 'Описание',
|
||
'dashboard.tripDescriptionPlaceholder': 'О чём эта поездка?',
|
||
'dashboard.startDate': 'Дата начала',
|
||
'dashboard.endDate': 'Дата окончания',
|
||
'dashboard.dayCount': 'Количество дней',
|
||
'dashboard.dayCountHint':
|
||
'Сколько дней планировать, если даты поездки не указаны.',
|
||
'dashboard.noDateHint':
|
||
'Дата не указана — будет создано 7 дней по умолчанию. Вы можете изменить это в любое время.',
|
||
'dashboard.coverImage': 'Обложка',
|
||
'dashboard.addCoverImage': 'Добавить обложку',
|
||
'dashboard.addMembers': 'Попутчики',
|
||
'dashboard.addMember': 'Добавить участника',
|
||
'dashboard.coverSaved': 'Обложка сохранена',
|
||
'dashboard.coverUploadError': 'Ошибка загрузки',
|
||
'dashboard.coverRemoveError': 'Ошибка удаления',
|
||
'dashboard.titleRequired': 'Название обязательно',
|
||
'dashboard.endDateError': 'Дата окончания должна быть позже даты начала',
|
||
'dashboard.greeting.morning': 'Доброе утро,',
|
||
'dashboard.greeting.afternoon': 'Добрый день,',
|
||
'dashboard.greeting.evening': 'Добрый вечер,',
|
||
'dashboard.mobile.liveNow': 'Сейчас в пути',
|
||
'dashboard.mobile.tripProgress': 'Прогресс поездки',
|
||
'dashboard.mobile.daysLeft': 'осталось {count} дн.',
|
||
'dashboard.mobile.places': 'Места',
|
||
'dashboard.mobile.buddies': 'Попутчики',
|
||
'dashboard.mobile.newTrip': 'Новая поездка',
|
||
'dashboard.mobile.currency': 'Валюта',
|
||
'dashboard.mobile.timezone': 'Часовой пояс',
|
||
'dashboard.mobile.upcomingTrips': 'Предстоящие поездки',
|
||
'dashboard.mobile.yourTrips': 'Ваши поездки',
|
||
'dashboard.mobile.trips': 'поездок',
|
||
'dashboard.mobile.starts': 'Начало',
|
||
'dashboard.mobile.duration': 'Продолжительность',
|
||
'dashboard.mobile.day': 'день',
|
||
'dashboard.mobile.days': 'дней',
|
||
'dashboard.mobile.ongoing': 'В процессе',
|
||
'dashboard.mobile.startsToday': 'Начинается сегодня',
|
||
'dashboard.mobile.tomorrow': 'Завтра',
|
||
'dashboard.mobile.inDays': 'Через {count} дн.',
|
||
'dashboard.mobile.inMonths': 'Через {count} мес.',
|
||
'dashboard.mobile.completed': 'Завершено',
|
||
'dashboard.mobile.currencyConverter': 'Конвертер валют',
|
||
'dashboard.filter.planned': 'Запланированные',
|
||
'dashboard.hero.badgeLive': 'СЕЙЧАС В ПУТИ',
|
||
'dashboard.hero.badgeToday': 'НАЧИНАЕТСЯ СЕГОДНЯ',
|
||
'dashboard.hero.badgeTomorrow': 'ЗАВТРА',
|
||
'dashboard.hero.badgeNext': 'ДАЛЕЕ',
|
||
'dashboard.hero.badgeRecent': 'НЕДАВНО',
|
||
'dashboard.hero.tripDates': 'Даты поездки',
|
||
'dashboard.hero.noDates': 'Даты не заданы',
|
||
'dashboard.hero.travelerOne': '{count} путешественник',
|
||
'dashboard.hero.travelerMany': '{count} путешественников',
|
||
'dashboard.hero.destinationOne': '{count} направление',
|
||
'dashboard.hero.destinationMany': '{count} направлений',
|
||
'dashboard.hero.dayUnitOne': 'день',
|
||
'dashboard.hero.dayUnitMany': 'дн.',
|
||
'dashboard.hero.dayLeft': 'День остался',
|
||
'dashboard.hero.daysLeft': 'Дней осталось',
|
||
'dashboard.hero.lastDay': 'Последний день',
|
||
'dashboard.hero.untilStart': 'До начала',
|
||
'dashboard.hero.startsIn': 'Старт через',
|
||
'dashboard.atlas.countriesVisited': 'Атлас · Посещённые страны',
|
||
'dashboard.atlas.ofTotal': 'из {total}',
|
||
'dashboard.atlas.tripsTotal': 'Всего поездок',
|
||
'dashboard.atlas.placesMapped': '{count} мест на карте',
|
||
'dashboard.atlas.daysTraveled': 'Дней в пути',
|
||
'dashboard.atlas.daysUnit': 'дн.',
|
||
'dashboard.atlas.acrossAllTrips': 'по всем поездкам',
|
||
'dashboard.atlas.distanceFlown': 'Пройдено по воздуху',
|
||
'dashboard.atlas.kmUnit': 'km',
|
||
'dashboard.atlas.aroundEquator': '≈ {count}× вокруг экватора',
|
||
'dashboard.card.idea': 'Идея',
|
||
'dashboard.card.buddyOne': 'Попутчик',
|
||
'dashboard.fx.from': 'Из',
|
||
'dashboard.fx.to': 'В',
|
||
'dashboard.fx.unavailable': 'Курс недоступен',
|
||
'dashboard.tz.searchPlaceholder': 'Поиск часового пояса…',
|
||
'dashboard.tz.empty': 'Других часовых поясов пока нет — добавьте с помощью +',
|
||
'dashboard.upcoming.title': 'Ближайшие брони',
|
||
'dashboard.upcoming.empty': 'Пока ничего не забронировано.',
|
||
'dashboard.confirm.copy.title': 'Скопировать эту поездку?',
|
||
'dashboard.confirm.copy.willCopy': 'Будет скопировано',
|
||
'dashboard.confirm.copy.will1': 'Дни, места и распределение по дням',
|
||
'dashboard.confirm.copy.will2': 'Жильё и брони',
|
||
'dashboard.confirm.copy.will3': 'Статьи бюджета и порядок категорий',
|
||
'dashboard.confirm.copy.will4': 'Списки вещей (без отметок)',
|
||
'dashboard.confirm.copy.will5': 'Задачи (без назначений и отметок)',
|
||
'dashboard.confirm.copy.will6': 'Заметки дня',
|
||
'dashboard.confirm.copy.wontCopy': 'Не будет скопировано',
|
||
'dashboard.confirm.copy.wont1': 'Участники и назначения',
|
||
'dashboard.confirm.copy.wont2': 'Совместные заметки, опросы и сообщения',
|
||
'dashboard.confirm.copy.wont3': 'Файлы и фото',
|
||
'dashboard.confirm.copy.wont4': 'Токены доступа',
|
||
'dashboard.confirm.copy.confirm': 'Копировать поездку',
|
||
'dashboard.aria.toggleView': 'Переключить вид',
|
||
'dashboard.aria.filter': 'Фильтр',
|
||
'dashboard.aria.duplicate': 'Дублировать',
|
||
'dashboard.aria.refreshRates': 'Обновить курсы',
|
||
'dashboard.aria.swapCurrencies': 'Поменять валюты',
|
||
'dashboard.aria.addTimezone': 'Добавить часовой пояс',
|
||
'dashboard.aria.removeTimezone': 'Удалить {city}',
|
||
};
|
||
export default dashboard;
|