From 2b8d2e790f80cf5d9eeb0292a078a47c5f222b02 Mon Sep 17 00:00:00 2001 From: Maurice Date: Tue, 20 Oct 2026 17:51:27 +0200 Subject: [PATCH] chore(shared): format the tours and wanderer locale and spec files --- shared/src/i18n/ja/tours.ts | 24 ++++++++++++------- shared/src/i18n/ja/wandererWatch.ts | 15 ++++++++---- shared/src/i18n/ko/tours.ts | 21 ++++++++++------ shared/src/i18n/ko/wandererWatch.ts | 15 ++++++++---- shared/src/i18n/th/tours.ts | 6 +++-- shared/src/i18n/zh-TW/tours.ts | 9 ++++--- shared/src/i18n/zh-TW/wandererWatch.ts | 3 ++- shared/src/i18n/zh/tours.ts | 9 ++++--- shared/src/i18n/zh/wandererWatch.ts | 3 ++- shared/src/tours/tour-activity.schema.spec.ts | 8 ++++++- shared/src/tours/tour-stages.spec.ts | 4 +++- .../src/tours/tour-trail-grade.schema.spec.ts | 6 ++--- shared/src/tours/tours.schema.test.ts | 12 ++++++---- .../wanderer/wanderer-watch.schema.spec.ts | 6 ++--- 14 files changed, 93 insertions(+), 48 deletions(-) diff --git a/shared/src/i18n/ja/tours.ts b/shared/src/i18n/ja/tours.ts index c8edd7a5c..dd1ad9cee 100644 --- a/shared/src/i18n/ja/tours.ts +++ b/shared/src/i18n/ja/tours.ts @@ -426,7 +426,8 @@ const tours: TranslationStrings = { 'tours.run.profileHint.running': '街中や公園、川沿いの走りやすい、なるべく舗装された道を優先します。', 'tours.run.pace': '予定ペース', 'tours.run.paceInfoLabel': '走行時間の計算方法', - 'tours.run.paceInfo': '1 kmあたりのあなた自身のペースです。走行時間は距離 × ペースで、登り、下り、技術的な難しさは含みません。', + 'tours.run.paceInfo': + '1 kmあたりのあなた自身のペースです。走行時間は距離 × ペースで、登り、下り、技術的な難しさは含みません。', 'tours.run.paceUnit': '分/km', 'tours.run.paceUnitMi': '分/mi', 'tours.run.paceInvalid': 'ペースは km あたり 分:秒 で、{fastest} から {slowest} の間で入力してください。', @@ -435,7 +436,8 @@ const tours: TranslationStrings = { 'tours.run.timeEstimated': '走行時間 (予定)', 'tours.run.timeEstimatedShort': '走行時間', 'tours.run.timeEstimatedInfoLabel': '走行時間の計画方法', - 'tours.run.timeEstimatedInfo': '距離 × あなたのペースのみで、登り、下り、難しさは含みません。記録された時間ではなく計画です。', + 'tours.run.timeEstimatedInfo': + '距離 × あなたのペースのみで、登り、下り、難しさは含みません。記録された時間ではなく計画です。', 'tours.run.timeSum': '{distance} を {pace} で {time}', 'tours.run.profile.trail': 'トレイルランニング', 'tours.run.profileHint.trail': '林道や自然の小道を優先し、山道 (T2) まで含みます。', @@ -506,7 +508,8 @@ const tours: TranslationStrings = { 'tours.hike.ways.unasked': '今回は問い合わせできませんでした', 'tours.hike.ways.unknown': '不明', 'tours.hike.sac.stepTip': 'SACハイキングスケール {step}、OpenStreetMapより: sac_scale={tag}', - 'tours.hike.sac.untaggedTip': 'OpenStreetMapはこれらの道にsac_scaleを付けていません。不明は易しいという意味ではありません。', + 'tours.hike.sac.untaggedTip': + 'OpenStreetMapはこれらの道にsac_scaleを付けていません。不明は易しいという意味ではありません。', 'tours.hike.sac.unclearTip': 'OpenStreetMapはここに{tags}と記載しており、単一の段階を示していません。', 'tours.hike.ways.unmatchedTip': 'ここではツアーの線の下に明確に道がないため、何も表示されません。', 'tours.hike.ways.unaskedTip': @@ -1087,10 +1090,12 @@ const tours: TranslationStrings = { 'tours.planner.namePlaceholder.horse': '名前のない乗馬ツアー', 'tours.horse.time': '乗馬時間', 'tours.horse.timeInfoLabel': '乗馬時間がない理由', - 'tours.horse.timeInfo': 'TREK は乗馬時間を計算しません。ペースは馬と乗り手しだいです。必要なら予定の合計時間をご自身で入力してください。', + 'tours.horse.timeInfo': + 'TREK は乗馬時間を計算しません。ペースは馬と乗り手しだいです。必要なら予定の合計時間をご自身で入力してください。', 'tours.horse.routes.title': '乗馬ルート', 'tours.horse.routes.infoLabel': '乗馬ルートについて', - 'tours.horse.routes.info': 'OpenStreetMap の標識付き乗馬ルートを、まるごと取り込む区間ごとに表示します。ルートに含まれていても、乗馬が許可されているとは限りません。', + 'tours.horse.routes.info': + 'OpenStreetMap の標識付き乗馬ルートを、まるごと取り込む区間ごとに表示します。ルートに含まれていても、乗馬が許可されているとは限りません。', 'tours.horse.routes.search': '地図の表示範囲で探す', 'tours.horse.routes.searchAgain': 'この範囲を検索', 'tours.horse.routes.loading': '乗馬ルートを検索中…', @@ -1118,7 +1123,8 @@ const tours: TranslationStrings = { 'tours.horse.dialog.joinGapHint': '直線で引かれ、未確認', 'tours.horse.dialog.adopt': '区間を取り込む', 'tours.horse.access.title': '乗馬でのアクセス', - 'tours.horse.access.note': 'OpenStreetMap が道沿いに horse=* として記録している情報です。データが欠けていたり古かったりすることがあり、現地の標識が優先されます。', + 'tours.horse.access.note': + 'OpenStreetMap が道沿いに horse=* として記録している情報です。データが欠けていたり古かったりすることがあり、現地の標識が優先されます。', 'tours.horse.access.closedNotice': 'この区間の一部は、馬について通行禁止または私有地として記録されています。', 'tours.horse.access.value.designated': '乗馬専用', 'tours.horse.access.value.yes': '許可', @@ -1172,7 +1178,8 @@ const tours: TranslationStrings = { 'tours.activity.execution': '実施日', 'tours.activity.track': '記録', 'tours.activity.importGpx': 'GPXをインポート', - 'tours.activity.noCandidates': 'このトリップにはまだリンクできるトラックがありません。GPXファイルをインポートしてください。', + 'tours.activity.noCandidates': + 'このトリップにはまだリンクできるトラックがありません。GPXファイルをインポートしてください。', 'tours.activity.replaces': 'この日の{name}を置き換えます', 'tours.activity.confirm': 'リンク', 'tours.activity.refused.activity_track_not_recorded': '上書きで計画されていないインポートのみリンクできます', @@ -1238,7 +1245,8 @@ const tours: TranslationStrings = { 'tours.stages.title': 'ステージ', 'tours.stages.count': '{count} ステージ', 'tours.stages.overDay': '移動だけで1日を超えます', - 'tours.stages.timeInfo': 'ステージごとの移動時間で、休憩は含みません。自転車ツアーと街歩きでは、ルート計算の時間を距離で按分します。', + 'tours.stages.timeInfo': + 'ステージごとの移動時間で、休憩は含みません。自転車ツアーと街歩きでは、ルート計算の時間を距離で按分します。', 'tours.stages.lost': '{count} 件のステージ終点が地点とともに消えたため、それらのステージは結合されました。', 'tours.stages.toDayTitle': '日帰りツアーにしますか?', 'tours.stages.toDayBody': '{count} 件のステージ終点を外します。ルートはそのままで、元に戻すで復元できます。', diff --git a/shared/src/i18n/ja/wandererWatch.ts b/shared/src/i18n/ja/wandererWatch.ts index 98ad664e2..352b23d09 100644 --- a/shared/src/i18n/ja/wandererWatch.ts +++ b/shared/src/i18n/ja/wandererWatch.ts @@ -12,9 +12,11 @@ const wandererWatch: TranslationStrings = { 'wanderer.watch.lastRun': '最終確認 {date}', 'wanderer.watch.neverRun': 'まだ確認していません', 'wanderer.watch.paused': '{time} まで一時停止', - 'wanderer.watch.pausedHint': 'wanderer から応答がありませんでした。失敗するたびに TREK は次の問い合わせまでの間隔を長くします。', + 'wanderer.watch.pausedHint': + 'wanderer から応答がありませんでした。失敗するたびに TREK は次の問い合わせまでの間隔を長くします。', 'wanderer.watch.blocked': 'トークンが拒否されました', - 'wanderer.watch.blockedHint': 'wanderer が API トークンを拒否しました。接続テストに成功するか新しいトークンを保存すると確認を再開します。', + 'wanderer.watch.blockedHint': + 'wanderer が API トークンを拒否しました。接続テストに成功するか新しいトークンを保存すると確認を再開します。', 'wanderer.watch.hints': 'お知らせ', 'wanderer.watch.hintsCount': '未対応のお知らせ {count} 件', 'wanderer.watch.empty': '未対応のお知らせはありません', @@ -25,9 +27,12 @@ const wandererWatch: TranslationStrings = { 'wanderer.watch.state.possible_change': '変更の可能性', 'wanderer.watch.state.changed': '変更あり', 'wanderer.watch.state.unverifiable': '確認できません', - 'wanderer.watch.stateHint.possible_change': 'wanderer でトレイルのタイムスタンプが変わりました。内容が違うかどうかはソース確認でしか分かりません。', - 'wanderer.watch.stateHint.changed': 'wanderer の記録で名前または説明が変わっています。変更内容のすべてはソース確認で表示されます。', - 'wanderer.watch.stateHint.unverifiable': 'TREK はこのトレイルを判断できなかったため、変更の有無については何も示しません。', + 'wanderer.watch.stateHint.possible_change': + 'wanderer でトレイルのタイムスタンプが変わりました。内容が違うかどうかはソース確認でしか分かりません。', + 'wanderer.watch.stateHint.changed': + 'wanderer の記録で名前または説明が変わっています。変更内容のすべてはソース確認で表示されます。', + 'wanderer.watch.stateHint.unverifiable': + 'TREK はこのトレイルを判断できなかったため、変更の有無については何も示しません。', 'wanderer.watch.reason.unavailable': 'トレイルにアクセスできません', 'wanderer.watch.reason.no_change_time': 'タイムスタンプなし', }; diff --git a/shared/src/i18n/ko/tours.ts b/shared/src/i18n/ko/tours.ts index 6cbeb1ee3..9c2175eb6 100644 --- a/shared/src/i18n/ko/tours.ts +++ b/shared/src/i18n/ko/tours.ts @@ -424,7 +424,8 @@ const tours: TranslationStrings = { 'tours.run.profileHint.running': '시내, 공원, 강변의 달리기 좋은, 되도록 포장된 길을 우선합니다.', 'tours.run.pace': '계획 페이스', 'tours.run.paceInfoLabel': '달리기 시간 계산 방법', - 'tours.run.paceInfo': '킬로미터당 나만의 페이스입니다. 달리기 시간은 거리 × 페이스이며, 오르막, 내리막, 기술적 난이도는 포함되지 않습니다.', + 'tours.run.paceInfo': + '킬로미터당 나만의 페이스입니다. 달리기 시간은 거리 × 페이스이며, 오르막, 내리막, 기술적 난이도는 포함되지 않습니다.', 'tours.run.paceUnit': '분/km', 'tours.run.paceUnitMi': '분/mi', 'tours.run.paceInvalid': '페이스를 km당 분:초로, {fastest}에서 {slowest} 사이로 입력하세요.', @@ -433,7 +434,8 @@ const tours: TranslationStrings = { 'tours.run.timeEstimated': '달리기 시간 (계획)', 'tours.run.timeEstimatedShort': '달리기 시간', 'tours.run.timeEstimatedInfoLabel': '달리기 시간 계획 방법', - 'tours.run.timeEstimatedInfo': '거리 × 나의 페이스뿐이며, 오르막, 내리막, 난이도는 포함되지 않습니다. 기록된 시간이 아니라 계획입니다.', + 'tours.run.timeEstimatedInfo': + '거리 × 나의 페이스뿐이며, 오르막, 내리막, 난이도는 포함되지 않습니다. 기록된 시간이 아니라 계획입니다.', 'tours.run.timeSum': '{distance}, {pace} 페이스로 {time}', 'tours.run.profile.trail': '트레일 러닝', 'tours.run.profileHint.trail': '임도와 자연 오솔길을 우선하며, 산길(T2)까지 포함합니다.', @@ -1083,10 +1085,12 @@ const tours: TranslationStrings = { 'tours.planner.namePlaceholder.horse': '이름 없는 승마 투어', 'tours.horse.time': '승마 시간', 'tours.horse.timeInfoLabel': '승마 시간이 없는 이유', - 'tours.horse.timeInfo': 'TREK은 승마 시간을 계산하지 않습니다. 속도는 말과 기수에 달려 있습니다. 원하면 예정 총 시간을 직접 입력하세요.', + 'tours.horse.timeInfo': + 'TREK은 승마 시간을 계산하지 않습니다. 속도는 말과 기수에 달려 있습니다. 원하면 예정 총 시간을 직접 입력하세요.', 'tours.horse.routes.title': '승마 루트', 'tours.horse.routes.infoLabel': '승마 루트 안내', - 'tours.horse.routes.info': 'OpenStreetMap의 표지가 있는 승마 루트를 통째로 가져오는 구간 단위로 보여 줍니다. 루트에 속한다고 해서 말을 타도 된다는 뜻은 아닙니다.', + 'tours.horse.routes.info': + 'OpenStreetMap의 표지가 있는 승마 루트를 통째로 가져오는 구간 단위로 보여 줍니다. 루트에 속한다고 해서 말을 타도 된다는 뜻은 아닙니다.', 'tours.horse.routes.search': '지도 화면에서 찾기', 'tours.horse.routes.searchAgain': '이 화면 검색', 'tours.horse.routes.loading': '승마 루트를 찾는 중…', @@ -1094,7 +1098,8 @@ const tours: TranslationStrings = { 'tours.horse.routes.offline': '승마 루트에는 연결이 필요합니다.', 'tours.horse.routes.failed': '승마 루트를 읽지 못했습니다. 투어는 그대로입니다.', 'tours.horse.routes.none': '이 화면에는 표지가 있는 승마 루트가 없습니다.', - 'tours.horse.routes.truncated': '이곳에는 한 번의 검색으로 보이는 것보다 많은 루트가 있습니다. 모두 보려면 확대하세요.', + 'tours.horse.routes.truncated': + '이곳에는 한 번의 검색으로 보이는 것보다 많은 루트가 있습니다. 모두 보려면 확대하세요.', 'tours.horse.routes.unnamed': '이름 없는 승마 루트', 'tours.horse.routes.sections': '구간', 'tours.horse.routes.continues': '화면 밖으로 이어짐', @@ -1114,7 +1119,8 @@ const tours: TranslationStrings = { 'tours.horse.dialog.joinGapHint': '직선으로 그었고 확인되지 않음', 'tours.horse.dialog.adopt': '구간 가져오기', 'tours.horse.access.title': '말 통행', - 'tours.horse.access.note': 'OpenStreetMap이 길을 따라 horse=*로 기록한 내용입니다. 데이터가 없거나 오래되었을 수 있으니 현장 표지판을 따르세요.', + 'tours.horse.access.note': + 'OpenStreetMap이 길을 따라 horse=*로 기록한 내용입니다. 데이터가 없거나 오래되었을 수 있으니 현장 표지판을 따르세요.', 'tours.horse.access.closedNotice': '이 구간의 일부는 말에게 통행 금지 또는 사유지로 기록되어 있습니다.', 'tours.horse.access.value.designated': '승마 전용', 'tours.horse.access.value.yes': '허용', @@ -1235,7 +1241,8 @@ const tours: TranslationStrings = { 'tours.stages.title': '구간', 'tours.stages.count': '{count}개 구간', 'tours.stages.overDay': '이동만 하루 이상', - 'tours.stages.timeInfo': '구간별 이동 시간이며 휴식은 포함하지 않습니다. 자전거 투어와 도시 산책은 경로 계산 시간을 거리에 따라 나눕니다.', + 'tours.stages.timeInfo': + '구간별 이동 시간이며 휴식은 포함하지 않습니다. 자전거 투어와 도시 산책은 경로 계산 시간을 거리에 따라 나눕니다.', 'tours.stages.lost': '구간 끝 {count}개가 지점과 함께 사라져 해당 구간이 합쳐졌습니다.', 'tours.stages.toDayTitle': '당일 투어로 바꿀까요?', 'tours.stages.toDayBody': '구간 끝 {count}개를 제거합니다. 경로는 그대로이며 실행 취소로 되돌릴 수 있습니다.', diff --git a/shared/src/i18n/ko/wandererWatch.ts b/shared/src/i18n/ko/wandererWatch.ts index 653bc2663..7dab1a07b 100644 --- a/shared/src/i18n/ko/wandererWatch.ts +++ b/shared/src/i18n/ko/wandererWatch.ts @@ -12,9 +12,11 @@ const wandererWatch: TranslationStrings = { 'wanderer.watch.lastRun': '마지막 확인 {date}', 'wanderer.watch.neverRun': '아직 확인하지 않음', 'wanderer.watch.paused': '{time}까지 일시 중지', - 'wanderer.watch.pausedHint': 'wanderer가 응답하지 않았습니다. 실패할 때마다 TREK은 다시 묻기 전에 더 오래 기다립니다.', + 'wanderer.watch.pausedHint': + 'wanderer가 응답하지 않았습니다. 실패할 때마다 TREK은 다시 묻기 전에 더 오래 기다립니다.', 'wanderer.watch.blocked': '토큰 거부됨', - 'wanderer.watch.blockedHint': 'wanderer가 API 토큰을 거부했습니다. 연결 테스트가 통과하거나 새 토큰을 저장하면 확인이 다시 시작됩니다.', + 'wanderer.watch.blockedHint': + 'wanderer가 API 토큰을 거부했습니다. 연결 테스트가 통과하거나 새 토큰을 저장하면 확인이 다시 시작됩니다.', 'wanderer.watch.hints': '알림', 'wanderer.watch.hintsCount': '열린 알림 {count}개', 'wanderer.watch.empty': '열린 알림이 없습니다', @@ -25,9 +27,12 @@ const wandererWatch: TranslationStrings = { 'wanderer.watch.state.possible_change': '바뀌었을 수 있음', 'wanderer.watch.state.changed': '변경됨', 'wanderer.watch.state.unverifiable': '확인 불가', - 'wanderer.watch.stateHint.possible_change': 'wanderer에서 트레일의 타임스탬프가 바뀌었습니다. 내용이 다른지는 소스 확인으로만 알 수 있습니다.', - 'wanderer.watch.stateHint.changed': 'wanderer 기록에 다른 이름이나 설명이 있습니다. 소스 확인에서 바뀐 내용을 모두 볼 수 있습니다.', - 'wanderer.watch.stateHint.unverifiable': 'TREK이 이 트레일을 판단할 수 없어 변경 여부에 대해 아무것도 말하지 않습니다.', + 'wanderer.watch.stateHint.possible_change': + 'wanderer에서 트레일의 타임스탬프가 바뀌었습니다. 내용이 다른지는 소스 확인으로만 알 수 있습니다.', + 'wanderer.watch.stateHint.changed': + 'wanderer 기록에 다른 이름이나 설명이 있습니다. 소스 확인에서 바뀐 내용을 모두 볼 수 있습니다.', + 'wanderer.watch.stateHint.unverifiable': + 'TREK이 이 트레일을 판단할 수 없어 변경 여부에 대해 아무것도 말하지 않습니다.', 'wanderer.watch.reason.unavailable': '트레일에 접근할 수 없음', 'wanderer.watch.reason.no_change_time': '타임스탬프 없음', }; diff --git a/shared/src/i18n/th/tours.ts b/shared/src/i18n/th/tours.ts index bc54ba693..2fa659464 100644 --- a/shared/src/i18n/th/tours.ts +++ b/shared/src/i18n/th/tours.ts @@ -530,9 +530,11 @@ const tours: TranslationStrings = { 'tours.hike.surface.other': 'พื้นผิวอื่น', 'tours.hike.surface.untagged': 'ไม่มีพื้นผิวใน OpenStreetMap', 'tours.hike.surface.unclear': 'พื้นผิวไม่ชัดเจน', - 'tours.hike.surface.untaggedTip': 'OpenStreetMap ไม่ได้บันทึกพื้นผิวของทางเหล่านี้ ระบบหาเส้นทางอาจสมมติขึ้นมา แต่นั่นไม่ใช่ค่าที่บันทึกไว้', + 'tours.hike.surface.untaggedTip': + 'OpenStreetMap ไม่ได้บันทึกพื้นผิวของทางเหล่านี้ ระบบหาเส้นทางอาจสมมติขึ้นมา แต่นั่นไม่ใช่ค่าที่บันทึกไว้', 'tours.hike.surface.knownTip': 'ส่วนของเส้นทางที่ OpenStreetMap บันทึกพื้นผิวไว้ ที่เหลือไม่ทราบ', - 'tours.hike.surface.source': 'พื้นผิวตามที่ OpenStreetMap บันทึก จัดเป็นกลุ่ม ไม่ใช้การตีความของระบบหาเส้นทางเอง ไม่ใช่การประเมินทาง', + 'tours.hike.surface.source': + 'พื้นผิวตามที่ OpenStreetMap บันทึก จัดเป็นกลุ่ม ไม่ใช้การตีความของระบบหาเส้นทางเอง ไม่ใช่การประเมินทาง', 'tours.hike.way.path': 'ทางเดิน', 'tours.hike.way.footway': 'ทางเท้า', 'tours.hike.way.steps': 'บันได', diff --git a/shared/src/i18n/zh-TW/tours.ts b/shared/src/i18n/zh-TW/tours.ts index 909e52173..3f890902a 100644 --- a/shared/src/i18n/zh-TW/tours.ts +++ b/shared/src/i18n/zh-TW/tours.ts @@ -382,7 +382,8 @@ const tours: TranslationStrings = { 'tours.ski.chooseDiscipline': '請選擇項目,以便將軌跡匯入為滑雪。', 'tours.ski.chooseTechnique': '請選擇技術,或選擇未知。', 'tours.ski.infoLabel': 'TREK 如何處理滑雪軌跡', - 'tours.ski.info': '保持記錄原樣,絕不重新規劃路線。距離和海拔來自檔案。TREK 不計算滑雪時間,軌跡和 3D 中的坡度顏色都不代表難度、積雪、雪崩或雪道是否開放。', + 'tours.ski.info': + '保持記錄原樣,絕不重新規劃路線。距離和海拔來自檔案。TREK 不計算滑雪時間,軌跡和 3D 中的坡度顏色都不代表難度、積雪、雪崩或雪道是否開放。', 'tours.ski.time': '滑雪時間', 'tours.ski.timeUnknown': '未計算', 'tours.ski.classifyTitle': '為滑雪軌跡分類', @@ -390,7 +391,8 @@ const tours: TranslationStrings = { 'tours.ski.saveFailed': '無法儲存分類。', 'tours.planner.tourTypeHint.run': '依你自己的配速步行,走適合跑步的道路', 'tours.planner.namePlaceholder.run': '未命名的跑步', - 'tours.planner.unreachable.run': '沒有適合跑步的道路能到達第 {point} 個點:路由器所知最近的道路在 {distance} 之外。請把該點移到道路上,或手動繪製到那裡的路段。', + 'tours.planner.unreachable.run': + '沒有適合跑步的道路能到達第 {point} 個點:路由器所知最近的道路在 {distance} 之外。請把該點移到道路上,或手動繪製到那裡的路段。', 'tours.run.profile': '類型', 'tours.run.profile.running': '跑步', 'tours.run.profileHint.running': '優先選擇市區、公園與河岸適合跑步、盡量鋪面的道路。', @@ -1032,7 +1034,8 @@ const tours: TranslationStrings = { 'tours.horse.timeInfo': 'TREK 不計算騎乘時間:節奏取決於馬和騎士。如有需要,請自行填寫計畫總時長。', 'tours.horse.routes.title': '騎馬路線', 'tours.horse.routes.infoLabel': '關於騎馬路線', - 'tours.horse.routes.info': '來自 OpenStreetMap 的有標示騎馬路線,按可整段採用的路段顯示。屬於某條路線並不代表允許在那裡騎馬。', + 'tours.horse.routes.info': + '來自 OpenStreetMap 的有標示騎馬路線,按可整段採用的路段顯示。屬於某條路線並不代表允許在那裡騎馬。', 'tours.horse.routes.search': '在地圖畫面中尋找', 'tours.horse.routes.searchAgain': '搜尋此畫面', 'tours.horse.routes.loading': '正在尋找騎馬路線…', diff --git a/shared/src/i18n/zh-TW/wandererWatch.ts b/shared/src/i18n/zh-TW/wandererWatch.ts index 3a3cd1936..e087b7e8b 100644 --- a/shared/src/i18n/zh-TW/wandererWatch.ts +++ b/shared/src/i18n/zh-TW/wandererWatch.ts @@ -3,7 +3,8 @@ import type { TranslationStrings } from '../types'; const wandererWatch: TranslationStrings = { 'wanderer.watch.label': '檢查我的路線是否有變更', 'wanderer.watch.hint': '匯入的路線可能已變更時通知你。', - 'wanderer.watch.info': 'TREK 每天最多讀取一次你匯入的每條路線的簡短紀錄,從不讀取其 GPX 檔案。它只會通知你:是否採用變更,由你透過行程的來源檢查自行決定。', + 'wanderer.watch.info': + 'TREK 每天最多讀取一次你匯入的每條路線的簡短紀錄,從不讀取其 GPX 檔案。它只會通知你:是否採用變更,由你透過行程的來源檢查自行決定。', 'wanderer.watch.notConnected': '請先連接 wanderer', 'wanderer.watch.on': '背景檢查已開啟', 'wanderer.watch.off': '背景檢查已關閉', diff --git a/shared/src/i18n/zh/tours.ts b/shared/src/i18n/zh/tours.ts index 7efb26345..e9e87925c 100644 --- a/shared/src/i18n/zh/tours.ts +++ b/shared/src/i18n/zh/tours.ts @@ -383,7 +383,8 @@ const tours: TranslationStrings = { 'tours.ski.chooseDiscipline': '请选择项目,以便将轨迹导入为滑雪。', 'tours.ski.chooseTechnique': '请选择技术,或选择未知。', 'tours.ski.infoLabel': 'TREK 如何处理滑雪轨迹', - 'tours.ski.info': '保持记录原样,绝不重新规划路线。距离和海拔来自文件。TREK 不计算滑雪用时,轨迹和 3D 中的坡度颜色都不代表难度、积雪、雪崩或雪道是否开放。', + 'tours.ski.info': + '保持记录原样,绝不重新规划路线。距离和海拔来自文件。TREK 不计算滑雪用时,轨迹和 3D 中的坡度颜色都不代表难度、积雪、雪崩或雪道是否开放。', 'tours.ski.time': '滑雪用时', 'tours.ski.timeUnknown': '未计算', 'tours.ski.classifyTitle': '为滑雪轨迹分类', @@ -391,7 +392,8 @@ const tours: TranslationStrings = { 'tours.ski.saveFailed': '无法保存分类。', 'tours.planner.tourTypeHint.run': '按你自己的配速步行,走适合跑步的道路', 'tours.planner.namePlaceholder.run': '未命名的跑步', - 'tours.planner.unreachable.run': '没有适合跑步的道路能到达第 {point} 个点:路由器知道的最近道路在 {distance} 之外。请把该点移到道路上,或手动绘制到那里的路段。', + 'tours.planner.unreachable.run': + '没有适合跑步的道路能到达第 {point} 个点:路由器知道的最近道路在 {distance} 之外。请把该点移到道路上,或手动绘制到那里的路段。', 'tours.run.profile': '类型', 'tours.run.profile.running': '跑步', 'tours.run.profileHint.running': '优先选择城市、公园和河边适合跑步、尽量铺装的道路。', @@ -1033,7 +1035,8 @@ const tours: TranslationStrings = { 'tours.horse.timeInfo': 'TREK 不计算骑行时间:节奏取决于马和骑手。如有需要,请自行填写计划总时长。', 'tours.horse.routes.title': '骑马路线', 'tours.horse.routes.infoLabel': '关于骑马路线', - 'tours.horse.routes.info': '来自 OpenStreetMap 的有标识骑马路线,按可整段采用的路段显示。属于某条路线并不等于允许在那里骑马。', + 'tours.horse.routes.info': + '来自 OpenStreetMap 的有标识骑马路线,按可整段采用的路段显示。属于某条路线并不等于允许在那里骑马。', 'tours.horse.routes.search': '在地图视图中查找', 'tours.horse.routes.searchAgain': '搜索此视图', 'tours.horse.routes.loading': '正在查找骑马路线…', diff --git a/shared/src/i18n/zh/wandererWatch.ts b/shared/src/i18n/zh/wandererWatch.ts index c7515ec3c..794063ef3 100644 --- a/shared/src/i18n/zh/wandererWatch.ts +++ b/shared/src/i18n/zh/wandererWatch.ts @@ -3,7 +3,8 @@ import type { TranslationStrings } from '../types'; const wandererWatch: TranslationStrings = { 'wanderer.watch.label': '检查我的路线是否有变化', 'wanderer.watch.hint': '导入的路线可能已变化时通知你。', - 'wanderer.watch.info': 'TREK 每天最多读取一次你导入的每条路线的简短记录,从不读取其 GPX 文件。它只会通知你:是否采纳变化,由你通过行程的来源检查自行决定。', + 'wanderer.watch.info': + 'TREK 每天最多读取一次你导入的每条路线的简短记录,从不读取其 GPX 文件。它只会通知你:是否采纳变化,由你通过行程的来源检查自行决定。', 'wanderer.watch.notConnected': '请先连接 wanderer', 'wanderer.watch.on': '后台检查已开启', 'wanderer.watch.off': '后台检查已关闭', diff --git a/shared/src/tours/tour-activity.schema.spec.ts b/shared/src/tours/tour-activity.schema.spec.ts index ade03e80e..198eba2a4 100644 --- a/shared/src/tours/tour-activity.schema.spec.ts +++ b/shared/src/tours/tour-activity.schema.spec.ts @@ -8,7 +8,13 @@ const activity = { assignment_id: 12, day_id: 3, assigned_at: '2026-07-02T18:00:00Z', - track: { place_id: 9, name: 'Watch export', origin: 'gpx', file_name: 'morning.gpx', imported_at: '2026-07-02 17:58:00' }, + track: { + place_id: 9, + name: 'Watch export', + origin: 'gpx', + file_name: 'morning.gpx', + imported_at: '2026-07-02 17:58:00', + }, metrics: { distance_km: 12.4, elevation_gain_m: 640, diff --git a/shared/src/tours/tour-stages.spec.ts b/shared/src/tours/tour-stages.spec.ts index c96e77342..6c9ab86fd 100644 --- a/shared/src/tours/tour-stages.spec.ts +++ b/shared/src/tours/tour-stages.spec.ts @@ -192,6 +192,8 @@ describe('MDT-01 tour stages', () => { expect(tourListItemSchema.parse({ ...item, stage_stops: null }).stage_stops).toBeNull(); expect(tourListItemSchema.parse(item).stage_stops).toBeUndefined(); expect(tourListItemSchema.safeParse({ ...item, stage_stops: [stops[0]] }).success).toBe(false); - expect(tourListItemSchema.safeParse({ ...item, stage_stops: [{ ...stops[0], key: '' }, stops[1]] }).success).toBe(false); + expect(tourListItemSchema.safeParse({ ...item, stage_stops: [{ ...stops[0], key: '' }, stops[1]] }).success).toBe( + false, + ); }); }); diff --git a/shared/src/tours/tour-trail-grade.schema.spec.ts b/shared/src/tours/tour-trail-grade.schema.spec.ts index f6af3d0db..323058e51 100644 --- a/shared/src/tours/tour-trail-grade.schema.spec.ts +++ b/shared/src/tours/tour-trail-grade.schema.spec.ts @@ -53,9 +53,9 @@ describe('tour trail grades (BIK-05, MAP-03, MAP-04)', () => { const written = tourTrailGradeSchema.parse({ ...grade, surface: 'fine_gravel', highway: 'path' }); expect(written).toMatchObject({ surface: 'fine_gravel', highway: 'path' }); expect(tourTrailGradeSchema.safeParse({ ...grade, surface: '' }).success).toBe(false); - expect( - tourTrailGradeSchema.safeParse({ ...grade, highway: 'x'.repeat(OSM_TAG_VALUE_MAX + 1) }).success, - ).toBe(false); + expect(tourTrailGradeSchema.safeParse({ ...grade, highway: 'x'.repeat(OSM_TAG_VALUE_MAX + 1) }).success).toBe( + false, + ); expect(tourTrailGradeSchema.safeParse({ ...grade, surface: undefined }).success).toBe(false); }); }); diff --git a/shared/src/tours/tours.schema.test.ts b/shared/src/tours/tours.schema.test.ts index 1cf7fa742..3ed089f24 100644 --- a/shared/src/tours/tours.schema.test.ts +++ b/shared/src/tours/tours.schema.test.ts @@ -618,11 +618,13 @@ describe('runs (RUN-01)', () => { }); it('saves a trail run like any run, with its own profile and the same pace (RUN-02)', () => { - expect(tourCreateRequestSchema.parse({ ...run, run_profile: 'trail', run_pace_seconds_per_km: 450 })).toMatchObject({ - tour_type: 'run', - run_profile: 'trail', - run_pace_seconds_per_km: 450, - }); + expect(tourCreateRequestSchema.parse({ ...run, run_profile: 'trail', run_pace_seconds_per_km: 450 })).toMatchObject( + { + tour_type: 'run', + run_profile: 'trail', + run_pace_seconds_per_km: 450, + }, + ); expect(tourGpxImportFieldsSchema.parse({ tour_type: 'run', run_profile: 'trail' }).run_profile).toBe('trail'); expect(() => tourCreateRequestSchema.parse({ ...baseRequest, run_profile: 'trail' })).toThrow(/belongs to a run/); }); diff --git a/shared/src/wanderer/wanderer-watch.schema.spec.ts b/shared/src/wanderer/wanderer-watch.schema.spec.ts index 4b7f7dfe1..8f8835476 100644 --- a/shared/src/wanderer/wanderer-watch.schema.spec.ts +++ b/shared/src/wanderer/wanderer-watch.schema.spec.ts @@ -19,9 +19,9 @@ const hint = { describe('wanderer watch contract (WAN-02)', () => { it('tells a possible change, a proven one and a source that could not be judged apart, and nothing else', () => { expect(tourSourceHintSchema.parse(hint)).toEqual(hint); - expect(tourSourceHintSchema.safeParse({ ...hint, state: 'changed', changes: ['name', 'description'] }).success).toBe( - true, - ); + expect( + tourSourceHintSchema.safeParse({ ...hint, state: 'changed', changes: ['name', 'description'] }).success, + ).toBe(true); expect(tourSourceHintSchema.safeParse({ ...hint, state: 'unverifiable', reason: 'no_change_time' }).success).toBe( true, );