diff --git a/src/i18n/ja/batch4.ts b/src/i18n/ja/batch4.ts new file mode 100644 index 0000000..5c3a8e9 --- /dev/null +++ b/src/i18n/ja/batch4.ts @@ -0,0 +1,617 @@ +/** + * Japanese (日本語) — batch 4: labels (features, categories, status), fees + * (featured placement + Pro receipts) and physical cards. + * + * Trick names and core skate vocabulary stay English/katakana + * (スポット, ショップ, パーク, ボウル, デッキ, トラック, ウィール, ベアリング, + * グリップテープ, クルー, Stash, The Lab, Nostr, Lightning, Zap, sats). + */ +const jaBatch4 = { + labelsUi: { + spotCategory: { + street: { + label: 'ストリート', + description: '偶然見つけたスポット、街の地形', + }, + transition: { + label: 'トランジション', + description: 'カーブ/ランプの路面', + }, + park: { + label: 'パーク', + description: '整備されたスケートパーク', + }, + plaza: { + label: 'プラザ', + description: '都市のプラザ(MACBA、Love Parkなど)', + }, + }, + spotFeature: { + wallrides: 'ウォールライド', + stairs: '階段 & ハンドレール', + rails: 'レール', + ledges: 'レッジ & カーブ', + gaps: 'ギャップ', + flatground: 'フラットグラウンド', + 'manual-pads': 'マニュアルパッド', + 'half-pipes': 'ハーフパイプ', + 'quarter-pipes': 'クォーターパイプ', + 'mini-ramps': 'ミニランプ', + bowls: 'ボウル', + vert: 'ヴァートランプ', + 'mega-ramps': 'メガランプ', + hubbas: 'ハバ', + 'euro-gaps': 'ユーロギャップ', + banks: 'バンク', + 'spine-ramps': 'スパインランプ', + 'roll-ins': 'ロールイン', + hips: 'ヒップ', + volcano: 'ボルケーノ', + pyramids: 'ピラミッド / ファンボックス', + 'snake-runs': 'スネークラン', + 'pump-track': 'パンプトラックローラー', + 'flat-bars': 'フラットバー', + }, + spotType: { + street: 'ストリート', + transition: 'トランジション', + park: 'パーク', + plaza: 'プラザ', + wallrides: 'ウォールライド', + stairs: '階段 & ハンドレール', + rails: 'レール', + ledges: 'レッジ & カーブ', + gaps: 'ギャップ', + flatground: 'フラットグラウンド', + 'manual-pads': 'マニュアルパッド', + 'half-pipes': 'ハーフパイプ', + 'quarter-pipes': 'クォーターパイプ', + 'mini-ramps': 'ミニランプ', + bowls: 'ボウル', + vert: 'ヴァートランプ', + 'mega-ramps': 'メガランプ', + hubbas: 'ハバ', + 'euro-gaps': 'ユーロギャップ', + banks: 'バンク', + 'spine-ramps': 'スパインランプ', + 'roll-ins': 'ロールイン', + hips: 'ヒップ', + volcano: 'ボルケーノ', + pyramids: 'ピラミッド / ファンボックス', + 'snake-runs': 'スネークラン', + 'pump-track': 'パンプトラックローラー', + 'flat-bars': 'フラットバー', + diy: 'DIY', + rail: 'レール', + ledge: 'レッジ', + gap: 'ギャップ', + bowl: 'ボウル', + stall: 'ストール', + slappy: 'スラッピー', + }, + access: { + public: { + label: '公共 — 誰でも利用可', + }, + private: { + label: '私有地 — 許可が必要', + }, + locals: { + label: 'まず地元の人に確認', + }, + }, + shelter: { + outdoor: { + label: '屋外', + short: '屋外', + description: '完全に露出 — 雨で中止', + }, + partial: { + label: '一部屋根あり', + short: '一部屋根あり', + description: '一部の障害物は雨をしのげる', + }, + covered: { + label: '屋根あり', + short: '屋根あり', + description: '屋外だが屋根の下', + }, + indoor: { + label: '屋内', + short: '屋内', + description: '完全に屋内 — 雨でも晴れでも滑れる', + }, + }, + eventType: { + contest: 'コンテスト', + demo: 'デモ', + session: 'セッション', + workshop: 'ワークショップ', + premiere: 'プレミア', + tradeshow: 'トレードショー', + gameskate: 'ゲームオブスケート', + concert: '🎸 コンサート', + jam: '🎵 ジャム', + festival: '🎪 フェスティバル', + popup: '🎯 ポップアップ', + }, + gearCategory: { + deck: 'デッキ', + trucks: 'トラック', + wheels: 'ウィール', + bearings: 'ベアリング', + shoes: 'スケートシューズ', + clothing: 'ウェア', + protective: 'プロテクター', + stickers: 'ステッカー', + wax: 'ワックス', + tools: 'ツール', + griptape: 'グリップテープ', + rubbrick: 'ラブブリック', + }, + gearCondition: { + new: { + label: '新品', + description: '未使用、パッケージのまま', + }, + like_new: { + label: 'ほぼ新品', + description: 'ほとんど未使用、非常に良い状態', + }, + good: { + label: '良い', + description: '通常の使用感、機能は完璧', + }, + well_used: { + label: '使用感あり', + description: '傷みはあるがまだ使える', + }, + }, + priceType: { + fixed: { + label: '固定価格', + description: 'USDまたはsatsでの設定価格', + }, + free: { + label: '無料', + description: '譲ります', + }, + trade: { + label: '交換', + description: '交換相手を探しています', + }, + offer: { + label: 'オファー受付', + description: '価格は相談可', + }, + }, + listingType: { + selling: { + label: '出品中', + description: 'ギアを販売中', + }, + wtb: { + label: '購入希望', + description: '特定のギアを探しています', + }, + }, + tour: { + spotType: { + street: 'ストリート', + park: 'パーク', + diy: 'DIY', + transition: 'トランジション', + hidden: '隠れた名所', + }, + category: { + local: { + label: 'ローカルツアー', + description: 'あなたの街の隠れたスポットを案内', + }, + national: { + label: '国内ツアー', + description: '全国を巡るマルチシティのロードトリップ', + }, + international: { + label: 'インターナショナルツアー', + description: '複数の国をまたぐ冒険', + }, + destruction: { + label: 'ワールドデストラクション', + description: 'KOTRスタイルの世界チーム対抗戦', + }, + }, + }, + crew: { + vibe: { + street: 'ストリート', + transition: 'トランジション / ヴァート', + park: 'パーク', + diy: 'DIY', + cruising: 'クルージング / 撮影', + oldschool: 'オールドスクール', + allterrain: 'オールテレイン', + girls: '女子 / 女性', + youth: 'ユース / グラム', + adaptive: 'アダプティブ', + punk: 'パンク', + hiphop: 'ラップ / ヒップホップ', + }, + focus: { + mixed: 'ミックス / 総合', + builder: 'DIY & ビルダー', + photo: 'フォト & フィルム', + coaching: 'コーチング', + art: 'アート & デザイン', + music: 'バンド & ミュージック', + wellness: 'トレーニング & 理学療法', + }, + focusDescription: { + mixed: '普通のスケートクルー — クルーページにのみ表示されます。', + builder: 'DIY / パーク製作のクルー — The Labのビルダーにも表示されます。', + photo: '撮影、写真、編集のクルー — The Labのフォト & フィルムにも表示されます。', + coaching: 'コーチング / レッスンのクルー — The Labのコーチングにも表示されます。', + art: 'アート、デザイン、グラフィティ、タトゥーの集団 — The Labのアート & デザインにも表示されます。', + music: 'バンドや音楽集団 — The Labのミュージックにも表示されます。', + wellness: 'トレーニング、フィットネス、理学療法のクルー — The Labのトレーニングにも表示されます。', + }, + lookingFor: { + filmer: 'フィルマー', + photographer: 'フォトグラファー', + editor: 'ビデオ編集者', + coach: 'コーチ', + builder: 'ランプビルダー', + artist: 'アーティスト / デザイナー', + musician: 'ミュージシャン / バンド', + members: '新メンバー', + }, + role: { + filmer: 'フィルマー', + photographer: 'フォトグラファー', + editor: '編集者', + coach: 'コーチ', + builder: 'ビルダー', + artist: 'アーティスト', + graffiti: 'グラフィティ', + tattoo: 'タトゥー', + trainer: 'トレーナー', + musician: 'ミュージシャン', + judge: 'ジャッジ', + manager: 'チームマネージャー', + og: 'OG', + }, + }, + memberVisibility: { + public: { + label: '公開', + description: '誰でもこのクルーでのあなたを見られます — 公開クルーページとクルーメイト検索に表示されます。', + }, + crew: { + label: 'クルー限定', + description: '確認済みのクルーメイトと創設者だけがここであなたを見られます。それ以外の人には匿名の「隠れメンバー」として表示されます。注意: これはアプリレベルのプライバシーです — メンバーシップタグはリレー上に公開されたままですが、外部に表示されることはありません。', + }, + }, + tagCategory: { + features: { + name: '特徴', + description: '障害物と地形', + }, + surfaces: { + name: '路面', + description: '素材と質感', + }, + sizes: { + name: 'サイズ', + description: '寸法と規模', + }, + stairs: { + name: '階段数', + description: '階段の段数', + }, + vibes: { + name: '雰囲気', + description: '空気感とコンディション', + }, + location: { + name: '場所', + description: '場所の状況', + }, + tricks: { + name: 'トリック', + description: '特定のトリックに向く', + }, + }, + spotTagCategory: { + street: { + label: 'ストリート', + description: 'ストリートスポット — 階段、レール、レッジ', + }, + park: { + label: 'パーク', + description: 'スケートパーク — 公共または私有', + }, + diy: { + label: 'DIY', + description: 'DIY/手作りのスポット', + }, + plaza: { + label: 'プラザ', + description: 'スケートに優しい構造の公共プラザ', + }, + }, + status: { + active: { + label: '滑走可', + description: '問題なし — 滑ろう。', + }, + bust: { + label: '出禁リスク', + description: '追い出しリスク大 — 警備員か警察。', + }, + skate_stopped: { + label: 'スケート禁止', + description: 'ノブ/キャップあり、一部は滑走可。', + }, + closed: { + label: '閉鎖中', + description: '一時閉鎖 — 工事かイベント。', + }, + gone: { + label: '消滅', + description: '解体、舗装、または完全にフェンスで封鎖。', + }, + }, + price: { + free: 'FREE', + trade: '交換', + makeOffer: 'オファー受付', + offer: 'オファー', + }, + }, + feesUi: { + feeFeaturedEventLabel: '注目のイベント', + feeFeaturedEventDesc: 'SkateSpotsでイベントを注目掲載', + feeFeaturedEventBenefit: 'イベントページの上部にあなたのイベントが表示されます', + feeLabProfileLabel: 'Lab Proプロフィール', + feeLabProfileDesc: 'The Labでサービスを注目掲載', + feeLabProfileBenefit: 'Proバッジ + スケーターがThe Labを見るときの注目枠', + feeFeaturedShopLabel: '注目のショップ', + feeFeaturedShopDesc: 'マップとディレクトリでスケートショップを注目掲載', + feeFeaturedShopBenefit: '認証バッジ + マップ上の注目ピン', + feeFeaturedTourLabel: '注目のツアー', + feeFeaturedTourDesc: 'SkateSpotsでツアーを注目掲載', + feeFeaturedTourBenefit: 'Proバッジ + スケーターがツアーを見るときの上位表示', + duration7d: '7日間', + duration30d: '1か月', + duration90d: '3か月', + duration365d: '12か月', + metaActive: '{{label}} — 有効', + daysRemainingOne: '残り{{count}}日', + daysRemainingMany: '残り{{count}}日', + zapRequestContent: 'SkateSpots {{label}}({{tier}})', + errGenerate: 'インボイスの生成に失敗しました', + paymentReceived: '⚡ 支払いを受け取りました!', + paymentReceivedDesc: '{{amount}} sats — {{label}}が有効になりました。', + autoPayFailed: '自動支払いに失敗しました', + autoPayFailedDesc: '下のQRまたはインボイスで手動支払いしてください。', + payStatusUnknown: '支払い状況が不明です — 支払いが完了している可能性があります。再度支払う前にウォレットを確認してください。', + invoiceCopied: 'インボイスをコピーしました!', + activeBang: '{{label}} 有効!', + chooseDuration: '期間を選択', + bestValue: 'お得', + perDay: '{{price}}/日', + validFor: '有効期間', + amountLine: '約${{usd}} USD · {{name}}へ · {{tier}}', + payToContinue: '続けるには{{amount}} satsを支払う', + generating: 'インボイスを生成中…', + processing: '支払いを処理中…', + invoiceQrAlt: 'LightningインボイスQR', + copyInvoice: 'インボイスをコピー', + openWallet: 'ウォレットを開く', + payConnected: '接続済みウォレットで支払う', + scanAny: '任意のLightningウォレットでスキャン', + tryAgain: '再試行', + proReceiptTitle: '🦧⚡ Sasquatch Pro — 参加完了!', + proReceiptPass: 'パス: {{pass}}({{sats}} sats)', + proReceiptActiveUntil: '有効期限: {{until}}', + proReceiptUnlocked: 'アンロックしたもの:', + proReceiptBullet1: '• パーソナルアシスタント — あなたのStash、クルー、スポット、出品を読み取ります', + proReceiptBullet2: '• アクションの下書き — ギアの出品、スポット状況の投稿、トリップの計画(確認はあなたが行います)', + proReceiptBullet3: '• 公開データだけでなく、あなたの個人的なコンテキストを使った回答', + proReceiptBullet4: '• ⚡ SkateSpotsを直接支援し、無料で広告なしに保ちます', + proReceiptThanks: 'SkateSpotsを無料で広告なしに保ってくれてありがとう。さあ滑りに行こう。🛹', + proReceiptSubject: 'Sasquatch Proのレシート', + receiptContent: 'Sasquatch Pro — {{tier}}サポーターパス 🦧⚡', + receiptAlt: 'Sasquatch Proサポーターパス({{tier}})、{{until}}まで有効', + purchaseComment: 'Sasquatch Pro — {{tier}} 🦧', + errLogin: 'Proにアップグレードするにはログインしてください。', + errStart: '購入を開始できませんでした。', + errRecord: 'パスを記録できませんでした。', + }, + cardUi: { + save: 'カードをNostrに保存', + saved: 'カードを保存しました', + savedDesc: 'カードが署名され、検証可能になりました。', + saveFailed: 'カードを保存できませんでした', + notPublished: '未公開', + titleNeon: 'ライダー', + titleRest: 'カード', + saveFrontPng: '表面を保存(PNG)', + expired: '期限切れ', + logoUploaded: 'ロゴをアップロードしました', + logoUploadFailed: 'ロゴをアップロードできませんでした', + venue: 'リンクする会場(任意)', + venueNone: '会場なし', + venueHint: '自分のスポットを1つ選んでこのパスを会場に紐付けます。検証者があなたの所有を確認します。', + venuePick: '会場を選択', + parkNoVenue: 'パークのパスは会場の所有者だけが発行できます — まず自分が所有するスポットを登録してください。', + parkAddVenue: 'スポットを追加', + parkNeedsVenue: '自分が所有する会場を選択', + parkIssued: '発行済みパス', + parkRevoke: '取り消す', + parkRevoked: '取り消し済み', + parkRevokeFailed: '取り消せませんでした', + v: { + valid: '有効', + validDesc: '署名は有効で、会場によって発行されています。', + expired: '期限切れ', + expiredDesc: '有効期限を過ぎています。', + revoked: '取り消し済み', + revokedDesc: '発行者がこのパスを取り消しました — 受け入れないでください。', + invalid: '無効', + invalidDesc: '署名が検証できません。信頼しないでください。', + notFound: '見つかりません', + notFoundDesc: 'リレー上に一致する記録がありません。', + unverifiedIssuer: '未検証の発行者', + unverifiedIssuerDesc: 'このパスが示す会場は、発行者の鍵が所有していません。', + notBound: '未紐付け', + notBoundDesc: '会場に紐付いていません — アクセスについて何も証明しません。', + noRsvp: 'RSVPなし', + noRsvpDesc: '保持者はこのイベントのRSVP記録がありません。', + admitted: '入場可', + admittedDesc: '主催者のイベント + 保持者がRSVP済み。', + noHolder: 'リンクに保持者がいません', + noHolderDesc: 'このQRにはチケット保持者(`?h=`)がないため、保持者を確認できません。', + }, + passes: { + tab: 'マイパス', + pass: 'アクセスパス', + none: 'まだパスがありません。会場や主催者が発行するとここに表示されます。', + }, + facets: { + title: 'アイデンティティの要素を表示', + crews: 'クルー', + local: 'ローカル', + roles: 'Labロール', + }, + roles: { + coach: 'コーチ', + filmer: 'フィルマー', + editor: '編集者', + photographer: 'フォトグラファー', + builder: 'ビルダー', + artist: 'アーティスト', + graffiti: 'グラフィティ', + tattoo: 'タトゥー', + trainer: 'トレーナー', + musician: 'ミュージシャン', + judge: 'ジャッジ', + organizer: 'オーガナイザー', + barber: 'バーバー', + }, + crew: { + crewCard: 'クルーカード', + crewSub: 'あなたのクルーをカードに', + pick: 'クルーを選択', + none: 'まだクルーに所属していません — まず参加するか立ち上げてください。', + hint: 'カードはクルー自身の署名済みデータから作られます。変更するにはクルーページで編集してください。', + members: 'メンバー', + spots: 'スポット', + est: '設立 {{year}}', + openCall: 'メンバー募集中', + verifiedCrew: '認証済みクルー', + viewCrew: 'クルーを見る', + }, + event: { + pass: 'イベントパス', + passSub: '参加予定のイベントのパス', + pick: 'イベントを選択', + none: 'まだイベントがありません — まず作成するかRSVPしてください。', + hint: 'パスはイベント自身の署名済みデータから作られます。変更できるのは主催者だけです。', + admits: '入場', + going: '{{count}}人が参加', + verifiedEvent: '認証済みイベント', + viewEvent: 'イベントを見る', + issuePass: 'チェックインパスを発行', + issuePassBtn: 'パスを発行', + issuePassHint: '特定の参加者用の署名済みパス — 受付で提示します。', + notOrganiser: 'パスを発行できるのは主催者だけです', + passIssued: 'パスを発行しました', + issueFailed: 'パスを発行できませんでした', + issuedPasses: '発行済みチェックインパス', + }, + studio: { + unsaved: '未保存の変更', + saved: '保存しました', + saveChanges: '変更を保存', + allSaved: '保存済み — 最新です', + showOnCard: 'カードに表示', + derived: 'あなたのスケータープロフィールから', + noSkaterProfile: 'まだスケータープロフィールがありません —', + editSkaterProfile: 'スタイルとレベルを追加', + noPhoto: 'まだプロフィール写真がありません —', + addPhoto: 'プロフィールで追加', + finishTitle: 'カードを完成させる', + finishDesc: '写真とスケータープロフィールがあれば本物らしくなります。', + checkPhoto: 'プロフィール写真', + checkName: '表示名', + checkProfile: 'スタイル & レベル', + checkCrew: 'クルーに参加', + moreTypes: '自分が所有するスポットの登録、クルーへの参加、イベントへのRSVPで、より多くのカードタイプが解放されます。', + accent: 'アクセントカラー', + accentHint: 'テーマのアクセントを上書きします', + accentClear: 'テーマカラーを使用', + logo: 'カスタムロゴ / クレスト', + logoAdd: 'アップロード', + logoChange: '変更', + logoClear: '削除', + }, + back: { + title: '印刷可能な裏面', + desc: '裏面にクルー、ロール、スポンサー & リンク', + showBack: '裏面を表示', + showFront: '表面を表示', + empty: 'まだ何もありません — クルー、ロール、スポンサーを追加してください。', + }, + verify: { + checking: 'カードを確認中…', + notFound: 'カードが見つかりません', + notFoundDesc: 'リレー上に一致するイベントが見つかりませんでした。削除されたか、リンクが間違っている可能性があります。', + invalid: '署名が無効', + invalidDesc: 'このイベントは存在しますが、署名が検証できません。信頼しないでください。', + authentic: '本物', + authenticDesc: '発行者の署名は有効です。', + kind: '種類', + kindPark: 'パークアクセスカード', + kindRider: 'ライダーカード', + kindCrew: 'クルーカード', + kindEvent: 'イベントパス', + organiser: '主催者', + expired: '期限切れ', + valid: '有効', + holder: '保持者', + ticketHolder: 'チケット保持者', + rsvp: 'RSVP', + rsvpGoing: '参加', + rsvpInterested: '興味あり', + rsvpNone: 'RSVPが見つかりません', + revoked: 'パスは取り消されました', + revokedDesc: '発行者がこのパスを取り消しました — 受け入れないでください。', + issuedBy: '発行者', + accessLevel: 'アクセスレベル', + validThru: '有効期限', + selfIssued: 'ステータス', + selfIssuedDesc: '自己発行の身分証', + venue: '会場', + venueVerified: '検証済み — この会場の所有者鍵が発行者と一致します。', + venueMismatch: 'このパスが示す会場は、発行者の鍵が所有していません。', + venueNone: '会場に紐付いていません。', + viewCard: 'カードを見る', + disclaimer: '有効な署名はこのカードに誰が署名したかを証明します — スキルや、会場が発行した以上のアクセス権を証明するものではありません。', + details: '詳細', + invalidLink: '無効なリンク', + invalidLinkDesc: '有効なカードリンクではないようです。', + }, + public: { + invalid: '有効なカードリンクではないようです。', + createYourOwn: '自分のカードを作成', + editYourCard: 'カードを編集', + backToEditor: 'エディターに戻る', + backHome: 'ホームに戻る', + notCustomised: 'このスケーターはまだカードをカスタマイズしていません — これはデフォルトの見た目です。', + verifyNote: 'カードのQRをスキャンして検証してください。', + }, + }, +}; + +export default jaBatch4; diff --git a/src/i18n/ja/batch5.ts b/src/i18n/ja/batch5.ts new file mode 100644 index 0000000..bfe03ea --- /dev/null +++ b/src/i18n/ja/batch5.ts @@ -0,0 +1,367 @@ +/** + * Japanese (日本語) — batch 5: routing (routeUi) + the Sasquatch assistant + * (sasquatchUi, sasquatchChat). + * + * Skate vocabulary stays katakana/English (スポット, パーク, クルー, Stash, + * The Lab, Nostr, Lightning, Zap, リレー, sats); all trick names stay English. + * LLM system prompts stay English (the model is language-directed separately). + */ +const jaBatch5 = { + routeUi: { + destination: '目的地', + routeTo: '{{label}} へのルート', + routeToLabel: 'ルート', + search: '検索', + description: 'ルートオプションとアプリ内ナビ。', + routeMapAria: 'ルートマップ', + findingLocation: '現在地を取得中…', + plottingRoute: 'ルートを作成中…', + refiningLocation: '位置情報を精度向上中…', + offlineSavedRoute: 'オフライン · 保存済みルート {{age}}', + tapMapStart: '地図をタップして出発地点を設定', + fitRouteAria: 'ルート全体を地図に合わせる', + wholeRoute: 'ルート全体', + next: '次へ', + nextStep: '次へ · ステップ {{n}}', + followTheLine: 'ラインに沿って進む', + toTheTurn: '曲がる地点まで', + toGo: '残り', + tryAgain: 'もう一度試す', + mode: { + foot: 'スケート / 徒歩', + bike: '自転車', + moto: 'バイク', + car: '車', + transit: '公共交通', + }, + from: '出発地', + myLocation: '現在地', + tapTheMap: '地図をタップ…', + chooseOnMap: '地図で選択', + direct: '直通', + transferOne: '乗り換え1回', + transfers: '{{count}} 回乗り換え', + options: '{{count}} 件のルート', + ride: '乗車', + arrive: '到着', + speedAvg: '平均 {{speed}} km/h', + stepsCount: '{{count}} ステップ', + onABoard: 'ボードなら', + usesDrivingRoads: '自動車道を使用', + drivingEstimate: '自動車の推定', + updating: '更新中…', + pickMode: '移動手段を選んでルートを表示。', + waitingLocation: '現在地を待機中…', + routeSteps: 'ルートのステップ', + walkingRoute: '徒歩ルート — ボードならもっと速い', + planningView: '計画ビュー — スタートをタップするとライブの曲がり角、音声、到着案内で追従します。', + leaveNow: '今すぐ出発', + departAt: '出発時刻', + arriveBy: '到着時刻', + departureTime: '出発時刻', + arrivalTime: '到着時刻', + only: 'のみ', + clear: 'クリア', + itinerary: '行程', + group: { + bus: 'バス', + tram: 'トラム', + metro: 'メトロ', + train: '電車', + ferry: 'フェリー', + }, + walk: '徒歩', + rideVerb: '乗車', + walkLower: '徒歩', + rideLower: '乗車', + toStop: 'まで', + track: 'ホーム {{track}}', + stopOne: '1駅', + stopsCount: '{{count}} 駅', + tickets: 'チケット ↗', + done: '完了', + stop: '停止', + start: 'スタート', + arrived: '到着しました。🛹', + voiceOnNote: '画面オン · 音声オン — 曲がり角と到着を音声で案内します。', + voiceOffNote: '画面オン · 音声オフ。', + followNote: '走行中も曲がり角・音声・到着を案内。画面はオンのまま。', + voiceOffAria: '音声案内をオフにする', + voiceOnAria: '音声案内をオンにする', + voiceStart: 'ナビを開始します', + voiceArrived: '到着しました', + voiceIn: '{{metres}} メートル先、{{instruction}}', + voiceContinue: '直進', + voiceContinueCaps: '直進', + errPermissionDenied: '位置情報の許可が拒否されました。', + errWaitingGps: 'GPSの測位を待機中…', + errPermissionDeniedLong: '位置情報の許可が拒否されました。現在地からルートを引くには位置情報を有効にしてください。', + errNoLocation: '現在地を取得できませんでした。もう一度試してください。', + errNoLocationShort: '現在地を取得できませんでした。', + errTransitNoRouteFiltered: 'その時刻または交通手段のルートがありません — 別の時刻を試すか、もっと多くの手段を含めてください。', + errTransitNoRoute: 'ここには公共交通のルートが見つかりません — この地域はオープンな時刻表を公開していない可能性があります。', + errTransitUnreachable: '交通サービスに接続できませんでした。接続を確認してもう一度試してください。', + errRoutingBusy: 'ルーティングサービスが現在混雑しています — 少し待ってからもう一度試してください。', + errNoRouteMode: 'この移動手段のルートがありません — 目的地が道路網の外にある可能性があります。別の手段を試してください。', + errRoutingUnreachable: 'ルーティングサービスに接続できませんでした。接続を確認してもう一度試してください。', + departures: '発車案内', + upcomingFrom: '{{stop}} からの発車予定', + loadingDepartures: '発車案内を読み込み中…', + noDepartures: 'この停留所には今後の発車予定が見つかりません。', + live: 'ライブ', + cancelled: '運休', + refresh: '更新', + tripLoginTitle: 'ログインして保存', + tripLoginDesc: 'この旅行をコレクションとして保存するにはサインインしてください。', + tripCollectionTitle: '{{destination}} スケート旅行 🛹', + tripCollectionDesc: 'The Sasquatchによる旅行プラン — {{destination}}で{{count}}日間。', + tripCollectionDescOne: 'The Sasquatchによる旅行プラン — {{destination}}で{{count}}日。', + tripSavedTitle: 'コレクションに保存しました 🦧', + tripSavedDesc: '{{destination}}旅行をブックマークしました。', + tripSaveFailed: '保存できませんでした', + tripSaveFailedDesc: '少し経ってからもう一度試してください。', + daysInDestinationOne: '{{destination}}で{{count}}日', + daysInDestination: '{{destination}}で{{count}}日間', + wetForecast: '雨天予報 — 屋根付き・屋内のスポットは地元のクルーに聞いてみよう。', + dayLabel: '{{n}}日目', + freeSkate: 'フリースケート — 探索して撮影。🎥', + tapToBook: 'タップして予約 / Zap ⚡', + localCrews: '地元のクルー', + saving: '保存中…', + savedToCollections: 'コレクションに保存しました', + saveSpotOne: '{{count}}件のスポットをコレクションに保存', + saveSpots: '{{count}}件のスポットをコレクションに保存', + flights: 'フライト', + stays: '宿泊', + gettingAround: '移動手段', + noMiddleman: 'スケートの計画は僕が立てる — フライトと宿は実際のサイトで開きます(KYCなし、中間業者なし)。', + ageJustNow: 'たった今', + ageMinAgo: '{{count}}分前', + ageHourAgo: '{{count}}時間前', + ageDayAgo: '{{count}}日前', + skateRightHere: 'ここすぐ', + skateMin: '~{{count}}分のクルーズ', + skateHours: '~{{hours}}時間のクルーズ', + maneuver: { + headOut: '出発', + arrive: 'スポットに到着', + continueStraight: '直進', + bearLeft: '左に斜行', + bearRight: '右に斜行', + turnLeft: '左折', + turnRight: '右折', + sharpLeft: '鋭く左折', + sharpRight: '鋭く右折', + turn: '曲がる', + keepLeft: '左側をキープ', + keepRight: '右側をキープ', + takeFork: '分岐を進む', + merge: '合流', + roundabout: 'ラウンドアバウトを進む', + takeRamp: 'ランプを進む', + takeExit: '出口を進む', + }, + maneuverOnto: '{{instruction}}、{{road}} に入る', + }, + sasquatchUi: { + live: 'ライブ', + offline: 'オフライン', + genericTitle: 'SkateSpotsアシスタント 🦧', + genericGreeting: 'よう!The Sasquatchだよ。スポット、イベント、コーチ、ギア、アプリの使い方など何でも聞いて。SkateSpotsリレーからライブデータを取得してるぜ!', + q1: 'リスボンで3日間のプランを立てて', + q2: '近くのスポットを探して', + q3: '今後のイベントは?', + q4: 'クルーって何?', + q5: 'Zapの仕組みは?', + q6: 'Nostrって何?', + q7: 'My Stashって何?', + q8: 'これは無料?', + bubbleTitle: '押してドラッグで移動 · タップで開く', + openGuideAria: 'Sasquatchガイドを開く', + hideAria: 'Sasquatchアシスタントを隠す', + hide: 'アシスタントを隠す', + showAria: 'Sasquatchアシスタントを表示', + activeUntil: '{{date}}まで有効', + platformOwner: 'プラットフォーム所有者', + upgradeTitle: 'Sasquatch Proにアップグレード', + goPro: 'Go Pro', + goProBlurb: 'パーソナルAI · 2k satsから', + aiBalanceTitle: 'Sasquatch AIクレジット残高(所有者限定) — {{provider}}でチャージ', + aiChip: '⚡ AI {{balance}}', + minimizeToBubbleAria: 'バブルに最小化', + minimize: '最小化', + closePanelAria: 'パネルを閉じる', + close: '閉じる', + askLab: 'コーチングと撮影について聞く', + askMap: 'スポット、ショップ、ギアについて聞く', + askAnything: '何でも聞いて 🛹', + quickQuestions: 'クイック質問:', + you: '🧑 あなた', + thinking: '考え中...', + inputPlaceholder: 'スポット、イベント、コーチについて聞く...', + liveDataFrom: 'ライブデータ提供元', + nostrRelays: 'Nostrリレー', + clear: 'クリア', + gettingLocation: '📍 現在地を取得中…', + findingClosest: '🔍 一番近いスポットを検索中…', + checkingLive: '🔍 ライブデータを確認中…', + planningTrip: '🗺️ {{destination}}の旅行を計画中...', + searchingRelays: '🔍 リレーで{{tool}}を検索中...', + perk1: 'パーソナルアシスタント — SasquatchがあなたのStash、クルー、スポット、出品を読み取ります', + perk2: 'アクションの下書き:ギアの出品、スケートステータスの投稿、旅行の計画 — 公開前に必ずあなたが確認します', + perk3: '回答は公開データだけでなく、あなたの個人コンテキストを使用します', + perk4: '⚡ SkateSpotsを直接支援し、無料で広告なしに保ちます', + welcomeTitle: 'Sasquatch Proを支援してくれてありがとう! 🦧⚡', + welcomeDesc: '支払いを送信しました — プロバイダーが確認するとパスが有効になります(通常1分以内)。ストリートを無料に保ってくれてありがとう。', + invoiceCopied: 'インボイスをコピーしました', + dialogDesc: 'AIスケートガイドを強化。100%が無料・広告なしのコミュニティアプリの資金になります。', + proSupporter: 'あなたはProサポーターです ⚡', + extendPrompt: '延長しますか?下からプランを選ぶと期間を追加できます。', + scanToPayPre: 'スキャンして支払う', + scanToPayAmount: '{{sats}} sats', + scanToPayPost: 'Proの{{label}}分', + invoiceQrAlt: 'LightningインボイスのQR', + copyInvoice: 'インボイスをコピー', + ivePaid: '支払いました', + ivePaidHint: 'ウォレットが確認したら「支払いました」をタップ — これでNostr IDにパスが記録されます。', + freeStaysPre: '無料のSasquatchは無料のまま — 公開のスポット/イベント/コーチ検索、旅行計画、完全なトリック用語集。Proは', + freeStaysEmphasis: 'パーソナル + アクション', + freeStaysPost: 'レイヤーを追加します。', + loginFirst: 'アップグレードするには先にログインしてください。', + paysTo: '支払先', + overLightning: 'Lightning経由。あなたのnpubに紐付けられます。', + popular: '人気', + sats: 'sats', + extend: '延長', + done: '完了!', + cancelledNothing: 'キャンセルしました — 何も公開されていません。', + draftReview: '下書き — 確認して承認', + statusTextPlaceholder: 'ステータス本文', + titlePlaceholder: 'タイトル', + priceSatsPlaceholder: '価格(sats)', + conditionPlaceholder: '状態', + cancel: 'キャンセル', + aiTitle: 'Sasquatch AI', + owner: 'オーナー', + notConfigured: '未設定', + unavailable: '利用不可', + satsValue: '{{balance}} sats', + theNode: 'ノード', + lowBalance: '残高が少なくなっています — {{provider}}でチャージしないと、AIはキー不要のプロバイダーにフォールバックします。', + aiDesc: 'リクエストごとの従量制AI、Routstr経由でsatsで資金提供。残高が少なくなると自動チャージ。', + tier7d: '7日間', + tier1m: '1か月', + tier3m: '3か月', + tier1y: '1年', + badgeTry: '試してみる', + badgeOff20: '20%オフ', + badgeBest: '最高のお得 · 40%オフ', + draftPostStatusTitle: 'スケートステータスを投稿', + draftAutoExpires: '{{count}}分後に自動失効', + draftPostStatusCta: 'ステータスを投稿', + draftCategory: 'カテゴリ: {{value}}', + draftSize: 'サイズ: {{value}}', + draftCondition: '状態: {{value}}', + draftMaxPrice: '上限価格: {{price}} {{currency}}', + draftPriceOpen: '価格: 応相談', + draftLookingForTitle: '「{{title}}」を探しています', + draftWantedCta: '募集広告を投稿', + draftPrice: '価格: {{price}} {{currency}}', + draftPriceOffer: '価格: オファー制', + draftListTitle: '「{{title}}」を出品', + draftPublishCta: '出品を公開', + statusPosted: 'ステータスを投稿しました 🛹', + wantedPublished: '募集広告を公開しました 🔎', + listingPublished: '出品を公開しました 💸', + mustBeLoggedIn: 'ログインが必要です。', + }, + sasquatchChat: { + faq: { + hi: 'やあ!The Sasquatchだよ 🦧 あなたのAIスケートガイド。スポット、イベント、コーチ、ギア、アプリのことなら何でも聞いて。何が必要?', + hello: 'よう! 🛹 The Sasquatchだ。スケートスポット、イベント、コーチ、アプリの仕組みなんでも聞いてくれ。調子はどう?', + hey: 'よう、スケーター! 🤙 近くのスポット、今後のイベント、コーチ、SkateSpotsのことなら何でも聞いて。', + whoAreYou: '私はThe Sasquatch 🦧 — SkateSpotsのAIガイド。世界中のスケートスポットを探し、イベント、コーチ、フィルマー、ギア出品を調べられる。すべてライブのNostrデータで動いてる。何でも聞いて!', + whatCanYouDo: '都市や国でスケートスポットを探し、今後のイベントを調べ、The Labでコーチやフィルマーを見つけ、ギア出品を検索し、アプリの仕組みについて答えるよ。試して:「バンコクのスポット」や「コーチを探して」! 🛹', + whatIsNostr: 'Nostrは分散型ソーシャルネットワークのためのシンプルでオープンなプロトコル。Twitterのようなものだけど、単一の企業が支配していない — ユーザー名の代わりに暗号鍵を使い、どのリレーがデータを保存するかを選べ(自分で運営も可能)、1つのアカウントがすべてのNostrアプリで使える! 🔑', + isThisPrivate: '正直なところを説明するね 🛡️\n\n• あなたの**GPS位置情報はデバイス上に留まります** — 「近く」は地図の中心を合わせるだけ。私たちに送信されたり公開されたりは決してない。\n• **あなたが追加したスポットは公開されます**(共有マップの趣旨だから) — だから自分の家の玄関にピンを立てないように。\n• **DMとクルーチャットはエンドツーエンド暗号化** — メンバーだけが読める。\n• どんなウェブサイトと同じで、接続先のサーバー(地図タイル、リレー)はあなたの**IP**を見ることができる。それも隠したい?VPNかTorを使おう。\n\n詳細は[プライバシーページ](/privacy)に。🛹', + privacy: '手短に言うと 🛡️:GPSはデバイスから出ない、公開したスポットは設計上公開、DM/クルーチャットはエンドツーエンド暗号化。サーバーは依然としてあなたのIPを見られる(どのウェブサイトでも普通のこと) — 望むならVPNかTorで隠せる。詳しくは[プライバシーページ](/privacy)で。', + amITracked: 'SkateSpotsはあなたを追跡しない — 広告なし、分析プロファイリングなし、データ販売なし、位置情報を収集するSkateSpotsサーバーも存在しない。GPSはデバイス上に留まる。サーバー(地図タイル、リレー)が見る唯一のものはあなたの**IP** — どのウェブサイトと同じ。隠すにはVPNかTorを使おう。詳しくは[プライバシーページ](/privacy)。🛡️', + doYouTrack: 'いいえ — 追跡なし、広告なし、データ収集なし。GPSはデバイス上に留まり、あなたを記録する中央サーバーもない。接続先のサーバーはあなたのIPを見られる(どのサイトも同じ);VPN/Torで隠せる。[プライバシーページ](/privacy)を見て。🛹', + vpn: '完全に任意だけど、追加のプライバシーが欲しいなら強力だよ 🛡️。VPNはSkateSpotsが通信するサーバー(地図タイル、リレーなど)からあなたの**IP**(おおよその位置)を隠す。信頼できるログなしプロバイダーを選ぼう(例:Mullvad);怪しい無料のは避けて。\n\n注意:VPNはあなたが公開したスポットを隠し**ません**(それらは公開)。匿名でいたいならブラウザのGPSをオンにしないこと。詳細は[プライバシーページ](/privacy)で。', + tor: 'Tor Browserは最強のIPプライバシーを提供する — 複数のリレー経由でルーティングするので、サーバーはあなたの本当のIPを見られない 🧅。トレードオフ:遅く、地図や一部のNostrリレーはTorの出口で遅延したりブロックしたりするかも。特に慎重な人に最適。\n\n覚えておいて:TorはあなたのIPを隠すが、公開したスポットは隠さない。匿名が目的ならブラウザのGPSを有効にしないこと。詳しくは[プライバシーページ](/privacy)で。', + hideMyIp: '無料の選択肢が2つ 🛡️:**信頼できるVPN**(簡単、速い — サーバーの背後にIPを隠す)か**Tor Browser**(最大のプライバシー、遅い)。どちらでもSkateSpotsの接続先サーバーに本当のIPを見せなくできる。公開したスポットは隠せない点に注意。[プライバシーページ](/privacy)を見て。', + isMyLocation: 'あなたの位置情報は安全 📍 — 「近く」は地図の中心を合わせて近くのスポットを並べるためだけに、デバイス上であなたのGPSを読む。Nostrに公開されることも、私たちに送信されることも、共有されることも決してない。あなたが意図的に追加したスポットだけが公開される。詳細は[プライバシーページ](/privacy)で。', + whatAreZaps: 'ZapはNostr経由で送られる即時のBitcoin Lightningチップ!どのコンテンツでも⚡をクリックして、クリエイターのウォレットに直接satsを送れる。「いいね」を押すようなものだけど、本物のお金で。即時、ピアツーピア、中間業者なし。⚡', + howToLogin: '2つの方法:\n1. **ブラウザ拡張**(デスクトップ):Albyかnos2xをインストールして「ログイン」をクリック\n2. **新規ユーザー**:「サインアップ」をクリックして鍵を生成。nsec(秘密鍵)をダウンロードして**必ず保存** — これが永遠のあなたのアカウント!', + whatIsCashu: '内蔵のBitcoinウォレット!Lightningに裏付けられたCashu ecashトークン — スケートスポットでオフラインでも動き、プライバシー重視(ミントは支払いを追跡できない)。使うには設定のウォレットへ。🥜', + whatIsNwc: 'Nostr Wallet Connect — LightningウォレットのUSB-Cのようなもの。Alby、Minibits、Zeus、Coinosを一度接続すれば、以後はワンクリックでZap。暗号化され、使用限度額はあなたが管理。🔌⚡', + isItFree: '100%無料。広告なし、サブスクなし、企業のごたごたなし。スケーターがスケーターのために作った。Angorによるコミュニティ資金 — サポーターページをチェック。質の高いスポットを提供すると、コミュニティのZapでBitcoinを稼ぐこともできる。🛹', + whatCanIDo: '地図で世界中のスポットを発見し、The Labでプロを雇い(コーチ、フィルマー、フォトグラファー、エディター、ランプビルダー)、クルーと走り、イベントに参加し、ツアーに参加し、ギアを売買し、自分のプライベートなStashを管理し、クリエイターにZapし、スポットの天気を確認し、分散型スケートコミュニティを築こう!', + whatIsTheLab: 'The Labはスケートシーンのプロを雇える場所:コーチ、フィルマー、フォトグラファー、ビデオエディター、ランプ/パーク/DIYビルダー。それぞれ個人でもコレクティブ(クルー/スタジオ)でもよく、メンバーが自分の鍵で確認するので本物。すべてNostr上、偽アカウントなし。🎓', + whatIsACrew: 'クルーは地図に紐付いたあなたのスケートファミリー — 雇う相手ではなく、一緒に滑る仲間。各クルーには地図上のホームテリトリー(ティール色のピン)、ホームスポット、メンバー、雰囲気、マニフェストがある。メンバーは自分の鍵で確認する。Crews → 「クルーを作成」で作れる。🤘', + whatAreCrews: 'クルーは地図に紐付いたあなたのスケートファミリー — 雇う相手ではなく、一緒に滑る仲間。各クルーには地図上のホームテリトリー(ティール色のピン)、ホームスポット、メンバー、マニフェストがある。メンバーは自分の鍵で確認する。Crewsタブで始めるか参加しよう! 🤘', + howToStartACrew: 'Crewsタブ → 「クルーを作成」へ。名前を付けて、地図にホームテリトリーを落とし、雰囲気(または独自の#ハッシュタグ)を追加し、ホームスポットをリンクし、npubでメンバーを追加する。各メンバーが自分の鍵で確認するので名簿は本物。🤘', + whatIsMyStash: 'My Stashはあなたの非公開の暗号化ギアロッカー(NIP-44暗号化)。デッキ、トラック、ウィール、シューズを保管場所、状態、レア度、価格とともに管理。アイテムを公開にしない限り**あなただけ**が読める。保険や交換の計画に最適。🎒', + whatIsStash: 'My Stashはあなたの非公開の暗号化ギアインベントリ。所有しているものすべて(状態、保管場所、価値)を記録でき、すべて暗号化されているのであなただけが見られる。売ったり見せびらかしたりしたいアイテムは公開にできる。🎒', + whatIsABuilder: 'ビルダーはThe Labのランプ/パーク/DIYクルーで、トランジション、ボウル、レール、あるいはパーク全体の建設を依頼できる。何を作るか、素材、プロジェクト規模を記載し、ライセンス/保険があることも。多くはコレクティブで、自分たちが建てたスポットを地図にリンクできる。🏗️', + whatIsANutzap: 'Nutzap(NIP-61)はNostr経由で送られるecashチップ — プライベートなCashuトークンを相手に直接Zapする。ウォレットでnutzapの**受信**を設定できる。(完全なnutzapの送信は展開中 — 今はLightning Zapを使おう。) 🥜⚡', + whatIsClink: 'CLINKはNostrネイティブの支払いコード(「noffer」)。ショップ、クルー、The Labのプロが追加でき、Lightningアドレスなしで支払える — 「CLINKで支払う」ボタンとQRが表示される。ShockWalletのようなCLINKウォレットでスキャンしよう。🔗⚡ [仕様](https://clinkme.dev/specs.html) [アプリ](https://clinkme.dev/apps.html)', + whatIsNoffer: 'nofferはCLINK支払いコード — ウェブサーバーやLightningアドレスなしで支払いを受け取れる、再利用可能なNostrネイティブの方法。ショップ/クルー/The Labプロフィールに追加すれば、直接支払ってもらえる。🔗', + whatAreTours: 'ツアーはガイド付きのスケート旅行 — ローカルセッション、国内ロードトリップ、世界制覇ツアーなど。地図かツアーセクションで見つけて、集まって、地元の人と新しい地形を滑ろう。🗺️🛹', + whatIsAShop: 'スケートショップは地図に登録された地元のショップ。あなたの地域の実店舗(またはオンライン)のスケートショップを見つけて支援しよう — Bitcoinを受け付けるところもある。🏪', + howToSellGear: 'ギアスワップ/マーケットプレイスで出品を作成(NIP-99)。写真、satsでの価格、状態を追加し、任意でスポットにピン留めして地図に表示させる。買い手は直接Zapかメッセージを送ってくる。🛹💸', + supporters: 'SkateSpotsはAngor(分散型Bitcoinクラウドファンディング)によるコミュニティ資金で運営 — 広告なし、投資家なし、データ販売なし。サポーターページでプロジェクトを支援し、ストリートを無料に保とう。❤️⚡', + trustScore: 'トラストスコア(0〜100)はRelatrによるもの。あなたのNostrネットワーク(フォロワー、活動、エンゲージメント、Zap)を分析。高いほど信頼される。ボットやスパムのフィルタリングに役立つ。プロフィールを見ればスコアが確認できる。🛡️', + whatRelay: 'SkateSpotsが使用:🛹 goskatespots.nostr1.com(メイン、品質のため許可リスト登録)+ relay.ditto.pub(グローバル)+ purplepag.es(プロフィールアグリゲーター)。あなたのデータは冗長性のためすべてに複製される。', + tripPlanner: '都市を教えてくれたら、日ごとのスケート旅行を組むよ 🗺️ — スポット、イベント、コーチ、地元のクルー、天気も考慮(雨の日=屋根付きスポットをクルーが案内)。「リスボンで3日間のプランを立てて」と試して。全部コレクションに保存でき、フライト/宿は実際のサイトへ引き継ぐ(KYCなし、中間業者なし)。🛹', + planATrip: '「バルセロナで3日間のプランを立てて」(どの都市でも)と言ってくれれば、日ごとにスポット、セッション、コーチ、地元のクルーを割り出すよ。コレクションとして保存して滑りに行こう。🗺️🛹', + sasquatchPro: '**Sasquatch Pro** 🦧⚡ は、私のパーソナルな部分を解放するLightningサポーターパス:\n\n• 🧠 **パーソナルアシスタント** — あなた自身のStash、クルー、スポット、出品を読み取る\n• ✨ **アクションの下書き** — ギアの出品、スケートステータスの投稿、旅行の計画(公開前に必ずあなたが確認)\n• 💬 **パーソナルコンテキスト** — 回答は公開結果だけでなく、あなた自身のデータを使う\n• ⚡ **プロジェクトを支援** — SkateSpotsを無料で広告なしに保つ\n\n無料のSasquatchは無料のまま:公開のスポット/イベント/コーチ/クルー検索、用語集、旅行計画はProなしで使える。Proは*パーソナル*な部分を追加するだけ。上部の**⚡ Go Pro**をタップ。プラン:7日間 ~2k sats、1か月 ~5k、3か月 ~12k、1年 ~36k。', + proPerks: 'Proの特典 🦧⚡:パーソナルアシスタント(あなたのStash/クルー/スポット/出品を読み取る)、アクションの下書き(ギアの出品、ステータス投稿、旅行の計画 — あなたが確認)、そしてあなた自身のパーソナルコンテキストを使う回答。さらにSkateSpotsを直接支援し、無料+広告なしに保つ。無料は無料のまま — Proはパーソナルなレイヤーを追加する。上部の**⚡ Go Pro**をタップ。', + proVersion: '私のProバージョン 🦧⚡ は**パーソナルアシスタント**を追加する:あなた自身のStash、クルー、スポット、出品を読み取り、アクションの下書きを作成でき(ギアの出品、ステータス投稿、旅行の計画 — 必ず先にあなたが確認)、回答にあなたのパーソナルコンテキストを使う。プロジェクトへの直接支援にもなる。無料のSasquatch(スポット/イベント/コーチ/クルー検索、用語集、旅行プランナー)は無料のまま。上部の**⚡ Go Pro**をタップ。', + perks: 'Proの特典 🦧⚡:パーソナルアシスタント(あなたのStash/クルー/スポット/出品)、あなたが確認するアクションの下書き、あなた自身のコンテキストを使う回答 — さらにアプリを無料&広告なしに保つ。上部の**⚡ Go Pro**をタップ。', + goPro: '上部の**⚡ Go Pro**ボタンをタップしてアップグレードシートを開こう。Proは私のパーソナルアシスタント(Stash/クルー/スポット/出品)とアクションの下書きを解放し、プロジェクトを直接支援する。Lightningで支払い — 7日間 ~2k satsから1年 ~36k satsまで。無料機能は無料のまま。🦧', + proPricing: 'Proプラン(Lightningで支払い ⚡):**7日間** ~2,000 sats(約$1.20)、**1か月** ~5,000 sats(約$3)、**3か月** ~12,000 sats(約$7、20%オフ)、**1年** ~36,000 sats(約$21、最高のお得)。上部の**⚡ Go Pro**をタップ。', + howMuchIsPro: 'Proプラン:7日間 ~2,000 sats、1か月 ~5,000 sats、3か月 ~12,000 sats(20%オフ)、1年 ~36,000 sats(最高のお得)。Lightningで支払い ⚡。上部の**⚡ Go Pro**をタップ。', + upgrade: 'Sasquatch Proにアップグレードするには、上部の**⚡ Go Pro**ボタンをタップ。Lightningで支払い(7日間 ~2k satsから1年 ~36kまで)。Proは私のパーソナルアシスタントとアクションの下書きを解放し、プロジェクトを直接支援する。🦧⚡', + }, + statsTitle: '📊 **数字で見るSkateSpots**', + weatherTemp: '• {{temp}}°C(体感 {{feels}}°C)', + weatherSkateability: '• スケート適性:**{{label}}**({{score}}/100)', + weatherError: '今は天気を取得できませんでした。少し経ってからもう一度試してください。🌧️', + labelSpots: 'スポット', + labelEvents: 'イベント', + labelLabPros: 'The Labのプロ', + labelCrews: 'クルー', + labelShops: 'スケートショップ', + labelTours: 'ツアー', + labelGear: 'ギア出品', + unnamed: '名称未設定', + emptyWhere: ' (**{{place}}**)', + emptyResult: '{{label}}{{where}}は今見つかりませんでした 🦧\n\nまだ登録されていないか、リレーの応答が遅いのかもしれない。少し待ってもう一度試すか、綴りを確認するか、[地図に最初の1つを追加](https://skate-spots.org/map)しよう。🛹', + foundTitle: '{{emoji}} **{{count}}** 件の{{label}}が見つかりました:\n{{lines}}{{more}}', + moreResults: '\n\n…ほかに**{{count}}**件 — [すべて地図で見る](https://skate-spots.org/map) 🗺️', + locationDenied: 'あなたの位置情報が見られない — 何もデバイスから出ることはない;あなたが頼んだときだけローカルで読み取るけど、ブラウザが拒否した。地図の🎯**近く**をタップするか、都市を教えて:「バンコクのスポット」。🛹', + noNearbySpots: '近くにまだ地図登録されたスポットはない 🦧 — [最初の1つを落とそう](https://skate-spots.org/create-spot)。🛹', + closestTitle: '今あなたに一番近いスポット:', + closestFooter: '_あなたのデバイス上で計算 — 位置情報はデバイスから出ていません。_', + proNudge: 'それは**Sasquatch Pro**の機能だよ 🦧⚡ — ProならあなたのStash、クルー、スポット、出品を読み取り、ギア出品、募集広告、スケートステータスの下書きを作成し、旅行を計画できる。SkateSpotsを無料&広告なしに保つLightningサポーターパス。上部の**⚡ Go Pro**ボタンをタップして解放しよう。🛹', + draftingProPerk: 'アクションの下書き作成(ステータス投稿、ギアの出品)は**Sasquatch Pro**の特典 🦧⚡ — 上部の**⚡ Go Pro**をタップして解放しよう。', + draftIntro: '下書きはこちら — 確認してタップで公開。あなたが確認するまで何も公開されない。🛹', + draftFailed: 'その下書きをうまく作れなかった — もう一度詳細を教えて(例:「Spitfireのウィールを8000 satsで出品して」)。', + tripAskCity: 'どこへ?都市を教えて(例:「リスボンで3日間のプランを立てて」)そしたら旅行を組むよ。🗺️', + tripEmptyMap: '**{{destination}}** はまだ地図に何もない 🦧 — [skate-spots.org](https://skate-spots.org)で最初にスポットを落とそう。地元の人がスポット、クルー、イベントを追加したら、完全な旅行を組むよ。', + tripLocked: '**{{destination}}**のミッションを確定したよ 🛹 — 下にスポット、セッション、地元の人がいる。調整するか保存して。', + tripFailed: '今は計画するためのライブデータに接続できませんでした。少し経ってからもう一度! 🛹', + tripEmptyMapLocal: '**{{destination}}** はまだ地図に何もない 🦧 — [skate-spots.org](https://skate-spots.org)で最初になろう。', + tripMissionLocal: '**{{destination}}**のミッションだ 🛹 — 下にスポット、セッション、地元の人がいる。', + relayFailed: 'リレーが今ちょうど時間内に応答しなかった 🛰️ — たいていは接続が遅いだけで、スポットがないわけじゃない。少し経ってからもう一度試して。🛹', + couldNotProcess: 'うーん、処理できなかった。言い方を変えてみて!', + freeTierFallback: 'それはAIの推論が必要 — **Sasquatch Pro**の機能 ⚡🦧\n\nそれでもリレーから直接**スポット、イベント、コーチ、クルー、ショップ、ツアー、ギア**を探せるよ — 例えば「バルセロナのスポット」と聞いて — [用語集](/glossary)には150以上のトリックと用語が載っている。AIの回答を解放するには上部の**⚡ Go Pro**をタップ。', + aiDownFallback: '今私のAIの頭は宙に浮いてる 🦧 — でも助けはあるよ:\n\n• 🗺️ [地図](/) — 近くのスポット、ショップ、イベント\n• 🧪 [The Lab](/lab) — コーチ、フィルマー、エディター\n• 📖 [用語集](/glossary) — 150以上のトリックと用語\n• 👥 [クルー](/crews) — 仲間を見つけよう\n\nそれか**都市**(「バルセロナのスポット」)か**トリック**(「nollieって何」)を教えてくれれば、すぐ答えるよ。🛹', + wentWrong: 'こちらで何か問題が起きた。少し経ってからもう一度! 🦧', + publishError: '公開できませんでした:{{error}}。少し経ってからもう一度試してください。', + unknownError: '不明なエラー', + }, +}; + +export default jaBatch5; diff --git a/src/i18n/ja/index.ts b/src/i18n/ja/index.ts index 19d990c..4e11ff2 100644 --- a/src/i18n/ja/index.ts +++ b/src/i18n/ja/index.ts @@ -1,6 +1,8 @@ import batch1 from './batch1'; import batch2 from './batch2'; import batch3 from './batch3'; +import batch4 from './batch4'; +import batch5 from './batch5'; /** * Japanese (日本語) translations — composed from fragments so parallel batches @@ -14,6 +16,8 @@ const ja = { ...batch1, ...batch2, ...batch3, + ...batch4, + ...batch5, }; export default ja; diff --git a/src/i18n/th/batch6.ts b/src/i18n/th/batch6.ts new file mode 100644 index 0000000..275ae33 --- /dev/null +++ b/src/i18n/th/batch6.ts @@ -0,0 +1,688 @@ +/** + * Thai (ไทย) — batch 6: marketplace / Gear Swap surfaces (`marketUi`). + * + * Policy (same as other Thai batches): core skate + protocol vocabulary stays + * English (Spot, Shop, Gear, Crew, Stash, The Lab, Nostr, Lightning, Zap, Relay, + * sats, Deck, Trucks, Wheels, Bearings, Griptape, trick names). Everything else + * is Thai. `{{placeholders}}` are preserved exactly. + * + * Keys MUST match the `en` `marketUi` namespace exactly; missing keys fall back + * to English (the `check:i18n` script reports Thai coverage). + */ +const thBatch6 = { + marketUi: { + gearSwap: { + title: 'Gear Swap', + subtitle: 'ซื้อ-ขาย Gear สเก็ตมือสองกับนักสเก็ตคนอื่น', + listGear: 'ลงขาย Gear', + searchPlaceholder: 'ค้นหา Gear...', + allCategories: 'ทุกหมวดหมู่', + forSale: 'ขาย', + wtb: 'WTB', + trust: 'ความน่าเชื่อถือ', + filterByTrust: 'กรองตามความน่าเชื่อถือ', + allSellers: 'ผู้ขายทั้งหมด', + verifiedOnly: 'ยืนยันแล้วเท่านั้น', + trustedPlus: 'Trusted+', + followingOnly: 'เฉพาะที่ติดตาม', + pickupOrShip: 'นัดรับหรือส่ง', + localPickup: 'นัดรับในพื้นที่', + ships: 'ส่งพัสดุ', + sortBy: 'เรียงตาม', + newest: 'ใหม่สุด', + priceLowHigh: 'ราคา: ต่ำ → สูง', + priceHighLow: 'ราคา: สูง → ต่ำ', + trustScore: 'คะแนนความน่าเชื่อถือ', + nearest: 'ใกล้ที่สุด (ในพื้นที่)', + listingFound: 'พบ {{count}} รายการ', + listingsFound: 'พบ {{count}} รายการ', + loadFailed: 'โหลดรายการไม่สำเร็จ', + tryLater: 'โปรดลองใหม่ภายหลัง', + noneTitle: 'ไม่พบรายการ', + noneFiltered: 'ไม่มี Gear ที่ตรงกับตัวกรองปัจจุบัน ลองล้างตัวกรองหรือค้นหาอย่างอื่นดู', + noneFirst: 'เป็นคนแรกที่ลงขาย Gear ของคุณ — Deck, Trucks, Wheels, รองเท้า อะไรก็ได้ที่เกี่ยวกับสเก็ต!', + listYourGear: 'ลงขาย Gear ของคุณ', + faqLink: 'มีคำถาม? ดู FAQ →', + }, + hub: { + browse: 'เลือกดู', + selling: 'ที่ลงขาย', + myTrades: 'การซื้อขายของฉัน', + reputation: 'ชื่อเสียง', + loginListings: 'เข้าสู่ระบบเพื่อจัดการรายการที่ลงขาย', + loginReputation: 'เข้าสู่ระบบเพื่อดูชื่อเสียงและรีวิวของคุณ', + }, + marketplace: { + heroTitle: 'Shops และ Marketplace', + heroBefore: 'Marketplace ของเราขับเคลื่อนด้วย', + heroAfter: '- ตลาดกระจายศูนย์บน Nostr Skate Shop ลงสินค้าได้ และคุณซื้อ-ขาย Gear มือสองกับ Bitcoin ได้โดยตรง', + whatIsTitle: 'Plebeian Market คืออะไร?', + whatIsBody: 'Plebeian Market เป็นตลาดกระจายศูนย์ที่สร้างบน Nostr ซื้อและขาย Gear สเก็ตบอร์ดกับนักสเก็ตคนอื่นโดยตรงด้วย Bitcoin ไม่มีคนกลาง ไม่มีค่าธรรมเนียม อิสระเต็มที่', + noFeesTitle: 'ไม่มีค่าธรรมเนียม', + noFeesBody: 'ไม่มีแพลตฟอร์มมาหัก 30% ขายตรงแบบ peer-to-peer', + bitcoinTitle: 'ชำระด้วย Bitcoin', + bitcoinBody: 'จ่ายด้วย Bitcoin รวดเร็ว ปลอดภัย ทั่วโลก', + decentralizedTitle: 'กระจายศูนย์', + decentralizedBody: 'สร้างบน Nostr ไม่มีบริษัทใดควบคุม', + visit: 'ไปที่ Plebeian Market', + buySellTitle: 'สิ่งที่คุณซื้อ-ขายได้', + catCompletes: 'Complete Deck', + preBuilt: 'คอมพลีตประกอบสำเร็จ', + customSetups: 'เซ็ตอัปสั่งทำ', + beginnerBoards: 'บอร์ดสำหรับมือใหม่', + catParts: 'ชิ้นส่วน Deck', + decks: 'Deck', + trucks: 'Trucks', + wheels: 'Wheels', + bearings: 'Bearings', + gripTape: 'Griptape', + hardware: 'น็อตและฮาร์ดแวร์', + catApparel: 'เสื้อผ้าและอุปกรณ์ป้องกัน', + skateShoes: 'รองเท้าสเก็ต', + clothing: 'เสื้อผ้า', + helmets: 'หมวกกันน็อก', + pads: 'แผ่นรองป้องกัน', + backpacks: 'กระเป๋าเป้', + catAccessories: 'อุปกรณ์เสริม', + tools: 'เครื่องมือ', + wax: 'แวกซ์', + rails: 'ราว', + stickers: 'สติกเกอร์', + videos: 'วิดีโอ', + magazines: 'นิตยสาร', + howItWorks: 'วิธีการทำงาน', + step1Title: 'เลือกดูสินค้า', + step1Body: 'ไปที่ Plebeian Market และเลือกดู Gear สเก็ตบอร์ดจากร้านค้าและบุคคลทั่วโลก', + step2Title: 'ติดต่อผู้ขาย', + step2Body: 'ส่งข้อความหาผู้ขายโดยตรงผ่าน Nostr ต่อรองราคา ถามคำถาม จัดการส่งของ', + step3Title: 'จ่ายด้วย Bitcoin', + step3Body: 'ชำระเงินด้วย Bitcoin Lightning เพื่อการจ่ายที่ทันทีและค่าธรรมเนียมต่ำ', + step4Title: 'ให้ฟีดแบ็ก', + step4Body: 'ให้คะแนนประสบการณ์และสร้างชื่อเสียงผู้ขายบน Nostr รีวิวของคุณช่วยชุมชน', + needBitcoinTitle: 'ต้องการ Bitcoin ไหม?', + needBitcoinBefore: 'คุณต้องมี Lightning wallet ที่มี sats อยู่บ้างเพื่อซื้อสินค้า ลองดู', + onboardingGuide: 'คู่มือเริ่มต้น', + needBitcoinAfter: 'สำหรับคำแนะนำเรื่อง wallet', + ownShopTitle: 'มี Skate Shop เป็นของตัวเอง?', + ownShopBody: 'ลง Shop ของคุณบน SkateSpots และขายสินค้าบน Plebeian Market เข้าถึงลูกค้าทั่วโลกโดยไม่มีค่าธรรมเนียมแพลตฟอร์ม', + addShop: 'เพิ่ม Shop ของคุณ', + startSelling: 'เริ่มขาย', + }, + listingDetail: { + notFound: 'ไม่พบรายการ', + notFoundBody: 'อาจถูกลบไปแล้ว หรือลิงก์ไม่ถูกต้อง', + backToGearSwap: 'กลับไป Gear Swap', + gearSwap: 'Gear Swap', + viewPhoto: 'ดูรูป {{n}}', + photoAlt: '{{title}} — รูป {{n}}', + wantToBuy: 'ต้องการซื้อ (WTB)', + sold: 'ขายแล้ว', + description: 'รายละเอียด', + usuallyHere: 'ปกติอยู่ที่นี่ {{availability}}', + listed: 'ลงเมื่อ {{date}}', + listingCountOne: '{{count}} รายการ · {{age}} วัน', + listingCountMany: '{{count}} รายการ · {{age}} วัน', + relistActive: 'ลงใหม่เป็นสถานะใช้งาน', + markSold: 'ทำเครื่องหมายว่าขายแล้ว', + deleteListing: 'ลบรายการ', + makeOffer: 'เสนอราคา', + shareListing: 'แชร์รายการ', + unknown: 'ไม่ทราบ', + linkCopied: 'คัดลอกลิงก์แล้ว', + linkCopiedBody: 'แชร์ให้นักสเก็ตคนอื่นได้เลย', + copyFailed: 'คัดลอกลิงก์ไม่ได้', + relisted: 'ลงใหม่แล้ว', + relistedBody: 'รายการของคุณกลับมาใช้งานอีกครั้ง', + couldNotUpdate: 'อัปเดตไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + }, + create: { + imageUploaded: 'อัปโหลดรูปแล้ว', + uploadFailed: 'อัปโหลดไม่สำเร็จ', + failed: 'ไม่สำเร็จ', + cooldownActive: 'อยู่ในช่วงคูลดาวน์', + cooldownWait: 'โปรดรอ {{time}} ก่อนสร้างรายการใหม่', + limitReached: 'ถึงขีดจำกัดรายการแล้ว', + limitReachedBody: 'คุณถึงขีดจำกัด {{limit}} รายการต่อเดือนแล้ว', + feeRequired: 'ต้องชำระค่าธรรมเนียม', + feeRequiredBody: 'โปรดชำระค่าธรรมเนียมกันสแปมเพื่อดำเนินการต่อ', + titleRequired: 'ต้องระบุชื่อ', + categoryRequired: 'ต้องเลือกหมวดหมู่', + photoRequired: 'ต้องมีรูป', + photoRequiredBody: 'ต้องมีอย่างน้อยหนึ่งรูปเมื่อขาย Gear', + nip05Required: 'ต้องยืนยัน NIP-05', + nip05RequiredBody: 'คุณต้องมีที่อยู่ Nostr ที่ยืนยันแล้วเพื่อลงขาย Gear', + priceRequired: 'ต้องระบุราคาสำหรับรายการราคาคงที่', + sizeRequired: 'ต้องระบุขนาด', + sizeRequiredBody: 'โปรดเลือกขนาดสำหรับ {{category}}', + conditionRequired: 'ต้องระบุสภาพ', + conditionRequiredBody: 'โปรดเลือกสภาพของ {{category}}', + wtbPosted: 'โพสต์ความต้องการซื้อแล้ว!', + wtbPostedBody: 'ผู้ขายจะสามารถเห็นคำขอของคุณได้', + listingCreated: 'สร้างรายการแล้ว!', + listingCreatedBody: 'Gear ของคุณลงขายแล้ว', + publishFailed: 'เผยแพร่ไม่สำเร็จ', + loginRequired: 'ต้องเข้าสู่ระบบ', + loginRequiredBody: 'คุณต้องเข้าสู่ระบบเพื่อลงขาย Gear', + backToStash: 'กลับไป Stash', + backToSpot: 'กลับไป {{title}}', + backToMarketplace: 'กลับไป Marketplace', + backToMap: 'กลับไปแผนที่', + wantToBuy: 'ต้องการซื้อ', + listYourGear: 'ลงขาย Gear ของคุณ', + wtbSubtitle: 'บอกชุมชนว่าคุณกำลังมองหา Gear อะไร', + sellSubtitle: 'ขาย Gear สเก็ตบอร์ดให้ชุมชน', + fromStashTitle: 'ลงขายจาก Stash ของคุณ', + fromStashBody: 'เติมข้อมูลจากรายการใน Stash ของคุณไว้ล่วงหน้าแล้ว ตรวจสอบและเลือกจุดนัดพบ!', + nip05Banner: 'เพื่อป้องกันสแปมและปกป้องผู้ซื้อ คุณต้องมีที่อยู่ Nostr ที่ยืนยันแล้ว (NIP-05) เพื่อลงขาย Gear', + verifiedLabel: 'ยืนยันแล้ว:', + checkingTrust: 'กำลังตรวจสอบระดับความน่าเชื่อถือของคุณ...', + trustLevel: 'ระดับความน่าเชื่อถือ:', + trusted: 'Trusted', + active: 'Active', + newcomer: 'Newcomer', + newUser: 'ผู้ใช้ใหม่', + remaining: 'เหลือ {{remaining}} จาก {{limit}} รายการในเดือนนี้', + cooldownBody: 'ผู้ใช้ใหม่มีคูลดาวน์ 24 ชั่วโมงระหว่างการลงรายการ', + timeRemaining: 'เวลาที่เหลือ: {{time}}', + monthlyLimitTitle: 'ถึงขีดจำกัดรายเดือนแล้ว', + monthlyLimitBody: 'คุณถึงขีดจำกัด {{limit}} รายการในเดือนนี้ สร้างชื่อเสียงด้วยการสร้าง Spot หรือทำการขายให้สำเร็จเพื่อเพิ่มขีดจำกัด', + powAccepted: 'ยอมรับ Proof of work แล้ว!', + feePaid: 'ชำระค่าธรรมเนียมแล้ว!', + canCreateNow: 'ตอนนี้คุณสร้างรายการได้แล้ว', + whatDoTitle: 'คุณต้องการทำอะไร?', + sellGear: 'ขาย GEAR', + categoryTitle: 'หมวดหมู่ *', + categoryHint: 'Gear ประเภทไหน?', + detailsTitle: 'รายละเอียด Gear', + detailsWtbHint: 'อธิบายสิ่งที่คุณกำลังมองหา', + detailsSellHint: 'บอกผู้ซื้อเกี่ยวกับสินค้าของคุณ', + titleLabel: 'ชื่อ *', + titlePlaceholderWtb: 'กำลังมองหา Deck 8.0"', + titlePlaceholderSell: 'Palace Deck 8.25" เกือบใหม่', + summaryLabel: 'สรุปสั้น', + summaryPlaceholderWtb: 'ยี่ห้อไหนก็ได้ ขอกราฟิกน้อย ๆ', + summaryPlaceholderSell: 'สภาพดี ใช้น้อยมาก', + descriptionLabel: 'รายละเอียด', + descriptionPlaceholderWtb: 'อธิบายให้ชัดว่าคุณกำลังมองหาอะไร — ยี่ห้อที่ชอบ เงื่อนไขสภาพ ฯลฯ', + descriptionPlaceholderSell: 'ได้ Deck นี้เป็นของขวัญคริสต์มาสแต่ชอบขนาดเล็กกว่า ยินดีให้ลองก่อนซื้อ!', + fulfilmentLabel: 'จัดส่งแบบไหน?', + pickup: 'นัดรับ', + pickupHint: 'เจอกันในพื้นที่', + ships: 'ส่งพัสดุ', + shipsHint: 'ส่งไปรษณีย์', + both: 'ทั้งสองแบบ', + bothHint: 'อย่างใดอย่างหนึ่ง', + addressNote: 'เราไม่เก็บที่อยู่ของคุณ — สำหรับการส่งของ ให้แชร์เป็นการส่วนตัวในแชตการซื้อขาย', + postageLabel: 'ใครจ่ายค่าส่ง?', + requireEscrow: 'บังคับใช้ escrow', + requireEscrowHint: 'ขอให้ผู้ซื้อชำระผ่าน Cashu escrow', + postageBuyer: 'ผู้ซื้อจ่าย', + postageSeller: 'ฉันจ่าย', + postageSplit: 'หารครึ่ง', + sizeLabel: 'ขนาด', + selectSize: 'เลือกขนาด', + truckHeight: 'ความสูง Trucks', + selectHeight: 'เลือกความสูง', + wheelHardness: 'ความแข็ง Wheels', + selectHardness: 'เลือกความแข็ง', + pricingTitle: 'ราคา', + pricingWtbHint: 'คุณอยากจ่ายแบบไหน?', + pricingSellHint: 'คุณอยากขายแบบไหน?', + priceLabel: 'ราคา *', + currencyLabel: 'สกุลเงิน', + photosTitle: 'รูปภาพ', + photosSellHint: 'ต้องมีอย่างน้อยหนึ่งรูป', + photosWtbHint: 'ไม่บังคับ — เพิ่มรูปอ้างอิงได้', + productPhoto: 'สินค้า {{n}}', + upload: 'อัปโหลด', + photosNote: 'เพิ่มได้สูงสุด 5 รูป รูปแรกจะเป็นรูปหลัก', + pickupLocationTitle: 'จุดนัดรับ', + pickupLocationHint: 'เชื่อมกับ Skate Spot เพื่อให้นัดเจอกันง่าย', + searchSpots: 'ค้นหา Spot...', + noSpotsFound: 'ไม่พบ Spot ลองค้นหาด้วยคำอื่น', + availabilityLabel: 'ปกติคุณว่างเมื่อไหร่?', + availabilityPlaceholder: 'เสาร์-อาทิตย์ 10:00-14:00, อังคาร/พฤหัส เย็น', + availabilityHint: 'ช่วยให้ผู้ซื้อนัดเจอกับคุณได้ง่ายขึ้น', + durationTitle: 'ระยะเวลาการลงรายการ', + durationHint: 'รายการนี้ควรเปิดใช้งานนานแค่ไหน?', + publishing: 'กำลังเผยแพร่...', + checkingEligibility: 'กำลังตรวจสอบสิทธิ์...', + cooldownButton: 'คูลดาวน์: {{time}}', + limitReachedButton: 'ถึงขีดจำกัดแล้ว', + payFeeButton: 'จ่ายค่าธรรมเนียมเพื่อไปต่อ', + postWtbButton: 'โพสต์ความต้องการซื้อ', + listForSaleButton: 'ลงขาย GEAR', + }, + trades: { + title: 'การซื้อขายของฉัน', + loginBody: 'เข้าสู่ระบบเพื่อจัดการการซื้อขายใน Marketplace และชื่อเสียงของคุณ', + subtitle: 'การยืนยัน คำขอ และชื่อเสียงที่สร้างขึ้น การชำระเงินตกลงกับนักสเก็ตอีกฝ่าย — แอปเพียงบันทึกดีลเท่านั้น', + actionNeeded: 'ต้องดำเนินการ', + askedToConfirmSale: 'ขอให้คุณยืนยันการขาย', + recordedSale: 'บันทึกการขายแล้ว — ยืนยันฝั่งของคุณ', + confirmSale: 'ยืนยันการขาย', + confirm: 'ยืนยัน', + nothingWaiting: 'ตอนนี้ไม่มีอะไรที่ต้องรอคุณทำ 🛹', + yourRecords: 'บันทึกการซื้อขายของคุณ', + noTrades: 'ยังไม่มีการซื้อขาย ปิดดีลและยืนยันเพื่อเริ่มสร้างชื่อเสียง', + browseGearSwap: 'ดู Gear Swap', + roleSold: 'ขาย', + roleBought: 'ซื้อ', + roleTrade: 'แลกเปลี่ยน', + with: 'กับ', + viewListing: 'ดูรายการ', + revoke: 'เพิกถอน', + revokeTitle: 'เพิกถอนบันทึกการซื้อขายนี้?', + revokeBody: 'มันจะหยุดนับรวมในชื่อเสียงของคุณ อีกฝ่ายยังคงเก็บหลักฐานของตนเองไว้ ใช้เมื่อดีลมีข้อโต้แย้งหรือผิดพลาด', + revokeNote: 'ถูกถอนโดยผู้เขียน', + revoked: 'เพิกถอนบันทึกการซื้อขายแล้ว', + revokedBody: 'มันจะไม่นับรวมในชื่อเสียงอีก', + revokeFailed: 'เพิกถอนการซื้อขายไม่ได้', + saleConfirmed: 'ยืนยันการขายแล้ว', + saleConfirmedBody: 'ตอนนี้พวกเขาสามารถยืนยันฝั่งของตนได้', + saleConfirmFailed: 'ยืนยันการขายไม่ได้', + tradeConfirmed: 'ยืนยันการซื้อขายแล้ว', + tradeConfirmedBody: 'อัปเดตชื่อเสียงให้ทั้งสองฝ่ายแล้ว', + tradeConfirmFailed: 'ยืนยันการซื้อขายไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + }, + card: { + listingDeleted: 'ลบรายการแล้ว', + listingRemoved: 'นำรายการออกแล้ว', + listingDeletedBody: 'รายการของคุณถูกลบแล้ว Relay ที่รองรับการลบจะหยุดให้บริการรายการนี้', + listingRemovedBody: 'รายการนี้ถูกนำลงและจะถูกซ่อนทั่วทั้ง SkateSpots', + removeFailed: 'นำออกไม่สำเร็จ', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + markedSold: 'ทำเครื่องหมายว่าขายแล้ว', + markedSoldBody: 'รายการของคุณแสดงว่าขายแล้ว', + couldNotUpdate: 'อัปเดตไม่ได้', + relisted: 'ลงใหม่แล้ว', + relistedBody: 'รายการของคุณกลับมาใช้งานอีกครั้ง', + listingOptions: 'ตัวเลือกของรายการ', + report: 'รายงาน', + removeAdmin: 'นำออก (แอดมิน)', + postage: 'ค่าส่ง', + newSeller: 'ผู้ขายใหม่', + saleOne: 'ขายได้ {{count}} ครั้ง', + saleMany: 'ขายได้ {{count}} ครั้ง', + iHaveThis: 'ฉันมีอันนี้!', + deleteTitle: 'ลบ "{{title}}"?', + adminRemoveTitle: 'นำรายการนี้ออก? (แอดมิน)', + deleteBody: 'การนี้จะขอให้ Relay นำรายการ "{{title}}" ของคุณออก ไม่สามารถเรียกคืนจากที่นี่ได้ — คุณต้องสร้างใหม่', + adminRemoveBody: 'ในฐานะแอดมิน SkateSpots คุณกำลังนำ "{{title}}" ออก มันจะถูกซ่อนทั่วทั้งแอปสำหรับทุกคน และจะส่งคำขอลบไปยัง Relay', + deleting: 'กำลังลบ…', + removing: 'กำลังนำออก…', + deleteListing: 'ลบรายการ', + removeListing: 'นำรายการออก', + reportCount: '{{count}} รายงาน', + reports: '{{count}} รายงาน', + viewTitle: 'ดู {{title}}', + reportListing: 'รายงานรายการ', + manageListing: 'จัดการรายการ', + trusted: 'Trusted', + daysOld: '{{n}} วัน', + monthsOld: '{{n}} เดือน', + yearsOld: '{{n}} ปี', + listingsCount: '{{count}} รายการ', + postageBuyer: 'ค่าส่ง: ผู้ซื้อ', + postageSeller: 'ค่าส่ง: ผู้ขาย', + postageSplit: 'ค่าส่ง: หารครึ่ง', + powTitle: 'NIP-13 proof of work — กันสแปมฟรี', + verifiedTradeOne: '{{count}} ดีลที่ยืนยันแล้ว', + verifiedTrades: '{{count}} ดีลที่ยืนยันแล้ว', + reportSubmitted: 'ส่งรายงานแล้ว', + reportSubmittedBody: 'ขอบคุณที่ช่วยให้ Marketplace ปลอดภัย', + reportFailed: 'ส่งรายงานไม่สำเร็จ', + selectReason: 'โปรดเลือกเหตุผล', + reportDialogBody: 'ช่วยให้ Marketplace ปลอดภัยด้วยการรายงานรายการที่ไม่เหมาะสมหรือทำให้เข้าใจผิด', + reasonLabel: 'เหตุผลในการรายงาน *', + detailsLabel: 'รายละเอียดเพิ่มเติม (ไม่บังคับ)', + detailsPlaceholder: 'ระบุบริบทเพิ่มเติมที่อาจเป็นประโยชน์...', + reportNote: 'รายงานจะถูกเผยแพร่ไปยัง Nostr และช่วยให้ชุมชนระบุรายการที่มีปัญหาได้ รายการที่มีหลายรายงานอาจถูกซ่อนโดยอัตโนมัติ', + submitting: 'กำลังส่ง...', + submitReport: 'ส่งรายงาน', + }, + tradeActions: { + tradeConfirmed: 'ยืนยันการซื้อขายแล้ว', + tradeConfirmedWithProof: 'แนบใบเสร็จที่ตรวจสอบได้แล้ว — นับเป็นดีลที่ยืนยันแล้ว', + tradeConfirmedBody: 'อัปเดตชื่อเสียงให้ทั้งสองฝ่ายแล้ว', + tradeConfirmFailed: 'ยืนยันการซื้อขายไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + requestNote: 'โปรดยืนยันการซื้อขายของเราสำหรับ "{{title}}"', + requestSent: 'ส่งคำขอยืนยันแล้ว', + requestSentBody: 'ตอนนี้ผู้ขายสามารถยืนยันการขายและสร้างชื่อเสียงให้ทั้งสองฝ่ายได้', + requestFailed: 'ส่งคำขอไม่ได้', + escrowRefunded: 'คืนเงิน escrow แล้ว', + escrowRefundedBody: 'เงินกลับเข้าสู่ Cashu wallet ของคุณแล้ว', + escrowRefundFailed: 'คืนเงิน escrow ไม่ได้', + confirmThisTrade: 'ยืนยันการซื้อขายนี้', + escrowAndRequest: 'Escrow และคำขอ', + shipsEscrowHint: 'ดีลส่งพัสดุ — ใช้ escrow เพื่อไม่ให้ฝ่ายใดส่งของไปอย่างไร้ปลายทาง แชร์ที่อยู่ของคุณเป็นการส่วนตัวในแชตการซื้อขาย ไม่ใช่ที่นี่', + shipsHint: 'ดีลส่งพัสดุ — ควรใช้ escrow ถ้าผู้ขายเสนอ และแชร์ที่อยู่ของคุณเฉพาะในแชตเท่านั้น', + askSeller: 'ขอให้ผู้ขายยืนยัน', + waitingSeller: 'ส่งคำขอยืนยันแล้ว — รอผู้ขายอยู่', + refundEscrow: 'คืนเงิน escrow', + buyWithSats: 'ซื้อด้วย sats', + depositTitle: 'เงินมัดจำแสดงเจตนาดี (ไม่บังคับ)', + payDeposit: 'จ่ายเงินมัดจำ', + depositBefore: 'การแลกเปลี่ยนไม่มีใบแจ้งหนี้ ดังนั้นนี่คือวิธีที่มันได้รับ', + verifiableCost: 'ต้นทุนที่ตรวจสอบได้', + depositAfter: ' คืนเงินเมื่อส่งมอบ (หรือใช้ Cashu escrow เพื่อคืนเงินอัตโนมัติ) ⚠️ พิสูจน์ความตั้งใจ ไม่ใช่การส่งมอบ', + depositPaid: 'จ่ายเงินมัดจำแล้ว', + depositPaidBody: 'บันทึกไว้แล้ว — จะแนบเมื่อยืนยันการซื้อขาย', + paid: 'จ่ายแล้ว ⚡', + paidWithProof: 'บันทึกใบเสร็จที่ตรวจสอบได้แล้ว — ยืนยันการซื้อขายเพื่อให้นับ', + paidBody: 'ขอให้ผู้ขายยืนยันการซื้อขายเพื่อให้นับสำหรับทั้งสองฝ่าย', + }, + offers: { + accepted: 'ตอบรับแล้ว', + declined: 'ปฏิเสธแล้ว', + withdrawn: 'ถอนแล้ว', + open: 'เปิดอยู่', + noAmount: 'ไม่มีจำนวน', + titleOwner: 'ข้อเสนอ ({{count}})', + titleBuyer: 'การเจรจาของคุณ', + you: 'คุณ', + them: 'อีกฝ่าย', + paidAskConfirm: 'จ่ายแล้ว — ขอให้ผู้ขายยืนยันการซื้อขาย', + payWithSats: 'จ่ายด้วย sats', + accept: 'ตอบรับ', + decline: 'ปฏิเสธ', + counter: 'ต่อรอง', + counterPlaceholder: 'ข้อเสนอตอบกลับของคุณ (sats)', + send: 'ส่ง', + counterItemPlaceholder: '…หรือต่อรองด้วยสินค้าที่จะแลก (ไม่บังคับ)', + waitingOn: 'รอ', + waitingOnSuffix: '— ตาของคุณจะกลับมาถ้าพวกเขาต่อรอง', + withdraw: 'ถอน', + dmAccepted: '✅ ข้อเสนอของคุณได้รับการตอบรับ! ส่งข้อความเพื่อนัดรับของ', + dmDeclined: '❌ ข้อเสนอของคุณถูกปฏิเสธ', + offerAccepted: 'ตอบรับข้อเสนอแล้ว', + offerDeclined: 'ปฏิเสธข้อเสนอแล้ว', + respondFailed: 'ตอบกลับไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + offerWithdrawn: 'ถอนข้อเสนอแล้ว', + withdrawFailed: 'ถอนไม่ได้', + enterAmountOrItem: 'ใส่จำนวนหรือสินค้าที่จะแลก', + counterDm: 'ข้อเสนอตอบกลับ', + counterSent: 'ส่งข้อเสนอตอบกลับแล้ว', + counterSentBody: 'ตอนนี้ถึงตาพวกเขาแล้ว', + counterFailed: 'ส่งข้อเสนอตอบกลับไม่ได้', + }, + offer: { + validAmount: 'ใส่จำนวนที่ถูกต้อง', + describeOffer: 'อธิบายข้อเสนอของคุณ', + describeOfferBody: 'เพิ่มจำนวน สินค้าที่จะแลก หรือข้อความ', + dmAmount: ' สำหรับ {{amount}} sats', + dmItem: ' (เสนอ: {{item}})', + dmBody: '🛹 ข้อเสนอใหม่สำหรับรายการ "{{title}}" ของคุณ{{amount}}{{item}}.{{note}}', + sent: 'ส่งข้อเสนอแล้ว', + sentBody: '{{sellerName}} สามารถตอบรับหรือปฏิเสธได้', + sendFailed: 'ส่งข้อเสนอไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + title: 'เสนอราคา', + description: 'เสนอ sats หรือแลกเปลี่ยนอะไรบางอย่าง — {{sellerName}} สามารถตอบรับ ปฏิเสธ หรือต่อรองได้ คุณตกลงการส่งมอบระหว่างกันเอง', + amountLabel: 'จำนวน (sats, ไม่บังคับ)', + amountPlaceholder: 'เช่น 45000', + itemLabel: 'หรือแลกเปลี่ยนบางอย่าง (ไม่บังคับ)', + itemPlaceholder: 'เช่น Deck 8.25 ของฉัน + Wheels สำรอง', + itemHint: 'จะแลกเปลี่ยน? ใส่สิ่งที่คุณเสนอไว้ที่นี่ — รวมกับ sats ได้', + messageLabel: 'ข้อความ (ไม่บังคับ)', + messagePlaceholder: 'อะไรก็ตามที่ผู้ขายควรรู้…', + send: 'ส่งข้อเสนอ', + }, + markSold: { + enterBuyer: 'ใส่ npub ของผู้ซื้อ', + dealClosed: 'ปิดดีลแล้ว 🎉', + dealClosedBody: 'ทำเครื่องหมายรายการว่าขายแล้ว และเผยแพร่การซื้อขายเพื่อชื่อเสียง', + closeFailed: 'ปิดดีลไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + title: 'ปิดดีล', + description: 'ทำเครื่องหมายรายการนี้ว่าขายแล้ว และบันทึกหลักฐานการซื้อขายที่ลงนามไว้สำหรับคุณและผู้ซื้อ', + buyerLabel: 'npub ของผู้ซื้อ', + methodLabel: 'ชำระด้วยวิธีไหน? (รายงานเอง)', + amountLabel: 'จำนวนเป็น sats (ไม่บังคับ)', + submit: 'ทำเครื่องหมายว่าขายแล้ว', + }, + handoff: { + title: 'นัดรับของ', + suggest: 'เสนอเวลาและสถานที่', + suggestDm: 'สวัสดี! ฉันอยากซื้อ "{{title}}" เสนอเวลาและสถานที่พบกัน — ยินดีเจอกันที่ Skate Spot สาธารณะ', + orMeetAt: 'หรือเจอกันที่ Spot สาธารณะใกล้ ๆ:', + spotDm: 'สวัสดี! ฉันอยากซื้อ "{{title}}" เจอกันที่ {{spot}} ไหม? {{url}}', + shareDelivery: 'แชร์รายละเอียดการจัดส่ง', + deliveryDm: 'สวัสดี! ฉันอยากซื้อ "{{title}}" นี่คือรายละเอียดการจัดส่งของฉัน:\n\nชื่อ:\nที่อยู่:\n\n(แชร์เฉพาะสิ่งที่ผู้ส่งของต้องใช้)', + useLocker: 'ใช้ตู้ล็อกเกอร์ / จุดรับพัสดุ', + lockerDm: 'สวัสดี! ฉันอยากซื้อ "{{title}}" ใช้ตู้ล็อกเกอร์ / ร้านรับพัสดุแทนที่อยู่บ้านได้ไหม?', + noteBefore: 'รายละเอียดเหล่านี้อยู่ในแชตส่วนตัว — SkateSpots ไม่เคยเห็น สำหรับดีลที่ส่งของ ควรใช้', + escrow: 'escrow', + noteMiddle: ' และ', + neverPay: 'ไม่จ่ายนอกช่องทางของแอป', + noteAfter: ' เจอกันในที่สาธารณะ', + }, + shipping: { + noCounterparty: 'ยังไม่มีคู่สัญญา', + noCounterpartyBody: 'ผู้ขายควรบันทึกการขาย (ระบุชื่อผู้ซื้อ) ก่อน', + markedShipped: 'ทำเครื่องหมายว่าส่งแล้ว', + markedReceived: 'ทำเครื่องหมายว่าได้รับแล้ว', + issueReported: 'รายงานปัญหาแล้ว', + receivedBody: 'ขอบคุณ — การนี้ไม่ได้ปล่อย escrow ให้ตกลงกับผู้ขายโดยตรง', + notifiedBody: 'แจ้งอีกฝ่ายแล้ว', + updateFailed: 'อัปเดตไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + title: 'การจัดส่ง', + shipped: 'ส่งแล้ว', + received: 'ได้รับแล้ว', + issue: 'ปัญหา', + trackingPlaceholder: 'เลขพัสดุ (ไม่บังคับ)', + iShipped: 'ฉันส่งของแล้ว', + iReceived: 'ฉันได้รับของแล้ว', + reportIssue: 'รายงานปัญหา', + noteBefore: 'รายงานเอง — เป็นบันทึกด้านโลจิสติกส์', + notProof: 'ไม่ใช่หลักฐาน', + noteAfter: ' การทำเครื่องหมาย "received" ไม่ได้ปล่อย escrow ⚠️ อย่าถ่ายรูปพัสดุที่มีที่อยู่ปรากฏ และแชร์เลขพัสดุเฉพาะเมื่อคุณโอเคที่จะให้มันเป็นสาธารณะ', + }, + pay: { + sent: 'ส่งการชำระเงินแล้ว ⚡', + sentWithProof: 'บันทึกใบเสร็จการชำระเงินที่ตรวจสอบได้แล้ว — จะนับเป็นยืนยันการจ่าย', + sentBody: 'บอกผู้ขาย — พวกเขาสามารถยืนยันการซื้อขายเพื่อให้นับสำหรับทั้งสองฝ่าย', + failed: 'การชำระเงินล้มเหลว', + title: 'จ่ายด้วย sats', + descSendPrefix: 'ส่ง', + descSendSuffix: 'ให้ {{sellerName}} เพื่อปิดดีลนี้', + descSettle: 'ปิดดีลนี้โดยตรงกับ {{sellerName}}', + paid: 'จ่ายแล้ว!', + paidBody: 'ขอให้ผู้ขายยืนยันการซื้อขาย — การยืนยันสองครั้งสร้างชื่อเสียงให้ทั้งสองฝ่าย', + noMethod: '{{sellerName}} ยังไม่ได้ตั้งวิธีชำระเงิน (ไม่มีใบแจ้งหนี้หรือที่อยู่ Lightning) ส่งข้อความหาเพื่อนัดวิธีจ่าย', + ownListing: 'นี่คือรายการของคุณเอง', + paying: 'กำลังจ่าย…', + pay: 'จ่าย', + payAmount: 'จ่าย {{amount}} sats', + footnote: 'จ่ายจาก wallet ที่เชื่อมต่อของคุณ (NWC, WebLN หรือ Cashu) ตรงไปยัง {{sellerName}} — SkateSpots ไม่เคยถือเงิน', + }, + spamFee: { + invoiceComment: 'ค่าธรรมเนียมลงรายการ SkateSpots', + generateFailed: 'สร้างใบแจ้งหนี้ไม่สำเร็จ', + paymentSuccess: 'ชำระเงินสำเร็จ!', + satsSent: 'ส่ง {{amount}} sats ให้ {{name}}', + autoPayFailed: 'จ่ายอัตโนมัติไม่สำเร็จ', + autoPayFailedBody: 'โปรดจ่ายด้วยตนเองโดยใช้ QR code หรือใบแจ้งหนี้', + invoiceCopied: 'คัดลอกใบแจ้งหนี้แล้ว!', + copyFailed: 'คัดลอกไม่สำเร็จ', + received: 'ได้รับการชำระเงินแล้ว!', + receivedBody: 'ชำระค่าธรรมเนียม {{amount}} sats ของคุณแล้ว ตอนนี้คุณสร้างรายการได้', + title: 'ค่าธรรมเนียมลงรายการครั้งเดียว', + subtitle: 'ในฐานะสมาชิกใหม่ ต้องมีค่าธรรมเนียมเล็กน้อยสำหรับรายการแรกของคุณ', + whyTitle: 'ทำไมฉันต้องจ่าย?', + spamLabel: 'ป้องกันสแปม:', + spamBody: 'ค่าธรรมเนียมนี้หยุดบอตและมิจฉาชีพไม่ให้ท่วม Marketplace ด้วยรายการปลอม', + trustLabel: 'สร้างความน่าเชื่อถือ:', + trustBody: 'บัญชีใหม่ต้องแสดงความตั้งใจก่อนลงรายการ หลังลงสำเร็จไม่กี่ครั้ง ค่าธรรมเนียมนี้จะถูกยกเว้น', + supportsLabel: 'สนับสนุนชุมชน:', + supportsPrefix: 'ค่าธรรมเนียมมอบให้', + supportsSpotOwner: ' — คนที่สร้าง Spot นี้!', + supportsPlatform: ' — ช่วยให้ SkateSpots ดำเนินต่อไป', + oneTimeFee: '~${{usd}} USD • ค่าธรรมเนียมครั้งเดียว', + payToContinue: 'จ่าย {{amount}} sats เพื่อไปต่อ', + proveWork: 'พิสูจน์ด้วยการทำงานแทน — ฟรี', + proveWorkBody: 'ใช้ CPU ไม่กี่วินาทีแทน {{amount}} sats ไม่มีเงิน ไม่มี wallet — ภาษีสแปม ไม่ใช่การชำระเงิน', + generating: 'กำลังสร้างใบแจ้งหนี้...', + processing: 'กำลังประมวลผลการชำระเงิน...', + qrAlt: 'QR code การชำระเงิน', + copyInvoice: 'คัดลอกใบแจ้งหนี้', + openWallet: 'เปิด Wallet', + payWithWallet: 'จ่ายด้วย Wallet ที่เชื่อมต่อ', + scanHint: 'สแกน QR code ด้วย Lightning wallet หรือใช้ปุ่มด้านบน', + skipTitle: 'วิธีข้ามค่าธรรมเนียมนี้ในอนาคต:', + skip1: 'เพิ่ม Skate Spot ลงในแผนที่', + skip2: 'ลงรายการสำเร็จ 2-3 ครั้ง', + skip3: 'สร้างชื่อเสียงในชุมชน', + skipNote: 'สมาชิกที่ไว้ใจได้ลงรายการฟรีไม่จำกัด!', + }, + reputation: { + highlyTrusted: 'นักซื้อขายที่น่าเชื่อถือสูง', + building: 'กำลังสร้างชื่อเสียง', + newTrader: 'นักซื้อขายใหม่', + title: 'การซื้อขาย', + verified: 'ยืนยันแล้ว', + sales: 'การขาย', + purchases: 'การซื้อ', + tradeConfirmedOne: 'ดีลที่ยืนยันร่วมกัน', + tradeConfirmedMany: 'ดีลที่ยืนยันร่วมกัน', + with: 'กับ', + personOne: 'คน', + personMany: 'คน', + awaiting: 'รอการยืนยันร่วมกัน', + withPaymentProof: 'พร้อมหลักฐานการชำระเงินแนบมา', + selfReported: '(รายงานเอง — ยังไม่ยืนยัน)', + paymentVerified: 'ยืนยันการจ่ายแล้ว', + zapReceipt: '(ใบเสร็จ Zap)', + singlePartnerWarning: 'ทุกการยืนยันมาจากบัญชีเดียวกัน การยืนยันร่วมกันเป็นการรายงานเอง โปรดพิจารณาบันทึกนี้อย่างระมัดระวัง', + lowDiversityWarning: 'การยืนยันส่วนใหญ่มาจากไม่กี่บัญชี กลุ่มเล็ก ๆ ที่รับรองซึ่งกันและกันอาจดูคึกคัก — โปรดพิจารณาบันทึกนี้อย่างระมัดระวัง', + ringWarning: 'บัญชีเหล่านี้ซื้อขายกันเองเป็นส่วนใหญ่ — เป็นกลุ่มปิด การยืนยันร่วมกันภายในวงเป็นหลักฐานที่อ่อน', + weighted: 'ถ่วงน้ำหนักด้วยความน่าเชื่อถือและกิจกรรม', + footnote: 'รายงานเองและลงนามร่วมกัน — เป็นสัญญาณ ไม่ใช่หลักฐานการชำระเงิน', + }, + reputationPanel: { + reviewOfYou: 'รีวิวเกี่ยวกับคุณ', + yourRecord: 'บันทึกของคุณ', + listing: 'รายการ', + averageOne: 'เฉลี่ยจาก {{count}} รีวิว', + averageMany: 'เฉลี่ยจาก {{count}} รีวิว', + reviewsTitle: 'รีวิวและบันทึกการซื้อขาย', + fromOthers: '{{count}} จากคนอื่น', + emptyBefore: 'ยังไม่มีบันทึกการซื้อขาย ปิดดีลและยืนยันใน', + emptyAfter: '— การยืนยันแต่ละครั้งกลายเป็นรีวิวบนโปรไฟล์ทั้งสองฝ่าย', + }, + recommendations: { + published: 'เผยแพร่คำแนะนำแล้ว', + publishedBody: 'ขอบคุณที่รับรอง', + failed: 'แนะนำไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + title: 'นักซื้อขายที่น่าเชื่อถือ', + recommendedBy: 'แนะนำโดย', + skaterOne: 'นักสเก็ต', + skaterMany: 'นักสเก็ต', + none: 'ยังไม่มีคำแนะนำ', + youRecommend: 'คุณแนะนำนักซื้อขายรายนี้ ✓', + recommend: 'แนะนำเป็นนักซื้อขายที่น่าเชื่อถือ', + }, + notification: { + newOffer: 'ข้อเสนอใหม่', + counterOffer: 'ข้อเสนอตอบกลับ', + offerAccepted: 'ตอบรับข้อเสนอแล้ว', + offerDeclined: 'ปฏิเสธข้อเสนอแล้ว', + offerWithdrawn: 'ถอนข้อเสนอแล้ว', + confirmTrade: 'ยืนยันการซื้อขาย', + tradeConfirmed: 'ยืนยันการซื้อขายแล้ว', + reviewOffer: 'ดูข้อเสนอ', + openListing: 'เปิดรายการ', + }, + confirmRow: { + rateTrade: 'ให้คะแนนการซื้อขาย:', + }, + deckRating: { + title: '{{value}}/10 Deck', + aria: '{{n}} จาก 10', + }, + clink: { + tip: 'ให้ทิปเป็น Bitcoin', + copiedBody: 'คัดลอกรหัส CLINK ไปยังคลิปบอร์ดแล้ว', + copyFailed: 'คัดลอกไม่สำเร็จ', + copyFailedBody: 'เข้าถึงคลิปบอร์ดไม่ได้', + whatIs: 'CLINK คืออะไร?', + tooltipTitle: 'จ่ายด้วย Bitcoin โดยตรงผ่าน Nostr', + tooltipBody: 'CLINK เป็นรหัสชำระเงินที่ดูแลตัวเองได้ — ไม่มีบัญชีแอป ไม่มีคนกลาง สแกนด้วย Lightning wallet ที่รองรับ แล้วทิปจะไปถึงพวกเขาทันที', + descRecipient: 'ส่งการชำระเงิน Bitcoin (Lightning) แบบดูแลตัวเองให้ {{recipientName}} — ไม่มีคนกลาง', + descGeneric: 'ส่งการชำระเงิน Bitcoin (Lightning) แบบดูแลตัวเองผ่าน Nostr — ไม่มีคนกลาง', + qrAlt: 'QR code ข้อเสนอ CLINK', + copyCode: 'คัดลอกรหัส CLINK', + openWallet: 'เปิดใน CLINK wallet', + copyToWallet: 'คัดลอกรหัสสำหรับ wallet ของคุณ', + priceFixed: 'คงที่ — {{amount}} sats', + priceFixedShort: 'ราคาคงที่', + priceVariable: 'ราคาแปรผัน', + priceVariableCurrency: 'กำหนดราคาเป็น {{currency}}', + priceSpontaneous: 'คุณเลือกจำนวนเอง', + footnote: 'สแกนด้วย wallet ที่รองรับ CLINK (เช่น ShockWallet) ถ้าไม่มีอะไรเปิดขึ้น ให้คัดลอกรหัสด้านบน — คุณอาจยังไม่ได้ติดตั้ง wallet ที่รองรับ CLINK ไม่มีผู้ดูแล ไม่มีเว็บเซิร์ฟเวอร์: ใบแจ้งหนี้ถูกขอโดยตรงผ่าน Nostr', + }, + paymentReadiness: { + ready: 'คุณรับเงินได้', + notReady: 'ตั้งค่าการชำระเงินเพื่อรับเงิน', + readyBefore: 'ที่อยู่ Lightning ของคุณ', + readyAfter: 'อยู่บนโปรไฟล์ของคุณ — ผู้คนสามารถ Zap และจ่ายให้คุณได้โดยตรง', + silentSet: ' ตั้งค่าที่อยู่ Bitcoin Silent Payment ไว้ด้วย', + notReadyBefore: 'เพิ่มที่อยู่ Lightning (และจะเพิ่มที่อยู่ Bitcoin Silent Payment ด้วยก็ได้) ใน', + nostrProfile: 'โปรไฟล์ Nostr', + notReadyAfter: 'เพื่อให้นักสเก็ตจ่ายเงินให้คุณได้ ตั้งค่าครั้งเดียวและใช้ได้กับทุกโปรไฟล์ที่คุณมีที่นี่', + }, + seller: { + trade: 'แลกเปลี่ยน', + active: 'Active', + markSold: 'ทำเครื่องหมายว่าขายแล้ว', + yourListings: 'รายการของคุณ', + activeCount: '{{count}} ที่ใช้งานอยู่', + listItem: 'ลงขายสินค้า', + loading: 'กำลังโหลดรายการของคุณ…', + empty: 'คุณยังไม่มีรายการ', + listFirst: 'ลงขายสินค้าชิ้นแรกของคุณ', + }, + noffer: { + label: 'รหัสข้อเสนอ CLINK', + optional: '(ไม่บังคับ, ขั้นสูง)', + offerId: 'ข้อเสนอ: {{id}}', + relay: 'Relay: {{relay}}', + invalidBefore: 'ดูเหมือนจะไม่ใช่รหัส', + invalidAfter: 'ที่ถูกต้อง', + valid: 'รหัส CLINK ถูกต้อง — ปุ่ม "จ่ายผ่าน CLINK" จะแสดงบนโปรไฟล์ของคุณ', + help: 'วางรหัสชำระเงิน CLINK แบบดูแลตัวเอง (เช่น จาก ShockWallet / Lightning.Pub) เพื่อรับการชำระเงิน Lightning แบบ Nostr-native — ไม่มีเว็บเซิร์ฟเวอร์หรือผู้ดูแล', + learnSpecs: 'ดูสเปก', + }, + escrowPanel: { + escrowed: 'Escrow แล้ว {{amount}} sats', + mint: 'Mint', + refundSinceBefore: 'ผู้ซื้อขอคืนเงินได้ตั้งแต่', + redeemBefore: 'ผู้ขายแลกได้ตอนนี้ · ผู้ซื้อขอคืนเงินได้หลัง', + noExpiry: 'โทเคนนี้ไม่ได้ตั้งวันหมดอายุ', + }, + escrowRequest: { + enterAmount: 'ใส่จำนวน escrow', + minLock: 'ล็อกอย่างน้อย {{days}} วัน', + requestNote: 'Escrow {{amount}} sats สำหรับการซื้อขายของเรา — โปรดยืนยันการขาย', + created: 'สร้าง escrow แล้ว 🎉', + createdBody: 'ล็อก {{amount}} sats เป็นเวลา {{days}} วัน {{sellerName}} แลกได้เมื่อส่งมอบ', + createFailed: 'สร้าง escrow ไม่ได้', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + title: 'ทำ escrow การซื้อขายนี้', + description: 'เงินถูกล็อกให้ {{sellerName}} และคุณขอคืนได้ถ้าดีลล้มเหลวหลังกำหนด ต้องมี Lightning wallet ที่เชื่อมต่อ', + amountLabel: 'จำนวน (sats)', + daysLabel: 'ผู้ซื้อขอคืนเงินหลัง (วัน)', + daysHint: 'หลังจากผ่านไปหลายวันนี้ คุณสามารถเรียกเงินคืนได้ถ้าผู้ขายยังไม่ส่งมอบ', + nativeOnly: 'Cashu escrow ใช้ได้เฉพาะในแอป SkateSpots (ไม่ใช่เวอร์ชันเว็บ)', + lockAndRequest: 'ล็อกและขอ', + }, + }, +}; + +export default thBatch6; diff --git a/src/i18n/th/batch7.ts b/src/i18n/th/batch7.ts new file mode 100644 index 0000000..10d61c2 --- /dev/null +++ b/src/i18n/th/batch7.ts @@ -0,0 +1,711 @@ +/** + * Thai (ไทย) — batch 7: places (events, shops, tours, food). Skate vocabulary + * (สปอต/อีเวนต์/ทัวร์/crew), brand and protocol names (The Lab, Nostr, Lightning, + * Zap, Relay, sats) and trick names stay as established in earlier batches. + */ +const thBatch7 = { + placesUi: { + addToCalendar: { + add: 'เพิ่มลงปฏิทิน', + appleOutlook: 'Apple / Outlook (.ics)', + google: 'ปฏิทิน Google', + }, + attendees: { + goingCount: 'ไป', + goingTab: 'ไป ({{count}})', + interestedTab: 'สนใจ ({{count}})', + nobodyGoing: 'ยังไม่มีใครยืนยัน', + nobodyInterested: 'ยังไม่มีใครกดสนใจ', + noRsvps: 'ยังไม่มี RSVP — เป็นคนแรกที่บอกว่าจะไปสิ', + trusted: 'เชื่อถือได้', + trustedTitle: 'คนที่คุณติดตามหรือนักแมปที่เชื่อถือได้', + youTrust: 'ที่คุณเชื่อถือ', + }, + bounty: { + addressCoords: 'ที่อยู่และพิกัด', + basic: 'พื้นฐาน', + contactInfo: 'ข้อมูลติดต่อ', + description: 'คำอธิบาย', + earningPotential: 'ศักยภาพรายได้', + excellent: 'ยอดเยี่ยม!', + gettingStarted: 'เริ่มต้น', + good: 'ดี', + onePhoto: 'อย่างน้อย 1 รูป', + openingHours: 'เวลาทำการ', + shopName: 'ชื่อร้าน', + threePhotos: '3 รูปขึ้นไป', + tip: '💡 คุณภาพสูงขึ้น = ได้ Zap จากชุมชนมากขึ้น!', + }, + calendar: { + allDay: 'ตลอดวัน', + eventDay: 'วันอีเวนต์', + eventsOnDay: '{{count}} อีเวนต์', + eventsThisMonth: 'อีเวนต์เดือนนี้', + going: 'ไป', + months: { + january: 'มกราคม', + february: 'กุมภาพันธ์', + march: 'มีนาคม', + april: 'เมษายน', + may: 'พฤษภาคม', + june: 'มิถุนายน', + july: 'กรกฎาคม', + august: 'สิงหาคม', + september: 'กันยายน', + october: 'ตุลาคม', + november: 'พฤศจิกายน', + december: 'ธันวาคม', + }, + nextMonth: 'เดือนถัดไป', + nothingOnDay: 'ไม่มีอะไรในวันนี้', + prevMonth: 'เดือนก่อน', + tapHighlighted: 'แตะวันที่ไฮไลต์เพื่อดูว่ามีอะไร', + today: 'วันนี้', + tourDay: 'วันทัวร์', + toursOnDay: '{{count}} ทัวร์', + toursThisMonth: 'ทัวร์เดือนนี้', + weekdays: { + sun: 'อา.', + mon: 'จ.', + tue: 'อ.', + wed: 'พ.', + thu: 'พฤ.', + fri: 'ศ.', + sat: 'ส.', + }, + weekdaysShort: { + sun: 'อา', + mon: 'จ', + tue: 'อ', + wed: 'พ', + thu: 'พฤ', + fri: 'ศ', + sat: 'ส', + }, + }, + countdown: { + ended: 'จบแล้ว', + happeningNow: 'กำลังเกิดขึ้น', + inDays: 'อีก {{count}} วัน', + inHoursMins: 'อีก {{hours}} ชม. {{mins}} นาที', + inMins: 'อีก {{count}} นาที', + startingNow: 'กำลังเริ่ม', + tomorrow: 'พรุ่งนี้', + }, + createEvent: { + add: 'เพิ่ม', + addNewSpot: 'เพิ่มสปอตใหม่ →', + changeSpot: 'เปลี่ยนสปอต', + created: 'สร้างอีเวนต์แล้ว!', + createdDesc: 'อีเวนต์ของคุณถูกเผยแพร่สู่เครือข่ายแล้ว', + entryFee: 'ค่าเข้า', + entryFeeHint: '(ไม่บังคับ — เช่น "500 sats" หรือ "£10")', + entryFeePlaceholder: 'เว้นว่างสำหรับอีเวนต์ฟรี', + featuring: 'แสดงโดย {{name}}', + featuringDesc: 'การแสดงนี้จะถูกติดแท็กเป็นดนตรีสดและปรากฏในรายการแสดงของพวกเขา', + fundingGoal: 'เป้าหมายระดมทุน', + fundingGoalHint: '(ไม่บังคับ — sats ที่จะระดมทุนผ่าน Zap)', + fundingGoalPlaceholder: 'เช่น 50000', + geoNotSupported: 'ไม่รองรับตำแหน่งทางภูมิศาสตร์', + geoNotSupportedDesc: 'เบราว์เซอร์ของคุณไม่รองรับตำแหน่งทางภูมิศาสตร์', + hideSpots: 'ซ่อนสปอต', + hostingAs: 'จัดในนาม {{name}}', + hostingAsDesc: 'อีเวนต์นี้จะแสดงบนหน้า crew ของคุณและถูกติดแท็กว่าจัดโดย crew', + imageUploaded: 'อัปโหลดรูปแล้ว', + imageUploadedDesc: 'อัปโหลดรูปของคุณสำเร็จแล้ว', + invalidDate: 'วันที่ไม่ถูกต้อง', + invalidDateDesc: 'กรุณากรอกวันและเวลาเริ่มต้นที่ถูกต้อง', + invalidEnd: 'เวลาสิ้นสุดไม่ถูกต้อง', + invalidEndDesc: 'เวลาสิ้นสุดต้องอยู่หลังเวลาเริ่มต้น', + linkedTo: 'เชื่อมกับ: {{title}}', + linkToSpot: 'เชื่อมกับสปอตสเก็ต', + linkToShop: 'เชื่อมกับร้าน', + selectedShop: 'เชื่อมกับ {{name}}', + selectShopHint: 'ไม่บังคับ — จัดที่หรือจัดโดยร้านสเก็ต', + selectShop: 'เลือกร้าน', + changeShop: 'เปลี่ยนร้าน', + hideShops: 'ซ่อนร้าน', + searchShops: 'ค้นหาร้าน…', + noShopsMatch: 'ไม่มีร้านที่ตรงกับการค้นหาของคุณ', + noShopsAvailable: 'ยังไม่มีร้านที่ใช้ได้', + linkToTour: 'เชื่อมกับทัวร์ (ไม่บังคับ)', + linkTourDesc: 'เชื่อมอีเวนต์นี้กับทัวร์เพื่อแสดงว่าเป็นส่วนหนึ่งของซีรีส์ที่ใหญ่ขึ้น เหมาะกับทัวร์ระดับประเทศ การผจญภัยข้ามประเทศ หรือวันชาเลนจ์ของ World Destruction Tour', + loadingSpots: 'กำลังโหลดสปอต...', + loadingTours: 'กำลังโหลดทัวร์...', + locationError: 'ข้อผิดพลาดตำแหน่ง', + locationFound: 'พบตำแหน่งแล้ว', + locationFoundDesc: 'ตั้งตำแหน่งปัจจุบันของคุณแล้ว', + logoUrl: 'URL โลโก้ (ไม่บังคับ)', + noSpotsAvailable: 'ไม่มีสปอตที่ใช้ได้', + noSpotsMatch: 'ไม่มีสปอตที่ตรงกับการค้นหาของคุณ', + noTourLinked: 'ยังไม่ได้เชื่อมทัวร์', + optional: '(ไม่บังคับ)', + pastDesc: 'เลือกวันและเวลาในอนาคต เพื่อให้นักสเก็ต RSVP และมาร่วมได้', + pastTitle: 'เวลาเริ่มต้นนั้นผ่านไปแล้ว', + publishFailed: 'เผยแพร่ไม่สำเร็จ', + publishFeatured: 'เผยแพร่อีเวนต์แนะนำ', + removeSponsor: 'ลบผู้สนับสนุน', + searchSpots: 'ค้นหาสปอตตามชื่อ ตำแหน่ง หรือหมวดหมู่...', + selectedSpot: 'เลือกแล้ว: {{name}}', + selectSpot: 'เลือกสปอต', + selectSpotHint: 'เลือกสปอตจากแผนที่ที่อีเวนต์นี้จะจัดขึ้น', + selectTour: 'เลือกทัวร์', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + sponsorName: 'ชื่อผู้สนับสนุน', + sponsors: 'ผู้สนับสนุน', + sponsorsHint: 'มีร้านหรือแบรนด์สนับสนุนอยู่ไหม? เพิ่มโลโก้ของพวกเขา — จะแสดงเป็นแถบ "Presented by" บนอีเวนต์', + startRequired: 'ต้องระบุเวลาเริ่มต้น', + startRequiredDesc: 'กรุณาระบุเวลาที่อีเวนต์เริ่ม', + titleRequired: 'ต้องระบุชื่อ', + titleRequiredDesc: 'กรุณากรอกชื่อสำหรับอีเวนต์นี้', + uploadFailed: 'อัปโหลดไม่สำเร็จ', + uploadFailedDesc: 'อัปโหลดรูปไม่สำเร็จ', + websiteUrl: 'URL เว็บไซต์ (ไม่บังคับ)', + }, + createShop: { + address: 'ที่อยู่ร้าน', + addressPlaceholder: 'เช่น 411 N Fairfax Ave, Los Angeles, CA 90036', + addressRequired: 'ต้องระบุที่อยู่', + addressRequiredDesc: 'กรุณากรอกที่อยู่ร้านของคุณ', + contactHint: 'ช่วยให้ลูกค้าติดต่อคุณได้ (แนะนำให้มีช่องทางติดต่ออย่างน้อยหนึ่งอย่าง)', + contactInfo: 'ข้อมูลติดต่อ', + created: '🎉 เพิ่มร้านแล้ว!', + createdDesc: 'ร้านสเก็ตของคุณอยู่บนแผนที่แล้ว นักสเก็ตสามารถ Zap คุณเพื่อขอบคุณได้!', + descriptionPlaceholder: 'เล่าให้คนรู้จักร้านของคุณ คุณขายอะไร จุดเด่นของคุณ...', + detailsDesc: 'บอกชุมชนเกี่ยวกับร้านของคุณ ฟิลด์ที่ทำเครื่องหมาย * จำเป็นต้องกรอก', + email: 'อีเมล', + hoursOfOperation: 'เวลาทำการ', + hoursPlaceholder: 'เช่น จ.-ส. 10:00-20:00, อา. 12:00-18:00', + instagram: 'Instagram', + invalidCoords: 'พิกัดไม่ถูกต้อง', + invalidCoordsDesc: 'กรุณากรอกละติจูด (-90 ถึง 90) และลองจิจูด (-180 ถึง 180) ที่ถูกต้อง', + latPlaceholder: 'ละติจูด (เช่น 34.0737)', + lngPlaceholder: 'ลองจิจูด (เช่น -118.3614)', + locationRequired: 'ต้องระบุตำแหน่ง', + locationRequiredDesc: 'กรุณากรอกพิกัดหรือใช้ตำแหน่งปัจจุบันของคุณ', + loginToAdd: 'คุณต้องเข้าสู่ระบบเพื่อเพิ่มร้านสเก็ต', + namePlaceholder: 'เช่น Supreme Los Angeles', + nameRequired: 'ต้องระบุชื่อร้าน', + nameRequiredDesc: 'กรุณากรอกชื่อสำหรับร้านของคุณ', + phoneNumber: 'เบอร์โทรศัพท์', + publishFailedDesc: 'เกิดข้อผิดพลาดบางอย่าง ตรวจสอบ console เพื่อดูรายละเอียด', + shopPhotoAlt: 'ร้าน', + shopPhotos: 'รูปร้าน', + subtitle: 'ลงร้านของคุณบนแผนที่และเชื่อมต่อกับชุมชน', + upload: 'อัปโหลด', + }, + createTour: { + acceptedClipSources: 'แหล่งคลิปที่รับ', + acceptedClipSourcesDesc: 'คุณจะรับรูปแบบไหนสำหรับการส่งคลิป?', + accommodationInfo: 'ข้อมูลที่พัก', + accommodationPlaceholder: "คำแนะนำหรือการจัดการที่พัก เช่น 'โฮสเทลราคาประหยัดตามเส้นทาง', 'ต้องมีอุปกรณ์แคมป์ปิ้ง', 'รวม Airbnb'", + addChallenge: 'เพิ่มชาเลนจ์', + addCity: 'เพิ่มเมือง...', + addCountry: 'เพิ่มประเทศ...', + addShopFirst: 'เพิ่มร้านก่อน', + alsoSelected: 'เลือกไว้ด้วย:', + availabilityPlaceholder: 'เช่น เสาร์-อาทิตย์, เฉพาะเช้า, นัดหมาย', + availabilityQuestion: 'ปกติคุณว่างเมื่อไหร่?', + availableShops: 'ร้านสเก็ตที่ใช้ได้ ({{count}})', + challengeDescPlaceholder: 'คำอธิบาย (ไม่บังคับ)...', + challenges: 'ชาเลนจ์', + challengesRequired: 'ต้องมีชาเลนจ์', + challengesRequiredDesc: 'กรุณาเพิ่มชาเลนจ์อย่างน้อยหนึ่งอย่างให้ทีมทำ', + challengesSecret: 'ชาเลนจ์ทั้งหมดเป็นความลับจนถึงวันเริ่มการแข่งขัน ทีมจะไม่เห็นจนถึงตอนนั้น!', + challengeTitlePlaceholder: "ชื่อชาเลนจ์ เช่น 'Kickflip a 10 stair'", + citiesLabel: 'เมือง', + citiesOnTour: 'เมืองในทัวร์', + cityPlaceholder: 'เช่น Berlin, Germany', + cityRegion: 'เมือง / ภูมิภาค', + cityRequired: 'ต้องระบุเมือง/ภูมิภาค', + cityRequiredDesc: 'กรุณากรอกเมืองหรือภูมิภาคของคุณ', + clipAnyUrl: '🔗 URL ใดก็ได้', + clipBlossom: '📦 อัปโหลดผ่าน Blossom', + clipInstagram: '📸 Instagram', + clipYouTube: '▶️ YouTube', + competitionDates: 'วันแข่งขัน', + competitionDatesWarning: '⚠️ ชาเลนจ์ทั้งหมดเป็นความลับจนถึงวันเริ่ม! ทีมจะไม่เห็นชาเลนจ์จนกว่าการแข่งขันจะเริ่ม', + competitionLocations: 'สถานที่แข่งขัน', + competitionLocationsDesc: 'ทีมจะแข่งขันที่ไหน? เพิ่มเมืองและประเทศที่เกี่ยวข้องทั้งหมด', + coordsHint: 'พิกัดไม่บังคับ เพิ่มเพื่อปักหมุดจุดนัดพบของคุณบนแผนที่', + countriesLabel: 'ประเทศ', + countriesRequired: 'ต้องระบุประเทศ', + countriesRequiredDesc: 'กรุณาเพิ่มอย่างน้อยหนึ่งประเทศสำหรับทัวร์ระหว่างประเทศของคุณ', + createdDestruction: '💀 สร้าง WORLD DESTRUCTION TOUR แล้ว!', + createdDestructionDesc: 'ทีมสามารถลงทะเบียนได้ ชาเลนจ์จะเปิดเผยในวันเริ่ม!', + createDestructionTour: 'สร้าง World Destruction Tour', + createdInternational: '✈️ สร้างทัวร์ระหว่างประเทศแล้ว!', + createdInternationalDesc: 'การผจญภัยระดับโลกของคุณถูกประกาศแล้ว! เชื่อมต่อกับนักสเก็ตทั่วโลก', + createdLocal: '🏠 สร้าง Local Tour แล้ว!', + createdLocalDesc: 'ทัวร์ของคุณปรากฏแล้ว นักสเก็ตสามารถจองผ่าน DM!', + createdNational: '🚐 สร้าง National Tour แล้ว!', + createdNationalDesc: 'ทริปบนถนนของคุณพร้อมแล้ว! เริ่มประสานงานกับนักสเก็ตที่สนใจ', + departure: 'วันออกเดินทาง *', + departureRequired: 'ต้องระบุวันออกเดินทาง', + departureRequiredDesc: 'กำหนดวันเดินทางออก เพื่อให้นักสเก็ตวางแผนและจองได้', + descriptionPlaceholder: 'อธิบายว่านักสเก็ตจะได้พบอะไร: สปอตที่จะไป บรรยากาศ สิ่งที่ทำให้ทัวร์ของคุณไม่เหมือนใคร...', + destructionDesc: 'ตั้งค่าการแข่งขันระดับโลกสไตล์ KOTR — คุณกำหนดทุกอย่าง!', + discountHint: 'ผู้ร่วมทัวร์สามารถแสดงการยืนยันการจองที่ร้านเพื่อรับส่วนลดนี้', + discountPercentage: 'เปอร์เซ็นต์ส่วนลด', + dropTour: 'เปิดทัวร์', + duration: 'ระยะเวลา', + durationHintDestruction: 'การแข่งขันยาวนานแค่ไหน? (1-12 เดือน)', + durationHintInternational: 'การผจญภัยกี่สัปดาห์? (ไม่เกิน 2 เดือน)', + durationHintLocal: 'ทัวร์ปกติของคุณยาวนานแค่ไหน?', + durationHintNational: 'ทริปบนถนนกี่วัน?', + durationWeeksMonths: '{{weeks}} สัปดาห์ (~{{months}} เดือน)', + editTour: 'แก้ไขทัวร์', + enable: 'เปิดใช้', + enabled: 'เปิดใช้แล้ว', + endBeforeStart: 'สิ้นสุดก่อนเริ่ม', + endBeforeStartDesc: 'วันสิ้นสุดการแข่งขันต้องเป็นวันเดียวกับหรือหลังวันเริ่มต้น', + endDate: 'วันสิ้นสุด', + entryFeeHint: 'คุณได้ 95% • แพลตฟอร์มรับ 5% • เว้นว่างสำหรับการเข้าร่วมฟรี', + entryFeePerTeam: 'ค่าเข้าต่อทีม (sats)', + entryFeePlaceholder: 'เช่น 100000', + entryPrizes: 'ค่าเข้าและรางวัล', + filmPremieres: 'รอบฉายหนังของทีม', + filmPremieresDesc: 'หลังการแข่งขัน คลิปของแต่ละทีมจะกลายเป็นหนังเต็มเรื่องที่ฉายรอบปฐมทัศน์ได้ที่ร้านสเก็ตท้องถิ่นทั่วโลก', + filmPremieresInfo: '🎥 ทีมรวบรวมคลิปชาเลนจ์เป็นหนังเรื่องสุดท้าย ร้านค้าจัดอีเวนต์รอบปฐมทัศน์ได้ เชื่อมการแข่งขันระดับโลกกับชุมชนท้องถิ่น', + filmReleaseDate: 'วันเผยแพร่หนัง (ไม่บังคับ)', + filmReleaseDateHint: 'วันที่หนังจะพร้อมให้ชม เว้นว่างเพื่อเผยแพร่ทันทีหลังการแข่งขันจบ', + fixedSession: 'เซสชันแบบกำหนดเวลา', + fixedSessionDesc: 'วันและเวลาที่กำหนดไว้', + flexible: 'ยืดหยุ่น', + flexibleDesc: 'จองได้ทุกเวลาผ่าน DM', + hide: 'ซ่อน', + howDestruction1: '• การแข่งขันทีมระดับโลก — ยาวนานถึง 12 เดือน', + howDestruction2: '• คุณกำหนดชาเลนจ์ คะแนน รางวัล — เราแค่ให้แพลตฟอร์ม', + howDestruction3: '• ชาเลนจ์ทั้งหมดเป็นความลับจนถึงวันเริ่มการแข่งขัน', + howDestruction4: '• คลิปผ่านการอัปโหลด Blossom หรือลิงก์ภายนอก (YouTube, Instagram, URL ใดก็ได้)', + howDestruction5: '• เฉพาะระดับสูง — รวมสปอตทุกประเภทโดยอัตโนมัติ', + howDestruction6: '• แพลตฟอร์มรับเพียง 5% ของค่าเข้า (ไม่ใช่เงินรางวัล)', + howDestructionTitle: '💀 WORLD DESTRUCTION TOUR - สไตล์ KOTR', + howInternational1: '• การผจญภัยข้ามพรมแดนในหลายประเทศ', + howInternational2: '• คุณตั้งราคา — แพลตฟอร์มรับเพียง 5%', + howInternational3: '• กำหนดวันออกเดินทางและวันกลับ เพื่อให้ crew จองเที่ยวบินได้', + howInternational4: '• เชื่อมต่อนักสเก็ตจากทั่วโลก', + howInternational5: '• สร้างประสบการณ์ระดับโลกที่ลืมไม่ลง!', + howInternationalTitle: 'ทัวร์ระหว่างประเทศทำงานอย่างไร', + howItWorks: 'วิธีการทำงาน:', + howLocal1: '• คุณตั้งราคา — แพลตฟอร์มรับ 10%', + howLocal2: '• สปอตลับยังคงลับ — คุณพาไปดูด้วยตัวเอง', + howLocal3: '• จัดเซสชันตามกำหนด หรือยืดหยุ่น / นัดหมาย', + howLocal4: '• นักสเก็ตจองผ่าน DM จ่ายด้วย Lightning และเพิ่มลงปฏิทินได้', + howLocal5: '• สร้างชื่อเสียงด้วยรีวิวและ Zap', + howLocalTitle: 'Local Tour ทำงานอย่างไร', + howNational1: '• ทริปบนถนนหลายเมืองทั่วประเทศของคุณ', + howNational2: '• คุณตั้งราคา — แพลตฟอร์มรับเพียง 7%', + howNational3: '• กำหนดวันเดินทาง เพื่อให้นักสเก็ตวางแผนลางานและเดินทางได้', + howNational4: '• ใส่ข้อมูลการเดินทาง / ที่พักสำหรับ crew', + howNational5: '• สร้างการผจญภัยสเก็ตในตำนาน!', + howNationalTitle: 'National Tour ทำงานอย่างไร', + imageUploadedDesc: 'อัปโหลดรูปทัวร์ของคุณแล้ว', + incompleteCoords: 'พิกัดไม่ครบถ้วน', + incompleteCoordsDesc: 'กรุณากรอกทั้งละติจูดและลองจิจูด หรือเว้นว่างทั้งคู่', + internationalDetails: 'รายละเอียดการผจญภัยระหว่างประเทศ', + languagesSelected: 'เลือก {{count}}', + languagesSpoken: 'ภาษาที่พูด', + latOptional: 'ละติจูด (ไม่บังคับ)', + lngOptional: 'ลองจิจูด (ไม่บังคับ)', + loadingProfile: 'กำลังโหลดโปรไฟล์...', + loadingProfileDesc: 'กำลังตรวจสอบสถานะการยืนยัน NIP-05 ของคุณ', + loadingShops: 'กำลังโหลดร้าน...', + localShopPremieres: 'รอบปฐมทัศน์ที่ร้านท้องถิ่น', + localShopPremieresDesc: 'ร้านสเก็ตทั่วโลกจัดคืนฉายหนังได้', + loginToCreate: 'คุณต้องเข้าสู่ระบบเพื่อสร้างทัวร์', + maxGroupSize: 'ขนาดกลุ่มสูงสุด', + maxTeams: 'ทีมสูงสุด', + maxTeamSize: 'ขนาดทีมสูงสุด', + meetingLocationSet: 'ตั้งตำแหน่งปัจจุบันของคุณเป็นจุดนัดพบแล้ว', + meetingPointDesc: 'คุณจะพบผู้ร่วมทัวร์ที่ไหน? เลือกสปอตสาธารณะที่รู้จักกันดี', + meetingPointLabel: 'จุดนัดพบ', + meetingPointPlaceholder: 'เช่น Warschauer Straße Station', + meetingPointRequired: 'ต้องระบุจุดนัดพบ', + meetingPointRequiredDesc: 'กรุณาระบุว่าคุณจะพบผู้ร่วมทัวร์ที่ไหน', + minTeamSize: 'ขนาดทีมขั้นต่ำ', + noChallenges: 'ยังไม่มีชาเลนจ์', + noChallengesDesc: 'เพิ่มชาเลนจ์ให้ทีมทำ', + noPartnerShop: 'ไม่มีร้านพาร์ทเนอร์', + noShopsFound: 'ยังไม่พบร้านสเก็ตบนเครือข่าย', + noShopsRegistered: 'ยังไม่มีร้านสเก็ตลงทะเบียน', + onlineRelease: 'เผยแพร่ออนไลน์', + onlineReleaseDesc: 'เผยแพร่หนังบน YouTube/Nostr ด้วย', + organizerContact: 'ข้อมูลติดต่อผู้จัด', + organizerContactHint: 'ข้อมูลนี้จะปรากฏต่อทีมที่ลงทะเบียน', + organizerContactPlaceholder: 'ทีมติดต่อคุณได้อย่างไร? เช่น Nostr npub, อีเมล, Telegram ฯลฯ', + partnerDiscountDesc: 'เสนอส่วนลดให้ผู้ร่วมทัวร์ที่ร้านสเก็ตท้องถิ่น', + partnerStep1: '1. จับมือกับร้านสเก็ตท้องถิ่นที่คุณไว้ใจ', + partnerStep2: '2. ตั้งเปอร์เซ็นต์ส่วนลดสำหรับผู้ร่วมทัวร์', + partnerStep3: '3. หลังทัวร์ มอบการยืนยันให้ผู้ร่วมทัวร์นำไปแสดงที่ร้าน', + partnerStep4: '4. ร้านให้ส่วนลดตามที่ตกลง — สร้างชุมชนและดึงคนเข้าร้าน!', + percentOff: 'ลด {{percent}}%', + photoHint: 'เพิ่มรูปคุณกำลังสเก็ตหรือสปอตเจ๋ง ๆ จากทัวร์ของคุณ', + pickRide: 'เลือกรถของคุณ', + place1: '🥇 ที่ 1', + place2: '🥈 ที่ 2', + place3: '🥉 ที่ 3', + platformFee: 'คุณตั้งราคา • แพลตฟอร์มรับ {{percent}}', + points: 'คะแนน:', + pricePerPerson: 'ราคาต่อคน (sats)', + pricePlaceholder: 'เช่น 25000', + prizeDistribution: 'การแบ่งรางวัล', + prizePoolHint: 'ไม่บังคับ — รางวัลรวมที่มี', + prizePoolPlaceholder: 'เช่น 2000000', + proTipDesc: 'ก่อนลงส่วนลดพาร์ทเนอร์ ติดต่อเจ้าของร้านผ่าน DM เพื่อตกลงเปอร์เซ็นต์ส่วนลด เพื่อให้แน่ใจว่าพวกเขาตกลงและจะให้ส่วนลดกับผู้ร่วมทัวร์ของคุณ', + proTipTitle: '💡 เคล็ดลับ: ประสานกับร้านก่อน!', + return: 'วันกลับ', + returnBeforeDeparture: 'กลับก่อนออกเดินทาง', + returnBeforeDepartureDesc: 'วันกลับต้องเป็นวันเดียวกับหรือหลังวันออกเดินทาง', + roadTripDetails: 'รายละเอียดทริปบนถนน', + schedule: 'ตารางเวลา', + scheduleDesc: 'จัดเป็นเซสชันตามกำหนดครั้งเดียว หรือให้ยืดหยุ่นและให้นักสเก็ตจองเวลาผ่าน DM', + secretUntilStart: 'ความลับจนถึงวันเริ่ม', + selectPartnerShop: 'เลือกร้านพาร์ทเนอร์', + sessionDateRequired: 'ต้องระบุวันเซสชัน', + sessionDateRequiredDesc: 'เลือกวันและเวลาสำหรับเซสชันตามกำหนด หรือเปลี่ยนเป็นตารางแบบยืดหยุ่น', + sessionDateTime: 'วันและเวลาเซสชัน', + sessionDateTimeHint: 'นักสเก็ตจะเห็นเวลานี้และเพิ่มลงปฏิทินได้จากหน้าทัวร์', + shopPremieresContact: 'ติดต่อร้านเหล่านี้โดยตรงเพื่อจัดคืนฉายรอบปฐมทัศน์ การจัดการทั้งหมดเป็นส่วนตัว', + shopPremieresHow: '💡 รอบปฐมทัศน์ที่ร้านทำงานอย่างไร: ติดต่อร้านโดยตรงเพื่อจัดคืนฉายรอบปฐมทัศน์ การจัดการทั้งหมดเป็นความลับระหว่างคุณกับร้าน', + shopsCanRegister: 'ร้านค้าลงทะเบียนได้ที่ /create-shop', + show: 'แสดง', + showAllLanguages: 'แสดงทั้ง {{count}} ภาษา', + somethingWrong: 'เกิดข้อผิดพลาดบางอย่าง', + spotTypes: 'ประเภทสปอต', + spotTypesRequired: 'ต้องระบุประเภทสปอต', + spotTypesRequiredDesc: 'กรุณาเลือกประเภทสปอตอย่างน้อยหนึ่งอย่างที่คุณจะพาไป', + startDate: 'วันเริ่มต้น', + startDateRequired: 'ต้องระบุวันเริ่มต้น', + startDateRequiredDesc: 'กรุณากำหนดเวลาที่การแข่งขันเริ่ม (ชาเลนจ์จะเปิดเผยในวันนี้)', + startingCity: 'เมืองเริ่มต้น', + startingCityPlaceholder: 'เช่น Los Angeles, USA', + teamSettings: 'การตั้งค่าทีม', + teamsCount: '{{count}} ทีม', + titlePlaceholder: 'เช่น Berlin Kreuzberg - Underground Spots Tour', + titleRequired: 'ต้องระบุชื่อทัวร์', + titleRequiredDesc: 'กรุณากรอกชื่อสำหรับทัวร์ของคุณ', + totalPercent: 'รวม: {{percent}}%', + totalPrizePool: 'เงินรางวัลรวม (sats)', + tourDesc: 'บอกนักสเก็ตว่าทัวร์ของคุณมีอะไรให้พบ', + tourDetails: 'รายละเอียดทัวร์', + tourPhoto: 'รูปทัวร์', + tourTitle: 'ชื่อทัวร์', + transportDestructionPlaceholder: 'ทีมจะเดินทางระหว่างสถานที่อย่างไร? มีการจัดหรือแนะนำการเดินทางไหม?', + transportInfo: 'ข้อมูลการเดินทาง', + transportPlaceholder: "ผู้ร่วมทัวร์จะเดินทางอย่างไร? เช่น 'จัดรถตู้ให้', 'บินเข้า Barcelona แล้วเช่ารถตู้', 'นั่งรถไฟระหว่างเมือง'", + tripDatesDesc: 'กำหนดวันให้แน่นอน เพื่อให้นักสเก็ตลางาน จองเที่ยวบิน และวางแผนทริปได้', + tripDatesTitle: 'วันเดินทาง', + updated: 'อัปเดตทัวร์แล้ว!', + updatedDesc: 'การเปลี่ยนแปลงของคุณถูกเผยแพร่แล้ว', + upload: 'อัปโหลด', + view: 'ดู →', + worldDestruction: 'World Destruction Tour', + youReceive: 'คุณได้รับ: {{amount}} sats ต่อคน', + }, + editEvent: { + accessDenied: 'ปฏิเสธการเข้าถึง', + accessDeniedDesc: 'คุณแก้ไขได้เฉพาะอีเวนต์ที่คุณสร้างเท่านั้น', + backToEvent: 'กลับไปที่อีเวนต์', + detailsDesc: 'อัปเดตข้อมูลเกี่ยวกับอีเวนต์นี้ ฟิลด์ที่ทำเครื่องหมาย * จำเป็นต้องกรอก', + eventCover: 'ภาพปกอีเวนต์', + locationUpdated: 'อัปเดตตำแหน่งแล้ว', + loginToEdit: 'คุณต้องเข้าสู่ระบบเพื่อแก้ไขอีเวนต์นี้', + newSpot: 'สปอตใหม่: {{location}}', + newTime: 'เวลาใหม่: {{date}} เวลา {{time}}', + saveChanges: 'บันทึกการเปลี่ยนแปลง', + saving: 'กำลังบันทึก...', + title: 'แก้ไขอีเวนต์', + updated: 'อัปเดตอีเวนต์แล้ว!', + updatedDesc: 'การเปลี่ยนแปลงของคุณถูกเผยแพร่สู่เครือข่ายแล้ว', + updateDetails: 'อัปเดตรายละเอียดสำหรับ {{title}}', + updatedNotified: 'เผยแพร่การเปลี่ยนแปลงแล้ว — แจ้งเตือนผู้ร่วมงาน {{count}} คน', + updateFailed: 'อัปเดตไม่สำเร็จ', + updateMessage: '{{parts}} — ดูอีเวนต์เพื่อรายละเอียด', + }, + editShop: { + accessDeniedDesc: 'คุณแก้ไขได้เฉพาะร้านที่คุณสร้างเท่านั้น', + backToShop: 'กลับไปที่ร้าน', + detailsDesc: 'อัปเดตข้อมูลร้านของคุณ ฟิลด์ที่ทำเครื่องหมาย * จำเป็นต้องกรอก', + loginToEdit: 'คุณต้องเข้าสู่ระบบเพื่อแก้ไขร้านนี้', + updated: 'อัปเดตร้านแล้ว!', + updateDetails: 'อัปเดตรายละเอียดสำหรับ {{name}}', + }, + editTour: { + accessDeniedDesc: 'คุณแก้ไขได้เฉพาะทัวร์ที่คุณสร้างเท่านั้น', + loginToEdit: 'คุณต้องเข้าสู่ระบบเพื่อแก้ไขทัวร์นี้', + }, + eventCard: { + report: 'รายงาน', + }, + eventDetail: { + aCrew: 'crew', + addToCalendar: 'เพิ่มลงปฏิทิน', + backToEvents: 'กลับไปที่อีเวนต์', + cancelled: 'อีเวนต์นี้ถูกยกเลิก', + checkUpdate: '— ตรวจสอบการอัปเดต', + copyFailed: 'คัดลอกไม่สำเร็จ', + date: 'วันที่', + editEvent: 'แก้ไขอีเวนต์', + eventFallback: 'อีเวนต์', + eventOrganizer: 'ผู้จัดอีเวนต์', + getDirections: 'ขอเส้นทาง', + linkCopied: 'คัดลอกลิงก์แล้ว', + linkCopiedDesc: 'คัดลอกลิงก์อีเวนต์ไปยังคลิปบอร์ดแล้ว — วางได้ทุกที่', + live: 'สด:', + liveMusic: 'ดนตรีสด', + location: 'ตำแหน่ง', + newLocation: 'ตำแหน่งใหม่', + noRsvps: 'ไม่มี RSVP ที่บันทึกไว้', + organizer: 'ผู้จัด', + rsvpsClosed: 'ปิดรับ RSVP แล้ว — อีเวนต์นี้ถูกยกเลิกโดยเจ้าภาพ', + seeMap: 'ดูแผนที่', + shareEvent: 'แชร์อีเวนต์', + shareText: '{{title}} — อีเวนต์สเก็ตบน SkateSpots', + shareTextFallback: 'ดูอีเวนต์สเก็ตนี้บน SkateSpots', + time: 'เวลา', + timeChanged: 'เวลาเปลี่ยน', + updatesFromHost: 'อัปเดตจากเจ้าภาพ', + where: 'ที่ไหน', + whoCame: 'ใครมาร่วม', + whosGoing: 'ใครจะไป', + }, + events: { + calendar: 'ปฏิทิน', + createTour: 'สร้างทัวร์', + events: 'อีเวนต์', + faqFooter: 'มีคำถาม? ดู FAQ →', + hosting: 'ที่ฉันจัด', + hostingSubtitle: 'อีเวนต์ของคุณ — RSVP อัปเดต และแก้ไขด่วน', + list: 'รายการ', + noEventsMatchFilters: 'ไม่มีอีเวนต์ที่ตรงกับตัวกรองของคุณ ลองปรับหรือล้างตัวกรอง', + noPast: 'ไม่มีอีเวนต์ที่ผ่านมา', + noPastBody: 'ไม่พบอีเวนต์สเก็ตที่ผ่านมาในตัวกรองปัจจุบันของคุณ', + noTours: 'ไม่พบทัวร์', + noToursBody: 'ยังไม่มีทัวร์สเก็ต สร้างอันแรกแล้วพานักสเก็ตไปค้นพบสปอต!', + noToursMatchFilters: 'ไม่มีทัวร์ที่ตรงกับตัวกรองของคุณ ลองปรับหรือล้างตัวกรอง', + noUpcoming: 'ไม่มีอีเวนต์ที่กำลังจะมาถึง', + noUpcomingBody: 'ไม่พบอีเวนต์สเก็ตที่กำลังจะมาถึง เริ่มสร้างเป็นคนแรกสิ!', + past: 'ที่ผ่านมา', + resultsCount: '{{count}} ผลลัพธ์', + searchCity: 'เมือง…', + searchEvent: 'ชื่ออีเวนต์…', + searchTour: 'ชื่อทัวร์…', + tours: 'ทัวร์', + toursSubtitle: 'ไกด์ท้องถิ่น ทริปบนถนน และการแข่งขัน world destruction', + upcoming: 'กำลังจะมาถึง', + }, + eventTypes: { + contest: 'การแข่งขัน', + demo: 'Demo', + jam: 'Jam', + meetup: 'มีตอัป', + premiere: 'รอบปฐมทัศน์', + session: 'Session', + workshop: 'เวิร์กช็อป', + }, + featured: { + active: 'ใช้งานอยู่', + bodyEvent: 'โพสต์ฟรี อีเวนต์แนะนำจะได้ป้ายและอยู่ด้านบนของหน้าอีเวนต์', + bodyTour: 'โพสต์ฟรี ทัวร์แนะนำจะได้ป้ายและอยู่ด้านบนของรายการทัวร์', + contextEvent: 'อีเวนต์ของคุณยังลงฟรีไม่ว่าจะแบบไหน — แนะนำแค่เพิ่มป้ายและการบูสต์', + contextTour: 'ทัวร์ของคุณยังลงฟรีไม่ว่าจะแบบไหน — แนะนำแค่เพิ่มป้ายและการบูสต์', + daysRemaining: 'แนะนำกำลังใช้งาน · เหลือ {{count}} วัน', + headingEvent: 'โปรโมตอีเวนต์นี้', + headingTour: 'โปรโมตทัวร์นี้', + optional: 'ไม่บังคับ', + platformOwner: 'เจ้าของแพลตฟอร์ม — แนะนำเปิดอยู่เสมอ', + }, + filters: { + activeCount: 'ใช้งานอยู่ {{count}}', + all: 'ทั้งหมด', + allLevels: 'ทุกระดับ', + eventType: 'ประเภทอีเวนต์', + following: 'กำลังติดตาม', + newest: 'ใหม่สุด', + popular: 'ยอดนิยม', + showResults: 'แสดงผลลัพธ์', + showResultsActive: 'แสดงผลลัพธ์ · ใช้งานอยู่ {{count}}', + skillLevel: 'ระดับฝีมือ', + sortBy: 'เรียงตาม', + topRated: 'คะแนนสูงสุด', + tourCategory: 'หมวดทัวร์', + trusted: 'เชื่อถือได้', + trustLevel: 'ระดับความน่าเชื่อถือ', + verified: 'ยืนยันแล้ว', + }, + food: { + bar: 'บาร์', + cafe: 'คาเฟ่', + call: 'โทร', + chooseSpot: 'เลือกสปอต...', + directions: 'เส้นทาง', + fastFood: 'ฟาสต์ฟู้ด', + foodCourt: 'ศูนย์อาหาร', + locationLabel: 'ตำแหน่ง:', + noneFound: 'ไม่พบจุดอาหาร', + noneFoundDesc: 'เราไม่พบร้านอาหารหรือคาเฟ่ภายใน 1 กม. จากสปอตนี้ ลองเลือกตำแหน่งอื่น', + placesFound: 'พบ {{count}} แห่งภายใน 1 กม. จาก {{spot}}', + pub: 'ผับ', + restaurant: 'ร้านอาหาร', + selectSpot: 'เลือกสปอตสเก็ต', + selectSpotDesc: 'เลือกสปอตสเก็ตจากเมนูด้านบนเพื่อค้นหาร้านอาหาร คาเฟ่ และตัวเลือกอาหารอื่น ๆ ใกล้เคียง', + selectSpotTitle: 'เลือกสปอตสเก็ต', + subtitle: 'หาที่กินใกล้สปอตสเก็ตโปรดของคุณ', + title: 'อาหารใกล้สปอต', + unknown: 'ไม่ทราบ', + website: 'เว็บไซต์', + }, + rsvp: { + areYouGoing: 'คุณจะไปไหม?', + cant: 'ไปไม่ได้', + cantMakeIt: 'ไปไม่ได้', + going: 'ฉันจะไป', + goingCount: 'ไป', + goingShort: 'ไป', + hostNote: 'คุณเป็นเจ้าภาพอีเวนต์นี้ — แต่ยังตั้งสถานะของคุณได้', + interested: 'สนใจ', + interestedCount: 'สนใจ', + loginToRsvp: 'เข้าสู่ระบบเพื่อ RSVP', + maybe: 'อาจจะ', + toastError: 'RSVP ไม่สำเร็จ', + toastGoing: 'คุณจะไป! 🛹', + toastInterested: 'ทำเครื่องหมายว่าสนใจแล้ว', + toastNotGoing: 'ทำเครื่องหมายว่าไม่ไปแล้ว', + tryAgain: 'กรุณาลองอีกครั้ง', + }, + shop: { + addNip05Settings: 'เพิ่ม NIP-05 ในการตั้งค่า', + adminRemovedReason: 'ผู้ดูแล SkateSpots ลบร้าน "{{name}}"', + areYouOwner: 'คุณเป็นเจ้าของร้านนี้หรือไม่?', + backToMap: 'กลับไปที่แผนที่', + claimDesc: 'ถ้าคุณเป็นเจ้าของหรือดูแลร้านนี้ อ้างสิทธิ์เพื่อยืนยันความเป็นเจ้าของด้วย NIP-05', + claimNip05Intro: 'การอ้างสิทธิ์ร้านนี้ ต้องเพิ่ม NIP-05 ที่ตรงกับโดเมนเว็บไซต์ของร้าน ตัวอย่างเช่น ถ้าเว็บไซต์ร้านคือ', + claimNip05Your: 'NIP-05 ของคุณควรเป็น', + contactShop: 'ติดต่อร้าน', + deleted: 'ลบร้านแล้ว', + deletedDesc: 'ส่งคำขอลบไปยัง relay แล้ว relay ส่วนใหญ่จะลบเนื้อหานี้', + deleteDialogDesc: 'การดำเนินการนี้จะลบ "{{name}}" อย่างถาวรจากทุก relay และไม่สามารถย้อนกลับได้', + deleteDialogTitle: 'ลบร้าน?', + deletedReason: 'ร้านที่ถูกลบ', + deleteFailed: 'ลบไม่สำเร็จ', + deleteShop: 'ลบร้าน', + linkCopied: 'คัดลอกลิงก์แล้ว!', + linkCopiedDesc: 'คัดลอกลิงก์ร้านไปยังคลิปบอร์ดแล้ว', + nip05Required: '⚠️ ต้องยืนยัน NIP-05 เพื่ออ้างสิทธิ์ร้านค้า', + opens: 'เปิด: {{domain}}', + removeAdmin: 'ลบ (ผู้ดูแล)', + removed: 'ลบร้านแล้ว', + removedDesc: 'ร้านนี้ถูกนำออกและจะถูกซ่อนทั่วทั้ง SkateSpots', + removeDialogDesc: 'ในฐานะผู้ดูแล SkateSpots คุณกำลังนำ "{{name}}" ออก จะถูกซ่อนทั่วทั้งแอปสำหรับทุกคน และจะส่งคำขอลบไปยัง relay', + removeDialogTitle: 'นำร้านนี้ออก? (ผู้ดูแล)', + removeShop: 'นำร้านออก', + tipMapper: 'ทิปผู้แมป', + tipMapperDesc: 'ร้านนี้ถูกเพิ่มโดยสมาชิกชุมชน Zap พวกเขาเพื่อขอบคุณ!', + updateNip05: 'อัปเดต NIP-05 เพื่ออ้างสิทธิ์', + viewPhotoFull: 'ดูรูปเต็มหน้าจอ', + viewPhotoOf: 'ดูรูปที่ {{index}} จาก {{total}}', + }, + sponsors: { + presentedBy: 'นำเสนอโดย', + }, + tourCard: { + active: 'ใช้งานอยู่', + completed: 'เสร็จสิ้น', + contactForPrice: 'ติดต่อสอบถามราคา', + durationDays: '{{count}} วัน', + durationHours: '{{count}} ชั่วโมง', + durationMonths: '{{count}} เดือน', + durationWeeks: '{{count}} สัปดาห์', + entry: 'ค่าเข้า: {{amount}} sats', + happeningNow: 'กำลังเกิดขึ้น', + inDays: 'อีก {{count}} วัน', + inHours: 'อีก {{count}} ชม.', + inMonths: 'อีก {{count}} เดือน', + inWeeks: 'อีก {{count}} สัปดาห์', + maxGroup: 'สูงสุด {{count}}', + price: '{{amount}} sats', + prizePool: '{{amount}} sats', + registrationOpen: 'เปิดลงทะเบียน', + startingSoon: 'กำลังจะเริ่ม', + teamsMax: 'สูงสุด {{count}} ทีม', + tomorrow: 'พรุ่งนี้', + worldwide: 'ทั่วโลก', + }, + tourDetail: { + about: 'เกี่ยวกับทัวร์นี้', + availability: 'ช่วงเวลาว่าง', + competitionWindow: 'ช่วงการแข่งขัน', + contactToBook: 'ติดต่อไกด์เพื่อจอง', + discountAt: 'ลด {{percent}}% ที่ {{shop}}', + duration: 'ระยะเวลา', + languages: 'ภาษา', + loginToBook: 'เข้าสู่ระบบเพื่อจอง', + loginToBookDesc: 'เข้าสู่ระบบเพื่อติดต่อไกด์และจองทัวร์นี้', + maxGroup: 'กลุ่มสูงสุด', + meetingPoint: 'จุดนัดพบ', + notFound: 'ไม่พบทัวร์', + notFoundDesc: 'ทัวร์นี้อาจถูกลบหรือไม่มีอยู่', + organizer: 'ผู้จัด', + partnerDiscount: 'ส่วนลดร้านพาร์ทเนอร์', + partnerDiscountDesc: 'จองทัวร์นี้เพื่อรับส่วนลดที่ร้านสเก็ตพาร์ทเนอร์ แสดงการยืนยันการจองให้พนักงานร้าน', + people: '{{count}} คน', + perPerson: 'ต่อคน', + price: 'ราคา', + runsAbout: 'ใช้เวลาประมาณ {{duration}}', + scheduledSession: 'เซสชันตามกำหนด', + shareText: 'ดูทัวร์สเก็ตท้องถิ่นนี้: {{title}}', + skillLevel: 'ระดับฝีมือ', + spotTypes: 'ประเภทสปอต', + tourGuide: 'ไกด์ทัวร์', + tourSponsors: 'ผู้สนับสนุนทัวร์', + tripDates: 'วันเดินทาง', + viewProfile: 'ดูโปรไฟล์', + }, + updates: { + admin: 'ผู้ดูแล', + adminNote: 'คุณกำลังโพสต์ในฐานะผู้ดูแล SkateSpots จะถูกระบุชัดเจนว่าเป็นประกาศจากผู้ดูแล ไม่ใช่จากเจ้าภาพ', + kindCancelled: 'ยกเลิก', + kindNewSpot: 'สปอตใหม่', + kindNewTime: 'เวลาใหม่', + kindUpdate: 'อัปเดต', + loading: 'กำลังโหลดอัปเดต…', + notifiedCount: 'แจ้งเตือน {{count}} คนแล้ว', + notifiedEveryone: 'ทุกคนจะเห็นบนอีเวนต์', + notifiesRsvps: 'แจ้งเตือน RSVP {{count}} รายการ', + noUpdates: 'ยังไม่มีอัปเดตจากเจ้าภาพ RSVP แล้วคุณจะได้รับการแจ้งเตือนหากมีอะไรเปลี่ยนแปลง', + placeholder: 'ฝนตก — เลื่อนเป็นวันอาทิตย์ บ่าย 2 เจอกันที่ ledge ด้านหลัง…', + post: 'โพสต์', + postAdminUpdate: 'โพสต์อัปเดตจากผู้ดูแล', + posted: 'โพสต์อัปเดตแล้ว', + postError: 'โพสต์อัปเดตไม่สำเร็จ', + postUpdate: 'โพสต์อัปเดต', + tryAgain: 'กรุณาลองอีกครั้ง', + visibleToEveryone: 'มองเห็นได้โดยทุกคนในอีเวนต์นี้', + }, + destination: { + bitcoin: 'Bitcoin', + closeSearch: 'ปิดการค้นหา', + nothingMatches: 'ไม่มีอะไรตรงกับ “{{query}}”', + placeholder: 'ค้นหาสปอต ร้าน และร้านค้าที่รับ Bitcoin…', + shop: 'ร้าน', + spot: 'สปอต', + typeChars: 'พิมพ์อย่างน้อย 2 ตัวอักษร ค้นหาสปอตสเก็ต ร้านสเก็ต และร้านค้าที่รับ Bitcoin', + typeCharsNear: 'พิมพ์อย่างน้อย 2 ตัวอักษร ค้นหาสปอตสเก็ต ร้านสเก็ต และร้านค้าที่รับ Bitcoin ใกล้ที่นี่', + }, + dateWindow: { + any: 'ใดก็ได้', + anytime: 'ทุกเวลา', + month: 'เดือนนี้', + monthShort: 'เดือน', + today: 'วันนี้', + todayShort: 'วันนี้', + week: 'สัปดาห์นี้', + weekend: 'สุดสัปดาห์', + weekendShort: 'สุดสัปดาห์', + weekShort: 'สัปดาห์', + }, + }, +}; + +export default thBatch7; diff --git a/src/i18n/th/index.ts b/src/i18n/th/index.ts index ec4dc5a..b13528b 100644 --- a/src/i18n/th/index.ts +++ b/src/i18n/th/index.ts @@ -3,6 +3,8 @@ import batch2 from './batch2'; import batch3 from './batch3'; import batch4 from './batch4'; import batch5 from './batch5'; +import batch6 from './batch6'; +import batch7 from './batch7'; /** * Thai (ไทย) translations — composed from fragments so parallel translation @@ -18,6 +20,8 @@ const th = { ...batch3, ...batch4, ...batch5, + ...batch6, + ...batch7, }; export default th;