From 8d1598d6c420a998a4c988506316a3208abd3360 Mon Sep 17 00:00:00 2001 From: SkateSpots Date: Wed, 7 Oct 2026 17:48:18 +0700 Subject: [PATCH] =?UTF-8?q?i18n:=20complete=20Japanese=20+=20Thai=20transl?= =?UTF-8?q?ation=20(both=20100%=20=E2=80=94=207,889/7,889=20keys)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/i18n/ja/batch12.ts | 715 +++++++++++++++++++++++++++++++++++++++++ src/i18n/ja/batch13.ts | 690 +++++++++++++++++++++++++++++++++++++++ src/i18n/ja/batch14.ts | 159 +++++++++ src/i18n/ja/batch15.ts | 350 ++++++++++++++++++++ src/i18n/ja/index.ts | 8 + src/i18n/th/batch14.ts | 345 ++++++++++++++++++++ src/i18n/th/index.ts | 2 + 7 files changed, 2269 insertions(+) create mode 100644 src/i18n/ja/batch12.ts create mode 100644 src/i18n/ja/batch13.ts create mode 100644 src/i18n/ja/batch14.ts create mode 100644 src/i18n/ja/batch15.ts create mode 100644 src/i18n/th/batch14.ts diff --git a/src/i18n/ja/batch12.ts b/src/i18n/ja/batch12.ts new file mode 100644 index 0000000..d28c6dc --- /dev/null +++ b/src/i18n/ja/batch12.ts @@ -0,0 +1,715 @@ +/** + * Japanese (日本語) — batch 12: `placesUi` (events, shops, tours, food, + * calendar, RSVP, featured, updates, destination search, date window). + * + * Skate/brand vocabulary stays English or katakana (Spot→スポット, Shop→ショップ, + * Event→イベント, Tour→ツアー, Crew→クルー, Stash, The Lab, Nostr, Lightning, Zap, + * Relay→リレー, sats); all trick names stay English. `{{placeholders}}` are + * preserved verbatim. + */ +const jaBatch12 = { + 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: '1月', + february: '2月', + march: '3月', + april: '4月', + may: '5月', + june: '6月', + july: '7月', + august: '8月', + september: '9月', + october: '10月', + november: '11月', + december: '12月', + }, + 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: '(任意 — Zapでクラウドファンディングするsats)', + fundingGoalPlaceholder: '例: 50000', + geoNotSupported: '位置情報がサポートされていません', + geoNotSupportedDesc: 'お使いのブラウザは位置情報をサポートしていません。', + hideSpots: 'スポットを隠す', + hostingAs: '{{name}}として主催', + hostingAsDesc: 'このイベントはあなたのクルーページに表示され、クルー主催としてタグ付けされます。', + 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: 'お客様が連絡できるようにしましょう (少なくとも1つの連絡方法を推奨)', + 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: '問題が発生しました。詳細はコンソールを確認してください。', + shopPhotoAlt: 'ショップ', + shopPhotos: 'ショップの写真', + subtitle: 'あなたのショップをマップに掲載してコミュニティとつながろう', + upload: 'アップロード', + }, + createTour: { + acceptedClipSources: '受け付けるクリップの提出元', + acceptedClipSourcesDesc: 'クリップ提出としてどの形式を受け付けますか?', + accommodationInfo: '宿泊情報', + accommodationPlaceholder: '宿泊の推奨や手配、例:「ルート沿いの格安ホステル」「キャンプ装備が必要」「Airbnb込み」', + addChallenge: 'チャレンジを追加', + addCity: '都市を追加...', + addCountry: '国を追加...', + addShopFirst: '先にショップを追加してください', + alsoSelected: '他に選択中:', + availabilityPlaceholder: '例: 週末、午前のみ、予約制', + availabilityQuestion: '普段いつ対応できますか?', + availableShops: '利用可能なスケートショップ ({{count}})', + challengeDescPlaceholder: '説明 (任意)...', + challenges: 'チャレンジ', + challengesRequired: 'チャレンジが必要です', + challengesRequiredDesc: 'チームが達成するチャレンジを少なくとも1つ追加してください。', + challengesSecret: 'すべてのチャレンジは競技開始日まで秘密です。それまでチームには表示されません!', + challengeTitlePlaceholder: 'チャレンジ名、例:「10段をキックフリップ」', + citiesLabel: '都市', + citiesOnTour: 'ツアーの都市', + cityPlaceholder: '例: Berlin, Germany', + cityRegion: '都市 / 地域', + cityRequired: '都市/地域が必要です', + cityRequiredDesc: '都市または地域を入力してください。', + clipAnyUrl: '🔗 任意のURL', + clipBlossom: '📦 Blossomアップロード', + clipInstagram: '📸 Instagram', + clipYouTube: '▶️ YouTube', + competitionDates: '競技日程', + competitionDatesWarning: '⚠️ すべてのチャレンジは開始日まで秘密です! 競技が始まるまでチームにはチャレンジが表示されません。', + competitionLocations: '競技場所', + competitionLocationsDesc: 'チームはどこで競いますか? 関係するすべての都市と国を追加してください。', + coordsHint: '座標は任意です。追加するとミートポイントをマップにピン留めできます。', + countriesLabel: '国', + countriesRequired: '国が必要です', + countriesRequiredDesc: '海外ツアーの国を少なくとも1つ追加してください。', + createdDestruction: '💀 WORLD DESTRUCTION TOURを作成しました!', + createdDestructionDesc: 'チームが登録できます。チャレンジは開始日に公開!', + createDestructionTour: 'World Destruction Tourを作成', + createdInternational: '✈️ 海外ツアーを作成しました!', + createdInternationalDesc: 'あなたの全球的な冒険が掲載されました! 世界中のスケーターとつながろう。', + createdLocal: '🏠 ローカルツアーを作成しました!', + createdLocalDesc: 'あなたのツアーが表示されました。スケーターはDMで予約できます!', + createdNational: '🚐 国内ツアーを作成しました!', + 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: '• 出発日と帰国日を設定して、クルーが航空券を予約できるように', + howInternational4: '• 世界中のスケーターとつながる', + howInternational5: '• 忘れられないグローバルな体験を!', + howInternationalTitle: '海外ツアーの仕組み', + howItWorks: '仕組み:', + howLocal1: '• 価格はあなたが設定 — プラットフォームは10%', + howLocal2: '• 隠されたスポットは隠されたまま — あなたが直接案内します', + howLocal3: '• スケジュールされたセッションを開催するか、フレキシブル/予約制にする', + howLocal4: '• スケーターはDMで予約し、Lightningで支払い、カレンダーに追加できます', + howLocal5: '• レビューとZapで評判を築く', + howLocalTitle: 'ローカルツアーの仕組み', + howNational1: '• 国内を巡る複数都市のロードトリップ', + howNational2: '• 価格はあなたが設定 — プラットフォームは7%のみ', + howNational3: '• スケーターが休暇を取って旅行できるよう日程を設定', + howNational4: '• クルー向けの交通/宿泊情報を含める', + howNational5: '• 伝説のスケートアドベンチャーを築こう!', + howNationalTitle: '国内ツアーの仕組み', + 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駅', + 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}}% OFF', + photoHint: 'スケート中のあなた、またはツアーのクールなスポットの写真を追加してください。', + pickRide: '移動手段を選ぶ', + place1: '🥇 1位', + place2: '🥈 2位', + place3: '🥉 3位', + platformFee: '価格はあなたが設定 • プラットフォームは{{percent}}', + points: 'ポイント:', + pricePerPerson: '1人あたりの価格 (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: '案内するスポットの種類を少なくとも1つ選択してください。', + 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: '受け取り: 1人あたり{{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: 'クルー', + 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: 'デモ', + jam: 'ジャム', + meetup: 'ミートアップ', + premiere: 'プレミア', + 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: 'このスポットから1km以内にレストランやカフェが見つかりませんでした。別の場所を選択してみてください。', + placesFound: '{{spot}}から1km以内に{{count}}件の場所が見つかりました', + 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: '削除リクエストをリレーに送信しました。ほとんどのリレーがこのコンテンツを削除します。', + deleteDialogDesc: 'これにより「{{name}}」がすべてのリレーから完全に削除されます。この操作は元に戻せません。', + deleteDialogTitle: 'ショップを削除しますか?', + deletedReason: '削除されたショップ', + deleteFailed: '削除に失敗しました', + deleteShop: 'ショップを削除', + linkCopied: 'リンクをコピーしました!', + linkCopiedDesc: 'ショップリンクをクリップボードにコピーしました。', + nip05Required: '⚠️ ショップを申請するにはNIP-05認証が必要です', + opens: '開く: {{domain}}', + removeAdmin: '削除 (管理者)', + removed: 'ショップを削除しました', + removedDesc: 'このショップは削除され、SkateSpots全体で非表示になります。', + removeDialogDesc: 'SkateSpots管理者として「{{name}}」を削除します。アプリ全体で誰からも見えなくなり、削除リクエストがリレーに送信されます。', + removeDialogTitle: 'このショップを削除しますか? (管理者)', + removeShop: 'ショップを削除', + tipMapper: 'マッパーにチップ', + tipMapperDesc: 'このショップはコミュニティメンバーが追加しました。感謝のZapを送りましょう!', + updateNip05: 'NIP-05を更新して申請', + viewPhotoFull: '写真を全画面で表示', + viewPhotoOf: '写真{{index}}/{{total}}を表示', + }, + sponsors: { + presentedBy: 'Presented by', + }, + 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: '{{shop}}で{{percent}}% OFF', + duration: '期間', + languages: '言語', + loginToBook: 'ログインして予約', + loginToBookDesc: 'ログインしてガイドに連絡し、このツアーを予約しましょう', + maxGroup: '最大グループ', + meetingPoint: 'ミートポイント', + notFound: 'ツアーが見つかりません', + notFoundDesc: 'このツアーは削除されたか、存在しない可能性があります。', + organizer: '主催者', + partnerDiscount: 'パートナーショップ割引', + partnerDiscountDesc: 'このツアーを予約すると、パートナーのスケートショップで割引を受けられます。予約確認をショップスタッフに提示してください。', + people: '{{count}}人', + perPerson: '1人あたり', + 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: '{{count}}件のRSVPに通知', + noUpdates: 'まだ主催者からの更新はありません。RSVPすると変更があれば通知されます。', + placeholder: '雨 — 日曜14時に延期。裏のレッジに集合…', + 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 jaBatch12; diff --git a/src/i18n/ja/batch13.ts b/src/i18n/ja/batch13.ts new file mode 100644 index 0000000..765a5c8 --- /dev/null +++ b/src/i18n/ja/batch13.ts @@ -0,0 +1,690 @@ +/** + * Japanese (日本語) — batch 13: marketplace & trades (marketUi). + * + * Covers the Gear Swap grid, marketplace hub, listing detail/create flows, + * trades, offers, shipping handoff, payments, spam fee, reputation, CLINK and + * Cashu escrow. + * + * Skate/brand vocabulary stays katakana or English (Gear→ギア, Spot→スポット, + * Shop→ショップ, Crew→クルー, Stash, The Lab, Nostr, Lightning, Zap, リレー, + * sats, デッキ, トラック, ウィール, ベアリング, グリップテープ, マーケットプレイス, + * WTB, escrow, ミント, npub, CLINK) because Japanese skaters use those. + * `{{placeholders}}` are preserved verbatim. + */ +const jaBatch13 = { + marketUi: { + gearSwap: { + title: 'ギア交換', + subtitle: '他のスケーターと中古スケートギアを売買しよう', + listGear: 'ギアを出品', + searchPlaceholder: 'ギアを検索...', + 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: '現在のフィルターに一致するギアがありません。フィルターをクリアするか、別のキーワードで検索してみてください。', + noneFirst: '最初にギアを出品しよう — デッキ、トラック、ウィール、シューズなど、スケート関連なら何でも!', + listYourGear: 'ギアを出品する', + faqLink: '質問がありますか?FAQをチェック →', + }, + hub: { + browse: '見る', + selling: '出品中', + myTrades: 'マイ取引', + reputation: '評価', + loginListings: 'ログインして出品を管理しましょう。', + loginReputation: 'ログインして評価とレビューを確認しましょう。', + }, + marketplace: { + heroTitle: 'ショップ & マーケットプレイス', + heroBefore: '当マーケットプレイスは', + heroAfter: 'を採用しています — Nostr上の分散型マーケットプレイスです。スケートショップが商品を出品でき、中古ギアをBitcoinで直接売買できます。', + whatIsTitle: 'Plebeian Marketとは?', + whatIsBody: 'Plebeian MarketはNostr上に構築された分散型マーケットプレイスです。Bitcoinを使って他のスケーターとスケートボードギアを直接売買できます。仲介者なし、手数料なし、完全な自由。', + noFeesTitle: '手数料なし', + noFeesBody: '30%を取るプラットフォームはありません。ダイレクトなP2P販売。', + bitcoinTitle: 'Bitcoin決済', + bitcoinBody: 'Bitcoinで支払い。速く、安全で、世界中どこでも。', + decentralizedTitle: '分散型', + decentralizedBody: 'Nostr上に構築。どの企業も管理していません。', + visit: 'Plebeian Marketを見る', + buySellTitle: '売買できるもの', + catCompletes: 'コンプリートデッキ', + preBuilt: '組み立て済みコンプリート', + customSetups: 'カスタムセットアップ', + beginnerBoards: '初心者向けボード', + catParts: 'デッキパーツ', + decks: 'デッキ', + trucks: 'トラック', + wheels: 'ウィール', + bearings: 'ベアリング', + gripTape: 'グリップテープ', + hardware: 'ハードウェア', + catApparel: 'ウェア & プロテクション', + skateShoes: 'スケートシューズ', + clothing: '服', + helmets: 'ヘルメット', + pads: 'パッド', + backpacks: 'バックパック', + catAccessories: 'アクセサリー', + tools: 'ツール', + wax: 'ワックス', + rails: 'レール', + stickers: 'ステッカー', + videos: 'ビデオ', + magazines: 'マガジン', + howItWorks: '使い方', + step1Title: '商品を見る', + step1Body: 'Plebeian Marketにアクセスし、世界中のショップや個人のスケートボードギアを閲覧しましょう。', + step2Title: '出品者に連絡', + step2Body: 'Nostrで出品者に直接メッセージ。価格交渉、質問、発送の手配ができます。', + step3Title: 'Bitcoinで支払う', + step3Body: 'Bitcoin Lightningを使って購入を完了。即時で低手数料の支払い。', + step4Title: 'フィードバックを残す', + step4Body: '体験を評価し、Nostrで出品者の評判を築きましょう。あなたのレビューがコミュニティの役に立ちます。', + needBitcoinTitle: 'Bitcoinが必要ですか?', + needBitcoinBefore: '購入にはsats入りのLightningウォレットが必要です。こちらをチェック:', + onboardingGuide: 'オンボーディングガイド', + needBitcoinAfter: '(ウォレットのおすすめ)。', + ownShopTitle: 'スケートショップを経営していますか?', + ownShopBody: 'SkateSpotsにショップを登録し、Plebeian Marketで商品を販売しましょう。プラットフォーム手数料ゼロで世界中の顧客にリーチできます。', + addShop: 'ショップを登録', + startSelling: '販売をはじめる', + }, + listingDetail: { + notFound: '出品が見つかりません', + notFoundBody: '削除されたか、リンクが間違っている可能性があります。', + backToGearSwap: 'ギア交換に戻る', + gearSwap: 'ギア交換', + viewPhoto: '写真{{n}}を表示', + photoAlt: '{{title}} — 写真{{n}}', + wantToBuy: '購入希望', + 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: 'ギアを販売する際は少なくとも1枚の写真が必要です', + nip05Required: 'NIP-05認証が必要です', + nip05RequiredBody: 'ギアを出品するには認証済みのNostrアドレスが必要です', + priceRequired: '固定価格の出品には価格が必要です', + sizeRequired: 'サイズが必要です', + sizeRequiredBody: '{{category}}のサイズを選択してください', + conditionRequired: '状態が必要です', + conditionRequiredBody: '{{category}}の状態を選択してください', + wtbPosted: '購入希望を投稿しました!', + wtbPostedBody: '出品者があなたのリクエストを見つけられるようになります。', + listingCreated: '出品を作成しました!', + listingCreatedBody: 'ギアが出品されました。', + publishFailed: '公開に失敗しました', + loginRequired: 'ログインが必要です', + loginRequiredBody: 'ギアを出品するにはログインが必要です。', + backToStash: 'Stashに戻る', + backToSpot: '{{title}}に戻る', + backToMarketplace: 'マーケットプレイスに戻る', + backToMap: 'マップに戻る', + wantToBuy: '購入希望', + listYourGear: 'ギアを出品する', + wtbSubtitle: '探しているギアをコミュニティに伝えよう', + sellSubtitle: 'コミュニティにスケートボードギアを販売しよう', + fromStashTitle: 'Stashからの出品', + fromStashBody: 'Stashのアイテム詳細が入力済みです。確認して待ち合わせスポットを選びましょう!', + nip05Banner: 'スパム防止と購入者の保護のため、ギアを出品するには認証済みのNostrアドレス(NIP-05)が必要です。', + verifiedLabel: '認証済み:', + checkingTrust: '信頼レベルを確認中...', + trustLevel: '信頼レベル:', + trusted: '信頼済み', + active: 'アクティブ', + newcomer: '新規ユーザー', + newUser: '新規ユーザー', + remaining: '今月は{{limit}}件中{{remaining}}件出品できます', + cooldownBody: '新規ユーザーは出品間隔に24時間のクールダウンがあります。', + timeRemaining: '残り時間: {{time}}', + monthlyLimitTitle: '月間上限に達しました', + monthlyLimitBody: '今月の出品上限{{limit}}件に達しました。スポットを作成したり取引を完了して評判を築くと、上限が増えます。', + powAccepted: 'Proof of workが承認されました!', + feePaid: '手数料を支払いました!', + canCreateNow: '出品を作成できるようになりました。', + whatDoTitle: '何をしますか?', + sellGear: 'ギアを販売', + categoryTitle: 'カテゴリ *', + categoryHint: 'どんな種類のギア?', + detailsTitle: 'ギアの詳細', + detailsWtbHint: '探しているものを説明してください', + detailsSellHint: '購入者にアイテムについて伝えましょう', + titleLabel: 'タイトル *', + titlePlaceholderWtb: '8.0"のデッキを探しています', + titlePlaceholderSell: 'ほぼ新品 Palace デッキ 8.25"', + summaryLabel: '短い要約', + summaryPlaceholderWtb: 'ブランドは問わない、グラフィックは控えめが希望', + summaryPlaceholderSell: '良好な状態、ほとんど未使用', + descriptionLabel: '説明', + descriptionPlaceholderWtb: '探しているものを具体的に説明してください — ブランドの希望、状態の条件など。', + descriptionPlaceholderSell: 'クリスマスにこのデッキをもらいましたが、もっと小さいサイズが好みです。購入前に試してもらって構いません!', + fulfilmentLabel: '受け渡し方法は?', + pickup: '手渡し', + pickupHint: '現地で待ち合わせ', + ships: '発送', + shipsHint: '郵送する', + both: 'どちらも', + bothHint: 'どちらでも', + addressNote: '住所は一切収集しません — 発送の場合は取引チャットで非公開で共有してください。', + postageLabel: '送料は誰が負担?', + requireEscrow: 'escrowを要求', + requireEscrowHint: '購入者にCashu escrowでの決済を依頼します。', + postageBuyer: '購入者負担', + postageSeller: '自分が負担', + postageSplit: '折半', + sizeLabel: 'サイズ', + selectSize: 'サイズを選択', + truckHeight: 'トラックの高さ', + selectHeight: '高さを選択', + wheelHardness: 'ウィールの硬さ', + selectHardness: '硬さを選択', + pricingTitle: '価格', + pricingWtbHint: 'いくらで支払いたい?', + pricingSellHint: 'どのように販売したい?', + priceLabel: '価格 *', + currencyLabel: '通貨', + photosTitle: '写真', + photosSellHint: '少なくとも1枚の写真が必要です', + photosWtbHint: '任意 — 参考画像を追加', + productPhoto: '商品{{n}}', + upload: 'アップロード', + photosNote: '最大5枚の写真を追加できます。最初の画像がメイン写真になります。', + pickupLocationTitle: '受け渡し場所', + pickupLocationHint: 'スケートスポットをリンクすると待ち合わせが簡単', + searchSpots: 'スポットを検索...', + noSpotsFound: 'スポットが見つかりません。別のキーワードで検索してみてください。', + availabilityLabel: '普段いつ頃空いていますか?', + availabilityPlaceholder: '週末10時〜14時、火・木の夜', + availabilityHint: '購入者があなたと待ち合わせを調整しやすくなります', + durationTitle: '出品期間', + durationHint: 'この出品をどのくらいの期間有効にしますか?', + publishing: '公開中...', + checkingEligibility: '利用資格を確認中...', + cooldownButton: 'クールダウン: {{time}}', + limitReachedButton: '上限に達しました', + payFeeButton: '手数料を支払って続ける', + postWtbButton: '購入希望を投稿する', + listForSaleButton: 'ギアを販売出品する', + }, + trades: { + title: 'マイ取引', + loginBody: 'ログインしてマーケットプレイスの取引と評価を管理しましょう。', + subtitle: '確認、リクエスト、そしてそれらが築く評判。支払いは相手のスケーターと直接取り決めます — アプリは取引を記録するだけです。', + actionNeeded: '対応が必要', + askedToConfirmSale: 'が売買の確認を求めています', + recordedSale: 'が売買を記録しました — あなたの側を確認してください', + confirmSale: '売買を確認', + confirm: '確認', + nothingWaiting: '今のところ対応待ちはありません。🛹', + yourRecords: 'あなたの取引記録', + noTrades: 'まだ取引はありません。取引を成立させて確認すると、評判が築かれ始めます。', + browseGearSwap: 'ギア交換を見る', + roleSold: '販売', + roleBought: '購入', + roleTrade: '交換', + with: '相手:', + viewListing: '出品を見る', + revoke: '取り消す', + revokeTitle: 'この取引記録を取り消しますか?', + revokeBody: '評価にカウントされなくなります。相手側の証明はそのまま残ります。係争中または誤った取引に使用してください。', + revokeNote: '作成者により撤回されました。', + revoked: '取引記録を取り消しました', + revokedBody: '評価にはカウントされなくなりました。', + revokeFailed: '取引を取り消せませんでした', + saleConfirmed: '売買を確認しました', + saleConfirmedBody: '相手が自分の側を確認できるようになりました。', + saleConfirmFailed: '売買を確認できませんでした', + tradeConfirmed: '取引を確認しました', + tradeConfirmedBody: '双方の評価が更新されました。', + tradeConfirmFailed: '取引を確認できませんでした', + somethingWrong: '問題が発生しました。', + }, + card: { + listingDeleted: '出品を削除しました', + listingRemoved: '出品を削除しました', + listingDeletedBody: '出品が削除されました。削除を尊重するリレーは配信を停止します。', + listingRemovedBody: 'この出品は削除され、SkateSpots全体で非表示になります。', + removeFailed: '削除に失敗しました', + somethingWrong: '問題が発生しました', + markedSold: '売約済みにしました', + markedSoldBody: '出品が売約済みとして表示されます。', + couldNotUpdate: '更新できませんでした', + relisted: '再出品しました', + relistedBody: '出品が再び有効になりました。', + listingOptions: '出品オプション', + report: '報告', + removeAdmin: '削除(管理者)', + postage: '送料', + newSeller: '新規出品者', + saleOne: '{{count}}件の販売', + saleMany: '{{count}}件の販売', + iHaveThis: 'これ持ってます!', + deleteTitle: '「{{title}}」を削除しますか?', + adminRemoveTitle: 'この出品を削除しますか?(管理者)', + deleteBody: 'リレーに出品「{{title}}」の削除を要求します。ここからは元に戻せません — 新しく作成する必要があります。', + adminRemoveBody: 'SkateSpots管理者として「{{title}}」を削除します。アプリ全体で全員から非表示になり、削除リクエストがリレーに送信されます。', + deleting: '削除中…', + removing: '削除中…', + deleteListing: '出品を削除', + removeListing: '出品を削除', + reportCount: '{{count}}件の報告', + reports: '{{count}}件の報告', + viewTitle: '{{title}}を表示', + reportListing: '出品を報告', + manageListing: '出品を管理', + trusted: '信頼済み', + daysOld: '{{n}}日前', + monthsOld: '{{n}}か月前', + yearsOld: '{{n}}年前', + listingsCount: '{{count}}件の出品', + postageBuyer: '送料: 購入者', + postageSeller: '送料: 出品者', + postageSplit: '送料: 折半', + powTitle: 'NIP-13 proof of work — 無料のスパム対策', + verifiedTradeOne: '{{count}}件の認証済み取引', + verifiedTrades: '{{count}}件の認証済み取引', + reportSubmitted: '報告を送信しました', + reportSubmittedBody: 'マーケットプレイスの安全にご協力いただきありがとうございます。', + reportFailed: '報告の送信に失敗しました', + selectReason: '理由を選択してください', + reportDialogBody: '不適切または誤解を招く出品を報告して、マーケットプレイスの安全にご協力ください。', + reasonLabel: '報告理由 *', + detailsLabel: '追加の詳細(任意)', + detailsPlaceholder: '役立つ追加情報があれば入力してください...', + reportNote: '報告はNostrに公開され、コミュニティが問題のある出品を特定するのに役立ちます。複数の報告がある出品は自動的に非表示になる場合があります。', + submitting: '送信中...', + submitReport: '報告を送信', + }, + tradeActions: { + tradeConfirmed: '取引を確認しました', + tradeConfirmedWithProof: '検証可能なレシートが添付されました — これは認証済み取引としてカウントされます。', + tradeConfirmedBody: '双方の評価が更新されました。', + tradeConfirmFailed: '取引を確認できませんでした', + somethingWrong: '問題が発生しました。', + requestNote: '「{{title}}」の取引を確認してください。', + requestSent: '確認をリクエストしました', + requestSentBody: '出品者が売買を確認できるようになり、双方の評価が築かれます。', + requestFailed: 'リクエストを送信できませんでした', + escrowRefunded: 'escrowを返金しました', + escrowRefundedBody: '資金はあなたのCashuウォレットに戻りました。', + 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: '例: 自分の8.25デッキ + 予備ウィール', + 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}}」を購入したいです。待ち合わせの日時と場所を提案してください — 公共のスケートスポットで会えます。', + orMeetAt: 'または近くの公共スポットで待ち合わせ:', + 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: '。「受領済み」にしてもescrowは解放されません。⚠️ 住所が見える状態の荷物の写真は撮らないでください。また、追跡番号を公開しても問題ない場合にのみ共有してください。', + }, + pay: { + sent: '支払いを送信しました ⚡', + sentWithProof: '検証可能な支払いレシートを保存しました — 支払い検証済みとしてカウントされます。', + sentBody: '出品者に知らせましょう — 取引を確認すると双方にカウントされます。', + failed: '支払いに失敗しました', + title: 'satsで支払う', + descSendPrefix: '送信', + descSendSuffix: 'を{{sellerName}}に送ってこの取引を精算します。', + descSettle: '{{sellerName}}と直接この取引を精算します。', + paid: '支払いました!', + paidBody: '出品者に取引の確認を依頼しましょう — 2つの確認が双方の評価を築きます。', + noMethod: '{{sellerName}}は支払い方法を設定していません(Lightningインボイスやアドレスなし)。メッセージで支払いを調整しましょう。', + ownListing: 'これはあなた自身の出品です。', + paying: '支払い中…', + pay: '支払う', + payAmount: '{{amount}} satsを支払う', + footnote: '接続中のウォレット(NWC、WebLN、またはCashu)から{{sellerName}}へ直接支払います — SkateSpotsが資金を預かることはありません。', + }, + spamFee: { + invoiceComment: 'SkateSpots出品手数料', + generateFailed: 'インボイスの生成に失敗しました', + paymentSuccess: '支払いが完了しました!', + satsSent: '{{amount}} satsを{{name}}に送信しました', + autoPayFailed: '自動支払いに失敗しました', + autoPayFailedBody: 'QRコードまたはインボイスを使って手動で支払ってください', + invoiceCopied: 'インボイスをコピーしました!', + copyFailed: 'コピーに失敗しました', + received: '支払いを受領しました!', + receivedBody: '{{amount}} satの手数料が支払われました。出品を作成できるようになりました。', + title: '一回限りの出品手数料', + subtitle: '新規メンバーは最初の出品に少額の手数料が必要です。', + whyTitle: 'なぜ支払う必要があるの?', + spamLabel: 'スパム防止:', + spamBody: 'この手数料はボットや詐欺師が偽の出品でマーケットプレイスを埋め尽くすのを防ぎます。', + trustLabel: '信頼の構築:', + trustBody: '新規アカウントは出品前にコミットメントを示す必要があります。数回の出品が成功すれば、この手数料は免除されます。', + supportsLabel: 'コミュニティへの支援:', + supportsPrefix: '手数料の送付先:', + supportsSpotOwner: ' — このスポットを作成した人です!', + supportsPlatform: ' — SkateSpotsの運営を支えます。', + oneTimeFee: '約${{usd}} USD • 一回限りの手数料', + payToContinue: '{{amount}} satsを支払って続ける', + proveWork: '代わりにworkを証明 — 無料', + proveWorkBody: '{{amount}} satsの代わりに数秒間CPUを使います。お金もウォレットも不要 — 支払いではなくスパム税です。', + generating: 'インボイスを生成中...', + processing: '支払いを処理中...', + qrAlt: '支払い用QRコード', + copyInvoice: 'インボイスをコピー', + openWallet: 'ウォレットを開く', + payWithWallet: '接続中のウォレットで支払う', + scanHint: 'LightningウォレットでQRコードをスキャンするか、上のボタンを使用してください', + skipTitle: '今後この手数料を回避する方法:', + skip1: 'マップにスケートスポットを追加する', + 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 デッキ', + aria: '10中{{n}}', + }, + clink: { + tip: 'Bitcoinでチップ', + copiedBody: 'CLINKコードをクリップボードにコピーしました。', + copyFailed: 'コピーに失敗しました', + copyFailedBody: 'クリップボードにアクセスできませんでした。', + whatIs: 'CLINKとは?', + tooltipTitle: 'Nostr経由でBitcoinを使って直接支払う', + tooltipBody: 'CLINKはセルフカストディの支払いコードです — アプリのアカウントも仲介者も不要。対応するLightningウォレットでスキャンすると、チップが相手に直接届きます。', + descRecipient: '{{recipientName}}へセルフカストディのBitcoin(Lightning)支払いを送信 — 仲介者なし。', + descGeneric: 'Nostr経由でセルフカストディのBitcoin(Lightning)支払いを送信 — 仲介者なし。', + qrAlt: 'CLINKオファーQRコード', + copyCode: 'CLINKコードをコピー', + openWallet: 'CLINKウォレットで開く', + copyToWallet: 'ウォレット用にコードをコピー', + priceFixed: '固定 — {{amount}} sats', + priceFixedShort: '固定価格', + priceVariable: '変動価格', + priceVariableCurrency: '{{currency}}建て', + priceSpontaneous: '金額はあなたが選択', + footnote: 'CLINK対応ウォレット(例: ShockWallet)でスキャンしてください。何も開かない場合は上のコードをコピーしてください — CLINK対応ウォレットがインストールされていない可能性があります。カストディアンなし、ウェブサーバーなし: インボイスはNostr経由で直接要求されます。', + }, + paymentReadiness: { + ready: '支払いを受け取れます', + notReady: '支払いを受け取るには設定が必要です', + readyBefore: 'あなたのLightningアドレス', + readyAfter: ' がプロフィールに設定されています — 人々は直接Zapや支払いができます。', + silentSet: ' Bitcoin Silent Paymentアドレスも設定されています。', + notReadyBefore: 'Lightningアドレス(任意でBitcoin Silent Paymentアドレスも)を次の場所に追加してください:', + nostrProfile: 'Nostrプロフィール', + notReadyAfter: '。スケーターがあなたに支払えるようになります。一度設定すれば、ここにあるすべてのプロフィールで機能します。', + }, + seller: { + trade: '交換', + active: '出品中', + markSold: '売約済みにする', + yourListings: 'あなたの出品', + activeCount: '{{count}}件出品中', + listItem: 'アイテムを出品', + loading: '出品を読み込み中…', + empty: 'まだ出品はありません。', + listFirst: '最初のアイテムを出品', + }, + noffer: { + label: 'CLINKオファーコード', + optional: '(任意、上級者向け)', + offerId: 'オファー: {{id}}', + relay: 'リレー: {{relay}}', + invalidBefore: 'これは有効な', + invalidAfter: 'コードではないようです。', + valid: '有効なCLINKコード — プロフィールに「Pay via CLINK」ボタンが表示されます。', + help: 'セルフカストディのCLINK支払いコード(例: ShockWallet / Lightning.Pubから)を貼り付けて、NostrネイティブのLightning支払いを受け取りましょう — ウェブサーバーもカストディアンも不要。', + learnSpecs: '仕様を見る', + }, + escrowPanel: { + escrowed: '{{amount}} satsをescrowしました', + mint: 'ミント', + refundSinceBefore: '購入者は次の時点から返金可能:', + redeemBefore: '出品者は今すぐ引き出し可能 · 購入者はその後返金可能', + noExpiry: 'このトークンには有効期限が設定されていません。', + }, + escrowRequest: { + enterAmount: 'escrow金額を入力してください', + minLock: '少なくとも{{days}}日間ロック', + requestNote: '取引のために{{amount}} satsをescrowしました — 売買を確認してください。', + created: 'escrowを作成しました 🎉', + createdBody: '{{amount}} satsを{{days}}日間ロックしました。{{sellerName}}は配送時に引き出せます。', + createFailed: 'escrowを作成できませんでした', + somethingWrong: '問題が発生しました。', + title: 'この取引をescrowする', + description: '資金は{{sellerName}}にロックされ、期限後に取引が決裂した場合はあなたが返金できます。接続されたLightningウォレットが必要です。', + amountLabel: '金額(sats)', + daysLabel: '購入者の返金可能期限(日)', + daysHint: '出品者が配送しない場合、この日数を過ぎると資金を取り戻せます。', + nativeOnly: 'Cashu escrowはSkateSpotsアプリでのみ利用できます(ウェブ版では不可)。', + lockAndRequest: 'ロック & リクエスト', + }, + }, +}; + +export default jaBatch13; diff --git a/src/i18n/ja/batch14.ts b/src/i18n/ja/batch14.ts new file mode 100644 index 0000000..0d01db7 --- /dev/null +++ b/src/i18n/ja/batch14.ts @@ -0,0 +1,159 @@ +/** + * Japanese (日本語) — batch 14: chrome UI, static pages, nav customization. + * + * Partial by design: any key not yet translated falls back to English, and + * `scripts/check-i18n.mjs` reports coverage. Skate/brand vocabulary stays + * English or katakana (Spot→スポット, Shop→ショップ, Crew→クルー, Stash, The Lab, + * Nostr, Lightning, Zap, Relay→リレー, sats), because Japanese skaters use those. + */ +const jaBatch14 = { + chromeUi: { + skipToContent: 'コンテンツへスキップ', + menu: 'メニュー', + inBadge: '参加中', + loggedIn: 'ログイン済み', + profile: 'プロフィール', + logIn: 'ログイン', + logOut: 'ログアウト', + notLoggedIn: '未ログイン', + loggedOutPrompt: 'ログインしてスポットを追加し、スケーターにZapし、お気に入りを保存しましょう', + accounts: 'アカウント', + addAnotherAccount: '別のアカウントを追加', + setStatus: 'ステータスを設定', + setYourStatus: 'ステータスを設定', + status: 'ステータス', + addSpot: 'スポットを追加', + myData: 'マイデータ', + myStash: 'マイStash', + myCollections: 'マイコレクション', + viewMyProfile: 'プロフィールを表示', + customizeNavBar: 'ナビバーをカスタマイズ', + ecash: 'Ecash', + madeWith: '心を込めて', + forSkateCommunity: 'スケートボードコミュニティのために', + beta: 'ベータ', + license: 'ライセンス', + privacy: 'プライバシー', + collaborators: '協力者 & フレンズ', + notSponsoredBy: 'スポンサーではありません', + errorTitle: '読み込めませんでした', + errorDescription: 'ネットワークリクエストに失敗しました。接続を確認してもう一度お試しください。', + tryAgain: 'もう一度試す', + weatherOn: '天気オン', + weatherOff: '天気オフ', + trustFilter: '信頼フィルター', + filterByTrustLevel: '信頼レベルで絞り込み', + trust: { + all: 'すべてのユーザー', + allDesc: '全員のコンテンツを表示', + verified: '認証済み', + verifiedDesc: 'フォロー中、または認証済み(信頼 ≥90)', + trusted: '信頼済み', + trustedDesc: '友達の友達、またはNIP-05認証済み(信頼 ≥60)', + following: 'フォロー中のみ', + followingDesc: 'フォローしている人のコンテンツのみ表示', + followingShort: 'フォロー中', + }, + sort: { + recent: '最新', + recentDesc: '新しい順', + trust: '信頼度が高い順', + trustDesc: '最も信頼できるクリエイター', + proximity: '現在地に近い順', + proximityDesc: '近い場所から', + popular: '人気順', + popularDesc: 'コメント/リアクションが多い順', + zaps: 'Zapが多い順', + zapsDesc: '受け取った額が高い順', + }, + spotType: { + street: 'ストリート', + transition: 'トランジション', + park: 'パーク', + plaza: 'プラザ', + diy: 'DIY', + bowl: 'ボウル', + vert: 'バート', + indoor: '屋内', + skatepark: 'スケートパーク', + miniramp: 'ミニランプ', + }, + }, + faq: { + title: 'よくある質問', + subtitle: 'SkateSpotsについて知っておきたいすべて', + whatIsNostr: 'Nostrとは?', + whatIsNostrAnswer: 'Nostrは分散型ソーシャルネットワーキングのためのオープンプロトコルです。従来のプラットフォームと違い、データとアイデンティティはあなた自身のものです。', + howToStart: '始め方は?', + howToStartAnswer: '「新規登録」をクリックして新しいNostrアカウントを作成するか、すでにお持ちなら「ログイン」をクリックしてください。ブラウザ拡張機能、モバイルアプリ、または秘密鍵を使用できます。', + whatAreZaps: 'Zapとは?', + whatAreZapsAnswer: 'Zapは他のユーザーに送れるBitcoin Lightningのチップです。良いコンテンツへの感謝を表したり、クリエイターを支援したりする方法です。', + howToAddSpot: 'スポットの追加方法は?', + howToAddSpotAnswer: 'アカウントにログインし、「スポットを追加」をクリックして、場所、写真、説明などの詳細を入力してください。', + isItFree: 'SkateSpotsは無料ですか?', + isItFreeAnswer: 'はい!SkateSpotsは完全に無料で使えます。必要であれば他のユーザーにZap(Bitcoinチップ)を送ることもできます。', + canIEditSpot: '自分のスポットを編集・削除できますか?', + canIEditSpotAnswer: 'はい、作成したスポットを編集できます。Nostrの分散型の性質上、削除リクエストは送信されますが、一部のリレーはデータを保持することがあります。', + }, + desktopNav: { + title: 'デスクトップナビゲーション', + desc: 'トップバーに表示するタブとその順序を選べます。非表示のタブは「その他」メニューに残ります。', + fixed: '固定', + shownInTopBar: 'トップバーに表示 ({{count}})', + noExtraTabs: '追加のタブは表示されていません — すべて「その他」メニューにあります。下から追加してください。', + inMoreMenu: '「その他」メニュー内 ({{count}})', + moveUp: '{{name}} を上へ移動', + moveDown: '{{name}} を下へ移動', + hide: '{{name}} を非表示', + moveToMore: '「その他」メニューへ移動', + show: '表示', + showInTopBar: '{{name}} をトップバーに表示', + showInTopBarTitle: 'トップバーに表示', + reset: 'デフォルトにリセット', + }, + navSheet: { + title: 'バーをカスタマイズ', + desc: 'よく使う {{count}} 個のタブを選びましょう。それ以外はメニューに残ります。', + preview: 'プレビュー', + empty: '空', + order: '順序 ({{done}}/{{total}})', + available: '利用可能なタブ', + full: 'バーが満杯です — 入れ替えるには1つ外してください', + moveUp: '{{name}} を上へ移動', + moveDown: '{{name}} を下へ移動', + login: 'ログイン', + profile: 'プロフィール', + reset: 'リセット', + done: '完了', + }, + about: { + title: 'SkateSpotsについて', + subtitle: '分散型スケートボードコミュニティ', + whatIs: 'SkateSpotsとは?', + whatIsDesc: 'SkateSpotsは、世界中のスケートボードスポットを発見するためのコミュニティ主導のプラットフォームです。Nostr上に構築され、スケーターにデータの真の所有権をもたらします。', + features: '機能', + featuresDesc: 'スポットを見つけ、イベントを作成し、コーチとつながり、地元のスケートショップを支援 — すべて一か所で。', + nostr: 'Nostr上に構築', + nostrDesc: 'Nostrは、真に検閲耐性のあるグローバルなコミュニケーションを可能にする、シンプルでオープンなプロトコルです。アカウントとデータはあなたのものです。', + openSource: 'オープンソース', + openSourceDesc: 'SkateSpotsは完全にオープンソースです。貢献し、フォークし、独自のインスタンスを運営できます。', + lightning: 'Lightning決済', + lightningDesc: 'お気に入りのスケーター、コーチ、コンテンツクリエイターにBitcoin Lightning決済でZapしましょう。', + }, + onboarding: { + welcome: 'SkateSpotsへようこそ!', + welcomeDesc: 'わずか数ステップでセットアップしましょう。', + step1Title: 'アカウントを作成', + step1Desc: 'Nostr鍵を生成しています。これはあなたが管理するパスワードのようなものです。', + step2Title: '鍵をバックアップ', + step2Desc: 'リカバリーフレーズを安全な場所に保存してください。これがアカウントを復元する唯一の方法です!', + step3Title: 'プロフィールを設定', + step3Desc: 'あなた自身についてコミュニティに教えましょう。', + step4Title: '準備完了!', + step4Desc: 'スポットやイベントを探検し、スケーターとつながりましょう。', + skipForNow: '今はスキップ', + continueToApp: 'アプリへ進む', + }, +}; + +export default jaBatch14; diff --git a/src/i18n/ja/batch15.ts b/src/i18n/ja/batch15.ts new file mode 100644 index 0000000..2ab88d7 --- /dev/null +++ b/src/i18n/ja/batch15.ts @@ -0,0 +1,350 @@ +/** + * Japanese (日本語) — batch 15: toastsUi, seoUi, miscUi, sasquatchGuide, + * supportUi, statusUi. + * + * Toast copy, SEO titles/descriptions, miscellaneous UI strings, the Sasquatch + * guide panels, the support/zap block and skate status labels. + * + * Brand/protocol names and skate vocabulary stay English or katakana + * (Spot→スポット, Park→パーク, Crew→クルー, Stash, The Lab, Nostr, Lightning, + * Zap, Relay→リレー, sats, NWC, NIP-05, Cashu) and trick names stay English. + * `{{placeholders}}` are preserved verbatim, and the seoUi brand suffixes + * (" - SkateSpots" / "— SkateSpots") are kept exactly. + */ +const jaBatch15 = { + toastsUi: { + followingSuccess: 'フォローしました', + followingSuccessDesc: 'このユーザーはあなたのネットワークに追加されました', + followFailed: 'フォローに失敗しました', + unfollowSuccess: 'フォローを解除しました', + unfollowSuccessDesc: 'ネットワークから削除されました', + unfollowFailed: 'フォロー解除に失敗しました', + reportThanks: 'ありがとうございます — レビューのため送信しました', + reportFailed: '通報を送信できませんでした', + savedOffline: 'オフラインで保存しました', + savedOfflineDesc: 'オンラインに戻ったら自動的に公開されます。', + cacheCleaned: 'キャッシュを整理しました', + cacheCleanedDesc: 'キャッシュから{{count}}件の古いスポットを削除しました', + cacheCleared: 'キャッシュをクリアしました', + cacheClearedDesc: 'キャッシュされたスポットはすべて削除されました', + backOnline: 'オンラインに復帰しました', + backOnlineDesc: '{{count}}件の保存された操作を送信しました。', + postQueued: '投稿をキューに追加しました', + postQueuedDesc: 'オンラインに戻ったときに投稿が公開されます', + invalidIdentifier: '無効な識別子です。npub1...、user@domain.com、または16進数のpubkeyを使用してください', + notASpotThanks: 'ありがとうございます — レビューのため送信しました', + notASpotThanksDesc: '気にしないでください。このピンを対象外として報告し、みんなが自分で判断できるようにします。', + notASpotFailed: '通報を送信できませんでした', + pleaseTryAgain: 'もう一度お試しください。', + relayUnreachable: 'どのリレーにも接続できませんでした — 接続を確認して再試行してください。', + loginToReport: 'スポットを通報するにはログインしてください。', + zapLoginRequired: 'ログインが必要です', + zapLoginRequiredDesc: 'Zapを送信するにはログインが必要です。', + zapEventNotFound: 'イベントが見つかりません', + zapEventNotFoundDesc: 'Zapするイベントが見つかりませんでした。', + zapAuthorNotFound: '作者が見つかりません', + zapAuthorNotFoundDesc: 'このアイテムの作者が見つかりませんでした。', + zapSuccess: 'Zapが成功しました!', + zapSuccessNwcDesc: 'NWC経由で作者に{{amount}} satsを送信しました。', + zapSuccessDesc: '作者に{{amount}} satsを送信しました。', + zapStatusUnknown: '支払い状況が不明です', + zapStatusUnknownDesc: 'ウォレットがまだこのZapを処理中の可能性があります。再試行する前にウォレットを確認してください — 二重に支払わないでください。', + zapNwcFailed: 'NWCの支払いに失敗しました', + zapWeblnFailed: 'WebLNの支払いに失敗しました', + zapFallingBack: '{{error}}。他の支払い方法にフォールバックします...', + zapFailed: 'Zapに失敗しました', + zapUnknownNwcError: '不明なNWCエラー', + zapUnknownWeblnError: '不明なWebLNエラー', + nwcInvalidUri: '無効なNWC URI', + nwcInvalidUriDesc: '接続文字列を確認してもう一度お試しください。', + nwcExists: '接続はすでに存在します', + nwcExistsDesc: 'このウォレットはすでに接続されています。', + nwcConnected: 'ウォレットを接続しました', + nwcConnectedDesc: '{{alias}}に正常に接続しました。', + nwcFailed: '接続に失敗しました', + nwcFailedDesc: 'ウォレットに接続できませんでした: {{error}}', + nwcUnknownError: '不明なエラーが発生しました', + nwcDisconnected: 'ウォレットの接続を解除しました', + nwcDisconnectedDesc: 'ウォレットの接続が削除されました。', + deleteApproveAmber: 'Amberで承認', + deleteApproveAmberDesc: 'Amberが開きます — 承認をタップして削除を確定してください。', + deleteCancelled: 'キャンセルしました', + deleteCancelledDesc: 'Amberでリクエストを拒否しました。', + deleteCouldntSign: '署名できませんでした', + deletePublishing: 'ステップ 2/2: 公開中…', + deletePublishingDesc: '削除をリレーに送信中です。', + deleteStuck: 'PUBLISHINGで停滞', + deleteStuckDesc: 'リレーのステップが失敗しました: {{error}}。署名は成功しましたが、リレーが確認しませんでした。', + stashMerged: '別のデバイスからの変更をマージしました', + stashMergedDesc: 'Stashが別の場所で編集されました — 両方の変更が保持されました。', + statusUpdated: 'ステータスを更新しました!', + statusUpdatedDesc: 'あなたのスケートステータスが他の人に表示されるようになりました。', + statusFailed: 'ステータスの設定に失敗しました', + statusCleared: 'ステータスをクリアしました', + statusClearedDesc: 'ステータスが削除されました。', + statusClearFailed: 'ステータスのクリアに失敗しました', + nutzapEnabled: 'Nutzapの受信を有効にしました', + nutzapEnabledDesc: 'これでecashのZapを受信できます!', + nutzapSetupFailed: 'セットアップに失敗しました', + nutzapUnavailable: 'Nutzapの送信は利用できません', + tokenReceived: 'トークンを受信しました', + tokenReceivedDesc: 'Cashuトークンを正常に引き換えました!', + receiveFailed: '受信に失敗しました', + invalidAmount: '無効な金額', + invalidAmountDesc: '有効な金額を入力してください', + tokenCreated: 'トークンを作成しました', + sendFailed: '送信に失敗しました', + mintAdded: 'Mintを追加しました', + mintAddedDesc: 'Mintを追加し、信頼済みに設定しました', + mintAddFailed: 'Mintの追加に失敗しました', + mintRemoved: 'Mintを削除しました', + mintRemoveFailed: 'Mintの削除に失敗しました', + paymentReceived: '支払いを受信しました', + paymentReceivedDesc: '{{amount}} satsを正常に受信しました!', + paymentSent: '支払いを送信しました', + paymentSentDesc: 'Lightningの支払いが正常に完了しました', + loginRequired: 'ログインが必要です', + loginToFollowFounder: '創設者をフォローするにはログインしてください', + alreadyFollowing: 'すでにフォローしています', + alreadyFollowingDesc: 'あなたはすでに{{name}}をフォローしています!', + couldNotComplete: '完了できませんでした', + tryAgainLower: 'もう一度お試しください。', + couldNotLoadProfile: 'プロフィールを読み込めませんでした', + couldNotLoadProfileDesc: 'インターネット接続を確認して、更新してみてください。', + undone: '元に戻しました', + undoneDesc: '中立に戻りました — 非表示でも承認でもありません。', + confirmed: '確認しました', + confirmedDesc: '承認済み — このキューから外れます。', + hiddenToast: '非表示にしました', + couldNotUndo: '元に戻せませんでした', + couldNotConfirm: '確認できませんでした', + deleteFailed: '削除に失敗しました', + somethingWentWrong: '問題が発生しました', + }, + seoUi: { + becomeBuilderTitle: 'ビルダーになる - SkateSpots', + becomeBuilderDesc: 'ランプ、パーク、DIYの建築サービスを掲載 — 何を作るか、素材、規模。', + tradesTitle: 'マイ取引 — SkateSpots', + tradesDesc: 'マーケットプレイスの取引、確認、評判を管理します。', + eventsTitle: 'スケートイベント&ツアー - SkateSpots', + eventsDesc: '近くのスケートボードイベント、大会、ツアー、セッションを見つけましょう。', + editShopDesc: 'スケートショップを編集します。', + createTourDesc: 'スケートツアーを企画 — 地元の隠れた名所巡り、国内ロードトリップ、海外の冒険、またはKOTRスタイルの破壊コンペ。', + deckDesignerTitle: 'デッキデザイナー — SkateSpots DIY', + deckDesignerDesc: 'スケートボードやロングボードの輪郭をデザインし、印刷可能な1:1テンプレート、SVG、DXFを書き出します — コンケーブ、キック、ホイールベース、トラック穴を含みます。', + createEventTitle: 'スケートイベントを作成 - SkateSpots', + createEventDesc: 'コミュニティ向けの新しいスケートボードイベントを作成します。', + editTourDesc: 'スケートツアーを編集 — 立ち寄り先、日程、詳細を更新します。', + walletTitle: 'ウォレット - SkateSpots', + walletDesc: 'Lightningウォレットを接続して、スケーターやスポット作成者にZapを送りましょう。', + becomePhotographerTitle: 'フォトグラファーになる - SkateSpots', + becomePhotographerDesc: 'スケート写真のプロフィールを作成 — カメラ、レンズ、照明、サービス。', + newsletterTitle: 'ニュースレター - SkateSpots', + newsletterDesc: 'SkateSpotsコミュニティからの週刊ドロップ。アプリの更新、新しいスポット、イベント、スケートボードを支える人々。', + homeTitle: 'SkateSpots - 世界中のスケートボードスポットを見つけよう', + zapLeaderboardTitle: 'Zapランキング - SkateSpots', + zapLeaderboardDesc: '最もZapされたスケートスポットと、それを支えるコミュニティメンバー。', + adminReviewTitle: 'レビューキュー — SkateSpots', + gearSwapTitle: 'ギア交換 - SkateSpots', + gearSwapDesc: '他のスケーターと中古スケートギアを売買。デッキ、トラック、ウィール、シューズなど。', + donateTitle: '寄付 — SkateSpots', + donateDesc: 'SkateSpotsを支援 — Lightning、プライベートなオンチェーン(サイレントペイメント)、またはAngorで開発を支援。', + verifyCardTitle: '認証 — SkateSpots', + verifyCardDesc: 'SkateSpotsカードまたはアクセスパスを認証します。', + mapTitle: 'Skate Spotsマップ - SkateSpots', + mapDesc: 'インタラクティブなマップで世界中のスケートボードスポットを探索しましょう。', + diyTitle: 'DIY — 自分で作る | SkateSpots', + diyDesc: '自分のスケートボード、ランプ、コンクリートスポットを作るためのガイド、オープンツール、設計図 — そして一緒に作る人々と場所。', + appShopTitle: 'アプリショップ — SkateSpots', + becomeSkaterTitle: 'スケーター名鑑に参加 - SkateSpots', + becomeSkaterDesc: 'スケータープロフィールを作成して、コミュニティに見つけてもらいましょう。', + marketplaceTitle: 'マーケットプレイス - SkateSpots', + marketplaceDesc: '分散型のPlebeian Marketでスケートボードギアを売買しましょう。', + becomeEditorTitle: '動画エディターになる - SkateSpots', + becomeEditorDesc: 'SkateSpotsでスケートボード動画エディターのプロフィールを作成します。', + amberCallbackTitle: 'Amberでサインイン - SkateSpots', + amberCallbackDesc: 'Amber (NIP-55) ログインを完了しています。', + supportersTitle: 'サポーター - SkateSpots', + supportersDesc: 'SkateSpotsを支えるコミュニティ — サポーター、協力者、パートナー、友人。', + becomeCoachTitle: 'コーチになる - SkateSpots', + becomeCoachDesc: 'スケートボードコーチのプロフィールを作成します。', + riderCardTitle: 'スケーターカード — SkateSpots', + riderCardDesc: '印刷可能なSkateSpotsスケーターライセンスまたはパークアクセスカードを作成します。', + editEventDesc: 'スケートボードイベントを編集します。', + createShopTitle: 'スケートショップを追加 - SkateSpots', + createShopDesc: 'あなたのスケートショップをコミュニティに追加します。', + deckCostTitle: 'デッキ原価計算機 — SkateSpots DIY', + deckCostDesc: 'デッキを作るのにかかる費用 — 人件費、設備、材料、工程時間、梱包、マージン — と適正な販売価格を算出します。', + pyramidTitle: 'ピラミッドランキング - SkateSpots', + pyramidDesc: 'トップコントリビューターとコミュニティリーダー。', + foodTitle: 'スポット周辺のフード - SkateSpots', + foodDesc: 'スケートボードスポットの近くにあるレストラン、カフェ、フードを見つけましょう。', + createListingTitle: 'ギアを出品 - SkateSpots', + createListingDesc: '売りたいスケートボードギアを出品するか、買いたいギアを見つけましょう。', + becomeFilmerTitle: 'フィルマーになる - SkateSpots', + becomeFilmerDesc: 'スケートボード撮影のプロフィールを作成します。', + skatersTitle: 'スケーター - SkateSpots', + skatersDesc: 'SkateSpotsコミュニティのスケーターを見つけましょう。スタイル、スタンス、レベル、場所で閲覧できます。', + communityStatsTitle: 'コミュニティ統計 — SkateSpots', + communityStatsDesc: 'SkateSpotsのライブコミュニティ指標 — スポット、イベント、コーチ、フィルマー、エディター、ツアー、そして時間の経過に伴う成長。Nostrから直接取得。', + labTitle: 'The Lab - SkateSpots', + labDesc: 'スケートボードのコーチ、フィルマー、フォトグラファー、動画エディターを見つけましょう。', + stashTitle: 'マイStash - SkateSpots', + stashDesc: 'プライベートなギアの在庫を管理。所有しているもの、売りたいもの、交換したいものを記録します。', + bountyLeaderboardTitle: 'マップ&稼ぐ - SkateSpots', + bountyLeaderboardDesc: 'スケートスポットやショップをマッピングして、コミュニティからZapを獲得。トップコントリビューターをチェック。', + spotCollectionsTitle: 'マイスポットコレクション - SkateSpots', + spotCollectionsDesc: 'お気に入りのスケートスポットをパーソナライズされたコレクションに整理します', + mintsTitle: 'Cashuミント — SkateSpots', + mintsDesc: 'Cashuミントを閲覧し、健全性を確認して、ウォレットに追加しましょう。', + }, + miscUi: { + openingCamera: 'カメラを起動しています…', + usePhoneCamera: 'スマホのカメラを使用してから、ここに戻ってください', + startingCamera: 'カメラを起動中...', + cameraAccessRequired: 'カメラへのアクセスが必要です', + cameraAccessHint: 'ブラウザの設定でカメラへのアクセスを許可するか、下のファイル選択を使用してください。', + cameraErrorTitle: 'カメラエラー', + cameraErrorDesc: 'カメラを開けませんでした。設定でアプリの権限を確認してください。', + cameraDeniedTitle: 'カメラへのアクセスが拒否されました', + cameraDeniedDesc: 'ブラウザの設定でカメラへのアクセスを許可してください。', + uploadFromGallery: 'ギャラリーからアップロード', + uploading: 'アップロード中...', + usePhoto: '写真を使用', + earningPotential: '収益の可能性', + qualityExcellent: '最高!', + qualityGood: '良好', + qualityBasic: '基本', + qualityGettingStarted: 'はじめたばかり', + qualityLocationAdded: '場所を追加済み', + qualityOnePhoto: '写真が1枚以上', + qualityThreePhotos: '写真3枚以上', + qualityMoreAngles: 'アングルが多いほど良い', + qualityDescription: '説明', + qualityDetailedDesc: '詳しい説明(100文字以上)', + qualityContact: '連絡先情報', + qualityPhoneOrWebsite: '電話番号またはウェブサイト', + qualityHours: '営業時間', + qualitySpotType: 'スポットの種類を選択済み', + failedToLoadComments: 'コメントを読み込めませんでした', + commentsTitle: 'コメント', + noCommentsYet: 'まだコメントがありません', + beFirstComment: '最初に感想を共有しましょう!', + removeMember: 'メンバーを削除', + whoIsThisFor: 'このプロフィールは誰のものですか?', + individual: '個人', + individualDesc: '1人の人物', + collective: 'コレクティブ', + collectiveDesc: 'クルー、スタジオ、会社', + membersLabel: 'メンバー', + dismissReport: '通報を却下', + reportedBy: '通報者:', + completingLoginAmber: 'Amberでログインを完了しています...', + entityMembersHint: 'クルーのNostrアカウントを追加します。各メンバーは自分のキーで自分のスポットを確認します — それまでは「保留中」と表示されます。', + entityVerifiedHint: 'メンバーシップはメンバーごとに認証されます — 本人のアカウントから確認しない限り、誰もあなたのクルーに追加されることはありません。', + entityInvalidPubkey: '有効なnpub、nprofile、または64文字の16進数pubkeyを入力してください。', + entityAlreadyAdded: 'そのメンバーはすでに追加されています。', + offline: 'オフライン', + connected: '接続済み', + offlineMode: 'オフラインモード', + allFeaturesAvailable: 'すべての機能が利用可能', + browsingCachedSpots: 'キャッシュされたスポットを閲覧中', + queuedActions: '{{count}}件の操作をキューに保存', + syncing: '同期中', + publishingWhenStable: '接続が安定したら公開します...', + willPublishOnline: 'オンラインに戻ったら公開されます', + availableOffline: 'オフラインで利用可能:', + offlineBrowseSpots: '以前に閲覧したスポットを閲覧', + offlineViewDetails: 'キャッシュされたスポットの詳細を表示', + offlineKeepActing: '操作を続けられます — 投稿、RSVP、出品、メッセージはキューに保存され、再接続時に送信されます', + }, + sasquatchGuide: { + homeTitle: 'SkateSpotsへようこそ!🦧', + homeMessage: 'よう、俺はThe Sasquatch。ボードとトレイル、そしてワイルドなライドの番人だ。Nostrの手つかずのスケートワールドへようこそ — スーツも広告もなし、ただスケーターが自分の道を切り開くだけ。ここではトリックもデータも自分のもの、痕跡を残せばBitcoinまで稼げる。近所のスケーターとも世界中のスケーターともつながれる。ルールはシャレッディングだけ、足跡も自分のものだけ。', + homeQ1: 'バルセロナで3日間のプランを立てて', + homeQ2: '初心者向けスポットを探す', + homeQ3: '近日中のイベントは?', + homeQ4: 'コミュニティ統計', + homeQ5: '近くのコーチを探す', + homeQ6: '売り物のギアは?', + homeQ7: 'Nostrとは?', + homeQ8: 'これは無料?', + homeLearnMore: 'もっと詳しく', + onboardingTitle: 'はじめよう 🚀', + onboardingMessage: '基本を理解するお手伝いをします!Nostrはあなたのアイデンティティ、Bitcoin Lightningは貢献でsatsを稼げる仕組み、Zapは即時チップです。はじめ方について何でも聞いてください!', + onboardingQ1: 'ログイン方法は?', + onboardingQ2: 'Nostrとは?', + onboardingQ3: 'Nostrはどう動くの?', + onboardingQ4: 'Cashuとは?', + onboardingQ5: 'Cashuウォレットの使い方は?', + onboardingQ6: 'Mintとは?', + onboardingQ7: 'Zapとは?', + onboardingQ8: 'NWCとは?', + onboardingStart: '探索をはじめる', + onboardingLogin: 'ログインしてはじめる', + labTitle: 'The Labへようこそ!🎓', + labMessage: 'ここは魔法が起きる場所!kickflipからdarkslideまで何でも教えられるコーチを見つけたり、最高のセッションを撮影するフィルマーとつながったりできます。スキルで絞り込み、経験を確認して、セッションを予約しましょう。忘れないで — 誰だって最初は初心者でした!', + labQ1: 'コーチを探す', + labQ2: 'フィルマーを探す', + labQ3: 'フォトグラファーを探す', + labQ4: '動画エディターを探す', + labQ5: 'ランプビルダーを探す', + labQ6: 'The Labとは?', + labQ7: 'ビルダーとは?', + labQ8: 'コーチングを提供するには?', + labLogin: 'ログインしてサービスを提供', + crewsTitle: 'クルー 🤘', + crewsMessage: 'クルーはマップに根ざしたスケートファミリー — 雇う相手ではなく、一緒にスケートする仲間です。どのクルーにもマップ上のホームターフ、ホームスポット、メンバー、マニフェストがあります。メンバーは自分のキーで確認するので、名簿は本物です。自分のクルーを始めるか、仲間を見つけましょう!', + crewsQ1: 'クルーとは?', + crewsQ2: 'クルーの始め方は?', + crewsQ3: 'クルーとThe Labの違いは?', + crewsQ4: 'メンバーはどう確認するの?', + crewsQ5: 'Nostrとは?', + crewsQ6: 'Zapはどう機能するの?', + crewsLogin: 'ログインしてクルーを作成', + }, + supportUi: { + keepMapFree: 'マップを無料に保つ', + keepMapFreeDesc: '広告なし、トラッキングなし、VCなし。あなたのsatsがホスティング、AIノード、リレーを支えます。', + thankYou: 'ありがとうございます!⚡', + satsKeepMapFree: 'あなたのsatsがマップを無料に保ちます。', + keptFreeNext: 'あなたは次のスケーターのためにSkateSpotsを無料に保ちました。', + scanToPay: 'スキャンして支払う', + zapSkateSpots: 'SkateSpotsにZap', + payQuietly: '静かに支払う', + pickAmount: '金額を選ぶ', + enterAmount: '送りたいsats数を入力してください。', + couldNotStartPayment: '支払いを開始できませんでした。', + customAmountAria: 'カスタム金額(sats)', + commentPlaceholder: 'ひとことどうぞ(任意 — 公開Zapのみ)', + publicZapTitle: 'コメント付きの公開Zap', + loginToZapTitle: 'ログインして公開Zapを送る', + anonymousTitle: '匿名 — ログインなし、記録なし', + copyLightningTitle: 'Lightningアドレスをコピー', + copiedSuffix: '{{label}}をコピーしました', + invoiceLabel: 'インボイス', + addressLabel: 'アドレス', + notAPurchase: '購入ではなく支援です — 何も購入できず、返金もありません。グッズとSasquatch Proは別です。静かな支払いであなたの位置情報と身元が関与することはありません。', + }, + statusUi: { + quickStatus: 'クイックステータス', + skating: 'スケート中', + skatingDesc: '現在スケート中', + filming: '撮影中', + filmingDesc: 'トリックを撮影中', + lookingForSesh: 'セッション相手を募集中', + lookingForSeshDesc: '他の人とスケートしたい', + coaching: 'コーチング中', + coachingDesc: '指導/コーチング中', + chilling: 'まったり中', + chillingDesc: 'スポットでくつろぎ中', + onMyWay: '向かっています', + onMyWayDesc: 'スポットへ移動中', + takingABreak: '休憩中', + takingABreakDesc: '休憩/水分補給中', + doneForToday: '今日は終了', + doneForTodayDesc: 'スケートを終えました', + }, +}; + +export default jaBatch15; diff --git a/src/i18n/ja/index.ts b/src/i18n/ja/index.ts index 9c35f99..4b500f2 100644 --- a/src/i18n/ja/index.ts +++ b/src/i18n/ja/index.ts @@ -9,6 +9,10 @@ import batch8 from './batch8'; import batch9 from './batch9'; import batch10 from './batch10'; import batch11 from './batch11'; +import batch12 from './batch12'; +import batch13 from './batch13'; +import batch14 from './batch14'; +import batch15 from './batch15'; /** * Japanese (日本語) translations — composed from fragments so parallel batches @@ -30,6 +34,10 @@ const ja = { ...batch9, ...batch10, ...batch11, + ...batch12, + ...batch13, + ...batch14, + ...batch15, }; export default ja; diff --git a/src/i18n/th/batch14.ts b/src/i18n/th/batch14.ts new file mode 100644 index 0000000..8466e83 --- /dev/null +++ b/src/i18n/th/batch14.ts @@ -0,0 +1,345 @@ +/** + * Thai (ไทย) — batch 14: toastsUi, seoUi, miscUi, sasquatchGuide, supportUi, + * statusUi. + * Skate terms stay English (Spot, Park, Crew, Stash, The Lab, Nostr, Lightning, + * Zap, Relay, sats, NWC, NIP-05, Cashu) and trick names stay English. + * {{placeholders}} and the " - SkateSpots"/"— SkateSpots" SEO suffixes are kept + * exactly as in English. + */ +const thBatch14 = { + toastsUi: { + followingSuccess: 'ติดตามสำเร็จ', + followingSuccessDesc: 'ผู้ใช้รายนี้อยู่ในเครือข่ายของคุณแล้ว', + followFailed: 'ติดตามไม่สำเร็จ', + unfollowSuccess: 'เลิกติดตามสำเร็จ', + unfollowSuccessDesc: 'นำออกจากเครือข่ายของคุณแล้ว', + unfollowFailed: 'เลิกติดตามไม่สำเร็จ', + reportThanks: 'ขอบคุณ — ส่งให้ตรวจสอบแล้ว', + reportFailed: 'ไม่สามารถส่งรายงานได้', + savedOffline: 'บันทึกแบบออฟไลน์แล้ว', + savedOfflineDesc: 'เราจะเผยแพร่ให้อัตโนมัติเมื่อคุณกลับมาออนไลน์', + cacheCleaned: 'ล้างแคชแล้ว', + cacheCleanedDesc: 'นำ Spot เก่า {{count}} รายการออกจากแคชแล้ว', + cacheCleared: 'ล้างแคชแล้ว', + cacheClearedDesc: 'นำ Spot ที่แคชไว้ทั้งหมดออกแล้ว', + backOnline: 'กลับมาออนไลน์แล้ว', + backOnlineDesc: 'ส่งการกระทำที่บันทึกไว้ {{count}} รายการแล้ว', + postQueued: 'โพสต์อยู่ในคิว', + postQueuedDesc: 'โพสต์ของคุณจะถูกเผยแพร่เมื่อคุณกลับมาออนไลน์', + invalidIdentifier: 'ตัวระบุไม่ถูกต้อง ใช้ npub1..., user@domain.com หรือ hex pubkey', + notASpotThanks: 'ขอบคุณ — ส่งให้ตรวจสอบแล้ว', + notASpotThanksDesc: 'ไม่ถือโทษนะ: การทำเครื่องหมายนี้เป็นการระบุว่าพินนี้ไม่เกี่ยวข้อง เพื่อให้ผู้คนตัดสินใจเองได้', + notASpotFailed: 'ไม่สามารถส่งรายงานได้', + pleaseTryAgain: 'โปรดลองอีกครั้ง', + relayUnreachable: 'ไม่สามารถเข้าถึง Relay ใดได้เลย — ตรวจสอบการเชื่อมต่อแล้วลองอีกครั้ง', + loginToReport: 'เข้าสู่ระบบเพื่อรายงาน Spot', + zapLoginRequired: 'ต้องเข้าสู่ระบบ', + zapLoginRequiredDesc: 'คุณต้องเข้าสู่ระบบเพื่อส่ง Zap', + zapEventNotFound: 'ไม่พบอีเวนต์', + zapEventNotFoundDesc: 'ไม่พบอีเวนต์ที่จะ Zap', + zapAuthorNotFound: 'ไม่พบผู้เขียน', + zapAuthorNotFoundDesc: 'ไม่พบผู้เขียนของรายการนี้', + zapSuccess: 'Zap สำเร็จ!', + zapSuccessNwcDesc: 'คุณส่ง {{amount}} sats ให้ผู้เขียนผ่าน NWC แล้ว', + zapSuccessDesc: 'คุณส่ง {{amount}} sats ให้ผู้เขียนแล้ว', + zapStatusUnknown: 'ไม่ทราบสถานะการชำระเงิน', + zapStatusUnknownDesc: 'กระเป๋าเงินของคุณอาจยังคงจัดการ Zap นี้อยู่ ตรวจสอบกระเป๋าเงินก่อนลองใหม่ — อย่าจ่ายซ้ำ', + zapNwcFailed: 'การชำระเงินผ่าน NWC ล้มเหลว', + zapWeblnFailed: 'การชำระเงินผ่าน WebLN ล้มเหลว', + zapFallingBack: '{{error}} กำลังลองวิธีชำระเงินอื่น...', + zapFailed: 'Zap ล้มเหลว', + zapUnknownNwcError: 'ข้อผิดพลาด NWC ที่ไม่ทราบสาเหตุ', + zapUnknownWeblnError: 'ข้อผิดพลาด WebLN ที่ไม่ทราบสาเหตุ', + nwcInvalidUri: 'NWC URI ไม่ถูกต้อง', + nwcInvalidUriDesc: 'โปรดตรวจสอบ connection string แล้วลองอีกครั้ง', + nwcExists: 'มีการเชื่อมต่ออยู่แล้ว', + nwcExistsDesc: 'กระเป๋าเงินนี้เชื่อมต่ออยู่แล้ว', + nwcConnected: 'เชื่อมต่อกระเป๋าเงินแล้ว', + nwcConnectedDesc: 'เชื่อมต่อกับ {{alias}} สำเร็จแล้ว', + nwcFailed: 'การเชื่อมต่อล้มเหลว', + nwcFailedDesc: 'ไม่สามารถเชื่อมต่อกับกระเป๋าเงินได้: {{error}}', + nwcUnknownError: 'เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ', + nwcDisconnected: 'ยกเลิกการเชื่อมต่อกระเป๋าเงินแล้ว', + nwcDisconnectedDesc: 'ลบการเชื่อมต่อกระเป๋าเงินแล้ว', + deleteApproveAmber: 'อนุมัติใน Amber', + deleteApproveAmberDesc: 'Amber จะเปิดขึ้น — แตะ Approve เพื่อยืนยันการลบ', + deleteCancelled: 'ยกเลิกแล้ว', + deleteCancelledDesc: 'คุณปฏิเสธคำขอใน Amber', + deleteCouldntSign: 'ไม่สามารถลงนามได้', + deletePublishing: 'ขั้นตอน 2/2: กำลังเผยแพร่…', + deletePublishingDesc: 'กำลังส่งคำขอลบไปยัง Relay', + deleteStuck: 'ค้างที่ PUBLISHING', + deleteStuckDesc: 'ขั้นตอน Relay ล้มเหลว: {{error}} ลงนามสำเร็จแล้ว แต่ Relay ไม่ยืนยัน', + stashMerged: 'รวมการเปลี่ยนแปลงจากอุปกรณ์อื่นแล้ว', + stashMergedDesc: 'Stash ของคุณถูกแก้ไขจากที่อื่น — เก็บการเปลี่ยนแปลงทั้งสองชุดไว้แล้ว', + statusUpdated: 'อัปเดตสถานะแล้ว!', + statusUpdatedDesc: 'สถานะการเล่นสเก็ตของคุณแสดงให้ผู้อื่นเห็นแล้ว', + statusFailed: 'ตั้งค่าสถานะไม่สำเร็จ', + statusCleared: 'ล้างสถานะแล้ว', + statusClearedDesc: 'นำสถานะของคุณออกแล้ว', + statusClearFailed: 'ล้างสถานะไม่สำเร็จ', + nutzapEnabled: 'เปิดรับ Nutzap แล้ว', + nutzapEnabledDesc: 'ตอนนี้คุณรับ ecash Zap ได้แล้ว!', + nutzapSetupFailed: 'ตั้งค่าไม่สำเร็จ', + nutzapUnavailable: 'การส่ง Nutzap ใช้งานไม่ได้', + tokenReceived: 'ได้รับโทเคน', + tokenReceivedDesc: 'แลก Cashu token สำเร็จแล้ว!', + receiveFailed: 'รับไม่สำเร็จ', + invalidAmount: 'จำนวนไม่ถูกต้อง', + invalidAmountDesc: 'โปรดป้อนจำนวนที่ถูกต้อง', + tokenCreated: 'สร้างโทเคนแล้ว', + sendFailed: 'ส่งไม่สำเร็จ', + mintAdded: 'เพิ่ม Mint แล้ว', + mintAddedDesc: 'เพิ่ม Mint และเชื่อถือสำเร็จแล้ว', + mintAddFailed: 'เพิ่ม Mint ไม่สำเร็จ', + mintRemoved: 'ลบ Mint แล้ว', + mintRemoveFailed: 'ลบ Mint ไม่สำเร็จ', + paymentReceived: 'ได้รับการชำระเงิน', + paymentReceivedDesc: 'รับ {{amount}} sats สำเร็จแล้ว!', + paymentSent: 'ส่งการชำระเงินแล้ว', + paymentSentDesc: 'ชำระเงินผ่าน Lightning สำเร็จแล้ว', + loginRequired: 'ต้องเข้าสู่ระบบ', + loginToFollowFounder: 'โปรดเข้าสู่ระบบเพื่อติดตามผู้ก่อตั้ง', + alreadyFollowing: 'ติดตามอยู่แล้ว', + alreadyFollowingDesc: 'คุณติดตาม {{name}} อยู่แล้ว!', + couldNotComplete: 'ไม่สามารถดำเนินการได้', + tryAgainLower: 'ลองอีกครั้ง', + couldNotLoadProfile: 'ไม่สามารถโหลดโปรไฟล์ได้', + couldNotLoadProfileDesc: 'ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตแล้วลองรีเฟรช', + undone: 'เลิกทำแล้ว', + undoneDesc: 'กลับสู่สถานะปกติ — ไม่ได้ซ่อน ไม่ได้รับรอง', + confirmed: 'ยืนยันแล้ว', + confirmedDesc: 'รับรองแล้ว — จะออกจากคิวนี้', + hiddenToast: 'ซ่อนแล้ว', + couldNotUndo: 'ไม่สามารถเลิกทำได้', + couldNotConfirm: 'ไม่สามารถยืนยันได้', + deleteFailed: 'ลบไม่สำเร็จ', + somethingWentWrong: 'มีบางอย่างผิดพลาด', + }, + seoUi: { + becomeBuilderTitle: 'เป็น Builder - SkateSpots', + becomeBuilderDesc: 'ลงประกาศบริการสร้างแรมป์ Park และ DIY ของคุณ — สิ่งที่คุณสร้าง วัสดุ และขนาดงาน', + tradesTitle: 'การซื้อขายของฉัน — SkateSpots', + tradesDesc: 'จัดการการซื้อขายในตลาด การยืนยัน และชื่อเสียงของคุณ', + eventsTitle: 'อีเวนต์และทัวร์สเก็ต - SkateSpots', + eventsDesc: 'ค้นพบอีเวนต์สเก็ตบอร์ด การแข่งขัน ทัวร์ และเซสชันใกล้คุณ', + editShopDesc: 'แก้ไขร้านสเก็ตของคุณ', + createTourDesc: 'จัดทัวร์สเก็ต — ทัวร์จุดลับในท้องถิ่น ทริปบนถนนระดับประเทศ การผจญภัยต่างประเทศ หรือการแข่งขันแนวทำลายล้างสไตล์ KOTR', + deckDesignerTitle: 'Deck Designer — SkateSpots DIY', + deckDesignerDesc: 'ออกแบบโครงร่างสเก็ตบอร์ดหรือลองบอร์ด แล้วส่งออกเป็นเทมเพลตพิมพ์ขนาด 1:1, SVG หรือ DXF — รวม concave, kicks, wheelbase และรู truck', + createEventTitle: 'สร้างอีเวนต์สเก็ต - SkateSpots', + createEventDesc: 'สร้างอีเวนต์สเก็ตบอร์ดใหม่สำหรับคอมมูนิตี้', + editTourDesc: 'แก้ไขทัวร์สเก็ตของคุณ — อัปเดตจุดแวะ วันที่ และรายละเอียด', + walletTitle: 'กระเป๋าเงิน - SkateSpots', + walletDesc: 'เชื่อมต่อกระเป๋าเงิน Lightning ของคุณเพื่อส่ง Zap ให้สเก็ตเตอร์และผู้สร้าง Spot', + becomePhotographerTitle: 'เป็นช่างภาพ - SkateSpots', + becomePhotographerDesc: 'สร้างโปรไฟล์ช่างภาพสเก็ตของคุณ — กล้อง เลนส์ แสง และบริการ', + newsletterTitle: 'จดหมายข่าว - SkateSpots', + newsletterDesc: 'ข่าวรายสัปดาห์จากคอมมูนิตี้ SkateSpots อัปเดตแอป Spot ใหม่ อีเวนต์ และผู้คนที่ทำให้สเก็ตบอร์ดยังมีชีวิต', + homeTitle: 'SkateSpots - ค้นพบสถานที่เล่นสเก็ตบอร์ดทั่วโลก', + zapLeaderboardTitle: 'อันดับ Zap - SkateSpots', + zapLeaderboardDesc: 'Spot สเก็ตที่ถูก Zap มากที่สุดและสมาชิกคอมมูนิตี้ที่สนับสนุนพวกเขา', + adminReviewTitle: 'คิวตรวจสอบ — SkateSpots', + gearSwapTitle: 'แลกเปลี่ยนอุปกรณ์ - SkateSpots', + gearSwapDesc: 'ซื้อและขายอุปกรณ์สเก็ตมือสองกับสเก็ตเตอร์คนอื่น เด็ค truck ล้อ รองเท้า และอื่น ๆ', + donateTitle: 'บริจาค — SkateSpots', + donateDesc: 'สนับสนุน SkateSpots — Lightning, on-chain แบบส่วนตัว (silent payments) หรือสนับสนุนการพัฒนาบน Angor', + verifyCardTitle: 'ตรวจสอบ — SkateSpots', + verifyCardDesc: 'ตรวจสอบการ์ด SkateSpots หรือบัตรผ่านเข้าใช้', + mapTitle: 'แผนที่ Spot สเก็ต - SkateSpots', + mapDesc: 'สำรวจ Spot สเก็ตบอร์ดทั่วโลกบนแผนที่แบบโต้ตอบของเรา', + diyTitle: 'DIY — ทำเอง | SkateSpots', + diyDesc: 'คู่มือ เครื่องมือเปิด และแผนสำหรับทำสเก็ตบอร์ด แรมป์ และ Spot คอนกรีตด้วยตัวเอง — พร้อมผู้คนและสถานที่ที่จะทำด้วยกัน', + appShopTitle: 'App Shop — SkateSpots', + becomeSkaterTitle: 'เข้าร่วมไดเรกทอรีสเก็ตเตอร์ - SkateSpots', + becomeSkaterDesc: 'สร้างโปรไฟล์สเก็ตเตอร์ของคุณเพื่อให้คอมมูนิตี้ค้นหาคุณเจอ', + marketplaceTitle: 'ตลาด - SkateSpots', + marketplaceDesc: 'ซื้อและขายอุปกรณ์สเก็ตบอร์ดบน Plebeian Market แบบกระจายศูนย์', + becomeEditorTitle: 'เป็น Video Editor - SkateSpots', + becomeEditorDesc: 'สร้างโปรไฟล์ Video Editor สเก็ตบอร์ดของคุณบน SkateSpots', + amberCallbackTitle: 'เข้าสู่ระบบด้วย Amber - SkateSpots', + amberCallbackDesc: 'กำลังเข้าสู่ระบบด้วย Amber (NIP-55) ให้เสร็จสิ้น', + supportersTitle: 'ผู้สนับสนุน - SkateSpots', + supportersDesc: 'คอมมูนิตี้ที่ทำให้ SkateSpots ยังมีชีวิต — ผู้สนับสนุน ผู้ร่วมงาน พาร์ตเนอร์ และเพื่อน ๆ', + becomeCoachTitle: 'เป็นโค้ช - SkateSpots', + becomeCoachDesc: 'สร้างโปรไฟล์โค้ชสเก็ตบอร์ดของคุณ', + riderCardTitle: 'การ์ดสเก็ตเตอร์ — SkateSpots', + riderCardDesc: 'สร้างใบขับขี่สเก็ตเตอร์ SkateSpots หรือบัตรผ่าน Park ที่พิมพ์ได้ของคุณ', + editEventDesc: 'แก้ไขอีเวนต์สเก็ตบอร์ดของคุณ', + createShopTitle: 'เพิ่มร้านสเก็ต - SkateSpots', + createShopDesc: 'เพิ่มร้านสเก็ตของคุณเข้าสู่คอมมูนิตี้', + deckCostTitle: 'เครื่องคำนวณต้นทุนเด็ค — SkateSpots DIY', + deckCostDesc: 'คำนวณว่าการทำเด็คหนึ่งใบมีต้นทุนเท่าไร — ค่าแรง อุปกรณ์ วัสดุ เวลาผลิต บรรจุภัณฑ์ และกำไร — พร้อมราคาขายที่ยุติธรรม', + pyramidTitle: 'อันดับพีระมิด - SkateSpots', + pyramidDesc: 'ผู้มีส่วนร่วมสูงสุดและผู้นำคอมมูนิตี้', + foodTitle: 'อาหารใกล้ Spot - SkateSpots', + foodDesc: 'ค้นหาร้านอาหาร คาเฟ่ และตัวเลือกอาหารใกล้ Spot สเก็ตบอร์ด', + createListingTitle: 'ลงขายอุปกรณ์ - SkateSpots', + createListingDesc: 'ลงขายอุปกรณ์สเก็ตบอร์ดหรือหาอุปกรณ์ที่คุณอยากซื้อ', + becomeFilmerTitle: 'เป็น Filmer - SkateSpots', + becomeFilmerDesc: 'สร้างโปรไฟล์การถ่ายสเก็ตบอร์ดของคุณ', + skatersTitle: 'สเก็ตเตอร์ - SkateSpots', + skatersDesc: 'ค้นพบสเก็ตเตอร์ในคอมมูนิตี้ SkateSpots เลือกดูตามสไตล์ ท่ายืน ระดับ และตำแหน่ง', + communityStatsTitle: 'สถิติคอมมูนิตี้ — SkateSpots', + communityStatsDesc: 'ข้อมูลคอมมูนิตี้สด ๆ ของ SkateSpots — Spot อีเวนต์ โค้ช Filmer Video Editor ทัวร์ และการเติบโตเมื่อเวลาผ่านไป ดึงตรงจาก Nostr', + labTitle: 'The Lab - SkateSpots', + labDesc: 'ค้นหาโค้ชสเก็ตบอร์ด Filmer ช่างภาพ และ Video Editor', + stashTitle: 'Stash ของฉัน - SkateSpots', + stashDesc: 'จัดการคลังอุปกรณ์ส่วนตัวของคุณ ติดตามสิ่งที่คุณมี สิ่งที่อยากขายหรือแลก', + bountyLeaderboardTitle: 'ปักแผนที่แล้วรับรางวัล - SkateSpots', + bountyLeaderboardDesc: 'ปักแผนที่ Spot สเก็ตและร้านค้า รับ Zap จากคอมมูนิตี้ ดูผู้มีส่วนร่วมสูงสุด', + spotCollectionsTitle: 'คอลเลกชัน Spot ของฉัน - SkateSpots', + spotCollectionsDesc: 'จัดระเบียบ Spot สเก็ตโปรดของคุณเป็นคอลเลกชันเฉพาะตัว', + mintsTitle: 'Cashu Mint — SkateSpots', + mintsDesc: 'เลือกดู Cashu Mint ตรวจสอบสถานะ และเพิ่มเข้าในกระเป๋าเงินของคุณ', + }, + miscUi: { + openingCamera: 'กำลังเปิดกล้อง…', + usePhoneCamera: 'ใช้กล้องโทรศัพท์ของคุณ แล้วกลับมาที่นี่', + startingCamera: 'กำลังเริ่มกล้อง...', + cameraAccessRequired: 'ต้องอนุญาตการเข้าถึงกล้อง', + cameraAccessHint: 'อนุญาตการเข้าถึงกล้องในการตั้งค่าเบราว์เซอร์ หรือใช้ตัวเลือกไฟล์ด้านล่าง', + cameraErrorTitle: 'ข้อผิดพลาดกล้อง', + cameraErrorDesc: 'ไม่สามารถเปิดกล้องได้ โปรดตรวจสอบสิทธิ์ของแอปในการตั้งค่า', + cameraDeniedTitle: 'การเข้าถึงกล้องถูกปฏิเสธ', + cameraDeniedDesc: 'โปรดอนุญาตการเข้าถึงกล้องในการตั้งค่าเบราว์เซอร์', + uploadFromGallery: 'อัปโหลดจากแกลเลอรี', + uploading: 'กำลังอัปโหลด...', + usePhoto: 'ใช้รูปนี้', + earningPotential: 'โอกาสในการสร้างรายได้', + qualityExcellent: 'ยอดเยี่ยม!', + qualityGood: 'ดี', + qualityBasic: 'พื้นฐาน', + qualityGettingStarted: 'เริ่มต้น', + qualityLocationAdded: 'เพิ่มตำแหน่งแล้ว', + qualityOnePhoto: 'อย่างน้อย 1 รูป', + qualityThreePhotos: '3 รูปขึ้นไป', + qualityMoreAngles: 'ยิ่งหลายมุมยิ่งดี', + qualityDescription: 'คำอธิบาย', + qualityDetailedDesc: 'คำอธิบายละเอียด (100 ตัวอักษรขึ้นไป)', + qualityContact: 'ข้อมูลติดต่อ', + qualityPhoneOrWebsite: 'โทรศัพท์หรือเว็บไซต์', + qualityHours: 'เวลาทำการ', + qualitySpotType: 'เลือกประเภท Spot แล้ว', + failedToLoadComments: 'โหลดความคิดเห็นไม่สำเร็จ', + commentsTitle: 'ความคิดเห็น', + noCommentsYet: 'ยังไม่มีความคิดเห็น', + beFirstComment: 'เป็นคนแรกที่แบ่งปันความคิดเห็นของคุณ!', + removeMember: 'นำสมาชิกออก', + whoIsThisFor: 'โปรไฟล์นี้สำหรับใคร?', + individual: 'บุคคล', + individualDesc: 'คนคนเดียว', + collective: 'กลุ่ม', + collectiveDesc: 'Crew สตูดิโอ หรือบริษัท', + membersLabel: 'สมาชิก', + dismissReport: 'ปิดรายงาน', + reportedBy: 'รายงานโดย', + completingLoginAmber: 'กำลังเข้าสู่ระบบด้วย Amber ให้เสร็จสิ้น...', + entityMembersHint: 'เพิ่มบัญชี Nostr ของ Crew คุณ สมาชิกแต่ละคนยืนยัน Spot ของตัวเองด้วยคีย์ของตัวเอง — จนกว่าจะถึงตอนนั้นจะแสดงเป็น "pending"', + entityVerifiedHint: 'การเป็นสมาชิกได้รับการยืนยันเป็นรายคน — ไม่มีใครถูกเพิ่มเข้า Crew ของคุณได้โดยไม่ยืนยันจากบัญชีของตัวเอง', + entityInvalidPubkey: 'ป้อน npub, nprofile หรือ hex pubkey 64 ตัวอักษรที่ถูกต้อง', + entityAlreadyAdded: 'สมาชิกคนนั้นถูกเพิ่มแล้ว', + offline: 'ออฟไลน์', + connected: 'เชื่อมต่อแล้ว', + offlineMode: 'โหมดออฟไลน์', + allFeaturesAvailable: 'ฟีเจอร์ทั้งหมดพร้อมใช้งาน', + browsingCachedSpots: 'กำลังเรียกดู Spot ที่แคชไว้', + queuedActions: 'การกระทำในคิว {{count}} รายการ', + syncing: 'กำลังซิงค์', + publishingWhenStable: 'จะเผยแพร่เมื่อการเชื่อมต่อเสถียร...', + willPublishOnline: 'จะถูกเผยแพร่เมื่อกลับมาออนไลน์', + availableOffline: 'ใช้ได้แบบออฟไลน์:', + offlineBrowseSpots: 'เรียกดู Spot ที่เคยดูไว้', + offlineViewDetails: 'ดูรายละเอียด Spot ที่แคชไว้', + offlineKeepActing: 'ทำต่อไปได้ — โพสต์ RSVP ประกาศขาย และข้อความจะถูกจัดคิวและส่งเมื่อคุณเชื่อมต่อใหม่', + }, + sasquatchGuide: { + homeTitle: 'ยินดีต้อนรับสู่ SkateSpots! 🦧', + homeMessage: 'โย่ ฉันคือ The Sasquatch ผู้ดูแลบอร์ด เส้นทาง และการขี่สุดเถื่อน ยินดีต้อนรับสู่โลกสเก็ตไร้กรอบบน Nostr — ไม่มีสูท ไม่มีโฆษณา มีแค่สเก็ตเตอร์ที่ carve เส้นทางของตัวเอง ที่นี่คุณเป็นเจ้าของทริคของคุณ ข้อมูลของคุณ และยังรับ Bitcoin จากการทิ้งร่องรอยไว้ด้วย เชื่อมต่อกับสเก็ตเตอร์ในย่านของคุณหรือทั่วโลก ไม่มีกฎนอกจาก shred ไม่มีรอยเท้านอกจากของคุณเอง', + homeQ1: 'วางแผน 3 วันในบาร์เซโลนาให้หน่อย', + homeQ2: 'หา Spot สำหรับมือใหม่', + homeQ3: 'มีอีเวนต์ upcoming ไหม?', + homeQ4: 'สถิติคอมมูนิตี้', + homeQ5: 'หาโค้ชใกล้ฉัน', + homeQ6: 'มีอุปกรณ์ขายไหม?', + homeQ7: 'Nostr คืออะไร?', + homeQ8: 'อันนี้ฟรีไหม?', + homeLearnMore: 'เรียนรู้เพิ่มเติม', + onboardingTitle: 'เริ่มต้นใช้งาน 🚀', + onboardingMessage: 'ให้ฉันช่วยอธิบายพื้นฐานนะ! Nostr คือตัวตนของคุณ Bitcoin Lightning ให้คุณรับ sats จากการมีส่วนร่วม และ Zap คือการให้ทิปแบบทันที ถามอะไรก็ได้เกี่ยวกับการเริ่มต้น!', + onboardingQ1: 'เข้าสู่ระบบอย่างไร?', + onboardingQ2: 'Nostr คืออะไร?', + onboardingQ3: 'Nostr ทำงานอย่างไร?', + onboardingQ4: 'Cashu คืออะไร?', + onboardingQ5: 'ใช้กระเป๋าเงิน Cashu อย่างไร?', + onboardingQ6: 'Mint คืออะไร?', + onboardingQ7: 'Zap คืออะไร?', + onboardingQ8: 'NWC คืออะไร?', + onboardingStart: 'เริ่มสำรวจ', + onboardingLogin: 'เข้าสู่ระบบเพื่อเริ่ม', + labTitle: 'ยินดีต้อนรับสู่ The Lab! 🎓', + labMessage: 'ที่นี่คือที่ที่เวทมนตร์เกิดขึ้น! หาโค้ชที่สอนคุณได้ทุกอย่างตั้งแต่ kickflip ถึง darkslide หรือเชื่อมต่อกับ Filmer เพื่อบันทึกเซสชันที่ดีที่สุดของคุณ กรองตามทักษะ ดูประสบการณ์ของพวกเขา และจองเซสชัน จำไว้นะ — ทุกคนเริ่มจากที่ใดที่หนึ่ง!', + labQ1: 'หาโค้ช', + labQ2: 'หา Filmer', + labQ3: 'หาช่างภาพ', + labQ4: 'หา Video Editor', + labQ5: 'หาช่างสร้างแรมป์', + labQ6: 'The Lab คืออะไร?', + labQ7: 'Builder คืออะไร?', + labQ8: 'จะเสนอรับสอนได้อย่างไร?', + labLogin: 'เข้าสู่ระบบเพื่อเสนอรับบริการ', + crewsTitle: 'Crew 🤘', + crewsMessage: 'Crew คือครอบครัวสเก็ตที่ผูกกับแผนที่ของคุณ — คนที่คุณเล่นสเก็ตด้วย ไม่ใช่คนที่คุณจ้าง ทุก Crew มีถิ่นฐานบนแผนที่ Spot ประจำถิ่น สมาชิก และคำประกาศ สมาชิกยืนยันด้วยคีย์ของตัวเอง ทำให้รายชื่อน่าเชื่อถือ เริ่ม Crew ของคุณเองหรือหาเพื่อนพวกของคุณ!', + crewsQ1: 'Crew คืออะไร?', + crewsQ2: 'จะเริ่ม Crew อย่างไร?', + crewsQ3: 'Crew ต่างจาก The Lab อย่างไร?', + crewsQ4: 'สมาชิกยืนยันอย่างไร?', + crewsQ5: 'Nostr คืออะไร?', + crewsQ6: 'Zap ทำงานอย่างไร?', + crewsLogin: 'เข้าสู่ระบบเพื่อสร้าง Crew', + }, + supportUi: { + keepMapFree: 'ทำให้แผนที่ฟรีต่อไป', + keepMapFreeDesc: 'ไม่มีโฆษณา ไม่มีการติดตาม ไม่มี VC sats ของคุณช่วยจ่ายค่าฮอสติ้ง โหนด AI และ Relay', + thankYou: 'ขอบคุณ! ⚡', + satsKeepMapFree: 'sats ของคุณทำให้แผนที่ฟรีต่อไป', + keptFreeNext: 'คุณเพิ่งทำให้ SkateSpots ฟรีต่อไปสำหรับสเก็ตเตอร์คนถัดไป', + scanToPay: 'สแกนเพื่อจ่าย', + zapSkateSpots: 'Zap SkateSpots', + payQuietly: 'จ่ายแบบเงียบ ๆ', + pickAmount: 'เลือกจำนวน', + enterAmount: 'ป้อนจำนวน sats ที่คุณต้องการส่ง', + couldNotStartPayment: 'ไม่สามารถเริ่มการชำระเงินได้', + customAmountAria: 'จำนวนกำหนดเองเป็น sats', + commentPlaceholder: 'พูดอะไรหน่อย (ไม่บังคับ — เฉพาะ Zap สาธารณะ)', + publicZapTitle: 'Zap สาธารณะพร้อมความคิดเห็นของคุณ', + loginToZapTitle: 'เข้าสู่ระบบเพื่อส่ง Zap สาธารณะ', + anonymousTitle: 'ไม่ระบุตัวตน — ไม่ต้องเข้าสู่ระบบ ไม่มีบันทึก', + copyLightningTitle: 'คัดลอก lightning address', + copiedSuffix: 'คัดลอก {{label}} แล้ว', + invoiceLabel: 'Invoice', + addressLabel: 'Address', + notAPurchase: 'เป็นการสนับสนุน ไม่ใช่การซื้อ — ไม่ได้อะไรตอบแทนและไม่มีการคืนเงิน สินค้าและ Sasquatch Pro แยกต่างหาก ตำแหน่งและตัวตนของคุณไม่เกี่ยวข้องกับการจ่ายแบบเงียบเลย', + }, + statusUi: { + quickStatus: 'สถานะด่วน', + skating: 'กำลังเล่นสเก็ต', + skatingDesc: 'กำลังเล่นสเก็ตอยู่', + filming: 'กำลังถ่าย', + filmingDesc: 'กำลังถ่ายทริค', + lookingForSesh: 'หาเซสชัน', + lookingForSeshDesc: 'อยากเล่นสเก็ตกับคนอื่น', + coaching: 'กำลังสอน', + coachingDesc: 'สอน/โค้ช', + chilling: 'ชิล', + chillingDesc: 'แฮงเอาต์อยู่ที่ Spot', + onMyWay: 'กำลังไป', + onMyWayDesc: 'มุ่งหน้าไป Spot', + takingABreak: 'พักเบรก', + takingABreakDesc: 'พัก/ดื่มน้ำ', + doneForToday: 'จบสำหรับวันนี้', + doneForTodayDesc: 'เล่นสเก็ตเสร็จแล้ว', + }, +}; + +export default thBatch14; diff --git a/src/i18n/th/index.ts b/src/i18n/th/index.ts index fc07acc..c30fe5f 100644 --- a/src/i18n/th/index.ts +++ b/src/i18n/th/index.ts @@ -11,6 +11,7 @@ import batch10 from './batch10'; import batch11 from './batch11'; import batch12 from './batch12'; import batch13 from './batch13'; +import batch14 from './batch14'; /** * Thai (ไทย) translations — composed from fragments so parallel translation @@ -34,6 +35,7 @@ const th = { ...batch11, ...batch12, ...batch13, + ...batch14, }; export default th;