mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-23 23:31:47 +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).
166 lines
7.8 KiB
TypeScript
166 lines
7.8 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': '剩 1 天',
|
|
'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;
|