SkateSpots/src/i18n/th/drift.ts
SkateSpots fe3d9bae22 ui(auth): compact, scroll-safe sign-in dialog
- Fix the real bug: the dialog clipped its bottom links (flex column + max-h
  calc(100dvh-2rem), content min-h-0 flex-1 overflow-y-auto).
- One dominant action per state: 'New here' is a compact row, not a second hero.
- Plain card labels (Browser extension / Signer app / Sign in with your phone)
  with tiny NIP-07/46/55 hints; protocol jargon out of the main labels.
- Bunker: input + Connect with instructions collapsed under 'Where do I get a
  bunker?'; no duplicate heading/divider.
- Secret key moved to a quiet bottom link; subtitle says 'or keep browsing'.
- 8px spacing grid (px-5 gutters, space-y-4 sections, gap-2 cards, p-2.5 cards,
  448px max width). New strings backfilled into all 20 locales.
Verified with headless 1280x900 + 390x844 screenshots.
2026-10-26 12:12:36 +07:00

325 lines
27 KiB
TypeScript

const driftStrings = {
nav: {
searchLanguages: 'ค้นหาภาษา...',
noLanguages: 'ไม่พบภาษา',
},
mapPage: {
searchSuggestPlaces: 'สถานที่',
},
mapUi: {
firstRunTitle: 'เริ่มต้น',
firstRunAddSpot: 'เพิ่ม spot แรกของคุณ',
firstRunJoinCrew: 'เข้าร่วม crew',
firstRunStartCrew: 'เริ่ม crew ของคุณ',
firstRunWallet: 'ตั้งกระเป๋าเงินของคุณ',
forecastDays: 'พยากรณ์ {{count}} วัน',
},
spotUi: {
forecastDays: 'พยากรณ์ {{count}} วัน',
},
marketUi: {
trades: {
stateRevoked: 'ถูกเพิกถอน',
stateVerifying: 'กำลังตรวจสอบ',
},
loadFailed: 'เชื่อมต่อ relay ไม่ได้ ตรวจสอบการเชื่อมต่อแล้วลองอีกครั้ง',
statusPending: 'รอดำเนินการ',
offers: {
closeDeal: 'ปิดดีล',
loadFailed: 'โหลดข้อเสนอไม่สำเร็จ ตรวจสอบการเชื่อมต่อแล้วลองอีกครั้ง',
},
pay: {
nonSats: 'ข้อเสนอนี้ตั้งราคาเป็น {{currency}} การชำระในแอปใช้ sats เท่านั้น กรุณาตกลงกับผู้ขายโดยตรง',
unsupported: 'รหัสชำระเงินนี้ (คำขอ Cashu) ยังไม่รองรับ ขอใบแจ้งหนี้ Lightning หรือที่อยู่จากผู้ขาย',
},
escrowRequest: {
lockedNotSent: 'เงินถูกล็อกใน escrow และบันทึกไว้ในอุปกรณ์นี้ แต่คำขอไม่ได้ถูกส่ง เปิดประกาศอีกครั้งเพื่อลองใหม่ อย่าจ่ายซ้ำ',
mintLabel: 'Mint (ที่ล็อกเงินไว้)',
sellerMintHint: 'ผู้ขายชอบ mint นี้ เงินที่ล็อกไว้ที่นี่เป็นสิ่งที่พวกเขาแลกได้ง่ายที่สุด',
mintHint: 'Escrow อยู่ที่ mint นี้ ผู้ขายแลกที่นี่ ดังนั้นเลือกอันที่คุณทั้งคู่ไว้ใจ',
noMints: 'ไม่มี mint ที่ใช้ได้',
p2pkUnsupported: 'mint นี้ไม่ประกาศรองรับ P2PK (NUT-11) จึงล็อก escrow ที่นี่ไม่ได้ เลือก mint อื่น',
},
},
labUi: {
offerClothing: 'เสนอเสื้อผ้า',
tabClothing: 'เสื้อผ้า',
empty: {
clothingTitle: 'ยังไม่มีดีไซเนอร์เสื้อผ้า',
clothingBody: 'เป็นคนแรกที่เสนอเสื้อผ้าคัสตอม ชุดทีม และแอปพาเรลให้ซีน',
},
craftFields: {
sizing: 'ช่วงไซซ์',
samples: 'ตัวอย่าง / ต้นแบบ',
customization: 'การปรับแต่ง',
},
},
socialUi: {
coordinator: {
ourDefaultTitle: 'Coordinator ของ SkateSpots',
ourDefaultDesc: 'SkateSpots รัน coordinator ที่ relay.skate-spots.org ใช้เป็นค่าเริ่มต้น หรือรันของคุณเอง — coordinator เห็นเพียงข้อความเข้ารหัสและ metadata ไม่เคยเห็นข้อความของคุณ',
useOurs: 'ใช้ coordinator ของ SkateSpots',
},
crewCoordinator: {
encryptedChat: 'แชทเข้ารหัส',
privateChatName: 'แชทส่วนตัว',
privateChatDesc: 'แชทกลุ่มแบบ forward-secret (MLS) ผ่าน coordinator',
privateChatDescFull: 'แชทส่วนตัวถูกสร้างครั้งเดียวโดยแอดมิน จากนั้นสมาชิกจึงเข้าร่วม',
chatRowDesc: 'ทุกคนใน crew — ถูกผนึกด้วยกุญแจของสมาชิกแต่ละคน (NIP-17)',
openChat: 'เปิด',
setUpChat: 'ตั้งค่า',
joinChat: 'เข้าร่วม',
checking: 'กำลังตรวจสอบ…',
openInAnotherApp: 'เปิดในแอปอื่น',
openInCordnWeb: 'Cordn (เว็บ)',
openCordnGroup: 'เปิดแชท crew',
copyForStaircase: 'คัดลอกสำหรับ Staircase',
},
dms: {
refresh: 'รีเฟรช',
crews: 'Crews',
crewFounder: 'ผู้ก่อตั้ง',
crewMember: 'สมาชิก',
crewOpen: 'เปิด',
crewSetUp: 'ตั้งค่า',
},
form: {
cordnGroup: 'กลุ่ม Cordn',
cordnGroupHint: 'ไม่บังคับ: วางลิงก์กลุ่มจาก Staircase หรือ Cordn เว็บ crew ของคุณจะได้แชท MLS เข้ารหัสต้นทาง-ปลายทางจริง โฮสต์บน coordinator ของเรา',
},
},
settingsUi: {
loginDialog: {
welcomeSubtitleBrowse: "สมัครหรือเข้าสู่ระบบ — หรือสำรวจต่อ",
extensionCard: "ส่วนขยายเบราว์เซอร์",
signerCard: "แอปเซ็นชื่อ",
secretKeyLink: "ใช้คีย์ลับแทน",
whereBunker: "หา bunker ได้ที่ไหน?",
},
settingsPage: {
trust: 'ความน่าเชื่อถือ',
trustSub: 'แหล่งที่มาและการแสดงผล',
},
},
walletUi: {
trust: {
mute: 'ปิดเสียง',
muted: 'ปิดเสียงแล้ว',
mutedDesc: 'คุณจะไม่เห็นเนื้อหาของพวกเขา',
muteFailed: 'ปิดเสียงไม่สำเร็จ ลองอีกครั้ง',
loginToMute: 'เข้าสู่ระบบเพื่อปิดเสียง',
attributedNetwork: 'จากคนในเครือข่ายของคุณ',
attributedProviderHouse: 'จากผู้ให้บริการความน่าเชื่อถือของชุมชน',
attributedProviderCustom: 'จากผู้ให้บริการที่คุณเลือก',
howItWorks: 'ความน่าเชื่อถือทำงานอย่างไร',
flaggedNoticeTitle: 'ถูกรายงานโดยนักสเก็ตที่เชื่อถือได้',
flaggedNoticeDesc: 'ระวัง คนที่เชื่อถือได้ในเครือข่ายรายงานบัญชีนี้',
flaggedReporterFollow: '{{count}} คนที่คุณติดตาม',
flaggedReporterNetwork: '{{count}} คนในเครือข่ายของคุณ',
flaggedReporterOther: '{{count}} บัญชีอื่น',
flaggedReport: 'รายงาน',
flaggedDismiss: 'ปิด',
bucketVerified: 'ยืนยันแล้ว',
bucketUnknown: 'ไม่ทราบ',
bucketFlagged: 'ถูกตั้งค่าสถานะ',
bucketVerifiedDesc: 'มีคนในเครือข่ายของคุณรับรองบัญชีนี้',
bucketUnknownDesc: 'ยังไม่มีใครในเครือข่ายของคุณรับรองบัญชีนี้',
bucketFlaggedDesc: 'คนที่เชื่อถือได้รายงานบัญชีนี้',
reportedByTrusted: 'ถูกรายงานโดยคนที่เชื่อถือได้ {{count}} คน',
},
},
trustUi: {
alertsTitle: 'การแจ้งเตือนเครือข่าย',
alertsDesc: 'บัญชีที่คุณติดตามซึ่งคนที่เชื่อถือได้รายงานหรือปิดเสียง',
alertsEmpty: 'ไม่มีการแจ้งเตือน เราตรวจสอบบัญชีที่คุณติดตามเพื่อหารายงานที่เชื่อถือได้',
alertsReported: 'ถูกรายงานโดยคนที่เชื่อถือได้ {{count}} คน',
alertsMuted: 'ถูกปิดเสียงโดยคนที่เชื่อถือได้ {{count}} คน',
alertsIgnore: 'ไม่สนใจ',
alertsUnfollow: 'เลิกติดตาม',
alertsLogin: 'เข้าสู่ระบบเพื่อดูการแจ้งเตือนสำหรับบัญชีที่คุณติดตาม',
providerTitle: 'ผู้ให้บริการ',
providerDesc: 'คะแนนมาจากผู้ให้บริการที่คุณเลือก ผู้ให้บริการของชุมชนเป็นค่าเริ่มต้น',
useCommunity: 'ใช้ผู้ให้บริการของชุมชน',
setProvider: 'ตั้งผู้ให้บริการ',
customPubkeyPlaceholder: 'npub หรือ hex pubkey ของผู้ให้บริการ',
customRelayPlaceholder: 'wss://relay.example.com',
invalidProvider: 'กรอก npub ที่ถูกต้องหรือ hex pubkey 64 ตัวอักษร และ Relay แบบ wss://',
publishFailed: 'เผยแพร่ผู้ให้บริการไม่สำเร็จ ลองอีกครั้ง',
providerSaved: 'อัปเดตผู้ให้บริการแล้ว',
loggedOutProvider: 'เข้าสู่ระบบเพื่อเลือกผู้ให้บริการ',
showMarks: 'แสดงเครื่องหมายความน่าเชื่อถือ',
showMarksDesc: 'เครื่องหมายยืนยันและไม่ทราบ รายงานจะแสดงเสมอ',
sourceLabel: 'แหล่งที่มา',
sourceHouse: 'ผู้ให้บริการความน่าเชื่อถือของชุมชน',
sourceCustom: 'ผู้ให้บริการของคุณ',
loggedOut: 'เข้าสู่ระบบเพื่อเลือกผู้ให้บริการความน่าเชื่อถือของคุณเอง',
seoTitle: 'ความน่าเชื่อถือทำงานอย่างไร',
seoDescription: 'SkateSpots แสดงความน่าเชื่อถืออย่างไร: สามสถานะ คะแนนมาจากไหน และทำไมการไม่มีจึงไม่ใช่การไม่ไว้ใจ',
title: 'ความน่าเชื่อถือทำงานอย่างไร',
intro: 'ความน่าเชื่อถือที่นี่เป็นสัญญาณ ไม่ใช่คำตัดสิน มันมาจากคนที่คุณรู้จัก หรือจากผู้ให้บริการที่คุณเลือก เราไม่ได้จัดอันดับผู้คนทั่วโลก',
statesTitle: 'สามสถานะ',
verifiedTitle: 'ยืนยันแล้ว',
verifiedDesc: 'มีคนในเครือข่ายของคุณรับรองบัญชีนี้: เพื่อนของเพื่อน หรือผู้ให้บริการที่คุณเลือก',
unknownTitle: 'ไม่ทราบ',
unknownDesc: 'ยังไม่มีใครรับรอง ทุกบัญชีใหม่เริ่มต้นที่นี่',
flaggedTitle: 'ถูกตั้งค่าสถานะ',
flaggedDesc: 'คนที่เชื่อถือได้รายงานบัญชีนี้ เป็นคำเตือนให้ดูใกล้ขึ้น ไม่ใช่หลักฐานของสิ่งใด',
absenceTitle: 'ไม่มีตราไม่ได้แปลว่าไม่ไว้ใจ',
absenceDesc: 'บัญชีส่วนใหญ่ไม่แสดงอะไรเลย นั่นหมายความว่ายังไม่มีใครในเครือข่ายของคุณรับรองพวกเขา ไม่ใช่มีอะไรผิดปกติ อย่าตีความเครื่องหมายที่หายไปเป็นแง่ลบ',
sourceTitle: 'ใครคำนวณ',
sourceDesc: 'โดยค่าเริ่มต้นเราใช้เครือข่ายของคุณเอง คุณยังเลือกผู้ให้บริการความน่าเชื่อถือที่เผยแพร่คะแนนแบบลงนามผ่าน Nostr (NIP-85) หรือปิดการแสดงผลได้ ถูกตั้งค่าสถานะจะแสดงเสมอ เพราะเป็นสัญญาณความปลอดภัย',
endorsementTitle: 'การปรากฏตัวไม่ใช่การรับรอง',
endorsementDesc: 'เครื่องหมายยืนยันหมายความว่ามีคนรับรอง ไม่ใช่ว่าคนนั้นดี เครื่องหมายหมายความว่าคนที่เชื่อถือได้รายงานพวกเขา ไม่ใช่ว่าพวกเขาผิด ตรวจสอบรายละเอียดก่อนตัดสินใจ',
povTitle: 'ขึ้นอยู่กับมุมมอง',
povDesc: 'คะแนนขึ้นอยู่กับว่าใครเป็นคนมอง อันดับจากผู้ให้บริการหนึ่งหรือคนหนึ่งเทียบกับอีกอันไม่ได้ และเราไม่เคยนำเสนอเป็นข้อเท็จจริงที่เป็นกลาง',
settingsCta: 'จัดการในการตั้งค่า',
},
marketTerms: {
link: 'แนวทางมาร์เก็ตเพลส',
seoTitle: 'แนวทางมาร์เก็ตเพลส',
seoDescription: 'ประกาศอุปกรณ์ SkateSpots ทำงานอย่างไร: แบบเพียร์ทูเพียร์ ผู้ซื้อระวังตัว และกฎต่าง ๆ',
title: 'แนวทางมาร์เก็ตเพลส',
intro: 'SkateSpots เป็นกระดานอุปกรณ์แบบเพียร์ทูเพียร์ คุณตกลงกับอีกฝ่ายโดยตรง: เราไม่ถือเงิน ไม่ส่งของ และไม่ระงับข้อพิพาท',
howTitle: 'ทำงานอย่างไร',
howBody: 'ลงประกาศอุปกรณ์ ติดต่อผู้ขายทางข้อความส่วนตัว และตกลงกันโดยตรง (เงินสด Lightning หรือแลกเปลี่ยน) ไม่มีตะกร้าหรือขั้นตอนชำระเงิน',
rulesTitle: 'สิ่งที่ไม่ได้รับอนุญาต',
rulesBody: 'ห้ามเนื้อหาผิดกฎหมาย อันตราย หรือสำหรับผู้ใหญ่ ห้ามยาเสพติด อาวุธ ของปลอมหรือของที่ถูกขโมย เก็บประกาศให้เกี่ยวกับอุปกรณ์สเก็ตและของที่เกี่ยวข้อง',
respectTitle: 'มีน้ำใจต่อกัน',
respectBody: 'ห้ามการล่วงละเมิด คุกคาม ข่มขู่ หรือความเกลียดชัง ผู้ดูแลสามารถซ่อนประกาศหรือบัญชีได้',
trustTitle: 'ความน่าเชื่อถือเป็นแนวทาง ไม่ใช่การรับประกัน',
trustBody: 'เครื่องหมายยืนยันและชื่อเสียงการค้าเป็นสัญญาณจากเครือข่าย ไม่ใช่คำสัญญา ตรวจสอบด้วยตัวเองก่อนซื้อขาย',
trustLink: 'ความน่าเชื่อถือทำงานอย่างไร',
privacyLink: 'อะไรออกจากอุปกรณ์ของคุณ',
safetyTitle: 'ซื้อขายอย่างปลอดภัย',
safetyBody: 'นัดเจอกันในที่สาธารณะสำหรับการส่งมอบ ใช้ escrow หรือเงินมัดจำด้วยความจริงใจสำหรับดีลที่ส่งของ และอย่าโอนเงินนอกแอปเด็ดขาด',
moderationTitle: 'การดูแลนุ่มนวลและย้อนกลับได้',
moderationBody: 'เนื้อหาที่ถูกซ่อนยังอยู่บน relay และกู้คืนได้ ข้อพิพาทระหว่างผู้คนเป็นเรื่องที่คุณต้องจัดการเอง',
},
labOptions: {
clothing: {
service: {
tees: 'เสื้อยืด',
hoodies: 'ฮู้ดดี้ & เสื้อสเวต',
pants: 'กางเกงขายาว & กางเกงขาสั้น',
jackets: 'แจ็คเก็ต & เสื้อคลุม',
kits: 'ชุดทีม & เจอร์ซีย์',
caps: 'หมวกแก๊ป & หมวกไหมพรม',
socks: 'ถุงเท้า',
accessories: 'กระเป๋า & เครื่องประดับ',
footwear: 'รองเท้า',
patches: 'อาร์มปะ & งานปะติด',
griptape: 'งานศิลป์ Griptape & เสื้อผ้า Deck',
onepiece: 'ชิ้นเดียว / อัปไซเคิล',
},
serviceDesc: {
tees: 'เสื้อยืดและเสื้อตัวบนคัสตอม',
hoodies: 'ฮู้ดดี้ เสื้อสเวต และกางเกงสเวต',
pants: 'กางเกงทำงาน กางเกงคาร์โก้ และกางเกงขาสั้น',
jackets: 'เสื้อโค้ช เสื้อเชลล์ และแจ็คเก็ตทำงาน',
kits: 'ชุดทีม เจอร์ซีย์ และเครื่องแบบ',
caps: 'หมวกแก๊ป หมวกไหมพรม และหมวกคลุมศีรษะ',
socks: 'ถุงเท้า crew และงานถัก',
accessories: 'กระเป๋า เข็มขัด และของชิ้นเล็ก',
footwear: 'รองเท้าคัสตอมและรองเท้าต่าง ๆ',
patches: 'อาร์มปักและงานปะติด',
griptape: 'งานศิลป์ Griptape และเสื้อผ้า Deck',
onepiece: 'ชิ้นเดี่ยวและเสื้อผ้าอัปไซเคิล',
},
method: {
screenprint: 'สกรีน',
dtg: 'DTG / พิมพ์ลงผ้าโดยตรง',
embroidery: 'งานปัก',
cutsew: 'ตัด & เย็บ',
sublimation: 'พิมพ์ซับลิเมชัน',
heattransfer: 'ถ่ายโอนความร้อน / ไวนิล',
garmentdye: 'ย้อมสำเร็จรูป',
knit: 'งานถัก',
patchwork: 'งานปะติด',
allover: 'พิมพ์ทั้งตัว',
},
material: {
cotton: 'คอตตอน',
heavyweight: 'ผ้าหนัก',
organic: 'ออร์แกนิก / ยั่งยืน',
fleece: 'ผ้าฟลีซ',
denim: 'เดนิม',
canvas: 'ผ้าแคนวาส',
nylon: 'ไนลอน / เทคนิคอล',
wool: 'เมอริโน / ขนสัตว์',
leather: 'หนัง',
recycled: 'รีไซเคิล / Deadstock',
},
},
},
becomeRolesUi: {
clothing: {
seoTitle: 'เป็นดีไซเนอร์เสื้อผ้า - SkateSpots',
seoDescription: 'เสื้อผ้าคัสตอม ชุดทีม & แอปพาเรลสำหรับซีน',
heading: 'ดีไซเนอร์เสื้อผ้า',
tagline: 'เสื้อผ้าคัสตอม ชุดทีม & แอปพาเรลสำหรับซีน',
noun: 'ดีไซเนอร์เสื้อผ้า',
rateLabel: 'ราคา',
portfolioLabel: 'ลิงก์ร้านค้า / พอร์ตโฟลิโอ',
sectionWhatYouMake: 'สิ่งที่คุณทำ',
sectionHowYouMake: 'คุณทำอย่างไร',
sectionMaterials: 'วัสดุ',
minimumPlaceholder: 'เช่น 10 ชิ้น',
turnaroundPlaceholder: 'เช่น 2-3 สัปดาห์',
sizingPlaceholder: 'เช่น XS-3XL / ตัดตามสั่ง',
samplesHelper: 'คุณมีตัวอย่างหรือต้นแบบก่อนผลิตเต็มจำนวนไหม?',
customizationPlaceholder: 'เช่น ชื่อ หมายเลข กราฟิก',
},
},
weatherUi: {
updated: 'อัปเดตแล้ว',
refresh: 'รีเฟรช',
unavailable: 'สภาพอากาศไม่พร้อมใช้งาน',
retry: 'ลองอีกครั้ง',
sunrise: 'พระอาทิตย์ขึ้น',
sunset: 'พระอาทิตย์ตก',
legendTitle: 'คะแนนสภาพอากาศ',
legendWeatherOnly: 'เฉพาะสภาพอากาศ',
},
cordnUi: {
shareInvite: 'เชิญ',
shareInviteText: 'เข้าร่วม {{crew}} — แชทส่วนตัวของ crew',
inviteCopied: 'คัดลอกลิงก์เชิญแล้ว',
title: 'แชทส่วนตัว',
subtitle: 'เข้ารหัสต้นทาง-ปลายทาง (MLS) ระหว่างสมาชิก crew coordinator เพียงส่งต่อข้อความเข้ารหัสและ metadata — ไม่เคยเห็นเนื้อหาข้อความ',
notLoggedIn: 'เข้าสู่ระบบเพื่อใช้แชทส่วนตัวของ crew',
membersOnly: 'เฉพาะสมาชิก crew เท่านั้นที่เปิดแชทส่วนตัวได้',
connecting: 'กำลังเชื่อมต่อ…',
noCoordinator: 'ยังไม่ได้ตั้งค่า coordinator สำหรับ crew นี้',
noGroupAdmin: 'แชทส่วนตัวของ crew นี้ยังไม่ถูกสร้าง',
noGroupMember: 'คุณยังไม่ได้อยู่ในแชทส่วนตัวของ crew นี้',
create: 'สร้างแชทส่วนตัว',
requestJoin: 'ขอเข้าร่วม',
checkInvite: 'ตรวจสอบคำเชิญ',
requested: 'ส่งคำขอแล้ว — แอดมิน crew จะอนุมัติ',
noInvite: 'ยังไม่มีคำเชิญที่รออยู่ ขอให้แอดมินอนุมัติคำขอของคุณ',
placeholder: 'ส่งข้อความถึง crew…',
send: 'ส่ง',
refresh: 'รีเฟรช',
requests: 'คำขอเข้าร่วม',
checkRequests: 'ตรวจสอบคำขอ',
approve: 'เพิ่ม',
noRequests: 'ไม่มีคำขอเข้าร่วมที่ค้างอยู่',
inviteHint: 'ในแชทนี้มีแค่คุณเท่านั้น — สมาชิก crew สามารถแตะ “ขอเข้าร่วม” แล้วคุณอนุมัติที่นี่',
memberCount: '{{count}} คนในกลุ่ม',
you: 'คุณ',
groupRef: 'ลิงก์กลุ่ม',
copyRef: 'คัดลอก',
copied: 'คัดลอกแล้ว',
attachImage: 'แนบรูปภาพ',
uploading: 'กำลังอัปโหลด…',
uploadFailed: 'อัปโหลดรูปภาพไม่สำเร็จ',
bannerTitle: 'crew นี้ยังไม่มีแชทส่วนตัว',
bannerBody: 'ตั้งค่าแชทเข้ารหัสต้นทาง-ปลายทาง (MLS) สำหรับ crew ของคุณ — สมาชิกเข้าร่วมจากแท็บ',
bannerCta: 'ตั้งค่า',
ready: 'เชื่อมต่อแล้ว · MLS',
errorPrefix: 'เชื่อมต่อ coordinator ไม่ได้',
interactiveHint: 'ตัวลงนามของคุณขออนุมัติทุกครั้งที่ทำรายการ — ใช้รีเฟรชและส่งตามต้องการ',
},
};
export default driftStrings;