SkateSpots/src/i18n/zh-TW/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

341 lines
15 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Traditional Chinese (繁體中文) — drift fragment: the keys added after the main batches.
*
* These were the last keys missing from this locale (nav search, the first-run
* checklist, marketplace states/escrow copy, the clothing craft, the trust UI,
* the marketplace guidelines, the weather legend and the native Cordn/MLS chat).
* The default export is the nested dictionary; `index.ts` deep-merges it over
* the composed batch fragments (a shallow spread would replace a whole namespace
* and drop its sibling keys).
*
* Skate/brand vocabulary stays English or transliterated (Spot, Park, Crew,
* Stash, The Lab, Nostr, Lightning, sats, Cashu, MLS, Cordn, Staircase), matching
* the other batches.
*/
type Dict = { [key: string]: string | Dict };
const drift: Dict = {
nav: {
searchLanguages: '搜尋語言…',
noLanguages: '找不到語言',
},
mapPage: {
searchSuggestPlaces: '地點',
},
mapUi: {
firstRunTitle: '開始使用',
firstRunAddSpot: '新增你的第一個滑板點',
firstRunJoinCrew: '加入一個 Crew',
firstRunStartCrew: '建立你的 Crew',
firstRunWallet: '設定你的錢包',
forecastDays: '{{count}} 天天氣預報',
},
spotUi: {
forecastDays: '{{count}} 天天氣預報',
},
marketUi: {
trades: {
stateRevoked: '已撤銷',
stateVerifying: '驗證中',
},
loadFailed: '無法連線中繼。請檢查你的網路連線並重試。',
statusPending: '待處理',
offers: {
closeDeal: '完成交易',
loadFailed: '無法載入報價。請檢查你的網路連線並重試。',
},
pay: {
nonSats: '此報價以 {{currency}} 計價。應用程式內付款僅支援 sats。請直接與賣家結算。',
unsupported: '此付款碼(Cashu 請求)尚不支援。請向賣家索取 Lightning 發票或地址。',
},
escrowRequest: {
lockedNotSent: '資金已鎖定在託管中並儲存在此裝置上,但請求未送出。重新開啟該商品以重試。請勿再次付款。',
mintLabel: 'Mint(資金鎖定處)',
sellerMintHint: '賣家偏好此 Mint;鎖在這裡的資金對他們最易領取。',
mintHint: '託管存放在此 Mint。賣家在此領取,因此請選擇雙方都信任的一個。',
noMints: '沒有可用的 Mint',
p2pkUnsupported: '此 Mint 未宣告支援 P2PK(NUT-11),因此無法在此鎖定託管。請選擇其他 Mint。',
},
},
labUi: {
offerClothing: '提供服飾',
tabClothing: '服飾',
empty: {
clothingTitle: '還沒有服飾設計師',
clothingBody: '成為第一個為這個圈子提供訂製服飾、團隊套裝和服裝的人。',
},
craftFields: {
sizing: '尺寸範圍',
samples: '樣品 / 打樣',
customization: '客製化',
},
},
socialUi: {
coordinator: {
ourDefaultTitle: 'SkateSpots 協調器',
ourDefaultDesc: 'SkateSpots 在 relay.skate-spots.org 運行一個協調器。預設使用它,或運行你自己的——協調器只能看到密文和中繼資料,永遠看不到你的訊息。',
useOurs: '使用 SkateSpots 協調器',
},
crewCoordinator: {
encryptedChat: '加密聊天',
privateChatName: '私密聊天',
privateChatDesc: '透過協調器的前向保密群組聊天(MLS)。',
privateChatDescFull: '私密聊天由管理員建立一次,然後成員加入。',
chatRowDesc: 'Crew 中的每個人——封存到每位成員的金鑰(NIP-17)。',
openChat: '開啟',
setUpChat: '設定',
joinChat: '加入',
checking: '檢查中…',
openInAnotherApp: '在其他應用程式中開啟',
openInCordnWeb: 'Cordn(網頁)',
openCordnGroup: '開啟 Crew 聊天',
copyForStaircase: '複製給 Staircase',
},
dms: {
refresh: '重新整理',
crews: 'Crew',
crewFounder: '創始人',
crewMember: '成員',
crewOpen: '開啟',
crewSetUp: '設定',
},
form: {
cordnGroup: 'Cordn 群組',
cordnGroupHint: '選填:貼上來自 Staircase 或 Cordn 網頁的群組連結。你的 Crew 隨後將獲得真正的端到端 MLS 聊天,託管在我們的協調器上。',
},
},
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 或十六進位 pubkey',
customRelayPlaceholder: 'wss://relay.example.com',
invalidProvider: '請輸入有效的 npub 或 64 位元十六進位 pubkey,以及一個 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: '當面交接請約在公共場所,郵寄交易請使用託管或誠意訂金,絕不要在應用程式外轉帳。',
moderationTitle: '管理是溫和且可逆的',
moderationBody: '被隱藏的內容仍留在中繼上,可以還原;人與人之間的糾紛由你們自己解決。',
},
labOptions: {
clothing: {
service: {
tees: 'T 恤',
hoodies: '連帽衫 & 衛衣',
pants: '長褲 & 短褲',
jackets: '外套 & 夾克',
kits: '隊服 & 球衣',
caps: '帽子 & 毛帽',
socks: '襪子',
accessories: '包袋 & 配件',
footwear: '鞋類 & 鞋子',
patches: '布章 & 貼花',
griptape: '砂紙 & 板身服飾',
onepiece: '獨一無二 / 升級再造',
},
serviceDesc: {
tees: '訂製 T 恤和上衣',
hoodies: '連帽衫、圓領衫和運動褲',
pants: '工作褲、工裝褲和短褲',
jackets: '教練外套、防風外套和工作外套',
kits: '隊服、球衣和制服',
caps: '帽子、毛帽和頭飾',
socks: '中筒襪和針織品',
accessories: '包袋、腰帶和小物',
footwear: '訂製鞋和鞋類',
patches: '刺繡布章和貼花',
griptape: '砂紙藝術和板身服飾',
onepiece: '單件和升級再造服裝',
},
method: {
screenprint: '網版印刷',
dtg: 'DTG / 數位直噴',
embroidery: '刺繡',
cutsew: '裁剪縫製',
sublimation: '熱昇華',
heattransfer: '熱轉印 / 燙畫',
garmentdye: '成衣染色',
knit: '針織',
patchwork: '拼布',
allover: '滿版印花',
},
material: {
cotton: '棉',
heavyweight: '重磅',
organic: '有機 / 永續',
fleece: '刷毛',
denim: '牛仔',
canvas: '帆布',
nylon: '尼龍 / 機能性',
wool: '美麗諾 / 羊毛',
leather: '皮革',
recycled: '再生 / 庫存布',
},
},
},
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}} — 團隊私密聊天',
inviteCopied: '邀請連結已複製',
title: '私密聊天',
subtitle: 'Crew 成員之間的端到端加密(MLS)。協調器只路由密文和中繼資料——它永遠看不到訊息內容。',
notLoggedIn: '登入以使用 Crew 的私密聊天。',
membersOnly: '只有 Crew 成員才能開啟私密聊天。',
connecting: '連線中…',
noCoordinator: '此 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: '為你的 Crew 設定端到端加密(MLS)聊天——成員從分頁加入。',
bannerCta: '設定',
ready: '已連線 · MLS',
errorPrefix: '無法連線協調器',
interactiveHint: '你的簽章器會為每個操作要求核准——視需要使用重新整理和傳送。',
},
};
export default drift;