diff --git a/src/components/LanguageToggle.tsx b/src/components/LanguageToggle.tsx index a7c089d..d6994e7 100644 --- a/src/components/LanguageToggle.tsx +++ b/src/components/LanguageToggle.tsx @@ -26,7 +26,7 @@ const languages: LanguageOption[] = [ { code: 'nl', name: 'Dutch', nativeName: 'Nederlands', flag: '🇳🇱' }, { code: 'pl', name: 'Polish', nativeName: 'Polski', flag: '🇵🇱' }, { code: 'ru', name: 'Russian', nativeName: 'Русский', flag: '🇷🇺' }, - { code: 'ko', name: 'Korean', nativeName: '한국어', flag: '🇰🇷' }, + { code: 'ko', name: 'Korean', nativeName: '한국어', flag: '🇰🇵' }, { code: 'th', name: 'Thai', nativeName: 'ไทย', flag: '🇹🇭' }, { code: 'ja', name: 'Japanese', nativeName: '日本語', flag: '🇯🇵' }, ]; diff --git a/src/i18n/ko/batch1.ts b/src/i18n/ko/batch1.ts index 21f4de4..a80bb82 100644 --- a/src/i18n/ko/batch1.ts +++ b/src/i18n/ko/batch1.ts @@ -1,4 +1,298 @@ -/** ko — batch 1. Filled by the translation pass; empty until then. */ -const koBatch1 = {}; +/** + * Korean (한국어) — batch 1: app shell + static pages. + * + * 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 a natural Korean loanword (Spot→스팟, Park→파크, Bowl→볼, Crew→크루, + * Deck→데크, Trucks→트럭, Wheels→휠, Bearings→베어링, Griptape→그립테이프, Stash, + * The Lab, Nostr, Lightning, Zap, Relay, sats), because Korean skaters use them. + */ +const koBatch1 = { + common: { + loading: '로딩 중...', + error: '오류', + save: '저장', + cancel: '취소', + delete: '삭제', + edit: '편집', + add: '추가', + remove: '제거', + create: '만들기', + submit: '제출', + close: '닫기', + back: '뒤로', + next: '다음', + done: '완료', + search: '검색', + filter: '필터', + sort: '정렬', + share: '공유', + more: '더보기', + copy: '복사', + copied: '복사됨!', + viewAll: '전체 보기', + seeMore: '더 보기', + showMore: '더 보기', + showLess: '접기', + noResults: '검색 결과가 없습니다', + tryAgain: '다시 시도', + learnMore: '자세히 알아보기', + getStarted: '시작하기', + yes: '예', + no: '아니요', + or: '또는', + and: '그리고', + free: '무료', + new: '신규', + popular: '인기', + featured: '추천', + verified: '인증됨', + sats: 'sats', + clear: '지우기', + clearFilters: '필터 지우기', + clearAll: '전체 지우기', + hide: '숨기기', + undo: '실행 취소', + }, + nav: { + home: '홈', + map: '스팟', + lab: 'The Lab', + events: '이벤트', + crews: '크루', + wallet: '지갑', + settings: '설정', + more: '더보기', + rewards: '리워드', + stats: '커뮤니티 통계', + about: '소개', + food: '음식', + marketplace: '마켓플레이스', + mints: '민트', + appShop: '앱 샵', + diy: 'DIY', + trades: '마켓플레이스', + stash: 'Stash', + collections: '컬렉션', + contacts: '연락처', + messages: '메시지', + skaters: '스케이터', + glossary: '용어집', + riderCard: '라이더 카드', + supporters: '서포터 ⚡', + newsletter: '뉴스레터', + viewProfile: '프로필 보기', + leaderboards: '리더보드', + }, + 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: '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: 'Vert', + indoor: '실내', + skatepark: '스케이트파크', + miniramp: '미니 램프', + }, + }, + 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: '바가 가득 찼습니다 — 하나를 빼고 바꾸세요', + moveUp: '{{name}} 위로 이동', + moveDown: '{{name}} 아래로 이동', + login: '로그인', + profile: '프로필', + reset: '재설정', + done: '완료', + }, + pwa: { + installTitle: 'SkateSpots 설치', + installSubtitle: '완전한 앱 경험을 만나보세요', + addToHomeScreen: '홈 화면에 추가', + installApp: '앱 설치', + maybeLater: '나중에', + gotIt: '확인!', + benefits: { + fast: '초고속', + offline: '오프라인에서도 작동', + fullAccess: '전체 접근', + }, + iosStep1: '공유 버튼을 탭하세요', + iosStep1Hint: 'Safari 하단에서', + iosStep2: '스크롤해서 “홈 화면에 추가”를 탭하세요', + iosStep2Hint: '공유 메뉴에서', + iosStep3: '“추가”를 탭해 설치하세요', + iosStep3Hint: '앱이 홈 화면에 나타납니다', + androidStep1: '메뉴 버튼을 탭하세요', + androidStep1Hint: '브라우저의 (점 세 개)', + androidStep2: '“홈 화면에 추가”를 선택하세요', + androidStep2Hint: '또는 “앱 설치”', + androidStep3: '설치를 확인하세요', + androidStep3Hint: '앱이 홈 화면에 나타납니다', + tagline: '무료 • 오프라인 작동 • 빠르고 안정적', + }, + home: { + tagline: '커뮤니티 기반 • 릴레이 기반', + title: 'SKATE SPOTS', + subtitle: '스팟 발견 • 만남 • 트릭 배우기 • 로컬 지원', + description: '진짜 스케이트보딩은 오프라인에서 일어납니다 — 이 도구가 그곳을 찾도록 도와줍니다.', + betaWarning: 'BETA - 공사 중 • 사용 시 주의하세요', + pwaHint: 'Progressive Web App - 기기에 설치하세요', + exploreMap: '지도 탐색', + addSpot: '스팟 추가', + globalSpots: '전 세계 스팟', + openCommunity: '오픈 커뮤니티', + lightningZaps: 'Lightning Zaps', + featuredSpots: '추천 스팟', + featuredSpotsDesc: '전 세계에서 커뮤니티가 인증한 스케이트 스팟', + upcomingEvents: '다가오는 이벤트', + upcomingEventsDesc: '곧 열리는 대회, 밋업, 세션', + noSpotsYet: '아직 발견된 스팟이 없습니다', + noSpotsHint: '첫 번째로 스케이트 스팟을 추가해 보세요!', + noEventsYet: '다가오는 이벤트가 없습니다', + noEventsHint: '나중에 다시 확인하거나 직접 만들어 보세요!', + theLab: 'The Lab', + theLabDesc: '트릭을 배우고, 코치를 찾고, 실력을 키우세요', + coaches: '코치', + coachesDesc: '성장을 도와줄 경험 많은 스케이터에게 배우세요', + filmers: '필머', + filmersDesc: '필머와 연결해 최고의 클립을 담으세요', + findCoach: '코치 찾기', + becomeCoach: '코치 되기', + findFilmer: '필머 찾기', + becomeFilmer: '필머 되기', + viewAllSpots: '모든 스팟 보기', + viewAllEvents: '모든 이벤트 보기', + createEvent: '이벤트 만들기', + readyToShare: '공유할 준비가 되셨나요?', + readyToShareDesc: '좋아하는 스팟을 추가해 스케이트보드 커뮤니티의 성장을 도우세요. 공유하는 모든 장소가 동료 스케이터가 새로운 곳을 발견하도록 돕습니다.', + }, + about: { + title: 'SkateSpots 소개', + subtitle: '탈중앙화 스케이트보드 커뮤니티', + whatIs: 'SkateSpots란?', + whatIsDesc: 'SkateSpots는 전 세계 스케이트보딩 장소를 발견하기 위한 커뮤니티 기반 플랫폼입니다. Nostr 위에 구축되어 스케이터에게 데이터에 대한 진정한 소유권을 부여합니다.', + features: '기능', + featuresDesc: '스팟 찾기, 이벤트 만들기, 코치와 연결, 지역 스케이트 숍 지원 — 모두 한곳에서.', + nostr: 'Nostr 기반', + nostrDesc: 'Nostr는 진정한 검열 저항 글로벌 커뮤니케이션을 가능하게 하는 단순하고 개방된 프로토콜입니다. 계정과 데이터는 당신의 것입니다.', + openSource: '오픈 소스', + openSourceDesc: 'SkateSpots는 완전한 오픈 소스입니다. 기여하고, 포크하고, 직접 인스턴스를 운영하세요.', + lightning: 'Lightning 결제', + lightningDesc: 'Bitcoin Lightning 결제로 좋아하는 스케이터, 코치, 크리에이터에게 Zap을 보내세요.', + }, + 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의 탈중앙화 특성상 삭제 요청은 전송되지만 일부 릴레이는 데이터를 보관할 수 있습니다.', + }, + onboarding: { + welcome: 'SkateSpots에 오신 것을 환영합니다!', + welcomeDesc: '몇 단계만 거치면 설정이 끝납니다.', + step1Title: '계정 만들기', + step1Desc: 'Nostr 키를 생성하고 있습니다. 직접 관리하는 비밀번호와 같습니다.', + step2Title: '키 백업하기', + step2Desc: '복구 문구를 안전한 곳에 저장하세요. 계정을 복구할 수 있는 유일한 방법입니다!', + step3Title: '프로필 설정하기', + step3Desc: '커뮤니티에 자신을 소개하세요.', + step4Title: '준비 완료!', + step4Desc: '스팟과 이벤트를 탐색하고 스케이터들과 연결을 시작하세요.', + skipForNow: '지금은 건너뛰기', + continueToApp: '앱으로 계속', + }, +}; export default koBatch1; diff --git a/src/i18n/ko/batch2.ts b/src/i18n/ko/batch2.ts index 947b948..8036098 100644 --- a/src/i18n/ko/batch2.ts +++ b/src/i18n/ko/batch2.ts @@ -1,4 +1,1657 @@ -/** ko — batch 2. Filled by the translation pass; empty until then. */ -const koBatch2 = {}; +/** + * Korean (한국어) — batch 2: map, spot, DIY, labels, fees, cards, routing and + * the Sasquatch assistant. Skate vocabulary uses loanwords (스팟, 파크, 볼, 크루, + * 데크, 릴레이, Zap) and Ledge/Rail/Stash/The Lab/Nostr/Lightning/sats/NIP-05 + * stay as-is. Trick names remain English. Placeholders/markdown/URLs preserved. + */ +const koBatch2 = { + mapUi: { + mapFooter: { + links: '링크', + hide: '지도 링크 바 숨기기', + }, + findingSpots: '스팟 찾는 중', + loadingSpots: '스팟 불러오는 중', + loadingMap: '지도 불러오는 중...', + mapViewAria: '지도 보기', + listViewAria: '목록 보기', + layers: '레이어', + mapLayers: '지도 레이어', + showOnMap: '지도에 표시', + showResults: '결과 표시', + quickActions: '빠른 작업', + spots: '스팟', + shops: '숍', + gear: '기어', + tours: '투어', + events: '이벤트', + crews: '크루', + spotType: '스팟 유형', + sortBy: '정렬 기준', + trustLevel: '신뢰 수준', + weather: '날씨', + buySellGear: '기어 사고팔기', + stash: 'Stash', + more: '더 보기', + newHere: '처음이세요?', + welcomeDesc: '스케이트 스팟, 이벤트와 커뮤니티를 발견하세요.', + getOnZapstore: 'Zapstore에서 받기', + dismiss: '닫기', + addedBy: '추가한 사람', + directions: '길찾기', + viewDetails: '상세 보기', + viewDetailsArrow: '상세 보기 →', + spotDetails: '스팟 상세', + skateShop: '스케이트 숍', + skateSpot: '스케이트 스팟', + youAreHere: '현재 위치', + conditions: '컨디션', + weatherScoreSuffix: '{{score}}/100 날씨', + wind: '바람', + humidity: '습도', + airQuality: '대기질', + threeDayForecast: '3일 예보', + gearForSale: '판매 중인 기어 ({{count}})', + viewItems: '상품 보기 →', + viewAllItems: '{{count}}개 상품 모두 보기 →', + viewGear: '기어 보기 →', + localTour: '로컬 투어', + meetAt: '만나는 곳: {{place}}', + hours: '{{count}}시간', + level: '{{level}} 레벨', + viewTour: '투어 보기 →', + upcomingEvent: '다가오는 이벤트', + viewEvent: '이벤트 보기 →', + skateCrew: '스케이트 크루', + members: '멤버 {{count}}명', + since: '{{year}}년부터', + viewCrew: '크루 보기 →', + acceptsBitcoin: '비트코인 결제 가능', + boosted: '부스트됨', + website: '웹사이트', + offlineSavedSpots: '오프라인 · 저장된 스팟 표시 중', + cantReachRelays: '릴레이에 연결할 수 없습니다', + relayOnlineNoAnswer: '온라인 상태이지만 커뮤니티 릴레이가 지금 응답하지 않습니다.', + youreOffline: '오프라인 상태입니다.', + savedOnDevice: '이미 본 스팟은 이 기기에 저장되어 여기에 표시됩니다.', + noSpotsMatchTitle: '일치하는 스팟 없음', + noSpotsMatchDesc: '다른 검색어를 입력하거나 필터를 해제해 보세요.', + noSpotsMappedYet: '아직 지도에 등록된 스팟이 없습니다', + noSpotsMappedDesc: '당신의 파크를 가장 먼저 지도에 올려보세요 — 1분이면 되고, 온전히 당신 것이며, 다음에 지나가는 스케이터가 고마워할 겁니다.', + addFirstSpot: '첫 스팟 추가하기', + findSpotsNearMe: '내 주변 스팟 찾기', + locating: '위치 확인 중…', + refiningLocation: '위치 정밀 조정 중…', + refiningLocationDesc: '마지막 스팟을 기준으로 — 새로운 GPS 좌표를 잡는 중입니다.', + locatingYou: '위치를 찾는 중…', + locatingDesc: 'GPS 좌표를 가져오는 중입니다. 처음에는 최대 1분까지 걸릴 수 있습니다.', + foundYou: '위치를 찾았습니다', + foundYouDesc: '지도를 현재 위치로 중앙 정렬했습니다.', + locationPermissionNeeded: '위치 권한 필요', + permissionNeededDesc: '기기 설정 → 앱 → SkateSpots → 권한에서 위치를 허용한 뒤 다시 내 주변을 눌러주세요.', + locationTimedOut: '위치 확인 시간 초과', + timeoutNativeDesc: '시간 안에 위치를 확인하지 못했습니다. 실내에 있다면 GPS가 위성을 볼 수 없으니 네트워크 위치(설정 → 위치)를 켜거나 밖으로 나간 뒤 다시 시도하세요.', + timeoutWebDesc: '시간 안에 위치를 가져오지 못했습니다. 신호를 확인하고 다시 시도하세요.', + noLocationProvider: '위치 제공자 없음', + noProviderNativeDesc: '휴대폰이 위치를 제공하지 않습니다. 프라이버시 중심 ROM(예: GrapheneOS)에서는 설정 → 위치에서 네트워크 위치를 켜거나, GPS가 켜져 있는지 확인하고 야외에서 시도하세요.', + noProviderWebDesc: '사용 가능한 위치 제공자가 없습니다. 위치 서비스를 켜고 다시 시도하세요.', + locationUnavailable: '위치 사용 불가', + unavailableNativeDesc: '휴대폰 설정에서 위치/GPS를 켜고, SkateSpots의 위치를 허용(설정 → 앱 → SkateSpots → 권한)한 뒤 다시 시도하세요.', + unavailableWebDesc: '위치를 확인할 수 없습니다. 위치 서비스가 켜져 있는지 확인하세요.', + locationBlocked: '위치 차단됨', + locationBlockedDesc: '브라우저가 이 사이트의 위치 접근을 차단했습니다. 다시 허용하는 방법:', + locationPlatformAndroid: 'Android Chrome', + locationPlatformIos: 'iOS Safari', + locationPlatformDesktop: '데스크톱 Chrome', + locationPlatformFirefox: 'Firefox', + locationStepsAndroid: '주소 표시줄의 자물쇠 아이콘 누르기 → 사이트 설정 → 위치 → 허용', + locationStepsIos: '설정 앱 → Safari → 위치 → 허용 (또는 Safari 주소 표시줄의 "AA" 버튼 누르기)', + locationStepsDesktop: '자물쇠 아이콘 누르기 → 사이트 설정 → 위치 → 허용', + locationStepsFirefox: '자물쇠 아이콘 누르기 → 연결 보안 → 추가 정보 → 권한 → 위치 접근 → 허용', + gotIt: '확인', + addSpot: '스팟 추가', + addShop: '숍 추가', + addEvent: '이벤트 추가', + addSpotHereTitle: '여기에 스팟을 추가할까요?', + addSpotHereDesc: '탭한 위치에 핀을 놓으세요', + sellGear: '기어 판매', + offerTour: '투어 제안', + closeAddMenu: '추가 메뉴 닫기', + addMenuAria: '스팟, 숍, 이벤트, 기어 또는 투어 추가', + localChat: '로컬 채팅', + localChatDesc: '지도 중심 어디든 이용하는 실시간 채팅. 채널이 닿는 범위를 선택하세요.', + btcMapShowing: 'Spedn할 수 있는 주변 장소 {{count}}곳을 표시 중', + btcMapShow: 'sats를 Spedn할 수 있는 장소 보기 (BTC Map 경유)', + yourPrivateStash: '나의 프라이빗 Stash', + stashIntro: '기어를 관리하고, 가격을 정하고, 다른 스케이터와 거래하세요.', + encryptionRequired: '암호화 필요', + encryptionRequiredDesc: 'NIP-44를 지원하는 서명자를 사용하세요 (Alby, nos2x, Amber).', + myStash: '내 Stash', + encrypted: '암호화됨', + itemsCount: '{{count}}개 아이템', + items: '아이템', + wishlist: '위시리스트', + types: '유형', + stashEmpty: 'Stash가 비어 있습니다', + addFirstItem: '첫 아이템 추가', + wishlistCount: '위시리스트 ({{count}})', + myGearCount: '내 기어 ({{count}})', + openFullStash: '전체 Stash 열기', + addItem: '아이템 추가', + searchSpotsPlaceholder: '스팟 검색...', + selected: '선택됨', + noSpotsFound: '스팟을 찾을 수 없습니다. 다른 검색어를 시도해 보세요.', + addingSpotsHint: '스팟을 추가하면 사용자가 특정 지역을 둘러볼 때 당신을 찾을 수 있습니다', + report: '신고', + spotSingular: '스팟 1개', + spotPlural: '스팟 {{count}}개', + view: '보기', + myCollections: '내 컬렉션', + collectionsSubtitle: '좋아하는 스팟을 나만의 목록으로 정리하세요', + newCollection: '새 컬렉션', + loginToCreate: '로그인하여 컬렉션 만들기', + loginToCreateDesc: '"2024 바르셀로나 여행"이나 "LA 최고의 Rail" 같은 나만의 목록에 좋아하는 스팟을 저장하세요', + noCollections: '아직 컬렉션이 없습니다', + noCollectionsDesc: '첫 컬렉션을 만들어 스팟을 정리해 보세요', + createFirstCollection: '첫 컬렉션 만들기', + createNewCollection: '새 컬렉션 만들기', + createCollectionDesc: '컬렉션에 이름과 선택 사항인 설명을 입력하세요', + collectionName: '컬렉션 이름', + collectionNamePlaceholder: '2024 바르셀로나 여행', + descriptionOptional: '설명 (선택 사항)', + descriptionPlaceholder: '바르셀로나 여행에서 좋았던 스팟...', + creating: '만드는 중...', + createCollection: '컬렉션 만들기', + editCollection: '컬렉션 편집', + saving: '저장 중...', + saveChanges: '변경 사항 저장', + deleteCollectionTitle: '컬렉션을 삭제할까요?', + deleteCollectionDesc: '"{{title}}"을(를) 영구히 삭제합니다. 스팟 자체는 영향을 받지 않습니다.', + deleting: '삭제 중...', + collectionCreated: '컬렉션이 만들어졌습니다!', + collectionCreatedDesc: '"{{title}}"에 스팟을 담을 준비가 됐습니다', + collectionCreateFailed: '컬렉션을 만들지 못했습니다', + collectionUpdated: '컬렉션이 업데이트되었습니다!', + changesSaved: '변경 사항이 저장되었습니다', + collectionUpdateFailed: '컬렉션을 업데이트하지 못했습니다', + collectionDeleted: '컬렉션이 삭제되었습니다', + collectionDeletedDesc: '"{{title}}"이(가) 제거되었습니다', + collectionDeleteFailed: '컬렉션을 삭제하지 못했습니다', + somethingWentWrong: '문제가 발생했습니다', + }, + mapPage: { + title: '숍 & 스팟', + spots: '스팟', + shops: '숍', + filters: '필터', + listView: '목록', + mapView: '지도', + nearMe: '내 주변', + searchPlaceholder: '스팟 검색...', + noSpotsInArea: '이 지역에 스팟이 없습니다', + zoomIn: '확대', + zoomOut: '축소', + myLocation: '내 위치', + locationsFound: '위치 {{count}}곳 발견', + spotsOnly: '스팟만', + shopsOnly: '숍만', + spotsAndShops: '스팟 & 숍', + noSpotsMatch: '필터에 맞는 스팟이 없습니다.', + noSpotsYet: '아직 추가된 스팟이 없습니다.', + addFirstSpot: '첫 스팟 추가', + }, + spotUi: { + claim: { + areYouOwner: '이 스팟이 당신 것인가요?', + privateDesc: '이 스팟은 비공개로 표시되어 있습니다. 소유자나 관리자라면 소유권을 주장하세요 — SkateSpots 중재자가 소유권을 확인한 뒤 목록을 넘겨받게 됩니다.', + claimSpot: '이 스팟 소유권 주장', + nip05Required: '비공개 스팟의 소유권을 주장하려면 인증된 NIP-05 핸들이 필요합니다 (Nostr 신원을 통제한다는 증명). 프로필에 추가한 뒤 다시 돌아오세요.', + addNip05: '설정에서 NIP-05 추가', + pendingTitle: '소유권 주장 검토 대기 중', + pendingDesc: '소유권 주장이 접수되었습니다. SkateSpots 중재자가 검토합니다 — 승인되면 스팟 소유권 주장을 마무리할 수 있습니다.', + approvedTitle: '소유권 주장 승인됨', + approvedDesc: '중재자가 소유권 주장을 승인했습니다. 마무리하면 이 스팟의 소유자가 됩니다.', + complete: '소유권 주장 마무리', + submitted: '소유권 주장 접수됨', + submittedDesc: '중재자가 소유권 주장을 검토합니다. 승인되면 스팟을 넘겨받게 됩니다.', + submitFailed: '소유권 주장을 접수하지 못했습니다', + submit: '소유권 주장 제출', + submitting: '제출 중…', + confirmTitle: '"{{title}}" 소유권을 주장할까요?', + confirmIntro: '이 비공개 스팟의 소유자가 되기를 요청하는 것입니다.', + confirmBullet1: 'SkateSpots 중재자가 요청을 검토합니다 (재산이 아니라 Nostr 키만 확인할 수 있습니다)', + confirmBullet2: '승인되면 소유권 주장을 마무리하여 소유자가 되고 스팟을 편집할 수 있습니다', + confirmBullet3: '원본 스팟은 Nostr에 남습니다 — 네트워크는 탈중앙화되어 있습니다', + adminTitle: '대기 중인 소유권 주장', + adminApprove: '승인', + adminApproved: '승인됨', + adminApprovedDesc: '이제 스팟 소유권 주장을 마무리할 수 있습니다.', + adminApproveFailed: '소유권 주장을 승인하지 못했습니다', + loginRequired: '이 비공개 스팟의 소유권을 주장하거나 소유권을 요청하려면 로그인하세요.', + }, + abandonedDesc: '마지막 업데이트 {{time}}. 원래 소유자가 비활성 상태라면 이 스팟의 소유권을 주장해 유지·개선할 수 있습니다.', + claimedNotice: '소유권 주장된 리스팅', + claimedNoticeDesc: '이 스팟은 소유권 주장 후 새 소유자가 다시 게시했습니다. 원본 리스팅은 별도로 남아 있을 수 있습니다.', + abandonedLoginDesc: '마지막 업데이트 {{time}}. 로그인하여 이 스팟의 소유권을 주장하고 유지하세요.', + accessDeniedDesc: '직접 만든 스팟만 편집할 수 있습니다.', + accessDeniedTitle: '접근 거부됨', + addAtLeastOneTag: '태그를 하나 이상 추가해 주세요.', + additionalDetails: '추가 정보 (선택 사항)', + additionalDetailsPlaceholder: '도움이 될 만한 추가 정보를 입력하세요...', + addNewTags: '새 태그 추가:', + addNip05InSettings: '설정에서 NIP-05 추가', + addPhoto: '사진 추가', + addPhotoDesc: '사진을 기여해 다른 사람들이 이 스팟을 발견하도록 도와주세요.', + addPhotoOrDescription: '사진 또는 설명 추가', + addPhotoOrDescriptionDesc: '스케이터에게 단서를 주세요 — 사진 한 장, 또는 장소에 대한 한 줄.', + addPhotos: '사진 추가', + addPhotoToSpot: '스팟에 사진 추가', + adminDeleteDialogDesc: 'SkateSpots 관리자로서 "{{title}}"을(를) 내리는 중입니다. 모든 사용자에게 앱 전체에서 숨겨지고 릴레이에 삭제 요청이 전송됩니다.', + adminDeleteReason: 'SkateSpots 관리자가 스팟 "{{title}}"을(를) 삭제함', + airQuality: '대기질', + altSkateSpot: '스케이트 스팟: {{title}}', + areYouShopOwner: '숍 사장님이신가요?', + askBeforeSkating: '스케이트 타기 전에 허락 구하기', + backToSpot: '스팟으로 돌아가기', + beFirstToListGear: '이 스팟에서 기어를 가장 먼저 등록해 보세요!', + beFirstToSay: '가장 먼저 인사를 건네보세요.', + byAuthor: '{{name}} 작성', + captionPlaceholder: '캡션 추가 (선택 사항) - 사진에 무엇이 있는지, 언제 찍었는지 등을 설명하세요.', + chatPublicNote: '누구나 읽을 수 있습니다 — 메시지는 공개·휘발성입니다. 비공개 채팅은 다이렉트 메시지를 이용하세요.', + checkPinBelow: '중복을 추가하기 전에 아래 핀을 확인하세요.', + claimBullet1: '소유자가 되어 스팟을 편집할 수 있습니다', + claimBullet2: '원본 스팟은 남습니다 (Nostr는 탈중앙화되어 있습니다)', + claimBullet3: '당신의 버전이 원본과 나란히 표시될 수 있습니다', + claimFailed: '소유권 주장 실패', + claiming: '소유권 주장 중...', + claimIntro: '이 스팟의 소유권을 주장하려 합니다. 편집·유지할 수 있는 자신만의 스팟 버전이 만들어집니다.', + claimSpot: '스팟 소유권 주장', + claimThisSpot: '이 스팟 소유권 주장', + claimTitle: '"{{title}}" 소유권을 주장할까요?', + claimWhatHappens: '소유권을 주장하면:', + coachesAndFilmersAvailable: '이 스팟에서 이용 가능한 코치와 필머', + coachesCount: '코치 ({{count}})', + coachHere: '여기서 코칭', + community: '커뮤니티', + communityVerified: '커뮤니티 인증됨', + communityVerifiedTitle: '다른 스케이터가 여기에 기여했습니다 (사진 또는 상태 신고).', + conditions: '컨디션', + contactForPermission: '허락 문의', + contactInfo: '연락처 정보', + contributePhoto: '사진 기여', + contributing: '기여 중...', + couldNotSendMessage: '메시지를 보내지 못했습니다.', + couldNotSubmit: '제출하지 못했습니다', + couldNotUploadPhoto: '사진을 업로드하지 못했습니다. 아래에서 추가할 수 있습니다.', + crewsThatSkateHere: '여기서 타는 크루', + current: '현재:', + currentTags: '이 스팟의 현재 태그:', + daysAgo: '{{count}}일 전', + daysAgoPlural: '{{count}}일 전', + deleteDialogDesc: '모든 릴레이에서 "{{title}}"을(를) 영구히 삭제합니다. 이 작업은 되돌릴 수 없습니다.', + deletedSpotReason: '삭제된 스팟', + deleteFailed: '삭제 실패', + deleteSpot: '스팟 삭제', + deleteSpotTitle: '스팟을 삭제할까요?', + differentSpotPublishAnyway: '다른 스팟입니다 — 그래도 게시', + dragDropOrClick: '드래그 앤 드롭 또는 클릭', + dropPhotos: '사진을 놓으세요', + duplicateOne: '핀 60m 이내에 스팟이 있습니다. 같은 장소라면 중복을 만들지 말고 거기에 사진이나 상태 신고를 추가하세요.', + duplicateOther: '핀 60m 이내에 여러 스팟이 있습니다. 같은 장소라면 중복을 만들지 말고 거기에 사진이나 상태 신고를 추가하세요.', + editSpotSeoDesc: '당신의 스케이트보드 스팟을 편집하세요.', + failedToContribute: '기여하지 못했습니다', + failedToPublish: '게시하지 못했습니다', + failedToPublishDesc: '문제가 발생했습니다. 자세한 내용은 콘솔을 확인하세요.', + failedToSubmitReport: '신고를 제출하지 못했습니다', + failedToSuggestTags: '태그를 제안하지 못했습니다', + failedToUpdate: '업데이트하지 못했습니다', + failedToUploadImage: '이미지를 업로드하지 못했습니다', + failedToUploadPhoto: '사진을 업로드하지 못했습니다', + feelsLikeTemp: '체감 {{temp}}°C', + filmersCount: '필머 ({{count}})', + filmHere: '여기서 촬영', + gearSwap: '기어 스왑', + geolocationNotSupported: '위치 정보를 지원하지 않음', + geolocationNotSupportedDesc: '브라우저가 위치 정보를 지원하지 않습니다.', + getDirections: '길찾기', + hangTight: '잠시만요', + hangTightDesc: '사진이 아직 업로드 중입니다. 곧 첨부됩니다.', + helpImproveSpot: '사진을 추가하거나 태그를 제안해 이 스팟 개선을 도와주세요', + hiddenByModerator: '중재자에 의해 숨겨짐', + hiddenByModeratorDesc: '이 스팟은 지도나 검색에 표시되지 않습니다. 당신의 것이기 때문에 계속 볼 수 있습니다. 편집해도 숨김이 해제되지 않으며, 중재자가 판정을 철회할 때까지 숨겨진 상태로 남습니다.', + humidity: '습도', + imageUploaded: '이미지 업로드됨', + imageUploadedDesc: '이미지가 성공적으로 업로드되었습니다.', + imHere: '여기 있어요', + invalidCoordinates: '잘못된 좌표', + invalidCoordinatesDesc: '유효한 위도(-90~90)와 경도(-180~180)를 입력하세요.', + invalidNpub: '잘못된 npub', + invalidNpubDesc: '유효한 npub 주소를 입력하세요.', + lastReported: '마지막 {{time}}', + listGear: '기어 등록', + listYourGearHere: '여기에 기어 등록', + loadingChat: '채팅 불러오는 중…', + locationError: '위치 오류', + locationFound: '위치 확인됨', + locationFoundDesc: '현재 위치가 설정되었습니다.', + locationRequired: '위치 필요', + locationRequiredDesc: '좌표를 입력하거나 현재 위치를 사용하세요.', + loginRequiredTitle: '로그인 필요', + logInToChat: '로컬 채팅에 참여하려면 로그인하세요.', + logInToContributePhotos: '사진을 기여하려면 로그인하세요', + loginToEditSpot: '이 스팟을 편집하려면 로그인해야 합니다.', + logInToReport: '콘텐츠를 신고하려면 로그인해야 합니다.', + logInToReportStatus: '이 스팟의 상태를 신고하려면 로그인하세요.', + logInToSuggestTags: '태그를 제안하려면 로그인하세요', + manageNip05ToClaim: '소유권 주장하려면 NIP-05 관리', + meetAtSpotForPickup: '💡 안전한 픽업을 위해 이 스팟에서 만나세요', + memberOne: '멤버 {{count}}명', + memberOther: '멤버 {{count}}명', + messageFailed: '메시지 실패', + messageMapper: '매퍼에게 메시지', + messagePlaceholder: '이 스팟에 메시지… (/me 또는 /who 시도)', + messagesHiddenOne: '신뢰 필터로 메시지 {{count}}개가 숨겨졌습니다. 필터를 낮춰 더 보세요.', + messagesHiddenOther: '신뢰 필터로 메시지 {{count}}개가 숨겨졌습니다. 필터를 낮춰 더 보세요.', + messagesHiddenShortOne: '신뢰 필터로 메시지 {{count}}개 숨김', + messagesHiddenShortOther: '신뢰 필터로 메시지 {{count}}개 숨김', + metresAway: '{{distance}}m 거리', + moderatorVouchedDesc: '중재자가 이 스팟을 검토하고 보증했습니다. 좋습니다.', + monthsAgo: '{{count}}개월 전', + monthsAgoPlural: '{{count}}개월 전', + newOwnerNpub: '새 소유자의 npub', + newOwnerNpubHint: '이 스팟을 이전할 사용자의 npub을 입력하세요.', + nip05RequiredToClaim: '⚠️ 숍 소유권을 주장하려면 NIP-05 인증이 필요합니다', + noCommunitySignalTitle: '아직 커뮤니티 사진이나 상태 신고가 없습니다 — 아무도 이 장소를 확인하지 않았습니다.', + breakdownPhotos: '사진 {{count}}장', + breakdownStatus: '상태 신고 {{count}}건', + breakdownComments: '댓글 {{count}}개', + breakdownReactions: '반응 {{count}}개', + breakdownCollections: '저장 {{count}}회', + breakdownZaps: 'Zap {{count}}개', + breakdownTags: '태그 제안 {{count}}개', + breakdownCrews: '크루 {{count}}개', + breakdownLab: '프로 링크 {{count}}개', + verifyNudgeTitle: '이 스팟을 가장 먼저 확인해 주세요', + verifyNudgeBody: '사진 한 장 또는 "여기서 탔어요"가 스팟을 인증하는 방법입니다 — 다음 스케이터를 도와주세요.', + verifyNudgeStatus: '여기서 탔어요', + communityChip: '커뮤니티', + seenChip: '목격됨', + noGearListedYet: '아직 등록된 기어가 없습니다', + noMessagesYet: '이 로컬 채널에 아직 메시지가 없습니다. 인사를 건네보세요 — "오늘 밤 타는 사람?"', + noPhoto: '사진 없음', + noReportsYet: '아직 신고가 없습니다', + noTags: '태그 없음', + notASkateSpot: '스케이트 스팟 아님', + offerServicesHere: '💡 이 스팟에서 서비스를 제공하세요', + photoCaptured: '사진 촬영됨!', + photoCapturedDesc: '사진이 성공적으로 업로드되었습니다.', + photoContributed: '사진 기여됨!', + photoContributedDesc: '사진이 이 스팟에 추가되었습니다.', + photosAdded: '사진이 추가되었습니다.', + photosRecommended: '강력 권장 — 사진 없는 스팟은 미인증으로 표시됩니다', + photosUploaded: '사진 {{count}}장 업로드됨', + photoUploaded: '사진 업로드됨', + photoUploadedDesc: '캡션을 추가하고 제출하면 기여됩니다!', + photoUploadFailed: '사진 업로드 실패', + pleaseTryAgain: '다시 시도해 주세요', + public: '공개', + publicChatTitle: '누구나 이 채널의 메시지를 읽을 수 있습니다 — 공개이며 암호화되지 않습니다.', + recentReports: '최근 신고', + recipientRequired: '수신자 필요', + recipientRequiredDesc: '새 소유자의 npub을 입력하세요.', + removeAdmin: '제거 (관리자)', + removeSpot: '스팟 제거', + removeSpotAdminTitle: '이 스팟을 제거할까요? (관리자)', + reportOne: '신고', + reportContent: '콘텐츠 신고', + reportContentDesc: '부적절한 콘텐츠를 신고해 커뮤니티를 안전하게 지켜주세요.', + reportedBySkaters: ' 스케이터 {{count}}명이 신고 — 검토 중. 실제 스팟이라면 사진이나 상태 신고를 추가해 확인해 주세요.', + reportedNotASpot: '스케이트 스팟이 아니라고 신고됨', + reportingType: '{{type}} 신고 중', + reports: '신고', + reportShop: '숍 신고', + reportSpot: '스팟 신고', + reportStatus: '상태 신고', + reportSubmitted: '신고가 접수되었습니다', + reportSubmittedDesc: 'SkateSpots를 안전하게 지켜주셔서 감사합니다.', + reportSubmittedLong: 'SkateSpots를 안전하고 정확하게 유지해 주셔서 감사합니다. 신고는 신뢰할 수 있는 커뮤니티 멤버가 검토합니다.', + reportSubmittedTitle: '신고 접수됨', + report: { + notASkateSpot: { + label: '스케이트 스팟 아님', + description: '테스트 항목이거나 전혀 스케이트를 타기 위한 장소가 아님', + }, + fakeSpot: { + label: '가짜/존재하지 않는 스팟', + description: '이 스팟은 존재하지 않거나 위치가 잘못됨', + }, + stolenPhotos: { + label: '도용/가짜 사진', + description: '사진이 스톡 이미지이거나 다른 곳에서 도용됨', + }, + spamAd: { + label: '스팸 또는 광고', + description: '홍보 콘텐츠 또는 중복 리스팅', + }, + dangerousLocation: { + label: '위험한 장소', + description: '사유지, 안전하지 않거나 접근 불법', + }, + inappropriateContent: { + label: '부적절한 콘텐츠', + description: '불쾌하거나 성인 콘텐츠 포함', + }, + impersonation: { + label: '사칭', + description: '다른 사람인 척하는 사람', + }, + other: { + label: '기타', + description: '위에 없는 다른 사항', + }, + }, + targetType: { + spot: '스팟', + event: '이벤트', + tour: '투어', + shop: '숍', + user: '사용자', + listing: '리스팅', + coach: '코치', + filmer: '필머', + }, + sameOwner: '동일한 소유자', + sameOwnerDesc: '현재 소유자에게 이전할 수 없습니다.', + saveChanges: '변경 사항 저장', + saving: '저장 중...', + services: '서비스', + shareSpotText: '이 스케이트 스팟을 확인해 보세요: {{title}}', + shelter: '대피소', + shelterHint: '이 스팟이 날씨에 노출되어 있나요? 비 올 때 스케이터가 마른 스팟을 찾는 데 도움이 됩니다.', + shopClaimDesc: '이 숍을 소유하거나 관리한다면 소유권을 주장해 인증하고 리스팅을 관리할 수 있습니다.', + shopClaimNip05Hint: '이 숍의 소유권을 주장하려면 숍 웹사이트 도메인과 일치하는 NIP-05 식별자를 추가하세요.', + skatersActiveDesc: '지난 24시간 동안 이 채널에 글을 올린 사람.', + skatersActiveOne: '활동 중인 스케이터 {{count}}명', + skatersActiveOther: '활동 중인 스케이터 {{count}}명', + skatersSellingGear: '이 스팟의 스케이터들이 기어를 판매 중입니다', + skateSpot: '스케이트 스팟', + somethingWentWrong: '문제가 발생했습니다', + spot: '스팟', + spotAdded: '스팟이 추가되었습니다!', + spotAddedDesc: '당신의 스케이트 스팟이 네트워크에 게시되었습니다.', + spotAddedNoPhoto: '게시됨 — 누군가 사진을 추가할 때까지 미인증으로 표시됩니다. 스팟 사진이 큰 도움이 됩니다.', + spotChat: '스팟 채팅', + spotClaimed: '스팟 소유권을 주장했습니다!', + spotClaimedDesc: '이제 이 스팟의 소유자입니다. 프로필에서 편집할 수 있습니다.', + spotDeleted: '스팟 삭제됨', + spotDeletedDesc: '릴레이에 삭제 요청이 전송되었습니다. 대부분의 릴레이가 이 콘텐츠를 제거합니다.', + spotMayAlreadyBeOnMap: '그 스팟은 이미 지도에 있을 수 있습니다', + spotMayAlreadyExist: '이 스팟은 이미 존재할 수 있습니다', + spotMayBeAbandoned: '버려진 스팟일 수 있습니다', + spotPhotoAlt: '스팟', + spotRemoved: '스팟 제거됨', + spotRemovedDesc: '이 스팟은 내려갔으며 SkateSpots 전체에서 숨겨집니다.', + spotSeoDesc: 'SkateSpots에서 이 스케이트보드 스팟을 확인하세요.', + spotStatus: '스팟 상태', + spotStatusDesc: '"{{title}}"이(가) 아직 탈 수 있나요? 커뮤니티에 현재 상태를 알려주세요.', + spotTypeRequired: '스팟 유형 필요', + spotTypeRequiredDesc: '스케이터가 어떤 곳으로 향하는지 알 수 있도록 스팟 유형을 선택하세요.', + spotUpdated: '스팟 업데이트됨!', + spotUpdatedDesc: '변경 사항이 네트워크에 게시되었습니다.', + staffVerifiedTitle: 'SkateSpots 관리자가 이 스팟을 검토하고 보증했습니다.', + statusNotePlaceholder: '선택 사항: 세부 정보 추가 (예: "Ledge에 새 노브", "오후 6시 이후 경비원 퇴거")', + statusReported: '상태 신고됨', + statusReportedDesc: '지도를 최신으로 유지해 주셔서 감사합니다. 신고가 반영되었습니다.', + submitReport: '신고 제출', + submitting: '제출 중...', + suggestedByUser: '사용자 {{count}}명이 제안', + suggestedByUsers: '사용자 {{count}}명이 제안', + suggestedTagsContent: '{{title}}에 제안된 태그: {{tags}}', + suggestNTags: '태그 {{count}}개 제안', + suggestOneTag: '태그 1개 제안', + suggestTags: '태그 제안', + suggestTagsDesc: '관련 태그를 제안해 이 스팟 분류를 도와주세요.', + tags: '태그', + tagsHint: '특징, 표면, 분위기 태그 추가 (최대 {{max}})', + tagsSuggested: '태그가 제안되었습니다!', + tagsSuggestedDesc: '태그 제안이 제출되었습니다.', + takePhoto: '사진 찍기', + threeDayForecast: '3일 예보', + tipTheMapper: '매퍼에게 팁', + tipTheMapperDesc: '이 스팟이 유용했나요? 매퍼에게 감사의 Zap을 보내세요!', + titleRequired: '제목 필요', + titleRequiredDesc: '이 스팟의 이름을 입력하세요.', + today: '오늘', + tomorrow: '내일', + transferDesc: '"{{title}}"을(를) 다른 사용자에게 이전합니다. 이 작업은 되돌릴 수 없습니다.', + transferFailed: '이전 실패', + transferOwnership: '소유권 이전', + transferRequestContent: '스팟 "{{title}}" 소유권 이전 요청', + transferRequested: '이전 요청됨', + transferRequestedDesc: '새 소유자가 스팟 소유권을 주장해야 이전이 완료됩니다.', + transferring: '이전 중...', + transferSpotOwnership: '스팟 소유권 이전', + transferWarningDesc: '이전 후에는 이 스팟을 편집하거나 삭제할 수 없습니다.', + typeToSearchTags: '입력해 태그 검색 또는 추가...', + underReview: ' — 검토 중. 실제 스팟이라면 사진이나 상태 신고를 추가해 확인해 주세요.', + untitledSpot: '제목 없는 스팟', + unverified: '미인증', + updateDetailsFor: '{{title}}의 세부 정보 업데이트', + updateSpotDesc: '이 스팟의 정보를 업데이트하세요. * 표시된 모든 항목은 필수입니다.', + uploadAPhoto: '사진 업로드', + uploadAPhotoHint: '드래그 앤 드롭 또는 클릭 · JPG, PNG, WebP', + uploadedAlt: '업로드됨', + uploadFailed: '업로드 실패', + uploadingPhoto: '사진 업로드 중…', + uploadPhotoFirst: '먼저 사진을 업로드해 주세요.', + uvIndex: '자외선 지수', + verifiedBySkateSpots: 'SkateSpots 인증됨', + viewPhotoFullScreen: '사진 전체 화면으로 보기', + viewPhotoOf: '사진 {{n}} / {{total}} 보기', + warning: '경고', + weatherConditions: '날씨 상태', + weatherOnly: '날씨만', + weatherOnlyUnconfirmed: '날씨만. 아직 아무도 스케이트 스팟이라고 확인하지 않아 컨디션 점수가 없습니다 — 사진이나 상태 신고를 추가해 확인해 주세요.', + whyReporting: '무엇 때문에 신고하나요?', + wind: '바람', + yearsAgo: '{{count}}년 전', + yearsAgoPlural: '{{count}}년 전', + }, + diyUi: { + title: 'DIY — 직접 만들기', + tagline: '직접 데크, 램프, 콘크리트 스팟을 만들기 위한 가이드, 오픈 도구, 도면 — 그리고 함께할 사람, 장소, 마켓까지.', + doItWithPeople: '사람들과 함께 하기', + backToDiy: 'DIY로 돌아가기', + calc: { + title: '데크 원가 계산기', + intro: '데크를 만드는 데 드는 비용 — 인건비, 장비, 재료, 공정 시간, 포장, 마진 — 과 공정한 판매가. 이 기기에 저장됩니다.', + }, + designer: { + title: '데크 디자이너', + intro: '스케이트보드나 롱보드 외곽을 설계하고, 1:1 인쇄 템플릿, SVG, CNC용 DXF로 내보내세요. 이 기기에 저장됩니다.', + presets: '프리셋', + dimensions: '치수', + shape: '형태', + kicks: '킥', + hardware: '트럭 홀', + width: '최대 너비', + wheelbase: '휠베이스', + nose: '노즈 길이', + tail: '테일 길이', + length: '총 길이', + waist: '웨이스트', + endRound: '끝단 둥글기', + concave: '콘케이브', + thickness: '두께', + tailKick: '테일 킥', + noseKick: '노즈 킥', + holeNew: '뉴 스쿨 (2.125″)', + holeOld: '올드 스쿨 (2.5″)', + holeSpacing: '뉴 스쿨은 2.125″ × 1.625″ (54 × 41 mm), 올드 스쿨은 2.5″ × 1.625″입니다. 3/16″ 장착 홀.', + topView: '평면도', + sideView: '측면 프로필', + concaveSection: '콘케이브 단면', + export: '내보내기', + pdfA4: '1:1 PDF · A4', + pdfLetter: '1:1 PDF · Letter', + printNote: 'PDF를 100%로 인쇄하고("페이지에 맞춤" 끄기), 모서리 십자 표시를 맞춰 타일을 이어 붙이세요. SVG도 실제 크기입니다.', + note: '이것은 따라 그려 자르는 2D 외곽선입니다. 완전한 3D 형상과 몰드 설계에는 여전히 전문 CAD 도구가 적합합니다.', + }, + source: '출처', + comingSoon: '곧 제공', + footer: '단계별 가이드가 준비 중입니다. 그동안: The Lab에서 만드는 사람들을 찾고, 스팟을 지도에 올리고, 마켓플레이스에서 사고파세요. 안전하게 — 패드, 장갑, 보안경을 착용하세요.', + categories: { + boards: '데크', + ramps: '램프 & 목재 장애물', + concrete: '콘크리트 & DIY 스팟', + repairs: '수리 & 튜닝', + tools: '도구 & 도면', + }, + cards: { + ossBuild: { + title: '스케이트보드 만들기', + blurb: '단계별 데크 제작 — 베니어, 몰드, 프레스, 마감.', + }, + sk8cad: { + title: 'SK8CAD', + blurb: '데크 형상, 콘케이브, 몰드 설계를 위한 오픈소스 CAD.', + }, + deckCost: { + title: '데크 원가 & 가격', + blurb: '만들기 전에 재료, 인건비, 공정한 판매가를 계산하세요.', + }, + deckDesigner: { + title: '데크 디자이너', + blurb: '외곽을 설계하고 1:1 템플릿을 인쇄하거나 — CNC용 SVG/DXF로 내보내세요.', + }, + ledgeBox: { + title: 'Ledge 또는 박스 만들기', + blurb: '주말에 만들 수 있는 초보자 친화적 목재 장애물.', + }, + quarterpipe: { + title: '쿼터파이프 만들기', + blurb: '뒷마당 미니를 위한 램프 도면, 트랜지션, 코핑.', + }, + flatbar: { + title: '플랫바 만들기', + blurb: '저렴하고 휴대가 간편하며 Rail을 배우는 최고의 방법.', + }, + concreteBasics: { + title: '콘크리트 기초', + blurb: '오래가는 Ledge나 뱅크를 위한 배합, 거푸집, 마감.', + }, + coping: { + title: '코핑 & 엣지', + blurb: '매끄러운 그라인드를 위한 코핑 설치와 트랜지션 마감 방법.', + }, + buyParts: { + title: '부품 & 기어 구매', + blurb: '마켓플레이스의 판매자에게서 데크, 하드웨어, 도구를 구매하세요.', + }, + mapSpot: { + title: 'DIY 스팟 지도에 등록', + blurb: '무언가 만들었나요? 다른 사람이 찾아 탈 수 있도록 지도에 추가하세요.', + }, + regrip: { + title: '보드 리그립', + blurb: '낡은 그립을 떼고 새 그립을 깔끔하게 붙이기.', + }, + tune: { + title: '베어링 & 트럭 튜닝', + blurb: '베어링 청소, 부싱 교체, 트럭 지오메트리 설정.', + }, + printMolds: { + title: '3D 프린트 몰드', + blurb: '커뮤니티의 인쇄 가능한 몰드와 정렬 베이스 파일.', + }, + sk8cadTools: { + title: '몰드 & 정렬 도구', + blurb: '정렬 베이스가 내장된 몰드를 설계하세요.', + }, + }, + actions: { + findBuilder: { + title: '빌더 찾기', + blurb: '설계하거나 시공해 줄 The Lab의 램프 및 DIY 빌더.', + }, + findCrew: { + title: 'DIY 크루 찾기', + blurb: '만들기에 집중하는 크루 — 스팟을 현실로 만드는 크루에 합류하세요.', + }, + mapSpot: { + title: 'DIY 스팟 지도에 등록', + blurb: '직접 만든 스팟을 추가해 지도에 남기세요.', + }, + sellBuilds: { + title: '만든 것 판매', + blurb: '직접 만든 데크, 램프, 부품을 마켓플레이스에 등록하세요.', + }, + findCoach: { + title: '코치 찾기', + blurb: 'DIY 스케이트 모듈과 스팟 제작을 가르치는 코치.', + }, + }, + }, + labelsUi: { + spotCategory: { + street: { + label: '스트리트', + description: '우연히 발견한 스팟, 도시 지형', + }, + transition: { + label: '트랜지션', + description: '곡면/경사면', + }, + park: { + label: '파크', + description: '지어진 스케이트파크', + }, + plaza: { + label: '광장', + description: '도시 광장 (MACBA, Love Park 등)', + }, + }, + spotFeature: { + wallrides: 'Wallrides', + stairs: '계단 & 핸드레일', + rails: 'Rails', + ledges: 'Ledges & 연석', + gaps: '갭', + flatground: '평지', + 'manual-pads': '매뉴얼 패드', + 'half-pipes': '하프파이프', + 'quarter-pipes': '쿼터파이프', + 'mini-ramps': '미니 램프', + bowls: '볼', + vert: '버트 램프', + 'mega-ramps': '메가 램프', + hubbas: '허바', + 'euro-gaps': '유로 갭', + banks: '뱅크', + 'spine-ramps': '스파인 램프', + 'roll-ins': '롤인', + hips: '힙', + volcano: '볼케이노', + pyramids: '피라미드 / 펀박스', + 'snake-runs': '스네이크 런', + 'pump-track': '펌프 트랙 롤러', + 'flat-bars': '플랫바', + }, + spotType: { + street: '스트리트', + transition: '트랜지션', + park: '파크', + plaza: '광장', + wallrides: 'Wallrides', + stairs: '계단 & 핸드레일', + rails: 'Rails', + ledges: 'Ledges & 연석', + gaps: '갭', + flatground: '평지', + 'manual-pads': '매뉴얼 패드', + 'half-pipes': '하프파이프', + 'quarter-pipes': '쿼터파이프', + 'mini-ramps': '미니 램프', + bowls: '볼', + vert: '버트 램프', + 'mega-ramps': '메가 램프', + hubbas: '허바', + 'euro-gaps': '유로 갭', + banks: '뱅크', + 'spine-ramps': '스파인 램프', + 'roll-ins': '롤인', + hips: '힙', + volcano: '볼케이노', + pyramids: '피라미드 / 펀박스', + 'snake-runs': '스네이크 런', + 'pump-track': '펌프 트랙 롤러', + 'flat-bars': '플랫바', + diy: 'DIY', + rail: 'Rail', + ledge: 'Ledge', + gap: '갭', + bowl: '볼', + stall: '스톨', + slappy: '슬래피', + }, + access: { + public: { + label: '공개 - 누구나 이용 가능', + }, + private: { + label: '사유지 - 허락 필요', + }, + locals: { + label: '현지인에게 먼저 물어보기', + }, + }, + shelter: { + outdoor: { + label: '야외', + short: '야외', + description: '완전 노출 — 비 오면 불가', + }, + partial: { + label: '부분 지붕', + short: '부분 지붕', + description: '일부 장애물은 비를 피함', + }, + covered: { + label: '지붕 있음', + short: '지붕 있음', + description: '야외지만 지붕 아래', + }, + indoor: { + label: '실내', + short: '실내', + description: '완전 밀폐 — 비 오나 눈 오나 스케이트', + }, + }, + eventType: { + contest: '콘테스트', + demo: '데모', + session: '세션', + workshop: '워크숍', + premiere: '프리미어', + tradeshow: '트레이드 쇼', + gameskate: '게임 오브 스케이트', + concert: '🎸 콘서트', + jam: '🎵 잼', + festival: '🎪 페스티벌', + popup: '🎯 팝업', + }, + gearCategory: { + deck: '데크', + trucks: '트럭', + wheels: '휠', + bearings: '베어링', + shoes: '스케이트화', + clothing: '의류', + protective: '보호 장비', + stickers: '스티커', + wax: '왁스', + tools: '도구', + griptape: '그립테이프', + rubbrick: '럽 브릭', + }, + gearCondition: { + new: { + label: '새것', + description: '미사용, 포장 그대로', + }, + like_new: { + label: '거의 새것', + description: '거의 사용 안 함, 최상급 상태', + }, + good: { + label: '양호', + description: '일반적인 마모, 기능 완벽', + }, + well_used: { + label: '많이 사용됨', + description: '마모가 보이지만 작동함', + }, + }, + priceType: { + fixed: { + label: '정가', + description: 'USD 또는 sats로 가격 설정', + }, + free: { + label: '무료', + description: '나눔', + }, + trade: { + label: '교환', + description: '맞교환 원함', + }, + offer: { + label: '제안 받기', + description: '가격 협의 가능', + }, + }, + listingType: { + selling: { + label: '판매', + description: '기어 판매 등록', + }, + wtb: { + label: '구매 희망', + description: '특정 기어를 찾는 중', + }, + }, + tour: { + spotType: { + street: '스트리트', + park: '파크', + diy: 'DIY', + transition: '트랜지션', + hidden: '숨은 명소', + }, + category: { + local: { + label: '로컬 투어', + description: '당신의 도시에 숨은 스팟을 소개', + }, + national: { + label: '국내 투어', + description: '전국을 가로지르는 다도시 로드트립', + }, + international: { + label: '국제 투어', + description: '여러 나라를 넘나드는 국경 너머 모험', + }, + destruction: { + label: '월드 데스트럭션', + description: 'KOTR 스타일의 글로벌 팀 대회', + }, + }, + }, + crew: { + vibe: { + street: '스트리트', + transition: '트랜지션 / 버트', + park: '파크', + diy: 'DIY', + cruising: '크루징 / 촬영', + oldschool: '올드 스쿨', + allterrain: '올 터레인', + girls: '걸 / 우먼', + youth: '유스 / 그롬', + adaptive: '어댑티브', + punk: '펑크', + hiphop: '랩 / 힙합', + }, + focus: { + mixed: '혼합 / 일반', + builder: 'DIY & 빌더', + photo: '포토 & 필름', + coaching: '코칭', + art: '아트 & 디자인', + music: '밴드 & 음악', + wellness: '트레이닝 & 물리치료', + }, + focusDescription: { + mixed: '일반 스케이트 크루 — 크루 페이지에만 표시됩니다.', + builder: 'DIY / 파크 건설 크루 — The Lab의 빌더에도 표시됩니다.', + photo: '촬영, 사진 또는 편집 크루 — The Lab의 포토 & 필름에도 표시됩니다.', + coaching: '코칭 / 레슨 크루 — The Lab의 코칭에도 표시됩니다.', + art: '아트, 디자인, 그래피티 또는 타투 컬렉티브 — The Lab의 아트 & 디자인에도 표시됩니다.', + music: '밴드 또는 음악 컬렉티브 — The Lab의 음악에도 표시됩니다.', + wellness: '트레이닝, 피트니스 또는 물리치료 크루 — The Lab의 트레이닝에도 표시됩니다.', + }, + lookingFor: { + filmer: '필머', + photographer: '포토그래퍼', + editor: '영상 편집자', + coach: '코치', + builder: '램프 빌더', + artist: '아티스트 / 디자이너', + musician: '뮤지션 / 밴드', + members: '새 멤버', + }, + role: { + filmer: '필머', + photographer: '포토그래퍼', + editor: '편집자', + coach: '코치', + builder: '빌더', + artist: '아티스트', + graffiti: '그래피티', + tattoo: '타투', + trainer: '트레이너', + musician: '뮤지션', + judge: '심판', + manager: '팀 매니저', + og: 'OG', + }, + }, + memberVisibility: { + public: { + label: '공개', + description: '이 크루에서 누구나 당신을 볼 수 있습니다 — 공개 크루 페이지와 크루 동료 찾기에서.', + }, + crew: { + label: '크루만', + description: '확인된 크루 동료와 창립자만 여기서 당신을 봅니다. 다른 사람에게는 익명의 "숨겨진 멤버"로 표시됩니다. 참고: 이는 앱 수준의 프라이버시입니다 — 멤버십 태그는 릴레이에 공개적으로 남아 있지만 외부인에게는 절대 표시되지 않습니다.', + }, + }, + tagCategory: { + features: { + name: '특징', + description: '장애물과 지형', + }, + surfaces: { + name: '표면', + description: '재질과 질감', + }, + sizes: { + name: '크기', + description: '치수와 규모', + }, + stairs: { + name: '계단 수', + description: '계단 개수', + }, + vibes: { + name: '분위기', + description: '분위기와 상태', + }, + location: { + name: '위치', + description: '위치 맥락', + }, + tricks: { + name: '트릭', + description: '특정 트릭에 적합', + }, + }, + spotTagCategory: { + street: { + label: '스트리트', + description: '스트리트 스팟 - 계단, Rails, Ledges', + }, + park: { + label: '파크', + description: '스케이트파크 - 공개 또는 비공개', + }, + diy: { + label: 'DIY', + description: 'DIY/직접 만든 스팟', + }, + plaza: { + label: '광장', + description: '스케이트 친화적 구조의 공공 광장', + }, + }, + status: { + active: { + label: '활동 중', + description: '바로 가능 — 타세요.', + }, + bust: { + label: '단속', + description: '강한 퇴거 위험 — 경비나 경찰.', + }, + skate_stopped: { + label: '스케이트 금지', + description: '노브/캡 설치, 하지만 부분적으로 가능.', + }, + closed: { + label: '폐쇄', + description: '일시 폐쇄 — 공사 또는 행사.', + }, + gone: { + label: '사라짐', + description: '철거, 포장 또는 영구 차단됨.', + }, + }, + price: { + free: '무료', + trade: '교환', + makeOffer: '제안하기', + offer: '제안', + }, + }, + feesUi: { + feeFeaturedEventLabel: '이벤트 추천', + feeFeaturedEventDesc: 'SkateSpots에서 이벤트를 추천하세요', + feeFeaturedEventBenefit: '이벤트가 이벤트 페이지 상단에 표시됩니다', + feeLabProfileLabel: 'Lab 프로 프로필', + feeLabProfileDesc: 'The Lab에서 서비스를 추천하세요', + feeLabProfileBenefit: '스케이터가 The Lab을 둘러볼 때 프로 배지 + 추천 배치', + feeFeaturedShopLabel: '숍 추천', + feeFeaturedShopDesc: '지도와 디렉터리에 스케이트 숍을 추천하세요', + feeFeaturedShopBenefit: '인증 배지 + 지도에 추천 핀', + feeFeaturedTourLabel: '투어 추천', + feeFeaturedTourDesc: 'SkateSpots에서 투어를 추천하세요', + feeFeaturedTourBenefit: '스케이터가 투어를 둘러볼 때 프로 배지 + 상단 배치', + duration7d: '7일', + duration30d: '1개월', + duration90d: '3개월', + duration365d: '12개월', + metaActive: '{{label}} — 활성', + daysRemainingOne: '{{count}}일 남음', + daysRemainingMany: '{{count}}일 남음', + zapRequestContent: 'SkateSpots {{label}} ({{tier}})', + errGenerate: '인보이스를 생성하지 못했습니다', + paymentReceived: '⚡ 결제 완료!', + paymentReceivedDesc: '{{amount}} sats — {{label}}이(가) 활성화되었습니다.', + autoPayFailed: '자동 결제 실패', + autoPayFailedDesc: '아래 QR 또는 인보이스로 직접 결제하세요.', + payStatusUnknown: '결제 상태를 알 수 없습니다 — 결제가 완료되었을 수 있습니다. 다시 결제하기 전에 지갑을 확인하세요.', + invoiceCopied: '인보이스가 복사되었습니다!', + activeBang: '{{label}} 활성!', + chooseDuration: '기간 선택', + bestValue: '최고 가성비', + perDay: '{{price}}/일', + validFor: '유효 기간', + amountLine: '~${{usd}} USD · {{name}}에게 · {{tier}}', + payToContinue: '계속하려면 {{amount}} sats 결제', + generating: '인보이스 생성 중…', + processing: '결제 처리 중…', + invoiceQrAlt: 'Lightning 인보이스 QR', + copyInvoice: '인보이스 복사', + openWallet: '지갑 열기', + payConnected: '연결된 지갑으로 결제', + scanAny: '아무 Lightning 지갑으로 스캔하세요', + tryAgain: '다시 시도', + proReceiptTitle: '🦧⚡ Sasquatch Pro — 시작되었습니다!', + proReceiptPass: '패스: {{pass}} ({{sats}} sats)', + proReceiptActiveUntil: '활성 종료: {{until}}', + proReceiptUnlocked: '해금된 기능:', + proReceiptBullet1: '• 개인 비서 — 당신의 Stash, 크루, 스팟 & 리스팅을 읽습니다', + proReceiptBullet2: '• 액션 초안 — 기어 등록, 스팟 상태 게시, 여행 계획 (확인 후 실행)', + proReceiptBullet3: '• 공개 데이터뿐 아니라 당신의 개인 맥락을 활용한 답변', + proReceiptBullet4: '• ⚡ SkateSpots를 직접 후원하고 무료 + 광고 없음을 유지합니다', + proReceiptThanks: 'SkateSpots를 무료 & 광고 없이 유지해 주셔서 감사합니다. 이제 달려보세요. 🛹', + proReceiptSubject: 'Sasquatch Pro 영수증', + receiptContent: 'Sasquatch Pro — {{tier}} 서포터 패스 🦧⚡', + receiptAlt: 'Sasquatch Pro 서포터 패스 ({{tier}}), {{until}}까지 유효', + purchaseComment: 'Sasquatch Pro — {{tier}} 🦧', + errLogin: 'Pro로 업그레이드하려면 로그인하세요.', + errStart: '구매를 시작하지 못했습니다.', + errRecord: '패스를 기록하지 못했습니다.', + }, + cardUi: { + save: 'Nostr에 카드 저장', + saved: '카드 저장됨', + savedDesc: '카드가 서명되어 검증 가능해졌습니다.', + saveFailed: '카드를 저장하지 못했습니다', + notPublished: '게시 안 됨', + titleNeon: 'Rider', + titleRest: 'Card', + saveFrontPng: '앞면 저장 (PNG)', + expired: '만료됨', + logoUploaded: '로고 업로드됨', + logoUploadFailed: '로고를 업로드하지 못했습니다', + venue: '연결된 장소 (선택 사항)', + venueNone: '장소 없음', + venueHint: '이 패스를 장소에 연결하려면 자신의 스팟 중 하나를 선택하세요. 검증자가 소유권을 확인합니다.', + venuePick: '장소 선택', + parkNoVenue: '파크 패스는 해당 장소의 소유자만 발급할 수 있습니다 — 먼저 자신이 소유한 스팟을 지도에 등록하세요.', + parkAddVenue: '스팟 추가', + parkNeedsVenue: '자신이 소유한 장소를 선택하세요', + parkIssued: '발급된 패스', + parkRevoke: '취소', + parkRevoked: '취소됨', + parkRevokeFailed: '취소하지 못했습니다', + v: { + valid: '유효', + validDesc: '서명이 유효하며 장소가 발급했습니다.', + expired: '만료됨', + expiredDesc: '유효 기간이 지났습니다.', + revoked: '취소됨', + revokedDesc: '발급자가 이 패스를 취소했습니다 — 받지 마세요.', + invalid: '유효하지 않음', + invalidDesc: '서명이 검증되지 않습니다. 신뢰하지 마세요.', + notFound: '찾을 수 없음', + notFoundDesc: '릴레이에 일치하는 기록이 없습니다.', + unverifiedIssuer: '미검증 발급자', + unverifiedIssuerDesc: '이 패스에 명시된 장소가 발급자의 키 소유가 아닙니다.', + notBound: '연결 안 됨', + notBoundDesc: '장소에 연결되지 않음 — 접근 권한을 증명하지 않습니다.', + noRsvp: 'RSVP 없음', + noRsvpDesc: '소지자가 이 이벤트에 대한 RSVP 기록이 없습니다.', + admitted: '입장 허가', + admittedDesc: '주최자의 이벤트 + 소지자가 RSVP했습니다.', + noHolder: '링크에 소지자 없음', + noHolderDesc: '이 QR에는 티켓 소지자(`?h=`)가 없어 소지자를 확인할 수 없습니다.', + }, + passes: { + tab: '내 패스', + pass: '출입 패스', + none: '아직 패스가 없습니다. 장소나 주최자가 발급하면 여기에 표시됩니다.', + }, + facets: { + title: '신원 정보 표시', + crews: '크루', + local: '로컬', + roles: 'Lab 역할', + }, + roles: { + coach: '코치', + filmer: '필머', + editor: '편집자', + photographer: '포토그래퍼', + builder: '빌더', + artist: '아티스트', + graffiti: '그래피티', + tattoo: '타투', + trainer: '트레이너', + musician: '뮤지션', + judge: '심판', + organizer: '주최자', + barber: '이발사', + }, + crew: { + crewCard: 'CREW CARD', + crewSub: '당신의 크루를 카드로', + pick: '크루 선택', + none: '아직 크루에 속해 있지 않습니다 — 먼저 가입하거나 만드세요.', + hint: '카드는 크루 자신의 서명된 데이터로 만들어집니다. 변경하려면 크루 페이지에서 크루를 편집하세요.', + members: 'MEMBERS', + spots: 'SPOTS', + est: '{{year}}년 설립', + openCall: '오픈 콜', + verifiedCrew: '인증된 크루', + viewCrew: '크루 보기', + }, + event: { + pass: 'EVENT PASS', + passSub: '참석하는 이벤트의 패스', + pick: '이벤트 선택', + none: '아직 이벤트가 없습니다 — 먼저 만들거나 RSVP하세요.', + hint: '패스는 이벤트 자신의 서명된 데이터로 만들어집니다. 주최자만 변경할 수 있습니다.', + admits: '입장 대상', + going: '{{count}}명 참석', + verifiedEvent: '인증된 이벤트', + viewEvent: '이벤트 보기', + issuePass: '체크인 패스 발급', + issuePassBtn: '패스 발급', + issuePassHint: '특정 참석자를 위한 서명된 패스 — 현장에서 보여줍니다.', + notOrganiser: '주최자만 패스를 발급할 수 있습니다', + passIssued: '패스 발급됨', + issueFailed: '패스를 발급하지 못했습니다', + issuedPasses: '발급된 체크인 패스', + }, + studio: { + unsaved: '저장되지 않은 변경 사항', + saved: '저장됨', + saveChanges: '변경 사항 저장', + allSaved: '저장됨 — 최신 상태', + showOnCard: '카드에 표시', + derived: '당신의 스케이터 프로필에서', + noSkaterProfile: '아직 스케이터 프로필이 없습니다 —', + editSkaterProfile: '스타일과 레벨을 추가하세요', + noPhoto: '아직 프로필 사진이 없습니다 —', + addPhoto: '프로필에서 추가하세요', + finishTitle: '카드 완성하기', + finishDesc: '사진과 스케이터 프로필이 있으면 진짜처럼 보입니다.', + checkPhoto: '프로필 사진', + checkName: '표시 이름', + checkProfile: '스타일 & 레벨', + checkCrew: '크루 가입', + moreTypes: '소유한 스팟을 지도에 등록하거나, 크루에 가입하거나, 이벤트에 RSVP하면 더 많은 카드 유형이 해금됩니다.', + accent: '강조 색상', + accentHint: '테마 강조색을 덮어씁니다', + accentClear: '테마 색상 사용', + logo: '커스텀 로고 / 엠블럼', + logoAdd: '업로드', + logoChange: '변경', + logoClear: '제거', + }, + back: { + title: '인쇄 가능한 뒷면', + desc: '뒷면에 크루, 역할, 스폰서 & 링크', + showBack: '뒷면 보기', + showFront: '앞면 보기', + empty: '아직 아무것도 없습니다 — 크루, 역할 또는 스폰서를 추가하세요.', + }, + verify: { + checking: '카드 확인 중…', + notFound: '카드를 찾을 수 없음', + notFoundDesc: '릴레이에서 일치하는 이벤트를 찾지 못했습니다. 삭제되었거나 링크가 잘못되었을 수 있습니다.', + invalid: '서명 유효하지 않음', + invalidDesc: '이 이벤트는 존재하지만 서명이 검증되지 않습니다. 신뢰하지 마세요.', + authentic: '진본', + authenticDesc: '발급자의 서명이 유효합니다.', + kind: '유형', + kindPark: '파크 출입 카드', + kindRider: '라이더 카드', + kindCrew: '크루 카드', + kindEvent: '이벤트 패스', + organiser: '주최자', + expired: '만료됨', + valid: '유효', + holder: '소지자', + ticketHolder: '티켓 소지자', + rsvp: 'RSVP', + rsvpGoing: '참석', + rsvpInterested: '관심 있음', + rsvpNone: 'RSVP를 찾을 수 없음', + revoked: '패스 취소됨', + revokedDesc: '발급자가 이 패스를 취소했습니다 — 받지 마세요.', + issuedBy: '발급자', + accessLevel: '접근 레벨', + validThru: '유효 기간', + selfIssued: '상태', + selfIssuedDesc: '자체 발급 신원 카드', + venue: '장소', + venueVerified: '인증됨 — 이 장소의 소유자 키가 발급자와 일치합니다.', + venueMismatch: '이 패스에 명시된 장소가 발급자의 키 소유가 아닙니다.', + venueNone: '장소에 연결되지 않음.', + viewCard: '카드 보기', + disclaimer: '유효한 서명은 이 카드를 누가 서명했는지 증명할 뿐 — 실력이나 장소가 부여한 것 이상의 접근 권한을 증명하지 않습니다.', + details: '세부 정보', + invalidLink: '잘못된 링크', + invalidLinkDesc: '유효한 카드 링크가 아닌 것 같습니다.', + }, + public: { + invalid: '유효한 카드 링크가 아닌 것 같습니다.', + createYourOwn: '나만의 카드 만들기', + editYourCard: '카드 편집', + backToEditor: '편집기로 돌아가기', + backHome: '홈으로', + notCustomised: '이 스케이터는 아직 카드를 커스터마이즈하지 않았습니다 — 기본 모습입니다.', + verifyNote: '카드의 QR을 스캔해 검증하세요.', + }, + }, + routeUi: { + destination: '목적지', + routeTo: '{{label}}(으)로 길찾기', + routeToLabel: '길찾기', + search: '검색', + description: '경로 옵션과 앱 내 길안내.', + routeMapAria: '경로 지도', + findingLocation: '위치를 찾는 중…', + plottingRoute: '경로를 그리는 중…', + refiningLocation: '위치 정밀 조정 중…', + offlineSavedRoute: '오프라인 · 저장된 경로 {{age}}', + tapMapStart: '지도를 탭해 출발지를 설정하세요', + fitRouteAria: '전체 경로를 지도에 맞추기', + wholeRoute: '전체 경로', + next: '다음', + nextStep: '다음 · {{n}}단계', + followTheLine: '선을 따라가세요', + toTheTurn: '회전까지', + toGo: '남음', + tryAgain: '다시 시도', + mode: { + foot: '스케이트 / 도보', + bike: '자전거', + moto: '오토바이', + car: '자동차', + transit: '대중교통', + }, + from: '출발', + myLocation: '내 위치', + tapTheMap: '지도를 탭하세요…', + chooseOnMap: '지도에서 선택', + direct: '직행', + transferOne: '환승 1회', + transfers: '환승 {{count}}회', + options: '{{count}}개 옵션', + ride: '탑승', + arrive: '도착', + speedAvg: '평균 {{speed}} km/h', + stepsCount: '{{count}}단계', + onABoard: '보드로', + usesDrivingRoads: '차도 이용', + drivingEstimate: '운전 추정치', + updating: '업데이트 중…', + pickMode: '이동 수단을 선택해 경로를 확인하세요.', + waitingLocation: '위치를 기다리는 중…', + routeSteps: '경로 단계', + walkingRoute: '도보 경로 — 보드로 더 빠름', + planningView: '계획 보기 — 시작을 눌러 실시간 회전, 음성, 도착 안내를 따르세요.', + leaveNow: '지금 출발', + departAt: '출발 시각', + arriveBy: '도착 시각', + departureTime: '출발 시각', + arrivalTime: '도착 시각', + only: '만', + clear: '해제', + itinerary: '여정', + group: { + bus: '버스', + tram: '트램', + metro: '지하철', + train: '기차', + ferry: '페리', + }, + walk: '도보', + rideVerb: '탑승', + walkLower: '도보', + rideLower: '탑승', + toStop: '→', + track: '{{track}}번 승강장', + stopOne: '정류장 1개', + stopsCount: '정류장 {{count}}개', + tickets: '승차권 ↗', + done: '완료', + stop: '정지', + start: '시작', + arrived: '도착했습니다. 🛹', + voiceOnNote: '화면 켜짐 · 음성 켜짐 — 회전과 도착을 안내합니다.', + voiceOffNote: '화면 켜짐 · 음성 꺼짐.', + followNote: '이동하는 동안 회전, 음성, 도착 안내. 화면이 켜진 상태로 유지됩니다.', + voiceOffAria: '음성 안내 끄기', + voiceOnAria: '음성 안내 켜기', + voiceStart: '내비게이션 시작', + voiceArrived: '도착했습니다', + voiceIn: '{{metres}}m 앞에서 {{instruction}}', + voiceContinue: '계속', + voiceContinueCaps: '계속', + errPermissionDenied: '위치 권한이 거부되었습니다.', + errWaitingGps: 'GPS 좌표를 기다리는 중…', + errPermissionDeniedLong: '위치 권한이 거부되었습니다. 현재 위치에서 길찾기를 하려면 위치를 켜세요.', + errNoLocation: '위치를 가져오지 못했습니다. 다시 시도하세요.', + errNoLocationShort: '위치를 가져오지 못했습니다.', + errTransitNoRouteFiltered: '해당 시간이나 이동 수단에 경로가 없습니다 — 다른 시간을 시도하거나 더 많은 수단을 포함하세요.', + errTransitNoRoute: '여기서 대중교통 경로를 찾지 못했습니다 — 이 지역은 공개 시간표를 제공하지 않을 수 있습니다.', + errTransitUnreachable: '대중교통 서비스에 연결하지 못했습니다. 연결을 확인하고 다시 시도하세요.', + errRoutingBusy: '경로 서비스가 지금 혼잡합니다 — 잠시 후 다시 시도하세요.', + errNoRouteMode: '이 수단에 경로가 없습니다 — 목적지가 도로망 밖일 수 있습니다. 다른 수단을 시도하세요.', + errRoutingUnreachable: '경로 서비스에 연결하지 못했습니다. 연결을 확인하고 다시 시도하세요.', + departures: '출발', + upcomingFrom: '{{stop}}에서 출발 예정', + loadingDepartures: '출발 정보 불러오는 중…', + noDepartures: '이 정류장에서 예정된 출발이 없습니다.', + live: '실시간', + cancelled: '결행', + refresh: '새로고침', + tripLoginTitle: '저장하려면 로그인', + tripLoginDesc: '이 여행을 컬렉션으로 보관하려면 로그인하세요.', + tripCollectionTitle: '{{destination}} 스케이트 여행 🛹', + tripCollectionDesc: 'The Sasquatch의 여행 계획 — {{destination}}에서 {{count}}일.', + tripCollectionDescOne: 'The Sasquatch의 여행 계획 — {{destination}}에서 {{count}}일.', + tripSavedTitle: '컬렉션에 저장됨 🦧', + tripSavedDesc: '{{destination}} 여행이 북마크되었습니다.', + tripSaveFailed: '저장하지 못했습니다', + tripSaveFailedDesc: '잠시 후 다시 시도하세요.', + daysInDestinationOne: '{{destination}}에서 {{count}}일', + daysInDestination: '{{destination}}에서 {{count}}일', + wetForecast: '비 예보 — 지붕/실내 옵션은 현지 크루에 문의하세요.', + dayLabel: '{{n}}일차', + freeSkate: '자유 스케이트 — 탐험 & 촬영. 🎥', + tapToBook: '탭해서 예약 / Zap ⚡', + localCrews: '현지 크루', + saving: '저장 중…', + savedToCollections: '컬렉션에 저장됨', + saveSpotOne: '스팟 {{count}}개를 컬렉션에 저장', + saveSpots: '스팟 {{count}}개를 컬렉션에 저장', + flights: '항공권', + stays: '숙소', + gettingAround: '이동', + noMiddleman: '스케이트 일정은 내가 짠다 — 항공권 & 숙소는 실제 사이트에서 (KYC 없음, 중개자 없음).', + ageJustNow: '방금', + ageMinAgo: '{{count}}분 전', + ageHourAgo: '{{count}}시간 전', + ageDayAgo: '{{count}}일 전', + skateRightHere: '바로 여기', + skateMin: '~{{count}}분 크루즈', + skateHours: '~{{hours}}시간 크루즈', + maneuver: { + headOut: '출발', + arrive: '스팟에 도착', + continueStraight: '계속', + bearLeft: '좌측으로', + bearRight: '우측으로', + turnLeft: '좌회전', + turnRight: '우회전', + sharpLeft: '급좌회전', + sharpRight: '급우회전', + turn: '회전', + keepLeft: '좌측 유지', + keepRight: '우측 유지', + takeFork: '갈림길 진입', + merge: '합류', + roundabout: '로터리 진입', + takeRamp: '램프 진입', + takeExit: '출구 진입', + }, + maneuverOnto: '{{road}}에서 {{instruction}}', + }, + sasquatchUi: { + live: '라이브', + offline: '오프라인', + genericTitle: 'SkateSpots 어시스턴트 🦧', + genericGreeting: '안녕! 나는 The Sasquatch야. 스팟, 이벤트, 코치, 기어, 앱 사용법 무엇이든 물어봐. SkateSpots 릴레이의 실시간 데이터를 갖고 있어!', + q1: '리스본 3일 일정 짜줘', + q2: '내 주변 스팟 찾아줘', + q3: '다가오는 이벤트 있어?', + q4: '크루가 뭐야?', + q5: 'Zap은 어떻게 작동해?', + q6: 'Nostr가 뭐야?', + q7: '내 Stash가 뭐야?', + q8: '이거 무료야?', + bubbleTitle: '길게 눌러 드래그해 이동 · 탭해서 열기', + openGuideAria: 'Sasquatch 가이드 열기', + hideAria: 'Sasquatch 어시스턴트 숨기기', + hide: '어시스턴트 숨기기', + showAria: 'Sasquatch 어시스턴트 표시', + activeUntil: '{{date}}까지 활성', + platformOwner: '플랫폼 소유자', + upgradeTitle: 'Sasquatch Pro로 업그레이드', + goPro: 'Go Pro', + goProBlurb: '개인 AI · 2k sats부터', + aiBalanceTitle: 'Sasquatch AI 크레딧 잔액 (소유자 전용) — {{provider}}에서 충전', + aiChip: '⚡ AI {{balance}}', + minimizeToBubbleAria: '버블로 최소화', + minimize: '최소화', + closePanelAria: '패널 닫기', + close: '닫기', + askLab: '코칭 & 촬영에 대해 묻기', + askMap: '스팟, 숍 & 기어에 대해 묻기', + askAnything: '무엇이든 물어보세요 🛹', + quickQuestions: '빠른 질문:', + you: '🧑 나', + thinking: '생각 중...', + inputPlaceholder: '스팟, 이벤트, 코치에 대해 물어보세요...', + liveDataFrom: '실시간 데이터 출처', + nostrRelays: 'Nostr 릴레이', + clear: '지우기', + gettingLocation: '📍 위치를 가져오는 중…', + findingClosest: '🔍 가장 가까운 스팟을 찾는 중…', + checkingLive: '🔍 실시간 데이터 확인 중…', + planningTrip: '🗺️ {{destination}} 여행을 계획 중...', + searchingRelays: '🔍 릴레이에서 {{tool}} 검색 중...', + perk1: '개인 비서 — Sasquatch가 당신의 Stash, 크루, 스팟 & 리스팅을 읽습니다', + perk2: '액션 초안: 기어 등록, 스케이트 상태 게시, 여행 계획 — 게시 전에 항상 확인합니다', + perk3: '공개 데이터뿐 아니라 당신의 개인 맥락을 활용한 답변', + perk4: '⚡ SkateSpots를 직접 후원하고 무료·광고 없음을 유지하세요', + welcomeTitle: 'Sasquatch Pro를 후원해 주셔서 감사합니다! 🦧⚡', + welcomeDesc: '결제를 보냈습니다 — 제공자가 확인하면 패스가 활성화됩니다 (보통 1분 이내). 거리를 자유롭게 유지해 주셔서 감사합니다.', + invoiceCopied: '인보이스가 복사되었습니다', + dialogDesc: 'AI 스케이트 가이드를 강화하세요. 100% 무료·광고 없는 커뮤니티 앱을 지원합니다.', + proSupporter: '당신은 Pro 서포터입니다 ⚡', + extendPrompt: '연장하고 싶으세요? 아래에서 티어를 선택해 기간을 추가하세요.', + scanToPayPre: '결제하려면 스캔', + scanToPayAmount: '{{sats}} sats', + scanToPayPost: 'Pro {{label}}', + invoiceQrAlt: 'Lightning 인보이스 QR', + copyInvoice: '인보이스 복사', + ivePaid: '결제했어요', + ivePaidHint: '지갑에서 확인한 뒤 "결제했어요"를 탭하세요 — Nostr 신원에 패스가 기록됩니다.', + freeStaysPre: '무료 Sasquatch는 계속 무료입니다 — 공개 스팟/이벤트/코치 검색, 여행 계획 + 전체 트릭 용어집. Pro는 ', + freeStaysEmphasis: '개인 + 액션', + freeStaysPost: ' 레이어를 추가합니다.', + loginFirst: '업그레이드하려면 먼저 로그인하세요.', + paysTo: '결제 대상', + overLightning: 'Lightning으로. 당신의 npub에 귀속됩니다.', + popular: '인기', + sats: 'sats', + extend: '연장', + done: '완료!', + cancelledNothing: '취소됨 — 아무것도 게시되지 않았습니다.', + draftReview: '초안 — 검토 후 확인', + statusTextPlaceholder: '상태 텍스트', + titlePlaceholder: '제목', + priceSatsPlaceholder: '가격 (sats)', + conditionPlaceholder: '상태', + cancel: '취소', + aiTitle: 'Sasquatch AI', + owner: '소유자', + notConfigured: '설정되지 않음', + unavailable: '사용 불가', + satsValue: '{{balance}} sats', + theNode: '노드', + lowBalance: '잔액이 부족합니다 — {{provider}}에서 충전하지 않으면 AI가 키 없는 제공자로 대체됩니다.', + aiDesc: '요청당 결제 AI, Routstr로 sats 충전. 부족하면 자동 충전.', + tier7d: '7일', + tier1m: '1개월', + tier3m: '3개월', + tier1y: '1년', + badgeTry: '체험', + badgeOff20: '20% 할인', + badgeBest: '최고 가성비 · 40% 할인', + draftPostStatusTitle: '스케이트 상태 게시', + draftAutoExpires: '{{count}}분 후 자동 만료', + draftPostStatusCta: '상태 게시', + draftCategory: '카테고리: {{value}}', + draftSize: '크기: {{value}}', + draftCondition: '상태: {{value}}', + draftMaxPrice: '최대 가격: {{price}} {{currency}}', + draftPriceOpen: '가격: 협의', + draftLookingForTitle: '"{{title}}" 구함', + draftWantedCta: '구매 희망 등록', + draftPrice: '가격: {{price}} {{currency}}', + draftPriceOffer: '가격: 제안 받기', + draftListTitle: '"{{title}}" 판매 등록', + draftPublishCta: '리스팅 게시', + statusPosted: '상태 게시됨 🛹', + wantedPublished: '구매 희망 등록됨 🔎', + listingPublished: '리스팅 게시됨 💸', + mustBeLoggedIn: '로그인해야 합니다.', + }, + sasquatchChat: { + faq: { + hi: '안녕! 나는 The Sasquatch야 🦧 스케이트 AI 가이드. 스팟, 이벤트, 코치, 기어 — 또는 앱에 관한 무엇이든 물어봐. 뭐가 필요해?', + hello: '안녕! 🛹 나는 The Sasquatch야. 스케이트 스팟, 이벤트, 코치, 또는 앱 작동 방식에 대해 물어봐. 뭐 도와줄까?', + hey: '안녕 스케이터! 🤙 근처 스팟, 다가오는 이벤트, 코치, 또는 SkateSpots 관련 무엇이든 물어봐.', + whoAreYou: '나는 The Sasquatch 🦧 — SkateSpots의 AI 가이드야. 전 세계 스케이트 스팟을 찾고, 이벤트, 코치, 필머, 기어 리스팅을 조회할 수 있어. 모두 실시간 Nostr 데이터 기반이야. 무엇이든 물어봐!', + whatCanYouDo: "도시나 국가별로 스케이트 스팟을 찾고, 다가오는 이벤트를 조회하고, The Lab에서 코치와 필머를 찾고, 기어 리스팅을 검색하고, 앱 작동 방식에 관한 질문에 답할 수 있어. 이렇게 해봐: '방콕 스팟' 또는 '코치 찾아줘'! 🛹", + whatIsNostr: 'Nostr는 탈중앙화 소셜 네트워크를 위한 간단하고 개방된 프로토콜이야. 트위터를 떠올리면 되는데, 단일 회사가 통제하지 않아 — 사용자 이름 대신 암호화 키를 쓰고, 데이터를 저장할 릴레이를 직접 고르고(직접 운영할 수도 있어), 하나의 계정이 모든 Nostr 앱에서 통하는 거야! 🔑', + isThisPrivate: "솔직하게 정리하면 🛡️\n\n• **GPS 위치는 기기에 남아 있어** — '내 주변'은 지도를 중앙에 맞출 뿐이야. 우리에게 전송되거나 게시되지 않아.\n• **네가 추가한 스팟은 공개**야 (공유 지도의 취지지) — 그러니 자기 집 현관에 핀을 찍지 마.\n• **DM과 크루 채팅은 종단 간 암호화** — 멤버만 읽을 수 있어.\n• 다른 웹사이트처럼, 접속하는 서버(지도 타일, 릴레이)는 네 **IP**를 볼 수 있어. 그것도 숨기고 싶어? VPN이나 Tor를 써.\n\n자세한 내용은 [프라이버시 페이지](/privacy)에서. 🛹", + privacy: '짧게 말하면 🛡️: GPS는 기기를 떠나지 않고, 게시한 스팟은 설계상 공개이며, DM/크루 채팅은 종단 간 암호화야. 서버는 여전히 네 IP를 볼 수 있어(모든 웹사이트가 그렇지) — 원하면 VPN이나 Tor로 숨겨. 전체 설명은 [프라이버시 페이지](/privacy)에서. 🛹', + amITracked: 'SkateSpots는 너를 추적하지 않아 — 광고도, 분석 프로파일링도, 데이터 판매도 없고, 네 위치를 수집하는 SkateSpots 서버도 없어. GPS는 기기에 남아 있어. 서버(지도 타일, 릴레이)가 보는 단 하나는 네 **IP** — 모든 웹사이트와 같아. VPN이나 Tor로 숨겨. 자세한 내용은 [프라이버시 페이지](/privacy)에서. 🛡️', + doYouTrack: '아니 — 추적도, 광고도, 데이터 수집도 없어. GPS는 기기에 남고 너를 기록하는 중앙 서버도 없어. 접속하는 서버는 네 IP를 볼 수 있어(어떤 사이트든 그렇지); VPN/Tor로 숨겨. [프라이버시 페이지](/privacy) 참고. 🛹', + vpn: '완전 선택 사항이지만, 추가 프라이버시를 원한다면 좋아 🛡️. VPN은 SkateSpots가 통신하는 서버(지도 타일, 릴레이 등)로부터 네 **IP**(대략적 위치)를 숨겨줘. 신뢰하는 무로그 제공자(예: Mullvad)를 골라; 수상한 무료 서비스는 피해.\n\n참고: VPN은 네가 게시한 스팟을 숨기지 않아(그건 공개야), 익명을 유지하려면 브라우저 GPS를 켜지 마. 자세한 내용은 [프라이버시 페이지](/privacy)에서.', + tor: 'Tor 브라우저는 가장 강력한 IP 프라이버시를 제공해 — 여러 릴레이를 거치므로 서버가 실제 IP를 볼 수 없어 🧅. 대가: 느리고, 지도와 일부 Nostr 릴레이가 지연되거나 Tor 출구를 차단할 수 있어. 각별히 신중한 사람에게 좋아.\n\n기억해: Tor는 IP를 숨길 뿐 게시한 스팟을 숨기지 않고, 익명이 목표라면 브라우저 GPS를 켜지 마. 자세한 내용은 [프라이버시 페이지](/privacy)에서.', + hideMyIp: '무료 옵션 두 가지 🛡️: **평판 좋은 VPN**(쉽고 빠름 — 그들 서버 뒤로 IP를 숨김) 또는 **Tor 브라우저**(최대 프라이버시, 느림). 어느 쪽이든 SkateSpots가 접속하는 서버가 실제 IP를 못 보게 해. 게시한 스팟은 숨기지 않는다는 점 참고. [프라이버시 페이지](/privacy) 참고.', + isMyLocation: "네 위치는 안전해 📍 — '내 주변'은 지도를 중앙에 맞추고 근처 스팟을 정렬하기 위해 기기에서만 GPS를 읽어. Nostr에 게시되지도, 우리에게 전송되지도, 공유되지도 않아. 네가 의도적으로 추가한 스팟만 공개야. 자세한 내용은 [프라이버시 페이지](/privacy)에서.", + whatAreZaps: 'Zap은 Nostr로 보내는 즉석 비트코인 Lightning 팁이야! 아무 콘텐츠에서 ⚡를 누르고 창작자의 지갑으로 sats를 직접 보내. 좋아요를 누르는 것 같은데 실제 돈이 오가는 거지. 즉시, P2P, 중개자 없음. ⚡', + howToLogin: '두 가지 방법:\n1. **브라우저 확장**(데스크톱): Alby나 nos2x를 설치한 뒤 로그인을 눌러\n2. **신규 사용자**: 가입을 눌러 키를 생성해. nsec(비밀 키)을 다운로드하고 반드시 저장해 — 이게 영원한 네 계정이야!', + whatIsCashu: '내장 비트코인 지갑! Lightning으로 뒷받침되는 Cashu ecash 토큰 — 스케이트 스팟에서 오프라인으로도 작동하고, 프라이버시 중심이야 (민트가 결제를 추적할 수 없음). 설정의 지갑에서 사용해. 🥜', + whatIsNwc: 'Nostr Wallet Connect — Lightning 지갑의 USB-C 같은 것. Alby, Minibits, Zeus, Coinos를 한 번 연결하면 이후엔 클릭 한 번으로 Zap할 수 있어. 암호화되어 있고, 지출 한도는 네가 통제해. 🔌⚡', + isItFree: '100% 무료. 광고 없음, 구독 없음, 기업의 헛소리 없음. 스케이터가 스케이터를 위해 만들었어. Angor를 통한 커뮤니티 후원 — 서포터 페이지를 확인해. 좋은 스팟을 기여하면 커뮤니티 Zap으로 비트코인을 받을 수도 있어. 🛹', + whatCanIDo: '지도에서 전 세계 스팟을 발견하고, The Lab에서 전문가를 고용하고(코치, 필머, 포토그래퍼, 편집자, 램프 빌더), 크루와 함께 타고, 이벤트에 참여하고, 투어를 떠나고, 기어를 사고팔고, 프라이빗 Stash를 관리하고, 창작자에게 Zap하고, 스팟 날씨를 확인하고, 탈중앙화 스케이트 커뮤니티를 함께 만들어! ', + whatIsTheLab: 'The Lab은 스케이트 신 프로를 고용하는 곳이야: 코치, 필머, 포토그래퍼, 영상 편집자, 램프/파크/DIY 빌더. 각자는 개인일 수도, 컬렉티브(크루/스튜디오)일 수도 있어 — 멤버가 각자 키로 확인하므로 진짜야. 모두 Nostr 위에 있고, 가짜 계정은 없어. 🎓', + whatIsACrew: '크루는 지도에 기반을 둔 스케이트 가족이야 — 함께 타는 사람들이지, 고용하는 사람이 아니야. 각 크루는 지도에 홈 텃세(청록 핀), 홈 스팟, 멤버, 분위기, 선언문이 있어. 멤버는 각자 키로 확인해. 크루 → 크루 만들기에서 만들어. 🤘', + whatAreCrews: '크루는 지도에 기반을 둔 스케이트 가족이야 — 함께 타는 사람들이지, 고용하는 사람이 아니야. 각 크루는 지도에 홈 텃세(청록 핀), 홈 스팟, 멤버, 선언문이 있어. 멤버는 각자 키로 확인해. 크루 탭에서 시작하거나 가입해! 🤘', + howToStartACrew: '크루 탭 → 크루 만들기로 가. 이름을 정하고, 지도에 홈 텃세를 찍고, 분위기(또는 직접 만든 #해시태그)를 추가하고, 홈 스팟을 연결하고, npub으로 멤버를 추가해. 각 멤버가 자기 키로 확인하므로 명단이 진짜야. 🤘', + whatIsMyStash: '내 Stash는 프라이빗하고 암호화된 기어 라커야 (NIP-44 암호화). 데크, 트럭, 휠, 신발을 보관 위치, 상태, 희귀도, 가격과 함께 관리해. 항목을 공개로 표시하지 않는 한 너만 읽을 수 있어. 보험이나 교환 계획에 좋아. 🎒', + whatIsStash: '내 Stash는 프라이빗하고 암호화된 기어 인벤토리야. 소유한 모든 것을 기록해 — 상태, 보관 위치, 가치 — 모두 암호화되어 너만 볼 수 있어. 팔거나 자랑하고 싶으면 항목을 공개로 표시해. 🎒', + whatIsABuilder: '빌더는 The Lab에서 고용할 수 있는 램프/파크/DIY 크루로, 트랜지션, 볼, Rail, 또는 파크 전체를 지어줘. 무엇을 짓는지, 재료, 프로젝트 규모를 등록하고, 면허/보험도 갖출 수 있어. 흔히 컬렉티브이고, 지은 스팟을 지도에 연결할 수 있어. 🏗️', + whatIsANutzap: 'Nutzap(NIP-61)은 Nostr로 보내는 ecash 팁이야 — 프라이빗 Cashu 토큰을 누군가에게 바로 Zap하는 거지. 지갑에서 nutzap 수신을 설정할 수 있어. (전체 nutzap 전송은 순차 출시 중 — 지금은 Lightning Zap을 써.) 🥜⚡', + whatIsClink: 'CLINK는 Nostr 네이티브 결제 코드(noffer)야. 숍, 크루, Lab 프로가 추가하면 Lightning 주소 없이도 결제받을 수 있어 — QR이 있는 Pay via CLINK 버튼이 보일 거야. ShockWallet 같은 CLINK 지갑으로 스캔해. 🔗⚡ [specs](https://clinkme.dev/specs.html) [apps](https://clinkme.dev/apps.html)', + whatIsNoffer: 'noffer는 CLINK 결제 코드야 — 웹 서버나 Lightning 주소 없이 결제받는 재사용 가능한 Nostr 네이티브 방식이지. 숍/크루/Lab 프로필에 추가하면 사람들이 너에게 바로 결제할 수 있어. 🔗', + whatAreTours: '투어는 가이드가 있는 스케이트 여행이야 — 로컬 세션, 국내 로드트립, 월드 데스트럭션 투어까지. 지도나 투어 섹션에서 찾아 만나고, 현지인과 새로운 지형을 타. 🗺️🛹', + whatIsAShop: '스케이트 숍은 지도에 등록된 동네 숍이야. 지역의 실제 오프라인(또는 온라인) 스케이트 숍을 발견하고 후원해 — 일부는 비트코인도 받아. 🏪', + howToSellGear: '기어 스왑 / 마켓플레이스로 가서 리스팅을 만들어 (NIP-99). 사진, sats 가격, 상태를 추가하고, 원하면 스팟에 핀해 지도에 표시되게 해. 구매자가 직접 Zap하거나 메시지를 보내. 🛹💸', + supporters: 'SkateSpots는 Angor(탈중앙화 비트코인 크라우드펀딩)를 통해 커뮤니티가 후원해 — 광고도, 투자자도, 데이터 판매도 없어. 서포터 페이지에서 프로젝트를 후원하고 거리를 자유롭게 유지해. ❤️⚡', + trustScore: '신뢰 점수(0-100)는 Relatr가 제공해. 네 Nostr 네트워크를 분석해: 팔로워, 활동, 참여, Zap. 높을수록 더 신뢰. 봇과 스팸을 걸러내는 데 도움이 돼. 아무 프로필에서 점수를 확인할 수 있어. 🛡️', + whatRelay: 'SkateSpots가 사용하는 릴레이: 🛹 goskatespots.nostr1.com (기본, 품질을 위해 허용 목록) + relay.ditto.pub (글로벌) + purplepag.es (프로필 애그리게이터). 데이터는 중복성을 위해 모든 릴레이에 복제돼.', + tripPlanner: "도시를 말해주면 일별 스케이트 여행을 짜줄게 🗺️ — 스팟, 이벤트, 코치, 현지 크루, 날씨 고려(비 오는 날 = 지붕 있는 스팟 크루 팁). '리스본 3일 일정 짜줘' 해봐. 전부 컬렉션에 저장할 수 있고, 실제 사이트의 항공권/숙소로 넘겨줘 (KYC 없음, 중개자 없음). 🛹", + planATrip: "바르셀로나 3일 일정 짜줘(또는 아무 도시)라고만 말해 — 그러면 각 날짜의 스팟, 세션, 코치, 현지 크루를 짜줄게. 컬렉션으로 저장하고 달려. 🗺️🛹", + sasquatchPro: '**Sasquatch Pro** 🦧⚡는 내 개인적인 면을 해금하는 Lightning 서포터 패스야:\n\n• 🧠 **개인 비서** — 네 Stash, 크루, 스팟 & 리스팅을 읽어\n• ✨ **액션 초안** — 기어 등록, 스케이트 상태 게시, 여행 계획 (게시 전에 항상 네가 확인)\n• 💬 **개인 맥락** — 공개 결과뿐 아니라 네 데이터를 활용한 답변\n• ⚡ **프로젝트 후원** — SkateSpots를 무료·광고 없이 유지\n\n무료 Sasquatch는 계속 무료야: 공개 스팟/이벤트/코치/크루 검색, 용어집, 여행 계획은 Pro 없이도 작동해. Pro는 *개인적인* 것을 더할 뿐이야. 상단의 **⚡ Go Pro**를 탭해. 티어: 7일 ~2k sats, 1개월 ~5k, 3개월 ~12k, 1년 ~36k.', + proPerks: 'Pro 혜택 🦧⚡: 개인 비서(네 Stash/크루/스팟/리스팅을 읽음), 액션 초안(기어 등록, 상태 게시, 여행 계획 — 네가 확인), 그리고 네 개인 맥락을 활용한 답변. 게다가 SkateSpots를 직접 후원하고 무료 + 광고 없이 유지해. 무료는 계속 무료 — Pro는 개인 레이어를 더해. 상단의 **⚡ Go Pro**를 탭해.', + proVersion: '내 Pro 버전 🦧⚡은 **개인 비서**를 더해: 네 Stash, 크루, 스팟 & 리스팅을 읽고, 액션 초안을 작성하고(기어 등록, 상태 게시, 여행 계획 — 항상 네가 먼저 확인), 답변에 개인 맥락을 사용해. 프로젝트도 직접 후원해. 무료 Sasquatch(스팟/이벤트/코치/크루 검색, 용어집, 여행 플래너)는 무료야. 상단의 **⚡ Go Pro**를 탭해.', + perks: 'Pro 혜택 🦧⚡: 개인 비서(네 Stash/크루/스팟/리스팅), 네가 확인하는 액션 초안, 네 맥락을 활용한 답변 — 그리고 앱을 무료 & 광고 없이 유지해. 상단의 **⚡ Go Pro**를 탭해.', + goPro: '상단의 **⚡ Go Pro** 버튼을 탭해 업그레이드 시트를 열어. Pro는 내 개인 비서(Stash/크루/스팟/리스팅)와 액션 초안을 해금하고, 프로젝트를 직접 후원해. Lightning으로 결제 — 7일 ~2k sats부터 1년 ~36k sats까지. 무료 기능은 계속 무료야. 🦧', + proPricing: 'Pro 티어(Lightning으로 결제 ⚡): **7일** ~2,000 sats (~$1.20), **1개월** ~5,000 sats (~$3), **3개월** ~12,000 sats (~$7, 20% 할인), **1년** ~36,000 sats (~$21, 최고 가성비). 상단의 **⚡ Go Pro**를 탭해.', + howMuchIsPro: 'Pro 티어: 7일 ~2,000 sats, 1개월 ~5,000 sats, 3개월 ~12,000 sats (20% 할인), 1년 ~36,000 sats (최고 가성비). Lightning으로 결제 ⚡. 상단의 **⚡ Go Pro**를 탭해.', + upgrade: 'Sasquatch Pro로 업그레이드하려면 상단의 **⚡ Go Pro** 버튼을 탭해. Lightning으로 결제(7일 ~2k sats부터 1년 ~36k). Pro는 내 개인 비서와 액션 초안을 해금하고, 프로젝트를 직접 후원해. 🦧⚡', + }, + statsTitle: '📊 **숫자로 보는 SkateSpots**', + weatherTemp: '• {{temp}}°C (체감 {{feels}}°C)', + weatherSkateability: '• 스케이트 가능성: **{{label}}** ({{score}}/100)', + weatherError: '지금 날씨를 읽지 못했어. 잠시 후 다시 시도해. 🌧️', + labelSpots: '스팟', + labelEvents: '이벤트', + labelLabPros: 'Lab 프로', + labelCrews: '크루', + labelShops: '스케이트 숍', + labelTours: '투어', + labelGear: '기어 리스팅', + unnamed: '이름 없음', + emptyWhere: ' (**{{place}}**)', + emptyResult: '지금 {{label}}{{where}}을(를) 찾지 못했어 🦧\n\n아직 등록되지 않았거나 릴레이 응답이 느렸을 수 있어. 잠시 후 다시 시도하거나, 철자를 확인하거나, [지도에 첫 번째로 추가](https://skate-spots.org/map)해봐. 🛹', + foundTitle: '{{emoji}} **{{count}}**개의 {{label}} 찾음:\n{{lines}}{{more}}', + moreResults: '\n\n…그리고 **{{count}}**개 더 — [지도에서 모두 보기](https://skate-spots.org/map) 🗺️', + locationDenied: "네 위치를 볼 수 없어 — 아무것도 기기를 떠나지 않아; 네가 요청할 때만 로컬에서 읽는데 브라우저가 거절한 거야. 지도에서 🎯 **내 주변**을 탭하거나, 도시를 말해줘: \"방콕 스팟\". 🛹", + noNearbySpots: '근처에 아직 등록된 스팟이 없어 🦧 — [첫 번째로 하나 올려봐](https://skate-spots.org/create-spot). 🛹', + closestTitle: '지금 너에게 가장 가까운 곳:', + closestFooter: '_네 기기에서 계산됨 — 네 위치는 절대 기기를 떠나지 않았어._', + proNudge: '그건 **Sasquatch Pro** 기능이야 🦧⚡ — Pro면 네 Stash, 크루, 스팟, 리스팅을 읽고, 기어 리스팅, 구매 희망, 스케이트 상태 초안을 작성하고, 여행을 계획할 수 있어. SkateSpots를 무료 & 광고 없이 유지하는 Lightning 서포터 패스야. 상단의 **⚡ Go Pro** 버튼을 탭해 해금해. 🛹', + draftingProPerk: '액션 초안 작성(상태 게시, 기어 등록)은 **Sasquatch Pro** 혜택이야 🦧⚡ — 상단의 **⚡ Go Pro**를 탭해 해금해.', + draftIntro: '초안이야 — 검토하고 탭해서 게시해. 네가 확인하기 전엔 아무것도 공개되지 않아. 🛹', + draftFailed: "초안을 잘 만들지 못했어 — 세부 정보를 다시 말해줘 (예: \"내 Spitfire 휠을 8000 sats에 등록해줘\").", + tripAskCity: "어디로? 도시를 말해줘 (예: \"리스본 3일 일정 짜줘\") 그러면 여행을 짜줄게. 🗺️", + tripEmptyMap: '**{{destination}}**에 아직 지도에 아무것도 없어 🦧 — [skate-spots.org](https://skate-spots.org)에서 첫 번째로 스팟을 올려봐. 현지인이 스팟, 크루 & 이벤트를 추가하면 완전한 여행을 짜줄게.', + tripLocked: '**{{destination}}** 미션을 확정했어 🛹 — 아래에 스팟, 세션, 현지인이 있어. 수정하거나 저장해.', + tripFailed: '지금 라이브 데이터에 연결해 계획하지 못했어. 잠시 후 다시 시도해! 🛹', + tripEmptyMapLocal: '**{{destination}}**에 아직 지도에 아무것도 없어 🦧 — [skate-spots.org](https://skate-spots.org)에서 첫 번째가 되어봐.', + tripMissionLocal: '**{{destination}}** 미션이야 🛹 — 아래에 스팟, 세션 & 현지인이 있어.', + relayFailed: '지금 릴레이가 제때 응답하지 않았어 🛰️ — 보통 느린 연결 때문이지, 스팟이 없는 게 아니야. 잠시 후 다시 시도해봐. 🛹', + couldNotProcess: '음, 처리하지 못했어. 다시 표현해봐!', + freeTierFallback: "그건 AI 추론이 필요해 — **Sasquatch Pro** 기능이야 ⚡🦧\n\n그래도 **스팟, 이벤트, 코치, 크루, 숍, 투어, 기어**는 릴레이에서 바로 찾을 수 있어 — 예를 들어 \"바르셀로나 스팟\"이라고 물어봐 — 그리고 [용어집](/glossary)에 150개 이상의 트릭과 용어가 있어. 상단의 **⚡ Go Pro**를 탭해 AI 답변을 해금해.", + aiDownFallback: "내 AI 두뇌가 지금 공중에 떠 있지만 🦧 — 그래도 도와줄게:\n\n• 🗺️ [지도](/) — 근처 스팟, 숍, 이벤트\n• 🧪 [The Lab](/lab) — 코치, 필머, 편집자\n• 📖 [용어집](/glossary) — 150개 이상의 트릭 & 용어\n• 👥 [크루](/crews) — 네 사람들을 찾아\n\n아니면 **도시**(\"바르셀로나 스팟\")나 **트릭**(\"놀리가 뭐야\")을 말해주면 바로 답해줄게. 🛹", + wentWrong: '내 쪽에서 뭔가 꼬였어. 잠시 후 다시 시도해! 🦧', + publishError: '게시하지 못했어: {{error}}. 잠시 후 다시 시도해.', + unknownError: '알 수 없는 오류', + }, +}; export default koBatch2; diff --git a/src/i18n/ko/batch3.ts b/src/i18n/ko/batch3.ts index 7465a66..aa0d32b 100644 --- a/src/i18n/ko/batch3.ts +++ b/src/i18n/ko/batch3.ts @@ -1,4 +1,1300 @@ -/** ko — batch 3. Filled by the translation pass; empty until then. */ -const koBatch3 = {}; +/** + * Korean (한국어) — batch 3: settingsUi namespace (Pro/support, auth, signup, + * profile, security, relays, notifications, onboarding, about, FAQ, privacy, + * license, glossary, signers, beta disclaimer). + * Skate vocabulary stays English/transliterated (스팟, 샵, 크루, Gear, Stash, + * The Lab, Nostr, Lightning, Zap, 릴레이, sats, NIP-05, NWC, npub, Cashu). + */ +const koBatch3 = { + settingsUi: { + proSupport: { + title: 'Pro & 지원', + subtitle: 'SkateSpots를 무료로 유지하는 선택적 추가 기능', + prepaidTitle: '구독이 아닌 선불', + prepaidBody: '모든 구매는 일회성 Bitcoin/Lightning 결제입니다 — 계정도, 정기 청구도, 보관도 없습니다. 다시 결제하면 이용 기간이 연장됩니다.', + sasquatchTitle: 'Sasquatch Pro', + sasquatchBenefit: '개인 AI 어시스턴트를 사용할 수 있습니다 — 내 Stash, 크루, 리스팅을 읽을 수 있고 — 프로젝트 자금도 지원합니다.', + active: '활성', + activeUntil: '{{date}}까지 활성', + daysLeft: '{{count}}일 남음', + notActive: '비활성', + goPro: 'Pro 시작', + extend: 'Pro 연장', + day: '일', + featuredTitle: '추천 노출', + featuredBenefit: '리스팅을 Pro 배지와 함께 상단으로 올립니다 — Lab 프로필, 이벤트, 샵, 투어 모두 가능합니다.', + featuredHow: '기간 등급은 모든 유형에 적용되며, 기간이 길수록 하루 비용이 낮아집니다. 리스팅을 만들거나 수정할 때 추천 노출을 설정할 수 있습니다.', + featuredUntil: '{{date}}까지', + yourFeatured: '내 추천 노출 리스팅', + noneFeatured: '활성화된 추천 노출이 없습니다.', + freeTitle: '무료 방법', + freeBody: 'AI FAQ와 로컬 검색은 항상 무료이며, sats 수수료 대신 무료 작업증명(proof-of-work)으로 마켓플레이스 리스팅을 게시할 수 있습니다.', + }, + notFound: { + seoTitle: '404 - 페이지를 찾을 수 없음', + seoDescription: '찾으시는 페이지를 찾을 수 없습니다. 홈 페이지로 돌아가 계속 둘러보세요.', + message: '앗! 페이지를 찾을 수 없습니다', + returnHome: '홈으로 돌아가기', + }, + loginArea: { + signUp: '가입하기', + logIn: '로그인', + }, + accountSwitcher: { + switchAccount: '계정 전환', + walletSettings: '지갑 설정', + addAccount: '다른 계정 추가', + logout: '로그아웃', + }, + amberHint: { + defaultAction: '전송', + multiBefore: '서명기가 승인을 요청합니다', + multiTimes: '{{approvals}}회', + multiAfter: '{{action}}하려면 — 암호화된 메시지에서는 정상입니다(수신자당 한 번 승인). 각각 승인해 주세요.', + single: '서명기가 {{action}} 승인을 요청합니다.', + }, + amberCallback: { + processing: 'Amber 로그인 처리 중...', + gotResult: '결과 수신: {{result}}', + noResultDebug: 'Amber에서 결과 없음', + noResultToast: 'Amber에서 결과를 받지 못했습니다. 작업이 취소되었을 수 있습니다.', + validPubkey: '유효한 공개키! 로그인 중...', + loginSuccessful: '로그인 성공!', + loginErrorDebug: '로그인 오류: {{error}}', + invalidResultDebug: '잘못된 결과 형식: {{result}}', + loggedInTitle: '로그인됨', + amberLoginDesc: 'Amber로 로그인했습니다!', + loginFailedTitle: '로그인 실패', + loginFailedDesc: 'Amber 로그인을 완료하지 못했습니다. 다시 시도해 주세요.', + invalidPubkeyDesc: 'Amber에서 잘못된 공개키를 받았습니다.', + sessionLostToast: '세션 데이터가 손실되었습니다. 다시 시도해 주세요.', + eventSignedTitle: '이벤트 서명됨', + eventSignedDesc: 'Amber가 이벤트에 서명했습니다.', + signingFailedTitle: '서명 실패', + signingFailedDesc: 'Amber의 서명된 이벤트를 처리하지 못했습니다.', + operationCompleteTitle: '작업 완료', + operationCompleteDesc: '{{op}} 완료.', + }, + loginDialog: { + loginWithAmber: 'Amber로 로그인 (Android)', + welcomeTitle: 'SkateSpots에 오신 것을 환영합니다', + welcomeSubtitle: '계속하려면 가입하거나 로그인하세요', + newHere: '처음이신가요?', + createFree: '무료 계정을 만드세요. 이메일이 필요 없습니다.', + createAccount: '계정 만들기', + orLogIn: '또는 로그인', + loggedInTitle: '🛹 로그인됨!', + loggedIn: '로그인됨!', + connectedAmber: 'Amber로 연결되었습니다!', + amberLoginFailed: 'Amber 로그인 실패', + amberCancelled: '로그인이 취소되었습니다. "Open Amber"를 눌러 다시 시도하세요.', + amberNotFound: 'Amber를 찾을 수 없습니다. ZapStore에서 Amber가 설치되어 있는지 확인하세요.', + loginFailed: '로그인 실패', + pubkeyError: 'Amber의 16진수 공개키(64자) 또는 npub를 붙여넣으세요', + pairedSigner: '서명기와 페어링되었습니다.', + connectFailed: '서명기에 연결하지 못했습니다.', + openedEncrypted: '암호화된 키를 열었습니다.', + openKeyFailed: '그 키를 열지 못했습니다.', + bunkerPrefix: 'bunker://로 시작해야 합니다', + connectedBunker: 'bunker로 연결되었습니다!', + bunkerFailed: '실패: {{error}}', + checkBunkerUri: 'bunker URI를 확인하세요', + nsecPrefix: 'nsec1로 시작해야 합니다', + invalidNsec: '잘못된 nsec: {{error}}', + checkKey: '키를 확인하세요', + noExtensionTitle: '확장 프로그램을 찾을 수 없음', + noExtensionDesc: 'Alby 또는 다른 NIP-07 확장 프로그램을 설치하세요.', + amberIdleDesc: '키는 Amber 안에 그대로 남습니다. 한 번만 누르세요 — Amber에서 승인하면 여기로 돌아와 로그인됩니다. 복사할 것도 없습니다.', + continueWithAmber: 'Amber로 계속', + noAmberGetIt: 'Amber가 없나요? 받기 →', + waitingAmberTitle: 'Amber 기다리는 중…', + waitingAmberDesc: 'Amber에서 요청을 승인하세요. 돌아오는 즉시 자동으로 로그인됩니다.', + openAmberAgain: 'Amber 다시 열기', + havingTrouble: '문제가 있나요? 키를 직접 입력하세요', + enterPublicKey: '공개키 입력', + enterPublicKeyDescBefore: '자동 흐름이 작동하지 않을 때만. Amber에서: 프로필을 누르세요 →', + copyPublicKey: '공개키 복사', + enterPublicKeyDescAfter: '그런 다음 여기에 붙여넣으세요.', + connect: '연결', + back: '← 뒤로', + signInWithPhone: '휴대폰으로 로그인', + signInWithPhoneDesc: '서명기 앱(Amber, nsec.app)으로 스캔하세요. 키는 휴대폰을 떠나지 않습니다.', + showPairingCode: '페어링 코드 표시', + waitingSigner: '서명기 기다리는 중…', + copyLink: '링크 복사', + orPasteBunker: '또는 bunker URL 붙여넣기', + bunkerTitle: 'Bunker (NIP-46)', + bunkerPasteBefore: '다음을 붙여넣으세요:', + bunkerPasteAfter: 'URI.', + amberInstructions: '설정 → NIP-46 Bunker → 만들기 → 복사', + nsecAppInstructions: '앱 연결 → bunker URI 복사', + secretKeyTitle: '비밀 키', + secretKeyRawDesc: 'Nostr 비밀 키를 직접 붙여넣으세요.', + secretKeyEncDesc: '비밀번호로 보호된 키 백업을 여세요.', + rawNsec: '원본 nsec', + encryptedNip49: '암호화됨 (NIP-49)', + nsecWarning: '⚠️ 신뢰할 수 있는 기기에서만 사용하세요. nsec를 절대 공유하지 마세요.', + login: '로그인', + encSaferDesc: '더 안전함: 비밀번호를 입력할 때까지 키가 암호화된 상태로 유지되므로 클라우드 저장소나 비밀번호 관리자에 백업을 보관해도 안전합니다.', + password: '비밀번호', + openEncryptedKey: '암호화된 키 열기', + browserExtensionTitle: '브라우저 확장 프로그램 (NIP-07)', + browserExtensionDesc: '데스크톱에 가장 적합합니다. Alby, nos2x, Flamingo와 호환됩니다.', + loginWithExtension: '확장 프로그램으로 로그인', + }, + signupDialog: { + download: '다운로드', + stepChoose: '선택', + stepProfile: '프로필', + stepSaveKey: '키 저장', + somethingWrong: '문제가 발생했습니다', + createFailed: '계정을 만들지 못했습니다. 다시 시도해 주세요.', + keySavedTitle: '비밀 키 저장됨!', + keySavedDesc: '키가 안전하게 저장되었습니다.', + downloadFailedTitle: '다운로드 실패', + downloadFailedDesc: '키 파일을 다운로드하지 못했습니다. 직접 복사해 주세요.', + encSavedTitle: '암호화된 백업 저장됨 🔐', + encSavedDesc: '파일과 비밀번호를 모두 보관하세요 — 다시 로그인하려면 둘 다 필요합니다.', + encFailed: '그 키를 암호화하지 못했습니다.', + invalidFileTitle: '잘못된 파일 형식', + invalidFileDesc: '아바타용 이미지 파일을 선택하세요.', + fileTooLargeTitle: '파일이 너무 큽니다', + fileTooLargeDesc: '아바타 이미지는 5MB보다 작아야 합니다.', + avatarUploadedTitle: '아바타 업로드됨!', + avatarUploadedDesc: '아바타가 성공적으로 업로드되었습니다.', + uploadFailedTitle: '업로드 실패', + uploadFailedDesc: '아바타를 업로드하지 못했습니다. 다시 시도해 주세요.', + nameRequiredTitle: '표시 이름 필요', + nameRequiredDesc: '다른 스케이터가 누군지 알 수 있도록 표시 이름을 정하세요. 언제든 변경할 수 있습니다.', + reserveFailedTitle: '그 이름을 예약하지 못했습니다', + reserveFailedDesc: '{{error}} 나중에 설정에서 신청할 수 있습니다.', + profileCreatedTitle: '프로필 생성됨!', + profileCreatedDesc: '프로필이 설정되었습니다.', + profileFailedTitle: '프로필 설정 실패', + profileFailedDesc: '계정은 만들어졌지만 프로필 설정에 실패했습니다. 나중에 업데이트할 수 있습니다.', + welcomeToastTitle: '환영합니다!', + welcomeToastDesc: '계정이 준비되었습니다.', + titleWelcome: 'SkateSpots에 참여하세요', + titleProfile: '프로필 설정', + titleDone: '환영합니다!', + createFreeAccount: '무료 계정 만들기', + createFreeAccountDesc: '이메일도, 전화번호도, 비밀번호도 없습니다. 계정은 Nostr 키입니다 — 어디에 둘지 선택하세요.', + recommended: '권장', + signUpWithAmber: 'Amber로 가입', + signUpWithAmberDesc: '키는 Amber 앱 안에서 생성되고 저장됩니다 — SkateSpots는 절대 접근하지 않습니다. 가장 안전합니다. 한 번만 승인하세요.', + continueWithAmber: 'Amber로 계속', + orQuickWay: '또는 빠른 방법', + quickAccount: '이 기기에 빠른 계정 만들기', + quickAccountDesc: '이 기기에 저장되는 키를 생성합니다. 가장 빠른 시작 — 바로 뒤에 백업을 저장하도록 도와드립니다.', + createQuickAccount: '빠른 계정 만들기', + quickReassurance: '5초면 됩니다 · 이 기기에 저장됨 · 다음 단계에서 백업을 도와드립니다', + preferAnotherSigner: '다른 서명기를 선호하시나요?', + iosDesktopNudge: 'iOS 또는 데스크톱인가요? 서명기 앱이나 브라우저 확장 프로그램이 가장 안전한 방법입니다 —', + seeAllOptions: '모든 옵션 보기', + youreInPickName: '가입 완료! 🛹 다른 스케이터가 알 수 있도록 표시 이름을 정하세요', + changeAnytime: '나중에 언제든 변경할 수 있습니다. 소개와 아바타는 선택 사항입니다.', + publishingProfile: '프로필 게시 중...', + displayName: '표시 이름', + displayNamePlaceholder: '예: Tony, gnarlyGrind, 또는 크루 이름', + displayNameHint: '필수 — SkateSpots 전체에서 표시되는 이름입니다. 언제든 변경할 수 있습니다.', + skateName: 'SkateSpots 이름', + skateNameHint: '무료이며 선택 사항 — 프로필에 ✓로 표시되는 인증된 핸들입니다.', + bio: '소개', + bioPlaceholder: '자신을 소개하세요...', + avatar: '아바타', + uploadAvatar: '아바타 이미지 업로드', + saving: '저장 중...', + saveAndStart: '저장하고 스케이팅 시작', + addNameToContinue: '계속하려면 표시 이름을 입력하세요.', + savingPublishesNote: '저장하면 프로필이 Nostr에 게시됩니다 — 서명기가 한 번 승인을 요청할 수 있습니다.', + youreIn: '가입 완료! 🛹', + oneQuickThing: '시작하기 전에 하나만 빠르게…', + saveLoginKey: '로그인 키 저장', + saveLoginKeyBefore: '이것은', + only: '유일한', + saveLoginKeyAfter: '계정으로 돌아오는 방법입니다 — 이메일도, 비밀번호 재설정도 없습니다. 지금 저장하면 어디서든, 어떤 기기에서든 로그인할 수 있습니다.', + revealSaveKey: '키 공개 및 저장', + recoveryCopied: '복구 코드가 복사되었습니다. 안전한 곳에 보관하세요.', + saved: '저장됨', + treatLikeBoardKeys: '보드 열쇠처럼 다루세요 — 이 코드를 가진 사람은 누구나 계정을 제어할 수 있습니다. 절대 공유하지 마세요.', + hideEncBackup: '암호화된 백업 숨기기', + saveEncBackup: '암호화된 백업 저장', + encBackupBefore: '비밀번호로 보호된 사본 — 클라우드 저장소나 비밀번호 관리자에 보관해도 안전합니다. 파일과', + and: '그리고', + encBackupAfter: '비밀번호가 필요합니다.', + choosePassword: '비밀번호 선택', + saveEncBackupCta: '암호화된 백업 저장', + savedCodeAria: '복구 코드를 저장했습니다', + savedCodeLabel: '복구 코드를 안전한 곳에 저장했습니다 — 비밀번호 관리자 또는 오프라인에 적어 두었습니다.', + letsSkate: '스케이팅 시작', + saveLater: '나중에 설정에서 저장할게요', + advancedSigner: '고급: 대신 서명기 앱 사용', + }, + mnemonic: { + generatedTitle: '복구 구문 생성됨! 🎉', + generatedDesc: '이 12개 단어를 순서대로 적어 두세요. 계정의 열쇠입니다!', + savedTitle: '복구 구문 저장됨!', + savedDesc: '이 파일을 안전한 곳에 보관하세요.', + downloadFailedTitle: '다운로드 실패', + downloadFailedDesc: '파일을 다운로드하지 못했습니다. 직접 복사해 주세요.', + copiedTitle: '클립보드에 복사됨!', + copiedDesc: '복구 구문이 복사되었습니다.', + qrWindowTitle: '복구 구문 QR 코드', + qrHeading: '복구 구문 QR 코드', + qrAlt: '복구 구문 QR 코드', + qrWarning: '이 QR 코드를 안전하게 보관하고 공개하지 마세요!', + qrPrint: 'QR 코드 인쇄', + qrFailedTitle: 'QR 코드 실패', + qrFailedDesc: 'QR 코드를 생성하지 못했습니다.', + accountCreatedTitle: '계정 생성됨! 🎉', + accountCreatedDesc: '모두 완료되었습니다! 복구 구문이 안전하게 보관되었습니다.', + loginFailedTitle: '로그인 실패', + loginFailedDesc: '계정을 만들지 못했습니다. 다시 시도해 주세요.', + verifyFailedTitle: '확인 실패', + verifyFailedDesc: '단어가 일치하지 않습니다. 확인 후 다시 시도해 주세요.', + titlePrefix: '다음으로 계정 만들기:', + titleSuffix: '복구 구문', + twelveWordTitle: '12단어 복구 구문', + twelveWordDesc: '복구 구문은 마스터 비밀번호와 같습니다. 종이에 적어 안전하게 보관하세요. 다른 기기에서 계정에 접근하거나 브라우저 데이터를 지울 때 필요합니다.', + generate: '복구 구문 생성', + useNsecInstead: '대신 고급 nsec 키 사용', + yourPhrase: '복구 구문', + copy: '복사', + download: '다운로드', + qrCode: 'QR 코드', + criticalWarning: '중요 보안 경고', + warnWriteStrong: '적어 두세요', + warnWrite: '종이에 적어 안전하게 보관하세요', + warnNeverShareStrong: '절대 공유하지 마세요', + warnNeverShare: '복구 구문을 누구와도', + warnBackupsStrong: '여러 백업 보관', + warnBackups: '서로 다른 안전한 장소에', + warnAnyoneStrong: '이 구문을 가진 사람은 누구나', + warnAnyone: '영원히 계정을 제어합니다', + warnLoseStrong: '잃어버리면', + warnLose: '계정을 영구히 잃습니다', + savedSecurely: '안전하게 저장했습니다', + verifyTitle: '복구 구문 확인', + verifyDesc: '제대로 저장했는지 확인하기 위해 다음 단어를 입력하세요:', + wordLabel: '{{n}}번째 단어', + wordPlaceholder: '{{n}}번째 단어 입력', + goBack: '뒤로', + verifyCreate: '확인 후 계정 만들기', + completeTitle: '계정 생성됨!', + completeDesc: 'Nostr 계정이 준비되었습니다!', + signerTitle: '권장: 서명기 앱 설정', + signerSubtitle: '키를 더욱 안전하게 보관하세요', + signerDesc: '더 나은 보안을 위해 복구 구문을 여기저기 붙여넣는 대신 전용 서명기 앱을 사용하세요. 서명기 앱은 키를 안전하게 지키면서 어떤 Nostr 앱이든 사용할 수 있게 해줍니다.', + signerCta: '서명기 앱 알아보기', + skip: '나중에 하기', + }, + signupMethod: { + titlePrefix: '가입 방법', + titleSuffix: '선택', + subtitle: '두 방법 모두 안전합니다. 가장 편한 방법을 선택하세요!', + recommended: '권장', + mnemonicTitle: '복구 구문', + mnemonicDesc: '기억하기 쉬운 12개 단어. Bitcoin, Ethereum 및 대부분의 암호화폐 지갑에서 사용하는 업계 표준입니다.', + mnemonicF1: '종이에 적기 쉬움', + mnemonicF2: '다른 Nostr 앱과 호환 (NIP-06)', + mnemonicF3: '여러 계정 생성 가능', + mnemonicF4: '암호화폐 사용자에게 익숙함', + useMnemonic: '복구 구문 사용', + advanced: '고급', + nsecTitle: '비밀 키 (nsec)', + nsecDesc: '원시 암호화 키. 더 기술적이지만 Nostr 신원에 직접 접근할 수 있습니다.', + nsecF1: '직접적인 암호화 제어', + nsecF2: '모든 Nostr 앱과 호환', + nsecF3: '백업할 문자열 하나', + nsecF4: '파생 계층 없음', + useNsec: '비밀 키 사용', + footer: '🔒 두 방법 모두 똑같이 안전합니다. 선호에 따라 선택하세요!', + }, + skateNip05: { + placeholder: 'yourname', + claimedSuffix: '은(는) 내 것입니다 — 프로필을 저장하면 게시됩니다.', + checking: '사용 가능 여부 확인 중…', + available: '{{name}}@{{domain}}을(를) 사용할 수 있습니다', + claim: '신청하기', + hint: '문자, 숫자, 대시. 무료이며 프로필에 ✓ 배지로 표시됩니다.', + }, + nip05Required: { + getFree: '무료 / 저렴한 NIP-05 받기', + paid: '유료', + requiredTitle: 'NIP-05 인증 필요', + bannerReason: '스팸을 방지하고 신뢰를 쌓기 위해 {{role}}에게는 인증된 Nostr 주소(NIP-05)가 필요합니다.', + gateReason: '스팸을 방지하고 신뢰를 쌓기 위해 {{role}}은(는) NIP-05 인증이 있어야 합니다.', + addInSettings: '설정에서 NIP-05 추가', + explainer: 'NIP-05는 Nostr 프로필을 도메인에 연결해 신원을 증명합니다 — 예:', + updateProfile: '프로필 업데이트', + }, + editProfile: { + uploadSuccessTitle: '성공', + uploadSuccessDesc: '{{field}} 업로드 완료', + uploadErrorDesc: '{{field}}을(를) 업로드하지 못했습니다. 다시 시도해 주세요.', + mustBeLoggedIn: '프로필을 업데이트하려면 로그인해야 합니다', + invalidClinkTitle: '잘못된 CLINK 코드', + invalidClinkDesc: '유효한 noffer1… 코드가 아닌 것 같습니다. 지우거나 유효한 코드를 붙여넣으세요.', + invalidLightningTitle: '잘못된 Lightning 주소', + invalidLightningDesc: 'you@walletofsatoshi.com 같은 이메일 형식 주소를 사용하세요.', + invalidSpTitle: '잘못된 Silent Payment 주소', + invalidSpDesc: 'Silent Payment 주소는 "sp1"로 시작하며 상당히 깁니다. 지우거나 유효한 주소를 붙여넣으세요.', + invalidCordnTitle: '잘못된 Cordn 링크', + invalidCordnDesc: '전체 https://… Cordn 연락처 링크를 붙여넣으세요.', + updateSuccessTitle: '성공', + updateSuccessDesc: '프로필이 업데이트되었습니다', + updateErrorDesc: '프로필을 게시하지 못했습니다. 설정 > 릴레이에서 릴레이 연결을 확인하세요', + identityTitle: '신원', + identityDesc: 'SkateSpots 전체에서 표시되는 방식.', + displayName: '표시 이름', + displayNamePlaceholder: '이름', + bio: '소개', + bioPlaceholder: '나와 스케이팅에 대한 짧은 소개…', + profilePicture: '프로필 사진', + pictureDesc: '정사각형 이미지를 업로드하거나 붙여넣으세요.', + bannerImage: '배너 이미지', + bannerDesc: '프로필 상단에 들어갈 가로로 넓은 이미지.', + website: '웹사이트', + bitcoinTitle: 'Bitcoin & 결제', + bitcoinDesc: '사람들이 나에게 직접 Zap, 팁, 결제를 보낼 수 있습니다 — 중개자 없음.', + lightningAddress: 'Lightning 주소', + lud16Invalid: '이메일 형식 주소(예: you@yourdomain.com)를 사용하세요.', + lud16Ok: '프로필의 “Zap” 버튼을 작동시킵니다.', + lud16Hint: '즉시 Bitcoin 팁. 프로필의 “Zap” 버튼을 작동시킵니다.', + silentPaymentAddress: 'Silent Payment 주소', + spInvalid: '“sp1”로 시작하며 상당히 길어야 합니다.', + spOk: '유효함 — 재사용 가능한 프라이빗 온체인 주소.', + spHint: '재사용 가능한 고정 온체인 주소(BIP-352). 한 번만 공유하면 모든 결제가 연결 불가능합니다.', + clinkTipCode: 'CLINK 팁 코드', + nofferInvalid: '유효한 noffer1… 코드가 아닌 것 같습니다.', + nofferOk: '유효함 — 프로필에 “Tip in Bitcoin” 버튼이 표시됩니다.', + nofferHint: '자기 보관형 CLINK 코드로 누구나 Nostr를 통해 나에게 팁을 보낼 수 있습니다 — 중개자 없음.', + skateProfileTitle: '스케이트 프로필', + skateProfileDesc: '스폰서를 알리고 크루가 나에게 연락하는 방법.', + badges: '배지', + badgesHint: '(라벨 + 선택적 링크)', + badgeExample: '예: Independent Trucks', + badgeLabelPlaceholder: '배지 라벨…', + badgeUrlPlaceholder: 'https://… (선택)', + removeBadge: '배지 제거', + addBadge: '배지 추가', + badgesDescBefore: '스케이팅을 후원하는 스폰서, 샵, 사람들 — 그리고 자랑하고 싶은 무엇이든. 각각 프로필에 클릭 가능한 칩으로 표시됩니다. 회원', + badgesDescAfter: '배지는 자동으로 추가됩니다.', + coordinator: 'Coordinator', + cordnInvalid: '코디네이터가 아닌 것 같습니다. nprofile, cordn.net 링크 또는 https:// URL을 붙여넣으세요.', + cordnOk: '프로필에 표시됩니다 — 다른 사람이 한 번의 탭으로 추가할 수 있습니다.', + cordnHint: '다른 사람이 나에게 메시지를 보낼 때 사용하는 Cordn 코디네이터. 프라이빗하고 암호화되어 있으며 내 것입니다.', + useMyCoordinator: '내 코디네이터 사용', + accountTitle: '계정', + accountDesc: '추가 계정 설정.', + botAccount: '봇 계정', + botAccountDesc: '이 계정을 자동화 또는 봇으로 표시합니다.', + saving: '저장 중…', + saveProfile: '프로필 저장', + nip05VerifiedHandle: 'NIP-05 인증 핸들', + nip05How: '어떻게?', + extraHandles: '추가 핸들', + extraHandlesHint: '선택 — 최대 5개 추가', + nip05HintEmpty: 'you@yourdomain.com 같은 인증된 핸들 — Nostr판 블루 체크입니다. 프로필에 ✓ 배지를 표시하고 스케이터 디렉터리의 “Verified” 필터를 사용할 수 있게 합니다.', + nip05Invalid: '이메일 형식 핸들(예: you@yourdomain.com)을 사용하세요 — “https://”나 공백은 안 됩니다.', + nip05Checking: '도메인 확인 중…', + nip05Verified: '인증됨 — 도메인이 이 핸들이 내 것임을 확인합니다. ✓', + nip05Mismatch: '도메인이 이 핸들을 다른 키에 매핑합니다. 이 계정을 가리키도록 .well-known/nostr.json을 수정하세요.', + nip05Unreachable: '아직 도메인의 /.well-known/nostr.json에 접근할 수 없습니다. 도메인이 올바르게 설정되면 저장된 핸들이 작동합니다.', + nip05Enter: 'NIP-05 핸들을 입력하세요.', + freeHandleBefore: '자체 도메인이 없나요? 무료', + freeHandleAfter: '핸들을 SkateSpots에서 신청하세요.', + uploadLabel: '{{label}} 업로드', + previewLabel: '{{label}} 미리보기', + }, + security: { + recoveryCopied: '복구 코드가 복사되었습니다. 안전한 곳에 보관하세요.', + savedTitle: '저장됨!', + recoveryDownloaded: '복구 코드가 다운로드되었습니다. 안전한 곳에 보관하세요.', + downloadFailedTitle: '다운로드 실패', + downloadFailedDesc: '대신 직접 복사해 주세요.', + loginRequired: '로그인 필요', + loginRequiredDesc: '보안 설정에 접근하려면 로그인하세요.', + backupConfirmedTitle: '백업 확인됨! ✅', + backupConfirmedDesc: '좋습니다! 키가 안전합니다.', + yourRecoveryCode: '복구 코드', + recoveryCodeDesc: '가입할 때 저장하지 않았나요? 언제든 여기서 가져올 수 있습니다.', + recoveryCodeBefore: '이 코드는', + only: '유일한', + recoveryCodeAfter: '새 기기나 브라우저에서 다시 로그인하는 방법입니다. 안전한 곳(비밀번호 관리자 또는 종이)에 보관하세요. 이 코드를 가진 사람은 계정을 제어합니다 — 절대 공유하지 마세요.', + revealRecovery: '복구 코드 공개', + qrHint: '다른 Nostr 앱으로 스캔해 로그인하세요. 이 화면을 비공개로 유지하세요.', + neverShareHide: '⚠️ 절대 공유하지 마세요. 끝나면 숨기세요.', + hide: '숨기기', + amberNoteBefore: '다음으로 로그인했습니다:', + amberNoteAfter: '. 복구 코드는 Amber 안에 있습니다 — 백업하려면 Amber 앱을 여세요. SkateSpots는 키를 절대 보지 않습니다.', + bunkerNoteBefore: '다음으로 로그인했습니다:', + remoteSigner: '원격 서명기 (bunker)', + bunkerNoteAfter: '. 복구 코드는 SkateSpots가 아닌 서명기 서비스가 보관합니다. 거기서 백업하세요.', + extensionNoteBefore: '다음으로 로그인했습니다:', + browserExtension: '브라우저 확장 프로그램', + extensionNoteAfter: '. 복구 코드는 확장 프로그램 안에 있습니다 — 자체 백업/내보내기 옵션을 사용하세요. SkateSpots는 키를 절대 보지 않습니다.', + otherNote: '복구 코드는 SkateSpots가 아닌 서명기 앱이 관리합니다. 거기서 백업하세요.', + backupWarningTitle: '⚠️ 복구 구문이나 비밀 키를 백업했나요?', + backupWarningBody: '키는 계정에 접근하는 유일한 방법입니다. 잃어버리면 모든 것을 잃습니다 — 비밀번호 재설정은 없습니다!', + iveBackedUp: '키를 백업했습니다', + backupConfirmed: '✅ 백업 확인됨', + backupNotConfirmed: '⚠️ 백업 미확인', + backupConfirmedStatusDesc: '키가 안전하게 백업되었음을 확인했습니다.', + backupNotConfirmedDesc: '복구 구문이나 비밀 키를 반드시 백업하세요!', + notSavedYetBefore: '아직 복구 코드를 저장하지 않았나요? 괜찮습니다 — 위의', + notSavedYetAfter: '섹션에서 가져와 안전한 곳에 보관한 뒤 아래에서 확인하세요.', + yesBackedUp: '예, 키를 백업했습니다', + bestPracticesTitle: '키 보안 모범 사례', + bestPracticesDesc: 'Nostr 계정을 안전하게 지키는 방법', + bp1Title: '종이에 적어 두세요', + bp1Desc: '물리적 백업이 가장 안전합니다. 금고 같은 안전한 장소에 보관하세요.', + bp2Title: '여러 개의 백업', + bp2Desc: '서로 다른 안전한 장소(집 금고, 은행 대여금고 등)에 사본을 보관하세요', + bp3Title: '키를 절대 공유하지 마세요', + bp3Desc: '진짜 Nostr 앱은 최초 로그인 후 nsec나 복구 구문을 절대 요구하지 않습니다', + bp4Title: '암호화하지 않은 채 클라우드에 저장하지 마세요', + bp4Desc: 'Google Docs, 이메일 임시저장, 일반 텍스트 클라우드 저장은 피하세요', + bp5Title: '브라우저 확장 프로그램 사용 고려', + bp5Desc: 'Alby, nos2x, Flamingo는 키를 안전하게 지키고 웹사이트에 노출하지 않습니다', + importantReminders: '⚠️ 중요 알림', + rem1: '키를 잃으면 계정을 영구히 잃습니다', + rem2: '어떤 회사나 개인도 비밀번호를 재설정할 수 없습니다 — 우리조차도요', + rem3: '키를 가진 사람은 누구나 계정을 완전히 제어합니다', + rem4: '키는 모든 앱의 모든 Nostr 데이터를 제어합니다', + recommendedSigners: '🔌 권장 Nostr 서명기', + recommendedSignersDesc: '더 나은 보안과 편의를 위해 Nostr 서명기를 사용하세요', + recommended: '권장', + amberDesc: 'Android용 안전한 Nostr 서명기. 휴대폰에서 키를 안전하게 보관하고 노출 없이 이벤트에 서명합니다.', + albyDesc: 'Lightning 지갑, WebLN, NWC를 지원하는 모든 기능을 갖춘 확장 프로그램.', + flamingoDesc: '간결하고 깔끔한 인터페이스. 지갑 기능 없이 Nostr 서명에 집중합니다.', + nos2xDesc: '고급 사용자를 위한 최소한의 가벼운 확장 프로그램.', + nostrConnectTitle: '☁️ Nostr Connect (원격 서명기)', + nostrConnectDesc: '원격 서명기로 어떤 기기에서든 계정에 접근하세요', + nostrConnectBody: 'Nostr Connect("bunker"라고도 함)를 사용하면 키를 보안 서버에 보관하고 어떤 기기에서든 로그인할 수 있습니다. 키는 서버를 떠나지 않지만 어디서든 계정을 사용할 수 있습니다!', + nsecAppDesc: '무료이고 안전한 원격 서명기. bunker:// URI를 만들어 로그인할 때 붙여넣으세요.', + nostrumDesc: '모바일을 지원하는 또 다른 원격 서명기 옵션.', + howToUse: '💡 사용 방법:', + howToUseDesc: '이 서비스 중 하나에서 계정을 만들고 bunker:// 연결 문자열을 받은 뒤, 로그인할 때 "Nostr Connect" 탭에 붙여넣으세요.', + }, + relayList: { + connected: '연결됨', + connecting: '연결 중…', + offline: '오프라인', + removeUrl: '{{url}} 제거', + add: '추가', + publishedTitle: '릴레이 목록 게시됨', + publishedDesc: 'Nostr에 동기화됨 (kind 10002).', + publishFailedTitle: '릴레이 목록 게시 실패', + invalidUrlTitle: '잘못된 릴레이 URL', + invalidUrlDesc: 'wss://relay.example.com 같은 형식을 시도하세요', + alreadyInList: '릴레이가 이미 목록에 있습니다', + keepReadWriteTitle: '읽기 또는 쓰기 중 하나는 켜 두세요', + keepReadWriteDesc: '릴레이는 읽기/쓰기 중 최소 하나가 필요합니다.', + alreadyInThisList: '릴레이가 이미 이 목록에 있습니다', + dmPublishedTitle: 'DM 릴레이 게시됨', + dmPublishedDesc: 'NIP-17 받은편지함이 업데이트되었습니다.', + dmPublishFailedTitle: 'DM 릴레이 게시 실패', + nip65Title: '릴레이 (NIP-65)', + nip65DescUser: 'Read / Write를 눌러 전환하세요. kind 10002 목록으로 Nostr에 게시됩니다.', + nip65DescLoggedOut: 'Read / Write를 눌러 전환하세요. 로그인하면 목록이 Nostr에 게시됩니다.', + noRelays: '아직 릴레이가 없습니다 — 아래에서 추가하세요.', + local: '로컬', + read: '읽기', + readHint: '이 릴레이에서 콘텐츠를 가져옵니다', + write: '쓰기', + writeHint: '이 릴레이에 이벤트를 게시합니다', + dmTitle: 'DM 받은편지함 릴레이', + dmDesc: 'NIP-17 다이렉트 메시지를 받는 곳입니다 (kind 10050). 비어 있으면 쓰기 릴레이로 대체됩니다.', + localTitle: '로컬 릴레이', + localDesc: '앱 전용(예: LAN 노드). 읽기와 쓰기에 사용되며 절대 게시되지 않습니다.', + blockedTitle: '차단된 릴레이', + blockedDesc: '이 릴레이에는 절대 연결하지 않습니다 — 모든 읽기와 쓰기에서 제외됩니다.', + }, + relatr: { + searchingTitle: 'Relatr 서비스 검색 중...', + searchingDesc: 'Nostr에서 Relatr 프로필 조회 중', + foundTitle: 'Relatr 서비스를 찾았습니다!', + foundDesc: '서비스: {{name}}', + unknown: '알 수 없음', + notFoundTitle: 'Relatr 서비스를 찾을 수 없음', + notFoundDesc: '공개키를 직접 입력하거나 https://www.relatr.xyz/를 확인하세요', + searchFailedTitle: '검색 실패', + searchFailedDesc: 'Nostr에서 Relatr 프로필을 조회하지 못했습니다', + invalidPubkeyTitle: '잘못된 공개키', + invalidPubkeyDesc: '유효한 64자 16진수 공개키를 입력하세요', + enabledTitle: 'Relatr 활성화됨!', + enabledDesc: '글로벌 신뢰 점수가 활성화되었습니다.', + disabledTitle: 'Relatr 비활성화됨', + disabledDesc: '더 이상 신뢰 점수를 가져오지 않습니다.', + title: 'Relatr 신뢰 점수', + desc: '글로벌 신뢰 점수는 신뢰할 수 있는 사용자를 식별하고 스팸을 줄이는 데 도움이 됩니다', + status: '상태', + active: '활성', + disabled: '비활성', + activeStrong: 'Relatr가 활성화되어 있습니다.', + activeDesc: 'ContextVM의 글로벌 네트워크 분석에서 나온 신뢰 점수는 신뢰할 수 있는 스케이터를 식별하고 스팸을 줄이는 데 도움이 됩니다.', + disabledStrong: 'Relatr가 비활성화되어 있습니다.', + disabledHint: '활성화하면 글로벌 Nostr 네트워크에서 신뢰 점수를 받습니다.', + disable: 'Relatr 비활성화', + enable: 'Relatr 활성화', + advancedSettings: '고급 설정', + servicePubkey: 'Relatr 서비스 공개키', + pubkeyPlaceholder: '64자 16진수 공개키 입력...', + searching: '검색 중...', + autoDiscover: '자동 검색', + pubkeyDefault: '기본: ContextVM 공식 Relatr 서비스 (npub1dvmc...)', + relayLabel: '릴레이 (Relatr가 점수를 게시하는 곳)', + relayDefault: '기본: wss://relay.contextvm.org (ContextVM 공식 릴레이)', + applyChanges: '변경 사항 적용', + learnMore: '자세히 알아보기:', + website: 'Relatr 웹사이트', + github: 'Relatr GitHub', + nip85Spec: 'NIP-85 사양', + }, + followList: { + unfollow: '팔로우 취소', + title: '내 Nostr 네트워크', + desc: '팔로우하는 사람을 관리하세요. 사용자를 팔로우하면 신뢰망(Web of Trust)이 형성되고 어떤 스팟에 신뢰 배지가 표시될지 결정됩니다.', + following: '팔로잉 ({{count}})', + followers: '팔로워 ({{count}})', + follow: '팔로우', + followHint: '💡 Nostr 공개키(npub1...), NIP-05 주소(user@domain.com) 또는 16진수 공개키를 붙여넣으세요', + notFollowing: '아직 아무도 팔로우하지 않았습니다', + notFollowingHint: '스케이터를 팔로우하면 그들의 스팟을 ✅ VERIFIED 배지와 함께 볼 수 있습니다', + trustActiveStrong: '✅ 신뢰 배지 활성:', + trustActive: '팔로우한 사람이 만든 스팟에 VERIFIED 배지가 표시됩니다. 그들의 친구가 만든 스팟에는 TRUSTED 배지가 표시됩니다.', + noFollowers: '아직 팔로워가 없습니다', + noFollowersHint: 'Nostr 프로필을 공유해 팔로워를 늘리세요!', + howTitle: '💡 팔로우가 신뢰 배지에 미치는 영향', + verifiedStrong: '✅ VERIFIED (초록):', + verifiedDesc: '내가 직접 팔로우한 사람이 만든 스팟', + trustedStrong: '🟡 TRUSTED (노랑):', + trustedDesc: '친구가 팔로우한 사람(2단계)이 만든 스팟', + unverifiedStrong: '⚪ 미인증:', + unverifiedDesc: '내 네트워크와 연결이 없는 사용자의 스팟', + tip: '💡 팁: 활동적인 스케이터를 팔로우하면 더 많은 인증된 스팟을 보고 신뢰 네트워크를 키울 수 있습니다!', + }, + notify: { + enableTitle: '알림 활성화', + enableDesc: '무언가 확인할 일이 생기면 이 기기를 울립니다.', + checkingPermission: '권한 확인 중…', + unsupported: '이 기기에서는 여기서 알림을 지원하지 않습니다. 휴대폰에서 활성화하려면 Android 앱을 다시 빌드하세요.', + denied: '이 사이트에 대한 알림이 차단되어 있습니다. 브라우저/OS 설정에서 허용한 뒤 다시 시도하세요.', + backgroundTitle: '백그라운드 알림', + backgroundDesc: 'SkateSpots가 닫혀 있어도 메시지와 거래 알림을 받습니다.', + pushUnsupported: '이 브라우저는 백그라운드 푸시를 지원하지 않습니다. 모바일에서는 SkateSpots를 홈 화면에 추가하세요.', + pushPrivacy: '앱이 닫혀 있을 때 알림을 보내기 위해, 내 키로 무언가 도착하면 SkateSpots 알림 서버가 릴레이에서 핑을 받아 휴대폰의 푸시 서비스로 전달합니다. 서버는 내 키에 뭔가 있다는 것만 알 뿐 — 누가 보냈는지, 무엇이라고 쓰여 있는지는 전혀 알지 못하며 메시지를 복호화할 수 없습니다. 기기별로 선택할 수 있습니다.', + bgDeliveryTitle: '백그라운드 전달 (Android)', + bgDeliveryDesc: '앱이 닫혀 있는 동안 새 메시지, 제안, 거래를 확인합니다 — Google 서비스 없이.', + off: '끔', + standard: '표준 (약 15분)', + fast: '빠름 (약 5분)', + bgDeliveryNote: '표준은 최선형이며 — Android가 Doze 상태에서 지연시킬 수 있습니다. 빠름은 상시 알림을 표시하고 배터리를 더 사용합니다. 서버에서는 아무것도 복호화되지 않습니다.', + notifyMeAbout: '다음에 대해 알림', + couldNotEnable: '활성화할 수 없음', + sendTest: '테스트 알림 보내기', + testTitle: 'SkateSpots 알림이 켜졌습니다 🛹', + testBody: 'DM, Zap, 크루 초대가 이렇게 표시됩니다.', + footerBefore: '알림은 앱이 이미 가진 데이터로 기기에서 생성되며, 다이렉트 메시지 알림은 메시지를 절대 복호화하지 않습니다 — 따라서 Amber가 열기를 요청받는 일이 없습니다. ', + footerAfter: '이 꺼져 있으면 완전히 닫힌 앱에는 닿을 수 없어, 다음에 SkateSpots를 열 때 알림이 도착합니다.', + cat_dms_label: '다이렉트 메시지', + cat_dms_hint: '누군가 나에게 비공개 메시지를 보냄', + cat_crew_label: '크루', + cat_crew_hint: '초대, 가입 요청, 멤버십 확인', + cat_social_label: 'Zap, 답글 & 멘션', + cat_social_hint: '리액션, 리포스트, Zap, 답글, 이벤트 업데이트', + cat_newsletter_label: '뉴스레터', + cat_newsletter_hint: '새로운 SkateSpots 소식 (구독자 전용)', + cat_trades_label: '제안 & 거래', + cat_trades_hint: '제안, 역제안, 거래 확인', + cat_reminders_label: '이벤트 알림', + cat_reminders_hint: '참석하는 이벤트 1시간 전 알림 (Android 앱)', + }, + regionBackfill: { + taggedTitle: '위치 {{count}}곳{{s}} 태그함', + taggedSkipped: '{{count}}곳 건너뜀 (좌표 없음 또는 지오코더 일치 없음).', + taggedOk: '지역 태그가 커뮤니티 릴레이에 기록되었습니다.', + nothingTitle: '태그할 항목 없음', + nothingDesc: '지오코딩할 수 있는 핀이 없습니다. 나중에 다시 시도하세요.', + failedTitle: '백필 실패', + title: '지역 태그 백필', + admin: '관리자', + descBefore: '지오코딩 도입 전에 만든 핀은 좌표는 있지만 도시/국가 태그가 없어, 지도에는 표시되지만 커뮤니티 통계는 “Uncategorised”로만 표시합니다. 각 핀에서 태그를 다시 도출해 다시 게시합니다:', + descStrong: '내 소유의', + descAfter: '태그 없는 스팟 & 샵.', + scanning: '스팟 검색 중…', + allTagged: '내가 소유한 모든 스팟 & 샵에 이미 지역 태그가 있습니다. 🎉 남은 “Uncategorised” 핀은 다른 매퍼의 것이며 — 각자의 키로만 태그할 수 있습니다.', + countLine: '내 스팟/샵 {{count}}곳{{s}}에 지역 태그가 없습니다. 서명기가 각각 승인을 요청할 수 있습니다.', + tagging: '태그 중 {{done}}/{{total}}…', + run: '지역 태그 백필', + summary: '{{updated}}개 업데이트 · {{skipped}}개 건너뜀 · {{failed}}개 실패', + }, + adminReview: { + title: '검토 대기열', + flagged: '{{count}}개의 스팟{{s}}이 정크 신호에 걸렸습니다 — 숨기거나 무시하세요.', + clean: '테스트 항목이나 주제와 무관한 핀처럼 보이는 스팟.', + }, + grantPro: { + invalidNpub: '유효한 npub(또는 16진수 공개키)를 입력하세요', + invalidDays: '일수는 양수여야 합니다', + grantedTitle: 'Pro 부여됨 ⚡', + grantedDesc: '{{npub}} · {{date}}까지', + failedTitle: '부여 실패', + title: 'Sasquatch Pro 부여', + owner: '소유자', + desc: 'Zap 영수증이 놓친 인증된 결제를 위한 수동 대체 수단. 소유자가 서명한 부여를 게시하며 사용자는 위조할 수 없습니다.', + targetPlaceholder: 'npub1… (또는 16진수)', + grant: '부여', + }, + myData: { + reactionTitle: '{{emoji}} 리액션', + deleting: '삭제 중...', + requestDeletion: '삭제 요청', + selectContentTitle: '삭제할 콘텐츠 선택', + selectContentDesc: '삭제를 요청할 특정 항목을 선택하세요.', + all: '전체', + spots: '스팟', + events: '이벤트', + shops: '샵', + listings: '리스팅', + collections: '컬렉션', + lab: 'Lab', + posts: '게시물', + reactions: '리액션', + selectAll: '전체 선택', + selectAllVisible: '보이는 항목 전체 선택', + selectedCount: '{{count}}개 선택됨', + noItemsCategory: '이 카테고리에 항목이 없습니다', + decentralizedStrong: '중요:', + decentralizedNote: 'Nostr는 탈중앙화되어 있습니다. 릴레이는 삭제 요청을 존중해야 하지만 일부는 그렇지 않을 수 있습니다. 영구 삭제가 보장되지는 않습니다.', + deleteCount: '{{count}}개 항목{{s}} 삭제', + noDataTitle: '내보낼 데이터 없음', + noDataDesc: '아직 게시한 이벤트가 없습니다.', + exportedTitle: '데이터 내보내기 완료!', + exportedDesc: '{{count}}개 이벤트를 JSON으로 다운로드했습니다.', + deletionRequestedTitle: '삭제 요청됨', + deletionRequestedDesc: '삭제 요청이 릴레이에 게시되었습니다.', + deletionRequestedMany: '{{count}}개 항목의 삭제를 요청했습니다. 참고: 일부 릴레이는 이 요청을 존중하지 않을 수 있습니다.', + deletionFailedTitle: '삭제 실패', + deletionFailedDesc: '삭제 요청을 게시하지 못했습니다. 다시 시도해 주세요.', + loginRequired: '로그인 필요', + loginRequiredDesc: '데이터를 보고 관리하려면 로그인하세요.', + title: '내 데이터', + desc: 'Nostr 네트워크에 있는 내 콘텐츠. 이 데이터는 내 소유입니다 — 언제든 내보내거나 삭제를 요청하세요.', + coachFilmer: '코치/필머', + zaps: 'Zap', + received: '받음', + exportAll: '모든 데이터 내보내기', + recentActivity: '최근 활동', + viewAll: '전체 보기 ({{count}})', + noDataPublished: '아직 게시된 데이터가 없습니다', + startBy: '다음으로 시작하세요:', + addingASpot: '스팟 추가', + aboutYourData: '내 데이터 정보', + ownDataStrong: '데이터는 내 소유입니다.', + ownData: '모든 콘텐츠는 내 암호화 키로 서명되어 Nostr 릴레이에 저장됩니다. 어떤 회사도 이를 통제하지 않습니다.', + exportAnytimeStrong: '언제든 내보내기', + exportAnytime: '- 모든 이벤트를 JSON으로 다운로드', + portableStrong: '휴대 가능', + portable: '- 어떤 Nostr 앱에서든 키 사용', + selectiveStrong: '선택적 삭제', + selective: '- 삭제할 항목을 정확히 선택', + caveatStrong: '탈중앙화 주의사항', + caveat: '- 일부 릴레이는 삭제 요청에도 데이터를 보관할 수 있습니다', + }, + settingsPage: { + seoTitle: '설정 - SkateSpots', + seoDescription: 'SkateSpots 계정 설정을 관리하세요.', + heading: '설정', + subtitle: '계정 및 앱 환경설정', + editProfile: '프로필 편집', + profileRefreshed: '프로필 새로고침됨!', + found: '찾음: {{name}}', + unnamed: '이름 없음', + profileNotFound: '프로필을 찾을 수 없음', + notFoundOnRelay: '어떤 릴레이에서도 찾을 수 없습니다.', + refreshFailed: '새로고침 실패', + refreshFailedDesc: '릴레이에 연결하지 못했습니다.', + loginToEdit: '프로필을 편집하려면 로그인하세요', + noProfileRelays: '릴레이에서 프로필을 찾지 못했습니다. 이전에 설정한 적이 있다면 새로고침해 보세요.', + checkDisplayName: '표시 이름', + checkPhoto: '프로필 사진', + checkBio: '짧은 소개', + checkLightning: '사람들이 나에게 Zap할 수 있는 Lightning 주소', + checkHandle: '무료 @skate-spots.org 핸들', + finishProfile: '프로필 완성하기', + addItem: '{{item}} 추가', + nip05Title: 'NIP-05 인증', + nip05Desc: '신뢰를 쌓기 위해 인증된 Nostr 주소(예: name@domain.com)를 받으세요. 이벤트, 코칭 프로필, 샵을 만드는 데 필요합니다.', + freeFromSkateSpots: 'SkateSpots에서 무료', + claimHandleBefore: '다음과 같은 핸들을 신청하세요:', + claimHandleAfter: '— 가입도, 비용도, 운영할 도메인도 필요 없습니다. 프로필 탭에서 신청한 뒤 저장하세요.', + claimInProfile: '프로필에서 신청', + nip05Footer: 'NIP-05를 받은 후 프로필 필드에 추가하고 저장하세요.', + localRelayOn: '로컬 릴레이 켜짐', + localRelayOff: '로컬 릴레이 꺼짐', + lookingForCitrine: '이 기기에서 Citrine 찾는 중…', + noLongerUsing: '더 이상 기기 내 릴레이를 사용하지 않습니다.', + localRelay: '로컬 릴레이', + citrineOff: '이 기기에서 더 빠른 읽기 & 오프라인 백업', + citrineSearching: '이 기기에서 Citrine 검색 중…', + citrineLive: '연결됨 — 로컬에서 읽기 & 백업 중', + citrineWaiting: '활성화됨 — 연결하려면 Citrine을 시작하세요', + toggleCitrine: '로컬 Citrine 릴레이 전환', + citrineDetected: 'Citrine 릴레이 감지됨', + citrineLooking: 'Citrine 찾는 중…', + citrineNotDetected: 'Citrine 감지되지 않음', + recheckCitrine: 'Citrine 릴레이 다시 확인', + checking: '확인 중', + recheck: '다시 확인', + chipInstantReads: '즉시 읽기', + chipWorksOffline: '오프라인 작동', + chipOnDeviceBackup: '기기 내 백업', + cantReachStrong: 'Citrine에 접근할 수 없습니다.', + cantReachBefore: '무료 Citrine 앱이 설치되어 있고 릴레이가', + started: '시작되었는지 확인하세요', + cantReachAfter: ', 그런 다음 다시 확인을 누르세요. 휴대폰에서 프라이빗 Nostr 릴레이를 실행해 즉시 읽기와 오프라인 백업을 제공합니다.', + citrineStep1Before: 'Citrine 열기 → 누르기:', + start: '시작', + citrineStep2Before: '여기로 돌아오기 → 누르기:', + getCitrine: 'Citrine 받기', + citrinePrivacy: 'Stash와 메시지는 다른 곳과 마찬가지로 여기서도 종단간 암호화됩니다. 로컬 릴레이는 속도를 높이고 기기에 사본을 보관할 뿐 — 암호화를 대체하지 않습니다.', + communityRelayDisabled: '커뮤니티 릴레이 비활성화됨', + communityRelayEnabled: '커뮤니티 릴레이 활성화됨', + usingOnlyPersonal: '설정한 릴레이만 사용합니다.', + skateRelayIncluded: 'SkateSpots 릴레이 포함됨.', + relays: '릴레이', + relayPrivacyBefore: '릴레이는 내', + ipAddress: 'IP 주소', + relayPrivacyAfter: '를 연결 시 볼 수 있습니다. Tor는 이를 숨겨줍니다 — 그리고 "무료" VPN은 경고 신호로 여기세요; 보통 트래픽으로 수익을 냅니다.', + communityRelay: '커뮤니티 릴레이', + syncingGlobal: '글로벌 스케이트 커뮤니티와 동기화 중', + usingOnlyPersonalShort: '개인 릴레이만 사용 중', + appearance: '모양', + language: '언어', + darkModeOnly: '다크 모드 전용', + darkModeDesc: 'SkateSpots는 스케이트 문화에서 영감을 받은 다크 네온 미학을 사용합니다. 검은 배경, 네온 핑크, 라임, 오렌지.', + navigation: '내비게이션', + sasquatchExpanded: 'The Sasquatch가 확장되었습니다! 🦧 보려면 페이지를 새로고침하세요.', + advanced: '고급', + sasquatchGuide: '🦧 Sasquatch 가이드', + sasquatchResetDesc: '온보딩 가이드를 확장 뷰로 초기화', + expandSasquatch: 'The Sasquatch 확장', + wallet: '지갑', + loginToWallet: '지갑을 관리하려면 로그인하세요', + openWallet: '지갑 열기', + balanceSendReceive: '잔액, 보내기, 받기', + connectNwc: 'NWC 지갑 연결', + account: '계정', + security: '보안', + securitySub: '키, 서명, Amber', + nip05Sub: '인증된 Nostr 주소 받기', + app: '앱', + myStash: 'My Stash', + myStashSub: '프라이빗 Gear 인벤토리', + relaysSub: 'Nostr 릴레이 연결', + appearanceSub: '언어 및 테마', + assistant: '어시스턴트', + showSasquatch: 'Sasquatch 어시스턴트 표시', + showSasquatchDesc: '지도와 다른 화면에 떠 있는 Sasquatch 버튼을 표시합니다.', + showMapFooter: '지도 링크 바 표시', + showMapFooterDesc: '지도 하단에 얇은 링크 스트립을 표시합니다.', + notifications: '알림', + notificationsSub: 'DM, 크루, Zap 알림', + coordinator: 'Coordinator', + coordinatorSub: '내 Cordn 그룹 서버', + data: '데이터', + myData: '내 데이터', + myDataSub: '내보내기, 가져오기, 관리', + advancedSub: 'Relatr, Sasquatch, 도구', + notLoaded: '로드되지 않음', + notLoggedIn: '로그인하지 않음', + }, + onboarding: { + seoTitle: '시작하기 — SkateSpots', + seoDescription: '탈중앙화 스케이트보딩 커뮤니티에 참여하세요. 스팟을 찾고, 코치와 연결되고, Zap을 보내세요. 영원히 무료.', + homeSetTitle: '홈 설정 완료 🛹', + homeSetDesc: '이제 지도가 내 지역에서 열립니다.', + locationFailedTitle: '위치를 가져오지 못했습니다', + locationFailedDesc: '위치 권한을 확인하거나 지도에서 지역을 선택하세요.', + niceTitle: '🎉 좋아요!', + niceDesc: '이제 Nostr가 어떻게 작동하는지 알았습니다. 스케이팅하러 가요!', + npubCopied: 'npub가 클립보드에 복사되었습니다.', + saveLoginNow: '로그인 정보를 저장하세요 — 지금 하세요', + saveLoginNowDesc: '복구 코드는 계정으로 돌아오는 유일한 방법입니다. 이메일도, 비밀번호 재설정도 없습니다.', + betaBadge: 'Beta — 전 세계 스케이터에게 공개', + headline1: 'SKATE', + headline2: 'YOUR WORLD', + heroBefore: '하나의', + decentralized: '탈중앙화된', + heroAfter: '스케이트 커뮤니티. 어떤 회사도 소유하지 않습니다. 어떤 알고리즘도 내 스팟을 묻지 않습니다. 밴 해머도 없습니다. 그저 스케이터들뿐.', + pillMap: '스팟 지도', + pillCoaches: '코치 & 필머', + pillEvents: '이벤트', + pillGear: 'Gear 사고팔기', + pillZaps: 'Bitcoin Zap', + pillStash: 'Gear Stash', + pillCrews: '크루', + createFreeAccount: '무료 계정 만들기', + noEmailNoPassword: '이메일 없음. 비밀번호 없음. 신원을 영원히 소유하세요.', + findSpots: '내 주변 스팟 찾기', + addFirstSpot: '첫 스팟 추가', + accountCreated: '가입 완료! 계정 생성됨 ✓', + identityYours: '신원은 내 것입니다 — 우리 서버가 아닌 내 키에 저장됩니다.', + whereSkate: '어디서 스케이팅하나요?', + whereSkateDesc: '홈 지역을 한 번 설정하면 지도가 매번 내 스팟에서 열립니다. GPS는 기기를 떠나지 않습니다.', + useMyLocation: '내 위치 사용', + pickOnMap: '지도에서 선택', + loginSaved: '로그인 저장됨 — 계정을 안전하게 복구할 수 있습니다.', + whyBother: '왜 귀찮게 하냐고요?', + why1Title: '모든 스팟을 하나의 지도에', + why1Body: '레지, 레일, DIY, 파크 — 실제로 타는 스케이터가 지도에 표시합니다. 나가기 전에 상태를 확인해 헛걸음으로 세션을 낭비하지 마세요.', + why2Title: '양복쟁이가 아닌 스케이터가 만듦', + why2Body: '광고도, 쓰레기를 밀어넣는 알고리즘도, 데이터 수집도 없습니다. 오픈 소스. 지도는 커뮤니티의 것이며 — 당신도 포함됩니다.', + why3Title: '올린 대가로 돈을 받으세요', + why3Body: '보석 같은 스팟을 지도에 올리고, 멋진 영상을 찍고, 세션을 운영하세요 — 실제 Bitcoin을 지갑으로 직접 Zap 받습니다. 플랫폼 수수료도, 중개자도 없습니다.', + why4Title: '계정은 진짜로 내 것', + why4Body: '하나의 키로 모든 Nostr 앱에 로그인합니다. 어떤 회사도 마음대로 계정을 잠그거나 삭제할 수 없습니다. 신원을 어디든 가져가세요.', + everythingFree: '할 수 있는 모든 것 — 무료', + featSpots: '스팟 발견', + featSpotsDesc: '전 세계 수천 개의 스팟이 있는 인터랙티브 지도', + featLab: 'The Lab', + featLabDesc: '주변의 코치, 필머 & 영상 편집자 찾기', + featEvents: '이벤트', + featEventsDesc: '대회, 세션, 밋업', + featGear: 'Gear 사고팔기', + featGearDesc: '중고 스케이트 Gear를 위한 P2P 마켓플레이스', + featStash: 'My Stash', + featStashDesc: '소유한 모든 것의 프라이빗 암호화 인벤토리', + featCrews: '크루', + featCrewsDesc: '크루와 함께 — 공유 스팟, 채팅 & 세션', + whatIsNostr: 'Nostr란?', + whatIsNostrSub: 'SkateSpots를 구동하는 프로토콜', + nostrBefore: 'Nostr는 개방형 프로토콜입니다 — 이메일 같지만 소셜 앱을 위한 것입니다. 계정은', + cryptoKeyPair: '암호화 키 쌍', + nostrAfter: '이며 내가 소유합니다. 어떤 단일 회사도 계정이나 데이터를 통제하지 않습니다 — 어떤 릴레이에 저장할지 내가 선택하고 직접 운영할 수도 있습니다. 신원은 모든 Nostr 앱에서 작동합니다.', + nostrPoint1: '데이터 & 키를 내가 소유', + nostrPoint2: '어떤 회사도 차단할 수 없음', + nostrPoint3: '신원이 어디서나 작동', + nostrPoint4: '직접 Bitcoin 팁', + deepDive: '심층 분석: Nostr 작동 방식', + privacyTip: '프라이버시 팁: GPS는 기기를 떠나지 않습니다. 연결하는 서버(예: 지도 타일)는 여전히 IP를 볼 수 있습니다 — 그것까지 숨기고 싶다면 VPN이나 Tor를 사용하세요. 전적으로 선택 사항입니다.', + readPrivacy: '개인정보 처리방침 보기', + zapsWallet: '⚡ Zap & 지갑', + optional: '선택', + walletDesc: 'Zap은 멋진 스팟을 올리거나, 굉장한 영상을 찍거나, 멋진 세션을 운영한 스케이터에게 직접 보내는 Bitcoin 팁입니다. 플랫폼 수수료 없음. 중개자 없음. 100% 그들에게 갑니다.', + builtInWallet: '내장 Cashu 지갑', + builtInWalletDesc: '앱에서 바로 Lightning 결제를 받으세요. 설정 필요 없음.', + balance: '잔액', + connectExternal: '외부 지갑 연결', + connectExternalDesc: 'Alby, Mutiny 또는 다른 지갑이 있나요? NWC로 연결하세요.', + connectViaNwc: 'NWC로 연결', + loginToConnect: '자신의 지갑을 연결하려면 로그인하세요.', + fiveDollars: '💡 $5어치 Bitcoin = 커뮤니티에 퍼뜨릴 수백 번의 Zap', + commonQuestions: '자주 묻는 질문', + faq1Q: 'SkateSpots는 무료인가요?', + faq1A: '100% 무료. 스팟을 둘러보고, 위치를 추가하고, 코치를 찾고, 이벤트를 만들고, 세션에 참여하세요 — 모두 영원히 무료. 크리에이터에게 팁을 주고 싶다면 Bitcoin(Zap)은 선택 사항입니다.', + faq2Q: 'Nostr란 무엇이며 SkateSpots는 왜 사용하나요?', + faq2Before: 'Nostr는 탈중앙화 앱을 위한 개방형 프로토콜입니다 — 어떤 회사도 소유하지 않은 인터넷 자체라고 생각하세요. SkateSpots 계정은', + faq2Strong: '내가 소유하는', + faq2After: '암호화 키 쌍입니다. 어떤 단일 회사도 계정을 차단하거나 데이터를 인질로 잡을 수 없습니다 — 어떤 릴레이에 데이터를 저장할지 내가 선택하고 직접 운영할 수도 있습니다. 신원은 Primal, Damus, Amethyst 같은 다른 Nostr 앱에서도 작동합니다.', + faq3Q: 'nsec란 무엇이며 왜 중요한가요?', + faq3Before: '내', + faq3Mid: 'nsec는 개인 키입니다 — 계정을 소유한다는 유일한 증거입니다. 비밀번호와 달리', + faq3Strong: '"비밀번호 찾기"가 없습니다', + faq3After: '. nsec를 잃으면 계정은 영원히 사라집니다. 계정을 만들면 즉시 백업을 다운로드해 안전한 곳(비밀번호 관리자, 오프라인 기록)에 보관하세요.', + faq4Q: 'SkateSpots와 어떤 서명기/앱이 호환되나요?', + faq4Desktop: '데스크톱:', + faq4Extensions: '브라우저 확장 프로그램.', + faq4Android: 'Android:', + faq4AndroidAfter: '(네이티브 앱에서 최고의 경험).', + faq4Ios: 'iOS:', + faq4IosAfter: '또는 nsec를 직접 붙여넣으세요 (보안 약함).', + faq4Note: 'nsec를 직접 붙여넣어 로그인할 수도 있습니다 — 하지만 서명기 확장 프로그램을 사용하는 편이 더 안전합니다.', + faq5Q: '휴대폰에서 SkateSpots를 사용할 수 있나요?', + faq5Before: '네! SkateSpots는 PWA(프로그레시브 웹 앱)입니다. 방문하세요:', + faq5Mid: '휴대폰 브라우저에서 다음을 누르세요:', + faq5Em: '"홈 화면에 추가"', + faq5After: '완전한 앱 경험을 위해. 또는 다음에서 다운로드하세요:', + faq5End: '— 탈중앙화 앱 스토어.', + faq6Q: 'Zap이란?', + faq6A: 'Zap은 Lightning 네트워크를 통해 보내는 즉시 Bitcoin 팁입니다. 스케이터에게 Zap하면 sats가 몇 초 안에 그들의 지갑에 도착합니다 — PayPal도, Venmo도, 떼가는 수수료도 없습니다. 그 4계단 영상을 찍은 사람이 팬에게 직접 대가를 받습니다.', + faq7Q: 'SkateSpots가 종료되면 내 스팟이 삭제되나요?', + faq7A: '아니요. 스팟은 Nostr 릴레이에 게시됩니다 — 누구나 운영할 수 있는 분산 서버입니다. SkateSpots라는 제품이 내일 사라져도 데이터는 릴레이에 남아 있고 어떤 Nostr 클라이언트든 표시할 수 있습니다.', + faq8Q: '사유지에 있는 스팟도 추가할 수 있나요?', + faq8A: '가능하지만 상식적으로 판단하세요. 사유지의 스팟은 그에 맞게 표시해 스케이터들이 상황을 알 수 있게 해야 합니다. SkateSpots는 무단 침입에 책임지지 않습니다 — 항상 소유자와 지역 주민을 존중하세요.', + faq9Q: '버그를 신고하거나 피드백을 보내려면?', + faq9Before: 'Nostr에서 SkateSpots 팀에 직접 DM을 보내거나, 베타 코디네이터에게 연락하세요:', + faq9Link: '베타 피드백 → cordn.net', + readyToShred: 'READY TO SHRED?', + stopScrolling: '그만 스크롤하세요. 앱을 받고. 스팟을 찾고. 타세요.', + exploreSpots: '스팟 둘러보기', + betaFeedbackTitle: 'Beta — 여러분의 피드백을 원합니다', + betaFeedbackDesc: 'SkateSpots는 활발히 개발 중입니다. 거친 부분을 만날 수 있습니다 — 그것은 우리 책임이지 여러분 잘못이 아닙니다. 버그를 신고하고, 기능을 제안하고, 별로인 점을 알려주세요.', + betaCoordinator: '베타 코디네이터', + betaCoordinatorDesc: 'cordn.net → 메시지 보내기', + dmOnNostr: 'Nostr에서 DM', + fixSameDay: '버그를 찾았나요? 당일에 고칩니다. 여러분의 신고가 모든 스케이터를 위해 앱을 더 좋게 만듭니다.', + relaySetup: '릴레이 설정', + }, + relayEdu: { + understandingNostr: 'Nostr 이해하기', + stepOf: '{{total}}단계 중 {{current}}단계', + step1Title: '릴레이 이해하기', + step1Desc: '릴레이는 스팟 소식을 공유하는 스케이트 샵이라고 생각하세요', + you: '나', + relays: '릴레이', + skaters: '스케이터', + s1Good1: '어떤 회사도 계정을 소유하지 않습니다', + s1Good1Desc: '신원은 여러 릴레이 서버에 존재합니다', + s1Good2: '데이터가 어디에 있는지 내가 통제합니다', + s1Good2Desc: '게시물은 내가 선택한 릴레이에 동기화됩니다 — 직접 고르거나 직접 운영하세요', + s1Warn: '릴레이 운영자는 공개 게시물을 볼 수 있습니다', + s1WarnDesc: '게시판에 글을 붙이는 것과 같다고 생각하세요', + step2Title: '공개 vs 비공개', + step2Desc: '무엇이 보이고 무엇이 암호화되는지 알아두세요', + publicTitle: '공개 (누구나 볼 수 있음)', + pub1: '지도에 추가한 스팟', + pub2: '리뷰와 댓글', + pub3: '프로필 정보 (이름, 사진)', + pub4: '팔로우하는 사람', + privateTitle: '비공개 (암호화됨)', + priv1: '다이렉트 메시지', + priv2: '지갑 통신', + noteStrong: '참고:', + note: '게시물은 릴레이에 영구 저장될 수 있습니다. 게시하기 전에 생각하세요 — 실생활처럼요!', + step3Title: '내 키 = 내 계정', + step3Desc: '이것이 가장 중요한 핵심입니다', + secretKeyTitle: '내 비밀 키 (nsec)', + secretKeyDesc: '스케이트보드처럼 생각하세요 — 누구에게도 빌려주지 마세요. 계정을 소유한다는 증거입니다.', + s3Bad1: '잃으면 계정을 복구할 수 없습니다', + s3Bad2: '"비밀번호 찾기"가 없습니다 — 아무도 재설정할 수 없습니다', + s3Good: '백업해서 안전하게 보관하세요', + publicKeyTitle: '내 공개키 (npub)', + publicKeyDesc: '사용자 이름과 같습니다 — 자유롭게 공유해 다른 사람이 나를 찾게 하세요!', + inControl: '🔐 내가 통제합니다 — 어떤 회사도 나를 잠글 수 없습니다!', + skip: '건너뛰기', + gotIt: '이해했어요!', + }, + about: { + seoTitle: '소개 - SkateSpots', + seoDescription: 'SkateSpots와 탈중앙화 스케이트보딩 커뮤니티를 만드는 우리의 사명을 알아보세요.', + npubCopied: 'npub가 클립보드에 복사되었습니다. 즐겨 쓰는 Nostr 클라이언트에 붙여넣어 DM을 보내세요.', + bugReport: '🐛 버그 신고', + bugWhatHappened: '무슨 일이 있었나요:', + bugExpected: '기대한 것:', + bugSteps: '재현 단계:', + aboutWord: '소개', + heroBefore: '전 세계 로컬 스케이트 신과 연결하세요.', + skaterOwned: '스케이터가 소유한 데이터', + heroAfter: ', 커뮤니티가 운영하는 릴레이.', + viewStats: '커뮤니티 통계 보기', + missionTitle: '우리의 사명', + mission1: 'SkateSpots는 스케이트보더가 스팟을 발견하고, The Lab에서 프로와 연결되고, 세션을 조직하도록 돕습니다 — 모두 기업 통제 없이. 진짜 스케이팅은 오프라인에서 일어납니다, 이 도구는 여러분을 그것에 연결할 뿐입니다.', + mission2: '스케이트보딩 지식은 기업 앱에 갇히지 않고 커뮤니티와 함께 있어야 합니다. 그래서 SkateSpots는 Nostr에서 작동합니다 — 스케이터가 자신의 데이터를 통제하고, 어떤 릴레이에 저장할지 선택하며, 직접 운영할 수도 있는 릴레이 기반 시스템입니다. 어떤 단일 회사도 지도를 소유하지 않습니다.', + whyNostr: '왜 Nostr인가?', + why1Title: '커뮤니티가 통제', + why1Desc: '스팟은 커뮤니티 릴레이에 있습니다. 기업이 아닌 스케이터가 서버를 운영합니다.', + why2Title: '데이터는 내 소유', + why2Desc: 'Nostr 신원은 내 것입니다. 어떤 Nostr 앱으로든 가져가세요 — 종속 없음.', + why3Title: 'Bitcoin 통합', + why3Desc: '크리에이터에게 Bitcoin으로 직접 Zap하세요. 30%를 떼가는 플랫폼은 없습니다.', + why4Title: '오픈 소스', + why4Desc: '공개적으로 개발됩니다. 누구나 기여하거나 코드를 포크할 수 있습니다.', + getInvolved: '참여하기', + getInvolvedDesc: 'SkateSpots는 오픈 소스이며 커뮤니티가 이끕니다. 코드를 기여하고, 스팟을 공유하고, 다른 사람의 시작을 도우세요.', + betaTitle: '베타 테스트', + betaDesc: '사용자 여러분! SkateSpots 베타 테스트에 참여해 주셔서 감사합니다. 앱은 아직 베타이며 버그나 보안 문제가 있을 수 있습니다. 문제가 있거나 버그/이슈를 신고하고 싶으면 연락해 주세요!', + giveFeedback: '피드백 보내기:', + copyNpub: 'npub 복사', + reportBug: '버그 신고', + viewProfile: '프로필 보기', + downloadApp: '앱 다운로드', + downloadAppDesc: 'Zapstore를 통해 Android에 SkateSpots를 설치하세요 — 오픈 소스, Bitcoin 네이티브 앱 스토어.', + getOnZapstore: 'Zapstore에서 받기', + credits: '크레딧', + creditPoweredBy: '제공:', + creditNostr: '탈중앙화 프로토콜', + creditCrewChat: '크루 채팅:', + creditCordn: '종단간 암호화 그룹 채팅', + creditEcash: 'Ecash:', + creditCashu: 'Lightning용 Chaumian ecash', + creditWalletConnect: '지갑 연결:', + creditNwc: 'Nostr Wallet Connect (NIP-47)', + creditSigning: 'Android 서명:', + creditAmber: 'Android용 Nostr 서명기', + creditMapData: 'Bitcoin 지도 데이터:', + creditBtcmap: 'Bitcoin을 받는 장소', + creditCrowdfunding: '크라우드펀딩', + creditAngor: '탈중앙화 Bitcoin 크라우드펀딩', + creditDistributed: '배포:', + creditZapstore: '오픈 소스 앱 스토어', + creditTrust: '신뢰 & 크루 채팅:', + creditContextvm: 'Relatr 신뢰 점수 & 암호화된 크루 채팅 조정', + stillQuestions: '아직 질문이 있나요?', + stillQuestionsDesc: 'The Sasquatch는 라이브 SkateSpots 데이터로 작동하는 AI 가이드입니다. 스팟, 이벤트, 코치, Gear 또는 무엇이든 작동 방식에 대해 물어보세요.', + askSasquatch: 'The Sasquatch에게 묻기', + poweredBy: '제공:', + decentralized: '탈중앙화', + communityOwned: '커뮤니티 소유', + }, + faq: { + seoTitle: 'FAQ - SkateSpots', + seoDescription: 'SkateSpots에 대해 The Sasquatch에게 무엇이든 물어보세요.', + greeting: '안녕! 나는 The Sasquatch 🦧 — SkateSpots에 대해 무엇이든 물어봐. 스팟, 이벤트, Gear, 지갑, 프라이버시, Nostr — 다 알려줄게. 무엇이 궁금해?', + gotQuestions: '질문이 있나요?', + heroDesc: 'The Sasquatch에게 물어보세요 — SkateSpots, Nostr, Bitcoin, 스케이트보딩에 대해 뭐든지 압니다.', + askTitle: 'The Sasquatch에게 묻기', + askDesc: 'The Sasquatch는 화면 왼쪽 아래에 열려 있습니다 — 클릭하고 질문을 입력하세요. 스팟, 이벤트, 코치, 날씨에 실시간으로 접근합니다.', + askQuestion: 'SkateSpots에서 무엇을 도와줄 수 있나요?', + openSasquatch: 'The Sasquatch 열기', + commonQuestions: '자주 묻는 질문 — 눌러서 물어보세요', + quickAnswers: '빠른 답변', + footerHint: 'The Sasquatch는 SkateSpots 릴레이의 라이브 Nostr 데이터 + AI로 질문에 답합니다. 🛹', + chip1Label: 'SkateSpots란?', + chip1Q: 'SkateSpots는 무엇이며 어떻게 작동하나요?', + chip2Label: '스팟은 어떻게 추가하나요?', + chip2Q: '지도에 스케이트 스팟을 추가하려면?', + chip3Label: 'Zap이란?', + chip3Q: 'Zap이 무엇인가요?', + chip4Label: '무료인가요?', + chip4Q: 'SkateSpots는 무료인가요?', + chip5Label: 'My Stash란?', + chip5Q: 'My Stash가 무엇인가요?', + chip6Label: '로그인은 어떻게 하나요?', + chip6Q: '로그인하거나 계정을 만들려면?', + chip7Label: 'Nostr란?', + chip7Q: 'Nostr가 무엇인가요?', + chip8Label: '프라이버시 & 데이터', + chip8Q: 'SkateSpots에서 어떤 데이터가 공개이고 어떤 것이 비공개인가요?', + chip9Label: 'Gear는 어떻게 파나요?', + chip9Q: 'SkateSpots에서 Gear를 팔려면?', + chip10Label: 'The Lab이란?', + chip10Q: 'The Lab이 무엇인가요?', + fact1Label: '전 세계 스케이트 스팟', + fact1Value: '발견 & 추가', + fact2Label: 'Bitcoin Lightning Zap', + fact2Value: '100% 무료', + fact3Label: 'Nostr에서 탈중앙화', + fact3Value: '데이터는 내 소유', + fact4Label: '프라이빗 Gear 인벤토리', + fact4Value: '암호화된 Stash', + s1Q: 'SkateSpots란?', + s1A: 'Nostr 위에 구축된 스케이트보딩을 위한 탈중앙화 지도이자 커뮤니티. 스팟을 발견하고, 코치와 필머를 찾고, 크루에 가입하고, 이벤트를 등록하고, Gear를 사고파세요 — 중간에 회사가 없습니다.', + s2Q: '스팟은 어떻게 추가하나요?', + s2A: '지도를 탭하거나 + / "Add Spot" 버튼을 사용한 뒤 핀을 놓고 세부 정보를 입력하세요. 무료 Nostr 계정이 필요합니다 (로그인 → 계정 만들기 — 이메일 불필요).', + s3Q: 'Zap이 무엇인가요?', + s3A: 'Zap은 Bitcoin Lightning 팁입니다. 마음에 드는 스팟, 이벤트, 크루, 사람에게 Zap할 수 있습니다. Lightning을 통해 수신자에게 바로 전달됩니다 — SkateSpots는 자금을 보관하지 않습니다.', + s4Q: '무료인가요?', + s4A: '네. 계정 생성, 스팟 추가, 둘러보기는 무료입니다. 선택적 유료 추가 기능(예: 추천 리스팅)과 팁(Zap)은 사람들 사이에서 직접 지불됩니다.', + s5Q: '어떤 데이터가 공개인가요?', + s5A: '게시하는 모든 것 — 스팟, 이벤트, 프로필 — 은 Nostr 릴레이에 공개됩니다. 비공개 메시지와 Stash는 종단간 암호화됩니다. 자세한 내용은 개인정보 처리방침을 보세요.', + s6Q: 'The Lab이 무엇인가요?', + s6A: 'The Lab은 고용하거나 배울 사람을 찾는 곳입니다: 코치, 트레이너, 필머, 영상 편집자, 사진작가, 빌더, 아티스트 등.', + }, + privacy: { + seoTitle: '프라이버시 — SkateSpots', + seoDescription: 'SkateSpots가 데이터를 처리하는 방식: GPS는 기기에 남고, 게시한 스팟은 공개되며, 원하면 VPN이나 Tor로 IP를 숨기는 방법.', + heroBefore: '당신의', + heroHighlight: '프라이버시', + heroDesc: '추적도, 광고도, 데이터 판매도 없습니다. 무엇이 기기에 남는지, 무엇이 공개인지, 원한다면 어떻게 더 잠글 수 있는지 정확히 알려드립니다.', + locationTitle: '위치는 기기에 남습니다', + locationBefore: '다음을 누르면', + nearMe: '"Near Me",', + locationAfter: 'GPS 위치는 기기에서 읽히며 지도 중심을 잡고 주변 스팟을 정렬하는 데만 사용됩니다.', + locationGood1: 'Nostr에 절대 게시되지 않습니다.', + locationGood2: 'SkateSpots로 절대 전송되지 않습니다 — 수집하는 SkateSpots 서버는 없습니다.', + locationGood3: '어떤 제3자와도 절대 공유되지 않습니다.', + locationGood4: '네이티브 앱에서는 휴대폰 자체 위치 시스템을 직접 사용하고 Google Play Services를 건너뜁니다 — 따라서 Google을 제거한 휴대폰(GrapheneOS, /e/OS)에서도 작동하고 Google은 절대 보지 못합니다.', + weatherBefore: '날씨는 기본적으로 꺼져 있습니다. 켜면 다음의 상태를 조회합니다:', + weatherEm: '스팟의', + weatherAfter: '공개 위치 — 내 위치가 아닙니다.', + publicTitle: '설계상 공개되는 것', + publicDesc: 'SkateSpots는 공유 지도이므로 일부는 모두가 보도록 되어 있습니다. 게시하기로 선택하면 다음은 Nostr 네트워크에서 공개됩니다:', + public1Strong: '추가한 스팟', + public1: '— 좌표 포함. 정확한 내 위치에 스팟을 추가하면 그 위치가 공개됩니다. 자기 집 진입로에 핀을 놓기 전에 생각하세요.', + public2Strong: '리뷰, 댓글, 공개 프로필', + public2: '(이름, 사진).', + public3: '팔로우하는 사람, 공개 리액션.', + public4Strong: 'Zap', + public4: '은(는) 기본적으로 공개입니다: Zap은 내 계정 — 보통 Lightning 주소 — 을 결제한 게시물과 팁 자체에 연결합니다. 원하지 않으면 지갑에서 익명으로 보낼 수 있습니다.', + publicNoteBefore: 'VPN이나 Tor는', + notWord: '숨기지', + publicNoteAfter: '않습니다 — 게시한 콘텐츠는요. 스팟 좌표는 어쨌든 공개입니다. 프라이버시 도구는 네트워크 신원(IP)을 숨길 뿐, 게시하기로 선택한 것들을 숨기지 않습니다.', + encryptedTitle: '비공개 & 암호화되는 것', + enc1Strong: '다이렉트 메시지', + enc1Mid: '그리고', + enc1Strong2: '크루 채팅', + enc1: '은(는) 종단간 암호화됩니다 (NIP-17). 참여자만 읽을 수 있습니다.', + enc2Strong: 'My Stash', + enc2: '— 프라이빗 Gear 인벤토리 — 는 내 키로 암호화됩니다.', + enc3Strong: '크루 전용 멤버', + enc3: '는 크루 동료에게만 보이도록 선택할 수 있습니다.', + ipTitle: '기기를 떠나는 것: IP', + ipBefore: '모든 웹사이트처럼 SkateSpots가 통신하는 서버는 내', + ipAddress: 'IP 주소', + ipAfter: '(지역을 대략 알려주는 지표)를 볼 수 있습니다. 모든 웹/지도 앱에서 정상이며 우리만의 특별함이 아닙니다. 그 서버들은:', + ipTileStrong: '지도 타일', + ipTile: '(OpenStreetMap) — IP와 지도에서 보는 지역을 봅니다.', + ipGeoStrong: '스팟/샵 지오코딩', + ipGeo: '— 스팟이나 샵을 만들거나 편집할 때 좌표가 도시/국가 태그를 채우기 위해 OpenStreetMap Nominatim으로 전송됩니다. 커뮤니티 통계를 열면 위치 태그가 없는 핀의 좌표가 지역별로 묶이도록 BigDataCloud로 전송됩니다 (기기에 캐시됨 — 핀당 최대 한 번). 둘 다 IP를 봅니다. 이것은 내가 놓은 핀 / 공개 핀 좌표이며, 기기의 실시간 GPS가 아닙니다.', + ipPushStrong: '백그라운드 알림', + ipPush: '(선택) — 활성화하면 SkateSpots 푸시 서버가 내 키로 뭔가 도착했다는 것과 시각을 봅니다 (누가 보냈는지, 무엇이라고 쓰여 있는지는 절대 보지 못합니다 — 메시지는 암호화된 상태로 유지됨). OS 푸시 서비스(Google/Mozilla/Apple)가 알림을 전달합니다.', + ipBtcStrong: 'Bitcoin 장소', + ipBtc: '(BTCMap, 해당 레이어를 켰을 때) — IP와 보고 있는 지역을 봅니다.', + ipRelayStrong: 'Nostr 릴레이', + ipRelay: '— 앱이 읽거나 게시할 때 IP를 봅니다.', + ipMintStrong: 'Cashu 민트', + ipMint: '— 지갑이 보내거나 받거나 melt할 때마다 IP를 봅니다.', + ipRouteStrong: '길찾기', + ipRoute: '(OSRM, 대중교통은 Transitous) — 요청하는 모든 경로의 출발지와 도착지를 받습니다, IP뿐만 아니라. 경로는 앱 안에 머뭅니다: 출발지와 도착지는 Google이나 Apple Maps로 넘겨지지 않습니다.', + ipWeatherStrong: '날씨', + ipWeatherMid: '(Open-Meteo, 선택) 그리고', + ipUploadStrong: '이미지 업로드', + ipWeather: '(Blossom), 사용할 때.', + ipAiStrong: 'Sasquatch AI', + ipAi: '— 메시지는 우리 서버로 간 뒤 모델 제공자에게 전달됩니다.', + ipLink1: '같은 연결로 공개키(npub)를 보내기 때문에 릴레이는 IP를 나와 연결할 수 있습니다 — 단순히 "누군가 연결했다"가 아니라 "이 사람이, 이 주소에서"입니다.', + ipShieldBefore: '우리가 가려주는 한 가지:', + ipMintsStrong: '민트 디렉터리', + ipShieldAfter: '는 우리 서버를 통해 가져오므로 MintRadar는 내 IP를 절대 보지 못합니다.', + vpnTitle: '더 많은 프라이버시를 원하나요? VPN 또는 Tor (선택)', + vpnDesc: '대부분의 스케이터에게는 필요 없습니다 — 하지만 위 서버들로부터 IP와 대략적인 위치를 숨기고 싶다면 두 가지 무료 옵션이 있습니다:', + vpnReputable: '🛡️ 신뢰할 수 있는 VPN', + vpnReputableDesc: 'VPN 서버 뒤로 IP를 숨깁니다. 쉽고 빠릅니다. 돈을 내고 신뢰하는 것을 사용하세요; 무료 VPN은 보통 트래픽으로 수익을 내므로 "무료"를 경고 신호로 여기세요.', + torBrowser: '🧅 Tor 브라우저', + torDesc: '무료이고 최대의 IP 프라이버시를 제공하며 여러 릴레이를 통해 라우팅됩니다. 느립니다 — 지도와 일부 Nostr 릴레이는 지연되거나 Tor 출구 노드를 차단할 수 있습니다. 특히 신중한 사람에게 좋습니다.', + readThis: '속지 않도록 읽어보세요', + caveat1Before: 'VPN/Tor는 내', + ipWord: 'IP', + caveat1: '를 숨깁니다 — 게시한 스팟은 아닙니다. 집에 놓은 핀은 VPN 사용 여부와 무관하게 공개입니다.', + caveat2Before: '활성화하지 마세요:', + nearMeGps: '"Near Me" / 브라우저 GPS', + caveat2: '익명을 유지하는 것이 목표라면 — 정확한 GPS는 모든 IP 숨김을 무력화합니다.', + caveat3: '어떤 도구도 완전히 "익명"으로 만들어 주지 않습니다. 이것들은 서버가 네트워크 위치를 추론할 수 있는 것을 줄여줄 뿐입니다 — 그게 전부입니다.', + keysTitle: '내 키, 내 계정', + keysBefore: '계정은 내가 소유한 암호화 키 쌍입니다. 가장 안전한 로그인 방법은', + signer: '서명기', + keysAfter: '(Alby, nos2x 또는 Android의 Amber)를 사용하는 것입니다 — 비밀 키를 앱에 붙여넣을 일이 없습니다.', + keysCaveatBefore: '만약 내', + keysCaveatAfter: '를 직접 붙여넣으면 브라우저에 저장됩니다. 가능하면 대신 서명기 확장 프로그램을 사용하고, nsec 백업을 안전한 오프라인 장소에 보관하세요.', + footerBefore: '질문이 있나요? 물어보세요:', + sasquatchName: 'The Sasquatch', + footerMid: '앱에서, 또는 읽어보세요:', + gettingStarted: '시작 가이드', + about: '소개', + }, + license: { + seoTitle: '라이선스 - SkateSpots', + seoDescription: 'SkateSpots 라이선스. 당신은 스케이트보드할 자유가 있습니다.', + tagline: '어디서든 스케이트하고, 벌고, 즐기고 Sats를 쓰세요.', + copyright: 'SkateSpots 기여자 & 커뮤니티', + licenseLabel: '라이선스', + freeLine1: '당신은 자유롭습니다', + freeLine2: '스케이트보드할', + body: '이 프로젝트는 개방되어 있습니다. 공유하고, 포크하고, 그 위에 만들고, 타세요. 거리는 모두의 것입니다. 이 코드도 마찬가지입니다. 계속 스케이팅하고, 즐기고, 트릭을 배우고, 만든 사람들을 응원하고, 다시 계속 스케이팅하세요.', + builtBefore: '❤️로 만들었습니다:', + builtMid: '· 제공:', + lightning: 'Bitcoin Lightning ⚡', + viewSource: '소스 보기', + aboutSkateSpots: 'SkateSpots 소개', + supporters: '서포터', + }, + glossary: { + seoTitle: '트릭 용어집 · SkateSpots', + seoDescription: '완전한 스케이트보딩 용어집 — 플립, 그라인드, 슬라이드, 그랩, 에어, 립 트릭, 핸드플랜트, 프리스타일, 트랜지션 용어, 스탠스 & 하드웨어를 다루는 {{count}}개 항목, 별칭 포함.', + heading: '트릭 용어집', + subheading: '{{count}}개 항목 · 트릭, 트랜지션, 프리스타일, 스탠스 & 하드웨어', + searchPlaceholder: '트릭이나 별칭 검색 — tre flip, crooks, method…', + clearSearch: '검색 지우기', + all: '전체', + results: '{{count}}개 결과{{s}}:', + noMatch: '일치하는 트릭이 없습니다. “tre flip”, “crooks”, “melon” 같은 별칭을 시도해 보세요.', + tricksCount: '{{count}}개 트릭', + footerBefore: '빠뜨린 트릭이나 별칭을 아시나요? 트릭은 지역마다 다른 이름을 얻습니다 — 연락하세요:', + sasquatch: 'The Sasquatch 🦧', + footerAfter: '에게 알려주세요.', + }, + signers: { + seoTitle: '서명기 앱 - Nostr 키를 안전하게 | SkateSpots', + seoDescription: 'Nostr 키를 안전하게 지키는 서명기 앱을 알아보세요. Android, iOS, 데스크톱 브라우저에 가장 좋은 옵션을 찾으세요.', + securityGuide: '보안 가이드', + protect: '지키세요:', + nostrKeys: 'Nostr 키', + heroDesc: '서명기 앱은 개인 키를 노출하지 않고 이벤트에 서명해 안전하게 지킵니다. 모든 앱에 키를 붙여넣는 대신 서명기가 안전하게 처리하게 하세요.', + whySignerStrong: '왜 서명기를 사용하나요?', + whySigner: 'Nostr 개인 키는 절대 바꿀 수 없는 비밀번호와 같습니다. 서명기 앱은 키를 안전하게 지키면서 어떤 Nostr 앱이든 사용할 수 있게 해줍니다.', + androidTitle: 'Android 서명기', + androidDesc: 'GrapheneOS를 포함한 Android 기기용 네이티브 서명기 앱.', + iosTitle: 'iOS 서명기', + iosDesc: 'iPhone 및 iPad 사용자를 위한 서명기 옵션.', + browserTitle: '브라우저 확장 프로그램', + browserDesc: '웹 앱에서 서명하기 위한 데스크톱 브라우저 확장 프로그램.', + recommended: '권장', + yourPlatform: '내 플랫폼', + get: '{{name}} 받기', + protocolsTitle: '프로토콜 이해하기', + nip07Desc: '브라우저 확장 프로그램 표준. 확장 프로그램이 웹 앱에 서명 기능을 주입합니다. Alby, nos2x, Flamingo 및 유사한 확장 프로그램에서 사용됩니다.', + nip46Desc: '원격 서명 프로토콜("bunker"). 서명기 앱이 키를 공유하지 않고 다른 앱의 요청을 승인합니다. Nsec.app, Nostria, Nowser에서 사용됩니다.', + nip55Desc: 'Android 전용 서명기 프로토콜. 네이티브 앱이 키를 노출하지 않고 Amber에 서명을 요청할 수 있습니다. 가장 매끄러운 Android 경험.', + whichChoose: '무엇을 선택할까요?', + chooseAndroid: 'Android:', + chooseAndroidDesc: '네이티브 앱에는 Amber (NIP-55)', + chooseIos: 'iOS:', + chooseIosDesc: '최고의 호환성에는 Nsec.app (NIP-46)', + chooseDesktop: '데스크톱:', + chooseDesktopDesc: 'Alby, nos2x 또는 Flamingo (NIP-07)', + amberDesc: '보안과 사용 편의성에 집중한 네이티브 Android 서명기. Android 사용자에게 최고의 선택.', + nsecAppDesc: '키를 위한 보안 금고 역할을 하는 크로스 플랫폼 원격 서명기.', + nostriaDesc: '키를 안전한 기기 저장소에 보관하는 원격 서명기 앱.', + nowserDesc: '브라우저 확장과 원격 서명 프로토콜을 모두 지원하는 다중 인증 서명기.', + nsecAppIosDesc: 'iOS에 가장 좋은 옵션. 어떤 Nostr 클라이언트와도 원격 서명기로 사용하세요.', + nowserTfDesc: 'Android와 유사한 서명 기능을 가진 TestFlight 제공 iOS 서명기.', + nostriaIosDesc: '기기에 키를 안전하게 저장하는 원격 서명기.', + nos2xDesc: 'Nostr 이벤트 서명을 위한 간단하고 신뢰할 수 있는 브라우저 확장 프로그램.', + albyDesc: 'Nostr 키 관리와 WebLN이 내장된 Bitcoin Lightning 지갑.', + flamingoDesc: '깔끔한 인터페이스의 Nostr 중심 브라우저 확장 프로그램.', + kiwiDesc: 'Android/GrapheneOS에서는 Kiwi 브라우저로 nos2x 또는 Alby 확장 프로그램을 로드하세요.', + fNativeApp: '네이티브 앱', + fMultiKey: '다중 키 지원', + fEventSigning: '이벤트 서명', + fSecureStorage: '안전한 키 저장', + fRemoteSigning: '원격 서명', + fAnyClient: '모든 클라이언트와 호환', + fCrossDevice: '기기 간 동기화', + fMultiKeySupport: '다중 키 지원', + fNip07: 'NIP-07 지원', + fNip46: 'NIP-46 지원', + fFlexibleSigning: '유연한 서명', + fNativeIos: '네이티브 iOS 앱', + fLightweight: '가벼움', + fEasyToUse: '사용하기 쉬움', + fChromeSupport: 'Chrome/Brave/Edge 지원', + fLightningPayments: 'Lightning 결제', + fNostrSigning: 'Nostr 서명', + fWebln: 'WebLN 지원', + fNwc: 'NWC 지원', + fCleanUi: '깔끔한 UI', + fPrivacyFocused: '프라이버시 중심', + fExtensionMobile: '모바일 확장 프로그램 지원', + fFullBrowser: '완전한 브라우저 경험', + fGraphene: 'GrapheneOS에서 작동', + }, + betaDisclaimer: { + title: '알려드립니다 — 베타입니다', + subtitle: '시작하기 전에 짧게.', + ossTitle: '오픈 소스 & 실험적', + ossBody: '커뮤니티가 공개적으로 만듭니다. 살펴보고, 포크하고, 부숴보세요.', + betaTitle: '베타 — 감사되지 않음', + betaBody: '코드는 아직 공식 보안 감사를 거치지 않았습니다. 버그는 생깁니다.', + moneyTitle: '실제 Bitcoin & Lightning을 다룹니다', + moneyBody: '돈을 사용하는 것은 본인 책임입니다. 잃어도 괜찮은 만큼만 넣으세요.', + finePrint: '어떤 종류의 보증도 없습니다. 자신의 자금과 키에 대한 책임은 전적으로 본인에게 있습니다.', + viewCode: '코드 보기', + accept: '알겠어요, 들여보내 주세요', + }, + }, +}; export default koBatch3; diff --git a/src/i18n/ko/batch4.ts b/src/i18n/ko/batch4.ts index 108ca77..4aa87d4 100644 --- a/src/i18n/ko/batch4.ts +++ b/src/i18n/ko/batch4.ts @@ -1,4 +1,1123 @@ -/** ko — batch 4. Filled by the translation pass; empty until then. */ -const koBatch4 = {}; +/** + * Korean (한국어) — batch 4: the wallet namespace (walletUi): Cashu, + * Lightning/NWC, zaps, escrow, mints, privacy, the Stash, community stats, + * newsletter and supporters. + * + * Protocol and brand names (Nostr, Lightning, Cashu, Zap, Relay, NWC, Stash, + * The Lab, Angor, sats, Lightning Address) stay English; relay is 렐레이/ + * 릴레이, mint is 민트; trick names stay English. + */ +const koBatch4 = { + walletUi: { + page: { + title: '지갑', + subtitle: 'Bitcoin Lightning + Cashu', + manage: '관리', + getAWallet: '지갑 받기', + learnPlanB: 'Plan B Academy에서 더 알아보기', + walletMinibits: '모바일 Cashu · NWC', + walletAlby: '브라우저 확장 · WebLN + NWC', + walletZeus: '셀프 커스터디 Lightning', + walletCoinos: '웹 기반 · 어디서나 작동', + whatAreZaps: 'Zap이란?', + whatAreZapsShort: 'Zap이 뭐예요?', + zapsDesc: '즉시 결제되는 Bitcoin Lightning. 어떤 스케이터, 스팟 창작자, 코치에게든 sats를 보내세요 — 중개인도, 플랫폼 수수료도 없습니다.', + instant: '즉시', + instantDesc: '몇 초 만에 정산', + flexible: '유연함', + flexibleDesc: '내 지갑, 내 키', + private: '프라이버시', + privateDesc: 'Cashu는 누가 지불하는지 숨깁니다', + direct: '직접', + directDesc: '가치가 창작자에게', + loginRequired: '로그인 필요', + loginRequiredDesc: 'Nostr 계정으로 로그인해 Lightning 지갑을 연결하고 Zap을 시작하세요.', + browseMints: 'Cashu 민트 둘러보기', + }, + modal: { + walletName: '지갑 이름 (선택 사항)', + walletNamePlaceholder: '내 Lightning 지갑', + connectionUri: '연결 URI', + spendLimitTitle: '먼저 지출 한도를 설정하세요', + spendLimitBody1: '이 문자열은 SkateSpots가 지갑에서 Lightning 인보이스를 결제할 수 있게 합니다. 지갑 앱에서 이 연결에 작은', + dailyBudget: '일일 예산', + spendLimitBody2: '(예: 몇천 sats)을 주고', + spendLimitBody3: '만 활성화하세요. 무제한 예산의 연결은 절대 붙여넣지 마세요. 언제든지 지갑에서 취소할 수 있습니다.', + addWallet: '지갑 추가', + nwcConnection: 'NWC 연결', + lightningWallet: 'Lightning 지갑', + pasteNwc: 'Zap을 보내려면 NWC 연결 문자열을 붙여넣으세요', + connectWallet: '지갑 연결', + browserExtension: '브라우저 확장 (WebLN)', + autoDetected: '설치되어 있으면 자동 감지', + ready: '준비됨', + notFound: '찾을 수 없음', + getNwcFrom: 'NWC 발급처:', + connectionRequired: '연결 URI가 필요합니다', + connectionRequiredDesc: '유효한 NWC 연결 URI를 입력하세요.', + activeChanged: '활성 지갑이 변경됨', + activeChangedDesc: '선택한 지갑이 이제 Zap에 사용됩니다.', + connectNwc: 'NWC 지갑 연결', + connectNwcDesc: '호환 지갑에서 연결 문자열을 입력하세요.', + connect: '연결', + connecting: '연결 중...', + walletSettings: '지갑 설정', + connectDesc: '즉시 Zap을 보내려면 Lightning 지갑을 연결하세요.', + }, + cashu: { + title: 'Cashu 지갑', + desc: '내장 ecash 지갑 — 외부 설정 필요 없음', + initializing: '지갑 초기화 중...', + walletError: '지갑 오류', + balance: '잔액', + balanceAria: '지갑 잔액 {{amount}} sats', + activeMint: '활성 민트', + selectMint: '민트 선택', + receive: '받기', + send: '보내기', + receiveViaLightning: '⚡ Lightning으로 받기', + amountSats: '금액 (sats)', + generateInvoice: '인보이스 생성', + generating: '생성 중…', + or: '또는', + receiveCashu: '🥜 Cashu 토큰 받기', + scanQr: 'QR 스캔', + pasteCashu: 'Cashu 토큰 붙여넣기 (cashu...)', + receiveToken: '토큰 받기', + receiving: '받는 중…', + createCashu: '🥜 Cashu 토큰 만들기', + createToken: '토큰 만들기', + creating: '만드는 중…', + payInvoice: '⚡ Lightning 인보이스 결제', + pasteInvoice: 'Lightning 인보이스 붙여넣기 (lnbc...)', + payInvoiceBtn: '인보이스 결제', + processing: '처리 중...', + payAddress: '📧 Lightning Address 결제', + sendToAddress: '주소로 보내기', + sending: '보내는 중…', + recentActivity: '최근 활동', + receivedLightning: '⚡ Lightning 받음', + sentLightning: '⚡ Lightning 보냄', + sentToken: '🥜 토큰 보냄', + receivedToken: '🥜 토큰 받음', + whatIsCashu: 'Cashu란?', + whatIsCashuDesc: 'Cashu는 Bitcoin Lightning으로 뒷받침되는 디지털 현금입니다. 브라우저에 보관하는 Bitcoin 토큰이라고 생각하세요.', + benefitOffline: '스케이트 스팟에서 오프라인으로 작동', + benefitInstant: '즉시 P2P 결제', + benefitPrivacy: '프라이버시 중심 (민트가 당신을 추적할 수 없음)', + benefitRedeemable: '언제나 Lightning sats로 교환 가능', + findMints: 'mintradar.pedani.eu에서 민트 찾기', + backupTitle: '지갑 백업', + backupDesc: '지갑은 12단어 복구 문구로 보호됩니다. 안전하게 보관하세요 — 브라우저 데이터를 지우면 잔액을 복원하는 데 필요합니다.', + viewRecovery: '복구 문구 보기', + backupNote: 'Nostr nsec와 같습니다 — 비밀로 유지하고 백업하세요!', + tokenReceived: '토큰 받음', + tokenReceivedDesc: 'Cashu 토큰을 성공적으로 교환했습니다!', + receiveFailed: '받기 실패', + unknownError: '알 수 없는 오류', + requestUnsupported: 'Cashu 요청은 아직 지원되지 않습니다', + requestUnsupportedDesc: '이 지갑은 아직 Cashu (creq) 요청을 결제할 수 없습니다 — 대신 Lightning 인보이스나 주소를 요청하세요.', + onchainUnsupported: '온체인은 여기서 지원되지 않습니다', + onchainUnsupportedDesc: '그건 Bitcoin 주소입니다. 이 지갑은 Cashu 토큰과 Lightning 결제만 보냅니다.', + nostrProfile: '그건 Nostr 프로필입니다', + nostrProfileDesc: '결제하려면 Cashu 토큰, Lightning 인보이스 또는 Lightning 주소를 스캔하세요.', + clinkUnsupported: '결제 코드는 아직 지원되지 않습니다', + clinkUnsupportedDesc: '이 지갑은 아직 CLINK 코드를 결제할 수 없습니다. 대신 Lightning 인보이스나 주소를 사용하세요.', + unrecognizedQr: '인식할 수 없는 QR 코드', + unrecognizedQrDesc: 'Cashu 토큰, Lightning 인보이스 또는 Lightning 주소를 스캔하세요.', + invalidAmount: '잘못된 금액', + invalidAmountDesc: '유효한 금액을 입력하세요', + paymentSent: '결제 완료', + paymentSentDesc: '{{address}}님에게 {{amount}} sats를 보냈습니다', + paymentFailed: '결제 실패', + copied: '복사됨', + copiedDesc: '{{label}}을(를) 클립보드에 복사했습니다', + receiveSats: '{{amount}} sats 받기', + payInvoiceHint: '아무 Lightning 지갑에서 이 인보이스를 결제하세요', + invoiceQrAlt: '인보이스 QR 코드', + lightningInvoice: 'Lightning 인보이스', + invoiceLabel: '인보이스', + waiting: '⏳ 결제 대기 중...', + tokenReady: '보낼 토큰 준비됨', + shareToken: '받는 사람과 이 토큰을 공유하세요', + tokenQrAlt: '토큰 QR 코드', + cashuToken: 'Cashu 토큰', + tokenLabel: '토큰', + copyToken: '토큰 복사', + tokenWarning: '이 토큰을 가진 사람은 누구나 사용할 수 있습니다 - 현금처럼 다루세요!', + browser: { + title: '내장 Ecash 지갑', + appOnly: '앱 전용', + desc: 'Bitcoin Lightning으로 구동되는 셀프 커스터디 Cashu ecash', + unlockTitle: 'SkateSpots 앱에서 전체 지갑을 잠금 해제하세요', + unlockDesc: '내장 ecash 지갑을 사용하면 스팟에서 바로 Cashu 토큰을 발행하고 보내고 교환할 수 있습니다. 네이티브 앱에 있으며 민트와 직접 통신합니다 — 브라우저는 보안을 위해 이런 연결을 샌드박스로 격리합니다.', + zapTipTitle: 'Zap & 팁 — 지금 브라우저에서 작동', + zapTipDesc: '스팟, 이벤트, 코치, 크루에게 sats를 보내는 건 여기서 바로 됩니다. 아래에서 Lightning 지갑을 연결하기만 하세요 — Nostr Wallet Connect 또는 Alby 같은 브라우저 확장. Cashu 민트는 필요 없습니다.', + }, + }, + escrow: { + title: '에스크로', + desc: '안전하게 판매하세요: 에스크로를 켜면 구매자가 거래를 위해 자기 sats를 당신에게 잠글 수 있습니다. 물건을 전달하면 풀어주세요 — 그렇지 않으면 구매자가 합의한 시간 후 되찾을 수 있습니다.', + active: '에스크로 켜짐', + publish: '에스크로 켜기', + published: '에스크로 켜짐', + publishedDesc: '이제 구매자가 거래를 위해 자금을 당신에게 잠글 수 있습니다.', + failed: '에스크로를 켤 수 없습니다', + }, + escrowSettings: { + title: '에스크로 설정', + desc: 'Cashu 에스크로 거래 기본값. 기기 로컬.', + lockWindow: '기본 잠금 기간', + lockWindowHint: '구매자가 되찾기 전까지 자금이 잠겨 있는 기간. 판매자에게는 길수록 안전합니다.', + days: '일', + preferredMint: '에스크로용 민트', + activeMint: '활성 민트', + preferredMintHint: '에스크로 자금을 맡길 민트. 신뢰할 수 있는 것을 사용하세요.', + requireListings: '새 등록에 에스크로 필수', + requireListingsHint: '물품을 등록할 때 “에스크로 필수”를 미리 선택합니다.', + }, + privacy: { + title: '프라이버시 팁', + subtitle: '금융 프라이버시를 지키는 방법', + cashuRecommended: 'CASHU (권장)', + anon: '익명 거래', + blind: '블라인드 서명이 활동을 숨김', + noIp: 'IP 노출 없음', + trustMint: '자금을 민트에 신뢰', + lightningAddress: 'LIGHTNING ADDRESS', + linked: '신원과 연결될 수 있음', + traceable: '결제 내역 추적 가능', + ipVisible: '인보이스 발행 시 IP 노출', + selfCustody: '셀프 커스터디 가능', + bestPractices: '모범 사례', + tip1Title: '팁을 받을 때는 Cashu 사용', + tip1Desc: '내장 Cashu 지갑이 Zap을 받는 가장 프라이빗한 방법', + tip2Title: 'SkateSpots용 별도 지갑 사용', + tip2Desc: '주 저축 지갑은 사용하지 마세요 - 앱 자금은 분리해 두세요', + tip3Title: 'VPN 또는 Tor 사용 고려', + tip3Desc: '거래할 때 IP 주소를 숨깁니다', + tip4Title: '신원과 연결된 Lightning 주소 피하기', + tip4Desc: '실명과 연결되지 않은 가명 주소 사용', + proTip: '프로 팁:', + proTipDesc: '먼저 Cashu 지갑으로 결제를 받고, 주기적으로 큰 금액을 개인 지갑으로 옮기되 전송에는 VPN을 사용하세요.', + warnTitle: '프라이버시 주의', + warnDesc: 'Lightning 주소는 SkateSpots 활동을 실제 신원과 연결할 수 있습니다.', + betterPrivacy: '더 나은 프라이버시를 위해:', + bullet1: '이 앱 전용 지갑 사용', + bullet2: '대신 Cashu 지갑 사용 고려', + bullet3: '거래에 VPN/Tor 사용', + useCashu: '대신 Cashu 사용', + understand: '이해했습니다', + }, + mintPrivacy: { + title: '민트 프라이버시', + desc: '여러 민트를 사용하면 어떤 단일 민트도 모든 거래를 볼 수 없어 프라이버시가 향상됩니다', + distribution: '자금 분배', + singleWarning: '단일 민트를 사용하면 그 민트가 모든 거래 시점과 금액을 볼 수 있습니다. 더 나은 프라이버시를 위해 민트를 추가하는 것을 고려하세요.', + yourMints: '내 민트 ({{count}})', + default: '기본', + addMint: '민트 추가', + addMintDesc: '지갑에 새 Cashu 민트 추가', + mintUrl: '민트 URL', + add: '추가', + adding: '추가 중...', + orChoose: '또는 목록에서 선택', + recommended: '권장 민트', + allMints: '모든 민트 (디렉터리)', + searchMints: '민트 검색…', + noDirectoryMints: '검색과 일치하는 민트가 없습니다.', + directoryHint: '커뮤니티 MintRadar 디렉터리에서 — 비공식이며 오래된 정보일 수 있습니다.', + added: '추가됨', + soon: '곧', + autoDistribute: '자금 자동 분배', + autoDesc: '받은 자금을 여러 민트에 분산', + autoAria: '자금 자동 분배 (곧 제공)', + tip1: '더 나은 프라이버시를 위해 최소 2-3개의 서로 다른 민트를 사용하세요', + tip2: '모든 자금을 한 민트에 보관하지 말고 분산하세요', + tip3: '민트 관할권을 고려하세요 (다른 국가 = 다른 법적 접근)', + tip4: '민트는 거래 시점은 보지만 누구에게 지불하는지는 보지 못합니다 (블라인드 서명)', + future: '향후 기능: 민트 로테이션과 프라이버시 점수 - 기대해 주세요!', + findMore: 'mintradar.pedani.eu에서 더 많은 민트 찾기', + trustWarning: '신뢰 경고:', + trustWarningDesc: '민트는 수탁형입니다 - 자금을 보관합니다. 신뢰하는 민트만 사용하세요. 민트가 사라지면 자금을 잃을 수 있습니다. 여러 민트에 자금을 분산하면 위험이 줄어듭니다.', + removeTitle: '민트를 제거할까요?', + removeDesc: '{{name}}을(를) 제거하시겠습니까?', + removeMint: '민트 제거', + warning: '경고:', + withdrawWarning: '이 민트에 {{amount}} sats가 있습니다. 제거하기 전에 자금을 인출하세요!', + invalidUrl: '잘못된 URL', + invalidUrlDesc: '민트 URL은 https://로 시작해야 합니다', + mintAdded: '민트 추가됨', + mintAddedDesc: '새 민트가 성공적으로 추가되었습니다', + mintAddedNamed: '{{name}}이(가) 성공적으로 추가되었습니다', + failedAdd: '민트 추가 실패', + failed: '실패', + noMints: '민트 없음', + singleMint: '단일 민트', + concentrated: '집중됨', + moderate: '보통', + wellDistributed: '잘 분산됨', + mintCoinosWebDesc: '웹 친화적 민트 (브라우저에 권장)', + mintMinibitsWebDesc: '⚠ 네이티브 앱 전용 — 웹 브라우저에서 접근 불가', + mintMinibitsNativeDesc: 'SkateSpots 민트 — 권장', + mintCoinosDesc: '웹 친화적 민트', + mintLnbitsDesc: 'LNbits의 커뮤니티 민트', + }, + nwc: { + title: 'Lightning 지갑', + noConnection: 'NWC 지갑', + refresh: '잔액 새로고침', + createInvoice: '인보이스 만들기', + copyInvoice: '인보이스 복사', + pasteInvoice: 'Lightning 인보이스 붙여넣기 (lnbc…)', + amount: '금액: {{amount}} sats', + pasteToSee: '금액을 보려면 인보이스를 붙여넣으세요', + pay: '결제', + invoiceQrAlt: 'Lightning 인보이스 QR 코드', + enterAmount: 'sats 금액을 입력하세요', + readBalanceFailed: '잔액을 읽을 수 없습니다', + readBalanceFailedDesc: '지갑이 응답하지 않았습니다.', + createInvoiceFailed: '인보이스를 만들 수 없습니다', + createInvoiceFailedDesc: '잠시 후 다시 시도하세요.', + paymentSent: '결제 완료', + paidAmount: '{{amount}} sats를 결제했습니다.', + paid: '결제됨.', + paymentRejected: '지갑이 결제를 거부했습니다.', + }, + qr: { + title: 'QR 코드 스캔', + desc: '카메라 화면에 QR 코드를 맞추세요', + paste: '클립보드에서 붙여넣기', + hint: 'Cashu 토큰, Lightning 인보이스 또는 Lightning 주소를 스캔하세요', + clipboardEmpty: '클립보드 비어 있음', + clipboardEmptyDesc: '클립보드에서 텍스트를 찾을 수 없습니다', + pasteFailed: '붙여넣기 실패', + pasteFailedDesc: '클립보드에서 읽을 수 없습니다', + }, + recovery: { + title: '복구 문구', + desc: '이 12개 단어가 ecash 잔액을 복원하는 유일한 방법입니다. 순서대로 적어 오프라인에 보관하세요 — 누구에게도 공유하지 마세요.', + tapReveal: '탭하여 보기', + noWatching: '아무도 보고 있지 않은지 확인하세요', + hide: '숨기기', + reveal: '보기', + paperHint: '종이에 적는 것이 가장 안전합니다 — 클립보드에 복사하면 다른 앱에 유출될 수 있습니다.', + written: '적어 두었습니다', + revealFirst: '먼저 단어를 보여주세요', + copiedDesc: '복구 문구를 복사했습니다 — 안전한 곳에 붙여넣은 뒤 클립보드를 비우세요.', + copyFailed: '복사 실패', + copyFailedDesc: '대신 단어를 직접 적어주세요.', + }, + guide: { + quickGuide: '빠른 안내', + fullGuide: '지갑 안내 (스케이터 에디션)', + cashuSummary: '프라이버시 + 편의성', + mintHoldsFunds: '(민트가 자금 보관)', + lightningSummary: '통제 + 보안', + youHoldKeys: '(내가 키 보유)', + useBoth: '둘 다 사용: 팁은 Cashu, 저축은 Lightning', + cashuTitle: 'CASHU 지갑', + cashuTagline: '스케이트파크에서 주머니 속 현금 같은 것', + cashuBullet1: '팁 줄 때 꺼내기 빠름', + cashuBullet2: '전 재산을 여기 두지 마세요', + cashuBullet3: '민트가 사라지면 자금을 잃을 수 있습니다', + cashuBullet4: '아무도 당신이 얼마 가졌는지 모릅니다 (프라이버시!)', + cashuPerfectFor: '세션 간식, 클립에 Zap, 소액 팁', + lightningTitle: 'LIGHTNING 지갑', + lightningTagline: '은행 계좌처럼 - 당신이 통제합니다', + lightningBullet1: '안전하고, 키를 직접 통제', + lightningBullet2: '설정에 잠시 시간이 걸림', + lightningBullet3: '전체 거래 내역', + lightningBullet4: '큰 금액에 더 적합', + lightningPerfectFor: '장비 구매, 저축, 큰 Zap', + perfectFor: '이런 때 완벽:', + proTips: '프로 팁', + tip1Title: '두 지갑 모두 사용', + tip1Desc: '세션 자금은 Cashu에, 저축은 Lightning에', + tip2Title: '다양한 지갑 시도', + tip2Desc: '직접 실험해 자신에게 맞는 것을 찾으세요. 각기 다른 기능과 장단점이 있습니다', + tip3Title: '더 나은 프라이버시', + tip3Desc: '여러 지갑을 사용하면 어떤 단일 앱도 모든 활동을 볼 수 없습니다', + tip4Title: '경험 쌓기', + tip4Desc: '아는 도구가 많을수록 선택지가 넓어집니다. 작게 시작하고 하면서 배우세요', + tldr: '요약:', + tldrDesc: '“최고”의 지갑은 없습니다 - 필요에 따라 다릅니다. 둘 다 시도하고 느낌이 좋은 것을 사용하되, sats를 한곳에 몰아두지 마세요!', + }, + zap: { + count: '{{count}} Zap', + connectFirst: '먼저 지갑을 연결하세요', + connectFirstDesc: 'Zap(Bitcoin 팁)을 보내려면 Lightning 지갑을 연결해야 합니다.', + quickSetup: '빠른 설정 (30초)', + quickSetupDesc: 'Nostr Wallet Connect (NWC)로 기존 Lightning 지갑을 연결하세요. 추가 계정이 필요 없습니다.', + connectNwc: 'NWC로 지갑 연결', + noWallet: '지갑이 없나요? 알아보기', + skip: '나중에 (수동 인보이스)', + note: 'ℹ️ 참고:', + noteDesc: '지갑을 연결하지 않고도 인보이스를 만들 수 있지만, 결제하려면 직접 복사해야 합니다.', + payWithWebln: 'WebLN으로 결제', + processing: '처리 중...', + openInWallet: 'Lightning 지갑에서 열기', + scanHint: 'QR 코드를 스캔하거나 인보이스를 복사해 아무 Lightning 지갑으로 결제하세요.', + cashuInstant: '내장 지갑으로 즉시 결제', + satsAvailable: 'sats 사용 가능', + or: '또는', + customAmount: '사용자 지정 금액', + addComment: '댓글 추가 (선택 사항)', + insufficientBanner: '⚠️ Cashu 잔액이 부족합니다. {{amount}} sats가 더 필요합니다. Lightning으로 전환하거나 Cashu 지갑을 충전하세요.', + creatingInvoice: '인보이스 생성 중...', + zapAmount: '{{amount}} sats Zap', + zapAmountCashu: 'Cashu로 {{amount}} sats Zap', + lightningInvoice: 'Lightning 인보이스', + qrAlt: 'Lightning 인보이스 QR 코드', + enterAmount: '금액 입력', + enterAmountDesc: '프리셋을 선택하거나 유효한 sats 수를 입력하세요.', + cashuUnavailable: 'Cashu 지갑을 사용할 수 없음', + cashuUnavailableDesc: 'Cashu 지갑이 준비되지 않았습니다. Lightning으로 전환하거나 먼저 지갑을 여세요.', + insufficientCashu: 'Cashu 잔액 부족', + insufficientCashuDesc: '{{amount}} sats가 더 필요합니다. Lightning으로 전환하거나 충전하세요.', + zapSentCashu: 'Zap 전송 완료! 🥜', + zapSentCashuDesc: 'Cashu 지갑에서 {{amount}} sats를 Zap했습니다.', + cashuFailed: 'Cashu 결제 실패', + cashuFailedDesc: 'Cashu 지갑으로 결제하지 못했습니다.', + invoiceCopied: '인보이스 복사됨', + invoiceCopiedDesc: 'Lightning 인보이스를 클립보드에 복사했습니다', + defaultComment: 'SkateSpots에서 Zap! 🛹', + titleConnect: '지갑 연결', + titlePayment: 'Lightning 결제', + titleZap: 'Zap 보내기', + descConnect: 'Zap을 보내려면 Lightning 지갑을 연결하세요', + descPayment: 'Bitcoin Lightning Network로 결제', + descZap: 'Zap은 이 항목의 창작자를 후원하는 소액 Bitcoin 결제입니다. 즐거우셨다면 Zap을 보내보세요!', + descZapShort: 'Zap은 창작자를 후원하는 소액 Bitcoin 결제입니다. Zap을 보내보세요!', + }, + zapCrew: { + title: '크루에 Zap', + desc: 'Lightning 주소가 있는 {{count}}명의 크루 멤버에게 Zap을 균등하게 나눕니다.', + noMembers: '지금 Zap할 다른 크루 멤버가 없습니다.', + totalAmount: '총 금액', + customTotal: '사용자 지정 합계', + each: 'sats씩', + rounded: '(반올림)', + noWallet: '지갑이 연결되지 않았습니다 — 멤버당 인보이스를 받아 수동으로 결제하게 됩니다. 원탭 분할을 위해 지갑을 연결하세요.', + zapAcross: '{{count}}명에게 {{amount}} sats Zap', + sentTo: '⚡ {{done}}/{{total}} 전송됨', + none: '자동 결제가 완료되지 않았습니다', + copyPending: '수동으로 결제를 마치려면 대기 중인 인보이스를 복사하세요.', + thanks: '크루를 후원해 주셔서 감사합니다!', + payingCrew: '크루에게 지불 중…', + defaultComment: '{{crew}} 크루에 Zap! 🤘', + sent: '전송됨', + paying: '지불 중', + resolving: '확인 중', + skipped: '건너뜀', + failed: '실패', + waiting: '대기 중', + copyInvoice: '인보이스 복사', + invoiceCopied: '인보이스 복사됨', + invoiceCopiedDesc: '아무 Lightning 지갑에 붙여넣으세요', + }, + zapBadges: { + title: 'Zap 배지', + zaps: 'Zap', + satsSent: 'sats 전송', + rank: '순위', + footnote: '최근 30일간의 Zap 기준.', + first: '첫 Zap', + firstHint: '첫 Zap을 보내세요', + regular: '단골', + regularHint: 'Zap 10회 보내기', + generous: '후함', + generousHint: '10,000 sats 보내기', + patron: '후원자', + patronHint: '100,000 sats 보내기', + top10: '톱 10', + top10Hint: '상위 10명 후원자에 들기', + }, + trust: { + unavailable: '신뢰 점수를 사용할 수 없음', + yourContent: '내 콘텐츠입니다', + following: '팔로우하는 사용자입니다', + friendOfFriend: '친구의 친구 (2단계)', + nip05: 'NIP-05 인증 사용자', + unknown: '알 수 없는 사용자', + help: '신뢰 점수는 스케이트보딩 커뮤니티에서 신뢰할 수 있는 기여자를 식별하는 데 도움이 됩니다.', + }, + share: { + title: '프로필 공유', + desc: '휴대폰 카메라를 코드에 비추면 {{name}}님의 프로필이 열립니다.', + qrAlt: '프로필 QR 코드', + copyLink: '링크 복사', + copyFailed: '복사 실패', + copyFailedDesc: '링크를 복사할 수 없습니다.', + shareEllipsis: '공유…', + }, + addToCollection: { + title: '컬렉션에 저장', + desc: '“{{spot}}”을(를) 컬렉션에 저장', + loginRequired: '컬렉션에 스팟을 저장하려면 로그인하세요', + noCollections: '아직 컬렉션이 없습니다', + createFirst: '아래에서 첫 컬렉션을 만드세요!', + spotCount: '{{count}}개 스팟', + alreadySavedTag: '이미 저장됨', + alreadySaved: '이미 저장됨', + alreadySavedDesc: '“{{spot}}”은(는) 이미 “{{collection}}”에 있습니다', + saved: '스팟 저장됨!', + savedDesc: '“{{spot}}”을(를) “{{collection}}”에 추가했습니다', + saveFailed: '저장 실패', + somethingWrong: '문제가 발생했습니다', + created: '컬렉션 생성됨!', + createdDesc: '“{{spot}}”을(를) 새 컬렉션 “{{collection}}”에 추가했습니다', + createFailed: '컬렉션 생성 실패', + name: '컬렉션 이름', + descriptionOptional: '설명 (선택 사항)', + creating: '만드는 중...', + createAndSave: '만들고 저장', + createNew: '새 컬렉션 만들기', + }, + collection: { + back: '컬렉션으로 돌아가기', + created: '{{date}} 생성', + deleteTitle: '컬렉션을 삭제할까요?', + deleteDesc: '“{{title}}”이(가) 영구히 삭제됩니다. 스팟 자체는 영향을 받지 않습니다.', + deleting: '삭제 중...', + deleteFailed: '컬렉션 삭제 실패', + deleted: '컬렉션 삭제됨', + deletedDesc: '“{{title}}”이(가) 제거되었습니다', + empty: '이 컬렉션에 스팟이 없습니다', + emptyOwner: '아무 스팟에서 “컬렉션에 저장”을 눌러 스팟을 컬렉션에 추가하세요', + emptyOther: '이 컬렉션은 비어 있습니다', + browseSpots: '스팟 둘러보기', + linkCopied: '링크 복사됨!', + linkCopiedDesc: '컬렉션 링크를 클립보드에 복사했습니다', + map: '컬렉션 지도', + removeFailed: '스팟 제거 실패', + shareText: '이 스팟 컬렉션을 확인해 보세요: {{title}}', + spotRemoved: '스팟 제거됨', + spotRemovedDesc: '“{{title}}”이(가) 이 컬렉션에서 제거되었습니다', + }, + mints: { + title: '민트', + subtitle: 'Cashu 민트와 상태를 둘러보세요. Cashu 지갑 작업은 SkateSpots 앱에서 실행됩니다.', + searchPlaceholder: '이름이나 URL로 민트 검색…', + onlineOnly: '온라인만', + count: '{{total}}개 중 {{filtered}}개 민트', + directoryError: '민트 디렉터리를 불러올 수 없습니다.', + directoryHint: '디렉터리는 커뮤니티가 운영하며 속도 제한이 있습니다 — 잠시 사용할 수 없을 수 있습니다.', + goToWallet: '지갑으로 이동', + appOnly: '민트 추가는 SkateSpots 앱에서 합니다 (Cashu는 앱 전용).', + noMatch: '“{{query}}”와 일치하는 민트가 없습니다.', + footer: '커뮤니티 MintRadar 프로젝트의 상태 데이터 — 비공식이며 오래된 정보일 수 있습니다. 자금을 맡기기 전에 항상 민트의 약관을 확인하세요.', + archived: '보관됨', + degraded: '성능 저하', + offline: '오프라인', + online: '온라인', + terms: '약관', + reliability: '안정성', + add: '추가', + addToWallet: '지갑에 추가', + copyUrl: 'URL 복사', + openMint: '민트 열기', + inWallet: '지갑에 있음', + addedBadge: '추가됨', + urlCopied: '민트 URL 복사됨', + added: '민트 추가됨', + addedDesc: '{{host}}이(가) 이제 지갑에 있습니다.', + couldNotAdd: '민트를 추가할 수 없습니다', + communityRating: '커뮤니티 평점', + reliabilityLabel: '안정성', + uptime: '가동 시간 24시간 / 7일', + location: '위치', + latency: '지연 시간', + nuts: '지원 NUT', + units: '단위', + version: '버전', + ratedBy: 'MintRadar에서 {{count}}명이 {{rating}}/5로 평가했습니다.', + noRating: 'MintRadar에 아직 커뮤니티 평점이 없습니다.', + reviewsNote1: '작성된 리뷰는 디렉터리에 없습니다 —', + openMintRadar: 'MintRadar 열기', + reviewsNote2: '리뷰를 읽거나 남기려면.', + liveness: '활성 감사: 민트 {{mints}}개와 멜트 {{melts}}개 테스트됨', + livenessErrors: ' · 최근 오류 {{errors}}/{{total}}', + whatsAMint: '민트란?', + whatsAMintDesc: 'Cashu 민트는 지갑에 있는 ecash를 발행하고 교환합니다. 토큰을 뒷받침하는 Bitcoin을 보관합니다 — 따라서 직접 운영하지 않는 민트는 신뢰해야 하는 대상입니다.', + mintWarning: '민트는 오프라인이 되거나, 약관을 바꾸거나, 자금을 들고 사라질 수 있습니다. 운영자를 신뢰하지 않는 한 소액만 보관하세요.', + healthDisclaimer: '상태 데이터는 커뮤니티 운영 (MintRadar) — 비공식이며 오래된 정보일 수 있습니다.', + }, + appShop: { + title: '앱 숍', + subtitle: '씬을 굴러가게 만드는 사람들을 위한 SkateSpots 굿즈.', + comingSoon: '곧 출시', + wearThe: '입으세요,', + scene: '씬을', + heroDesc1: '이걸 굴러가게 만드는 사람들을 위한 굿즈 — 판매는', + locally: '현지에서, 요청 시', + heroDesc2: '. 메시지를 보내면 세부 사항을 정리하고, 수령할 때', + heroDesc3: '— Lightning 또는 Cashu — 로 결제하시면 됩니다. 카드도, 계정도, 결제 로봇도, 드롭에서 수익을 떼가는 중개인도 없습니다.', + requestItem: '물품 요청', + dmHint: '나와의 비공개 암호화 DM을 엽니다.', + lightning: 'Lightning', + cashu: 'Cashu', + localHandover: '현지 전달', + inTheWorks: '준비 중', + notForSale: '아직 판매하지 않음', + soon: '곧', + tees: '티셔츠 & 후디', + decks: '데크', + shopTools: '숍 공구', + stickerPacks: '스티커 팩', + stickerPacksDesc: '팩은 준비 중입니다. 디자인은 아직 — 지금 이 두 개를 무료로 인쇄하세요.', + sticker: '스티커', + stickerTip: '검정 다이컷. 스티커 용지에 인쇄하고 검정 가장자리를 따라 자르세요.', + poster: '포스터', + posterTip: 'A3로 인쇄됩니다. A4로 축소(50%)해도 스캔이 잘 됩니다.', + printableAlt: 'SkateSpots {{title}} — 인쇄 가능', + print: '인쇄', + printNote1: '인쇄 설정:', + actualSize: '100% / “실제 크기”', + printNote2: '크기가 정확하고 QR이 선명하게 유지되도록 — skate-spots.org를 가리킵니다. 벡터 파일이라 흐려지지 않고 확대됩니다.', + howBuying: '구매 방법', + dmNotCart: '장바구니가 아니라 DM입니다', + step1Title: '메시지 보내기', + step1Desc: '원하는 것을 DM으로 보내세요 — 물품, 사이즈, 색상 등등.', + step2Title: '함께 정리', + step2Desc: 'sats로 가격을 정하고, 어디서 언제 만날지 정합니다. 결제가 아니라 대화입니다.', + step3Title: 'sats로 결제', + step3Desc: '전달 시 Lightning 또는 Cashu로 결제하면 당신 것입니다. 배송도, 대기실도 없습니다.', + }, + newsletter: { + newIssue: '새 호', + composerTitle: '뉴스레터 호 발행', + composerDesc: '커뮤니티 릴레이에 NIP-23 글 (kind 30023)로 발행됩니다. 구독자는 알림 종에서 받습니다. 본문은 Markdown을 지원합니다.', + fieldTitle: '제목', + identifier: '식별자 (슬러그)', + leaveBlank: '자동 생성을 위해 비워 두기', + reusingSlug: '기존 슬러그를 재사용하면 새 글을 만드는 대신 그 호를 편집합니다.', + summary: '요약', + optional: '선택 사항', + coverImage: '커버 이미지 URL', + bodyMarkdown: '본문 (Markdown)', + characters: '{{count}}자', + publishIssue: '호 발행', + issuePublished: '호가 발행되었습니다! 🛹', + issuePublishedDesc: '구독자가 알림 종에서 볼 수 있습니다.', + publishFailed: '발행 실패', + couldNotReachRelay: '어떤 릴레이에도 연결할 수 없습니다 — 연결을 확인하고 다시 시도하세요.', + tryAgain: '다시 시도하세요.', + publishedToNostr: 'Nostr에 발행됨', + publishedToast: '발행됨!', + postedToNostr: 'Drop {{number}}이(가) Nostr에 게시되었습니다.', + postToNostr: 'Nostr에 게시', + previewLabel: '미리보기', + editFirst: '먼저 편집', + previewNoteDesc: '대부분의 Nostr 클라이언트에서 노트가 이렇게 표시됩니다. 서식은 클라이언트마다 다릅니다.', + editNoteDesc: '아래에서 노트 텍스트를 편집하세요. 변경 사항은 이번 발행에만 적용됩니다 — 원본 파일은 그대로입니다.', + dropNumber: 'Drop {{number}}', + publish: '발행', + publishing: '발행 중...', + dropIsOut: 'Drop {{number}} 나왔습니다', + daysAgo: '{{count}}일 전', + dismiss: '닫기', + itsMonday: '월요일입니다', + mondayDesc: '주간 뉴스레터를 보낼 시간입니다. 클릭 한 번이면 AI가 git 로그에서 작성합니다.', + writeDrop: 'Drop {{number}} 작성', + dismissReminder: '알림 닫기', + loginPrompt: 'Nostr로 로그인하면 새 드롭을 우편함에서 받습니다.', + subscribedToast: '구독되었습니다! 🛹', + subscribedToastDesc: '새 드롭이 “뉴스” 아래 알림 종에 도착합니다.', + unsubscribed: '구독 취소됨', + unsubscribedDesc: '언제든 여기서 모든 호를 읽을 수 있습니다.', + checking: '확인 중…', + subscribed: '구독 중', + unsubscribe: '구독 취소', + subscribeCta: '뉴스레터 구독', + archiveSynced: '아카이브가 Nostr에 동기화됨', + missingCount: '{{count}}개 아카이브 호가 아직 Nostr에 없음', + backfillDesc: '{{list}}을(를) NIP-23 글로 발행해 구독자와 장문 독자가 전체 아카이브를 볼 수 있게 합니다. 페이지는 그대로 풍부한 레이아웃을 유지합니다.', + backfill: '{{count}}개를 Nostr에 백필', + publishing2: '발행 중…', + publishingLabel: '발행 중…', + backfilled: '{{count}}개 호를 백필했습니다 🛹', + backfilledDesc: '이제 아카이브가 구독자와 독자를 위해 Nostr에 있습니다.', + partialBackfill: '{{published}}개 발행, {{failed}}개 실패', + retryFinish: '완료하려면 재시도: {{list}}.', + notLoggedIn: '로그인하지 않음', + allIssues: '모든 호', + brand: 'SkateSpots 뉴스레터', + digTheDrop: '드롭이 마음에 드나요? Zap하고 다음 것을 놓치지 마세요.', + sectionStats: '숫자로 보는 커뮤니티', + sectionWhatsNew: '새 소식', + sectionSpotOfWeek: '이주의 스팟', + sectionCommunity: '커뮤니티', + sectionSupport: '프로젝트 후원', + sectionLatestDrops: '최신 드롭 · Nostr에서 라이브', + mappedBy: '매핑:', + viewOnMap: '지도에서 보기', + noSpotPicked: '이번 주 선택된 스팟이 없습니다. 여러분의 스팟을 제출하면 다음 드롭에 실릴 수 있습니다.', + browseMap: '지도 둘러보기', + spotMap: '스팟 지도', + statsBadge: '통계', + supportDesc: '100% 오픈 소스, 커뮤니티 자금, 광고 없음, 투자자 없음. 유용하다면 Zap하거나 Angor에서 후원하세요.', + readFull: '전체 호 읽기', + joinSkaters: '드롭을 받는 {{count}}명의 스케이터에 합류', + weeklyDrops: '주간 드롭', + tagline: '주간 뉴스레터 · 우리가 원할 때 발행', + freeNote: '무료. Nostr로 구동 — 구독은 당신의 키에 있고 기기를 넘어 따라옵니다. 새 드롭은 알림 종에 도착합니다.', + live: '라이브', + builtOn: '기반:', + openSource: '오픈 소스', + supportUs: '후원하기', + freeToSkate: '당신은 스케이트보드를 탈 자유가 있습니다', + }, + stats: { + subtitle: 'Nostr 네트워크에서 직접 가져온 라이브 지표. 투명하고, 탈중앙화되어 있으며, 누구나 검증할 수 있습니다.', + dataSource: '데이터 출처:', + updated: '{{age}} 업데이트', + refresh: '새로고침', + partial: '모든 릴레이에 연결하지 못했습니다 — 이 숫자는 불완전할 수 있습니다.', + error: '지금 릴레이에 연결할 수 없습니다. 연결이 복원되면 통계가 로드됩니다.', + atAGlance: '한눈에 보는 커뮤니티', + skateSpots: '스케이트 스팟', + listedShops: '등록된 숍', + events: '이벤트', + mappers: '매퍼', + uniqueContributors: '고유 기여자', + labHeader: 'The Lab · 창작자 & 서비스', + total: '총 {{count}}', + coaches: '코치', + filmers: '필머', + editors: '에디터', + photographers: '포토그래퍼', + builders: '빌더', + artists: '아티스트', + graffiti: '그라피티', + tattoo: '타투', + trainers: '트레이너', + musicians: '뮤지션', + judges: '심판', + organizers: '주최자', + barbers: '바버', + showFewer: '접기', + showAllCrafts: '13개 분야 모두 보기', + community: '커뮤니티', + tours: '투어', + crews: '크루', + marketplace: '마켓플레이스', + liveListings: '라이브 등록', + tradesRecorded: '기록된 거래', + satsTraded: '거래된 Sats', + zapsToMappers: '매퍼에게 보낸 Zap', + tradesNote1: '상호 거래, 대상', + tradesNote2: '명. Sats는 거래자가 자기 신고합니다 — 앱은 앱 밖 결제를 관찰할 수 없으므로 — 따라서 헤드라인 수치는 다음만 집계합니다', + mutual: '상호', + tradesNote3: '쌍당 상한이 있는 거래; 원시 주장은', + tradesNote4: 'sats. “매퍼에게 보낸 Zap”은 최상위 기여자에게 보낸 영수증만 집계합니다 — 이는', + not: '결코', + tradesNote5: '전체 Zap 규모가 아닙니다.', + byRegion: '지역별 스팟 & 숍', + resolving: '좌표에서 태그 없는 위치 {{count}}개 확인 중… 일회성이며 이후 이 기기에 캐시됩니다.', + topCountries: '상위 국가', + topCities: '상위 도시', + other: '기타', + otherCountriesTitle: '상위 6개 외 국가', + otherCitiesTitle: '상위 6개 외 도시', + uncategorised: '미분류', + uncategorisedTitle: '도시/국가 태그 없음', + regionNote1: '수치는', + spotsAndShops: '스팟 & 숍', + regionNote2: '개수이며, 스케이터가 아니라 각자의 도시/국가 태그 또는 태그가 없을 때 핀 좌표에서 도출됩니다 (기기에 캐시되며, 국가는 있을 경우 ISO 코드로 그룹화), 커뮤니티 릴레이만, 검열로 숨겨진 콘텐츠 제외.', + ofTotal: '{{total}}개 중 {{count}}개', + regionNote3: '위치에 위치 태그가 없어 “미분류”로 표시됩니다.', + growth: '시간에 따른 성장', + chartCumulativeTitle: '매핑된 스팟 (누적)', + chartCumulativeDesc: '시간에 따라 지도에 추가된 총 스팟', + chartMonthlyTitle: '월간 활동', + chartMonthlyDesc: '매달 발행된 새 콘텐츠', + chartMappersTitle: '월별 활성 매퍼', + chartMappersDesc: '매달 발행하는 고유 기여자', + chartMixTitle: '콘텐츠 구성', + chartMixDesc: '콘텐츠 유형별 분석 (전체 기간)', + noData: '아직 데이터 없음', + topMappers: '최고 매퍼', + mostSpots: '— 가장 많은 스팟 추가', + noMapperData: '아직 매퍼 데이터 없음', + topShops: '최고 숍', + mostShops: '— 가장 많은 숍 추가', + shopCount: '숍 {{count}}개', + noShopData: '아직 숍 데이터 없음', + supporters: '커뮤니티 후원자', + fundedTitle: '커뮤니티가 후원함', + fundedDesc1: 'Angor를 통한 탈중앙화 Bitcoin 크라우드펀딩.', + fundedDesc2: '광고 없음, 투자자 없음, 데이터 판매 없음.', + backAngor: 'Angor에서 후원', + communityLink: '커뮤니티 →', + footer1: '모든 데이터는 다음에서 라이브로 가져옵니다', + footer2: '— 공개 Nostr 릴레이.', + footer3: '모든 이벤트는 창작자가 서명하며 암호학적으로 검증 가능합니다.', + footer4: '어떤 숫자도 조작할 수 없습니다.', + spots: '스팟', + shops: '숍', + lab: 'Lab', + thisMonth: '이번 달 +{{count}}', + fromActive: '활성 계정 {{count}}개에서', + viewAll: '모두 보기', + spotCount: '스팟 {{count}}개', + }, + leaderboard: { + mapEarn: '매핑 & 수익', + helpMap: '세상을 매핑하도록 도와주세요', + intro: '스팟과 숍을 추가하면 고마운 스케이터들이 Zap을 보냅니다. 최고 기여자는 보너스 보상을 받을 수 있습니다!', + howItWorks: '작동 방식', + step1Title: '1. 매핑', + step1Desc: '사진과 세부 정보로 스팟 & 숍 추가', + step2Title: '2. Zap 받기', + step2Desc: '당신의 스팟이 유용하다고 느낀 스케이터가 팁을 보냅니다', + step3Title: '3. 보너스 보상', + step3Desc: '최고 매퍼는 저희 기금에서 보너스 보상을 받을 수 있습니다', + proTips: '💡 더 많은 Zap을 받는 프로 팁:', + tipPhotos: '사진 3장 이상 추가', + tipDescriptions: '상세한 설명 작성', + tipLocation: '정확한 위치', + mapShop: '숍 매핑', + mapShopDesc: '스케이트 숍, 보드 매장', + mapSpot: '스팟 매핑', + mapSpotDesc: '파크, 스트리트 스팟, DIY', + shops: '숍', + spotsLower: '스팟', + shopsLower: '숍', + contributions: '기여', + yourRanking: '내 순위', + spotsShops: '스팟 {{spots}}개 • 숍 {{shops}}개', + totalLower: '총', + overall: '종합', + noContributions: '아직 기여가 없습니다. 첫 번째가 되세요!', + addFirstSpot: '첫 스팟 추가', + noShops: '아직 매핑된 숍이 없습니다', + addFirstShop: '첫 숍 추가', + noSpots: '아직 매핑된 스팟이 없습니다', + poweredBy: '커뮤니티 Zap으로 구동', + poweredByDesc: '스팟이 도움이 되었다면 매퍼에게 Zap하세요! 감사를 전하고 더 많은 기여를 장려하는 가장 좋은 방법입니다.', + you: '나', + zapTitle: 'Zap 리더보드', + zapSubtitle: '가장 사랑받는 스팟 — 그리고 사랑을 주는 스케이터.', + thisWeek: '이번 주', + thisMonth: '이번 달', + allTime: '전체 기간', + topZappedSpots: '가장 많이 Zap된 스팟', + noZaps: '이 기간에 아직 Zap이 없습니다. 첫 번째가 되세요 — 좋아하는 스팟의 ⚡를 누르세요.', + topSupporters: '최고 후원자', + noZapsSent: '이 기간에 아직 보낸 Zap이 없습니다.', + fromTop10: '⚡ 상위 10명이 보낸 {{amount}} sats', + supporter: '후원자', + skateShop: '스케이트 숍', + skateSpot: '스케이트 스팟', + }, + supporters: { + our: '우리의', + community: '커뮤니티', + heroDesc: 'SkateSpots는 커뮤니티가 커뮤니티를 위해 만듭니다. 이걸 무료이고 탈중앙화된 상태로 유지하는 후원자, 협력자, 파트너, 친구들.', + backAngor: 'Angor에서 후원', + backers: '후원자', + backersDesc: 'SkateSpots를 후원한 스케이터 — Angor를 통한 온체인 펀딩과 프로젝트에 보낸 Lightning Zap.', + sourceAngor: 'Angor', + supportersTotals: '후원자 {{count}}명 · Angor로 {{angor}} sats · Zap으로 {{zap}} sats', + quietNote: '조용히 후원해 주신 모든 분께도 감사합니다. ❤️', + silentTitle: '프라이빗 온체인 (사일런트 페이먼트)', + silentDesc: '하나의 이름, 결제마다 새 주소 — 사일런트 페이먼트로 온체인, 또는 같은 레코드에서 Lightning. 재사용도, 연결도 없음.', + silentCopyName: '이름 복사', + silentCopied: '복사됨', + silentWallets: '결제 이름 / 사일런트 페이먼트를 지원하는 지갑이 필요합니다: Sparrow, Cake, Dana, Phoenix, BlueWallet, Wasabi, Nunchuk 또는 BitBox02.', + wayLightningTitle: '즉시 & 공개', + wayLightningDesc: 'SkateSpots에 Zap하거나 조용히 결제하세요. 로그아웃 상태에서도 작동.', + waySilentTitle: '프라이빗 온체인', + waySilentDesc: '사일런트 페이먼트 이름 — 결제마다 새 주소.', + wayAngorTitle: '빌드 자금 지원', + wayAngorDesc: 'Angor — 단계별 릴리스, 100k sats 초과분 환불 가능.', + donateTitle: 'SkateSpots 후원', + donateDesc: '세 가지 경로, 세 가지 이유 — 자신에게 맞는 것을 고르세요. 모든 sat이 지도를 무료, 광고 없음, 오픈 소스로 유지합니다.', + donatePageLink: '간단한 후원 페이지 열기', + updatedAt: '{{when}} 업데이트', + tiersNote: '등급: 서포터 100k sats 미만 · 패트론 100k–1M · 레전드 1M+', + tierEmpty: '아직 아무도 없습니다 — 첫 번째가 되세요.', + joinSupporters: '후원자 {{count}}명에 합류', + showAll: '{{count}}명 모두 보기', + showLess: '접기', + impactSeeStats: '전체 그림 보기 →', + impactAsOf: '커뮤니티 릴레이에서 라이브', + anonymousBacker: '익명 후원자', + beFirstBacker: '아직 공개 후원자가 없습니다 — 첫 번째가 되세요.', + backersTotal: '후원자 {{count}}명 · {{amount}} sats 모금', + verifiedOnChain: '온체인 검증됨', + supportedBy: '{{count}}명이 후원', + tierSupporter: '서포터', + tierPatron: '패트론', + tierLegend: '레전드', + topZappers: 'SkateSpots에 Zap한 사람들', + topZappersDesc: '프로젝트에 공개적으로 Zap을 보낸 스케이터. 조용한 결제는 목록에 없습니다.', + paysFor: '여러분의 후원이 지불하는 것', + paysForDesc: '모든 sat이 어디로 가는지 — 급여도, 사무실도, 광고도 없습니다.', + payRelay: '릴레이 호스팅', + payDomain: '도메인 & TLS', + payAi: 'AI / ContextVM 노드', + payDev: '개발 시간', + payOps: '운영', + payMarketing: '마케팅', + payRelayDesc: '지도를 온라인으로, 복원력 있게 유지합니다.', + payDomainDesc: '이름, 인증서, 보안 연결.', + payAiDesc: '커뮤니티 가이드, Sasquatch.', + payDevDesc: 'SkateSpots를 만들고 고칩니다.', + payOpsDesc: '이걸 돌아가게 하는 눈에 안 띄는 일.', + payMarketingDesc: '새로운 지역 씬과 스케이트 숍에 다가갑니다.', + impact: '지금까지의 영향', + impactDesc: '커뮤니티가 만들어 온 것 — 스케이터들이 후원합니다.', + impactSpots: '스팟', + impactCrews: '크루', + impactEvents: '이벤트', + impactLab: 'Lab 프로', + impactShops: '숍', + impactMappers: '매퍼', + support: '후원', + supportDesc: 'Angor에서 SkateSpots를 후원하세요 — 탈중앙화 온체인 Bitcoin 크라우드펀딩. 중개인도, KYC도 없습니다.', + collaborators: '협력자', + collaboratorsDesc: 'SkateSpots를 활발히 만드는 사람들 — 개발자, 디자이너, 릴레이 운영자.', + partners: '파트너', + partnersDesc: '우리가 긴밀히 협력하는 조직과 프로젝트.', + friends: '친구', + friendsDesc: '함께 어울리는 사람들.', + backTitle: 'Angor에서 프로젝트 후원', + backDesc: 'Angor는 Nostr 위에 구축된 탈중앙화 온체인 Bitcoin 펀딩입니다 — 자금은 당신의 통제 아래에 있고, 단계별로 풀리며, 누구도 자금을 보관하지 않습니다. 최대 100,000 sats의 기여는 기부처럼 처리되고(회수 핸드셰이크 없음), 그보다 큰 금액은 미사용 자금을 회수할 수 있는 투자입니다. 모든 sat은 개발, 릴레이 호스팅, 그리고 지구상 모든 스케이터를 위해 SkateSpots를 무료로 유지하는 데 쓰입니다.', + donateNote: '그냥 기부하고 싶으신가요? ⚡ 아래에서 Zap하세요 — 환불할 것도, 회수할 것도 없습니다.', + openAngor: 'Angor 열기', + orZap: '또는 앱에서 스팟, 크루, 창작자에게 바로 ⚡ Zap하세요', + wantCollaborate: '함께하고 싶으신가요?', + wantCollaborateDesc: '개발자, 디자이너, 실력 있는 스케이터 — 연락 주세요.', + viewNostrHub: 'NostrHub에서 보기', + wantPartner: 'SkateSpots와 파트너가 되고 싶으신가요? Nostr로 연락 주세요.', + comingSoon: '곧 출시', + wantListed: '여기에 목록에 오르고 싶으신가요?', + wantListedDesc: 'Nostr DM으로 로고(PNG/WebP, 투명 배경, 최소 200×200px)와 URL을 보내주세요 — 분위기가 맞을 때만.', + whyTitle1: '우리에게 후원이', + whyTitle2: '필요한 이유', + whyDesc: 'SkateSpots는 100% 무료, 오픈 소스이며 Nostr 위에 구축되어 있습니다 — 중앙 서버가 없어서 셧다운할 수 없는 탈중앙화 프로토콜. 광고 없음, 데이터 판매 없음, 투자자 없음. 모든 sat은 개발, 릴레이 호스팅, 그리고 지구상 모든 스케이터를 위해 무료로 유지하는 데 곧바로 쓰입니다.', + why1Title: 'Nostr 네이티브', + why1Desc: '중앙 서버가 없습니다. 당신의 데이터는 직접 고른 릴레이에 있습니다.', + why2Title: 'Bitcoin 기반', + why2Desc: '스팟을 매핑하고 sats를 버세요. 지역 숍에서 쓰세요.', + why3Title: '영원히 무료', + why3Desc: '오픈 소스, 페이월 없음, 추적 없음, VC 자금 없음.', + thankYou: '감사합니다. 모든 sat이 스팟을 지도에 남깁니다. 🛹⚡', + license: '라이선스', + faq: 'FAQ', + }, + admin: { + confirmed: '확인됨', + title: '검토 대기열', + subtitle: '정크 신호에 걸린 스팟, 숍, 이벤트, 투어, 장비. 숨기기와 확인은 부드럽고 되돌릴 수 있는 라벨이며, 신고가 우선순위입니다. 아무것도 삭제되지 않습니다.', + tabReports: '신고', + tabSpots: '스팟', + tabShops: '숍', + tabEvents: '이벤트', + tabTours: '투어', + tabGear: '장비', + tabCrews: '크루', + tabLab: 'Lab', + tabClaims: '소유권 주장', + nothingToReview: '검토할 것이 없습니다 — 이 종류에서 정크 신호에 걸리는 것이 없습니다.', + hideActioned: '처리한 항목 숨기기', + showActioned: '처리한 항목 보기 ({{count}})', + undoAll: '{{count}}개 모두 되돌리기', + undoAllTitle: '이 탭의 모든 판정을 되돌릴까요?', + undoAllDesc: '각 항목을 중립으로 되돌립니다 — 숨김도, 보증도 아닙니다. 항목마다 공개 라벨 하나를 발행하므로, Amber에서는 {{count}}개의 승인 화면이 뜹니다.', + undoCount: '{{count}}개 되돌리기', + undo: '되돌리기', + confirm: '확인', + hide: '숨기기', + hideIt: '숨기기', + hideForEveryone: '모두에게서 숨길까요?', + hideForEveryoneDesc: '모든 SkateSpots 사용자의 둘러보기와 검색에서 이 항목을 제거합니다. 공개적이고 되돌릴 수 있는 라벨입니다 — 이 대기열에서 되돌릴 수 있습니다.', + hidden: '숨김', + hiddenDesc: '공개 라벨로 앱에서 제거되었습니다. 되돌릴 수 있습니다.', + couldNotHide: '숨길 수 없습니다', + notASpot: '스케이트 스팟이 아님', + lookAtIt: '살펴보기', + }, + profile: { + nip05Verified: 'NIP-05 인증됨', + nip05NotVerified: '이 키에 대해 NIP-05가 인증되지 않음', + message: '메시지', + zapsReceived: '받은 Zap', + memberSince: '가입일', + badges: '배지', + sponsorsSupport: '스폰서 & 후원', + skater: '스케이터', + stance: '스탠스', + skating: '스케이팅', + homeSpot: '홈 스팟', + basedIn: '거주지', + addSkateDetails: '스케이트 정보 추가', + addSkateDetailsDesc: '스탠스, 스타일, 레벨을 설정해 스케이터 디렉터리에 나타나세요.', + spotsAdded: '추가한 스팟', + shopsAdded: '추가한 숍', + noSpots: '아직 추가한 스팟이 없습니다', + noSpotsDesc: '당신의 로컬 스팟을 지도에 올리세요 →', + stash: 'Stash', + gear: '장비', + crews: '크루', + info: '정보', + lightning: 'Lightning', + silentPayment: '사일런트 페이먼트', + coordinator: '코디네이터', + coordinatorAdded: '코디네이터 추가됨', + add: '추가', + messagePrivately: '비공개 메시지', + founder: '설립자', + member: '멤버', + supportSkater: '이 스케이터 후원', + supportSkaterDesc: '기여에 감사하는 팁을 보내세요', + }, + index: { + joinCommunity: '커뮤니티에 합류해 스팟 추가, 이벤트 만들기 등을 하세요', + topZapped: '최다 ZAP', + topZappedDesc: '이번 달 가장 많은 후원을 받은 스팟', + leaderboard: '리더보드', + newHere: '처음이신가요?', + newHereDesc: '무료 계정을 만들어 스팟을 추가하고, 이벤트에 참여하고, 스케이터들과 연결되고, 커뮤니티의 일원이 되세요. 이메일이 필요 없습니다.', + followFounder: '설립자 팔로우', + followFounderDesc: '아바타를 3초간 길게 눌러 팔로우하고 새 기능과 이벤트 소식을 받아보세요!', + createAccount: '계정 만들기', + accountWorks: '계정은 네트워크의 모든 앱에서 작동합니다', + footerTagline: '오픈 소스 • 커뮤니티 소유 • 광고 없음', + }, + stash: { + title: '내 Stash', + loginDesc: '당신의 비공개 장비 인벤토리. 소유한 것을 추적하고, 가격을 정하고, 거래자와 선택적으로 공유하세요.', + encrypted: '암호화됨', + syncsEverywhere: '어디서나 동기화', + p2pTrading: 'P2P 거래', + encryptionRequired: '암호화 필요', + encryptionRequiredDesc: 'Stash는 프라이버시를 위해 암호화됩니다. NIP-44 암호화를 지원하는 서명자(예: Alby, nos2x, Amber)를 사용하세요.', + learnSigners: '서명자 알아보기', + select: '선택', + stash: 'Stash', + wishlist: '위시리스트', + allCategories: '모든 카테고리', + sortNewest: '최신순', + sortValue: '가치순', + sortCondition: '상태순', + sortAz: '가나다순', + friendsOnly: '친구만', + addToWishlist: '위시리스트에 추가', + addItemToStash: 'Stash에 아이템 추가', + addItem: '아이템 추가', + editItem: '아이템 편집', + publicStash: '공개 Stash', + listView: '목록 보기', + gridView: '그리드 보기', + uploading: '업로드 중...', + addPhotos: '사진 추가', + wishlistReqPlaceholder: '특별한 요구 사항...', + itemDescPlaceholder: '아이템, 손상 등을 설명하세요...', + itemsCount: '{{count}}개 아이템', + wishlistEmpty: '위시리스트가 비어 있음', + wishlistEmptyDesc: '찾고 있는 장비를 추가하세요 — 친구들의 Stash와 연결해 드립니다.', + stashEmpty: 'Stash가 비어 있습니다', + stashEmptyDesc: '장비 추적을 시작하세요. 데크, 트럭, 신발 — 한 번 추가하면 Nostr를 통해 어디서나 접근할 수 있습니다.', + noMatch: '일치하는 아이템 없음', + noMatchDesc: '필터를 조정해 보세요.', + backupTransfer: '백업 & 전송', + backupDesc: 'Stash는 Nostr에 암호화되어 있습니다. 당신이 통제하는 사본을 보관하세요 — 릴레이가 죽거나 새 계정을 만들어도 장비 목록을 잃지 않습니다.', + exportTitle: '암호화 백업', + exportDialogDesc: '{{count}}개 아이템을 파일로 저장합니다. 암호화하면 파일이 유출되어도 유출이 아닙니다.', + modePassword: '비밀번호', + modeKey: '내 키', + password: '비밀번호', + confirmPassword: '비밀번호 확인', + passwordHint: '최소 8자를 사용하세요. 복구가 없습니다 — 잊지 마세요.', + keyModeHint: 'Nostr 키로 암호화됩니다. 그 키만 열 수 있습니다 — 기억할 것이 없습니다.', + exportPlaintext: '암호화 없이 내보내기', + pwTooShort: '최소 8자를 사용하세요.', + pwMismatch: '비밀번호가 일치하지 않습니다.', + exportFailed: '백업을 만들 수 없습니다.', + unlockTitle: '백업 잠금 해제', + unlockDesc: '이 백업은 비밀번호로 보호됩니다.', + unlock: '잠금 해제', + unlockFailed: '백업 잠금을 해제할 수 없습니다.', + show: '표시', + hide: '숨기기', + strength: '비밀번호 강도', + strengthWeak: '약함', + strengthFair: '보통', + strengthGood: '좋음', + strengthStrong: '강함', + filenameWillSave: '{{name}}(으)로 저장됩니다', + export: '내보내기', + import: '가져오기', + exported: 'Stash 내보냄', + exportedDesc: '{{count}}개 아이템을 파일로 저장했습니다.', + noItemsInFile: '그 파일에서 아이템을 찾을 수 없습니다.', + noValidItems: '그 파일에서 유효한 아이템을 찾을 수 없습니다.', + imported: '{{count}}개 아이템을 가져왔습니다', + importSkipped: '{{count}}개 건너뜀 (이미 Stash에 있음).', + importAdded: 'Stash에 추가되었습니다.', + importFailed: '가져오기 실패', + couldNotRead: '그 파일을 읽을 수 없습니다.', + updateFailed: 'Stash를 업데이트할 수 없습니다', + updatedCount: '{{count}}개 아이템 업데이트됨', + markedForSale: '{{count}}개 판매 표시됨', + unmarkedCount: '{{count}}개 표시 해제됨', + removedCount: '{{count}}개 아이템 제거됨', + selectedCount: '{{count}}개 선택됨', + selectAll: '모두 선택', + visibilityPublic: '공개', + visibilityPrivate: '비공개', + forSale: '판매 중', + remove: '제거', + bulkDeleteTitle: '{{count}}개 아이템을 제거할까요?', + bulkDeleteDesc: '한 번의 서명으로 암호화된 Stash를 다시 씁니다. 여기서는 되돌릴 수 없습니다. 확실하지 않다면 먼저 백업을 내보내세요.', + deleteTitle: 'Stash에서 제거할까요?', + deleteDesc: '“{{title}}”이(가) Stash에서 제거됩니다', + deleteDescPublic: ' 그리고 공개 쇼케이스에서 내려갑니다', + deleteUndone: '. 이는 되돌릴 수 없습니다.', + deleteDescGeneric: '이 아이템이 Stash에서 제거됩니다. 되돌릴 수 없습니다.', + listOnMarketplace: '마켓플레이스에 등록', + noPriceSet: '가격 미설정', + categoryLabel: '카테고리', + photosLabel: '사진', + willingToSell: '판매 의사 있음', + willingToTrade: '교환 의사 있음', + whereIsThisItem: '이 아이템은 어디에 있나요?', + visibilityLabel: '공개 범위', + visibilityPrivateOnlyYou: '비공개 - 나만', + visibilityFriendsMutual: '친구 - 상호 팔로우', + visibilityPublicAnyone: '공개 - 누구나', + visibilityFriends: '친구', + brandLabel: '브랜드', + sizeLabel: '사이즈', + descriptionLabel: '설명', + conditionLabel: '상태', + itemName: '아이템 이름', + saveChanges: '변경 사항 저장', + listItemDialogTitle: '“{{title}}” 등록', + pickUpWhere: '구매자가 이 아이템을 어디서 수령할 수 있나요?', + linkToSpot: '스케이트 스팟에 연결', + linkToSpotDesc: '지역 판매에 최적 • 스팟 페이지 & 지도에 표시', + recommended: '권장', + noSpecificSpot: '특정 스팟 없음', + noSpecificSpotDesc: '마켓플레이스 페이지에만 표시', + tipLinkedSpots: '💡 팁: 스팟에 연결된 등록은 지역 스케이터가 더 쉽게 찾습니다.', + anyoneCanSee: '누구나 프로필에서 이것들을 볼 수 있습니다.', + seeWhatOthersSee: '다른 사람에게 보이는 것 보기', + inventory: '인벤토리', + publicWantsNote: '공개 구함은 마켓플레이스에 “원함” 광고로 게시되어 판매자가 당신을 찾을 수 있습니다.', + howItWorks: '작동 방식', + tapToMarketplace: '탭하여 마켓플레이스로 이동 →', + viewWishlist: '위시리스트 보기', + tipEditItems: '펜 버튼으로 아이템 편집', + tipListForSale: '숍 버튼으로 판매 등록', + tipAddPhotos: '더 나은 거래 제안을 위해 사진 추가', + tipKeySyncs: 'Nostr 키가 모든 기기에 동기화됩니다', + itemsReadyToSell: '{{count}}개 아이템 판매 준비됨', + }, + }, +}; export default koBatch4; diff --git a/src/i18n/ko/batch5.ts b/src/i18n/ko/batch5.ts index c20a55e..ae52d6a 100644 --- a/src/i18n/ko/batch5.ts +++ b/src/i18n/ko/batch5.ts @@ -1,4 +1,1605 @@ -/** ko — batch 5. Filled by the translation pass; empty until then. */ -const koBatch5 = {}; +/** + * Korean (한국어) — batch 5: The Lab service directory (labUi) + social + * (socialUi): crew chat, DMs, collectives, coordinators and vouches. + * + * Protocol and brand names (The Lab, Nostr, Lightning, Zap, sats, DM, NWC, + * NIP-05, Cordn, ContextVM, Cashu, Relay, Stash) stay English; Coach→코치, + * Filmer→필머, Crew→크루, Spot→스팟; trick names stay English. Placeholders + * ({{...}}) and markdown/URLs are preserved. + */ +const koBatch5 = { + labUi: { + activeCount: '{{count}}개 활성', + addMusicProfile: '음악 프로필 추가', + all: '전체', + clearAll: '전체 지우기', + collective: '콜렉티브', + filters: '필터', + following: '팔로우 중', + getRiderCard: '라이더 카드 받기', + judgeEvents: '이벤트 심사', + justASkater: '그냥', + labForServices: 'The Lab은 서비스 공간이에요. 스케이터 커뮤니티 전체를 둘러보고 참여하세요', + loginToOffer: '로그인하고 서비스를 제공하세요', + newest: '최신순', + noResults: '결과 없음', + offer: '제공', + offerBuilding: '빌딩 제공', + offerCoaching: '코칭 제공', + offerCuts: '컷 제공', + offerDesignArt: '디자인 / 아트 제공', + offerEditing: '편집 제공', + offerFilming: '촬영 제공', + offerGraffiti: '그라피티 제공', + offerPhotography: '사진 제공', + offerServices: '서비스 제공', + yourProfiles: '내 Lab 프로필', + preview: { + button: '미리보기', + title: '실시간 미리보기', + desc: '게시하면 {{noun}} 프로필이 이렇게 보여요.', + untitled: '이름', + noBio: '아직 소개가 없어요 — 제공하는 것을 한 줄 적어보세요.', + years: '경력 {{count}}년', + portfolio: '포트폴리오', + note: '미리보기 전용 — 아직 아무것도 게시되지 않았어요.', + }, + draft: { + title: '저장하지 않은 초안이 있어요', + body: '멈춘 곳에서 이어가세요 — 게시를 누르기 전까지는 아무것도 게시되지 않아요.', + resume: '초안 이어쓰기', + discard: '초안 버리기', + }, + progress: { + title: '프로필 완성도', + count: '{{total}}개 중 {{done}}개 완료', + photo: '사진', + bio: '소개', + skills: '기술', + rate: '요금', + location: '위치', + contact: '연락처', + }, + wizard: { + identity: '아이덴티티', + offer: '제공하는 것', + rates: '요금', + contact: '연락처', + media: '미디어', + }, + offerTattoo: '타투 제공', + offerTraining: '트레이닝 / 물리치료 제공', + organizeEvents: '이벤트 주최', + resultsMany: '결과 {{count}}개', + resultsOne: '결과 {{count}}개', + searchCityPlaceholder: '도시…', + searchNamePlaceholder: '이름, 소개…', + showResults: '결과 보기', + showResultsActive: '결과 보기 · {{count}}개 활성', + skaterWord: '스케이터', + sortBy: '정렬 기준', + theCrew: '크루', + topRated: '최고 평점', + trusted: '신뢰됨', + trustLevel: '신뢰 등급', + yearsExp: '경력 {{count}}년', + tabCoaches: '코치', + tabFilmers: '필머', + tabPhoto: '사진', + tabEditors: '에디터', + tabBuilders: '빌더', + tabArtists: '아티스트', + tabGraffiti: '그라피티', + tabTattoo: '타투', + tabTrainers: '트레이너', + tabMusic: '음악', + tabJudges: '심사위원', + tabOrganizers: '주최자', + tabBarbers: '바버', + filterSkillsToLearn: '배우고 싶은 기술', + filterContentType: '콘텐츠 유형', + filterEquipmentStyle: '장비 & 스타일', + filterServices: '서비스', + filterCamera: '카메라', + filterLenses: '렌즈', + filterLighting: '조명', + filterSupportRig: '서포트 & 리그', + filterStyle: '스타일', + filterWhatTheyBuild: '무엇을 만드는지', + filterMaterialsTrade: '재료 & 시공', + filterProjectScale: '프로젝트 규모', + filterWhatTheyMake: '무엇을 만드는지', + filterMedium: '매체', + filterSoftwareTools: '소프트웨어 & 도구', + filterWorkContext: '작업 환경', + filterMethod: '방식', + filterFocus: '전문 분야', + filterInjuriesTreated: '치료하는 부상', + filterCredentialsSetting: '자격 & 환경', + filterGenre: '장르', + filterInstrumentsRole: '악기 & 역할', + filterEventFormats: '이벤트 형식', + filterSpecialty: '전문 분야', + filterLevelCircuit: '레벨 / 서킷', + filterEventTypes: '이벤트 유형', + filterWhatYouHandle: '담당하는 것', + filterScale: '규모', + filterWhatTheyOffer: '제공하는 것', + filterSignatureStyles: '시그니처 스타일', + filterSetting: '환경', + filterEditType: '편집 유형', + role: { + coach: '코치', + filmer: '필머', + builder: '빌더', + editor: '영상 에디터', + photographer: '포토그래퍼', + skater: '스케이터', + }, + empty: { + footer: '궁금한 점이 있나요? FAQ를 확인하세요 →', + loginSuffix: '프로필을 만들려면.', + coachesTitle: '아직 코치가 없어요', + coachesBody: '내 지역에서 스케이트보드 코칭을 제공하는 첫 번째 사람이 되어보세요.', + filmersTitle: '아직 필머가 없어요', + filmersBody: '스케이트 촬영을 제공하는 첫 번째 사람이 되어보세요 — 클립, 풀 파트, 대회 커버리지 등.', + photographersTitle: '아직 포토그래퍼가 없어요', + photographersBody: '내 지역에서 스케이트 사진을 제공하는 첫 번째 사람이 되어보세요 — 액션샷, 시퀀스, 에디토리얼 등.', + editorsTitle: '아직 영상 에디터가 없어요', + editorsBody: '스케이트 영상 편집 서비스를 제공하는 첫 번째 사람이 되어보세요.', + buildersTitle: '아직 빌더가 없어요', + buildersBody: '내 램프, 파크 또는 DIY 빌드를 등록하는 첫 번째 사람이 되어보세요 — 콘크리트, 목재, 레일 등.', + artistsTitle: '아직 아티스트가 없어요', + artistsBody: '씬을 위한 보드 그래픽, 로고, 포스터, 굿즈를 제공하는 첫 번째 사람이 되어보세요.', + graffitiTitle: '아직 그라피티 아티스트가 없어요', + graffitiBody: '내 지역에서 피스, 벽화, 스케이트파크 아트를 제공하는 첫 번째 사람이 되어보세요.', + tattooTitle: '아직 타투 아티스트가 없어요', + tattooBody: '플래시, 커스텀, 파인 라인 등을 등록하는 첫 스케이트 컬처 타투 아티스트가 되어보세요.', + trainersTitle: '아직 트레이너가 없어요', + trainersBody: '스케이터가 강해지고 건강을 유지하도록 돕는 첫 트레이너나 물리치료사가 되어보세요.', + musiciansTitle: '아직 뮤지션이 없어요', + musiciansBody: '스케이트도 하고 음악도 하나요? 밴드나 솔로 프로젝트를 추가하세요 — 장르, 악기, 링크.', + judgesTitle: '아직 심사위원이 없어요', + judgesBody: '공정한 대회를 여나요? Game of S.K.A.T.E., 베스트 트릭 잼, 대회, 투어 스탑을 심사할 사람으로 등록하세요.', + organizersTitle: '아직 주최자가 없어요', + organizersBody: '잼, 대회, 밋업, 데모를 여나요? 스케이터가 찾아 예약할 수 있도록 등록하세요.', + barbersTitle: '아직 바버가 없어요', + barbersBody: '스케이터의 머리를 자르나요? 씬이 새 단장을 할 수 있도록 의자나 이동 서비스를 등록하세요.', + }, + become: { + addNip05: '설정에서 NIP-05 추가', + backToLab: 'The Lab으로 돌아가기', + bioWorkLabel: '소개 / 작업 소개', + checkContact: '연락처 정보를 확인하세요', + cityArea: '도시 / 지역', + cityCountry: '도시, 국가', + connectWallet: '지갑 연결', + connectWalletNwc: 'NWC로 지갑 연결', + contactInfo: '연락처 정보', + contactInfoDesc: '고객이 연락할 수 있는 방법 (모두 선택 사항이지만 권장해요)', + coordinatesOptional: '좌표 (선택 사항)', + email: '이메일', + failedToPublish: '게시 실패', + fromNostrProfile: 'Nostr 프로필에서', + geolocationUnsupported: '지리적 위치를 지원하지 않아요', + getting: '가져오는 중…', + headline: '헤드라인', + headlineHint: 'Lab 카드의 제목으로 표시돼요 — 예: “{{example}}”. 기본값은 이름이에요.', + imageUploaded: '이미지 업로드됨', + instagram: 'Instagram', + invalidEmail: '유효한 이메일 주소를 입력하세요.', + invalidPortfolio: '유효한 포트폴리오 URL을 입력하세요.', + invalidWebsite: '유효한 웹사이트 URL을 입력하세요.', + latitude: '위도', + learnHow: '방법 알아보기', + locationError: '위치 오류', + locationFound: '위치를 찾았어요', + loginRequired: '로그인 필요', + loginRequiredDesc: '{{role}} 프로필을 만들려면 로그인해야 해요.', + loginRequiredDescCraft: '{{noun}} 프로필을 만들려면 로그인해야 해요.', + longitude: '경도', + nip05Recommended: 'NIP-05 인증 권장', + nip05RecommendedDesc: '신원을 인증해 고객과의 신뢰를 쌓으세요.', + noWallet: '연결된 지갑 없음', + otherSocial: '기타 소셜', + paymentSetup: '⚡ 결제 설정 필요', + phoneNumber: '전화번호', + profilePhoto: '프로필 사진', + profilePublished: '프로필이 게시되었어요.', + publishing: '게시 중...', + socialMedia: '소셜 미디어', + tip: '💡 팁: 대부분의 Lightning 지갑은 NWC를 지원해요 (Alby, Minibits, Zeus, Coinos).', + tipWithTime: '💡 팁: 대부분의 Lightning 지갑은 NWC를 지원해요 (Alby, Minibits, Zeus, Coinos). 설정하는 데 30초면 돼요.', + upload: '업로드', + uploadFailed: '업로드 실패', + uploadImage: '이미지 업로드', + uploading: '업로드 중…', + useCurrentLocation: '현재 위치 사용', + useMyLocation: '내 위치 사용', + usingNwc: 'Nostr Wallet Connect 사용 중', + usingWebln: 'WebLN 브라우저 확장 사용 중', + walletConnected: '지갑 연결됨 — 결제를 받을 준비 완료!', + website: '웹사이트', + yearsExperience: '경력 연수', + }, + coachForm: { + anonymous: '익명 코치', + bioLabel: '소개 / 코칭 철학', + bioPlaceholder: '배경, 가르치는 스타일...', + create: '코치 프로필 만들기', + created: '코치 프로필이 만들어졌어요!', + createPro: '프로 코치 프로필 만들기', + dmNote: '💬 학생이 SkateSpots의 암호화 메시지로 직접 연락할 수 있어요', + heading: '코치 되기', + headlineExample: '스케이트 코치 베를린', + hourlyRate: '시간당 요금', + identity: '코치 아이덴티티', + nip05Reason: 'NIP-05 식별자를 추가해 신원을 인증하고 학생과의 신뢰를 쌓으세요 — 진짜 코치라는 걸 보여줘요.', + paymentDesc: '학생에게 레슨 결제를 받으려면 Lightning 지갑을 연결해야 해요. 학생이 코칭 세션에 직접 Zap을 보내요.', + profileDesc: '학생에게 경험을 알려주세요', + profileTitle: '코치 프로필', + ratePlaceholder: '5000 sats/시간', + selectSkill: '기술을 하나 이상 선택하세요.', + skillsLabel: '가르치는 기술 * (하나 이상 선택)', + skillsRequired: '기술 필요', + formatsLabel: '세션 형식', + formatsHint: '코칭을 진행하는 방식.', + levelsLabel: '가르치는 레벨', + agesLabel: '연령대', + credentialsLabel: '자격 & 안전', + credentialsHint: '본인 신고 — SkateSpots는 이를 검증하지 않아요.', + languagesLabel: '사용 언어', + languagesHint: '코칭할 수 있는 언어를 추가하세요.', + languagePlaceholder: '예: 한국어, English', + availabilityLabel: '가능 시간', + bookingLabel: '예약 링크', + bookingHint: '선택 사항 — 학생이 예약하고 결제할 수 있는 페이지.', + galleryLabel: '포트폴리오 사진', + galleryHint: '실제 세션, 학생, 스팟을 보여주세요 (최대 12장).', + galleryAdd: '포트폴리오 사진 추가', + galleryUploaded: '사진 {{count}}장 업로드됨', + videoLabel: '하이라이트 릴', + videoHint: '선택 사항 — 코칭이 담긴 YouTube 또는 Instagram 영상.', + formatOneOnOne: '1:1', + formatGroup: '그룹', + formatCamp: '캠프', + formatVideo: '영상 분석', + formatContestPrep: '대회 준비', + formatParkLesson: '파크 레슨', + formatAdaptive: '적응형', + formatGirls: '여성 세션', + formatAfterSchool: '방과 후', + levelBeginner: '초급', + levelIntermediate: '중급', + levelAdvanced: '상급', + levelCompetition: '대회', + ageKids: '어린이', + ageTeens: '청소년', + ageAdults: '성인', + ageSeniors: '시니어', + certFirstAid: '응급처치', + certCpr: 'CPR', + certSafeguarding: '아동 보호', + certBackgroundCheck: '신원 조회', + certInsured: '보험 가입', + certFederation: '국가 연맹 코치', + certQualification: '코칭 자격증', + certJudge: '대회 심사위원', + certNoteLabel: '기타 자격 (선택 사항)', + certNotePlaceholder: '예: 대한스케이트보드협회 2급, 코칭 경력 8년…', + availWeekdays: '평일', + availWeekends: '주말', + availEvenings: '저녁', + availAfterSchool: '방과 후', + availHolidays: '방학', + availSeasonal: '계절별', + sectionWhatYouCoach: '코칭 내용', + sectionCredentials: '자격 & 안전', + sectionAvailability: '가능 시간 & 예약', + sectionWhereYouCoach: '코칭 장소', + sectionPortfolio: '포트폴리오', + rateAmountLabel: '요금', + rateCurrencySats: 'sats', + rateCurrencyUsd: 'USD', + rateCurrencyEur: 'EUR', + rateCurrencyGbp: 'GBP', + perHour: '시간당', + perSession: '세션당', + perHalfDay: '반나절당', + perDay: '1일당', + perCamp: '캠프당', + perProject: '프로젝트당', + perEvent: '이벤트당', + perGig: '공연당', + perShoot: '촬영당', + perPiece: '작품당', + perCut: '컷당', + perMonth: '월간', + availByAppointment: '예약제', + rateNotesLabel: '요금 메모 (선택 사항)', + rateNotesPlaceholder: '슬라이딩 스케일, 첫 세션 무료, 이동 포함…', + sectionPayments: '결제', + paymentMethodsHint: '고객이 결제할 수 있는 방법이에요. 단순 안내이며 — SkateSpots는 자금을 보관하지 않아요.', + payMethodCash: '현장 현금', + payMethodLightning: 'Lightning', + payMethodCashu: 'Cashu', + payMethodBank: '계좌 이체', + payMethodOther: '기타', + payWhatYouCanLabel: '슬라이딩 스케일 / 자율 지불', + bookingFeeLabel: '예약 수수료 (선택 사항)', + bookingFeeHint: '예약 확정을 위해 본인에게 직접 지불하는 소액 수수료예요. SkateSpots는 이를 보관하거나 환불하지 않아요.', + paymentNoteLabel: '결제 메모 (선택 사항)', + paymentNotePlaceholder: '첫 세션 무료, 이동 포함, 세션 후 결제…', + spotsDesc: '코칭 세션을 제공하는 스팟을 선택하세요', + spotsLabel: '코칭하는 스팟', + tagline: '스케이트보드 노하우를 나누세요', + update: '코치 프로필 업데이트', + updated: '코치 프로필이 업데이트되었어요!', + }, + filmerForm: { + anonymous: '익명 필머', + bioPlaceholder: '배경, 스타일, 장비...', + camerasLabel: '카메라 & 장비 * (하나 이상 선택)', + create: '촬영 프로필 만들기', + created: '촬영 프로필이 만들어졌어요!', + createPro: '프로 촬영 프로필 만들기', + dmNote: '💬 고객이 SkateSpots의 암호화 메시지로 직접 연락할 수 있어요', + gearHelper: '정확한 카메라, 렌즈, 리그를 나열하세요 — 스케이터는 장비 구성을 중요하게 봐요.', + gearLabel: '가방 속 장비 (선택 사항)', + gearPlaceholder: '예: Sony VX1000 + MK1 어안, Panasonic HVX200, DJI RS3 짐벌, GoPro Hero 12, Sennheiser 마이크...', + heading: '필머 되기', + headlineExample: '스케이트 필머 베를린', + identity: '필머 아이덴티티', + nip05Reason: 'NIP-05 식별자를 추가해 신원을 인증하고 고객과의 신뢰를 쌓으세요 — 진짜 필머라는 걸 보여줘요.', + paymentDesc: '촬영 서비스 결제를 받으려면 Lightning 지갑을 연결해야 해요. 고객이 작업에 직접 Zap을 보내요.', + profileDesc: '고객에게 촬영 전문성을 알려주세요', + profileTitle: '촬영 프로필', + rate: '요금', + ratePlaceholder: '10000 sats/영상', + reelLabel: '릴 / 포트폴리오', + selectService: '서비스를 하나 이상 선택하세요.', + selectSkill: '촬영 기술을 하나 이상 선택하세요.', + servicesLabel: '제공 서비스 * (하나 이상 선택)', + servicesRequired: '서비스 필요', + skillsRequired: '기술 필요', + spotsDesc: '촬영 서비스를 제공하는 스팟을 선택하세요', + spotsLabel: '촬영하는 스팟', + tagline: '스케이트 영상 촬영을 제공하세요 — 클립, 라인, 풀 파트 & 대회 커버리지', + update: '촬영 프로필 업데이트', + updated: '촬영 프로필이 업데이트되었어요!', + }, + editorForm: { + anonymous: '익명 에디터', + bioPlaceholder: '편집 스타일, 배경, 주요 프로젝트…', + contactPortfolio: '연락처 & 포트폴리오', + create: '에디터 프로필 게시', + created: '에디터 프로필이 만들어졌어요!', + createPro: '프로 에디터 프로필 게시', + editTypes: '제공 편집 유형 * (하나 이상 선택)', + hardware: '하드웨어', + hardwarePlaceholder: '예: MacBook Pro M3, Sony FX3', + heading: '영상 에디터 되기', + headlineExample: '스케이트 영상 에디터', + identity: '아이덴티티', + locationOptional: '위치 (선택 사항)', + loginDesc: '로그인하고 영상 에디터 프로필을 만드세요.', + phoneTelegram: '전화 / Telegram', + portfolioPlaceholder: '포트폴리오 (Vimeo, YouTube…)', + profileDesc: '커뮤니티에 편집 스타일과 기술을 알려주세요', + profileTitle: '에디터 프로필', + published: '프로필이 SkateSpots에 게시되었어요.', + rate: '요금 / 가격', + ratePlaceholder: '예: 50k sats/분, 견적은 DM', + selectService: '편집 유형을 하나 이상 선택하세요.', + servicesRequired: '서비스 필요', + socialPlaceholder: 'Instagram / 소셜 핸들', + software: '소프트웨어', + softwareHardware: '소프트웨어 & 하드웨어 기술', + softwarePlaceholder: '예: DaVinci Resolve, Premiere', + tagline: '스케이트 커뮤니티에 영상 편집 서비스를 제공하세요', + thumbnail: '프로필 / 쇼릴 썸네일', + update: '에디터 프로필 업데이트', + updated: '에디터 프로필이 업데이트되었어요!', + walletConnected: '지갑 연결됨 ✓', + walletDesc: '편집 작업에 대한 Bitcoin ⚡ 결제를 고객에게 직접 받으세요.', + walletTitle: '⚡ 결제용 Lightning 지갑', + yearsExperience: '경력 연수', + yearsPlaceholder: '예: 5년', + }, + photoForm: { + anonymous: '익명 포토그래퍼', + bioPlaceholder: '배경, 스타일, 좋아하는 촬영 대상...', + cameraLabel: '카메라 바디 * (하나 이상 선택)', + cameraRequired: '카메라 필요', + contactDesc: '라이더가 작업을 보고 연락할 수 있는 방법 (모두 선택 사항이지만 권장해요)', + create: '사진 프로필 만들기', + created: '사진 프로필이 만들어졌어요!', + createPro: '프로 사진 프로필 만들기', + dmNote: '💬 라이더가 SkateSpots의 암호화 메시지로 직접 연락할 수 있어요', + gearHelper: '정확한 바디, 렌즈, 조명을 나열하세요 — 라이더는 장비 구성을 좋아해요.', + gearPlaceholder: '예: Canon R6 II, 8-15mm 어안, 70-200mm f/2.8, Godox AD200 2개, 원격 트리거, Manfrotto 삼각대...', + heading: '포토그래퍼 되기', + headlineExample: '스케이트 포토그래피', + identity: '포토그래퍼 아이덴티티', + lensesLabel: '렌즈', + lightingLabel: '조명 장비', + nip05Reason: 'NIP-05 식별자를 추가해 신원을 인증하고 고객과의 신뢰를 쌓으세요.', + paymentDesc: '촬영 대금을 받으려면 Lightning 지갑을 연결하세요. 고객이 작업에 직접 Zap을 보내요.', + portfolioLabel: '포트폴리오 / Instagram', + profileDesc: '라이더에게 안목, 장비, 서비스를 알려주세요', + profileTitle: '사진 프로필', + ratePlaceholder: '20000 sats/촬영', + selectCamera: '사용하는 카메라 유형을 하나 이상 선택하세요.', + selectService: '제공하는 서비스를 하나 이상 선택하세요.', + servicesLabel: '제공 서비스 * (하나 이상 선택)', + servicesRequired: '서비스 필요', + spotsDesc: '사진을 제공하는 스팟을 선택하세요', + spotsLabel: '촬영하는 스팟', + styleLabel: '촬영 스타일', + supportLabel: '서포트 & 리그', + tagline: '세션을 촬영하세요 — 스케이트 사진을 제공하세요', + update: '사진 프로필 업데이트', + updated: '사진 프로필이 업데이트되었어요!', + }, + builderForm: { + anonymous: '익명 빌더', + bioLabel: '소개 / 빌드 소개', + bioPlaceholder: '크루, 주요 빌드, 프로젝트 접근 방식...', + buildTypesLabel: '만드는 것 * (하나 이상 선택)', + buildTypesRequired: '빌드 유형 필요', + cityBase: '도시 / 거점', + contactPortfolio: '연락처 & 포트폴리오', + contactPortfolioDesc: '씬이 빌드를 보고 연락할 수 있는 방법 (모두 선택 사항이지만 권장해요)', + create: '빌더 프로필 만들기', + created: '빌더 프로필이 만들어졌어요!', + createPro: '프로 빌더 프로필 만들기', + dmNote: '💬 고객이 SkateSpots의 암호화 메시지로 직접 연락할 수 있어요', + gearHelper: '크루와 고객은 장비와 작업 과정을 좋아해요.', + gearLabel: '작업 방식 / 장비 (선택 사항)', + gearPlaceholder: '예: 콘크리트 전문 크루, 자체 믹서 + 숏크리트 장비, 이동식 용접, 인허가와 배수까지 처리...', + heading: '빌더 되기', + headlineExample: '램프 & 파크 빌더', + identity: '빌더 아이덴티티', + insured: '면허 / 보험 가입', + insuredHelper: '공공 파크 & 지자체 작업에 관련돼요', + logoPhoto: '로고 / 사진', + materialsLabel: '재료 & 시공 기술', + nip05Reason: 'NIP-05 식별자를 추가해 신원을 인증하고 고객과의 신뢰를 쌓으세요.', + pastBuilds: '이전 빌드 / Instagram', + paymentDesc: '빌드 대금을 받으려면 Lightning 지갑을 연결하세요. 고객이 작업에 직접 Zap을 보내요.', + profileDesc: '씬에 무엇을 만들고 어떻게 작업하는지 알려주세요', + profileTitle: '빌더 프로필', + rateLabel: '요금 / 견적 기준', + ratePlaceholder: 'm²당 / 프로젝트별', + scaleLabel: '프로젝트 규모', + selectBuild: '만드는 것을 하나 이상 선택하세요.', + serviceArea: '서비스 지역', + serviceAreaPlaceholder: '예: 서울, 전국 이동 가능', + spotsDesc: '만든 스팟과 파크를 연결해 지도에서 작업을 볼 수 있게 하세요', + spotsLabel: '만든 스팟', + tagline: '붓고, 용접하고, 짓고 — 램프 & 파크 빌드를 등록하세요', + update: '빌더 프로필 업데이트', + updated: '빌더 프로필이 업데이트되었어요!', + yearsBuilding: '시공 경력', + }, + skaterForm: { + backToSkaters: '스케이터로 돌아가기', + bioHelperPulled: '프로필에서 가져왔어요 — 스케이터 카드에 맞게 수정하거나 그대로 두세요.', + bioHelperShort: '스케이터 카드용 짧은 소개.', + bioPlaceholder: '스케이트를 탄 기간, 관심사, 요즘 하는 것…', + browseSpots: '스팟 둘러보기', + changePhoto: '프로필 사진 변경', + chipBio: '소개', + chipPhoto: '사진', + cityArea: '도시 / 지역', + created: '지도에 올라갔어요! 🛹', + custom: '커스텀', + customHelper: '나만의 라벨 — 프리셋 대신 스케이터 카드에 표시돼요.', + customPlaceholder: '예: OG, 주말 전사, 은퇴…', + discoverable: '이제 다른 스케이터가 나를 발견할 수 있어요.', + editFullProfile: '전체 프로필 편집', + fromProfile: '프로필에서', + heroEditPrefix: '편집하기', + heroJoinPrefix: '함께하기', + heroSuffix: '디렉터리', + homeHelper: '자유롭게 입력하거나 지도에서 실제 스팟을 연결해 사람들이 갈 수 있게 하세요.', + homePlaceholder: '동네 파크 / 광장 — 또는 “스팟 둘러보기” 탭', + homeSpot: '홈 스팟', + layerEnd: '모든 곳에서 변경.', + layerIntro: '이건 나의', + layerMid: ', Nostr 프로필을 기반으로 해요. 이름, 사진, 소개, Lightning & 인증이 여기서 와요 —', + layerWord: '스케이트 레이어', + level: '레벨', + linked: '지도의 스팟에 연결됨', + loadingProfile: '프로필 불러오는 중…', + loadingSpots: '스팟 불러오는 중…', + locationHelper: '다른 사람이 근처 스케이터를 찾도록 도와줘요. 대략적인 지역만 공유돼요.', + loginToJoin: '로그인하고 참여하기', + loginToJoinDesc: '커뮤니티가 나를 찾을 수 있게 스케이터 프로필을 만드세요.', + mappedSpot: '지도에 등록된 스팟', + noSpots: '아직 발견된 스팟이 없어요.', + noSpotsMatch: '검색과 일치하는 스팟이 없어요.', + openMap: '지도 열기', + pickEverything: '스타일에 맞는 것을 모두 선택하세요.', + pickHomeSpot: '홈 스팟 선택', + pickStyles: '스타일 선택', + pickStylesDesc: '타는 것을 하나 이상 선택하세요.', + profilePic: '프로필 사진', + profilePicHelper: '스케이터 카드는 Nostr 프로필 사진을 사용해요 — 어디서나 같은 사진.', + publishingAs: '게시 계정', + putOnMap: '지도에 올리기', + searchSpots: '이름이나 도시로 스팟 검색…', + skateStory: '나의 스케이트 이야기', + stance: '스탠스', + unlinkSpot: '스팟 연결 해제', + updateButton: '프로필 업데이트', + updated: '프로필이 업데이트되었어요!', + whatYouSkate: '타는 것 *', + yearsPlaceholder: '예: 8', + yearsSkating: '스케이트 연차', + yourProfilePic: '내 프로필 사진', + zapsOn: 'Zap 켜짐', + }, + skaters: { + clearSearch: '검색 지우기', + community: '커뮤니티', + countMany: '스케이터', + countOne: '스케이터', + editProfile: '내 스케이터 프로필 편집', + heroDesc: '내 사람들을 찾으세요. SkateSpots를 대표하는 스케이터 크루를 스타일, 스탠스, 레벨, 도시별로 둘러보세요.', + nip05Verified: 'NIP-05 인증됨', + noMatches: '일치 항목 없음', + noneDesc: '디렉터리에 가장 먼저 참여해 SkateSpots를 지도에 올려보세요.', + noneTitle: '아직 스케이터가 없어요', + noVerifiedMatch: '일치하는 인증 스케이터가 없어요', + searchPlaceholder: '이름, 도시, npub으로 검색…', + tryDifferentSearch: '다른 검색어를 시도하거나 필터를 지우세요.', + tryTurnOffVerified: '“인증됨” 필터를 꺼서 모두를 확인해보세요.', + verifiedFilterTitle: '인증된 NIP-05 신원을 가진 스케이터만 표시', + }, + skaterCard: { + inDirectory: '스케이터 디렉터리에 등록되었어요', + joinDesc: '스탠스, 스타일, 레벨을 추가해 스케이터가 나를 찾을 수 있게 하세요.', + joinTitle: '스케이터 디렉터리 참여', + }, + crewsStrip: { + allCrews: '모든 크루', + memberMany: '멤버 {{count}}명', + memberOne: '멤버 {{count}}명', + title: '이 씬의 크루', + }, + labLink: { + coach: '코치', + filmer: '필머', + editor: '에디터', + photographer: '포토그래퍼', + builder: '빌더', + artist: '아티스트', + graffiti: '그라피티', + tattoo: '타투', + trainer: '트레이너', + musician: '뮤지션', + judge: '심사위원', + barber: '바버', + organizer: '주최자', + lab: 'Lab', + linkedProfiles: '연결된 Lab 프로필', + desc: '스튜디오, 코칭, 빌드 서비스도 운영하나요? Lab 등록을 연결해 사람들이 크루를 고용할 수 있게 하세요. 선택 사항. Lab 프로필도 이 크루를 연결하면 양쪽에 초록색', + descEnd: '배지가 표시돼요.', + empty: '아직 Lab 프로필이 없어요. The Lab에서 만들어 여기에 연결하세요.', + }, + proUpgrade: { + goPro: 'Pro 시작', + optional: '· 선택 사항', + freeTo: '등록은 무료예요. Pro는 추가로', + proBadge: 'Pro 배지', + featuredPlacement: '추천 노출', + atTop: 'The Lab 상단에 표시돼요.', + active: '활성', + benefit1: '프로필 & 카드에 금색 "Pro" 배지', + benefit2: '스케이터가 The Lab을 둘러볼 때 먼저 추천', + benefit3: 'SkateSpots 후원 — 광고 없음, 중개자 없음', + platformOwner: '플랫폼 소유자 — Pro는 항상 켜져 있어요.', + proActiveOne: 'Pro 활성 · {{count}}일 남음. 프로필이 추천돼요.', + proActiveMany: 'Pro 활성 · {{count}}일 남음. 프로필이 추천돼요.', + context: 'Pro가 만료돼도 프로필은 무료로 유지돼요 — 배지 & 부스트만 사라져요.', + }, + profilePreview: { + viewPublic: '공개 보기', + unnamed: '이름 없는 스케이터', + noHandle: '아직 핸들 없음', + }, + pyramid: { + pyramidWord: 'PYRAMID', + rankingsWord: 'RANKINGS', + subtitle: '내 도시의 최고 기여자', + yourRank: '내 순위', + keepContributing: '계속 기여하고 더 높이 올라가세요!', + topContributors: '최고 기여자', + noContributors: '아직 기여자가 없어요. 가장 먼저 스팟을 추가하거나 이벤트를 만들어보세요!', + spots: '스팟', + events: '이벤트', + total: '합계', + trust: '신뢰', + }, + detail: { + joined: '가입', + about: '소개', + howWeWork: '작업 방식', + inTheBag: '가방 속', + hardware: '하드웨어', + software: '소프트웨어', + eventsJudged: '심사한 이벤트', + eventsOrganized: '주최한 이벤트', + spots: '스팟', + viewSpot: '스팟 보기', + credentialsTitle: '자격 & 안전', + selfAttested: '코치 본인 신고 — SkateSpots는 검증하지 않아요.', + formats: '형식', + levels: '레벨', + ages: '연령', + languages: '언어', + availability: '가능 시간', + bookSession: '세션 예약', + portfolio: '포트폴리오', + watchReel: '{{platform}}에서 보기', + paymentsTitle: '결제', + payWhatYouCan: '자율 지불', + bookingFee: '예약 수수료', + payBookingFee: '예약 수수료 결제', + bookingFeeNote: '코치에게 직접 지불돼요. SkateSpots는 보관하거나 환불하지 않아요.', + bookingFeeNoRail: '이 코치는 Lightning 주소가 설정되어 있지 않아 앱 내 결제를 사용할 수 없어요 — 결제를 위해 직접 연락하세요.', + serviceArea: '서비스 지역', + licensedInsured: '면허 / 보험 가입', + studio: '스튜디오', + shopStudio: '샵 / 스튜디오', + booksOpen: '예약 가능', + credentials: '자격', + remoteOnline: '원격 / 온라인 가능', + graffitiCrew: '그라피티 크루', + act: '공연', + listen: '듣기', + upcomingGigs: '예정된 공연', + past: '지난', + experience: '경력', + yearsCount: '{{count}}년', + rate: '요금', + contact: '연락처', + sendMessage: '메시지 보내기', + bookGig: '공연 예약', + portfolioDomain: '포트폴리오 · {{domain}}', + manage: '관리', + admin: '관리자', + editProfile: '프로필 편집', + publishedTitle: '게시되었어요', + publishedBody: '프로필이 The Lab에 게시되었어요. 공유해서 스케이터가 찾을 수 있게 하세요.', + manageRemove: 'The Lab에서 내 {{noun}} 프로필을 제거해요.', + adminTakeDown: '이 {{noun}} 프로필을 내려요. SkateSpots 전체에서 숨겨져요.', + entityLabel: '{{noun}} 프로필', + deleteProfile: '프로필 삭제', + location: '위치', + servicesSkills: '서비스 & 기술', + noun: { + coach: '코치', + filmer: '필머', + editor: '영상 에디터', + photographer: '포토그래퍼', + builder: '빌더', + artist: '아티스트', + graffiti: '그라피티 아티스트', + tattoo: '타투 아티스트', + trainer: '트레이너', + musician: '뮤지션', + judge: '이벤트 심사위원', + organizer: '이벤트 주최자', + barber: '바버', + profile: '프로필', + }, + skillsTitle: { + skills: '기술', + servicesGear: '서비스 & 장비', + whatWeBuild: '만드는 것', + whatTheyMake: '만드는 것', + stylesWork: '스타일 & 작업', + styles: '스타일', + focusSpecialties: '전문 분야 & 특기', + genresInstruments: '장르 & 악기', + formatsSpecialties: '형식 & 특기', + servicesStyles: '서비스 & 스타일', + eventTypesServices: '이벤트 유형 & 서비스', + }, + }, + rider: { + heroDesc: '검증 가능한 스케이터 신원. Nostr 서명, 인쇄 가능, 위조 불가.', + heroDesc2: '다른 스케이터에게 목격된 기술 배지를 받으세요. 파크 이용 패스를 받으세요. 카드를 어디든 공유하세요.', + headerTagline: 'Nostr 서명 · 인쇄 가능 · QR 검증', + tabCard: '내 카드', + tabBadges: '배지', + tabAward: '수여', + rendering: '렌더링 중…', + shareCard: '카드 공유', + savePng: 'PNG 저장', + print: '인쇄', + copyId: 'ID 복사', + cardType: '카드 유형', + licenseLabel: '스케이터 라이선스', + licenseSub: '나만의 라이더 신원', + parkLabel: '파크 이용', + parkSub: '파크 소유자로서 패스 발급', + theme: '테마', + holoTitle: '홀로그램 셔머', + holoDesc: '애니메이션 포일 효과', + cardDetails: '카드 정보', + skateStyle: '스케이트 스타일', + ridesFor: '소속', + ridesForPlaceholder: '동네 샵…', + sponsors: '스폰서', + sponsorsPlaceholder: '브랜드…', + showOnCard: '카드에 표시', + zaps: 'Zap ⚡', + skills: '기술', + selected: '{{count}}/6 선택됨', + goldBadgesHint1: '카드의 금색 배지는 다른 스케이터가 목격한 것에서 나와요 — 확인:', + goldBadgesHint2: '.', + parkOwnersOnly: '파크 소유자 전용.', + parkOwnersDesc: '파크 등록을 게시한 것과 같은 Nostr 키로 발급하세요. 누구나 QR을 스캔해 서명을 온체인에서 검증할 수 있어요 — 중앙 기관이 필요 없어요.', + parkDetails: '파크 정보', + parkName: '파크 이름', + parkNamePlaceholder: 'The Berrics…', + riderName: '라이더 이름', + riderNamePlaceholder: '카드에 표시할 이름', + riderNpub: '라이더의 Nostr ID (npub)', + accessLevel: '이용 등급', + validThru: '유효 기간', + publishToNostr: 'Nostr에 게시', + badgesIntro: '이 배지들은 다른 스케이터가 Nostr에서 목격하고 서명한 것이에요. 카드에 금색 ⭐ 칩으로 나타나요.', + earnMore: '더 받고 싶나요? 누군가 앞에서 타고 트릭을 목격해달라고 요청하세요.', + awardSomeone: '다른 사람에게 배지 수여', + youSawIt: '직접 목격했어요', + youSawItDesc: 'Nostr에 증명을 서명하세요. 상대의 영구 기록이 되고 — 암호학적으로 내 키에 연결돼요.', + skillsWitnessed: '목격한 기술', + whereSeen: '어디서 봤나요?', + optional: '(선택 사항)', + signingOnNostr: 'Nostr에 서명 중…', + awardBadge: '배지 수여', + addRiderSkill: '라이더 npub + 기술 하나 이상 추가', + invalidNpub: '유효하지 않은 npub', + badgeAwarded: '🏅 배지 수여됨!', + badgeSent: '{{skills}} 전송됨.', + failed: '실패', + couldNotRender: '카드를 렌더링할 수 없어요', + popupBlocked: '팝업 차단됨', + popupBlockedDesc: '이 사이트의 팝업을 허용하세요.', + linkCopied: '🔗 링크 복사됨!', + enterRiderNpub: '라이더의 npub 입력', + parkPublished: '✅ 파크 이용 카드 게시됨!', + publishFailed: '게시 실패', + noBadges: '아직 배지가 없어요. 누군가 앞에서 타고 트릭을 목격해달라고 요청하세요!', + showMore: '{{count}}개 더 보기', + witnessedBy: '목격자', + at: '—', + previewLicense: '스케이터 라이선스', + previewSince: '{{year}}년부터', + previewEvts: 'Evts', + previewScan: '스캔하여 검증', + previewSkatepark: '스케이트파크', + previewAccessPass: '이용 패스', + previewMemberName: '멤버 이름', + previewIssuedBy: '파크 소유자 발급 · Nostr 서명', + previewValidThru: '유효 기간', + previewNostrVerified: 'Nostr 검증됨', + }, + craftFields: { + detailsTitle: '추가 정보', + deliverables: '결과물', + turnaround: '작업 기간', + surfaces: '표면 / 벽', + maxSize: '최대 크기', + setLength: '공연 길이', + techRider: '테크 라이더', + travel: '이동', + certifications: '자격증', + insurance: '보험', + permits: '허가', + deposit: '예약금', + minimum: '최소', + modalities: '방식', + duration: '예약 길이', + drone: '드론', + leadTime: '준비 기간', + warranty: '보증', + }, + craftForm: { + profileImage: '프로필 이미지', + nameHeadline: '이름 / 헤드라인', + about: '소개', + aboutPlaceholder: '스케이터에게 나의 {{noun}} 작업을 알려주세요…', + required: '필수', + nip05Title: 'NIP-05를 추가해 신뢰 쌓기', + nip05Desc: 'NIP-05 식별자는 스케이터가 내가 진짜라는 걸 확인하도록 도와줘요. 등록 전에 적극 권장해요.', + editingNote: '기존 {{noun}} 프로필을 편집 중 — 게시하면 대체돼요.', + location: '위치', + pinned: '📍 지도에 고정됨 ({{lat}}, {{lng}})', + experienceYears: '경력 (년)', + expPlaceholder: '예: 5', + ratePlaceholder: '예: 20k sats / 프로젝트별', + contactLinks: '연락처 & 링크', + phoneOptional: '전화 (선택 사항)', + emailOptional: '이메일 (선택 사항)', + socialPlaceholder: '소셜 (Instagram 등)', + gettingPaid: '결제 받기', + updateProfile: '프로필 업데이트', + publishProfile: '프로필 게시', + rateLeftBlankNote: '선택 사항 — 위 요금으로 충분하면 비워두세요.', + sectionRequired: '{{section}} 필요', + sectionRequiredDesc: '"{{section}}"에서 옵션을 하나 이상 선택하세요.', + updated: '프로필이 업데이트되었어요!', + created: '프로필이 만들어졌어요!', + headlineExample: '스케이트 코치 베를린', + }, + }, + socialUi: { + agentPanel: { + spot: '스팟', + event: '이벤트', + labPro: 'Lab pro', + gear: '장비', + crew: '크루', + description: '이 크루를 잘 알아요 — 잼, 로스터 & 오픈 콜 — 그리고 실시간 데이터로 더 넓은 씬까지.', + greeting: 'Yo! 저는 Sasquatch, {{crew}}의 가이드예요. 크루에 대해 물어보세요 — 다음 잼, 누가 운영하는지, 우리가 찾는 것 — 또는 더 넓은 씬도요.', + suggestion1: '다음 잼은 언제예요?', + suggestion2: '이 크루는 누가 운영해요?', + suggestion3: '우리는 무엇을 찾고 있어요?', + suggestion4: '근처 최고의 스팟은?', + suggestion5: '스케이트 타기 좋은 날씨는?', + thinking: 'Sasquatch가 생각 중…', + placeholder: '우리 동네 씬에 대해 물어보세요…', + disclaimer: 'AI는 틀릴 수 있어요 — 링크는 실제 등록으로 연결돼요.', + }, + badge: { + upcomingOne: '예정된 이벤트 {{count}}개', + upcomingMany: '예정된 이벤트 {{count}}개', + comingOne: '이벤트 {{count}}개 예정', + comingMany: '이벤트 {{count}}개 예정', + }, + bell: { + youAreIn: '{{crew}}에 들어왔어요! 🛹', + membershipConfirmed: '멤버십이 확인되었어요.', + couldNotConfirm: '확인할 수 없어요', + addedYouTo: '당신을 추가했어요:', + confirmToAppear: '확인하면 멤버로 표시돼요.', + notifications: '알림', + notificationsNew: '알림 (새 알림 {{count}}개)', + unreadCount: '읽지 않은 알림 {{count}}개', + markRead: '읽음 표시', + allClear: '모두 확인함', + tabAll: '전체', + tabTrades: '거래', + tabSocial: '소셜', + tabNews: '소식', + tabCrews: '크루', + checkingUpdates: '업데이트 확인 중…', + checkingTrades: '제안과 거래 확인 중…', + loadingDrops: '최신 소식 불러오는 중…', + emptyAll: '제안, 거래, Zap, 답글, 뉴스레터 소식, 크루 활동이 여기에 표시돼요.', + emptyTrades: '제안, 반대 제안, 거래 확인이 모두 여기에 도착해요 — 팔든, 사든, 교환하든.', + emptySocial: 'Zap, 반응, 리포스트, 멘션, 답글, 이벤트 RSVP, 주최자 업데이트가 모두 여기에 도착해요.', + emptyNews: 'SkateSpots 뉴스레터 소식이 여기에 도착해요. 뉴스레터 페이지에서 구독하세요.', + emptyCrews: '크루 초대, 콜렉티브 요청, 멤버십 요청이 여기에 표시돼요.', + subscribeBanner: '구독하면 벨로 새 소식을 받아요', + read: '읽기', + allCaughtUp: '모두 확인했어요', + }, + chat: { + hidden: '숨김', + hideMessageAria: '이 메시지 숨기기', + hideMessageTitle: '메시지 숨기기 (관리자)', + messageHidden: '메시지가 숨겨졌어요', + messageHiddenDesc: '모든 사람에게 크루 채팅에서 숨겨졌어요.', + messageHideFailed: '메시지 숨기기 실패', + encryptionUnavailable: '암호화를 사용할 수 없어요', + encryptionUnavailableDesc: '사용하는 서명자가 NIP-44 암호화를 지원하지 않아요. 확장 프로그램을 업그레이드하세요.', + messageFailed: '메시지 실패', + couldNotSend: '메시지를 보낼 수 없어요.', + noOneToMessage: '아직 메시지할 사람이 없어요', + noOneToMessageDesc: '이 크루에는 함께 채팅할 다른 멤버가 없어요.', + subject: '{{crew}} 크루 채팅', + title: '크루 채팅', + cordnBadgeTitle: 'ContextVM을 통해 이 크루의 Cordn 코디네이터로 라우팅됨. 종단간 암호화.', + private: '비공개', + privateBadgeTitle: '종단간 암호화 — 크루 멤버만 이 메시지를 읽을 수 있어요.', + encryptedCordn: '암호화되어 크루 코디네이터(Cordn)를 통해 라우팅됨 — 메시지가 공개 릴레이에 닿지 않아요.', + encryptedNip17: '창립자 & 등록된 모든 크루 멤버를 위한 암호화 그룹 채팅.', + moderatorNote: ' 모더레이터로서 크루의 메시지를 숨길 수 있어요.', + loginToSee: '로그인하고 크루 채팅에 참여할 수 있는지 확인하세요.', + membersOnly: '이 채팅은 크루 멤버만 볼 수 있어요. 창립자에게 크루 추가를 요청해 대화에 참여하세요.', + noMessages: '아직 메시지가 없어요. 크루 채팅을 시작하세요 — 세션을 계획하고, 스팟을 공유하고, 클립을 띄워보세요.', + newMessages: '새 메시지', + new: '새 메시지', + placeholder: '크루에게 메시지…', + sendAria: '메시지 보내기', + }, + collectiveJoinRequest: { + addedTitle: '{{collective}}에 {{name}}님을 추가했어요 🛹', + addedDesc: '상대방이 확인하면 인증된 멤버로 표시돼요.', + couldNotAdd: '멤버를 추가할 수 없어요', + couldNotDismiss: '무시할 수 없어요', + addedDone: '추가됨', + addedTo: '→', + dismissedDone: '{{name}}님의 요청을 무시했어요', + wantsToJoin: '참여하고 싶어해요', + alreadyOnRoster: '이미 로스터에 있어요', + openCollective: '콜렉티브 열기', + dismiss: '무시', + addToCollective: '콜렉티브에 추가', + }, + collectiveMembers: { + confirmed: '확인됨', + pending: '대기 중', + pendingTooltip: '콜렉티브가 등록함 — 이 멤버의 확인을 기다리는 중이에요.', + crewOnly: '크루 전용', + crewOnlyTooltip: '이 멤버는 크루메이트에게만 보이도록 선택했어요. 크루에 속해 있어서 볼 수 있어요.', + hiddenMember: '숨겨진 멤버', + title: '멤버', + verifiedOf: '{{total}}명 중 {{confirmed}}명 인증됨 — 확인한 각 멤버가 자기 Nostr 키로 서명했어요.', + verifiedPerMember: '멤버십은 멤버별로 검증돼요. 각 멤버가 자기 Nostr 키로 확인해요.', + adminsOne: '관리자 {{count}}명이 크루 운영을 도와요.', + adminsMany: '관리자 {{count}}명이 크루 운영을 도와요.', + }, + confirmMembership: { + public: '공개', + crewOnly: '크루 전용', + confirmedTitle: '멤버십이 확인되었어요!', + confirmedCrew: '{{name}}에서 인증되었어요 — 크루메이트에게만 보여요.', + confirmedPublic: '이제 {{name}}의 인증된 멤버로 표시돼요.', + failed: '확인 실패', + addedTo: '{{name}}에 추가되었어요', + addedDesc: '멤버십을 확인하면 내 프로필과 상대 프로필에 인증된 것으로 표시돼요.', + yourVisibility: '공개 범위', + confirming: '확인 중…', + confirmButton: '멤버십 확인', + }, + contacts: { + message: '메시지', + removePrivate: '비공개 연락처에서 제거', + savePrivate: '비공개 연락처에 저장', + seoTitle: '연락처 - SkateSpots', + seoDescription: '나의 씬 — 크루메이트, 팔로우하는 사람, 최근 대화, 비공개 암호화 연락처.', + encryptionUnavailableDesc: '사용하는 서명자가 NIP-44 암호화를 지원하지 않아요.', + removed: '비공개 연락처에서 제거됨', + saved: '비공개 연락처에 저장됨', + savedDesc: '나만 이 목록을 볼 수 있어요.', + updateFailed: '연락처를 업데이트할 수 없어요', + loginTitle: '나의 씬을 한곳에서', + loginDesc: '로그인하고 크루메이트, 팔로우하는 사람, 최근 대화를 보고 — 비공개 암호화 연락처 목록을 관리하세요.', + title: '연락처', + subtitle: '나의 씬 — 크루메이트, 팔로우 & 대화', + filterPlaceholder: 'npub으로 필터…', + tabCrew: '크루', + tabFollows: '팔로우', + tabDms: 'DM', + tabSaved: '저장됨', + emptyCrewmates: '아직 크루메이트가 없어요. 크루에 참여하거나 만들어 씬 네트워크를 구축하세요.', + emptyFollowing: '아직 아무도 팔로우하지 않았어요.', + emptyDms: '아직 대화가 없어요. 스케이터에게 메시지를 보내 시작하세요.', + savedHint: '이 목록은 내 키로 암호화되어 있어요 — 나만 읽을 수 있어요. 별표를 눌러 추가하세요.', + emptySaved: '아직 저장된 연락처가 없어요. 어느 탭에서든 별표를 눌러 비공개 주소록을 만드세요.', + }, + conversation: { + unknown: '알 수 없음', + seoTitle: '{{name}}님과 채팅 - SkateSpots', + seoDescription: '비공개 암호화 대화', + sendFailed: '메시지 전송 실패', + sendFailedDesc: '잠시 후 다시 시도하세요.', + tradeConfirmed: '거래 확인됨', + tradeConfirmedDesc: '양쪽의 평판이 업데이트되었어요.', + tradeConfirmFailed: '거래를 확인할 수 없어요', + somethingWrong: '문제가 발생했어요.', + soldNote: '{{name}}님에게 판매했어요.', + saleConfirmed: '판매 확인됨', + saleConfirmedDesc: '이제 {{name}}님이 자기 쪽을 확인할 수 있어요.', + saleConfirmFailed: '판매를 확인할 수 없어요', + escrowRedeemed: '에스크로 상환됨', + escrowRedeemedDesc: '자금이 이제 내 Cashu 지갑에 있어요.', + escrowRedeemFailed: '에스크로를 상환할 수 없어요', + loginTitle: '로그인하고 메시지 보기', + secureLoginTitle: '보안 로그인 필요', + secureLoginDesc: '메시지에는 보안 서명 앱이 필요해요.', + encrypted: '암호화됨', + refresh: '새로고침', + didCompleteTrade: '이 거래를 완료했나요?', + recordedSale: '{{name}}님이 판매를 기록했어요. 확인하면 양쪽 평판이 업데이트돼요.', + confirm: '확인', + confirmSale: '이 판매를 확인할까요?', + askedToRecord: '{{name}}님이 기록을 요청했어요. 확인하면 양쪽 평판이 쌓여요.', + confirmSaleButton: '판매 확인', + redeemEscrow: '에스크로 상환', + escrowAppOnly: 'Cashu 에스크로는 앱 전용이에요 — 휴대폰에서 SkateSpots를 열어 상환하세요.', + startThread: '메시지를 보내 대화를 시작하세요', + placeholder: '메시지를 입력하세요...', + e2eeNote: '메시지는 NIP-17로 종단간 암호화돼요', + }, + coordinator: { + secondsAgo: '{{count}}초 전', + minutesAgo: '{{count}}분 전', + hoursAgo: '{{count}}시간 전', + daysAgo: '{{count}}일 전', + statusIdle: '확인 안 됨', + statusChecking: '확인 중…', + statusOnline: '연결됨', + statusStale: '조용함', + statusOffline: '보이지 않음', + statusError: '연결 불가', + notACoordinator: '코디네이터가 아니에요', + notACoordinatorDesc: 'nprofile, npub 또는 cordn.net 링크를 붙여넣으세요.', + added: '코디네이터 추가됨', + relayOne: '릴레이 {{count}}개', + relayMany: '릴레이 {{count}}개', + lastSeen: '마지막 확인 {{time}}', + onlineDesc: '공지 중이에요. 이를 사용하는 그룹이 지금 메시지를 전달할 수 있어요.', + staleDesc: '발견했지만 최근 공지가 없어요 — 잠들어 있을 수 있어요.', + offlineDesc: '공지가 보이지 않아요. 비공개일 수도 있고(괜찮아요), 그냥 오프라인일 수도 있어요.', + errorDesc: '릴레이에 연결할 수 없어요.', + idleDesc: '확인 중…', + checkingDesc: '공지를 찾는 중…', + eventFoundOne: '이벤트 {{count}}개 발견.', + eventFoundMany: '이벤트 {{count}}개 발견.', + check: '확인', + addLinkCopied: '추가 링크 복사됨', + copyFailed: '복사 실패', + copyManually: '직접 복사하세요.', + addLink: '링크 추가', + removeConfirm: '이 기기에서 이 코디네이터를 제거할까요?', + scanToJoin: 'Cordn에서 스캔해 이 코디네이터에 참여하세요.', + noCoordinator: '아직 코디네이터가 없어요', + noCoordinatorDescA: '코디네이터는 크루의', + encryptedWord: '암호화된', + noCoordinatorDescB: '그룹 메시지를 순서대로 전달해요. 누가, 언제, 어느 그룹인지는 보지만 내용은 절대 보지 않아요. 하나를 고르거나 직접 운영하세요.', + change: '코디네이터 변경', + addTitle: '코디네이터 추가', + add: '추가', + scanQR: '코디네이터 QR 스캔', + inputPlaceholder: 'nprofile… 또는 cordn.net 링크', + runOwn: '직접 운영하기', + runOwnDesc: '오래된 휴대폰, 라즈베리 파이, 또는 켜둔 작은 기기에서 돌릴 수 있어요. 켜져 있는 동안 그룹이 계속 작동해요 — 언제든 그룹을 옮길 수 있어요.', + onPhone: '휴대폰에서', + onPhoneDesc: 'Cordn Coordinator 앱을 사용한 뒤 여기서 QR을 스캔해 추가하세요.', + openCordn: 'Cordn 열기', + scanItsQR: 'QR 스캔', + onServer: '서버에서', + commandCopied: '명령어 복사됨', + copyCommand: '명령어 복사', + androidSleep: 'Android는 휴대폰 코디네이터를 재울 수 있어요. 가끔 그룹을 옮겨야 할 수 있어요.', + privacyNote: '🔒 코디네이터는 암호문과 메타데이터만 보고 메시지 내용은 절대 보지 않아요. 메타데이터까지 내 것으로 유지하려면 직접 운영하세요.', + customTitle: '커스텀 채팅 코디네이터', + customBadge: '· 실험적 · 직접 운영하는 릴레이', + customDescShort: '선택 사항 — 크루에는 이미 종단간 암호화 채팅이 내장되어 있어 이게 필요하지 않아요. 직접 운영할 때만 설정하세요', + remove: '제거', + pointerNote: '지금은 포인터만: wss:// 엔드포인트는 크루의 채팅 릴레이로, https://는 공유 ContextVM 릴레이를 통해 사용돼요. 실제 Cordn MLS는 아직 연결되지 않았어요.', + cordnCoordinator: 'Cordn 코디네이터', + invalid: '코디네이터처럼 보이지 않아요. nprofile, cordn.net 링크 또는 https/wss URL을 붙여넣으세요.', + useMine: '내 코디네이터 사용', + }, + createCrew: { + seoTitle: '크루 만들기 - SkateSpots', + seoDescription: '스케이트 크루를 만드세요 — 홈 터프, 멤버, 스팟.', + loginRequired: '로그인 필요', + loginRequiredDesc: '크루를 만들려면 로그인해야 해요.', + backToCrews: '크루로 돌아가기', + title: '크루 만들기', + intro: '나의 스케이트 패밀리 — 함께 타는 사람들이에요. 이름만 있으면 시작할 수 있고, 나머지는 모두 선택 사항이에요.', + }, + crew: { + seoTitleNamed: '{{name}} - SkateSpots 크루', + seoTitle: '크루 - SkateSpots', + seoDescription: 'SkateSpots의 스케이트 크루.', + postHidden: '게시물 숨겨짐', + postHiddenDesc: '모든 사람에게 크루 피드에서 제거되었어요.', + postHideFailed: '게시물 숨기기 실패', + backToCrews: '크루로 돌아가기', + disband: '해체', + youAreCaptain: '당신은 캡틴이에요', + member: '멤버', + askSasquatch: 'Sasquatch에게 물어보기', + agent: '크루 에이전트', + agentDesc: '크루의 AI 가이드 — 실시간 데이터로 근처 스팟, 이벤트, 코치 & 장비.', + eventsTab: '이벤트', + chatTab: '채팅', + newMessages: '새 메시지', + hostJam: '잼 주최', + noEvents: '아직 크루 이벤트가 없어요. 크루로서 잼, 대회, 밋업을 주최하세요 — 이벤트 캘린더에 연결되고 사람들이 Zap을 보낼 수 있어요.', + support: '후원', + zapCrew: '크루에 Zap', + bandTitle: '크루 밴드', + bandTagline: '라이브 음악 · 스케이트 & 사운드', + listenTitle: '듣기: {{domain}}', + listen: '음악 듣기', + setUpGig: '공연 준비', + bookGigMessage: '안녕하세요 {{crew}} — {{band}}의 공연 섭외에 관심 있어요. 날짜를 논의할 수 있을까요?', + messageAboutGig: '공연 관련 메시지', + gigHintA: '이 크루가 주최하는 음악 이벤트를 캘린더에 추가해요.', + messageShort: '메시지', + gigHintB: '크루에 암호화 DM을 열어 날짜 & 세부 사항을 조율해요.', + homeSpots: '홈 스팟', + viewSpot: '스팟 보기', + seeOnMap: '지도에서 보기 →', + founderLinks: '창립자 & 링크', + startedBy: '{{name}}님이 시작함', + opens: '열기: {{domain}}', + }, + crews: { + seoTitle: '크루 - SkateSpots', + seoDescription: '내 사람들을 찾으세요. 근처의 지역 스케이트 크루, 콜렉티브, 커뮤니티를 발견하세요.', + videoPartTooltip: '이 크루에는 비디오 파트가 있어요', + part: '파트', + bandTooltip: '크루 밴드: {{name}}', + band: '밴드', + focusAll: '전체', + focusAllShort: '전체', + focusDiy: 'DIY', + focusPhoto: '사진', + focusCoaching: '코칭', + focusArt: '아트', + focusMusic: '음악', + focusPhysio: '물리치료', + focusMixed: '혼합', + title: '크루', + heroLine: '지도에 고정된 나의 스케이트 패밀리 — 함께 타는 사람들', + heroWith: '그리고', + heroRest: ', 고용하는 사람이 아니라 (그건 The Lab이에요).', + crewCountOne: '크루 {{count}}개', + crewCountMany: '크루 {{count}}개', + cityCountOne: '도시 {{count}}개', + cityCountMany: '도시 {{count}}개', + createCrew: '크루 만들기', + create: '만들기', + searchPlaceholder: '이름이나 도시로 크루 검색…', + filterTitle: '크루 필터', + filterDesc: '크루가 좋아하는 것.', + nearMe: '내 근처', + emptySearchTitle: '검색과 일치하는 크루가 없어요', + emptySearchHint: '“{{query}}”에 대한 결과가 없어요. 다른 이름이나 도시를 시도하세요.', + clearSearch: '검색 지우기', + emptyFocusTitle: '아직 {{label}} 크루가 없어요', + emptyFocusHint: '아직 여기서 “{{label}}” 깃발을 든 사람이 없어요. 모든 크루를 보거나 직접 시작하세요.', + showAll: '모든 크루 보기', + claimTitle: '우리 동네 씬을 차지하세요', + claimHint: '아직 여기에 크루가 없어요. 가장 먼저 시작하세요 — 크루를 만들고, 홈 스팟을 연결하고, 모두가 찾을 수 있게 씬을 지도에 올리세요.', + }, + crewCoordinator: { + privateChat: '비공개 크루 채팅', + on: '켜짐', + defaultA: '이', + chatWord: '채팅', + defaultB: '탭은', + e2ee: '종단간 암호화되어 있어요', + defaultC: '창립자와 등록된 모든 멤버를 위해 — 설정할 것이 없어요. 메시지는 각 멤버의 키로 봉인되어(NIP-17), 크루만 읽을 수 있어요.', + advancedA: '고급: 직접 운영하기', + cordnCoordinator: 'Cordn 코디네이터', + routeThrough: '이를 통해 채팅 라우팅', + coordinator: '코디네이터', + deliveredOver: '전달 경로', + sharedRelay: '— 공유 ContextVM 릴레이.', + ownRelay: '— 크루 자체 릴레이.', + chatLive: '비공개 채팅이 활성화되었어요', + routesA: '이', + routesB: '탭은 이 코디네이터를 통해 라우팅돼요: 메시지는 종단간 암호화되어(NIP-44, 각 멤버에게 봉인), 봉인된 트래픽만 처리해요.', + publicWarning: '주의: 공유 ContextVM 릴레이를 통해 주소가 지정되어, 암호문과 메타데이터(어느 크루인지, 언제인지)가 공개적으로 보여요 — 읽을 수는 없지만요. 비공개 wss:// 릴레이를 지정하면 그것까지 비공개로 유지할 수 있어요.', + ownRelaySafe: '크루 관련 정보는 크루 자체 릴레이를 벗어나지 않아요.', + manage: '코디네이터 관리', + open: '{{domain}} 열기', + runBy: '코디네이터 운영자', + }, + dms: { + securityReminder: '보안 알림', + phishingStrong: 'SkateSpots는 절대 DM을 보내지 않아요', + phishingRest: '계정 인증, 키 공유, 결제 요청을 하지 않아요. 누군가 DM으로 SkateSpots 지원팀이라고 하면 — 사기예요.', + dismissReminder: '보안 알림 무시', + peopleCount: '{{count}}명', + youPrefix: '나: ', + unreadMessages: '읽지 않은 메시지', + seoTitle: '메시지 - SkateSpots', + seoDescription: '스케이트보드 커뮤니티와의 비공개 암호화 메시지', + loginTitle: '로그인하고 메시지 확인', + loginDesc: '커뮤니티의 스케이터와 비공개 암호화 메시지', + secureLoginTitle: '보안 로그인 필요', + secureLoginDesc: '비공개 메시지는 대화를 암호화할 보안 서명 앱이 필요해요.', + onAndroid: 'Android:', + useAmber: 'Amber 앱 사용', + getAmber: 'Amber 받기 →', + onIOS: 'iOS:', + iosHint: '설정에서 bunker 연결(nsec.app)로 로그인해보세요', + browserHint: '암호화를 지원하는 Alby나 nos2x 같은 브라우저 확장으로 로그인해보세요.', + title: '메시지', + subtitleFull: 'NIP-17로 종단간 암호화', + subtitleShort: '암호화됨', + newMessage: '새 메시지', + groups: '그룹', + loadFailed: '메시지 불러오기 실패', + emptyTitle: '아직 메시지가 없어요', + emptyDesc: '커뮤니티의 누군가와 대화를 시작하세요', + startConversation: '대화 시작', + undecryptableOne: '암호화된 메시지 {{count}}개를 서명자가 열 수 없었어요.', + undecryptableMany: '암호화된 메시지 {{count}}개를 서명자가 열 수 없었어요.', + }, + editCrew: { + seoTitleNamed: '{{name}} 편집 - SkateSpots', + seoTitle: '크루 편집 - SkateSpots', + seoDescription: '스케이트 크루를 편집하세요.', + loginRequired: '로그인 필요', + notYours: '내 크루가 아니에요', + notYoursDesc: '크루 창립자만 이 크루를 편집할 수 있어요.', + backToCrew: '크루로 돌아가기', + title: '크루 편집', + }, + form: { + add: '추가', + added: '추가됨', + addNameInBasicsA: '크루 이름을 다시 추가하세요:', + addNameInBasicsB: '완료하려면.', + adminsDescA: '신뢰하는 멤버를', + adminsWord: '관리자', + adminsDescB: '로 만드세요 — 각자 자기 키로 멤버를 초대하고 크루 피드 & 채팅을 관리할 수 있어요. 당신(창립자)은 항상 크루 아이덴티티의 소유자로 남아요.', + agentDescA: '추가:', + agentDescB: ', 크루를 실제로 아는 AI 가이드예요. 멤버는 다음을 물어볼 수 있어요:', + agentDescC: '— 그리고 실시간 SkateSpots 데이터의 근처 스팟, 이벤트, 코치, 장비까지. 브라우저에서 바로 실행돼요; 키나 설정이 필요 없어요. 초기 버전이에요 (무료 티어 AI라 가끔 느려요).', + agentDescStrong: '다음 잼, 누가 크루를 운영하는지, 무엇을 찾는지, 분위기', + agentEnabledNote: '저장하면 Sasquatch가 크루 페이지에 나타나요.', + bandDesc: '밴드가 있나요? 스케이트 씬과 지역 음악은 함께 가요 — 밴드 이름과 음악 링크를 남기세요.', + bandFooterA: '전체 밴드 프로필(장르, 악기, 공연)을 만들려면', + musicianWord: '뮤지션', + bandFooterB: 'The Lab에서 만든 뒤 다음에 연결하세요:', + linkedLabWord: '연결된 Lab 프로필', + bandFooterC: '위 섹션.', + bandMusicWord: '밴드 & 음악', + bandName: '밴드 이름', + bandNamePlaceholder: '예: The Bail Outs', + bandNudgeA: '밴드가 있군요 — 탭해서 설정하세요:', + crewTypeWord: '크루 유형', + bandNudgeB: '→', + bandNudgeC: '그러면 The Lab의 음악 씬에도 나타나요.', + beta: '베타', + bioLabel: '소개 / 선언문', + bioPlaceholder: '누구인지, 무엇을 타는지, 이야기...', + continue: '계속', + crewCreated: '크루가 만들어졌어요!', + crewUpdated: '크루가 업데이트되었어요!', + crewName: '크루 이름', + crewOnlyWord: '크루 전용', + crewType: '크루 유형', + crewTypeDescA: '크루가 특정 크래프트에 집중하나요? 하나를 고르면 해당 씬에도 나타나요:', + theLab: 'The Lab', + crewTypeDescB: '. 일반 스케이트 크루는', + mixedWord: '혼합', + crewTypeDescC: '.', + customVibeHint: '#으로 나만의 분위기나 분야를 추가하세요', + customVibePlaceholder: '예: downhill, night-sessions, no-comply', + editDesc: '크루의 아이덴티티, 홈 터프, 멤버', + enableAgent: '크루 에이전트 활성화', + enableTreasury: '크루 재무 활성화', + failed: '실패', + founded: '창립 (연도)', + geolocationUnsupported: '지리적 위치를 지원하지 않아요', + gettingLocation: '가져오는 중...', + goalHint: '기여금이 들어올 수 있도록 Nostr 프로필에 Lightning 주소(lud16)가 있는지 확인하세요.', + goalPlaceholder: '예: DIY 스팟 콘크리트 작업', + goalTarget: '목표 (sats)', + goalWhat: '목표가 무엇인가요?', + homeSpots: '홈 스팟', + homeSpotsDesc: '크루가 자주 가는 스팟을 연결하세요 — 지도에서 크루와 연결돼요', + homeTurf: '홈 터프 (도시 / 지역)', + homeTurfPlaceholder: '서울, 대한민국', + instagramDetected: 'Instagram 클립 감지됨', + invalidMember: '유효한 npub, nprofile 또는 hex pubkey를 입력하세요.', + latitude: '위도', + leaveBlankLocation: '현재 홈 터프 위치를 유지하려면 비워두세요.', + links: '링크', + locationError: '위치 오류', + locationFound: '위치를 찾았어요', + logoAlt: '크루', + logoHint: '로고가 있으면 지도와 피드에서 크루를 바로 알아볼 수 있어요. 정사각형이 가장 좋아요.', + logoLabel: '크루 로고 / 사진', + logoUploaded: '로고 업로드됨', + longitude: '경도', + looksGood: '좋아 보여요', + makeAdmin: '관리자로 지정', + mapPin: '지도 핀', + mapPinHint: '지도에 크루를 놓아 지역 사람들이 찾을 수 있게 하세요. 버튼을 탭하세요 — 입력할 필요 없어요.', + memberAlreadyAdded: '이미 추가된 멤버예요.', + members: '멤버', + membersDesc: '크루의 Nostr 계정을 추가하세요. 각 멤버가 자기 키로 확인해요 — 그전까지는 “대기 중”으로 표시돼요.', + musicLink: '음악 링크', + nameCrew: '크루 이름 짓기', + nameCrewDesc: '계속하기 전에 크루에 이름이 필요해요.', + nameCrewFirst: '먼저 크루 이름을 지으세요', + nameHint: '진짜로 필요한 유일한 것이에요. 나중에 바꿀 수 있어요.', + namePlaceholder: '예: Backyard Bandits', + nameRequired: '이름 필요', + nameRequiredDesc: '크루에 이름을 지어주세요.', + nip05DescA: '어떤 도메인에서든 직접 관리하는 검증 가능한 핸들이에요, 예:', + nip05DescB: '. 이 크루 창립자 키로 검증되고, 여러 개 추가할 수 있어요 — 도메인이 확인하면 각각 초록 체크가 표시돼요.', + nip05Label: '크루 NIP-05', + nip05Placeholder: 'crew@yourdomain.com', + nip05Add: '추가', + nip05Invalid: 'crew@yourdomain.com 같은 핸들을 입력하세요', + nip05TooMany: '핸들을 최대 {{count}}개까지 추가할 수 있어요.', + nip05Unverified: '확인 안 됨', + nip05Remove: '{{handle}} 제거', + notAKeyA: '아직 Nostr 키처럼 보이지 않아요 — 붙여넣으세요:', + notAKeyB: ',', + notAKeyC: ', 또는 hex pubkey.', + onlyYouTubeInstagram: 'YouTube와 Instagram 링크만 지원해요.', + openCall: '오픈 콜', + openCallDescA: '필머, 에디터, 새 멤버를 찾나요? 오픈 콜을 내세요 — 크루 페이지에 표시되어', + openCallDescB: '에서 맞는 사람이 연락할 수 있어요.', + optional: '· 선택 사항', + optionalParen: '(선택 사항)', + otherSocials: '기타 소셜', + otherSocialsDesc: '원하는 만큼 추가하세요 — YouTube, TikTok, Discord, Telegram 등.', + ownVisibility: '자신의 공개 범위', + progress: '진행률', + publicWord: '공개', + publishedToScene: '씬에 게시되었어요.', + publishFailed: '게시 실패', + publishing: '게시 중...', + ready: '준비됨', + readyToRollA: '준비 완료 — 누르세요:', + readyToRollB: '원할 때.', + removeAdminRole: '관리자 역할 제거', + removeMember: '멤버 제거', + removeSocial: '소셜 링크 제거', + removeVibe: '{{vibe}} 제거', + roles: '역할:', + sasquatch: 'Sasquatch', + saveCrew: '크루 저장', + skipToEnd: '끝으로 건너뛰기', + socialPlaceholder: '@username 또는 링크', + sponsorDesc: '지역 샵이 크루를 후원하면 여기서 선택해 샵으로 연결되는 “Sponsored by” 배너를 표시하세요.', + stepAria: '단계 {{step}}: {{title}}', + stepBasics: '기본', + stepBasicsShort: '기본', + stepBasicsHint: '필수만 — 이 단계만으로도 크루를 만들 수 있어요.', + stepVibe: '아이덴티티 & 분위기', + stepVibeShort: '분위기', + stepVibeHint: '앱에서 크루가 보이는 방식이에요. 모두 선택 사항.', + stepSquad: '스쿼드 & 스팟', + stepSquadShort: '스쿼드', + stepSquadHint: '사람들과 홈 터프를 추가하세요. 언제든 나중에 할 수 있어요.', + stepExtras: '추가', + stepExtrasShort: '추가', + stepExtrasHint: '나중을 위한 파워업 — 확신이 없는 건 건너뛰세요.', + extrasAllOptional: '이 단계의 모든 항목은 선택 사항이에요.', + groupIdentity: '아이덴티티', + groupIdentityHint: '핸들, 링크', + groupAi: 'Sasquatch AI', + groupShowcase: '쇼케이스', + groupPayments: '결제 & 재무', + groupIntegrations: '연동', + groupAdvanced: '고급', + groupAdvancedHint: '실험적', + pro: 'Pro', + agentProNote: 'Sasquatch 기반. Pro는 최고의 모델을 사용하고, Pro가 없으면 무료 대체 모델을 사용해요.', + stepOf: '{{total}}단계 중 {{step}}단계', + treasuryDescA: '공동 목표를 위해 sats를 모으세요 — 지역 DIY 스팟 수리, 크루 여행, 대회 상금. 투명한 Lightning 목표이고, Zap은', + treasuryDescStrong: '지갑으로 바로', + treasuryDescB: '(프로필의 Lightning 주소를 통해). SkateSpots는 자금을 절대 보관하지 않아요.', + upload: '업로드', + uploadFailed: '업로드 실패', + useCurrentLocation: '현재 위치 사용', + vibeLabel: '분위기 / 분야', + videoDescA: '크루의 풀 파트, 몽타주 또는 최신 클립. 붙여넣으세요:', + videoDescB: '링크 — 크루 페이지에서 바로 재생돼요.', + visibilityDescA: '각 멤버가 자신의', + visibilityDescB: '을 관리해요 — 자기 키로 확인할 때 선택할 수 있어요:', + visibilityDescC: '— 외부인에게 숨김). 대신 설정할 수 없어요; 본인이 결정해요.', + website: '웹사이트', + yourRoles: '내 역할 (팀 리더)', + youtubeDetected: 'YouTube 영상 감지됨', + invalidUrl: '유효한 링크를 입력하세요 (예: https://example.com).', + }, + groupConversation: { + seoTitle: '그룹 채팅 - SkateSpots', + invalidLink: '이 그룹 채팅 링크는 유효하지 않아요.', + loginTitle: '로그인하고 이 그룹 보기', + secureSignerTitle: '보안 서명자 필요', + secureSignerDesc: '그룹 메시지에는 NIP-44를 지원하는 서명자가 필요해요.', + encryptedGroup: '종단간 암호화 그룹', + empty: '아직 메시지가 없어요 — 그룹에 인사하세요.', + placeholder: '그룹에 메시지...', + }, + hero: { + established: '설립 {{year}}', + teamLeader: '팀 리더: {{name}}', + ledBy: '리더', + }, + inviteCard: { + acceptedTitle: '초대를 수락했어요 🛹', + acceptedDesc: '{{crew}}의 크루 창립자가 멤버를 확인해요. 승인되면 로스터에 나타나요.', + couldNotAccept: '수락할 수 없어요', + couldNotDecline: '거절할 수 없어요', + acceptedDone: '수락됨 —', + confirmsMembers: '멤버를 확인해요', + declinedDone: '{{crew}} 초대를 거절했어요', + invitedYou: '당신을 초대했어요:', + admin: '관리자', + accept: '수락', + decline: '거절', + }, + inviteDialog: { + messageIntro: 'Yo — SkateSpots에서 {{crew}} 크루에 참여하세요 🛹', + messageBody: 'Nostr 키로 로그인한 뒤 크루 페이지에서 참여를 요청하세요.', + copyFailed: '복사 실패', + shareTitle: '{{crew}} 참여', + sentTitle: '초대를 보냈어요! 🛹', + sentDesc: '상대가 수락 또는 거절할 수 있는 알림을 받아요.', + couldNotSend: '초대를 보낼 수 없어요', + trigger: '초대', + title: '{{crew}}에 초대', + description: '누군가의 Nostr 키로 초대를 보내거나 링크를 공유하세요.', + sendTab: '초대 보내기', + shareTab: '링크 공유', + npubLabel: '스케이터의 npub', + invalidNpub: '유효한 npub처럼 보이지 않아요.', + noteLabel: '메모', + optional: '(선택 사항)', + notePlaceholder: '같이 타러 오세요…', + inviteAsAdmin: '관리자로 초대', + inviteAsAdminDesc: '크루를 관리하고 다른 사람을 초대할 수 있어요.', + sendButton: '초대 보내기', + sendFooter: '상대가 수락 또는 거절할 수 있는 알림을 받아요. 수락해야만 멤버십이 인정돼요.', + inviteLink: '초대 링크', + messageLabel: '메시지', + copyMessage: '메시지 복사', + founderHint: '창립자로서 멤버의 키를 직접 추가한 뒤 상대가 확인하게 할 수도 있어요.', + addMemberSettings: '크루 설정에서 멤버 추가', + }, + joinRequest: { + moreCount: '+{{count}}명 더', + addedTitle: '{{crew}}에 {{name}}님을 추가했어요 🛹', + addedDesc: '상대가 확인하면 멤버로 표시돼요.', + vouchedTitle: '{{name}}님을 보증했어요 🤝', + vouchedDesc: '{{crew}}의 창립자가 보증을 보고 추가할 수 있어요.', + couldNotEndorse: '보증할 수 없어요', + endorsedDoneA: '보증했어요:', + endorsedDoneB: '— 창립자가 확인해요', + vouchedBy: '보증한 사람', + approveAndAdd: '승인 & 추가', + addToCrew: '크루에 추가', + vouchedWaiting: '보증됨 — 창립자 대기 중', + vouchForThem: '보증하기', + leadershipOnly: '크루 리더십 전용.', + adminHelp: '관리자는 멤버를 직접 추가할 수 없어요 — 보증하면 창립자에게 이 라이더를 지지한다는 걸 알려줘요.', + }, + leadership: { + teamLeader: '팀 리더', + captain: '캡틴', + verifiedMember: '인증된 멤버', + messageName: '{{name}}님에게 메시지', + title: '리더십', + captainsOne: '캡틴 {{count}}명', + captainsMany: '캡틴 {{count}}명', + footer: '팀 리더가 로스터를 운영하고, 캡틴은 초대, 잼 주최, 크루 정리를 도와요.', + }, + linkField: { + title: '연결된 크루', + description: '크루도 운영하나요? 연결하면 사람들이 스튜디오와 크루 사이를 오갈 수 있어요. 선택 사항. 크루 편집기에서 이 크루를 프로필에 다시 연결하면 초록색', + descriptionRest: '배지가 양쪽에 표시돼요.', + none: '아직 크루가 없어요. 크루 페이지에서 만들어 여기에 연결하세요.', + linkedCrew: '연결된 크루 ({{id}})', + }, + lookingFor: { + title: '오픈 콜', + subtitle: '이 크루가 찾는 것:', + }, + memberVisibility: { + updatedTitle: '공개 범위가 업데이트되었어요', + updatedCrew: '이제 크루메이트에게만 보여요.', + updatedPublic: '이제 이 크루에서 공개적으로 보여요.', + couldNotUpdate: '업데이트할 수 없어요', + title: '이 크루에서의 공개 범위', + save: '공개 범위 저장', + }, + newMessage: { + inCrew: '내 크루: {{crews}}', + crewmate: '크루메이트', + following: '팔로우 중', + invalidKey: '유효한 npub 또는 공개 키처럼 보이지 않아요.', + description: '이름으로 사람을 검색하거나 npub을 붙여넣어 누구에게나 메시지를 보내세요. 둘 이상 선택하면 그룹을 시작해요.', + searchPlaceholder: '이름 검색 또는 npub1... 붙여넣기', + messageThisKey: '이 키에 메시지', + loadingPeople: '사람들 불러오는 중...', + noPeople: '아직 크루메이트나 팔로우가 없어요.', + noPeopleHint: '위에 상대의 npub을 붙여넣어 대화를 시작하세요.', + yourCrews: '내 크루', + selected: '{{count}}명 선택됨', + startGroup: '그룹 시작 ({{count}})', + message: '메시지', + }, + nip05: { + mismatch: '이 도메인은 핸들을 크루 창립자와 다른 Nostr 키로 연결해요. 인증되지 않았어요.', + verified: '인증됨 — 도메인이 이 핸들이 크루 창립자 키에 속한다고 확인해요.', + }, + requestCollective: { + sentTitle: '요청을 보냈어요 🤝', + sentDesc: '{{name}}님이 알림에서 보고 추가할 수 있어요.', + couldNotSend: '요청을 보낼 수 없어요', + title: '이 콜렉티브 참여', + waiting: '요청 보냄 — {{name}}님 대기 중.', + askA: '다음 뒤의 크루에 요청하세요:', + askB: '로스터에 추가해달라고. 알림을 받고 한 번의 탭으로 추가할 수 있어요.', + placeholder: '선택 사항: 왜 잘 맞는지 말해보세요…', + sendButton: '요청 보내기', + }, + requestToJoin: { + sentTitle: '요청을 보냈어요! 🛹', + sentDesc: '{{crew}} 리더십이 알림에서 볼 수 있어요.', + couldNotSend: '요청을 보낼 수 없어요', + trigger: '참여 요청', + title: '{{crew}} 참여', + description: '크루 창립자 & 관리자에게 알려 추가할 수 있게 해요.', + placeholder: '인사하세요 — 어디서 타는지, 아는 사람, 왜 들어가고 싶은지…', + sending: '보내는 중…', + sendButton: '참여 요청 보내기', + }, + sponsorBanner: { + loading: '스폰서 불러오는 중…', + sponsoredBy: '후원', + }, + sponsorPicker: { + selected: '스폰서 선택됨', + setLoading: '스폰서 설정됨 (샵 불러오는 중…)', + set: '스폰서 설정됨', + clearAria: '스폰서 지우기', + searchPlaceholder: '이름이나 도시로 스케이트 샵 검색…', + loading: '샵 불러오는 중…', + noMatch: '일치하는 샵이 없어요 — 다른 검색어를 시도하세요.', + none: '아직 발견된 샵이 없어요.', + }, + treasury: { + title: '크루 재무', + ofGoal: '{{target}} 목표 중', + goalReached: '목표 달성!', + funded: '{{percent}}% 모금됨', + contributionOne: '기여 {{count}}건', + contributionMany: '기여 {{count}}건', + daysLeft: '{{days}}일 남음', + closed: '종료됨', + nonCustodial: '비수탁 · Zap은 크루의 Lightning 지갑으로 바로 가요', + }, + userStatus: { + atSpot: '📍 스팟에 있음', + autoClears: '⏱️ {{min}}분 후 자동 해제', + }, + video: { + title: '파트', + fullVideo: '풀 영상 · 몽타주', + latestClip: '최신 클립', + watch: '보기', + iframeTitle: '{{crew}} — 영상', + playAria: '{{crew}} 영상 재생', + thumbAlt: '{{crew}} 영상 썸네일', + instagramTitle: 'Instagram 클립', + }, + vouch: { + removedTitle: '보증이 제거되었어요', + vouchedTitle: '보증했어요!', + removedDesc: '더 이상 {{name}}님을 보증하지 않아요.', + vouchedDesc: '{{name}}님을 보증했어요. 씬은 자기 사람을 신뢰해요.', + couldNotVouch: '보증할 수 없어요', + title: '씬 보증', + sceneVerified: '씬 인증됨', + vouched: '보증됨', + newUnvouched: '신규 · 미보증', + checking: '씬 확인 중…', + empty: '아직 보증이 없어요. 내 서클의 스케이터가 한 보증이 누군가 진짜라는 가장 좋은 신호예요 — 우연히 들어온 사람이 아니라.', + countOne: '보증 {{count}}개', + countMany: '보증 {{count}}개', + trusted: '신뢰 웹의 스케이터로부터 {{count}}개', + remove: '보증 제거', + vouchFor: '{{name}}님 보증', + ownerNote: '내 작업을 아는 스케이터가 여기서 보증할 수 있어요.', + }, + }, +}; export default koBatch5; diff --git a/src/i18n/ko/batch6.ts b/src/i18n/ko/batch6.ts index 8a79ae5..00a9cfe 100644 --- a/src/i18n/ko/batch6.ts +++ b/src/i18n/ko/batch6.ts @@ -1,4 +1,1948 @@ -/** ko — batch 6. Filled by the translation pass; empty until then. */ -const koBatch6 = {}; +/** ko — batch 6: places, marketplace & Lab option labels. */ +const koBatch6 = { + 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: '고객이 연락할 수 있게 도와주세요 (연락 방법 중 최소 하나 권장)', + contactInfo: '연락처 정보', + created: '🎉 샵이 추가되었어요!', + createdDesc: '스케이트 샵이 이제 지도에 있어요. 스케이터들이 감사의 뜻으로 Zap을 보낼 수 있어요!', + descriptionPlaceholder: '샵에 대해 알려주세요. 무엇을 파는지, 전문 분야는 무엇인지...', + detailsDesc: '커뮤니티에 샵을 소개하세요. * 표시된 항목은 모두 필수예요.', + email: '이메일', + hoursOfOperation: '영업시간', + hoursPlaceholder: '예: 월-토 오전 10시-오후 8시, 일 오후 12시-6시', + 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: '숙박 추천이나 준비 사항, 예: "경로상의 저예산 호스텔", "캠핑 장비 필요", "에어비앤비 포함"', + addChallenge: '챌린지 추가', + addCity: '도시 추가...', + addCountry: '국가 추가...', + addShopFirst: '먼저 샵을 추가하세요', + alsoSelected: '추가 선택됨:', + availabilityPlaceholder: '예: 주말, 오전만, 예약제', + availabilityQuestion: '보통 언제 활동 가능한가요?', + availableShops: '이용 가능한 스케이트 샵 ({{count}})', + challengeDescPlaceholder: '설명 (선택)...', + challenges: '챌린지', + challengesRequired: '챌린지 필요', + challengesRequiredDesc: '팀이 완료할 챌린지를 최소 하나 추가하세요.', + challengesSecret: '모든 챌린지는 대회 시작일까지 SECRET이에요. 그때까지 팀은 볼 수 없어요!', + challengeTitlePlaceholder: '챌린지 제목, 예: "10계단 kickflip"', + citiesLabel: '도시', + citiesOnTour: '투어 도시', + cityPlaceholder: '예: Berlin, Germany', + cityRegion: '도시 / 지역', + cityRequired: '도시/지역 필요', + cityRequiredDesc: '도시나 지역을 입력하세요.', + clipAnyUrl: '🔗 아무 URL', + clipBlossom: '📦 Blossom 업로드', + clipInstagram: '📸 Instagram', + clipYouTube: '▶️ YouTube', + competitionDates: '대회 일정', + competitionDatesWarning: '⚠️ 모든 챌린지는 시작일까지 SECRET이에요! 대회가 시작될 때까지 팀은 챌린지를 볼 수 없어요.', + competitionLocations: '대회 장소', + competitionLocationsDesc: '팀이 어디에서 경쟁하나요? 관련된 모든 도시와 국가를 추가하세요.', + coordsHint: '좌표는 선택이에요. 추가하면 지도에 만남의 장소를 표시할 수 있어요.', + countriesLabel: '국가', + countriesRequired: '국가 필요', + countriesRequiredDesc: '해외 투어를 위해 최소 한 국가를 추가하세요.', + 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: '• 모든 챌린지는 대회 시작일까지 SECRET', + 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}}% 할인', + 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: '보여줄 스팟 유형을 최소 하나 선택하세요.', + 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: '로컬 가이드, 로드 트립 및 월드 디스트럭션 대회', + 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: '{{total}}장 중 {{index}}번째 사진 보기', + }, + sponsors: { + presentedBy: '제공:', + }, + tourCard: { + active: '활성', + completed: '완료됨', + contactForPrice: '가격 문의', + durationDays: '{{count}}일', + durationHours: '{{count}}시간', + durationMonths: '{{count}}개월', + durationWeeks: '{{count}}주', + entry: '참가: {{amount}} sats', + happeningNow: '지금 진행 중', + inDays: '{{count}}일 후', + inHours: '{{count}}시간 후', + inMonths: '{{count}}개월 후', + inWeeks: '{{count}}주 후', + maxGroup: '최대 {{count}}명', + price: '{{amount}} sats', + prizePool: '{{amount}} sats', + registrationOpen: '등록 접수 중', + startingSoon: '곧 시작', + teamsMax: '최대 {{count}}팀', + tomorrow: '내일', + worldwide: '전 세계', + }, + tourDetail: { + about: '이 투어 소개', + availability: '가능 시간', + competitionWindow: '대회 기간', + contactToBook: '가이드에게 연락해 예약', + discountAt: '{{shop}}에서 {{percent}}% 할인', + 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: 'RSVP {{count}}명에게 알림', + noUpdates: '아직 주최자의 업데이트가 없어요. RSVP하면 변경 시 알림을 받아요.', + placeholder: '비 — 일요일 오후 2시로 이동. 뒤쪽 레지에서 만나요…', + 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: '주', + }, + }, + marketUi: { + gearSwap: { + title: 'Gear Swap', + subtitle: '다른 스케이터들과 중고 스케이트 Gear를 사고파세요', + listGear: 'Gear 등록', + searchPlaceholder: 'Gear 검색...', + allCategories: '모든 카테고리', + forSale: '판매 중', + wtb: 'WTB', + trust: '신뢰', + filterByTrust: '신뢰도로 필터', + allSellers: '모든 판매자', + verifiedOnly: '인증됨만', + trustedPlus: '신뢰+', + followingOnly: '팔로잉만', + pickupOrShip: '직거래 또는 배송', + localPickup: '직거래', + ships: '배송', + sortBy: '정렬 기준', + newest: '최신순', + priceLowHigh: '가격: 낮은순 → 높은순', + priceHighLow: '가격: 높은순 → 낮은순', + trustScore: '신뢰 점수', + nearest: '가까운순 (로컬)', + listingFound: '등록 {{count}}개 찾음', + listingsFound: '등록 {{count}}개 찾음', + loadFailed: '등록을 불러오지 못했어요', + tryLater: '나중에 다시 시도해 주세요.', + noneTitle: '등록을 찾을 수 없어요', + noneFiltered: '현재 필터와 일치하는 Gear가 없어요. 필터를 지우거나 다른 것을 검색해보세요.', + noneFirst: '가장 먼저 Gear를 등록해보세요 — 데크, 트럭, 휠, 신발, 뭐든 스케이트라면!', + listYourGear: 'Gear 등록하기', + faqLink: '질문이 있나요? FAQ 확인 →', + }, + hub: { + browse: '둘러보기', + selling: '판매 중', + myTrades: '내 거래', + reputation: '평판', + loginListings: '등록을 관리하려면 로그인하세요.', + loginReputation: '평판과 리뷰를 보려면 로그인하세요.', + }, + marketplace: { + heroTitle: '샵 & Marketplace', + heroBefore: '우리 Marketplace는 다음으로 운영돼요', + heroAfter: '- Nostr의 탈중앙화 마켓플레이스. 스케이트 샵이 상품을 등록할 수 있고, 중고 Gear를 Bitcoin으로 직접 사고팔 수 있어요.', + whatIsTitle: 'Plebeian Market이란?', + whatIsBody: 'Plebeian Market은 Nostr에 구축된 탈중앙화 마켓플레이스예요. Bitcoin으로 다른 스케이터들과 스케이트보드 Gear를 직접 사고파세요. 중개인도, 수수료도 없이 완전한 자유.', + noFeesTitle: '수수료 없음', + noFeesBody: '30%를 가져가는 플랫폼이 없어요. 직접 개인 간 거래.', + 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을 방문해 전 세계 샵과 개인의 스케이트보드 Gear를 둘러보세요.', + 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: 'Gear Swap으로 돌아가기', + gearSwap: 'Gear Swap', + 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: 'Gear를 판매할 때는 사진이 최소 한 장 필요해요', + nip05Required: 'NIP-05 인증 필요', + nip05RequiredBody: 'Gear를 등록하려면 인증된 Nostr 주소가 필요해요', + priceRequired: '고정가 등록에는 가격이 필요해요', + sizeRequired: '사이즈 필요', + sizeRequiredBody: '{{category}}의 사이즈를 선택하세요', + conditionRequired: '상태 필요', + conditionRequiredBody: '{{category}}의 상태를 선택하세요', + wtbPosted: '구매 희망이 게시되었어요!', + wtbPostedBody: '판매자들이 요청을 찾을 수 있어요.', + listingCreated: '등록이 만들어졌어요!', + listingCreatedBody: 'Gear가 등록되었어요.', + publishFailed: '게시 실패', + loginRequired: '로그인 필요', + loginRequiredBody: 'Gear를 등록하려면 로그인해야 해요.', + backToStash: 'Stash로 돌아가기', + backToSpot: '{{title}}(으)로 돌아가기', + backToMarketplace: 'Marketplace로 돌아가기', + backToMap: '지도로 돌아가기', + wantToBuy: '구매 희망', + listYourGear: 'Gear 등록하기', + wtbSubtitle: '찾고 있는 Gear를 커뮤니티에 알려주세요', + sellSubtitle: '커뮤니티에 스케이트보드 Gear를 판매하세요', + fromStashTitle: 'Stash에서 등록', + fromStashBody: 'Stash 아이템 정보가 미리 채워졌어요. 검토하고 만남 장소를 선택하세요!', + nip05Banner: '스팸을 막고 구매자를 보호하기 위해 Gear를 등록하려면 인증된 Nostr 주소(NIP-05)가 필요해요.', + verifiedLabel: '인증됨:', + checkingTrust: '신뢰 레벨 확인 중...', + trustLevel: '신뢰 레벨:', + trusted: '신뢰됨', + active: '활성', + newcomer: '신규', + newUser: '신규 사용자', + remaining: '이번 달 남은 등록 {{limit}}개 중 {{remaining}}개', + cooldownBody: '신규 사용자는 등록 사이에 24시간 대기 시간이 있어요.', + timeRemaining: '남은 시간: {{time}}', + monthlyLimitTitle: '월간 한도 도달', + monthlyLimitBody: '이번 달 등록 한도 {{limit}}개에 도달했어요. 스팟을 만들거나 판매를 완료해 평판을 쌓으면 한도가 늘어나요.', + powAccepted: '작업 증명이 승인되었어요!', + feePaid: '수수료 결제됨!', + canCreateNow: '이제 등록을 만들 수 있어요.', + whatDoTitle: '무엇을 하고 싶나요?', + sellGear: 'GEAR 판매', + categoryTitle: '카테고리 *', + categoryHint: '어떤 종류의 Gear인가요?', + detailsTitle: 'Gear 상세', + 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: '사진이 최소 한 장 필요해요', + photosWtbHint: '선택 - 참고 이미지 추가', + productPhoto: '제품 {{n}}', + upload: '업로드', + photosNote: '최대 5장까지 추가하세요. 첫 번째 이미지가 대표 사진이 돼요.', + pickupLocationTitle: '직거래 장소', + pickupLocationHint: '쉬운 만남을 위해 스케이트 스팟에 연결하세요', + searchSpots: '스팟 검색...', + noSpotsFound: '스팟을 찾을 수 없어요. 다른 검색어를 시도하세요.', + availabilityLabel: '보통 언제 활동 가능한가요?', + availabilityPlaceholder: '주말 오전 10시-오후 2시, 화/목 저녁', + availabilityHint: '구매자와 만남을 조율하는 데 도움이 돼요', + durationTitle: '등록 기간', + durationHint: '이 등록을 얼마나 오래 활성 상태로 둘까요?', + publishing: '게시 중...', + checkingEligibility: '자격 확인 중...', + cooldownButton: '대기: {{time}}', + limitReachedButton: '한도 도달', + payFeeButton: '계속하려면 수수료 결제', + postWtbButton: '구매 희망 게시', + listForSaleButton: 'GEAR 판매 등록', + }, + trades: { + title: '내 거래', + loginBody: 'Marketplace 거래와 평판을 관리하려면 로그인하세요.', + subtitle: '확인, 요청, 그리고 그것이 쌓는 평판. 결제는 다른 스케이터와 직접 조율하고 — 앱은 거래만 기록해요.', + actionNeeded: '조치 필요', + askedToConfirmSale: '판매 확인을 요청했어요', + recordedSale: '판매를 기록했어요 — 내 쪽을 확인하세요', + confirmSale: '판매 확인', + confirm: '확인', + nothingWaiting: '지금 대기 중인 항목이 없어요. 🛹', + yourRecords: '내 거래 기록', + noTrades: '아직 거래가 없어요. 거래를 마무리하고 확인해 평판을 쌓기 시작하세요.', + browseGearSwap: 'Gear Swap 둘러보기', + roleSold: '판매함', + roleBought: '구매함', + roleTrade: '교환', + with: '상대:', + viewListing: '등록 보기', + revoke: '철회', + revokeTitle: '이 거래 기록을 철회할까요?', + revokeBody: '평판에 더 이상 반영되지 않아요. 상대방은 각자의 증명을 유지해요. 분쟁이 있거나 실수한 거래에 사용하세요.', + revokeNote: '작성자가 철회함.', + revoked: '거래 기록 철회됨', + revokedBody: '더 이상 평판에 반영되지 않아요.', + revokeFailed: '거래를 철회할 수 없어요', + saleConfirmed: '판매 확인됨', + saleConfirmedBody: '이제 상대방이 자신의 쪽을 확인할 수 있어요.', + saleConfirmFailed: '판매를 확인할 수 없어요', + tradeConfirmed: '거래 확인됨', + tradeConfirmedBody: '두 사람 모두의 평판이 업데이트되었어요.', + tradeConfirmFailed: '거래를 확인할 수 없어요', + somethingWrong: '문제가 발생했어요.', + }, + card: { + listingDeleted: '등록 삭제됨', + listingRemoved: '등록 제거됨', + listingDeletedBody: '등록이 제거되었어요. 삭제를 존중하는 릴레이는 더 이상 제공하지 않아요.', + 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 작업 증명 — 무료 스팸 방지', + verifiedTradeOne: '인증된 거래 {{count}}건', + verifiedTrades: '인증된 거래 {{count}}건', + reportSubmitted: '신고 접수됨', + reportSubmittedBody: 'Marketplace를 안전하게 지키는 데 도움을 주셔서 감사해요.', + reportFailed: '신고 제출 실패', + selectReason: '이유를 선택하세요', + reportDialogBody: '부적절하거나 오해를 유발하는 등록을 신고해 Marketplace를 안전하게 지켜주세요.', + reasonLabel: '신고 이유 *', + detailsLabel: '추가 상세 (선택)', + detailsPlaceholder: '도움이 될 만한 추가 맥락을 제공하세요...', + reportNote: '신고는 Nostr에 게시되어 커뮤니티가 문제 있는 등록을 식별하도록 도와요. 여러 신고가 있는 등록은 자동으로 숨겨질 수 있어요.', + submitting: '제출 중...', + submitReport: '신고 제출', + }, + tradeActions: { + tradeConfirmed: '거래 확인됨', + tradeConfirmedWithProof: '검증 가능한 영수증이 첨부되었어요 — 인증된 거래로 집계돼요.', + tradeConfirmedBody: '두 사람 모두의 평판이 업데이트되었어요.', + tradeConfirmFailed: '거래를 확인할 수 없어요', + somethingWrong: '문제가 발생했어요.', + requestNote: '"{{title}}" 거래를 확인해 주세요.', + requestSent: '확인 요청됨', + requestSentBody: '이제 판매자가 판매를 확인하고 두 사람의 평판을 쌓을 수 있어요.', + requestFailed: '요청을 보낼 수 없어요', + escrowRefunded: 'escrow 환불됨', + escrowRefundedBody: '자금이 Cashu 지갑으로 돌아왔어요.', + 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: '판매자에게 거래 확인을 요청하세요 — 두 번의 확인이 두 사람의 평판을 쌓아요.', + noMethod: '{{sellerName}}님이 결제 방법을 설정하지 않았어요 (Lightning 인보이스나 주소 없음). 결제를 조율하려면 메시지를 보내세요.', + ownListing: '내 등록이에요.', + paying: '결제 중…', + pay: '결제', + payAmount: '{{amount}} sats 결제', + footnote: '연결된 지갑(NWC, WebLN 또는 Cashu)에서 {{sellerName}}님에게 바로 결제해요 — SkateSpots는 자금을 보관하지 않아요.', + }, + spamFee: { + invoiceComment: 'SkateSpots 등록 수수료', + generateFailed: '인보이스 생성 실패', + paymentSuccess: '결제 성공!', + satsSent: '{{name}}님에게 {{amount}} sats 전송됨', + autoPayFailed: '자동 결제 실패', + autoPayFailedBody: 'QR 코드나 인보이스로 수동 결제해 주세요', + invoiceCopied: '인보이스 복사됨!', + copyFailed: '복사 실패', + received: '결제 받음!', + receivedBody: '{{amount}} sats 수수료가 결제되었어요. 이제 등록을 만들 수 있어요.', + title: '일회성 등록 수수료', + subtitle: '신규 회원으로서 첫 등록에는 소액의 수수료가 필요해요.', + whyTitle: '왜 결제해야 하나요?', + spamLabel: '스팸 방지:', + spamBody: '이 수수료는 봇과 사기꾼이 가짜 등록으로 Marketplace를 도배하는 것을 막아요.', + trustLabel: '신뢰 구축:', + trustBody: '신규 계정은 등록 전에 의지를 증명해야 해요. 몇 번 성공적으로 등록하면 이 수수료가 면제돼요.', + supportsLabel: '커뮤니티 지원:', + supportsPrefix: '수수료는', + supportsSpotOwner: '에게 돌아가요 — 이 스팟을 만든 사람이에요!', + supportsPlatform: '에게 돌아가요 — SkateSpots 운영에 도움이 돼요.', + oneTimeFee: '~${{usd}} USD • 일회성 수수료', + payToContinue: '계속하려면 {{amount}} sats 결제', + proveWork: '대신 작업 증명 — 무료', + 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 Offer 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 Offer 코드', + optional: '(선택, 고급)', + offerId: 'Offer: {{id}}', + relay: '릴레이: {{relay}}', + invalidBefore: '올바른', + invalidAfter: '코드가 아닌 것 같아요.', + valid: '유효한 CLINK 코드예요 — 프로필에 "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: '{{days}}일 동안 {{amount}} sats가 잠겼어요. {{sellerName}}님이 배송 시 교환할 수 있어요.', + createFailed: 'escrow를 만들 수 없어요', + somethingWrong: '문제가 발생했어요.', + title: '이 거래를 escrow하기', + description: '자금은 {{sellerName}}님에게 잠기고, 기한 후 거래가 무산되면 내가 환불할 수 있어요. 연결된 Lightning 지갑이 필요해요.', + amountLabel: '금액 (sats)', + daysLabel: '구매자 환불 가능 시점 (일)', + daysHint: '이 일수가 지나면 판매자가 배송하지 않았을 때 자금을 되찾을 수 있어요.', + nativeOnly: 'Cashu escrow는 SkateSpots 앱에서만 사용할 수 있어요 (웹 빌드 제외).', + lockAndRequest: '잠그고 요청', + }, + }, + labOptions: { + coach: { + skill: { + basics: '기초', + ollies: 'Ollie', + kickflips: 'Kickflip', + grinds: '그라인드 & 슬라이드', + manuals: '매뉴얼', + inverts: '인버트', + vert: 'Vert/램프', + bowl: '볼', + street: '스트리트', + freestyle: '프리스타일', + safety: '안전', + diy: 'DIY 스케이트 모듈', + }, + skillDesc: { + basics: '푸싱, 스탠스, 밸런스, 터닝', + ollies: 'Ollie 및 변형 (nollie, fakie)', + kickflips: 'Kickflip, heelflip 및 변형', + grinds: '50-50, 5-0, boardslide 등', + manuals: '매뉴얼, 노즈 매뉴얼, 콤보', + inverts: '인버트, 핸드플랜트, eggplant, andrecht', + vert: '하프파이프, 쿼터파이프, 드롭인', + bowl: '볼 카빙, 펌핑, 라인', + street: '스트리트 장애물과 창의성', + freestyle: '플랫그라운드 트릭과 플로우', + safety: '넘어지는 법, 보호 장비, 부상 예방', + diy: '램프, 레일, 레지 및 기타 스케이트 장애물 만들기', + }, + }, + filmer: { + service: { + miniclips: '미니 클립', + longparts: '긴 영상 파트', + koth: 'King of the Road 스타일', + documentaries: '다큐멘터리', + contests: '콘테스트 촬영', + raw: '원본 영상', + followlines: '팔로우 / 라인 촬영', + lines: '라인 & B롤 촬영', + }, + serviceDesc: { + miniclips: '소셜 미디어용 15-60초 클립', + longparts: '음악이 있는 3-10분 풀 영상 파트', + koth: '모험/챌린지 스타일 스케이트 영상', + documentaries: '스케이트 문화와 스토리 중심 콘텐츠', + contests: '프로 콘테스트 및 대회 커버리지', + raw: '편집되지 않은 멀티 앵글 영상', + followlines: '라인을 위한 어안 팔로우캠', + lines: '롱렌즈 라인과 시네마틱 B롤', + }, + skill: { + vx1000: 'VX1000', + hvx: 'HVX / HPX', + cinema: '시네마 카메라', + dslr: 'DSLR / 미러리스', + actioncam: 'GoPro / 액션캠', + phone: '스마트폰 촬영', + drone: '드론 / 항공 촬영', + gimbal: '짐벌 / 안정기', + fisheye: '어안 렌즈', + longlens: '롱 렌즈', + '4k': '4K / 고프레임', + editing: '영상 편집', + color: '색 보정', + }, + skillDesc: { + vx1000: '클래식 VX1000 스케이트보드 미학', + hvx: 'Panasonic HVX/HPX SD / HD 룩', + cinema: '시네마 카메라 (FX3, C시리즈, RED, BMPCC)', + dslr: '고품질 DSLR 또는 미러리스 카메라', + actioncam: 'GoPro / 액션캠 POV 및 마운트', + phone: '최신 스마트폰으로 촬영', + drone: '항공 및 드론 영상', + gimbal: '안정화된 짐벌 무브먼트', + fisheye: '광각 어안 렌즈 샷', + longlens: '디테일한 샷을 위한 롱 렌즈', + '4k': '4K 해상도와 고프레임 슬로모션', + editing: '프로 영상 편집 및 포스트프로덕션', + color: '색 보정 및 그레이딩', + }, + }, + editor: { + service: { + parts: '영상 파트', + montages: '몽타주', + reels: '릴스 / 짧은 클립', + documentaries: '다큐멘터리', + contest: '콘테스트 편집', + brand: '브랜드 / 홍보 영상', + motion: '모션 그래픽', + colorgrade: '색 보정만', + }, + serviceDesc: { + parts: '사운드트랙이 있는 풀 스케이트 영상 파트', + montages: '원본 영상으로 만든 컴필레이션 편집', + reels: '15–60초 소셜 미디어 클립 & 릴스', + documentaries: '스토리 중심 스케이트 문화 영화', + contest: '콘테스트와 이벤트 리캡 편집', + brand: '브랜드와 샵을 위한 홍보 콘텐츠', + motion: '타이틀, 트랜지션, 효과, 그래픽', + colorgrade: '색 보정 및 LUT 기반 그레이딩', + }, + skill: { + premiere: 'Adobe Premiere', + resolve: 'DaVinci Resolve', + finalcut: 'Final Cut Pro', + aftereffects: 'After Effects', + luts: '커스텀 LUT', + vhs: 'VHS / 레트로 미학', + '4k': '4K & RAW 워크플로', + sound: '사운드 디자인 / 믹스', + }, + skillDesc: { + premiere: 'Adobe Premiere Pro 편집', + resolve: 'DaVinci Resolve 편집 & 그레이딩', + finalcut: 'Final Cut Pro 편집', + aftereffects: '모션 그래픽과 합성', + luts: '커스텀 컬러 룩 개발', + vhs: 'VHS 글리치, super-8, 레트로 필름 룩', + '4k': '고해상도 RAW/LOG 카메라 워크플로', + sound: '음악 싱크, SFX, 오디오 마스터링', + }, + }, + photo: { + service: { + action: '액션 / 트릭 샷', + sequence: '시퀀스 샷', + portraits: '인물', + editorial: '에디토리얼 / 잡지', + product: '제품 / 샵 사진', + events: '이벤트 커버리지', + lifestyle: '라이프스타일 / 다큐멘터리', + prints: '프린트 & 진', + }, + serviceDesc: { + action: '트릭과 라인의 결정적 순간 스틸', + sequence: '멀티 프레임 트릭 시퀀스', + portraits: '라이더 인물 및 팀 샷', + editorial: '잡지용 에디토리얼 스프레드', + product: '데크, Gear 및 샵 제품 사진', + events: '콘테스트, 잼, 프리미어 커버리지', + lifestyle: '비하인드 신과 문화 다큐멘터리', + prints: '실물 프린트, 진, 사진집', + }, + camera: { + dslr: 'DSLR', + mirrorless: '미러리스', + medium: '중형 포맷', + film35: '35mm 필름', + filmmedium: '중형 필름', + point: '콤팩트 카메라', + phone: '스마트폰', + }, + lens: { + fisheye: '어안', + wide: '광각', + standard: '표준 / 단렌즈', + telephoto: '망원 / 롱 렌즈', + macro: '매크로', + zoom: '줌', + }, + lighting: { + strobes: '스튜디오 스트로브', + speedlights: '스피드라이트 / 플래시', + profoto: 'Profoto', + elinchrom: 'Elinchrom', + godox: 'Godox', + triggers: '무선 트리거', + continuous: '연속광 / LED', + reflectors: '반사판 / 디퓨저', + naturallight: '자연광만', + }, + support: { + tripod: '삼각대', + monopod: '모노포드', + lightstands: '조명 스탠드', + gimbal: '짐벌', + bag: '모바일 리그 / 가방', + laptop: '현장 테더링', + }, + style: { + flashfisheye: '플래시 어안', + natural: '자연광', + bw: '흑백', + film: '필름 미학', + longlens: '롱 렌즈', + studio: '스튜디오 / 조명', + street: '스트리트 / 다큐멘터리', + }, + }, + builder: { + service: { + diy: 'DIY 스팟', + concrete: '콘크리트 파크', + wood: '목재 램프', + bowls: '볼 & 풀', + transitions: '트랜지션 & 쿼터', + rails: '레일 & 레지', + boxes: '매뉴패드 & 박스', + minis: '미니 램프', + pumptrack: '펌프 트랙', + foam: '폼피트 / 실내', + repairs: '보수 & 재포장', + design: '설계 & 컨설팅', + }, + serviceDesc: { + diy: '커뮤니티 DIY 스팟과 게릴라 빌드', + concrete: '타설 콘크리트 스케이트파크와 구조물', + wood: '목재 램프, 런치 박스, 장애물', + bowls: '볼, 풀, 깊은 트랜지션', + transitions: '쿼터파이프, 뱅크, 트랜지션', + rails: '철제 레일, 레지, 그라인드 구조물', + boxes: '매뉴패드, 펀박스, 스트리트 구조물', + minis: '미니 램프와 뒷마당 셋업', + pumptrack: '펌프 트랙과 플로우 라인', + foam: '폼피트, 레지, 실내 훈련 구조물', + repairs: '기존 스팟 수리, 보수, 재포장', + design: '도면, 설계도, 시공 컨설팅', + }, + skill: { + concretework: '콘크리트 / 숏크리트', + welding: '용접 / 철골', + carpentry: '목공 / 목재', + formwork: '거푸집 & 철근', + masonry: '석공 / 블록', + coping: '코핑 (풀 / 철제)', + surfacing: 'Skatelite / 표면재', + earthworks: '토공 / 굴착', + }, + scale: { + backyard: '뒷마당 / 미니', + diycommunity: '커뮤니티 DIY', + publicpark: '완전한 공공 파크', + indoor: '실내 시설', + event: '이벤트 / 콘테스트 코스', + }, + }, + artist: { + service: { + boardart: '보드 그래픽', + logos: '로고 & 브랜딩', + posters: '포스터 & 전단', + merch: '굿즈 & 의류', + zines: '진 & 인쇄', + illustration: '일러스트레이션', + stickers: '스티커 & 데칼', + webdesign: '웹 / 디지털', + typography: '타이포그래피 / 레터링', + animation: '애니메이션 / 모션', + }, + serviceDesc: { + boardart: '데크 그래픽과 그립테이프 아트', + logos: '브랜드 아이덴티티, 로고, 워드마크', + posters: '이벤트 포스터, 전단, 공연 아트', + merch: '티셔츠, 후드, 의류 그래픽', + zines: '진, 에디토리얼, 인쇄 레이아웃', + illustration: '커스텀 일러스트와 캐릭터 작업', + stickers: '스티커 팩, 데칼, 슬랩', + webdesign: '웹사이트, 디지털, UI', + typography: '핸드 레터링과 커스텀 서체', + animation: '모션 그래픽과 애니메이션', + }, + medium: { + digital: '디지털 / 벡터', + handdrawn: '핸드 드로잉', + screenprint: '스크린 프린트', + paint: '페인트 / 아크릴', + collage: '콜라주 / 혼합', + photo: '사진 / Photoshop', + '3d': '3D / 렌더', + }, + tool: { + illustrator: 'Adobe Illustrator', + photoshop: 'Adobe Photoshop', + procreate: 'Procreate', + affinity: 'Affinity', + figma: 'Figma', + blender: 'Blender', + aftereffects: 'After Effects', + clipstudio: 'Clip Studio', + }, + }, + graffiti: { + style: { + throwups: 'Throw-up', + pieces: '피스 / 버너', + murals: '벽화', + characters: '캐릭터', + lettering: '레터링 / 와일드스타일', + stencil: '스텐실', + handstyles: '핸드스타일 / 태그', + '3dstyle': '3D 스타일', + abstract: '추상', + }, + styleDesc: { + throwups: '빠른 두 색 채색', + pieces: '풀컬러 피스와 버너', + murals: '대형 벽화와 프로덕션', + characters: '캐릭터와 인물 작업', + lettering: '와일드스타일과 레터 구조', + stencil: '스텐실과 스트리트 아트', + handstyles: '태그와 핸드스타일', + '3dstyle': '3D와 아나모픽 레터링', + abstract: '추상과 자유형', + }, + medium: { + spray: '스프레이 캔', + rollers: '롤러 / 에멀전', + markers: '마커 / 잉크', + brush: '브러시 / 페인트', + digital: '디지털 / Procreate', + }, + context: { + legalwalls: '합법 벽', + commissions: '커미션', + liveart: '라이브 페인팅', + skateparks: '스케이트파크 벽화', + interiors: '인테리어 / 샵', + workshops: '워크숍', + }, + }, + tattoo: { + style: { + traditional: '트래디셔널 / 올드스쿨', + neotraditional: '네오 트래디셔널', + fineline: '파인 라인', + blackwork: '블랙워크', + realism: '리얼리즘', + lettering: '레터링 / 스크립트', + illustrative: '일러스트', + skateflash: '스케이트 플래시', + ignorant: 'Ignorant / 핸드포크 스타일', + japanese: '일본 전통 / 이레즈미', + }, + styleDesc: { + traditional: '굵은 선, 클래식 아메리카나', + neotraditional: '전통에 현대적 디테일', + fineline: '섬세한 싱글 니들 작업', + blackwork: '솔리드 블랙과 패턴', + realism: '사진 같은 사실주의와 인물', + lettering: '스크립트, 레터링, 문구', + illustrative: '일러스트와 그래픽', + skateflash: '스케이트 문화 플래시 디자인', + ignorant: 'Ignorant / 순박한 핸드포크 스타일', + japanese: '일본 전통 / 이레즈미', + }, + method: { + machine: '머신', + handpoke: '핸드포크 / 스틱 앤 포크', + flash: '플래시 가능', + custom: '커스텀 디자인', + coverup: '커버업', + }, + }, + trainer: { + focus: { + strength: '근력 & 컨디셔닝', + mobility: '가동성 & 유연성', + injuryprevention: '부상 예방', + rehab: '재활 / 물리치료', + recovery: '회복 & 보디워크', + balance: '밸런스 & 안정성', + cardio: '유산소 / 지구력', + nutrition: '영양 가이드', + }, + focusDesc: { + strength: '스케이트를 위한 근력과 파워 강화', + mobility: '관절 가동 범위와 유연성', + injuryprevention: '프리햅과 부상 위험 감소', + rehab: '부상 후 물리치료와 재활', + recovery: '마사지, 보디워크, 회복', + balance: '고유수용감각, 밸런스, 안정성', + cardio: '컨디셔닝과 지구력', + nutrition: '에너지 보충과 영양 조언', + }, + injury: { + ankles: '발목', + knees: '무릎', + wrists: '손목', + hips: '고관절', + back: '허리 / 척추', + shoulders: '어깨', + heelbruise: '발꿈치 타박상', + concussion: '뇌진탕 프로토콜', + }, + credential: { + physio: '면허 물리치료사', + osteo: '정골의학 치료사', + certtrainer: '공인 트레이너', + sportstherapist: '스포츠 테라피스트', + massage: '마사지 테라피스트', + inperson: '대면', + remote: '원격 / 온라인', + }, + }, + musician: { + genre: { + punk: '펑크', + hardcore: '하드코어', + metal: '메탈', + rock: '록', + indie: '인디 / 얼터너티브', + hiphop: '힙합 / 랩', + electronic: '일렉트로닉', + lofi: '로파이 / 비트', + reggae: '레게 / 덥', + ska: '스카', + jazz: '재즈', + funk: '펑크 / 소울', + flamenco: '플라멩코', + folk: '포크 / 어쿠스틱', + experimental: '실험', + grunge: '그런지', + }, + instrument: { + vocals: '보컬', + guitar: '기타', + bass: '베이스', + drums: '드럼', + keys: '키보드 / 신스', + dj: 'DJ / 턴테이블', + producer: '프로듀서 / 비트', + sax: '색소폰 / 금관', + strings: '현악', + other: '기타', + }, + act: { + solo: '솔로 아티스트', + band: '밴드', + dj: 'DJ', + producer: '프로듀서', + collective: '컬렉티브', + }, + }, + judge: { + format: { + game_of_skate: 'Game of S.K.A.T.E.', + best_trick: '베스트 트릭', + jam: '잼 형식', + contest: '콘테스트 / 컴프', + street_league: 'Street League 스타일', + bowl: '볼 / Vert', + mini_ramp: '미니 램프', + park: '파크', + street: '스트리트', + freestyle: '프리스타일', + world_tour: 'World Destruction Tour', + am_series: 'Am 시리즈 / 예선', + local_jam: '로컬 잼 / 그래스루츠', + online: '온라인 / IG 콘테스트', + }, + specialty: { + head_judge: '수석 심판', + scoring: '채점 / 집계', + mc: 'MC / 아나운서', + format_design: '형식 설계', + rules: '규칙 / 진행', + brackets: '대진표 / 히트', + livestream: '라이브 심사', + am_scout: 'Am 스카우팅', + }, + level: { + local: '로컬', + regional: '지역', + national: '전국', + international: '국제', + pro: '프로 서킷', + }, + }, + organizer: { + event: { + street_jam: '스트리트 잼', + best_trick: '베스트 트릭', + game_of_skate: 'Game of S.K.A.T.E.', + contest: '콘테스트 / 컴프', + bowl: '볼 / Vert', + mini_ramp: '미니 램프', + park: '파크 세션', + demo: '프로 데모', + clinic: '클리닉 / 워크숍', + meetup: '밋업 / 크루즈', + downhill: '다운힐 / 레이스', + slalom: '슬라롬', + kids: '키즈 / 청소년', + charity: '자선 / 모금', + tour_stop: '투어 스톱', + premiere: '영상 프리미어', + market: '마켓 / 아트 쇼', + }, + service: { + organizing: '전체 기획', + hosting: '진행 / MC', + permits: '허가 & 관공서', + sponsorship: '스폰서십 / 브랜드 딜', + promotion: '홍보 & 마케팅', + livestream: '라이브 / 커버리지', + sound: '음향 & 음악', + ramps: '램프 & 장애물', + safety: '안전 & 응급처치', + vendors: '음식 & 벤더', + media: '사진 / 영상 커버리지', + registration: '등록 & 대진표', + }, + scale: { + grassroots: '그래스루츠', + local: '로컬', + regional: '지역', + national: '전국', + international: '국제', + pro: '프로 서킷', + }, + }, + barber: { + service: { + haircut: '커트', + fade: '페이드', + beard: '수염 정리', + lineup: '라인업 / 셰이프업', + colour: '컬러 & 염색', + kids: '키즈 컷', + }, + serviceDesc: { + haircut: '클래식 커트 — 클리퍼와 가위.', + fade: '단계별 페이드 — 로우, 미드 또는 하이.', + beard: '수염 트리밍, 셰이핑, 정돈.', + lineup: '헤어라인과 목덜미 주변의 깔끔한 정리.', + colour: '컬러, 블리치, 염색, 톤 조정.', + kids: '어린 스케이터를 위한 차분한 커트.', + }, + style: { + skin_fade: '스킨 페이드', + taper: '테이퍼', + buzz: '버즈 컷', + mohawk: '모호크', + mullet: '멀릿', + curly: '곱슬 / 아프로', + long: '긴 머리 / 레이어', + classic: '클래식 가위 커트', + }, + setting: { + shop: '샵 / 이발소', + mobile: '방문 / 출장', + event: '스케이트 이벤트 & 콘테스트', + }, + }, + tour: { + skill: { + beginner: { + label: '초급', + description: '스케이트가 처음이거나 기초 트릭', + }, + intermediate: { + label: '중급', + description: '대부분의 지형에 익숙함', + }, + advanced: { + label: '고급', + description: '경험 많은 스케이터, 험한 스팟', + }, + all: { + label: '모든 레벨', + description: '누구나 가능', + }, + }, + }, + }, +}; export default koBatch6; diff --git a/src/i18n/ko/batch7.ts b/src/i18n/ko/batch7.ts index f07b2f2..44dcaf4 100644 --- a/src/i18n/ko/batch7.ts +++ b/src/i18n/ko/batch7.ts @@ -1,4 +1,908 @@ -/** ko — batch 7. Filled by the translation pass; empty until then. */ -const koBatch7 = {}; +/** ko — batch 7. Filled by the translation pass. */ +const koBatch7 = { + events: { + title: "스케이트 이벤트", + createEvent: "이벤트 만들기", + editEvent: "이벤트 편집", + eventDetails: "이벤트 상세", + eventName: "이벤트 이름", + eventType: "이벤트 유형", + date: "날짜", + time: "시간", + startDate: "시작 날짜", + endDate: "종료 날짜", + venue: "장소", + organizer: "주최자", + attendees: "참석자", + going: "참석", + interested: "관심 있음", + rsvp: "RSVP", + ticketPrice: "티켓 가격", + freeEntry: "무료 입장", + register: "등록", + moreInfo: "더 알아보기", + upcomingEvents: "예정", + pastEvents: "지난", + noEvents: "이벤트를 찾을 수 없습니다", + findEvents: "콘테스트, 데모, 세션 등을 찾아보세요", + searchPlaceholder: "이벤트 검색...", + loginToCreate: "이벤트를 만들려면 로그인하세요", + noEventsMatch: "필터에 맞는 예정된 이벤트가 없습니다.", + noUpcoming: "예정된 이벤트가 없습니다.", + noPast: "지난 이벤트가 없습니다.", + types: { + contest: "콘테스트", + session: "세션", + meetup: "밋업", + premiere: "영상 시사회", + workshop: "워크숍", + demo: "데모", + jam: "잼", + }, + }, + wallet: { + title: "지갑", + balance: "잔액", + send: "보내기", + receive: "받기", + transactions: "거래", + history: "내역", + noTransactions: "아직 거래가 없습니다", + sendSats: "sats 보내기", + receiveSats: "sats 받기", + amount: "금액", + recipient: "받는 사람", + lightning: "Lightning", + onChain: "온체인", + invoice: "인보이스", + address: "주소", + scanQR: "QR 스캔", + paste: "붙여넣기", + payInvoice: "인보이스 결제", + createInvoice: "인보이스 만들기", + copied: "클립보드에 복사되었습니다!", + insufficientFunds: "잔액이 부족합니다", + paymentSent: "결제를 보냈습니다!", + paymentReceived: "결제를 받았습니다!", + cashu: { + title: "Cashu 지갑", + tokens: "토큰", + mint: "민트", + mints: "민트", + manageMints: "민트 관리", + addMint: "민트 추가", + removeMint: "민트 제거", + defaultMint: "기본 민트", + backup: "백업", + restore: "복원", + recoveryPhrase: "복구 문구", + viewRecoveryPhrase: "복구 문구 보기", + seedWarning: "이것은 Nostr nsec와 같습니다 - 비밀로 지키고 백업하세요!", + }, + }, + spots: { + addSpot: "스팟 추가", + editSpot: "스팟 편집", + spotDetails: "스팟 상세", + spotName: "스팟 이름", + spotType: "스팟 유형", + description: "설명", + location: "위치", + address: "주소", + photos: "사진", + addPhotos: "사진 추가", + obstacles: "장애물", + features: "특징", + bustLevel: "단속 위험도", + bestTime: "최적 시간", + tips: "팁", + reviews: "리뷰", + addReview: "리뷰 추가", + reportSpot: "스팟 신고", + directions: "길찾기", + shareSpot: "스팟 공유", + createdBy: "만든 사람", + lastUpdated: "마지막 업데이트", + types: { + park: "스케이트파크", + street: "스트리트 스팟", + diy: "DIY 스팟", + plaza: "광장", + indoor: "실내", + bowl: "볼", + vert: "버트", + miniramp: "미니 램프", + }, + bustLevels: { + chill: "여유", + moderate: "보통", + sketchy: "위험", + heavy: "매우 위험", + }, + }, + settings: { + title: "설정", + profile: "프로필", + editProfile: "프로필 편집", + account: "계정", + security: "보안", + relays: "릴레이", + appearance: "모양", + language: "언어", + notifications: "알림", + privacy: "개인정보", + about: "정보", + help: "도움말", + feedback: "피드백", + version: "버전", + displayName: "표시 이름", + username: "사용자 이름", + bio: "소개", + website: "웹사이트", + lightningAddress: "Lightning 주소", + profilePicture: "프로필 사진", + banner: "배너", + saveProfile: "프로필 저장", + backupKeys: "키 백업", + exportKeys: "키 내보내기", + secretKey: "비밀 키", + publicKey: "공개 키", + showSecretKey: "비밀 키 표시", + hideSecretKey: "비밀 키 숨기기", + copyKey: "키 복사", + keysBackedUp: "키를 안전하게 백업했다고 확인했습니다.", + keysNotBackedUp: "복구 문구나 비밀 키를 반드시 백업하세요!", + selectLanguage: "언어 선택", + english: "영어", + spanish: "스페인어", + }, + createSpot: { + title: "스케이트 스팟 추가", + subtitle: "커뮤니티와 스케이트보딩 스팟을 공유하세요", + backToMap: "지도로 돌아가기", + namePlaceholder: "예: Hollywood High School", + descriptionPlaceholder: "스팟, 장애물, 최적 시간, 단속 정보 등을 설명해 주세요.", + addressPlaceholder: "예: 1521 N Highland Ave, Los Angeles, CA", + selectType: "스팟 유형 선택", + selectBustLevel: "단속 위험도 선택", + uploadPhotos: "업로드", + dragDrop: "끌어다 놓거나 클릭하여 업로드", + maxPhotos: "최대 5장", + publishing: "게시 중...", + success: "스팟이 성공적으로 게시되었습니다!", + error: "스팟 게시에 실패했습니다", + locationRequired: "지도에서 위치를 선택해 주세요", + useCurrentLocation: "현재 위치 사용", + pickOnMap: "지도에서 위치 선택", + loginToAdd: "스케이트 스팟을 추가하려면 로그인해야 합니다.", + locationLabel: "위치", + tapToPlace: "지도를 탭하여 핀을 놓거나, 끌어서 미세 조정하세요.", + manualCoords: "좌표 직접 입력", + moreDetails: "추가 정보 (선택)", + photoHint: "게시하려면 사진이 필요합니다", + nameRequired: "이 스팟의 이름을 입력해 주세요.", + descriptionRequired: "이 스팟을 설명해 주세요.", + addressRequired: "주소나 지역 이름을 추가해 주세요.", + photoRequired: "사진을 최소 한 장 추가해 주세요.", + draftTitle: "저장되지 않은 임시 저장이 있습니다", + draftBody: "이어서 작성하거나 삭제하세요.", + draftResume: "이어서", + draftDiscard: "임시 저장 삭제", + requiredFields: "이 스팟에 대해 알려주세요. * 표시된 항목은 모두 필수입니다.", + coordinates: "좌표", + latitudePlaceholder: "위도 (예: 34.1012)", + longitudePlaceholder: "경도 (예: -118.3389)", + gettingLocation: "위치 가져오는 중...", + accessType: "접근 유형", + publicTitle: "공개 - 누구나 이용 가능", + publicDesc: "스케이트파크, 공공 광장, 스트리트 스팟", + privateTitle: "사유지 - 허가 필요", + privateDesc: "뒷마당 램프, 사유지, 출입 통제 스팟", + localsTitle: "현지인에게 먼저 문의", + localsDesc: "스팟을 존중하고 망가뜨리지 마세요", + contactInfo: "연락처 정보", + contactPlaceholder: "예: 전화번호, Instagram, 이메일...", + contactHintPrivate: "허가를 위해 어떻게 연락받길 원하시나요?", + contactHintLocals: "스팟에 대해 문의하려면 어떻게 연락하면 되나요?", + }, + marketplace: { + title: "마켓플레이스", + subtitle: "스케이트 Gear를 사고팔고 교환하세요", + addListing: "매물 추가", + condition: "상태", + conditions: { + new: "새것", + likeNew: "거의 새것", + good: "양호", + fair: "보통", + poor: "나쁨", + }, + categories: { + all: "전체", + decks: "데크", + trucks: "트럭", + wheels: "휠", + bearings: "베어링", + shoes: "신발", + clothing: "의류", + protection: "보호 장비", + other: "기타", + }, + priceRange: "가격대", + location: "위치", + seller: "판매자", + contact: "판매자에게 연락", + makeOffer: "가격 제안", + sold: "판매됨", + available: "판매 중", + gear: "Gear", + sellGear: "Gear 판매", + wantToBuy: "구매 희망", + }, + auth: { + login: "로그인", + logout: "로그아웃", + signUp: "가입하기", + signUpTitle: "Nostr가 처음이신가요?", + signUpDesc: "새 계정을 만들어 시작하세요. 무료이고 개방적입니다.", + orLogIn: "또는 로그인", + loginWithExtension: "확장 프로그램으로 로그인", + loginWithAmber: "Amber로 로그인 (Android)", + loginWithKey: "비밀 키 (nsec) 또는 복구 문구", + loginWithBunker: "Nostr Connect로 로그인", + bunkerUri: "Bunker 연결 문자열", + openAmber: "Amber 열기", + connectToBunker: "Bunker에 연결", + noExtension: "확장 프로그램을 찾을 수 없습니다.", + extensionHelp: "위의 가입하기 버튼으로 새 계정을 만들거나, 기존 자격 증명이 있다면 Amber, Key 또는 Bunker 탭을 사용하세요.", + amberDesc: "Amber는 Android 기기용 안전한 Nostr 서명 앱입니다. 아래 버튼을 눌러 Amber를 열고 접근을 승인하세요.", + bunkerDesc: "원격 서명자(bunker)를 사용해 어떤 기기에서든 계정에 접근하세요. 키는 서버에 안전하게 보관되며 웹사이트에 노출되지 않습니다.", + keyPlaceholder: "nsec1... 또는 12단어 복구 문구", + keyHint: "nsec 키 또는 12단어 복구 문구를 붙여넣을 수 있습니다", + uploadKeyFile: "키 파일 업로드", + loggingIn: "로그인 중...", + connecting: "연결 중...", + verifying: "확인 중...", + }, + createEvent: { + title: "이벤트 만들기", + subtitle: "커뮤니티를 위한 스케이트보딩 이벤트를 주최하세요", + backToEvents: "이벤트로 돌아가기", + namePlaceholder: "예: Summer Skate Session", + descriptionPlaceholder: "이벤트, 기대할 점, 규칙, 상품 등을 설명해 주세요.", + selectType: "이벤트 유형 선택", + venuePlaceholder: "예: Venice Beach Skatepark, CA", + selectDate: "날짜 선택", + selectTime: "시간 선택", + ticketPricePlaceholder: "무료 이벤트는 비워 두세요", + publishing: "게시 중...", + success: "이벤트가 성공적으로 게시되었습니다!", + error: "이벤트 게시에 실패했습니다", + loginToCreate: "이벤트를 만들려면 로그인해야 합니다.", + requiredFields: "이 이벤트에 대해 알려주세요. * 표시된 항목은 모두 필수입니다.", + startDateTime: "시작 날짜 및 시간", + endDateTime: "종료 날짜 및 시간 (선택)", + coordinatesOptional: "좌표 (선택)", + coverImage: "커버 이미지", + uploadCover: "커버 이미지 업로드", + nip05Recommended: "NIP-05 인증 권장", + nip05Desc: "프로필에 NIP-05 식별자를 추가해 신원을 인증하고 참석자와 신뢰를 쌓으세요.", + addNip05: "설정에서 NIP-05 추가", + }, + labPage: { + title: "The Lab", + subtitle: "트릭을 배우고, 순간을 담고, 다른 스케이터와 연결하세요", + coachesTab: "코칭", + filmersTab: "촬영", + offerCoaching: "코칭 제공", + offerFilming: "촬영 제공", + loginToOffer: "서비스를 제공하려면 로그인하세요", + whatToLearn: "무엇을 배우고 싶으세요?", + whatContent: "어떤 종류의 콘텐츠인가요?", + selectSkillsDesc: "스킬을 선택하면 코치를 매칭해 드립니다", + selectFilmingDesc: "원하는 촬영 서비스를 선택하세요", + searchPlaceholder: "이름, 위치, 스킬로 검색...", + noServicesYet: "아직 서비스가 없습니다", + beFirstToOffer: "커뮤니티에 코칭이나 촬영 서비스를 가장 먼저 제공해 보세요!", + skills: "스킬", + rate: "요금", + perHour: "/시간", + contact: "연락", + viewProfile: "프로필 보기", + noProfilesYet: "아직 프로필이 없습니다", + beFirstCoach: "첫 번째 코치로 등록해 보세요!", + beFirstFilmer: "첫 번째 필머로 등록해 보세요!", + yearsExperience: "년 경력", + }, + skills: { + kickflip: "Kickflip", + heelflip: "Heelflip", + ollie: "Ollie", + treflip: "360 Flip", + shuvit: "Shuvit", + hardflip: "Hardflip", + varial: "Varial", + nollie: "Nollie", + fakie: "Fakie", + switch: "Switch", + grind: "Grind", + slide: "Slide", + manual: "Manual", + transition: "Transition", + bowl: "Bowl", + vert: "Vert", + street: "Street", + flatground: "Flatground", + }, + lab: { + title: "The Lab", + subtitle: "스케이팅 실력을 높이세요", + coaches: "코치", + filmers: "필머", + findCoach: "코치 찾기", + becomeCoach: "코치 되기", + findFilmer: "필머 찾기", + becomeFilmer: "필머 되기", + hourlyRate: "시간당 요금", + experience: "경력", + specialties: "전문 분야", + availability: "가능 시간", + bookSession: "세션 예약", + contactCoach: "코치에게 연락", + noCoaches: "내 지역에서 코치를 찾을 수 없습니다", + noFilmers: "내 지역에서 필머를 찾을 수 없습니다", + }, + shops: { + title: "스케이트 샵", + addShop: "샵 추가", + editShop: "샵 편집", + shopDetails: "샵 상세", + shopName: "샵 이름", + hours: "영업시간", + phone: "전화", + website: "웹사이트", + services: "서비스", + brands: "브랜드", + supportLocal: "지역 상점 응원", + nip05: "샵 NIP-05", + nip05Hint: "이 샵을 위해 직접 관리하는 선택적 핸들입니다 (예: shop@yourdomain.com). 키로 인증됩니다. 최대 5개까지 추가할 수 있습니다.", + }, + becomeFilmer: { + title: "필머 되기", + subtitle: "커뮤니티를 위해 최고의 클립을 담으세요", + bioPlaceholder: "촬영 경력과 장비에 대해 알려주세요...", + specialtiesPlaceholder: "예: fisheye, long lens, drone, editing", + selectSpecialties: "전문 분야 선택", + hourlyRate: "시간당 요금 (sats)", + ratePlaceholder: "예: 5000", + locationPlaceholder: "도시 또는 지역", + portfolioUrl: "포트폴리오 URL", + portfolioPlaceholder: "작업물 링크 (YouTube, Instagram 등)", + publishing: "프로필 게시 중...", + success: "필머 프로필이 생성되었습니다!", + error: "프로필 생성에 실패했습니다", + }, + food: { + title: "음식 스팟", + subtitle: "세션 전후에 에너지를 충전하세요", + addFood: "음식 스팟 추가", + categories: { + all: "전체", + burgers: "버거", + pizza: "피자", + tacos: "타코", + coffee: "커피", + drinks: "음료", + snacks: "간식", + }, + skaterFriendly: "스케이터 친화적", + nearSpots: "스케이트 스팟 근처", + }, + profile: { + posts: "게시물", + spots: "스팟", + events: "이벤트", + following: "팔로잉", + followers: "팔로워", + editProfile: "프로필 편집", + follow: "팔로우", + unfollow: "언팔로우", + noPostsYet: "아직 게시물이 없습니다", + noBio: "아직 소개가 없습니다", + zapProfile: "이 스케이터에게 Zap", + }, + becomeCoach: { + title: "코치 되기", + subtitle: "스킬을 나누고 다른 스케이터의 성장을 도우세요", + bioPlaceholder: "스케이팅 배경과 지도 스타일에 대해 알려주세요...", + skillsPlaceholder: "예: kickflip, heelflip, grinds, bowls", + selectSkills: "가르칠 수 있는 스킬 선택", + hourlyRate: "시간당 요금 (sats)", + ratePlaceholder: "예: 5000", + locationPlaceholder: "도시 또는 지역", + publishing: "프로필 게시 중...", + success: "코치 프로필이 생성되었습니다!", + error: "프로필 생성에 실패했습니다", + }, + weather: { + title: "날씨", + current: "현재 상태", + forecast: "예보", + humidity: "습도", + wind: "바람", + feelsLike: "체감", + goodForSkating: "스케이팅하기 좋아요!", + notIdeal: "최적의 조건이 아닙니다", + allWeather: "모든 날씨", + goodWeather: "좋은 날씨", + perfectWeather: "완벽한 날씨", + }, + errors: { + somethingWentWrong: "문제가 발생했습니다", + tryAgainLater: "나중에 다시 시도해 주세요", + notFound: "찾을 수 없습니다", + pageNotFound: "페이지를 찾을 수 없습니다", + unauthorized: "권한이 없습니다", + loginRequired: "계속하려면 로그인해 주세요", + networkError: "네트워크 오류", + checkConnection: "인터넷 연결을 확인해 주세요", + invalidInput: "잘못된 입력", + requiredField: "이 항목은 필수입니다", + }, + time: { + today: "오늘", + yesterday: "어제", + tomorrow: "내일", + thisWeek: "이번 주", + nextWeek: "다음 주", + thisMonth: "이번 달", + justNow: "방금 전", + minutesAgo: "{{count}}분 전", + hoursAgo: "{{count}}시간 전", + daysAgo: "{{count}}일 전", + }, + spotDetail: { + postedBy: "게시자", + getDirections: "길찾기", + reviews: "리뷰", + noReviews: "아직 리뷰가 없습니다", + beFirstReview: "이 스팟을 가장 먼저 리뷰해 보세요!", + writeReview: "리뷰 작성", + submitReview: "리뷰 제출", + rating: "평점", + reviewPlaceholder: "이 스팟에서의 경험을 공유해 주세요...", + relatedSpots: "주변 스팟", + }, + eventDetail: { + organizedBy: "주최자", + eventInfo: "이벤트 정보", + location: "위치", + dateTime: "날짜 및 시간", + price: "가격", + attendeeCount: "{{count}}명 참석", + interested: "관심 있음", + going: "참석", + notGoing: "불참", + share: "이벤트 공유", + }, + venueAccess: { + title: "출입 패스", + desc: "라이더에게 서명된 패스를 발급해 입구에서 출입을 증명할 수 있게 하세요 - 카드를 보여주면 누구나 QR을 스캔해 확인할 수 있습니다.", + active: "{{count}}개 활성", + revoked: "{{count}}개 취소됨", + issue: "패스 발급", + verifyHint: "스캔으로 확인 - 확인에 앱이나 계정이 필요하지 않습니다.", + publicTitle: "출입 패스", + publicDesc: "이 장소는 출입 패스를 발급합니다. 입구에서 라이더의 카드를 스캔해 확인하세요.", + badge: "패스", + sellerHint: "이 판매자의 장소는 출입 패스를 발급합니다", + }, + zaps: { + zapButton: "Zap", + sendZap: "Zap 보내기", + zapAmount: "Zap 금액", + customAmount: "직접 입력", + addMessage: "메시지 추가 (선택)", + sending: "보내는 중...", + sent: "Zap을 보냈습니다!", + failed: "Zap 실패", + received: "Zap을 받았습니다!", + }, + rewards: { + title: "리워드", + yourPoints: "내 포인트", + earnPoints: "포인트 적립", + redeemPoints: "포인트 사용", + leaderboard: "리더보드", + achievements: "업적", + dailyTasks: "일일 과제", + weeklyTasks: "주간 과제", + }, + errorsUi: { + slammedTitle: "넘어졌어요", + slammedBody: "이 화면에서 문제가 발생했습니다. 계정과 데이터는 안전합니다 - 다시 굴러가게 해드릴게요.", + tryAgain: "다시 시도", + reloadApp: "앱 새로고침", + pageSlammedTitle: "이 페이지가 넘어졌어요", + pageSlammedBody: "이 화면에서 문제가 발생했습니다. 계정과 데이터는 안전합니다. 보통 새로고침하면 해결됩니다.", + reload: "새로고침", + goBack: "뒤로 가기", + }, + backup: { + title: "로그인 정보 저장", + subtitle: "10초면 끝 - 한 번만 하세요", + message: "복구 코드는 계정으로 돌아올 수 있는 유일한 방법입니다. 저장하면 어떤 기기에서든 로그인할 수 있습니다.", + warning: "잃어버리면 재설정이 없습니다 - 이메일도, 비밀번호 복구도 없습니다.", + backupNow: "지금 저장", + confirmed: "저장했습니다", + remindLater: "나중에", + }, + bootUi: { + ariaLoading: "SkateSpots 로딩 중", + ariaReady: "SkateSpots 준비 완료", + ready: "준비 완료", + statusWaking: "네트워크 깨우는 중", + statusTuning: "릴레이 조정 중", + statusPulling: "스팟 불러오는 중", + statusDropping: "드롭인 중", + }, + footer: { + vibedWith: "함께 만든", + poweredBy: "제공", + openSource: "오픈 소스", + contribute: "기여하기", + decentralized: "탈중앙화", + communityOwned: "커뮤니티 소유", + }, + role: { + owner: "소유자", + admin: "관리자", + organiser: "주최자", + verifiedOwner: "인증된 소유자", + }, + nfc: { + write: "NFC 태그에 쓰기", + written: "태그 작성 완료", + writtenDesc: "태그를 휴대폰에 대면 인증 페이지가 열립니다.", + failed: "태그를 쓸 수 없습니다", + }, + collectionUi: { + namePlaceholder: "2024 바르셀로나 여행", + descriptionPlaceholder: "바르셀로나 여행에서 가장 좋아한 스팟...", + }, + 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진수 공개키를 사용하세요", + 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: "게시 단계에서 멈춤", + 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: "민트 추가됨", + mintAddedDesc: "민트가 성공적으로 추가되고 신뢰되었습니다", + mintAddFailed: "민트 추가에 실패했습니다", + mintRemoved: "민트 제거됨", + mintRemoveFailed: "민트 제거에 실패했습니다", + 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: "Deck Designer — SkateSpots DIY", + deckDesignerDesc: "스케이트보드나 롱보드 외곽선을 디자인한 뒤 인쇄 가능한 1:1 템플릿, SVG 또는 DXF로 내보내세요 - concave, kicks, wheelbase, 트럭 구멍 포함.", + 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: "Gear 교환 - SkateSpots", + gearSwapDesc: "다른 스케이터와 중고 스케이트 Gear를 사고파세요. 데크, 트럭, 휠, 신발 등.", + donateTitle: "후원 — SkateSpots", + donateDesc: "SkateSpots를 후원하세요 - Lightning, 프라이빗 온체인(silent payments) 또는 Angor에서 빌드 자금 지원.", + verifyCardTitle: "인증 — SkateSpots", + verifyCardDesc: "SkateSpots 카드 또는 출입 패스를 인증하세요.", + mapTitle: "스케이트 스팟 지도 - SkateSpots", + mapDesc: "인터랙티브 지도에서 전 세계 스케이트보딩 스팟을 탐험하세요.", + diyTitle: "DIY — 직접 만들기 | SkateSpots", + diyDesc: "나만의 스케이트보드, 램프, 콘크리트 스팟을 만드는 가이드, 오픈 도구, 설계도 - 그리고 함께할 사람과 장소.", + appShopTitle: "앱 샵 — SkateSpots", + becomeSkaterTitle: "스케이터 디렉터리에 참여하세요 - SkateSpots", + becomeSkaterDesc: "스케이터 프로필을 만들어 커뮤니티가 나를 찾을 수 있게 하세요.", + marketplaceTitle: "마켓플레이스 - SkateSpots", + marketplaceDesc: "탈중앙화 Plebeian Market에서 스케이트보딩 Gear를 사고파세요.", + 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: "Deck 원가 계산기 — SkateSpots DIY", + deckCostDesc: "Deck 제작 비용을 계산하세요 - 인건비, 장비, 재료, 공정 시간, 포장, 마진 - 그리고 공정한 판매 가격까지.", + pyramidTitle: "피라미드 랭킹 - SkateSpots", + pyramidDesc: "최고 기여자와 커뮤니티 리더.", + foodTitle: "스팟 근처 음식 - SkateSpots", + foodDesc: "스케이트보딩 스팟 근처의 식당, 카페, 음식 옵션을 찾아보세요.", + createListingTitle: "Gear 등록 - SkateSpots", + createListingDesc: "판매할 스케이트보딩 Gear를 등록하거나 원하는 Gear를 찾아보세요.", + becomeFilmerTitle: "필머 되기 - SkateSpots", + becomeFilmerDesc: "스케이트보딩 촬영 프로필을 만드세요.", + skatersTitle: "스케이터 - SkateSpots", + skatersDesc: "SkateSpots 커뮤니티의 스케이터를 찾아보세요. 스타일, 스탠스, 레벨, 위치로 둘러보세요.", + communityStatsTitle: "커뮤니티 통계 — SkateSpots", + communityStatsDesc: "SkateSpots의 실시간 커뮤니티 지표 - 스팟, 이벤트, 코치, 필머, 편집자, 투어와 시간에 따른 성장. Nostr에서 직접 가져옵니다.", + labTitle: "The Lab - SkateSpots", + labDesc: "스케이트보딩 코치, 필머, 포토그래퍼, 영상 편집자를 찾아보세요.", + stashTitle: "내 Stash - SkateSpots", + stashDesc: "프라이빗 Gear 인벤토리를 관리하세요. 보유 중인 것과 판매하거나 교환할 것을 추적합니다.", + 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: "한 사람", + collective: "단체", + collectiveDesc: "크루, 스튜디오 또는 회사", + membersLabel: "멤버", + dismissReport: "신고 무시", + reportedBy: "신고자", + completingLoginAmber: "Amber로 로그인 완료 중...", + entityMembersHint: "크루의 Nostr 계정을 추가하세요. 각 멤버는 자신의 키로 직접 스팟을 확인합니다 - 그 전까지는 “대기 중”으로 표시됩니다.", + entityVerifiedHint: "멤버십은 멤버별로 인증됩니다 - 자신의 계정에서 확인하지 않으면 누구도 크루에 추가될 수 없습니다.", + entityInvalidPubkey: "유효한 npub, nprofile 또는 64자리 16진수 공개키를 입력하세요.", + entityAlreadyAdded: "이미 추가된 멤버입니다.", + offline: "오프라인", + connected: "연결됨", + offlineMode: "오프라인 모드", + allFeaturesAvailable: "모든 기능 사용 가능", + browsingCachedSpots: "캐시된 스팟 보는 중", + queuedActions: "대기 중인 작업 {{count}}개", + syncing: "동기화 중", + publishingWhenStable: "연결이 안정되면 게시합니다...", + willPublishOnline: "다시 온라인이 되면 게시됩니다", + availableOffline: "오프라인에서 사용 가능:", + offlineBrowseSpots: "이전에 본 스팟 둘러보기", + offlineViewDetails: "캐시된 스팟 상세 보기", + offlineKeepActing: "계속 활동하세요 - 게시물, RSVP, 매물, 메시지는 대기열에 저장되고 다시 연결되면 전송됩니다", + }, + sasquatchGuide: { + homeTitle: "SkateSpots에 오신 것을 환영합니다! 🦧", + homeMessage: "안녕, 나는 The Sasquatch야. 보드와 트레일, 거친 라이드를 지키는 자지. Nostr의 거칠고 자유로운 스케이트 세계에 온 걸 환영해 - 양복도 광고도 없고, 그저 각자 길을 개척하는 스케이터들뿐이야. 여기서는 트릭도, 데이터도 네 것이고, 흔적을 남기면 Bitcoin도 벌 수 있어. 동네든 전 세계든 스케이터들과 연결해. 규칙은 shredding뿐, 발자국은 네 것만.", + homeQ1: "바르셀로나에서 3일 일정 짜줘", + homeQ2: "초보자 스팟 찾아줘", + homeQ3: "예정된 이벤트 있어?", + homeQ4: "커뮤니티 통계", + homeQ5: "내 근처 코치 찾아줘", + homeQ6: "판매 중인 Gear 있어?", + homeQ7: "Nostr가 뭐야?", + homeQ8: "이거 무료야?", + homeLearnMore: "더 알아보기", + onboardingTitle: "시작하기 🚀", + onboardingMessage: "기본 개념을 이해하도록 도와줄게! Nostr는 네 신원이고, Bitcoin Lightning은 기여에 대한 sats를 벌게 해주며, Zap은 즉석 팁이야. 시작에 대해 뭐든 물어봐!", + onboardingQ1: "어떻게 로그인해?", + onboardingQ2: "Nostr가 뭐야?", + onboardingQ3: "Nostr는 어떻게 작동해?", + onboardingQ4: "Cashu가 뭐야?", + onboardingQ5: "Cashu 지갑은 어떻게 써?", + onboardingQ6: "민트가 뭐야?", + 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 koBatch7; diff --git a/src/i18n/ko/batch8.ts b/src/i18n/ko/batch8.ts index 5c3c431..015e3eb 100644 --- a/src/i18n/ko/batch8.ts +++ b/src/i18n/ko/batch8.ts @@ -1,4 +1,632 @@ -/** ko — batch 8. Filled by the translation pass; empty until then. */ -const koBatch8 = {}; +/** + * Korean (한국어) — batch 8: hardcoded-string sweep namespaces + * (deckCostUi, becomeRolesUi, weatherUi, skaterLabelsUi, notifyUi, + * legacyMiscUi). + * + * Skate/brand vocabulary follows the Korean conventions: Deck→데크, + * Trucks→트럭, Wheels→휠, Bearings→베어링, Griptape→그립테이프, Spot→스팟, + * Park→파크, Bowl→볼, Crew→크루; Vert, sats, Nostr, Lightning, Stash, The Lab, + * brand names and trick names stay English. `{{placeholders}}` are preserved + * verbatim. + */ +const koBatch8 = { + deckCostUi: { + presetPrompt: '이 프리셋의 이름을 입력하세요', + presetDefaultName: '프리셋 {{n}}', + summaryCopied: '요약을 복사했습니다', + couldNotCopy: '복사할 수 없습니다', + resetConfirm: '모든 값을 예시 값으로 초기화할까요?', + logoTooLarge: '로고가 너무 큽니다 (최대 500 KB)', + loginToFill: 'Nostr 프로필에서 불러오려면 로그인하세요', + filledFromProfile: 'Nostr 프로필에서 불러왔습니다', + warnRetailBelowOne: '소매 마크업이 1× 미만입니다 — 손해를 보고 판매하게 됩니다.', + warnWholesaleAboveRetail: '도매 마크업은 소매 마크업보다 낮아야 합니다.', + warnZeroBoards: '{{count}}개 행이 0 데크를 사용합니다 — 해당 행의 비용은 무시됩니다.', + warnFixedNoBoards: '고정 월 비용이 설정되었지만 월 데크 수가 0이라 운영 비용이 무시됩니다.', + warnNoMaterials: '자재 비용이 없습니다 — 자재를 하나 이상 추가하세요.', + warnEquipmentOverhead: '장비 + 간접비가 비용의 60%를 넘습니다 — 이 모델은 대량 생산을 가정하니 데크 수를 확인하세요.', + warnOneBoard: '일부 장비 비용이 데크 한 장에 분산되어 있습니다 — 데크 수를 늘려 상각하세요.', + templateStarterName: '취미 입문', + templateStarterBlurb: '몇 개의 행만, 고정 비용 없음', + templateShopName: '소규모 샵', + templateShopBlurb: '임대료와 간접비를 포함한 전체 시트', + currency: '통화', + noCurrencyMatches: '일치하는 통화가 없습니다.', + ratesUnavailable: '실시간 환율을 사용할 수 없습니다 — 전환해도 이름만 바뀝니다.', + liveRates: '실시간 BTC 환율 · sats 포함', + chipCost: '원가', + chipSell: '판매가', + chipTotal: '합계', + startFrom: '시작하기', + advancedToggleHint: '공정별 단가와 스크랩, 배치 준비, 세금, 수량 대비 비용 곡선을 표시합니다', + advanced: '고급', + simple: '간단', + sectionLabor: '노무', + sectionEquipment: '장비', + sectionOperations: '운영 비용', + sectionMaterials: '자재', + sectionProcesses: '공정 비용', + sectionPackaging: '포장', + sectionMargins: '마진', + subtotalLoaded: '{{value}}/시간 (부담 포함)', + subtotalPerBoard: '{{value}}/데크', + hourlyRate: '시급 ({{unit}})', + labourBurden: '노무 부담 (×)', + loadedRate: '부담 포함 시급', + loadedRateHintBefore: '부담 포함 시급 = 임금 × 부담 (노무에 대한 고용주 세금 및 보험). 임대료와 공과금은 다음 항목에 넣으세요: ', + loadedRateHintAfter: ' — 두 곳에 중복 계산하지 마세요.', + colEquipment: '장비', + colCostUnit: '비용 ({{unit}})', + colCost: '비용', + colSetupH: '준비 (시간)', + colLifetimeBoards: '총 사용 데크', + colPerBoard: '데크당', + colMaterial: '자재', + colOrderUnit: '주문 ({{unit}})', + colShipUnit: '배송 ({{unit}})', + colBoardsOrder: '데크 / 주문', + colOrderM: '주문 (분)', + colUnloadM: '하역 (분)', + colOrder: '주문', + colShipping: '배송', + colOrderMin: '주문 (분)', + colUnloadMin: '하역 (분)', + colProcess: '공정', + colTimeM: '시간 (분)', + colBoardsRun: '데크 / 실행', + colRateHr: '단가/시간 (0 = 샵)', + colRateHrShort: '단가/시간', + colScrapPct: '스크랩 %', + colTimeMin: '시간 (분)', + colPackaging: '포장', + colTimeBoardM: '시간/데크 (분)', + colTimeBoardMin: '시간/데크 (분)', + colMaterialsBoardUnit: '자재/데크 ({{unit}})', + colMaterialsBoard: '자재/데크', + equipmentPerBoard: '데크당 장비:', + materialsPerBoard: '데크당 자재:', + processesPerBoard: '데크당 공정:', + packagingPerBoard: '데크당 포장:', + perBoard: '데크당:', + addEquipment: '장비 추가', + addMaterial: '자재 추가', + addProcess: '공정 추가', + addPackagingStep: '포장 단계 추가', + duplicate: '복제', + remove: '삭제', + boardsPerMonth: '데크 / 월', + rentPerMonth: '임대료 / 월', + utilitiesPerMonth: '공과금 / 월', + subscriptionsPerMonth: '구독료 / 월', + markup: '마크업 (×)', + wholesaleMarkup: '도매 마크업 (×)', + scrapWaste: '스크랩 / 폐기 (%)', + quantityDecks: '수량 (데크)', + targetMonthlyProfit: '목표 월 이익 ({{unit}})', + costNoPackaging: '원가 / 데크 (포장 제외)', + costWithPackaging: '원가 / 데크 (포장 포함)', + batchSetupHours: '배치 준비 (시간 / 실행)', + batchSetupCost: '배치 준비 비용 ({{unit}} / 실행)', + taxVat: '세금 / VAT (%)', + quoteTax: '견적 세금', + includedInPrice: '가격에 포함', + addedOnTop: '추가 부과', + setupPerBoard: '준비 / 데크', + marginNoteBefore: '마크업 {{markup}}× ≈ ', + grossMargin: '{{pct}}% 총 마진', + marginNoteAfter: ' · 폐기 {{waste}}%가 양품 데크에 분산됩니다.', + sellingPriceNoPackaging: '판매가 · 포장 제외', + sellingPriceWithPackaging: '판매가 · 포장 포함', + profitPerDeck: '이익 / 데크', + wholesalePerDeck: '도매 / 데크', + orderTotalQty: '주문 합계 ({{qty}})', + orderTotal: '주문 합계', + breakeven: '손익분기', + breakevenPerMonth: '월 {{count}}', + targetDecksHint: '고정 비용 외에 월 {{amount}}을 남기려면 월 {{decks}}장을 판매하세요.', + priceIncludesTax: '가격에 {{pct}}% 세금이 포함됨: 합계 중 {{amount}}.', + plusTax: '추가 {{pct}}% 세금: {{amount}} → 합계 {{total}}.', + costVsQuantity: '수량 대비 비용 (준비비 상각)', + deckOne: '데크', + deckOther: '데크', + perDeckSuffix: '/ 데크', + orderSuffix: '주문 {{amount}}', + shippingNotIncluded: '구매자 배송비는 포함되지 않습니다.', + clientQuoteDetails: '고객 견적 세부정보 (PDF용)', + fillFromProfileTitle: 'Nostr 프로필에서 이름, 웹사이트, NIP-05, Lightning, npub을 채웁니다', + fillFromProfile: '프로필에서 채우기', + businessName: '사업체 / 샵 이름', + email: '이메일', + phone: '전화', + website: '웹사이트', + address: '주소', + quoteNumber: '견적 번호', + nextNumber: '다음 번호', + validDays: '유효 기간 (일)', + nip05: 'NIP-05', + lightningAddress: 'Lightning 주소', + nostrNpub: 'Nostr (npub)', + depositPct: '선불 계약금 (%)', + deliveryTerms: '인도 조건 (Incoterm, 선택)', + paymentMethods: '결제 방법', + paymentTerms: '결제 조건', + paymentDetails: '결제 세부정보', + notesTerms: '메모 / 약관', + changeLogo: '로고 변경', + addLogo: '로고 추가', + incotermNone: '없음', + incotermExw: 'EXW — 판매자에게서 직접 수령', + incotermFca: 'FCA — 구매자 운송인에게 인도', + incotermDap: 'DAP — 구매자 주소로 인도', + incotermDdp: 'DDP — 관세 지불 후 인도', + payMethodCash: '현금', + payMethodLightning: 'Lightning', + payMethodCashu: 'Cashu', + payMethodBank: '계좌 이체', + payMethodCard: '카드', + payMethodOther: '기타', + listDeckAtPrice: '이 가격으로 데크 판매 등록', + getItMade: '제작 의뢰 — 빌더 찾기', + savePreset: '프리셋 저장', + load: '불러오기', + export: '내보내기', + import: '가져오기', + reset: '초기화', + deletePreset: '프리셋 삭제', + exportPdfFull: 'PDF — 전체 시트', + exportPdfQuote: 'PDF — 고객 견적', + exportPng: 'PNG 이미지', + exportXlsx: 'XLSX 통합 문서', + exportCsv: 'CSV (스프레드시트)', + exportMarkdown: 'Markdown', + exportJson: 'JSON (백업)', + exportCopySummary: '요약 복사', + }, + becomeRolesUi: { + artist: { + seoTitle: '디자이너 / 아티스트 되기 - SkateSpots', + seoDescription: '스케이트 디자인과 아트를 등록하세요 — 데크 그래픽, 로고, 포스터, 굿즈 등.', + heading: '디자이너 / 아티스트', + tagline: '데크 그래픽, 로고, 포스터, 굿즈 — 당신의 아트를 신에 새기세요', + noun: '아티스트', + rateLabel: '요금', + portfolioLabel: '포트폴리오 / 샵 링크', + sectionWhatYouMake: '제작하는 것', + sectionMedium: '매체', + sectionSoftwareTools: '소프트웨어 & 툴', + deliverablesPlaceholder: '예: 인쇄용 파일, 소스 파일, 데크 그래픽', + turnaroundPlaceholder: '예: 3–5일', + }, + graffiti: { + seoTitle: '그래피티 / 벽화 제공 - SkateSpots', + seoDescription: '그래피티와 벽화 작업을 등록하세요 — 피스, 벽화, 스케이트파크 아트 등.', + heading: '그래피티 / 벽화 아티스트', + tagline: '피스, 벽화, 스케이트파크 아트 — 신을 칠하세요', + noun: '그래피티 아티스트', + rateLabel: '요금', + portfolioLabel: '포트폴리오 링크 (IG, 사이트)', + sectionStyle: '스타일', + sectionMedium: '매체', + sectionWorkContext: '작업 환경', + crewLabel: '그래피티 크루', + crewPlaceholder: '당신의 라이팅 크루 (선택)', + crewHelper: '스케이트 크루와는 별개 — 함께 그리는 라이터들.', + surfacesPlaceholder: '예: 콘크리트, 벽돌, 허가된 벽', + maxSizePlaceholder: '예: 최대 10 m', + }, + musician: { + seoTitle: '음악 프로필 추가 - SkateSpots', + seoDescription: '스케이트도 하고 음악도 하나요? 밴드나 솔로 프로젝트를 등록하세요 — 장르, 악기, 링크.', + heading: '뮤지션 / 밴드', + tagline: '스케이트도 하고 음악도 하나요? 데모, 잼, 애프터파티에 섭외되세요', + noun: '뮤지션', + rateLabel: '섭외 요금', + portfolioLabel: '웹사이트 / EPK 링크', + sectionGenre: '장르', + sectionInstruments: '악기 & 역할', + actLabel: '공연 형태', + actPlaceholder: '솔로 / 밴드 / DJ / 프로듀서', + spotifyLabel: 'Spotify', + spotifyPlaceholder: 'https://open.spotify.com/…', + bandcampLabel: 'Bandcamp', + bandcampPlaceholder: 'https://…bandcamp.com', + soundcloudLabel: 'SoundCloud', + soundcloudPlaceholder: 'https://soundcloud.com/…', + youtubeLabel: 'YouTube', + youtubePlaceholder: 'https://youtube.com/…', + setLengthPlaceholder: '예: 30–45분', + techRiderPlaceholder: '예: PA, 마이크, 백라인', + }, + judge: { + seoTitle: '스케이트 이벤트 심사 - SkateSpots', + seoDescription: '스케이트 이벤트 심사자로 등록하세요 — Game of S.K.A.T.E., 베스트 트릭 잼, 콘테스트, 아마 시리즈, 월드 투어 스톱. 공정하고 신뢰할 수 있는 이벤트를 운영하도록 섭외되세요.', + heading: '스케이트 이벤트 심사자', + tagline: '평지 Game of S.K.A.T.E.부터 World Destruction Tour까지 — 공정하고 신뢰할 수 있게 운영하세요', + noun: '심사자', + rateLabel: '일당 / 수수료', + portfolioLabel: '결과 아카이브 / 프로필 링크', + sectionEventFormats: '이벤트 형식', + sectionSpecialty: '전문 분야', + sectionLevelCircuit: '레벨 / 서킷', + eventsJudgedLabel: '심사한 이벤트', + eventsJudgedPlaceholder: '예: 콘테스트 40회 이상, 월드 투어 3개 스톱', + eventsJudgedHelper: '심사를 맡았던 주요 이벤트, 대회, 투어.', + travelPlaceholder: '예: 지역 / 전국 / 국제', + certificationsPlaceholder: '예: 국가 심사 과정', + }, + organizer: { + seoTitle: '스케이트 이벤트 주최 - SkateSpots', + seoDescription: '스케이트 이벤트 주최자로 등록하세요 — 스트리트 잼, 베스트 트릭, 콘테스트, 밋업, 데모, 투어 스톱. 발견되고 세션을 운영하도록 섭외되세요.', + heading: '이벤트 주최자', + tagline: '잼, 콘테스트, 밋업 & 데모 — 세션을 열고 신을 하나로 모으세요', + noun: '주최자', + rateLabel: '이벤트 비용 / 예산', + portfolioLabel: '지난 이벤트 / 결과 링크', + sectionEventTypes: '이벤트 유형', + sectionWhatYouHandle: '담당하는 것', + sectionScale: '규모', + eventsHostedLabel: '주최한 이벤트', + eventsHostedPlaceholder: '예: 잼 25회, 시 대회 3회', + eventsHostedHelper: '운영했던 주요 이벤트, 대회, 밋업.', + insurancePlaceholder: '예: 공공 배상책임 포함', + permitsPlaceholder: '예: 시청 허가 처리 완료', + }, + tattoo: { + seoTitle: '타투 아티스트 되기 - SkateSpots', + seoDescription: '스케이트 신을 위한 타투 작업을 등록하세요 — 스타일, 플래시, 커스텀 등.', + heading: '타투 아티스트', + tagline: '신을 위한 잉크 — 플래시, 커스텀, 파인 라인 등', + noun: '타투 아티스트', + rateLabel: '요금 / 시간당', + portfolioLabel: '포트폴리오 링크 (IG, 사이트)', + sectionStyles: '스타일', + sectionMethod: '방식', + studioLabel: '스튜디오 / 샵', + studioPlaceholder: '스튜디오 이름 (선택)', + booksOpenLabel: '예약 접수 중', + booksOpenHelper: '현재 예약을 받고 있나요?', + depositPlaceholder: '예: 50 EUR 환불 불가', + minimumPlaceholder: '예: 80 EUR', + }, + trainer: { + seoTitle: '트레이너 / 물리치료사 되기 - SkateSpots', + seoDescription: '스케이터가 강해지고 건강을 유지하도록 도우세요 — 근력, 가동성, 부상 예방과 회복.', + heading: '트레이너 / 물리치료사', + tagline: '스케이터를 위한 근력, 가동성, 부상 예방 & 회복', + noun: '트레이너', + rateLabel: '요금 / 세션', + portfolioLabel: '프로필 / 예약 링크', + sectionFocus: '중점 분야', + sectionInjuries: '담당 부상', + sectionCredentialsSetting: '자격 & 환경', + credentialsPlaceholder: '예: 물리치료학 학사, CSCS…', + credentialsHelper: '실제 자격을 기재하세요 — 스케이터는 검증 가능한 자격을 신뢰합니다.', + remoteLabel: '원격 / 온라인', + remoteHelper: '온라인 코칭이나 상담을 제공하나요?', + modalitiesPlaceholder: '예: 도수치료, S&C, 건침', + }, + barber: { + seoTitle: '이발사 / 헤어스타일리스트 되기 - SkateSpots', + seoDescription: '스케이트 신을 위한 이발소나 체어를 등록하세요 — 컷, 페이드, 수염 정리, 염색 등. 스케이터에게 섭외되세요.', + heading: '이발사 / 헤어스타일리스트', + tagline: '신을 위한 컷, 페이드 & 수염 정리 — 샵 체어 또는 출장', + noun: '이발사', + rateLabel: '가격 / 컷', + portfolioLabel: '컷 갤러리 / IG 링크', + sectionWhatYouOffer: '제공하는 것', + sectionSignatureStyles: '시그니처 스타일', + sectionSetting: '환경', + studioLabel: '샵 / 스튜디오', + studioPlaceholder: '샵 또는 스튜디오 이름 (선택)', + booksOpenLabel: '예약 접수 중', + booksOpenHelper: '현재 예약을 받고 있나요?', + durationPlaceholder: '예: 30–45분', + }, + }, + weatherUi: { + condition: { + clearSky: '맑음', + mainlyClear: '대체로 맑음', + partlyCloudy: '부분적으로 흐림', + overcast: '흐림', + foggy: '안개', + depositingRimeFog: '착빙 안개', + lightDrizzle: '약한 이슬비', + moderateDrizzle: '보통 이슬비', + denseDrizzle: '짙은 이슬비', + lightFreezingDrizzle: '약한 어는 이슬비', + denseFreezingDrizzle: '짙은 어는 이슬비', + slightRain: '약한 비', + moderateRain: '보통 비', + heavyRain: '강한 비', + lightFreezingRain: '약한 어는 비', + heavyFreezingRain: '강한 어는 비', + slightSnow: '약한 눈', + moderateSnow: '보통 눈', + heavySnow: '강한 눈', + snowGrains: '싸락눈', + slightRainShowers: '약한 소나기', + moderateRainShowers: '보통 소나기', + violentRainShowers: '강한 소나기', + slightSnowShowers: '약한 눈 소나기', + heavySnowShowers: '강한 눈 소나기', + thunderstorm: '뇌우', + thunderstormSlightHail: '약한 우박을 동반한 뇌우', + thunderstormHeavyHail: '강한 우박을 동반한 뇌우', + unknown: '알 수 없음', + }, + aqi: { + good: '좋음', + moderate: '보통', + unhealthySensitive: '민감군에 나쁨', + unhealthy: '나쁨', + veryUnhealthy: '매우 나쁨', + hazardous: '위험', + }, + skateability: { + perfect: '완벽', + good: '좋음', + okay: '괜찮음', + poor: '나쁨', + bad: '매우 나쁨', + unrideable: '탈 수 없음', + }, + reason: { + currentlyRaining: '현재 비가 내림', + raining: '비', + snowing: '눈', + thunderstorm: '뇌우', + freezingTemperature: '영하의 기온', + veryCold: '매우 추움', + extremelyHot: '극심한 더위', + veryHot: '매우 더움', + veryStrongWind: '매우 강한 바람', + strongWind: '강한 바람', + moderateWind: '보통 바람', + veryUnhealthyAir: '매우 나쁜 대기질', + unhealthyAir: '나쁜 대기질', + moderateAirQuality: '보통 대기질', + veryHumid: '매우 습함', + humid: '습함', + extremeUv: '극심한 자외선 - 자외선 차단제를 바르세요', + highUv: '높은 자외선 - 자외선 차단 권장', + perfectConditions: '완벽한 스케이팅 컨디션', + }, + }, + skaterLabelsUi: { + stance: { + regular: '레귤러', + goofy: '구피', + }, + style: { + street: '스트리트', + park: '파크', + vert: 'Vert', + transition: '트랜지션', + bowl: '볼', + cruising: '크루징', + downhill: '다운힐', + freestyle: '프리스타일', + ledges: '레지', + stairs: '스테어', + diy: 'DIY', + }, + level: { + grom: '그롬', + intermediate: '중급', + advanced: '상급', + ripper: '리퍼', + }, + sponsor: { + title: '타이틀 스폰서', + gold: '골드', + silver: '실버', + partner: '파트너', + }, + }, + notifyUi: { + activity: { + zappedWithAmount: '{{sats}} sats를 Zap 받았습니다', + zapped: 'Zap을 받았습니다', + liked: '누군가 회원님의 게시물을 좋아합니다', + reposted: '누군가 회원님을 리포스트했습니다', + mentioned: '누군가 회원님을 언급했습니다', + replied: '누군가 회원님에게 답글을 남겼습니다', + rsvp: '누군가 회원님의 이벤트에 RSVP했습니다', + eventUpdated: '참석 예정인 이벤트가 업데이트되었습니다', + newActivity: '새 활동', + tapToOpen: '탭하여 SkateSpots 열기', + }, + crew: { + inviteTitle: '크루 초대', + inviteBody: '{{crew}}에 초대되었습니다', + addedTitle: '크루에 추가되었습니다', + addedBody: '{{crew}} — 참여를 확인하세요', + joinRequestTitle: '가입 요청', + joinRequestBody: '누군가 {{name}}에 가입하고 싶어 합니다', + }, + dm: { + title: '새 다이렉트 메시지', + body: '탭하여 읽기', + }, + trade: { + confirm: '거래 확인', + confirmed: '거래가 확인되었습니다', + newOffer: '회원님의 등록에 새 제안', + counter: '역제안', + accepted: '제안이 수락되었습니다 🎉', + declined: '제안이 거절되었습니다', + withdrawn: '제안이 철회되었습니다', + }, + newsletter: { + drop: '새 SkateSpots 소식', + }, + summary: { + moreUpdates: '{{count}}개의 새 업데이트', + openToCatchUp: 'SkateSpots를 열어 확인하세요', + }, + }, + legacyMiscUi: { + hostingGoing: '{{count}}명 참석', + hostingInterested: '{{count}}명 관심', + hostingPostUpdate: '업데이트 게시', + hostingEdit: '편집', + hostingLoginToSee: '주최하는 이벤트를 보려면 로그인하세요.', + hostingEmptyTitle: '아직 주최하는 이벤트가 없습니다', + hostingEmptyBody: '잼, 대회, 세션을 열어보세요. 이벤트를 만들면 스케이터가 RSVP하고, 업데이트를 받고, 찾아올 수 있습니다.', + hostingCreateEvent: '이벤트 만들기', + hostingUpcoming: '예정 · {{count}}', + hostingPast: '지난 · {{count}}', + sponsorPartners: '파트너', + sponsorTitleSponsor: '타이틀 스폰서', + sponsorPlatformPartners: '플랫폼 파트너', + reportsUntitled: '(제목 없음)', + reportsResolveFailed: '신고된 이벤트를 확인할 수 없습니다 (삭제되었거나, 게시물이 아닌 프로필을 신고한 것일 수 있습니다).', + reportsLookAtIt: '확인하기', + reportsNoReports: '아직 신고가 없습니다. 모든 게 괜찮거나, 아무도 신고 버튼을 찾지 못한 것입니다.', + statusSetYourStatus: '상태 설정', + statusSetDesc: '무엇을 하고 있는지 알려주세요. 상태는 프로필과 연결된 스팟에 표시됩니다.', + statusClear: '지우기', + statusOrWriteOwn: '또는 직접 작성', + statusCustomPlaceholder: '무엇을 하고 있나요?', + statusLinkToSpot: '스팟 연결 (선택)', + statusSpotSelected: '스팟 선택됨', + statusSearchSpots: '스팟 검색...', + statusNoSpotsFound: '스팟을 찾을 수 없습니다.', + statusSelectSpot: '스팟 선택', + statusAutoClearAfter: '자동 지우기: {{time}} 후', + statusExpMin: '{{count}}분', + statusExpOneHour: '1시간', + statusExpHours: '{{count}}시간', + statusExpOneDay: '1일', + statusExpDays: '{{count}}일', + statusSlider15: '15분', + statusSlider1h: '1시간', + statusSlider4h: '4시간', + statusSlider24h: '24시간', + statusSetting: '상태 설정 중...', + statusSet: '상태 설정', + statusSomethingWrong: '문제가 발생했습니다', + seoProfileTitle: '프로필 - SkateSpots', + seoViewProfile: '프로필 보기.', + bannerAlt: '배너', + openInCordn: 'Cordn에서 열기', + modHelp: '숨기기는 org.skatespots.moderation / hidden을 게시하고, 확인은 … / verified를, 실행 취소는 … / cleared(중립으로 복귀)를 게시합니다. 세 가지 모두 공개적이고 되돌릴 수 있는 라벨이며, 릴레이에서 어떤 것도 삭제되지 않습니다.', + zapNoActiveMint: '활성 Cashu 민트를 찾을 수 없습니다.', + altProfile: '프로필', + altCardPreview: '카드 미리보기', + altCard: '카드', + altCaptured: '캡처됨', + ariaPrevPhoto: '이전 사진', + ariaNextPhoto: '다음 사진', + ariaCommentOptions: '댓글 옵션', + ariaMessageConversation: '메시지 대화', + exportTitle: 'SkateSpots — 데크 원가 계산기', + exportQuoteTitle: '견적서', + exportPngTitle: '데크 원가', + exportMarkdownTitle: '데크 원가 계산기', + exportSectionLabor: '노무', + exportSectionEquipment: '장비', + exportSectionOperations: '운영 비용', + exportSectionMaterials: '자재', + exportSectionProcesses: '공정 비용', + exportSectionPackaging: '포장', + exportSectionResult: '결과', + exportLabelOperations: '운영', + exportLabelProcesses: '공정', + exportKvHourlyRate: '시급', + exportKvLabourBurden: '노무 부담', + exportKvLoadedRate: '부담 포함 시급', + exportKvEquipmentPerBoard: '데크당 장비', + exportKvBoardsPerMonth: '데크 / 월', + exportKvRentPerMonth: '임대료 / 월', + exportKvUtilitiesPerMonth: '공과금 / 월', + exportKvSubscriptionsPerMonth: '구독료 / 월', + exportKvPerBoard: '데크당', + exportKvMaterialsPerBoard: '데크당 자재', + exportKvProcessesPerBoard: '데크당 공정', + exportKvPackagingPerBoard: '데크당 포장', + exportKvMarkup: '마크업', + exportMarkupValue: '{{markup}}× (≈ 총마진 {{pct}}%)', + exportKvWasteEffective: '폐기 (실효)', + exportKvCostNoPack: '원가 / 데크 (포장 제외)', + exportKvCostWithPack: '원가 / 데크 (포장 포함)', + exportKvBatchSetupPerBoard: '배치 준비 / 데크', + exportKvTax: '세금 ({{pct}}%)', + exportKvTaxIncluded: '세금 ({{pct}}%, 포함)', + exportKvSellingNoPack: '판매가 (포장 제외)', + exportKvSellingWithPack: '판매가 (포장 포함)', + exportShippingNote: '구매자 배송비는 포함되지 않습니다.', + exportGeneratedBy: 'SkateSpots로 생성 · skate-spots.org', + exportGeneratedWith: 'SkateSpots로 생성됨 · skate-spots.org', + exportDetailSetup: '+ {{hours}}시간 준비', + exportDetailBoards: '{{boards}} 데크', + exportDetailShip: '+ 배송 {{amount}}', + exportDetailMinutes: '{{minutes}}분', + exportDetailPerBoards: '/ {{boards}} 데크', + exportDetailScrap: '{{pct}}% 스크랩', + exportDetailMaterials: '자재 {{materials}}개', + exportQuoteRef: '참조 {{ref}}', + exportQuoteLineItem: '커스텀 스케이트보드 데크', + exportQuoteLineItemQty: '커스텀 스케이트보드 데크 × {{qty}}', + exportQuoteLineDesc: '수작업 제작, 마감 및 포장 완료. 수량 1.', + exportQuoteLineDescQty: '수작업 제작, 마감 및 포장 완료. 개당 {{price}}.', + exportQuoteSubtotal: '소계', + exportQuoteSubtotalQty: '소계 ({{qty}} 데크)', + exportQuoteTax: '세금 / VAT ({{pct}}%)', + exportQuoteTotal: '합계', + exportQuoteTotalQty: '합계 ({{qty}} 데크)', + exportQuoteIncludesTax: '{{pct}}% 세금 포함 ({{amount}})', + exportQuoteDeposit: '지금 납부할 계약금 ({{pct}}%)', + exportQuoteBalance: '완료 시 잔금', + exportQuotePayment: '결제: {{value}}', + exportQuoteLightning: 'Lightning: {{value}}', + exportQuoteDetails: '세부정보: {{value}}', + exportQuoteTerms: '조건: {{value}}', + exportQuoteDelivery: '인도: {{value}}', + exportQuoteValidUntil: '배송비는 포함되지 않습니다. 견적 유효 기간: {{date}}까지.', + exportPngSellingWith: '판매가 · 포장 포함', + exportPngSellingNo: '판매가 · 포장 제외', + exportPngCostWith: '원가 / 데크 (포장 포함)', + exportPngDeposit: '계약금 {{pct}}%: {{amount}}', + exportXlsxSummary: '요약', + exportXlsxCurrency: '통화', + exportXlsxDate: '날짜', + exportXlsxOperationsPerBoard: '데크당 운영', + exportColCost: '비용', + exportColSetupH: '준비 (시간)', + exportColBoards: '데크', + exportColPerBoard: '데크당', + exportColMaterial: '자재', + exportColOrderCost: '주문 비용', + exportColShipping: '배송', + exportColOrderMin: '주문 (분)', + exportColUnloadMin: '하역 (분)', + exportColProcess: '공정', + exportColTimeMin: '시간 (분)', + exportColTimeBoardMin: '시간/데크 (분)', + exportColMaterialsBoard: '자재/데크', + exportCopyTitle: '데크 원가 — {{currency}}', + exportCopyCostWith: '원가 / 데크 (포장 포함): {{amount}}', + exportCopySellingNo: '판매가 (포장 제외): {{amount}}', + exportCopySellingWith: '판매가 (포장 포함): {{amount}}', + exportCopyBreakdown: '장비 {{equipment}} · 운영 {{operations}} · 자재 {{materials}} · 공정 {{processes}} · 포장 {{packaging}}', + exportMdHourlyRate: '시급: {{value}}', + exportMdLabourBurden: '노무 부담: {{value}}', + exportMdLoadedRate: '부담 포함 시급: {{value}}', + exportMdBoardsPerMonth: '데크/월: {{value}}', + exportMdRent: '임대료: {{value}}', + exportMdUtilities: '공과금: {{value}}', + exportMdSubscriptions: '구독료: {{value}}', + exportMdPerBoard: '데크당: {{value}}', + exportMdMarkupWaste: '마크업: {{markup}}× (≈ 총마진 {{pct}}%) · 폐기: {{waste}}%', + exportMdCostNoPack: '원가/데크 (포장 제외): {{value}}', + exportMdCostWithPack: '원가/데크 (포장 포함): {{value}}', + exportMdBatchSetup: '배치 준비/데크: {{value}}', + exportMdSellingNo: '판매가 (포장 제외): {{value}}', + exportMdSellingWith: '판매가 (포장 포함): {{value}}', + exportMdDisclaimer: '구매자 배송비는 포함되지 않습니다. SkateSpots로 생성.', + }, +}; export default koBatch8; diff --git a/src/i18n/ru/batch1.ts b/src/i18n/ru/batch1.ts index 68e517f..024fb20 100644 --- a/src/i18n/ru/batch1.ts +++ b/src/i18n/ru/batch1.ts @@ -1,4 +1,308 @@ -/** ru — batch 1. Filled by the translation pass; empty until then. */ -const ruBatch1 = {}; +const ruBatch1 = { + common: { + loading: "Загрузка…", + error: "Ошибка", + save: "Сохранить", + cancel: "Отмена", + delete: "Удалить", + edit: "Изменить", + add: "Добавить", + remove: "Убрать", + create: "Создать", + submit: "Отправить", + close: "Закрыть", + back: "Назад", + next: "Далее", + done: "Готово", + search: "Поиск", + filter: "Фильтр", + sort: "Сортировка", + share: "Поделиться", + more: "Ещё", + copy: "Копировать", + copied: "Скопировано!", + viewAll: "Все", + seeMore: "Показать ещё", + showMore: "Показать больше", + showLess: "Показать меньше", + noResults: "Ничего не найдено", + tryAgain: "Попробовать снова", + learnMore: "Узнать больше", + getStarted: "Начать", + yes: "Да", + no: "Нет", + or: "или", + and: "и", + free: "Бесплатно", + new: "Новое", + popular: "Популярное", + featured: "Рекомендуемое", + verified: "Подтверждено", + sats: "sats", + clear: "Очистить", + clearFilters: "Сбросить фильтры", + clearAll: "Очистить всё", + hide: "Скрыть", + undo: "Отменить", + }, + nav: { + home: "Главная", + map: "Spots", + lab: "The Lab", + events: "События", + crews: "Crews", + wallet: "Кошелёк", + settings: "Настройки", + more: "Ещё", + rewards: "Награды", + stats: "Статистика сообщества", + about: "О приложении", + food: "Еда", + marketplace: "Маркетплейс", + mints: "Минты", + appShop: "Магазин приложения", + diy: "DIY", + trades: "Маркетплейс", + stash: "Stash", + collections: "Коллекции", + contacts: "Контакты", + messages: "Сообщения", + skaters: "Скейтеры", + glossary: "Глоссарий", + riderCard: "Карта райдера", + supporters: "Саппортеры ⚡", + newsletter: "Рассылка", + viewProfile: "Открыть профиль", + leaderboards: "Таблицы лидеров", + }, + chromeUi: { + skipToContent: "Перейти к содержимому", + menu: "Меню", + inBadge: "В", + loggedIn: "Вы вошли", + profile: "Профиль", + logIn: "Войти", + logOut: "Выйти", + notLoggedIn: "Вы не вошли", + loggedOutPrompt: + "Войдите, чтобы добавлять Spots, отправлять Zap скейтерам и сохранять избранное", + accounts: "Аккаунты", + addAnotherAccount: "Добавить аккаунт", + setStatus: "Установить статус", + setYourStatus: "Установите свой статус", + status: "Статус", + addSpot: "Добавить Spot", + 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: "Park", + plaza: "Плаза", + diy: "DIY", + bowl: "Bowl", + vert: "Vert", + indoor: "Крытый", + skatepark: "Скейтпарк", + miniramp: "Мини-рамп", + }, + }, + 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: "Панель заполнена — уберите одну, чтобы заменить", + moveUp: "Переместить {{name}} вверх", + moveDown: "Переместить {{name}} вниз", + login: "Войти", + profile: "Профиль", + reset: "Сбросить", + done: "Готово", + }, + pwa: { + installTitle: "Установить SkateSpots", + installSubtitle: "Полноценные возможности приложения", + addToHomeScreen: "На главный экран", + installApp: "Установить приложение", + maybeLater: "Может, позже", + gotIt: "Понятно!", + benefits: { + fast: "Молниеносно быстро", + offline: "Работает офлайн", + fullAccess: "Полный доступ", + }, + iosStep1: "Нажмите кнопку «Поделиться»", + iosStep1Hint: "внизу экрана Safari", + iosStep2: "Прокрутите и нажмите \"На главный экран\"", + iosStep2Hint: "в меню «Поделиться»", + iosStep3: "Нажмите \"Добавить\", чтобы установить", + iosStep3Hint: "Приложение появится на главном экране", + androidStep1: "Нажмите кнопку меню", + androidStep1Hint: "(три точки) в браузере", + androidStep2: "Выберите \"На главный экран\"", + androidStep2Hint: "или \"Установить приложение\"", + androidStep3: "Подтвердите установку", + androidStep3Hint: "Приложение появится на главном экране", + tagline: "Бесплатно • Работает офлайн • Быстро и надёжно", + }, + home: { + tagline: "Силами сообщества • На основе Relay", + title: "SKATE SPOTS", + subtitle: "Находи Spots • Встречайся • Учись трюкам • Поддерживай местных", + description: + "Настоящий скейтбилдинг происходит офлайн — этот инструмент помогает его найти.", + betaWarning: "БЕТА — В разработке • Используйте на свой страх и риск", + pwaHint: "Прогрессивное веб-приложение — установите на своё устройство", + exploreMap: "Открыть карту", + addSpot: "Добавить Spot", + globalSpots: "Spots по всему миру", + openCommunity: "Открытое сообщество", + lightningZaps: "Lightning Zap", + featuredSpots: "Рекомендуемые Spots", + featuredSpotsDesc: "Проверенные сообществом скейт-Spots со всего мира", + upcomingEvents: "Скоро", + upcomingEventsDesc: "Контесты, встречи и сессии в ближайшее время", + noSpotsYet: "Пока не найдено ни одного Spot", + noSpotsHint: "Добавьте скейт-Spot первым!", + noEventsYet: "Нет предстоящих событий", + noEventsHint: "Загляните позже или создайте своё!", + theLab: "The Lab", + theLabDesc: "Учите трюки, находите тренеров и повышайте уровень катания", + coaches: "Тренеры", + coachesDesc: "Учитесь у опытных скейтеров, которые помогут вам прогрессировать", + filmers: "Операторы", + filmersDesc: "Свяжитесь с операторами, чтобы снять лучшие клипы", + findCoach: "Найти тренера", + becomeCoach: "Стать тренером", + findFilmer: "Найти оператора", + becomeFilmer: "Стать оператором", + viewAllSpots: "Все Spots", + viewAllEvents: "Все события", + createEvent: "Создать событие", + readyToShare: "Готовы поделиться?", + readyToShareDesc: + "Помогите скейт-сообществу расти, добавляя любимые Spots. Каждое место, которым вы делитесь, помогает другим скейтерам находить новые места для катания.", + }, + about: { + title: "О SkateSpots", + subtitle: "Децентрализованное скейт-сообщество", + whatIs: "Что такое SkateSpots?", + whatIsDesc: + "SkateSpots — это платформа, созданная сообществом, для поиска мест катания по всему миру. Построена на Nostr, она даёт скейтерам настоящую власть над своими данными.", + features: "Возможности", + featuresDesc: + "Находите Spots, создавайте события, связывайтесь с тренерами и поддерживайте местные скейт-магазины — всё в одном месте.", + nostr: "Построено на Nostr", + nostrDesc: + "Nostr — это простой открытый протокол, обеспечивающий по-настоящему устойчивую к цензуре глобальную коммуникацию. Ваш аккаунт и данные принадлежат вам.", + openSource: "Открытый исходный код", + openSourceDesc: + "SkateSpots полностью открыт. Вносите вклад, форкайте или запускайте свою версию.", + lightning: "Платежи Lightning", + lightningDesc: + "Отправляйте Zap любимым скейтерам, тренерам и авторам контента через платежи Bitcoin Lightning.", + }, + faq: { + title: "Часто задаваемые вопросы", + subtitle: "Всё, что нужно знать о SkateSpots", + whatIsNostr: "Что такое Nostr?", + whatIsNostrAnswer: + "Nostr — это открытый протокол для децентрализованных социальных сетей. В отличие от традиционных платформ, ваши данные и личность принадлежат вам.", + howToStart: "Как начать?", + howToStartAnswer: + "Нажмите \"Зарегистрироваться\", чтобы создать новый аккаунт Nostr, или \"Войти\", если он у вас уже есть. Можно использовать расширение браузера, мобильное приложение или секретный ключ.", + whatAreZaps: "Что такое Zap?", + whatAreZapsAnswer: + "Zap — это чаевые в Bitcoin Lightning, которые можно отправлять другим пользователям. Так можно выразить благодарность за хороший контент или поддержать авторов.", + howToAddSpot: "Как добавить Spot?", + howToAddSpotAnswer: + "Войдите в аккаунт, нажмите \"Добавить Spot\" и заполните данные: местоположение, фото и описание.", + isItFree: "SkateSpots бесплатный?", + isItFreeAnswer: + "Да! SkateSpots полностью бесплатен. По желанию можно отправлять Zap (чаевые в Bitcoin) другим пользователям.", + canIEditSpot: "Можно ли редактировать или удалять свои Spots?", + canIEditSpotAnswer: + "Да, вы можете редактировать созданные вами Spots. Из-за децентрализованной природы Nostr запросы на удаление отправляются, но некоторые Relay могут сохранить данные.", + }, + onboarding: { + welcome: "Добро пожаловать в SkateSpots!", + welcomeDesc: "Настроим всё за пару шагов.", + step1Title: "Создайте аккаунт", + step1Desc: + "Ваши ключи Nostr генерируются. Это как пароль, который контролируете вы.", + step2Title: "Сохраните ключи", + step2Desc: + "Сохраните фразу восстановления в надёжном месте. Это единственный способ восстановить аккаунт!", + step3Title: "Настройте профиль", + step3Desc: "Расскажите сообществу о себе.", + step4Title: "Всё готово!", + step4Desc: "Начните изучать Spots, события и общаться со скейтерами.", + skipForNow: "Пропустить пока", + continueToApp: "Перейти в приложение", + }, +}; export default ruBatch1; diff --git a/src/i18n/ru/batch2.ts b/src/i18n/ru/batch2.ts index 34ed031..649437f 100644 --- a/src/i18n/ru/batch2.ts +++ b/src/i18n/ru/batch2.ts @@ -1,4 +1,1652 @@ -/** ru — batch 2. Filled by the translation pass; empty until then. */ -const ruBatch2 = {}; +/** ru — batch 2. Filled by the translation pass. */ +const ruBatch2 = { + "mapUi": { + "mapFooter": { + "links": "Ссылки", + "hide": "Скрыть панель ссылок карты" + }, + "findingSpots": "Поиск спотов", + "loadingSpots": "Загрузка спотов", + "loadingMap": "Загрузка карты...", + "mapViewAria": "Вид карты", + "listViewAria": "Вид списка", + "layers": "Слои", + "mapLayers": "Слои карты", + "showOnMap": "Показать на карте", + "showResults": "Показать результаты", + "quickActions": "Быстрые действия", + "spots": "Споты", + "shops": "Магазины", + "gear": "Снаряжение", + "tours": "Туры", + "events": "События", + "crews": "Crew", + "spotType": "Тип спота", + "sortBy": "Сортировка", + "trustLevel": "Уровень доверия", + "weather": "Погода", + "buySellGear": "Купить/продать снаряжение", + "stash": "Stash", + "more": "Ещё", + "newHere": "Впервые здесь?", + "welcomeDesc": "Откройте для себя споты, события и сообщество.", + "getOnZapstore": "Установить из Zapstore", + "dismiss": "Закрыть", + "addedBy": "Добавил", + "directions": "Маршрут", + "viewDetails": "Подробнее", + "viewDetailsArrow": "Подробнее →", + "spotDetails": "О споте", + "skateShop": "Скейт-магазин", + "skateSpot": "Скейт-спот", + "youAreHere": "Вы здесь", + "conditions": "Условия", + "weatherScoreSuffix": "{{score}}/100 погода", + "wind": "Ветер", + "humidity": "Влажность", + "airQuality": "Качество воздуха", + "threeDayForecast": "Прогноз на 3 дня", + "gearForSale": "Снаряжение на продажу ({{count}})", + "viewItems": "Смотреть товары →", + "viewAllItems": "Смотреть все товары ({{count}}) →", + "viewGear": "Смотреть снаряжение →", + "localTour": "Местный тур", + "meetAt": "Встреча: {{place}}", + "hours": "{{count}} ч", + "level": "{{level}} уровень", + "viewTour": "Смотреть тур →", + "upcomingEvent": "Скоро событие", + "viewEvent": "Смотреть событие →", + "skateCrew": "Skate Crew", + "members": "{{count}} участников", + "since": "С {{year}} года", + "viewCrew": "Смотреть Crew →", + "acceptsBitcoin": "Принимает Bitcoin", + "boosted": "Продвигается", + "website": "Сайт", + "offlineSavedSpots": "Офлайн · показаны сохранённые споты", + "cantReachRelays": "Не удаётся связаться с Relay", + "relayOnlineNoAnswer": "Вы онлайн, но сообщественный Relay сейчас не отвечает.", + "youreOffline": "Вы офлайн.", + "savedOnDevice": "Споты, которые вы уже видели, сохранены на этом устройстве и появятся здесь.", + "noSpotsMatchTitle": "Нет подходящих спотов", + "noSpotsMatchDesc": "Попробуйте другой запрос или сбросьте фильтры.", + "noSpotsMappedYet": "Спотов на карте пока нет", + "noSpotsMappedDesc": "Будьте первым, кто нанесёт свой Park на карту — это займёт минуту, он ваш, а следующий проезжающий скейтер скажет вам спасибо.", + "addFirstSpot": "Добавить первый спот", + "findSpotsNearMe": "Найти споты рядом", + "locating": "Определяем местоположение…", + "refiningLocation": "Уточняем местоположение…", + "refiningLocationDesc": "Центрируемся на последнем споте — получаем свежий GPS-сигнал.", + "locatingYou": "Ищем вас…", + "locatingDesc": "Получаем GPS-сигнал. В первый раз это может занять до минуты.", + "foundYou": "Вы найдены", + "foundYouDesc": "Карта отцентрирована по вашему местоположению.", + "locationPermissionNeeded": "Нужно разрешение на геолокацию", + "permissionNeededDesc": "Разрешите геолокацию для SkateSpots в настройках устройства: Настройки → Приложения → SkateSpots → Разрешения, затем снова нажмите «Рядом».", + "locationTimedOut": "Время ожидания геолокации истекло", + "timeoutNativeDesc": "Не удалось получить местоположение вовремя. Если вы в помещении, GPS не видит спутники — включите определение по сети (Настройки → Геолокация) или выйдите на улицу и попробуйте снова.", + "timeoutWebDesc": "Не удалось определить ваше местоположение вовремя. Проверьте сигнал и попробуйте ещё раз.", + "noLocationProvider": "Нет источника геолокации", + "noProviderNativeDesc": "Ваш телефон не предоставляет геолокацию. На приватных прошивках (например, GrapheneOS) включите определение по сети в разделе Настройки → Геолокация или убедитесь, что GPS включён, и попробуйте на улице.", + "noProviderWebDesc": "Источник геолокации недоступен. Включите службы геолокации и попробуйте снова.", + "locationUnavailable": "Геолокация недоступна", + "unavailableNativeDesc": "Включите геолокацию/GPS в настройках телефона, разрешите доступ для SkateSpots (Настройки → Приложения → SkateSpots → Разрешения) и попробуйте снова.", + "unavailableWebDesc": "Не удалось определить ваше местоположение. Убедитесь, что службы геолокации включены.", + "locationBlocked": "Геолокация заблокирована", + "locationBlockedDesc": "Ваш браузер заблокировал доступ к геолокации для этого сайта. Вот как снова его включить:", + "locationPlatformAndroid": "Android Chrome", + "locationPlatformIos": "iOS Safari", + "locationPlatformDesktop": "Chrome на компьютере", + "locationPlatformFirefox": "Firefox", + "locationStepsAndroid": "Нажмите значок замка в адресной строке → Настройки сайта → Геолокация → Разрешить", + "locationStepsIos": "Приложение Настройки → Safari → Геолокация → Разрешить (или нажмите кнопку «AA» в адресной строке Safari)", + "locationStepsDesktop": "Нажмите значок замка → Настройки сайта → Геолокация → Разрешить", + "locationStepsFirefox": "Нажмите значок замка → Соединение защищено → Подробнее → Разрешения → Доступ к вашему местоположению → Разрешить", + "gotIt": "Понятно", + "addSpot": "Добавить спот", + "addShop": "Добавить магазин", + "addEvent": "Добавить событие", + "addSpotHereTitle": "Добавить спот здесь?", + "addSpotHereDesc": "Поставьте метку там, где вы нажали", + "sellGear": "Продать снаряжение", + "offerTour": "Предложить тур", + "closeAddMenu": "Закрыть меню добавления", + "addMenuAria": "Добавить спот, магазин, событие, снаряжение или тур", + "localChat": "Местный чат", + "localChatDesc": "Живой чат для того места, где сейчас центр карты. Выберите, насколько широко охватывает канал.", + "btcMapShowing": "Показано мест: {{count}} — где можно потратить ваши sats рядом", + "btcMapShow": "Показать места, где можно потратить ваши sats (через BTC Map)", + "yourPrivateStash": "Ваш приватный Stash", + "stashIntro": "Отслеживайте снаряжение, ставьте цены и находите обмены с другими скейтерами.", + "encryptionRequired": "Требуется шифрование", + "encryptionRequiredDesc": "Используйте подписант с поддержкой NIP-44 (Alby, nos2x, Amber).", + "myStash": "Мой Stash", + "encrypted": "Зашифровано", + "itemsCount": "{{count}} предметов", + "items": "Предметы", + "wishlist": "Список желаний", + "types": "Типы", + "stashEmpty": "Ваш Stash пуст", + "addFirstItem": "Добавить первый предмет", + "wishlistCount": "Список желаний ({{count}})", + "myGearCount": "Моё снаряжение ({{count}})", + "openFullStash": "Открыть весь Stash", + "addItem": "Добавить предмет", + "searchSpotsPlaceholder": "Поиск спотов...", + "selected": "Выбрано", + "noSpotsFound": "Спотов не найдено. Попробуйте другой запрос.", + "addingSpotsHint": "Добавление спотов помогает людям находить вас при просмотре конкретных мест", + "report": "Пожаловаться", + "spotSingular": "1 спот", + "spotPlural": "{{count}} спотов", + "view": "Смотреть", + "myCollections": "Мои коллекции", + "collectionsSubtitle": "Организуйте любимые споты в персональные списки", + "newCollection": "Новая коллекция", + "loginToCreate": "Войдите, чтобы создавать коллекции", + "loginToCreateDesc": "Сохраняйте любимые споты в персональные списки, например «Поездка в Барселону 2024» или «Лучшие Rail в LA»", + "noCollections": "Коллекций пока нет", + "noCollectionsDesc": "Создайте первую коллекцию, чтобы начать организовывать споты", + "createFirstCollection": "Создать первую коллекцию", + "createNewCollection": "Создать новую коллекцию", + "createCollectionDesc": "Дайте коллекции название и, при желании, описание", + "collectionName": "Название коллекции", + "collectionNamePlaceholder": "Поездка в Барселону 2024", + "descriptionOptional": "Описание (необязательно)", + "descriptionPlaceholder": "Мои любимые споты из поездки в Барселону...", + "creating": "Создание...", + "createCollection": "Создать коллекцию", + "editCollection": "Изменить коллекцию", + "saving": "Сохранение...", + "saveChanges": "Сохранить изменения", + "deleteCollectionTitle": "Удалить коллекцию?", + "deleteCollectionDesc": "«{{title}}» будет удалена навсегда. Сами споты не пострадают.", + "deleting": "Удаление...", + "collectionCreated": "Коллекция создана!", + "collectionCreatedDesc": "«{{title}}» готова к добавлению спотов", + "collectionCreateFailed": "Не удалось создать коллекцию", + "collectionUpdated": "Коллекция обновлена!", + "changesSaved": "Ваши изменения сохранены", + "collectionUpdateFailed": "Не удалось обновить коллекцию", + "collectionDeleted": "Коллекция удалена", + "collectionDeletedDesc": "«{{title}}» удалена", + "collectionDeleteFailed": "Не удалось удалить коллекцию", + "somethingWentWrong": "Что-то пошло не так" + }, + "mapPage": { + "title": "Магазины и споты", + "spots": "Споты", + "shops": "Магазины", + "filters": "Фильтры", + "listView": "Список", + "mapView": "Карта", + "nearMe": "Рядом", + "searchPlaceholder": "Поиск спотов...", + "noSpotsInArea": "В этой области нет спотов", + "zoomIn": "Приблизить", + "zoomOut": "Отдалить", + "myLocation": "Моё местоположение", + "locationsFound": "Найдено мест: {{count}}", + "spotsOnly": "Только споты", + "shopsOnly": "Только магазины", + "spotsAndShops": "Споты и магазины", + "noSpotsMatch": "Ни один спот не подходит под фильтры.", + "noSpotsYet": "Споты ещё не добавлены.", + "addFirstSpot": "Добавить первый спот" + }, + "spotUi": { + "claim": { + "areYouOwner": "Это ваш спот?", + "privateDesc": "Этот спот отмечен как приватный. Если он принадлежит вам или вы им управляете, заявите права — модератор SkateSpots подтвердит владение, и вы возьмёте объявление под контроль.", + "claimSpot": "Заявить права на этот спот", + "nip05Required": "Чтобы заявить права на приватный спот, нужен подтверждённый NIP-05 (доказательство, что вы контролируете идентичность в Nostr). Добавьте его в профиле и возвращайтесь.", + "addNip05": "Добавить NIP-05 в настройках", + "pendingTitle": "Заявка на рассмотрении", + "pendingDesc": "Ваша заявка отправлена. Модератор SkateSpots её рассмотрит — завершить заявление прав можно после одобрения.", + "approvedTitle": "Заявка одобрена", + "approvedDesc": "Модератор одобрил вашу заявку. Завершите, чтобы стать владельцем этого спота.", + "complete": "Завершить заявление прав", + "submitted": "Заявка отправлена", + "submittedDesc": "Модератор рассмотрит вашу заявку. Вы возьмёте спот под контроль после одобрения.", + "submitFailed": "Не удалось отправить заявку", + "submit": "Отправить заявку", + "submitting": "Отправка…", + "confirmTitle": "Заявить права на «{{title}}»?", + "confirmIntro": "Вы просите сделать вас владельцем этого приватного спота.", + "confirmBullet1": "Модератор SkateSpots рассматривает запрос (мы не можем проверить собственность, только ключи Nostr)", + "confirmBullet2": "При одобрении вы завершаете заявление и становитесь владельцем с правом редактировать спот", + "confirmBullet3": "Исходный спот остаётся в Nostr — сеть децентрализована", + "adminTitle": "Ожидающие заявки на владение", + "adminApprove": "Одобрить", + "adminApproved": "Одобрено", + "adminApprovedDesc": "Теперь они могут завершить заявление прав на спот.", + "adminApproveFailed": "Не удалось одобрить заявку", + "loginRequired": "Войдите, чтобы заявить права на этот приватный спот или запросить владение." + }, + "abandonedDesc": "Последнее обновление {{time}}. Если исходный владелец неактивен, вы можете заявить права на этот спот, чтобы поддерживать и улучшать его.", + "claimedNotice": "Заявленное объявление", + "claimedNoticeDesc": "Этот спот был опубликован заново новым владельцем после заявки. Исходное объявление может по-прежнему существовать отдельно.", + "abandonedLoginDesc": "Последнее обновление {{time}}. Войдите, чтобы заявить права и поддерживать этот спот.", + "accessDeniedDesc": "Вы можете редактировать только созданные вами споты.", + "accessDeniedTitle": "Доступ запрещён", + "addAtLeastOneTag": "Добавьте хотя бы один тег.", + "additionalDetails": "Дополнительные детали (необязательно)", + "additionalDetailsPlaceholder": "Добавьте любой дополнительный контекст, который может помочь...", + "addNewTags": "Добавить новые теги:", + "addNip05InSettings": "Добавить NIP-05 в настройках", + "addPhoto": "Добавить фото", + "addPhotoDesc": "Добавьте фото, чтобы помочь другим найти этот спот.", + "addPhotoOrDescription": "Добавьте фото или описание", + "addPhotoOrDescriptionDesc": "Дайте скейтерам за что зацепиться — фото или пару слов о месте.", + "addPhotos": "Добавить фото", + "addPhotoToSpot": "Добавить фото к споту", + "adminDeleteDialogDesc": "Как администратор SkateSpots вы удаляете «{{title}}». Он будет скрыт во всём приложении для всех, а на Relay отправится запрос на удаление.", + "adminDeleteReason": "Администратор SkateSpots удалил спот «{{title}}»", + "airQuality": "Качество воздуха", + "altSkateSpot": "Скейт-спот: {{title}}", + "areYouShopOwner": "Вы владелец магазина?", + "askBeforeSkating": "Спросите перед катанием", + "backToSpot": "Назад к споту", + "beFirstToListGear": "Станьте первым, кто выставит снаряжение в этом споте!", + "beFirstToSay": "Будьте первым, кто что-то скажет.", + "byAuthor": "от {{name}}", + "captionPlaceholder": "Добавьте подпись (необязательно) — опишите, что на фото, когда оно сделано и т. д.", + "chatPublicNote": "Это может прочитать любой — сообщения публичны и эфемерны. Для приватных чатов используйте личные сообщения.", + "checkPinBelow": "Проверьте метку ниже, прежде чем добавлять дубликат.", + "claimBullet1": "Вы становитесь владельцем и можете редактировать спот", + "claimBullet2": "Исходный спот остаётся (Nostr децентрализован)", + "claimBullet3": "Ваша версия может отображаться рядом с исходной", + "claimFailed": "Не удалось заявить права", + "claiming": "Заявляем права...", + "claimIntro": "Вы собираетесь заявить права на этот спот. Будет создана ваша собственная версия спота, которую вы сможете редактировать и поддерживать.", + "claimSpot": "Заявить права на спот", + "claimThisSpot": "Заявить права на этот спот", + "claimTitle": "Заявить права на «{{title}}»?", + "claimWhatHappens": "Что происходит при заявке прав:", + "coachesAndFilmersAvailable": "В этом споте доступны тренеры и Filmer'ы", + "coachesCount": "Тренеры ({{count}})", + "coachHere": "Тренер здесь", + "community": "Сообщество", + "communityVerified": "Подтверждено сообществом", + "communityVerifiedTitle": "Другой скейтер уже внёс вклад здесь (фото или отчёт о состоянии).", + "conditions": "Условия", + "contactForPermission": "Связаться для разрешения", + "contactInfo": "Контактная информация", + "contributePhoto": "Добавить фото", + "contributing": "Добавляем...", + "couldNotSendMessage": "Не удалось отправить сообщение.", + "couldNotSubmit": "Не удалось отправить", + "couldNotUploadPhoto": "Не удалось загрузить фото. Вы можете добавить его ниже.", + "crewsThatSkateHere": "Crew, которые катаются здесь", + "current": "Текущее:", + "currentTags": "Текущие теги этого спота:", + "daysAgo": "{{count}} день назад", + "daysAgoPlural": "{{count}} дней назад", + "deleteDialogDesc": "«{{title}}» будет навсегда удалён со всех Relay. Это действие нельзя отменить.", + "deletedSpotReason": "Удалённый спот", + "deleteFailed": "Не удалось удалить", + "deleteSpot": "Удалить спот", + "deleteSpotTitle": "Удалить спот?", + "differentSpotPublishAnyway": "Это другой спот — всё равно опубликовать", + "dragDropOrClick": "Перетащите или нажмите", + "dropPhotos": "Перетащите фото", + "duplicateOne": "В пределах 60 м от вашей метки есть спот. Если это то же место, добавьте туда фото или отчёт о состоянии вместо создания дубликата.", + "duplicateOther": "В пределах 60 м от вашей метки есть споты. Если это то же место, добавьте туда фото или отчёт о состоянии вместо создания дубликата.", + "editSpotSeoDesc": "Отредактируйте свой скейт-спот.", + "failedToContribute": "Не удалось добавить", + "failedToPublish": "Не удалось опубликовать", + "failedToPublishDesc": "Что-то пошло не так. Подробности в консоли.", + "failedToSubmitReport": "Не удалось отправить жалобу", + "failedToSuggestTags": "Не удалось предложить теги", + "failedToUpdate": "Не удалось обновить", + "failedToUploadImage": "Не удалось загрузить изображение", + "failedToUploadPhoto": "Не удалось загрузить фото", + "feelsLikeTemp": "Ощущается как {{temp}}°C", + "filmersCount": "Filmer'ы ({{count}})", + "filmHere": "Снимать здесь", + "gearSwap": "Обмен снаряжением", + "geolocationNotSupported": "Геолокация не поддерживается", + "geolocationNotSupportedDesc": "Ваш браузер не поддерживает геолокацию.", + "getDirections": "Проложить маршрут", + "hangTight": "Подождите немного", + "hangTightDesc": "Ваше фото всё ещё загружается. Оно прикрепится через секунду.", + "helpImproveSpot": "Помогите улучшить этот спот — добавьте фото или предложите теги", + "hiddenByModerator": "Скрыто модератором", + "hiddenByModeratorDesc": "Этот спот не показывается на карте и в поиске. Вы всё ещё видите его, потому что он ваш. Редактирование не снимет скрытие — он останется скрытым, пока модератор не отменит решение.", + "humidity": "Влажность", + "imageUploaded": "Изображение загружено", + "imageUploadedDesc": "Ваше изображение успешно загружено.", + "imHere": "Я здесь", + "invalidCoordinates": "Неверные координаты", + "invalidCoordinatesDesc": "Введите корректную широту (−90…90) и долготу (−180…180).", + "invalidNpub": "Неверный npub", + "invalidNpubDesc": "Введите корректный адрес npub.", + "lastReported": "последний раз {{time}}", + "listGear": "Выставить снаряжение", + "listYourGearHere": "Выставьте снаряжение здесь", + "loadingChat": "Загружаем чат…", + "locationError": "Ошибка геолокации", + "locationFound": "Местоположение найдено", + "locationFoundDesc": "Ваше текущее местоположение установлено.", + "locationRequired": "Требуется местоположение", + "locationRequiredDesc": "Введите координаты или используйте текущее местоположение.", + "loginRequiredTitle": "Требуется вход", + "logInToChat": "Войдите, чтобы присоединиться к местному чату.", + "logInToContributePhotos": "Войдите, чтобы добавлять фото", + "loginToEditSpot": "Чтобы отредактировать этот спот, нужно войти.", + "logInToReport": "Чтобы пожаловаться на контент, нужно войти.", + "logInToReportStatus": "Войдите, чтобы сообщить о состоянии этого спота.", + "logInToSuggestTags": "Войдите, чтобы предлагать теги", + "manageNip05ToClaim": "Управляйте NIP-05 для заявки прав", + "meetAtSpotForPickup": "💡 Встречайтесь в этом споте для безопасной передачи", + "memberOne": "{{count}} участник", + "memberOther": "{{count}} участников", + "messageFailed": "Сообщение не отправлено", + "messageMapper": "Картограф сообщений", + "messagePlaceholder": "Написать в этот спот… (попробуйте /me или /who)", + "messagesHiddenOne": "{{count}} сообщение скрыто вашим фильтром доверия. Ослабьте фильтр, чтобы увидеть больше.", + "messagesHiddenOther": "{{count}} сообщений скрыто вашим фильтром доверия. Ослабьте фильтр, чтобы увидеть больше.", + "messagesHiddenShortOne": "{{count}} сообщение скрыто вашим фильтром доверия", + "messagesHiddenShortOther": "{{count}} сообщений скрыто вашим фильтром доверия", + "metresAway": "{{distance}} м отсюда", + "moderatorVouchedDesc": "Модератор проверил этот спот и поручился за него. Отлично.", + "monthsAgo": "{{count}} месяц назад", + "monthsAgoPlural": "{{count}} месяцев назад", + "newOwnerNpub": "npub нового владельца", + "newOwnerNpubHint": "Введите npub пользователя, которому хотите передать этот спот.", + "nip05RequiredToClaim": "⚠️ Для заявки прав на магазины требуется верификация NIP-05", + "noCommunitySignalTitle": "Пока нет ни фото от сообщества, ни отчёта о состоянии — никто не подтвердил это место.", + "breakdownPhotos": "{{count}} фото", + "breakdownStatus": "{{count}} отчёт(ов) о состоянии", + "breakdownComments": "{{count}} комментариев", + "breakdownReactions": "{{count}} реакций", + "breakdownCollections": "{{count}} сохранений", + "breakdownZaps": "{{count}} Zap", + "breakdownTags": "{{count}} предложенных тегов", + "breakdownCrews": "{{count}} Crew", + "breakdownLab": "{{count}} проф. ссылок", + "verifyNudgeTitle": "Будьте первым, кто подтвердит этот спот", + "verifyNudgeBody": "Фото или отметка «Я здесь катался» — так спот получает подтверждение. Помогите следующему скейтеру.", + "verifyNudgeStatus": "Я здесь катался", + "communityChip": "Сообщество", + "seenChip": "Видели", + "noGearListedYet": "Снаряжение пока не выставлено", + "noMessagesYet": "В этом местном канале пока нет сообщений. Поздоровайтесь — «кто-нибудь катает сегодня вечером?»", + "noPhoto": "Нет фото", + "noReportsYet": "Отчётов пока нет", + "noTags": "Нет тегов", + "notASkateSpot": "Не скейт-спот", + "offerServicesHere": "💡 Предложите свои услуги в этом споте", + "photoCaptured": "Фото сделано!", + "photoCapturedDesc": "Ваше фото успешно загружено.", + "photoContributed": "Фото добавлено!", + "photoContributedDesc": "Ваше фото добавлено к этому споту.", + "photosAdded": "Ваши фото добавлены.", + "photosRecommended": "настоятельно рекомендуется — споты без фото остаются помеченными как Непроверенные", + "photosUploaded": "Загружено фото: {{count}}", + "photoUploaded": "Фото загружено", + "photoUploadedDesc": "Добавьте подпись и отправьте, чтобы добавить фото!", + "photoUploadFailed": "Не удалось загрузить фото", + "pleaseTryAgain": "Попробуйте ещё раз", + "public": "Публичный", + "publicChatTitle": "Любой может читать сообщения в этом канале — он публичный и незашифрованный.", + "recentReports": "Недавние жалобы", + "recipientRequired": "Требуется получатель", + "recipientRequiredDesc": "Введите npub нового владельца.", + "removeAdmin": "Удалить (админ)", + "removeSpot": "Удалить спот", + "removeSpotAdminTitle": "Удалить этот спот? (админ)", + "reportOne": "жалоба", + "reportContent": "Пожаловаться на контент", + "reportContentDesc": "Помогите сохранить сообщество в безопасности, сообщая о неподобающем контенте.", + "reportedBySkaters": " от {{count}} скейтеров — на рассмотрении. Если это реальный спот, добавьте фото или отчёт о состоянии, чтобы подтвердить его.", + "reportedNotASpot": "Отмечено как не скейт-спот", + "reportingType": "Жалоба на {{type}}", + "reports": "жалоб", + "reportShop": "Пожаловаться на магазин", + "reportSpot": "Пожаловаться на спот", + "reportStatus": "Сообщить о состоянии", + "reportSubmitted": "Жалоба отправлена", + "reportSubmittedDesc": "Спасибо, что помогаете сохранять SkateSpots в безопасности.", + "reportSubmittedLong": "Спасибо, что помогаете сохранять SkateSpots в безопасности и точности. Вашу жалобу рассмотрят доверенные участники сообщества.", + "reportSubmittedTitle": "Жалоба отправлена", + "report": { + "notASkateSpot": { + "label": "Не скейт-спот", + "description": "Тестовая запись или место, вовсе не предназначенное для катания" + }, + "fakeSpot": { + "label": "Фальшивый/несуществующий спот", + "description": "Этот спот не существует или местоположение неверно" + }, + "stolenPhotos": { + "label": "Украденные/фальшивые фото", + "description": "Фото — стоковые изображения или украдены откуда-то" + }, + "spamAd": { + "label": "Спам или реклама", + "description": "Промо-контент или дублирующиеся объявления" + }, + "dangerousLocation": { + "label": "Опасное место", + "description": "Частная территория, небезопасный или незаконный доступ" + }, + "inappropriateContent": { + "label": "Неподобающий контент", + "description": "Содержит оскорбительный контент или контент для взрослых" + }, + "impersonation": { + "label": "Выдача себя за другого", + "description": "Кто-то выдаёт себя за другого человека" + }, + "other": { + "label": "Другое", + "description": "Что-то ещё, не указанное выше" + } + }, + "targetType": { + "spot": "Спот", + "event": "Событие", + "tour": "Тур", + "shop": "Магазин", + "user": "Пользователь", + "listing": "Объявление", + "coach": "Тренер", + "filmer": "Filmer" + }, + "sameOwner": "Тот же владелец", + "sameOwnerDesc": "Нельзя передать текущему владельцу.", + "saveChanges": "Сохранить изменения", + "saving": "Сохранение...", + "services": "Услуги", + "shareSpotText": "Зацените этот скейт-спот: {{title}}", + "shelter": "Укрытие", + "shelterHint": "Этот спот открыт погоде? Помогает скейтерам находить сухие места в дождь.", + "shopClaimDesc": "Если магазин принадлежит вам или вы им управляете, вы можете заявить права, чтобы подтвердить владение и управлять объявлением.", + "shopClaimNip05Hint": "Чтобы заявить права на магазин, добавьте NIP-05, совпадающий с доменом сайта магазина.", + "skatersActiveDesc": "Люди, писавшие в этот канал за последние 24 ч.", + "skatersActiveOne": "{{count}} скейтер активен здесь", + "skatersActiveOther": "{{count}} скейтеров активны здесь", + "skatersSellingGear": "Скейтеры в этом споте продают снаряжение", + "skateSpot": "Скейт-спот", + "somethingWentWrong": "Что-то пошло не так", + "spot": "Спот", + "spotAdded": "Спот добавлен!", + "spotAddedDesc": "Ваш скейт-спот опубликован в сети.", + "spotAddedNoPhoto": "Опубликовано — и помечено как Непроверенное, пока кто-нибудь не добавит фото. Фото спота очень помогает.", + "spotChat": "Чат спота", + "spotClaimed": "Права на спот заявлены!", + "spotClaimedDesc": "Теперь вы владелец этого спота. Редактировать его можно из профиля.", + "spotDeleted": "Спот удалён", + "spotDeletedDesc": "Запрос на удаление отправлен на Relay. Большинство Relay удалят этот контент.", + "spotMayAlreadyBeOnMap": "Этот спот, возможно, уже есть на карте", + "spotMayAlreadyExist": "Этот спот, возможно, уже существует", + "spotMayBeAbandoned": "Спот, возможно, заброшен", + "spotPhotoAlt": "Спот", + "spotRemoved": "Спот удалён", + "spotRemovedDesc": "Этот спот убран и будет скрыт во всём SkateSpots.", + "spotSeoDesc": "Посмотрите этот скейт-спот в SkateSpots.", + "spotStatus": "Состояние спота", + "spotStatusDesc": "«{{title}}» всё ещё пригоден для катания? Сообщите сообществу о его текущем состоянии.", + "spotTypeRequired": "Требуется тип спота", + "spotTypeRequiredDesc": "Выберите тип спота, чтобы скейтеры знали, что их ждёт.", + "spotUpdated": "Спот обновлён!", + "spotUpdatedDesc": "Ваши изменения опубликованы в сети.", + "staffVerifiedTitle": "Администратор SkateSpots проверил этот спот и поручился за него.", + "statusNotePlaceholder": "Необязательно: добавьте детали (например, «на Ledge новые болты», «охрана выгоняет после 18:00»)", + "statusReported": "Состояние сообщено", + "statusReportedDesc": "Спасибо, что поддерживаете карту актуальной. Ваш отчёт опубликован.", + "submitReport": "Отправить жалобу", + "submitting": "Отправка...", + "suggestedByUser": "Предложено {{count}} пользователем", + "suggestedByUsers": "Предложено {{count}} пользователями", + "suggestedTagsContent": "Предложенные теги для {{title}}: {{tags}}", + "suggestNTags": "Предложить теги ({{count}})", + "suggestOneTag": "Предложить 1 тег", + "suggestTags": "Предложить теги", + "suggestTagsDesc": "Помогите классифицировать этот спот, предложив подходящие теги.", + "tags": "Теги", + "tagsHint": "Добавляйте теги для особенностей, покрытий, атмосферы (макс. {{max}})", + "tagsSuggested": "Теги предложены!", + "tagsSuggestedDesc": "Ваши предложенные теги отправлены.", + "takePhoto": "Сделать фото", + "threeDayForecast": "Прогноз на 3 дня", + "tipTheMapper": "Отблагодарить автора", + "tipTheMapperDesc": "Спот оказался полезным? Отправьте Zap в благодарность автору!", + "titleRequired": "Требуется название", + "titleRequiredDesc": "Введите название этого спота.", + "today": "Сегодня", + "tomorrow": "Завтра", + "transferDesc": "Передать «{{title}}» другому пользователю. Это действие нельзя отменить.", + "transferFailed": "Не удалось передать", + "transferOwnership": "Передать владение", + "transferRequestContent": "Запрос на передачу владения спотом «{{title}}»", + "transferRequested": "Передача запрошена", + "transferRequestedDesc": "Новому владельцу нужно заявить права на спот, чтобы завершить передачу.", + "transferring": "Передача...", + "transferSpotOwnership": "Передать владение спотом", + "transferWarningDesc": "После передачи вы больше не сможете редактировать или удалять этот спот.", + "typeToSearchTags": "Введите для поиска или добавления тегов...", + "underReview": " — на рассмотрении. Если это реальный спот, добавьте фото или отчёт о состоянии, чтобы подтвердить его.", + "untitledSpot": "Спот без названия", + "unverified": "Непроверено", + "updateDetailsFor": "Обновите детали для {{title}}", + "updateSpotDesc": "Обновите информацию об этом споте. Все поля со звёздочкой * обязательны.", + "uploadAPhoto": "Загрузить фото", + "uploadAPhotoHint": "Перетащите или нажмите · JPG, PNG, WebP", + "uploadedAlt": "Загружено", + "uploadFailed": "Не удалось загрузить", + "uploadingPhoto": "Загружаем фото…", + "uploadPhotoFirst": "Сначала загрузите фото.", + "uvIndex": "УФ-индекс", + "verifiedBySkateSpots": "Подтверждено SkateSpots", + "viewPhotoFullScreen": "Смотреть фото на весь экран", + "viewPhotoOf": "Фото {{n}} из {{total}}", + "warning": "Внимание", + "weatherConditions": "Погодные условия", + "weatherOnly": "только погода", + "weatherOnlyUnconfirmed": "Только погода. Никто пока не подтвердил, что это скейт-спот, поэтому оценки условий нет — добавьте фото или отчёт о состоянии, чтобы подтвердить его.", + "whyReporting": "Почему вы жалуетесь на это?", + "wind": "Ветер", + "yearsAgo": "{{count}} год назад", + "yearsAgoPlural": "{{count}} лет назад" + }, + "diyUi": { + "title": "DIY — сделай сам", + "tagline": "Руководства, открытые инструменты и чертежи, чтобы сделать свои Deck, рампы и бетонные споты — а затем найти людей, места и рынок для этого.", + "doItWithPeople": "Делайте это вместе с людьми", + "backToDiy": "Назад в DIY", + "calc": { + "title": "Калькулятор стоимости Deck", + "intro": "Сколько стоит сделать Deck — труд, оборудование, материалы, время обработки, упаковка и маржа — и справедливая цена продажи. Сохраняется на этом устройстве." + }, + "designer": { + "title": "Дизайнер Deck", + "intro": "Задайте контур скейтборда или лонгборда, затем экспортируйте шаблон 1:1 для печати, SVG или DXF для ЧПУ. Сохраняется на этом устройстве.", + "presets": "Пресеты", + "dimensions": "Размеры", + "shape": "Форма", + "kicks": "Загибы", + "hardware": "Отверстия для Trucks", + "width": "Макс. ширина", + "wheelbase": "База (wheelbase)", + "nose": "Длина носа", + "tail": "Длина тэйла", + "length": "Общая длина", + "waist": "Талия", + "endRound": "Скругление концов", + "concave": "Конкейв", + "thickness": "Толщина", + "tailKick": "Загиб тэйла", + "noseKick": "Загиб носа", + "holeNew": "New school (2.125″)", + "holeOld": "Old school (2.5″)", + "holeSpacing": "New school — 2.125″ × 1.625″ (54 × 41 мм); old school — 2.5″ × 1.625″. Монтажные отверстия 3/16″.", + "topView": "Вид сверху", + "sideView": "Вид сбоку", + "concaveSection": "Сечение конкейва", + "export": "Экспорт", + "pdfA4": "1:1 PDF · A4", + "pdfLetter": "1:1 PDF · Letter", + "printNote": "Печатайте PDF при 100% (без «по размеру страницы»), затем склейте листы по угловым крестикам. SVG тоже в натуральную величину.", + "note": "Это 2D-контур, который вы обводите и вырезаете. Для полноценных 3D-форм и проектирования пресс-форм всё же нужен настоящий CAD-инструмент." + }, + "source": "Источник", + "comingSoon": "Скоро", + "footer": "Пошаговые руководства уже в пути. Пока: найдите тех, кто строит, в The Lab, нанесите свой спот на карту и покупайте или продавайте в Marketplace. Работайте безопасно — защита, перчатки и очки.", + "categories": { + "boards": "Доски", + "ramps": "Рампы и деревянные препятствия", + "concrete": "Бетон и DIY-споты", + "repairs": "Ремонт и настройка", + "tools": "Инструменты и чертежи" + }, + "cards": { + "ossBuild": { + "title": "Собрать скейтборд", + "blurb": "Пошаговое изготовление Deck — шпон, пресс-формы, прессы и отделка." + }, + "sk8cad": { + "title": "SK8CAD", + "blurb": "Открытый CAD для форм Deck, конкейва и проектирования пресс-форм." + }, + "deckCost": { + "title": "Стоимость Deck и цена", + "blurb": "Рассчитайте материалы, труд и справедливую цену продажи перед изготовлением." + }, + "deckDesigner": { + "title": "Дизайнер Deck", + "blurb": "Задайте контур и распечатайте шаблон 1:1 — или экспортируйте SVG/DXF для ЧПУ." + }, + "ledgeBox": { + "title": "Собрать Ledge или бокс", + "blurb": "Деревянное препятствие для новичков, которое можно собрать за выходные." + }, + "quarterpipe": { + "title": "Собрать квотерпайп", + "blurb": "Чертежи рампы, transition и копинг для мини во дворе." + }, + "flatbar": { + "title": "Собрать flatbar", + "blurb": "Дешёвый, портативный и лучший способ учиться катать Rail." + }, + "concreteBasics": { + "title": "Основы бетона", + "blurb": "Замес, опалубка и отделка прочного Ledge или банки." + }, + "coping": { + "title": "Копинг и края", + "blurb": "Как установить копинг и отделать transition для гладкого грайнда." + }, + "buyParts": { + "title": "Купить детали и снаряжение", + "blurb": "Купите Deck, комплектующие и инструменты у продавцов в Marketplace." + }, + "mapSpot": { + "title": "Нанесите свой DIY-спот на карту", + "blurb": "Что-то построили? Добавьте его на карту, чтобы другие нашли и покатали." + }, + "regrip": { + "title": "Переклеить Griptape", + "blurb": "Снимите старый Griptape и аккуратно наклейте новый." + }, + "tune": { + "title": "Обслужить Bearings и Trucks", + "blurb": "Почистите Bearings, поменяйте бушинги и настройте геометрию Trucks." + }, + "printMolds": { + "title": "3D-печатные пресс-формы", + "blurb": "Файлы пресс-форм и выравнивающих оснований для печати от сообщества." + }, + "sk8cadTools": { + "title": "Инструменты для форм и выравнивания", + "blurb": "Проектируйте пресс-формы со встроенными выравнивающими основаниями." + } + }, + "actions": { + "findBuilder": { + "title": "Найти Builder'а", + "blurb": "Строители рамп и DIY в The Lab, которые спроектируют или зальют всё для вас." + }, + "findCrew": { + "title": "Найти DIY Crew", + "blurb": "Crew, сосредоточенные на стройке — присоединяйтесь к тем, кто воплощает споты в реальность." + }, + "mapSpot": { + "title": "Нанести DIY-спот на карту", + "blurb": "Добавьте построенный вами спот, чтобы он жил на карте." + }, + "sellBuilds": { + "title": "Продавайте свои работы", + "blurb": "Выставляйте свои Deck, рампы или детали в Marketplace." + }, + "findCoach": { + "title": "Найти тренера", + "blurb": "Тренеры, обучающие DIY-модулям скейтбординга и строительству спотов." + } + } + }, + "labelsUi": { + "spotCategory": { + "street": { + "label": "Street", + "description": "Случайно найденные споты, городской рельеф" + }, + "transition": { + "label": "Transition", + "description": "Изогнутые/рамповые поверхности" + }, + "park": { + "label": "Park", + "description": "Построенные скейтпарки" + }, + "plaza": { + "label": "Plaza", + "description": "Городские площади (как MACBA, Love Park)" + } + }, + "spotFeature": { + "wallrides": "Wallrides", + "stairs": "Лестницы и перила", + "rails": "Rail", + "ledges": "Ledge и бордюры", + "gaps": "Gaps", + "flatground": "Ровная земля", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + "bowls": "Bowl", + "vert": "Vert Ramps", + "mega-ramps": "Mega Ramps", + "hubbas": "Hubbas", + "euro-gaps": "Euro Gaps", + "banks": "Банки", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + "hips": "Hips", + "volcano": "Volcano", + "pyramids": "Pyramids / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars" + }, + "spotType": { + "street": "Street", + "transition": "Transition", + "park": "Park", + "plaza": "Plaza", + "wallrides": "Wallrides", + "stairs": "Лестницы и перила", + "rails": "Rail", + "ledges": "Ledge и бордюры", + "gaps": "Gaps", + "flatground": "Ровная земля", + "manual-pads": "Manual Pads", + "half-pipes": "Half Pipes", + "quarter-pipes": "Quarter Pipes", + "mini-ramps": "Mini Ramps", + "bowls": "Bowl", + "vert": "Vert Ramps", + "mega-ramps": "Mega Ramps", + "hubbas": "Hubbas", + "euro-gaps": "Euro Gaps", + "banks": "Банки", + "spine-ramps": "Spine Ramps", + "roll-ins": "Roll-ins", + "hips": "Hips", + "volcano": "Volcano", + "pyramids": "Pyramids / Funboxes", + "snake-runs": "Snake Runs", + "pump-track": "Pump Track Rollers", + "flat-bars": "Flat Bars", + "diy": "DIY", + "rail": "Rail", + "ledge": "Ledge", + "gap": "Gap", + "bowl": "Bowl", + "stall": "Stall", + "slappy": "Slappy" + }, + "access": { + "public": { + "label": "Публичный — открыт для всех" + }, + "private": { + "label": "Частная территория — нужно разрешение" + }, + "locals": { + "label": "Сначала спросите местных" + } + }, + "shelter": { + "outdoor": { + "label": "На улице", + "short": "На улице", + "description": "Полностью открыто — дождь останавливает катание" + }, + "partial": { + "label": "Частично укрыто", + "short": "Частично укрыто", + "description": "Часть препятствий остаётся сухой" + }, + "covered": { + "label": "Под крышей", + "short": "Под крышей", + "description": "На улице, но под крышей" + }, + "indoor": { + "label": "В помещении", + "short": "В помещении", + "description": "Полностью закрыто — катайте в дождь и в ясную погоду" + } + }, + "eventType": { + "contest": "Контест", + "demo": "Демо", + "session": "Сессия", + "workshop": "Мастерская", + "premiere": "Премьера", + "tradeshow": "Выставка", + "gameskate": "Game of Skate", + "concert": "🎸 Концерт", + "jam": "🎵 Джем", + "festival": "🎪 Фестиваль", + "popup": "🎯 Pop-Up" + }, + "gearCategory": { + "deck": "Deck", + "trucks": "Trucks", + "wheels": "Wheels", + "bearings": "Bearings", + "shoes": "Скейт-обувь", + "clothing": "Одежда", + "protective": "Защита", + "stickers": "Стикеры", + "wax": "Воск", + "tools": "Инструменты", + "griptape": "Griptape", + "rubbrick": "Rub Brick" + }, + "gearCondition": { + "new": { + "label": "Новое", + "description": "Ни разу не использовалось, в упаковке" + }, + "like_new": { + "label": "Как новое", + "description": "Почти не использовалось, отличное состояние" + }, + "good": { + "label": "Хорошее", + "description": "Обычный износ, работает идеально" + }, + "well_used": { + "label": "Сильно б/у", + "description": "Есть износ, но всё ещё работает" + } + }, + "priceType": { + "fixed": { + "label": "Фиксированная цена", + "description": "Цена в USD или sats" + }, + "free": { + "label": "Бесплатно", + "description": "Отдаю даром" + }, + "trade": { + "label": "Обмен", + "description": "Хочу поменяться" + }, + "offer": { + "label": "Предложить цену", + "description": "Цена договорная" + } + }, + "listingType": { + "selling": { + "label": "Продаю", + "description": "Выставляю снаряжение на продажу" + }, + "wtb": { + "label": "Куплю", + "description": "Ищу конкретное снаряжение" + } + }, + "tour": { + "spotType": { + "street": "Street", + "park": "Park", + "diy": "DIY", + "transition": "Transition", + "hidden": "Скрытые жемчужины" + }, + "category": { + "local": { + "label": "Местный тур", + "description": "Показать скрытые споты в вашем городе" + }, + "national": { + "label": "Тур по стране", + "description": "Многогородные роад-трипы по стране" + }, + "international": { + "label": "Международный тур", + "description": "Приключения через границы нескольких стран" + }, + "destruction": { + "label": "World Destruction", + "description": "Глобальное командное соревнование в стиле KOTR" + } + } + }, + "crew": { + "vibe": { + "street": "Street", + "transition": "Transition / Vert", + "park": "Park", + "diy": "DIY", + "cruising": "Круиз / Съёмка", + "oldschool": "Old School", + "allterrain": "All Terrain", + "girls": "Девушки / Женщины", + "youth": "Юниоры / Громы", + "adaptive": "Адаптивный", + "punk": "Панк", + "hiphop": "Рэп / Хип-хоп" + }, + "focus": { + "mixed": "Смешанный / Общий", + "builder": "DIY и строители", + "photo": "Фото и видео", + "coaching": "Тренировки", + "art": "Арт и дизайн", + "music": "Группа и музыка", + "wellness": "Тренинг и физио" + }, + "focusDescription": { + "mixed": "Обычный скейт-Crew — показывается только на странице Crew.", + "builder": "Crew по DIY/строительству парков — также показывается в The Lab в разделе «Строители».", + "photo": "Crew по съёмке, фотографии или монтажу — также показывается в The Lab в разделе «Фото и видео».", + "coaching": "Crew по тренировкам/урокам — также показывается в The Lab в разделе «Тренировки».", + "art": "Арт-, дизайн-, граффити- или тату-коллектив — также показывается в The Lab в разделе «Арт и дизайн».", + "music": "Группа или музыкальный коллектив — также показывается в The Lab в разделе «Музыка».", + "wellness": "Crew по тренировкам, фитнесу или физио — также показывается в The Lab в разделе «Тренинги»." + }, + "lookingFor": { + "filmer": "Filmer", + "photographer": "Фотограф", + "editor": "Видеомонтажёр", + "coach": "Тренер", + "builder": "Строитель рамп", + "artist": "Художник / дизайнер", + "musician": "Музыкант / группа", + "members": "Новые участники" + }, + "role": { + "filmer": "Filmer", + "photographer": "Фотограф", + "editor": "Монтажёр", + "coach": "Тренер", + "builder": "Строитель", + "artist": "Художник", + "graffiti": "Граффити", + "tattoo": "Тату", + "trainer": "Тренер по физподготовке", + "musician": "Музыкант", + "judge": "Судья", + "manager": "Тим-менеджер", + "og": "OG" + } + }, + "memberVisibility": { + "public": { + "label": "Публично", + "description": "Любой видит вас в этом Crew — на публичной странице Crew и при поиске товарищей по Crew." + }, + "crew": { + "label": "Только Crew", + "description": "Только подтверждённые товарищи по Crew и основатель видят вас здесь. Для всех остальных вы отображаетесь как анонимный «скрытый участник». Примечание: это приватность на уровне приложения — тег вашего членства всё равно публично существует на Relay, просто никогда не показывается посторонним." + } + }, + "tagCategory": { + "features": { + "name": "Особенности", + "description": "Препятствия и рельеф" + }, + "surfaces": { + "name": "Покрытия", + "description": "Материалы и текстуры" + }, + "sizes": { + "name": "Размеры", + "description": "Габариты и масштаб" + }, + "stairs": { + "name": "Количество ступеней", + "description": "Число ступеней" + }, + "vibes": { + "name": "Атмосфера", + "description": "Обстановка и состояние" + }, + "location": { + "name": "Локация", + "description": "Контекст расположения" + }, + "tricks": { + "name": "Трюки", + "description": "Хорошо для конкретных трюков" + } + }, + "spotTagCategory": { + "street": { + "label": "Street", + "description": "Уличные споты — лестницы, Rail, Ledge" + }, + "park": { + "label": "Park", + "description": "Скейтпарки — публичные или частные" + }, + "diy": { + "label": "DIY", + "description": "DIY/самодельные споты" + }, + "plaza": { + "label": "Plaza", + "description": "Публичные площади со скейт-архитектурой" + } + }, + "status": { + "active": { + "label": "Активен", + "description": "Всё в порядке — катайте." + }, + "bust": { + "label": "Выгоняют", + "description": "Высокий риск разгона — охрана или полиция." + }, + "skate_stopped": { + "label": "Катание остановлено", + "description": "Заварено/заглушено, но частично катается." + }, + "closed": { + "label": "Закрыто", + "description": "Временно закрыто — стройка или событие." + }, + "gone": { + "label": "Исчез", + "description": "Снесено, закатано в асфальт или навсегда огорожено." + } + }, + "price": { + "free": "FREE", + "trade": "Обмен", + "makeOffer": "Предложить цену", + "offer": "Предложить" + } + }, + "feesUi": { + "feeFeaturedEventLabel": "Рекламируемое событие", + "feeFeaturedEventDesc": "Продвигайте своё событие в SkateSpots", + "feeFeaturedEventBenefit": "Ваше событие появляется вверху страницы событий", + "feeLabProfileLabel": "Профиль Lab Pro", + "feeLabProfileDesc": "Продвигайте свои услуги в The Lab", + "feeLabProfileBenefit": "Значок Pro + приоритетное размещение, когда скейтеры просматривают The Lab", + "feeFeaturedShopLabel": "Рекламируемый магазин", + "feeFeaturedShopDesc": "Продвигайте свой скейт-магазин на карте и в каталоге", + "feeFeaturedShopBenefit": "Значок Verified + приоритетная метка на карте", + "feeFeaturedTourLabel": "Рекламируемый тур", + "feeFeaturedTourDesc": "Продвигайте свой тур в SkateSpots", + "feeFeaturedTourBenefit": "Значок Pro + верхнее размещение, когда скейтеры просматривают туры", + "duration7d": "7 дней", + "duration30d": "1 месяц", + "duration90d": "3 месяца", + "duration365d": "12 месяцев", + "metaActive": "{{label}} — активно", + "daysRemainingOne": "остался {{count}} день", + "daysRemainingMany": "осталось {{count}} дней", + "zapRequestContent": "SkateSpots {{label}} ({{tier}})", + "errGenerate": "Не удалось создать счёт", + "paymentReceived": "⚡ Платёж получен!", + "paymentReceivedDesc": "{{amount}} sats — {{label}} теперь активно.", + "autoPayFailed": "Автоплатёж не удался", + "autoPayFailedDesc": "Оплатите вручную через QR или счёт ниже.", + "payStatusUnknown": "Статус платежа неизвестен — возможно, платёж прошёл. Проверьте кошелёк, прежде чем платить снова.", + "invoiceCopied": "Счёт скопирован!", + "activeBang": "{{label}} активно!", + "chooseDuration": "Выберите срок", + "bestValue": "Лучшая цена", + "perDay": "{{price}}/день", + "validFor": "Действует", + "amountLine": "~${{usd}} USD · для {{name}} · {{tier}}", + "payToContinue": "Оплатите {{amount}} sats, чтобы продолжить", + "generating": "Создаём счёт…", + "processing": "Обрабатываем платёж…", + "invoiceQrAlt": "QR-код счёта Lightning", + "copyInvoice": "Скопировать счёт", + "openWallet": "Открыть кошелёк", + "payConnected": "Оплатить подключённым кошельком", + "scanAny": "Отсканируйте любым Lightning-кошельком", + "tryAgain": "Попробовать снова", + "proReceiptTitle": "🦧⚡ Sasquatch Pro — вы в деле!", + "proReceiptPass": "Пропуск: {{pass}} ({{sats}} sats)", + "proReceiptActiveUntil": "Активно до: {{until}}", + "proReceiptUnlocked": "Что вы открыли:", + "proReceiptBullet1": "• Личный ассистент — я читаю ваш Stash, Crew, споты и объявления", + "proReceiptBullet2": "• Черновики действий — выставить снаряжение, опубликовать состояние спота, спланировать поездки (вы подтверждаете)", + "proReceiptBullet3": "• Ответы, использующие ваш личный контекст, а не только публичные данные", + "proReceiptBullet4": "• ⚡ Вы напрямую поддерживаете SkateSpots и сохраняете его бесплатным и без рекламы", + "proReceiptThanks": "Спасибо, что сохраняете SkateSpots бесплатным и без рекламы. А теперь идите кататься. 🛹", + "proReceiptSubject": "Чек Sasquatch Pro", + "receiptContent": "Sasquatch Pro — пропуск сторонника {{tier}} 🦧⚡", + "receiptAlt": "Пропуск сторонника Sasquatch Pro ({{tier}}), действителен до {{until}}", + "purchaseComment": "Sasquatch Pro — {{tier}} 🦧", + "errLogin": "Войдите, чтобы перейти на Pro.", + "errStart": "Не удалось начать покупку.", + "errRecord": "Не удалось записать ваш пропуск." + }, + "cardUi": { + "save": "Сохранить карту в Nostr", + "saved": "Карта сохранена", + "savedDesc": "Ваша карта подписана и проверяема.", + "saveFailed": "Не удалось сохранить карту", + "notPublished": "Не опубликовано", + "titleNeon": "Райдер", + "titleRest": "Карта", + "saveFrontPng": "Сохранить лицевую сторону (PNG)", + "expired": "ИСТЕКЛА", + "logoUploaded": "Логотип загружен", + "logoUploadFailed": "Не удалось загрузить логотип", + "venue": "Привязанное место (необязательно)", + "venueNone": "Без места", + "venueHint": "Выберите один из своих спотов, чтобы привязать пропуск к месту. Проверяющий подтвердит, что оно ваше.", + "venuePick": "Выберите место", + "parkNoVenue": "Пропуск Park может выдать только владелец места — сначала нанесите на карту спот, которым владеете.", + "parkAddVenue": "Добавить спот", + "parkNeedsVenue": "Выберите место, которым владеете", + "parkIssued": "Выданные пропуска", + "parkRevoke": "Отозвать", + "parkRevoked": "Отозван", + "parkRevokeFailed": "Не удалось отозвать", + "v": { + "valid": "Действительна", + "validDesc": "Подпись действительна и выдана местом.", + "expired": "Истекла", + "expiredDesc": "Срок действия истёк.", + "revoked": "Отозвана", + "revokedDesc": "Выдавший отменил этот пропуск — не принимайте его.", + "invalid": "Недействительна", + "invalidDesc": "Подпись не подтверждается. Не доверяйте ей.", + "notFound": "Не найдена", + "notFoundDesc": "На Relay нет подходящей записи.", + "unverifiedIssuer": "Непроверенный выдавший", + "unverifiedIssuerDesc": "В этом пропуске указано место, не принадлежащее ключу выдавшего.", + "notBound": "Не привязана", + "notBoundDesc": "Не привязана к месту — ничего не доказывает о доступе.", + "noRsvp": "Нет RSVP", + "noRsvpDesc": "У держателя нет записи RSVP на это событие.", + "admitted": "Допущен", + "admittedDesc": "Событие организатора + держатель подтвердил RSVP.", + "noHolder": "В ссылке нет держателя", + "noHolderDesc": "В этом QR нет держателя билета (`?h=`), поэтому держателя нельзя проверить." + }, + "passes": { + "tab": "Мои пропуска", + "pass": "Пропуск доступа", + "none": "Пропусков пока нет. Когда место или организатор выдаст вам пропуск, он появится здесь." + }, + "facets": { + "title": "Показывать грани идентичности", + "crews": "Crew", + "local": "Локальный", + "roles": "Роли в The Lab" + }, + "roles": { + "coach": "Тренер", + "filmer": "Filmer", + "editor": "Монтажёр", + "photographer": "Фотограф", + "builder": "Строитель", + "artist": "Художник", + "graffiti": "Граффити", + "tattoo": "Тату", + "trainer": "Тренер по физподготовке", + "musician": "Музыкант", + "judge": "Судья", + "organizer": "Организатор", + "barber": "Барбер" + }, + "crew": { + "crewCard": "CREW CARD", + "crewSub": "Ваш Crew на карте", + "pick": "Выберите Crew", + "none": "Вы пока не в Crew — сначала вступите или создайте свой.", + "hint": "Карта строится из собственных подписанных данных Crew. Чтобы изменить её, отредактируйте Crew на его странице.", + "members": "УЧАСТНИКИ", + "spots": "SPOTS", + "est": "Осн. {{year}}", + "openCall": "Открытый набор", + "verifiedCrew": "Проверенный Crew", + "viewCrew": "Открыть Crew" + }, + "event": { + "pass": "ПРОПУСК НА СОБЫТИЕ", + "passSub": "Пропуск на событие, которое вы посещаете", + "pick": "Выберите событие", + "none": "Событий пока нет — сначала создайте событие или подтвердите RSVP.", + "hint": "Пропуск строится из собственных подписанных данных события. Изменить его может только организатор.", + "admits": "ДОПУСКАЕТ", + "going": "{{count}} идут", + "verifiedEvent": "Проверенное событие", + "viewEvent": "Открыть событие", + "issuePass": "Выдать пропуск для регистрации", + "issuePassBtn": "Выдать пропуск", + "issuePassHint": "Подписанный пропуск для конкретного посетителя — он показывает его на входе.", + "notOrganiser": "Только организатор может выдавать пропуска", + "passIssued": "Пропуск выдан", + "issueFailed": "Не удалось выдать пропуск", + "issuedPasses": "Выданные пропуска для регистрации" + }, + "studio": { + "unsaved": "Несохранённые изменения", + "saved": "Сохранено", + "saveChanges": "Сохранить изменения", + "allSaved": "Сохранено — всё актуально", + "showOnCard": "Показывать на карте", + "derived": "Из вашего профиля скейтера", + "noSkaterProfile": "Профиля скейтера пока нет —", + "editSkaterProfile": "добавьте свои стили и уровень", + "noPhoto": "Фото профиля пока нет —", + "addPhoto": "добавьте в профиле", + "finishTitle": "Доведите карту до конца", + "finishDesc": "Фото и профиль скейтера делают её реалистичной.", + "checkPhoto": "Фото профиля", + "checkName": "Отображаемое имя", + "checkProfile": "Стили и уровень", + "checkCrew": "Вступите в Crew", + "moreTypes": "Больше типов карт открывается, когда вы наносите свои споты, вступаете в Crew или подтверждаете RSVP на события.", + "accent": "Акцентный цвет", + "accentHint": "Переопределяет акцент темы", + "accentClear": "Использовать цвет темы", + "logo": "Свой логотип / герб", + "logoAdd": "Загрузить", + "logoChange": "Изменить", + "logoClear": "Удалить" + }, + "back": { + "title": "Печатная обратная сторона", + "desc": "Crew, роли, спонсоры и ссылки на обороте", + "showBack": "Показать оборот", + "showFront": "Показать лицо", + "empty": "Здесь пока пусто — добавьте Crew, роли или спонсоров." + }, + "verify": { + "checking": "Проверяем карту…", + "notFound": "Карта не найдена", + "notFoundDesc": "На Relay не найдено подходящего события. Возможно, оно удалено или ссылка неверна.", + "invalid": "Недействительная подпись", + "invalidDesc": "Это событие существует, но его подпись не подтверждается. Не доверяйте ему.", + "authentic": "Подлинная", + "authenticDesc": "Подпись выдавшего действительна.", + "kind": "Тип", + "kindPark": "Карта доступа в Park", + "kindRider": "Райдер-карта", + "kindCrew": "Карта Crew", + "kindEvent": "Пропуск на событие", + "organiser": "Организатор", + "expired": "Истекла", + "valid": "Действительна", + "holder": "Держатель", + "ticketHolder": "Держатель билета", + "rsvp": "RSVP", + "rsvpGoing": "Идёт", + "rsvpInterested": "Интересуется", + "rsvpNone": "RSVP не найден", + "revoked": "Пропуск отозван", + "revokedDesc": "Выдавший отменил этот пропуск — не принимайте его.", + "issuedBy": "Выдан", + "accessLevel": "Уровень доступа", + "validThru": "Действительна до", + "selfIssued": "Статус", + "selfIssuedDesc": "Самостоятельно выданная карта личности", + "venue": "Место", + "venueVerified": "Проверено — ключ владельца этого места совпадает с выдавшим.", + "venueMismatch": "В этом пропуске указано место, не принадлежащее ключу выдавшего.", + "venueNone": "Не привязана к месту.", + "viewCard": "Посмотреть карту", + "disclaimer": "Действительная подпись доказывает, кто подписал эту карту, — это не доказательство навыка или прав доступа сверх того, что выдало место.", + "details": "Детали", + "invalidLink": "Неверная ссылка", + "invalidLinkDesc": "Это не похоже на действительную ссылку карты." + }, + "public": { + "invalid": "Это не похоже на действительную ссылку карты.", + "createYourOwn": "Создайте свою карту", + "editYourCard": "Редактировать карту", + "backToEditor": "Назад в редактор", + "backHome": "На главную", + "notCustomised": "Этот скейтер ещё не настроил свою карту — это вид по умолчанию.", + "verifyNote": "Отсканируйте QR на карте, чтобы проверить её." + } + }, + "routeUi": { + "destination": "Пункт назначения", + "routeTo": "Маршрут до {{label}}", + "routeToLabel": "Маршрут до", + "search": "Поиск", + "description": "Варианты маршрута и встроенные подсказки.", + "routeMapAria": "Карта маршрута", + "findingLocation": "Определяем ваше местоположение…", + "plottingRoute": "Строим маршрут…", + "refiningLocation": "Уточняем местоположение…", + "offlineSavedRoute": "Офлайн · сохранённый маршрут {{age}}", + "tapMapStart": "Нажмите на карту, чтобы задать точку старта", + "fitRouteAria": "Показать весь маршрут на карте", + "wholeRoute": "Весь маршрут", + "next": "Далее", + "nextStep": "Далее · шаг {{n}}", + "followTheLine": "Следуйте по линии", + "toTheTurn": "до поворота", + "toGo": "осталось", + "tryAgain": "Попробовать снова", + "mode": { + "foot": "Скейт / пешком", + "bike": "Велосипед", + "moto": "Мото", + "car": "Автомобиль", + "transit": "Транспорт" + }, + "from": "Откуда", + "myLocation": "Моё местоположение", + "tapTheMap": "Нажмите на карту…", + "chooseOnMap": "Выбрать на карте", + "direct": "без пересадок", + "transferOne": "1 пересадка", + "transfers": "{{count}} пересадок", + "options": "{{count}} вариантов", + "ride": "поездка", + "arrive": "прибытие", + "speedAvg": "{{speed}} км/ч в среднем", + "stepsCount": "{{count}} шагов", + "onABoard": "на доске", + "usesDrivingRoads": "использует автомобильные дороги", + "drivingEstimate": "оценка для авто", + "updating": "обновление…", + "pickMode": "Выберите режим, чтобы увидеть маршрут.", + "waitingLocation": "Ждём ваше местоположение…", + "routeSteps": "Шаги маршрута", + "walkingRoute": "пешеходный маршрут — на доске быстрее", + "planningView": "Режим планирования — нажмите «Старт», чтобы следовать с живыми поворотами, голосом и прибытием.", + "leaveNow": "Выехать сейчас", + "departAt": "Отправиться в", + "arriveBy": "Прибыть к", + "departureTime": "Время отправления", + "arrivalTime": "Время прибытия", + "only": "Только", + "clear": "сбросить", + "itinerary": "Маршрут", + "group": { + "bus": "Автобус", + "tram": "Трамвай", + "metro": "Метро", + "train": "Поезд", + "ferry": "Паром" + }, + "walk": "Пешком", + "rideVerb": "Ехать", + "walkLower": "пешком", + "rideLower": "ехать", + "toStop": "до", + "track": "путь {{track}}", + "stopOne": "1 остановка", + "stopsCount": "{{count}} остановок", + "tickets": "билеты ↗", + "done": "Готово", + "stop": "Стоп", + "start": "Старт", + "arrived": "Вы прибыли. 🛹", + "voiceOnNote": "Экран остаётся включённым · голос включён — повороты и прибытие озвучиваются.", + "voiceOffNote": "Экран остаётся включённым · голос выключен.", + "followNote": "Повороты, голос и прибытие по мере движения. Экран остаётся включённым.", + "voiceOffAria": "Выключить голосовые подсказки", + "voiceOnAria": "Включить голосовые подсказки", + "voiceStart": "Начинаем навигацию", + "voiceArrived": "Вы прибыли", + "voiceIn": "Через {{metres}} метров {{instruction}}", + "voiceContinue": "продолжайте", + "voiceContinueCaps": "Продолжайте", + "errPermissionDenied": "Доступ к геолокации запрещён.", + "errWaitingGps": "Ждём GPS-сигнал…", + "errPermissionDeniedLong": "Доступ к геолокации запрещён. Включите геолокацию, чтобы построить маршрут от вас.", + "errNoLocation": "Не удалось определить ваше местоположение. Попробуйте снова.", + "errNoLocationShort": "Не удалось определить ваше местоположение.", + "errTransitNoRouteFiltered": "Нет маршрута для этого времени или вида транспорта — попробуйте другое время или добавьте больше видов.", + "errTransitNoRoute": "Маршрут общественного транспорта здесь не найден — возможно, в этом районе не публикуют открытые расписания.", + "errTransitUnreachable": "Не удалось связаться со службой транспорта. Проверьте соединение и попробуйте снова.", + "errRoutingBusy": "Служба маршрутизации сейчас занята — попробуйте через момент.", + "errNoRouteMode": "Нет маршрута для этого режима — возможно, пункт назначения вне дорожной сети. Попробуйте другой режим.", + "errRoutingUnreachable": "Не удалось связаться со службой маршрутизации. Проверьте соединение и попробуйте снова.", + "departures": "Отправления", + "upcomingFrom": "Ближайшие отправления от {{stop}}", + "loadingDepartures": "Загружаем отправления…", + "noDepartures": "На этой остановке ближайших отправлений не найдено.", + "live": "в реальном времени", + "cancelled": "отменено", + "refresh": "Обновить", + "tripLoginTitle": "Войдите, чтобы сохранить", + "tripLoginDesc": "Войдите, чтобы сохранить эту поездку как коллекцию.", + "tripCollectionTitle": "Скейт-поездка в {{destination}} 🛹", + "tripCollectionDesc": "План поездки от The Sasquatch — {{count}} дней в {{destination}}.", + "tripCollectionDescOne": "План поездки от The Sasquatch — {{count}} день в {{destination}}.", + "tripSavedTitle": "Сохранено в коллекции 🦧", + "tripSavedDesc": "Ваша поездка в {{destination}} добавлена в закладки.", + "tripSaveFailed": "Не удалось сохранить", + "tripSaveFailedDesc": "Попробуйте ещё раз через секунду.", + "daysInDestinationOne": "{{count}} день в {{destination}}", + "daysInDestination": "{{count}} дней в {{destination}}", + "wetForecast": "Дождливый прогноз — обратитесь к местному Crew за укрытиями/помещениями.", + "dayLabel": "День {{n}}", + "freeSkate": "Свободное катание — исследуйте и снимайте. 🎥", + "tapToBook": "нажмите, чтобы забронировать / Zap ⚡", + "localCrews": "Местные Crew", + "saving": "Сохранение…", + "savedToCollections": "Сохранено в коллекции", + "saveSpotOne": "Сохранить {{count}} спот в коллекцию", + "saveSpots": "Сохранить {{count}} спотов в коллекцию", + "flights": "Авиабилеты", + "stays": "Проживание", + "gettingAround": "Передвижение", + "noMiddleman": "Я планирую катание — авиабилеты и проживание открываются на реальных сайтах (без KYC, без посредников).", + "ageJustNow": "только что", + "ageMinAgo": "{{count}} мин назад", + "ageHourAgo": "{{count}} ч назад", + "ageDayAgo": "{{count}} дн назад", + "skateRightHere": "прямо здесь", + "skateMin": "~{{count}} мин на доске", + "skateHours": "~{{hours}} ч на доске", + "maneuver": { + "headOut": "Выезжайте", + "arrive": "Прибытие к споту", + "continueStraight": "Продолжайте", + "bearLeft": "Плавно влево", + "bearRight": "Плавно вправо", + "turnLeft": "Поверните налево", + "turnRight": "Поверните направо", + "sharpLeft": "Резко налево", + "sharpRight": "Резко направо", + "turn": "Поворот", + "keepLeft": "Держитесь левее", + "keepRight": "Держитесь правее", + "takeFork": "На развилке", + "merge": "Вливайтесь", + "roundabout": "Проезжайте по кругу", + "takeRamp": "Поверните на съезд", + "takeExit": "Сверните на выход" + }, + "maneuverOnto": "{{instruction}} на {{road}}" + }, + "sasquatchUi": { + "live": "в эфире", + "offline": "офлайн", + "genericTitle": "Ассистент SkateSpots 🦧", + "genericGreeting": "Йоу! Я The Sasquatch. Спросите меня о чём угодно: о спотах, событиях, тренерах, снаряжении или о том, как работает приложение. У меня живые данные с Relay SkateSpots!", + "q1": "Спланируй мне 3 дня в Лиссабоне", + "q2": "Найди споты рядом", + "q3": "Есть ближайшие события?", + "q4": "Что такое Crew?", + "q5": "Как работают Zap?", + "q6": "Что такое Nostr?", + "q7": "Что такое Мой Stash?", + "q8": "Это бесплатно?", + "bubbleTitle": "Нажмите и перетащите, чтобы переместить · Нажмите, чтобы открыть", + "openGuideAria": "Открыть руководство Sasquatch", + "hideAria": "Скрыть ассистента Sasquatch", + "hide": "Скрыть ассистента", + "showAria": "Показать ассистента Sasquatch", + "activeUntil": "Активно до {{date}}", + "platformOwner": "Владелец платформы", + "upgradeTitle": "Перейти на Sasquatch Pro", + "goPro": "Стать Pro", + "goProBlurb": "Личный ИИ · от 2k sats", + "aiBalanceTitle": "Баланс кредитов Sasquatch AI (только для владельца) — пополнить на {{provider}}", + "aiChip": "⚡ ИИ {{balance}}", + "minimizeToBubbleAria": "Свернуть в пузырь", + "minimize": "Свернуть", + "closePanelAria": "Закрыть панель", + "close": "Закрыть", + "askLab": "Спросить о тренерстве и съёмке", + "askMap": "Спросить о спотах, магазинах и снаряжении", + "askAnything": "Спросите меня о чём угодно 🛹", + "quickQuestions": "Быстрые вопросы:", + "you": "🧑 Вы", + "thinking": "думаю...", + "inputPlaceholder": "Спросите о спотах, событиях, тренерах...", + "liveDataFrom": "Живые данные от", + "nostrRelays": "Nostr Relay", + "clear": "сбросить", + "gettingLocation": "📍 Определяем ваше местоположение…", + "findingClosest": "🔍 Ищем ближайшие споты…", + "checkingLive": "🔍 Проверяем живые данные…", + "planningTrip": "🗺️ Планируем вашу поездку в {{destination}}...", + "searchingRelays": "🔍 Ищем в Relay: {{tool}}...", + "perk1": "Личный ассистент — Sasquatch читает ваш Stash, Crew, споты и объявления", + "perk2": "Черновики действий: выставить снаряжение, опубликовать скейт-статус, спланировать поездку — вы подтверждаете до любой публикации", + "perk3": "Ответы используют ваш личный контекст, а не только публичные данные", + "perk4": "⚡ Напрямую поддерживаете SkateSpots и сохраняете его бесплатным и без рекламы", + "welcomeTitle": "Спасибо за поддержку Sasquatch Pro! 🦧⚡", + "welcomeDesc": "Платёж отправлен — пропуск активируется, как только провайдер подтвердит его (обычно в течение минуты). Спасибо, что сохраняете улицы бесплатными.", + "invoiceCopied": "Счёт скопирован", + "dialogDesc": "Прокачайте своего ИИ-скейт-гида. 100% средств идут на бесплатное приложение без рекламы.", + "proSupporter": "Вы сторонник Pro ⚡", + "extendPrompt": "Хотите продлить? Выберите тариф ниже, чтобы добавить времени.", + "scanToPayPre": "Отсканируйте, чтобы оплатить", + "scanToPayAmount": "{{sats}} sats", + "scanToPayPost": "за {{label}} Pro", + "invoiceQrAlt": "QR-код счёта Lightning", + "copyInvoice": "Скопировать счёт", + "ivePaid": "Я оплатил", + "ivePaidHint": "Нажмите «Я оплатил» после подтверждения в кошельке — это запишет ваш пропуск в вашу идентичность Nostr.", + "freeStaysPre": "Бесплатный Sasquatch остаётся бесплатным — публичный поиск спотов/событий/тренеров, планирование поездок + полный глоссарий трюков. Pro добавляет ", + "freeStaysEmphasis": "личный + деятельный", + "freeStaysPost": " слой.", + "loginFirst": "Сначала войдите, чтобы перейти на Pro.", + "paysTo": "Оплата на", + "overLightning": "через Lightning. Привязано к вашему npub.", + "popular": "Популярно", + "sats": "sats", + "extend": "Продлить", + "done": "Готово!", + "cancelledNothing": "Отменено — ничего не опубликовано.", + "draftReview": "Черновик — проверьте и подтвердите", + "statusTextPlaceholder": "Текст статуса", + "titlePlaceholder": "Заголовок", + "priceSatsPlaceholder": "Цена (sats)", + "conditionPlaceholder": "Состояние", + "cancel": "Отмена", + "aiTitle": "Sasquatch AI", + "owner": "Владелец", + "notConfigured": "не настроено", + "unavailable": "недоступно", + "satsValue": "{{balance}} sats", + "theNode": "узел", + "lowBalance": "Баланс на исходе — пополните на {{provider}}, иначе ИИ переключится на провайдера без ключа.", + "aiDesc": "ИИ с оплатой за запрос, оплачивается в sats через Routstr. Пополняется автоматически при низком балансе.", + "tier7d": "7 дней", + "tier1m": "1 месяц", + "tier3m": "3 месяца", + "tier1y": "1 год", + "badgeTry": "Попробуйте", + "badgeOff20": "скидка 20%", + "badgeBest": "Лучшая цена · скидка 40%", + "draftPostStatusTitle": "Опубликовать скейт-статус", + "draftAutoExpires": "Автоистечение через {{count}} мин", + "draftPostStatusCta": "Опубликовать статус", + "draftCategory": "Категория: {{value}}", + "draftSize": "Размер: {{value}}", + "draftCondition": "Состояние: {{value}}", + "draftMaxPrice": "Макс. цена: {{price}} {{currency}}", + "draftPriceOpen": "Цена: открытая", + "draftLookingForTitle": "Ищу «{{title}}»", + "draftWantedCta": "Опубликовать объявление «куплю»", + "draftPrice": "Цена: {{price}} {{currency}}", + "draftPriceOffer": "Цена: предложите свою", + "draftListTitle": "Выставить «{{title}}» на продажу", + "draftPublishCta": "Опубликовать объявление", + "statusPosted": "Статус опубликован 🛹", + "wantedPublished": "Объявление «куплю» опубликовано 🔎", + "listingPublished": "Объявление опубликовано 💸", + "mustBeLoggedIn": "Вы должны быть авторизованы." + }, + "sasquatchChat": { + "faq": { + "hi": "Привет! Я The Sasquatch 🦧 Ваш ИИ-гид по скейтбордингу. Спросите меня о спотах, событиях, тренерах, снаряжении — или о чём угодно про приложение. Что вам нужно?", + "hello": "Как дела! 🛹 Я The Sasquatch. Спросите меня о скейт-спотах, событиях, тренерах или о том, как работает приложение. Что нового?", + "hey": "Привет, скейтер! 🤙 Спросите меня о спотах рядом, ближайших событиях, тренерах или о чём угодно в SkateSpots.", + "whoAreYou": "Я The Sasquatch 🦧 — ИИ-гид SkateSpots. Я умею находить скейт-споты по всему миру, искать события, тренеров, Filmer'ов и объявления о снаряжении. Всё на живых данных Nostr. Спрашивайте!", + "whatCanYouDo": "Я умею находить скейт-споты по городу или стране, искать ближайшие события, находить тренеров и Filmer'ов в The Lab, искать объявления о снаряжении и отвечать на вопросы о том, как работает приложение. Попробуйте: «споты в Бангкоке» или «найди тренера»! 🛹", + "whatIsNostr": "Nostr — это простой открытый протокол для децентрализованных соцсетей. Представьте Twitter, но им не управляет одна компания — вы используете криптографические ключи вместо имён пользователей, сами выбираете, какие Relay хранят ваши данные (или запускаете свой), и один аккаунт работает в любом приложении Nostr! 🔑", + "isThisPrivate": "Честно обо всём 🛡️\n\n• Ваше **местоположение GPS остаётся на устройстве** — «Рядом» лишь центрирует карту. Оно никогда не отправляется нам и не публикуется.\n• **Споты, которые вы добавляете, публичны** (в этом и смысл общей карты) — так что не ставьте метку на своей входной двери.\n• **Личные сообщения и чаты Crew защищены сквозным шифрованием** — их видят только участники.\n• Как и на любом сайте, серверы, к которым вы подключаетесь (тайлы карт, Relay), видят ваш **IP**. Хотите скрыть и это? Используйте VPN или Tor.\n\nПодробности на [странице конфиденциальности](/privacy). 🛹", + "privacy": "Кратко 🛡️: ваш GPS никогда не покидает устройство, опубликованные споты публичны по своей природе, а личные сообщения и чаты Crew защищены сквозным шифрованием. Серверы всё равно видят ваш IP (как на любом сайте) — VPN или Tor скроет это, если хотите. Полный разбор на [странице конфиденциальности](/privacy).", + "amITracked": "SkateSpots не следит за вами — нет рекламы, нет аналитического профилирования, нет продажи данных, и нет сервера SkateSpots, собирающего ваше местоположение. Ваш GPS остаётся на устройстве. Единственное, что видят серверы (тайлы карт, Relay), — это ваш **IP**, как на любом сайте. Используйте VPN или Tor, чтобы скрыть его. Подробнее на [странице конфиденциальности](/privacy). 🛡️", + "doYouTrack": "Нет — никакого трекинга, рекламы и сбора данных. Ваш GPS остаётся на устройстве, и нет центрального сервера, который вас логирует. Серверы, к которым вы подключаетесь, видят ваш IP (как на любом сайте); VPN/Tor это скроет. См. [страницу конфиденциальности](/privacy). 🛹", + "vpn": "Совершенно необязательно, но полезно, если хотите больше приватности 🛡️. VPN скрывает ваш **IP** (примерное местоположение) от серверов, с которыми общается SkateSpots — тайлов карт, Relay и т. д. Выбирайте провайдера без логов, которому доверяете (например, Mullvad); избегайте сомнительных бесплатных.\n\nУчтите: VPN **не** скрывает споты, которые вы публикуете (они публичны), и не включайте GPS браузера, если хотите остаться анонимным. Подробности на [странице конфиденциальности](/privacy).", + "tor": "Tor Browser даёт максимальную приватность IP — он проводит вас через несколько Relay, так что серверы не видят ваш настоящий IP 🧅. Цена: медленнее, а карты и некоторые Relay Nostr могут тормозить или блокировать выходные узлы Tor. Отлично для самых осторожных.\n\nПомните: Tor скрывает ваш IP, но не споты, которые вы публикуете, и не включайте GPS браузера, если цель — анонимность. Подробнее на [странице конфиденциальности](/privacy).", + "hideMyIp": "Два бесплатных варианта 🛡️: **надёжный VPN** (просто, быстро — скрывает ваш IP за своими серверами) или **Tor Browser** (максимум приватности, медленнее). Любой из них не даёт серверам, к которым подключается SkateSpots, видеть ваш настоящий IP. Учтите, они не скрывают споты, которые вы публикуете. См. [страницу конфиденциальности](/privacy).", + "isMyLocation": "Ваше местоположение в безопасности 📍 — «Рядом» читает GPS только на вашем устройстве, чтобы центрировать карту и отсортировать ближайшие споты. Оно никогда не публикуется в Nostr, не отправляется нам и не передаётся. Публичны только споты, которые вы сознательно добавили. Детали на [странице конфиденциальности](/privacy).", + "whatAreZaps": "Zap — это мгновенные чаевые в Bitcoin Lightning, отправляемые через Nostr! Нажмите ⚡ на любом контенте и отправьте sats напрямую в кошелёк автора. Как «лайк», но с реальными деньгами. Мгновенно, peer-to-peer, без посредников. ⚡", + "howToLogin": "Два способа:\n1. **Расширение браузера** (компьютер): установите Alby или nos2x, затем нажмите «Войти»\n2. **Новый пользователь**: нажмите «Регистрация», чтобы создать ключи. Скачайте свой nsec (секретный ключ) и СОХРАНИТЕ ЕГО — это ваш аккаунт навсегда!", + "whatIsCashu": "Встроенный Bitcoin-кошелёк! Токены Cashu ecash с поддержкой Lightning — работают офлайн на спотах, ориентированы на приватность (минты не могут отслеживать платежи). Перейдите в Кошелёк в настройках, чтобы использовать. 🥜", + "whatIsNwc": "Nostr Wallet Connect — как USB-C для кошельков Lightning. Подключите Alby, Minibits, Zeus или Coinos один раз — и делайте Zap в один клик навсегда. Зашифровано, лимиты расходов под вашим контролем. 🔌⚡", + "isItFree": "100% бесплатно. Без рекламы, без подписок, без корпоративной чепухи. Сделано скейтерами для скейтеров. Финансируется сообществом через Angor — загляните на страницу сторонников. Вы также можете зарабатывать Bitcoin через Zap от сообщества за добавление качественных спотов. 🛹", + "whatCanIDo": "Находите споты по всему миру на карте, нанимайте профи в The Lab (тренеры, Filmer'ы, фотографы, монтажёры, строители рамп), катайтесь с Crew, присоединяйтесь к событиям, ходите в туры, покупайте/продавайте снаряжение, ведите свой приватный Stash, делайте Zap авторам, смотрите погоду на спотах и стройте децентрализованное скейт-сообщество!", + "whatIsTheLab": "The Lab — это место, где вы нанимаете профи скейт-сцены: тренеров, Filmer'ов, фотографов, видеомонтажёров и строителей рамп/парков/DIY. Каждый может быть отдельным человеком или коллективом (Crew/студия) — участники подтверждают своими ключами, так что всё честно. Всё на Nostr, без фейковых аккаунтов. 🎓", + "whatIsACrew": "Crew — это ваша привязанная к карте скейт-семья: те, с кем вы катаетесь, а не кого нанимаете. У каждого Crew есть домашняя территория на карте (бирюзовые метки), домашние споты, участники, атмосфера и манифест. Участники подтверждают со своих ключей. Создайте свой в Crew → «Создать Crew». 🤘", + "whatAreCrews": "Crew — это ваша привязанная к карте скейт-семья: те, с кем вы катаетесь, а не кого нанимаете. У каждого Crew есть домашняя территория на карте (бирюзовые метки), домашние споты, участники и манифест. Участники подтверждают со своих ключей. Перейдите на вкладку Crew, чтобы создать или вступить! 🤘", + "howToStartACrew": "Перейдите на вкладку Crew → «Создать Crew». Дайте название, поставьте домашнюю территорию на карту, добавьте атмосферу (или свой хэштег), привяжите домашние споты и добавьте участников по npub. Каждый участник подтверждает со своего ключа, так что состав честный. 🤘", + "whatIsMyStash": "Мой Stash — это ваш ПРИВАТНЫЙ зашифрованный шкафчик со снаряжением (шифрование NIP-44). Отслеживайте Deck, Trucks, Wheels, обувь — с местом хранения, состоянием, редкостью и ценой. Прочитать может только ВЫ, если не отметите предметы публичными. Отлично для страховки или планирования обмена. 🎒", + "whatIsStash": "Мой Stash — это ваш ПРИВАТНЫЙ зашифрованный инвентарь снаряжения. Записывайте всё, что у вас есть — состояние, где хранится, ценность — всё зашифровано, чтобы видеть могли только вы. Отмечайте предметы публичными, если хотите продать или похвастаться. 🎒", + "whatIsABuilder": "Builder'ы — это Crew по рампам/паркам/DIY в The Lab, которых можно нанять, чтобы построить transition, Bowl, Rail или целый парк. Они указывают, что строят, материалы, масштаб проектов, могут иметь лицензии/страховку. Часто это коллективы — и они могут привязывать построенные споты к карте. 🏗️", + "whatIsANutzap": "Nutzaps (NIP-61) — это чаевые ecash, отправляемые через Nostr: приватные токены Cashu, отправленные Zap напрямую человеку. ПРИЁМ nutzap можно настроить в Кошельке. (Отправка полных nutzap ещё разворачивается — пока используйте Lightning Zap.) 🥜⚡", + "whatIsClink": "CLINK — это нативный для Nostr платёжный код («noffer»). Магазины, Crew и профи The Lab могут добавить его, чтобы вы могли платить им без Lightning-адреса — вы увидите кнопку «Оплатить через CLINK» с QR. Отсканируйте его кошельком с CLINK, например ShockWallet. 🔗⚡ [спецификации](https://clinkme.dev/specs.html) [приложения](https://clinkme.dev/apps.html)", + "whatIsNoffer": "Noffer — это платёжный код CLINK: многоразовый, нативный для Nostr способ получать оплату без веб-сервера или Lightning-адреса. Добавьте свой в профиле магазина/Crew/The Lab, и люди смогут платить вам напрямую. 🔗", + "whatAreTours": "Туры — это организованные скейт-поездки: местные сессии, роад-трипы по стране или туры World Destruction. Находите их на карте или в разделе «Туры», встречайтесь и катайте новый рельеф вместе с местными. 🗺️🛹", + "whatIsAShop": "Скейт-магазины — это местные магазины, отмеченные на карте. Открывайте и поддерживайте настоящие офлайн- (или онлайн-) скейт-магазины в своём районе — некоторые даже принимают Bitcoin. 🏪", + "howToSellGear": "Перейдите в Gear Swap / Marketplace и создайте объявление (NIP-99). Добавьте фото, цену в sats, состояние и, при желании, привяжите к споту, чтобы оно появилось на карте. Покупатели пишут вам или делают Zap напрямую. 🛹💸", + "supporters": "SkateSpots финансируется сообществом через Angor (децентрализованный краудфандинг на Bitcoin) — без рекламы, без инвесторов, без продажи данных. Загляните на страницу сторонников, чтобы поддержать проект и сохранить улицы бесплатными. ❤️⚡", + "trustScore": "Оценки доверия (0–100) на базе Relatr. Анализируется ваша сеть Nostr: подписчики, активность, вовлечённость, Zap. Чем выше — тем больше доверия. Помогает фильтровать ботов и спам. Посмотрите любой профиль, чтобы увидеть оценку. 🛡️", + "whatRelay": "SkateSpots использует: 🛹 goskatespots.nostr1.com (основной, в белом списке для качества) + relay.ditto.pub (глобальный) + purplepag.es (агрегатор профилей). Ваши данные реплицируются на все для надёжности.", + "tripPlanner": "Назовите город, и я построю скейт-поездку по дням 🗺️ — споты, события, тренеры и местные Crew, с учётом погоды (дождливый день = совет от Crew про укрытия). Попробуйте «спланируй мне 3 дня в Лиссабоне». Я сохраню всё в коллекцию и передам вас на реальные сайты по авиабилетам и жилью (без KYC, без посредников). 🛹", + "planATrip": "Просто скажите «спланируй мне 3 дня в Барселоне» (или любой город), и я распишу споты, сессии, тренеров и местные Crew на каждый день. Сохраните как коллекцию и идите кататься. 🗺️🛹", + "sasquatchPro": "**Sasquatch Pro** 🦧⚡ — это пропуск сторонника за Lightning, который открывает личную сторону меня:\n\n• 🧠 **Личный ассистент** — я читаю ваш Stash, Crew, споты и объявления\n• ✨ **Черновики действий** — выставить снаряжение, опубликовать ваш скейт-статус, спланировать поездки (вы всегда подтверждаете до публикации)\n• 💬 **Личный контекст** — мои ответы используют ваши данные, а не только публичные результаты\n• ⚡ **Поддержка проекта** — вы сохраняете SkateSpots бесплатным и без рекламы\n\nБесплатный Sasquatch остаётся бесплатным: публичный поиск спотов/событий/тренеров/Crew, глоссарий и планирование поездок работают без Pro. Pro добавляет только *личное*. Нажмите **⚡ Стать Pro** вверху. Тарифы: 7 дней ~2k sats, 1 месяц ~5k, 3 месяца ~12k, 1 год ~36k.", + "proPerks": "Бонусы Pro 🦧⚡: личный ассистент (читает ваш Stash/Crew/споты/объявления), черновики действий (выставить снаряжение, опубликовать статус, спланировать поездки — вы подтверждаете) и ответы, использующие ваш личный контекст. Плюс вы напрямую поддерживаете SkateSpots, сохраняя его бесплатным и без рекламы. Бесплатное остаётся бесплатным — Pro добавляет личный слой. Нажмите **⚡ Стать Pro** вверху.", + "proVersion": "Pro-версия меня 🦧⚡ добавляет **личного ассистента**: я могу читать ваш Stash, Crew, споты и объявления, готовить черновики действий (выставить снаряжение, опубликовать статус, спланировать поездку — вы всегда подтверждаете первым) и использовать ваш личный контекст в ответах. Это также напрямую поддерживает проект. Бесплатный Sasquatch (поиск спотов/событий/тренеров/Crew, глоссарий, планировщик поездок) остаётся бесплатным. Нажмите **⚡ Стать Pro** вверху.", + "perks": "Бонусы Pro 🦧⚡: личный ассистент (ваш Stash/Crew/споты/объявления), черновики действий, которые вы подтверждаете, и ответы, использующие ваш контекст — плюс вы сохраняете приложение бесплатным и без рекламы. Нажмите **⚡ Стать Pro** вверху.", + "goPro": "Нажмите кнопку **⚡ Стать Pro** вверху, чтобы открыть окно обновления. Pro открывает моего личного ассистента (Stash/Crew/споты/объявления) и черновики действий, а также напрямую поддерживает проект. Оплата Lightning — от 7 дней ~2k sats до 1 года ~36k sats. Бесплатные функции остаются бесплатными. 🦧", + "proPricing": "Тарифы Pro (оплата Lightning ⚡): **7 дней** ~2 000 sats (~$1.20), **1 месяц** ~5 000 sats (~$3), **3 месяца** ~12 000 sats (~$7, −20%), **1 год** ~36 000 sats (~$21, лучшая цена). Нажмите **⚡ Стать Pro** вверху.", + "howMuchIsPro": "Тарифы Pro: 7 дней ~2 000 sats, 1 месяц ~5 000 sats, 3 месяца ~12 000 sats (−20%), 1 год ~36 000 sats (лучшая цена). Оплата Lightning ⚡. Нажмите **⚡ Стать Pro** вверху.", + "upgrade": "Чтобы перейти на Sasquatch Pro, нажмите кнопку **⚡ Стать Pro** вверху. Оплата Lightning (от 7 дней ~2k sats до 1 года ~36k). Pro открывает моего личного ассистента и черновики действий, а также напрямую поддерживает проект. 🦧⚡" + }, + "statsTitle": "📊 **SkateSpots в цифрах**", + "weatherTemp": "• {{temp}}°C (ощущается {{feels}}°C)", + "weatherSkateability": "• Пригодность для катания: **{{label}}** ({{score}}/100)", + "weatherError": "Не удалось прочитать погоду сейчас. Попробуйте через секунду. 🌧️", + "labelSpots": "спотов", + "labelEvents": "событий", + "labelLabPros": "профи The Lab", + "labelCrews": "Crew", + "labelShops": "скейт-магазинов", + "labelTours": "туров", + "labelGear": "объявлений о снаряжении", + "unnamed": "Без названия", + "emptyWhere": " в **{{place}}**", + "emptyResult": "Сейчас не нашёл ни одного {{label}}{{where}} 🦧\n\nВозможно, их пока нет в списке — или Relay ответили медленно. Попробуйте через момент, проверьте написание или [добавьте первый на карту](https://skate-spots.org/map). 🛹", + "foundTitle": "{{emoji}} Нашёл **{{count}}** {{label}}:\n{{lines}}{{more}}", + "moreResults": "\n\n…и ещё **{{count}}** — [смотрите все на карте](https://skate-spots.org/map) 🗺️", + "locationDenied": "Я не вижу ваше местоположение — ничего не покидает ваше устройство; я читаю его локально только когда вы просите, а браузер только что отказал. Нажмите 🎯 **Рядом** на карте или назовите город: «споты в Бангкоке». 🛹", + "noNearbySpots": "Рядом пока нет нанесённых спотов 🦧 — [будьте первым, кто добавит спот](https://skate-spots.org/create-spot). 🛹", + "closestTitle": "Ближайшие к вам прямо сейчас:", + "closestFooter": "_Вычислено на вашем устройстве — ваше местоположение его не покидало._", + "proNudge": "Это функция **Sasquatch Pro** 🦧⚡ — с Pro я могу читать ваш Stash, Crew, споты и объявления, готовить черновики объявлений о снаряжении, запросов «куплю» и скейт-статусов, а также планировать ваши поездки. Это пропуск сторонника за Lightning, который сохраняет SkateSpots бесплатным и без рекламы. Нажмите кнопку **⚡ Стать Pro** вверху, чтобы открыть его. 🛹", + "draftingProPerk": "Черновики действий (публикация статуса, выставление снаряжения) — бонус **Sasquatch Pro** 🦧⚡ — нажмите **⚡ Стать Pro** вверху, чтобы открыть.", + "draftIntro": "Вот черновик — проверьте его и нажмите, чтобы опубликовать. Ничего не выйдет в эфир, пока вы не подтвердите. 🛹", + "draftFailed": "Не удалось собрать этот черновик — попробуйте снова назвать детали (например, «выставь мои Wheels Spitfire за 8000 sats»).", + "tripAskCity": "Куда? Назовите город (например, «спланируй мне 3 дня в Лиссабоне»), и я построю поездку. 🗺️", + "tripEmptyMap": "Для **{{destination}}** пока ничего нет на карте 🦧 — будьте первым, кто добавит споты на [skate-spots.org](https://skate-spots.org). Как только местные добавят споты, Crew и события, я построю вам полную поездку.", + "tripLocked": "Зафиксировал для вас миссию в **{{destination}}** 🛹 — споты, сессии и местные ниже. Подправьте её или сохраните.", + "tripFailed": "Не удалось получить живые данные, чтобы спланировать это сейчас. Попробуйте через момент! 🛹", + "tripEmptyMapLocal": "Для **{{destination}}** пока ничего нет на карте 🦧 — будьте первым на [skate-spots.org](https://skate-spots.org).", + "tripMissionLocal": "Вот миссия в **{{destination}}** 🛹 — споты, сессии и местные ниже.", + "relayFailed": "Relay не ответили вовремя 🛰️ — обычно это медленное соединение, а не отсутствующий спот. Попробуйте ещё раз через момент. 🛹", + "couldNotProcess": "Хм, не удалось обработать это. Попробуйте переформулировать!", + "freeTierFallback": "Для этого нужно рассуждение ИИ — функция **Sasquatch Pro** ⚡🦧\n\nЯ всё ещё могу находить **споты, события, тренеров, Crew, магазины, туры и снаряжение** прямо из Relay — спросите, например, «споты в Барселоне» — а [Глоссарий](/glossary) охватывает 150+ трюков и терминов. Нажмите **⚡ Стать Pro** вверху, чтобы открыть ответы ИИ.", + "aiDownFallback": "Мой ИИ-мозг сейчас в воздухе 🦧 — но я всё ещё с вами:\n\n• 🗺️ [Карта](/) — споты, магазины, события рядом\n• 🧪 [The Lab](/lab) — тренеры, Filmer'ы, монтажёры\n• 📖 [Глоссарий](/glossary) — 150+ трюков и терминов\n• 👥 [Crew](/crews) — найдите своих\n\nИли просто назовите **город** («споты в Барселоне») или **трюк** («что такое nollie»), и я отвечу напрямую. 🛹", + "wentWrong": "Что-то пошло не так на моей стороне. Попробуйте через секунду! 🦧", + "publishError": "Не удалось опубликовать: {{error}}. Попробуйте через секунду.", + "unknownError": "неизвестная ошибка" + } +}; export default ruBatch2; diff --git a/src/i18n/ru/batch3.ts b/src/i18n/ru/batch3.ts index 82d50f2..813d418 100644 --- a/src/i18n/ru/batch3.ts +++ b/src/i18n/ru/batch3.ts @@ -1,4 +1,1294 @@ -/** ru — batch 3. Filled by the translation pass; empty until then. */ -const ruBatch3 = {}; +/** ru — batch 3. Filled by the Russian (ru-RU) translation pass. */ +const ruBatch3 = { + settingsUi: { + proSupport: { + title: "Pro и поддержка", + subtitle: "Необязательные дополнения, благодаря которым SkateSpots остаётся бесплатным", + prepaidTitle: "Предоплата, а не подписка", + prepaidBody: "Каждая покупка — разовый платёж в Bitcoin/Lightning: без аккаунта, без регулярных списаний, без хранения средств у нас. Повторная оплата продлевает срок.", + sasquatchTitle: "Sasquatch Pro", + sasquatchBenefit: "Открывает личного AI-ассистента — он может читать ваш Stash, Crews и объявления — и помогает финансировать проект.", + active: "Активно", + activeUntil: "Активно до {{date}}", + daysLeft: "Осталось {{count}} дн.", + notActive: "Не активно", + goPro: "Перейти на Pro", + extend: "Продлить Pro", + day: "день", + featuredTitle: "Продвигаемое размещение", + featuredBenefit: "Поднимите объявление наверх со значком Pro — для профилей The Lab, событий, Shop и туров.", + featuredHow: "Тарифы по длительности действуют для всех типов; чем дольше срок, тем дешевле день. Вы продвигаете объявление при создании или редактировании.", + featuredUntil: "До {{date}}", + yourFeatured: "Ваши продвигаемые объявления", + noneFeatured: "Нет активных продвигаемых размещений.", + freeTitle: "Бесплатные пути", + freeBody: "AI-раздел FAQ и локальный поиск всегда бесплатны, а объявление на маркетплейсе можно опубликовать с бесплатным proof-of-work вместо комиссии в sats.", + }, + notFound: { + seoTitle: "404 — Страница не найдена", + seoDescription: "Страница, которую вы ищете, не найдена. Вернитесь на главную, чтобы продолжить.", + message: "Упс! Страница не найдена", + returnHome: "Вернуться на главную", + }, + loginArea: { + signUp: "Зарегистрироваться", + logIn: "Войти", + }, + accountSwitcher: { + switchAccount: "Сменить аккаунт", + walletSettings: "Настройки кошелька", + addAccount: "Добавить ещё аккаунт", + logout: "Выйти", + }, + amberHint: { + defaultAction: "отправить", + multiBefore: "Ваш подписант попросит подтвердить", + multiTimes: "{{approvals}} раз", + multiAfter: "чтобы {{action}} — это нормально для зашифрованных сообщений (одно подтверждение на получателя). Подтверждайте каждое.", + single: "Ваш подписант попросит подтвердить, чтобы {{action}}.", + }, + amberCallback: { + processing: "Обработка входа через Amber...", + gotResult: "Получен результат: {{result}}", + noResultDebug: "Нет результата от Amber", + noResultToast: "Ответ от Amber не получен. Возможно, операция была отменена.", + validPubkey: "Действительный pubkey! Вход...", + loginSuccessful: "Вход выполнен!", + loginErrorDebug: "Ошибка входа: {{error}}", + invalidResultDebug: "Неверный формат результата: {{result}}", + loggedInTitle: "Вы вошли", + amberLoginDesc: "Успешный вход через Amber!", + loginFailedTitle: "Ошибка входа", + loginFailedDesc: "Не удалось завершить вход через Amber. Попробуйте ещё раз.", + invalidPubkeyDesc: "Получен недействительный pubkey от Amber.", + sessionLostToast: "Данные сессии потеряны. Попробуйте ещё раз.", + eventSignedTitle: "Событие подписано", + eventSignedDesc: "Ваше событие подписано через Amber.", + signingFailedTitle: "Ошибка подписи", + signingFailedDesc: "Не удалось обработать подписанное событие от Amber.", + operationCompleteTitle: "Операция завершена", + operationCompleteDesc: "{{op}} завершено.", + }, + loginDialog: { + loginWithAmber: "Войти через Amber (Android)", + welcomeTitle: "Добро пожаловать в SkateSpots", + welcomeSubtitle: "Зарегистрируйтесь или войдите, чтобы продолжить", + newHere: "Впервые здесь?", + createFree: "Создайте бесплатный аккаунт. Email не нужен.", + createAccount: "Создать аккаунт", + orLogIn: "Или войдите", + loggedInTitle: "🛹 Вы вошли!", + loggedIn: "Вы вошли!", + connectedAmber: "Подключено через Amber!", + amberLoginFailed: "Ошибка входа через Amber", + amberCancelled: "Вход отменён. Нажмите «Открыть Amber», чтобы попробовать снова.", + amberNotFound: "Amber не найден. Убедитесь, что Amber установлен из ZapStore.", + loginFailed: "Ошибка входа", + pubkeyError: "Вставьте ваш hex-pubkey (64 символа) или npub из Amber", + pairedSigner: "Сопряжено с вашим подписантом.", + connectFailed: "Не удалось подключиться к вашему подписанту.", + openedEncrypted: "Ваш зашифрованный ключ открыт.", + openKeyFailed: "Не удалось открыть этот ключ.", + bunkerPrefix: "Должен начинаться с bunker://", + connectedBunker: "Подключено через bunker!", + bunkerFailed: "Ошибка: {{error}}", + checkBunkerUri: "Проверьте ваш bunker URI", + nsecPrefix: "Должен начинаться с nsec1", + invalidNsec: "Недействительный nsec: {{error}}", + checkKey: "Проверьте ваш ключ", + noExtensionTitle: "Расширение не найдено", + noExtensionDesc: "Установите Alby или другое расширение NIP-07.", + amberIdleDesc: "Ваш ключ остаётся внутри Amber. Одно нажатие — подтвердите в Amber, и вы вернётесь сюда уже авторизованным. Копировать ничего не нужно.", + continueWithAmber: "Продолжить с Amber", + noAmberGetIt: "Нет Amber? Скачать →", + waitingAmberTitle: "Ожидание Amber…", + waitingAmberDesc: "Подтвердите запрос в Amber. Вы войдёте автоматически, как только вернётесь.", + openAmberAgain: "Открыть Amber снова", + havingTrouble: "Есть проблемы? Введите ключ вручную", + enterPublicKey: "Введите ваш публичный ключ", + enterPublicKeyDescBefore: "Только если автоматический способ не сработал. В Amber: откройте профиль →", + copyPublicKey: "Скопировать публичный ключ", + enterPublicKeyDescAfter: "затем вставьте его сюда.", + connect: "Подключить", + back: "← Назад", + signInWithPhone: "Войдите через телефон", + signInWithPhoneDesc: "Отсканируйте приложением-подписантом (Amber, nsec.app). Ваш ключ никогда не покидает телефон.", + showPairingCode: "Показать код сопряжения", + waitingSigner: "Ожидание вашего подписанта…", + copyLink: "Скопировать ссылку", + orPasteBunker: "или вставьте bunker URL", + bunkerTitle: "Bunker (NIP-46)", + bunkerPasteBefore: "Вставьте ваш", + bunkerPasteAfter: "URI.", + amberInstructions: "Настройки → NIP-46 Bunker → Создать → Копировать", + nsecAppInstructions: "Подключить приложение → Копировать bunker URI", + secretKeyTitle: "Секретный ключ", + secretKeyRawDesc: "Вставьте ваш секретный ключ Nostr напрямую.", + secretKeyEncDesc: "Откройте резервную копию ключа, защищённую паролем.", + rawNsec: "Обычный nsec", + encryptedNip49: "Зашифровано (NIP-49)", + nsecWarning: "⚠️ Используйте только на доверенном устройстве. Никогда никому не передавайте ваш nsec.", + login: "Войти", + encSaferDesc: "Безопаснее: ключ остаётся зашифрованным, пока вы не введёте пароль, поэтому копию можно безопасно хранить в облаке или менеджере паролей.", + password: "Пароль", + openEncryptedKey: "Открыть зашифрованный ключ", + browserExtensionTitle: "Расширение браузера (NIP-07)", + browserExtensionDesc: "Лучше всего для компьютера. Работает с Alby, nos2x, Flamingo.", + loginWithExtension: "Войти через расширение", + }, + signupDialog: { + download: "Скачать", + stepChoose: "Выбор", + stepProfile: "Профиль", + stepSaveKey: "Сохранить ключ", + somethingWrong: "Что-то пошло не так", + createFailed: "Не удалось создать аккаунт. Попробуйте ещё раз.", + keySavedTitle: "Секретный ключ сохранён!", + keySavedDesc: "Ваш ключ надёжно сохранён.", + downloadFailedTitle: "Ошибка скачивания", + downloadFailedDesc: "Не удалось скачать файл ключа. Скопируйте его вручную.", + encSavedTitle: "Зашифрованная копия сохранена 🔐", + encSavedDesc: "Сохраните и файл, И пароль — для входа нужны оба.", + encFailed: "Не удалось зашифровать этот ключ.", + invalidFileTitle: "Неверный тип файла", + invalidFileDesc: "Выберите файл изображения для аватара.", + fileTooLargeTitle: "Файл слишком большой", + fileTooLargeDesc: "Изображение аватара должно быть меньше 5 МБ.", + avatarUploadedTitle: "Аватар загружен!", + avatarUploadedDesc: "Ваш аватар успешно загружен.", + uploadFailedTitle: "Ошибка загрузки", + uploadFailedDesc: "Не удалось загрузить аватар. Попробуйте ещё раз.", + nameRequiredTitle: "Требуется отображаемое имя", + nameRequiredDesc: "Выберите отображаемое имя, чтобы другие скейтеры знали, кто вы. Его можно изменить в любой момент.", + reserveFailedTitle: "Не удалось зарезервировать это имя", + reserveFailedDesc: "{{error}} Вы сможете занять его позже в настройках.", + profileCreatedTitle: "Профиль создан!", + profileCreatedDesc: "Ваш профиль настроен.", + profileFailedTitle: "Не удалось настроить профиль", + profileFailedDesc: "Аккаунт создан, но настройка профиля не удалась. Вы можете обновить его позже.", + welcomeToastTitle: "Добро пожаловать!", + welcomeToastDesc: "Ваш аккаунт готов.", + titleWelcome: "Присоединяйтесь к SkateSpots", + titleProfile: "Настройте свой профиль", + titleDone: "Добро пожаловать!", + createFreeAccount: "Создайте бесплатный аккаунт", + createFreeAccountDesc: "Без email, без телефона, без пароля. Ваш аккаунт — это ключ Nostr; выберите, где он будет храниться.", + recommended: "Рекомендуется", + signUpWithAmber: "Зарегистрироваться через Amber", + signUpWithAmberDesc: "Ваш ключ создаётся и хранится внутри приложения Amber — SkateSpots никогда к нему не прикасается. Максимально безопасно. Одно нажатие для подтверждения.", + continueWithAmber: "Продолжить с Amber", + orQuickWay: "или быстрый способ", + quickAccount: "Быстрый аккаунт на этом устройстве", + quickAccountDesc: "Мы создаём ключ, который хранится на этом устройстве. Самый быстрый старт — сразу после поможем сохранить резервную копию.", + createQuickAccount: "Создать быстрый аккаунт", + quickReassurance: "Займёт 5 секунд · хранится на этом устройстве · после поможем сделать копию", + preferAnotherSigner: "Предпочитаете другой подписант?", + iosDesktopNudge: "На iOS или компьютере? Приложение-подписант или расширение браузера — самый безопасный вариант —", + seeAllOptions: "Все варианты", + youreInPickName: "Вы в деле! 🛹 Выберите отображаемое имя, чтобы скейтеры знали, кто вы", + changeAnytime: "Его можно изменить позже в любой момент. Bio и аватар — по желанию.", + publishingProfile: "Публикация профиля...", + displayName: "Отображаемое имя", + displayNamePlaceholder: "напр. Tony, gnarlyGrind или имя вашего Crew", + displayNameHint: "Обязательно — так вас будут видеть в SkateSpots. Меняйте когда угодно.", + skateName: "Ваше имя в SkateSpots", + skateNameHint: "Бесплатно и по желанию — подтверждённый handle со значком ✓ в вашем профиле.", + bio: "Bio", + bioPlaceholder: "Расскажите о себе...", + avatar: "Аватар", + uploadAvatar: "Загрузить изображение аватара", + saving: "Сохранение...", + saveAndStart: "Сохранить и начать катать", + addNameToContinue: "Добавьте отображаемое имя, чтобы продолжить.", + savingPublishesNote: "Сохранение публикует ваш профиль в Nostr — подписант может один раз попросить подтверждение.", + youreIn: "Вы в деле! 🛹", + oneQuickThing: "Одно быстрое дело перед стартом…", + saveLoginKey: "Сохраните ключ для входа", + saveLoginKeyBefore: "Это", + only: "единственный", + saveLoginKeyAfter: "способ вернуться в аккаунт — без email, без сброса пароля. Сохраните его сейчас, и сможете входить с любого устройства, где бы вы ни катались.", + revealSaveKey: "Показать и сохранить мой ключ", + recoveryCopied: "Код восстановления скопирован. Храните его в надёжном месте.", + saved: "Сохранено", + treatLikeBoardKeys: "Относитесь к нему как к ключам от вашей доски — кто угодно с этим кодом управляет вашим аккаунтом. Никогда его не передавайте.", + hideEncBackup: "Скрыть зашифрованную копию", + saveEncBackup: "Сохранить зашифрованную копию", + encBackupBefore: "Копия, защищённая паролем — можно безопасно хранить в облаке или менеджере паролей. Вам понадобятся файл", + and: "и", + encBackupAfter: "пароль.", + choosePassword: "Выберите пароль", + saveEncBackupCta: "Сохранить зашифрованную копию", + savedCodeAria: "Я сохранил свой код восстановления", + savedCodeLabel: "Я сохранил свой код восстановления в надёжном месте — в менеджере паролей или записал оффлайн.", + letsSkate: "Погнали катать", + saveLater: "Сохраню позже в настройках", + advancedSigner: "Продвинутый вариант: использовать приложение-подписант", + }, + mnemonic: { + generatedTitle: "Фраза восстановления создана! 🎉", + generatedDesc: "Запишите эти 12 слов по порядку. Это ключ к вашему аккаунту!", + savedTitle: "Фраза восстановления сохранена!", + savedDesc: "Храните этот файл в надёжном месте.", + downloadFailedTitle: "Ошибка скачивания", + downloadFailedDesc: "Не удалось скачать файл. Скопируйте вручную.", + copiedTitle: "Скопировано в буфер обмена!", + copiedDesc: "Ваша фраза восстановления скопирована.", + qrWindowTitle: "QR-код фразы восстановления", + qrHeading: "QR-код вашей фразы восстановления", + qrAlt: "QR-код фразы восстановления", + qrWarning: "Держите этот QR-код в тайне и в надёжном месте!", + qrPrint: "Распечатать QR-код", + qrFailedTitle: "Ошибка QR-кода", + qrFailedDesc: "Не удалось создать QR-код.", + accountCreatedTitle: "Аккаунт создан! 🎉", + accountCreatedDesc: "Всё готово! Ваша фраза восстановления в безопасности.", + loginFailedTitle: "Ошибка входа", + loginFailedDesc: "Не удалось создать аккаунт. Попробуйте ещё раз.", + verifyFailedTitle: "Ошибка проверки", + verifyFailedDesc: "Слова не совпадают. Проверьте и попробуйте ещё раз.", + titlePrefix: "Создать аккаунт с помощью", + titleSuffix: "фразы восстановления", + twelveWordTitle: "Фраза восстановления из 12 слов", + twelveWordDesc: "Ваша фраза восстановления похожа на мастер-пароль. Запишите её на бумаге и храните в безопасности. Она понадобится для доступа к аккаунту с других устройств или если вы очистите данные браузера.", + generate: "Создать фразу восстановления", + useNsecInstead: "Использовать продвинутый nsec-ключ", + yourPhrase: "Ваша фраза восстановления", + copy: "Копировать", + download: "Скачать", + qrCode: "QR-код", + criticalWarning: "Критически важное предупреждение о безопасности", + warnWriteStrong: "Запишите её", + warnWrite: "на бумаге и храните в надёжном месте", + warnNeverShareStrong: "Никогда не передавайте", + warnNeverShare: "свою фразу восстановления никому", + warnBackupsStrong: "Делайте несколько копий", + warnBackups: "в разных надёжных местах", + warnAnyoneStrong: "Кто угодно с этой фразой", + warnAnyone: "навсегда получает контроль над вашим аккаунтом", + warnLoseStrong: "Если вы её потеряете", + warnLose: "вы безвозвратно потеряете аккаунт", + savedSecurely: "Я сохранил её надёжно", + verifyTitle: "Подтвердите фразу восстановления", + verifyDesc: "Чтобы убедиться, что вы сохранили её правильно, введите эти слова:", + wordLabel: "Слово №{{n}}", + wordPlaceholder: "Введите слово №{{n}}", + goBack: "Назад", + verifyCreate: "Подтвердить и создать аккаунт", + completeTitle: "Аккаунт создан!", + completeDesc: "Ваш аккаунт Nostr готов!", + signerTitle: "Рекомендуется: настройте приложение-подписант", + signerSubtitle: "Держите свои ключи в дополнительной безопасности", + signerDesc: "Для лучшей безопасности используйте отдельное приложение-подписант вместо вставки фразы восстановления куда попало. Приложения-подписанты хранят ключи в безопасности и позволяют пользоваться любым приложением Nostr.", + signerCta: "Узнать о приложениях-подписантах", + skip: "Пропустить пока", + }, + signupMethod: { + titlePrefix: "Выберите способ", + titleSuffix: "регистрации", + subtitle: "Оба способа безопасны. Выбирайте, что удобнее!", + recommended: "Рекомендуется", + mnemonicTitle: "Фраза восстановления", + mnemonicDesc: "12 легко запоминающихся слов. Отраслевой стандарт, используемый Bitcoin, Ethereum и большинством криптокошельков.", + mnemonicF1: "Легко записать на бумаге", + mnemonicF2: "Работает с другими приложениями Nostr (NIP-06)", + mnemonicF3: "Может создавать несколько аккаунтов", + mnemonicF4: "Привычно для криптопользователей", + useMnemonic: "Использовать фразу восстановления", + advanced: "Продвинутый", + nsecTitle: "Секретный ключ (nsec)", + nsecDesc: "Сырой криптографический ключ. Техничнее, но даёт прямой доступ к вашей личности в Nostr.", + nsecF1: "Прямой криптографический контроль", + nsecF2: "Совместим со всеми приложениями Nostr", + nsecF3: "Одна строка для резервной копии", + nsecF4: "Без слоя производных ключей", + useNsec: "Использовать секретный ключ", + footer: "🔒 Оба способа одинаково безопасны. Выбирайте по своему вкусу!", + }, + skateNip05: { + placeholder: "вашеимя", + claimedSuffix: "— ваш. Сохраните профиль, чтобы опубликовать его.", + checking: "Проверка доступности…", + available: "{{name}}@{{domain}} доступен", + claim: "Занять его", + hint: "Буквы, цифры, дефисы. Бесплатно и отображается как значок ✓ в вашем профиле.", + }, + nip05Required: { + getFree: "Получить бесплатный / недорогой NIP-05", + paid: "Платно", + requiredTitle: "Требуется верификация NIP-05", + bannerReason: "Чтобы предотвратить спам и укрепить доверие, {{role}} нужен подтверждённый адрес Nostr (NIP-05).", + gateReason: "Чтобы предотвратить спам и укрепить доверие, {{role}} должны пройти верификацию NIP-05.", + addInSettings: "Добавить NIP-05 в настройках", + explainer: "NIP-05 подтверждает вашу личность, связывая ваш профиль Nostr с доменом — например,", + updateProfile: "Обновить профиль", + }, + editProfile: { + uploadSuccessTitle: "Успех", + uploadSuccessDesc: "{{field}} успешно загружено", + uploadErrorDesc: "Не удалось загрузить {{field}}. Попробуйте ещё раз.", + mustBeLoggedIn: "Вы должны войти, чтобы обновить профиль", + invalidClinkTitle: "Неверный код CLINK", + invalidClinkDesc: "Это не похоже на действительный код noffer1… . Очистите поле или вставьте корректный код.", + invalidLightningTitle: "Неверный Lightning-адрес", + invalidLightningDesc: "Используйте адрес вида email, например you@walletofsatoshi.com.", + invalidSpTitle: "Неверный адрес Silent Payment", + invalidSpDesc: "Адрес Silent Payment начинается с «sp1» и довольно длинный. Очистите поле или вставьте корректный.", + invalidCordnTitle: "Неверная ссылка Cordn", + invalidCordnDesc: "Вставьте полную контактную ссылку Cordn вида https://… .", + updateSuccessTitle: "Успех", + updateSuccessDesc: "Ваш профиль обновлён", + updateErrorDesc: "Не удалось опубликовать профиль. Проверьте подключения к Relay в Настройки > Relays", + identityTitle: "Личность", + identityDesc: "Как вы выглядите в SkateSpots.", + displayName: "Отображаемое имя", + displayNamePlaceholder: "Ваше имя", + bio: "Bio", + bioPlaceholder: "Несколько слов о вас и вашем катании…", + profilePicture: "Фото профиля", + pictureDesc: "Загрузите или вставьте квадратное изображение.", + bannerImage: "Баннер", + bannerDesc: "Широкое изображение для верха вашего профиля.", + website: "Веб-сайт", + bitcoinTitle: "Bitcoin и платежи", + bitcoinDesc: "Позвольте людям делать вам Zap, чаевые и платить напрямую — без посредников.", + lightningAddress: "Lightning-адрес", + lud16Invalid: "Используйте адрес вида email, напр. you@yourdomain.com.", + lud16Ok: "Включает кнопку «Zap» в вашем профиле.", + lud16Hint: "Мгновенные чаевые в Bitcoin. Включает кнопку «Zap» в вашем профиле.", + silentPaymentAddress: "Адрес Silent Payment", + spInvalid: "Должен начинаться с «sp1» и быть довольно длинным.", + spOk: "Действителен — многоразовый приватный on-chain адрес.", + spHint: "Многоразовый статический on-chain адрес (BIP-352). Поделитесь один раз; каждый платёж неотслеживаем.", + clinkTipCode: "Код чаевых CLINK", + nofferInvalid: "Это не похоже на действительный код noffer1… .", + nofferOk: "Действителен — в вашем профиле появится кнопка «Tip in Bitcoin».", + nofferHint: "Self-custodial код CLINK, чтобы любой мог отправить вам чаевые через Nostr — без посредников.", + skateProfileTitle: "Скейт-профиль", + skateProfileDesc: "Ваши спонсоры и как Crew может с вами связаться.", + badges: "Значки", + badgesHint: "(подпись + необязательная ссылка)", + badgeExample: "напр. Independent Trucks", + badgeLabelPlaceholder: "Подпись значка…", + badgeUrlPlaceholder: "https://… (необязательно)", + removeBadge: "Удалить значок", + addBadge: "Добавить значок", + badgesDescBefore: "Спонсоры, Shop или люди, которые поддерживают ваше катание — и всё остальное, чем хотите похвастаться. Каждый становится кликабельным чипом в вашем профиле. Ваш", + badgesDescAfter: "значок участника добавляется автоматически.", + coordinator: "Координатор", + cordnInvalid: "Это не похоже на координатора. Вставьте nprofile, ссылку cordn.net или URL https:// .", + cordnOk: "Показывается в вашем профиле — другие могут добавить его одним нажатием.", + cordnHint: "Координатор Cordn, который другие используют, чтобы написать вам. Приватно, зашифровано, ваше.", + useMyCoordinator: "Использовать мой координатор", + accountTitle: "Аккаунт", + accountDesc: "Дополнительные настройки аккаунта.", + botAccount: "Бот-аккаунт", + botAccountDesc: "Отметить этот аккаунт как автоматизированный или бот.", + saving: "Сохранение…", + saveProfile: "Сохранить профиль", + nip05VerifiedHandle: "Подтверждённый handle NIP-05", + nip05How: "Как?", + extraHandles: "Дополнительные handle", + extraHandlesHint: "необязательно — до 5 штук", + nip05HintEmpty: "Подтверждённый handle вида you@yourdomain.com — версия «синей галочки» в Nostr. Показывает значок ✓ в вашем профиле и открывает фильтр «Проверенные» в каталоге скейтеров.", + nip05Invalid: "Используйте handle вида email, напр. you@yourdomain.com — без «https://» и пробелов.", + nip05Checking: "Проверка вашего домена…", + nip05Verified: "Подтверждено — ваш домен подтверждает, что этот handle принадлежит вам. ✓", + nip05Mismatch: "Ваш домен сопоставляет этот handle с ДРУГИМ ключом. Исправьте .well-known/nostr.json, чтобы он указывал на этот аккаунт.", + nip05Unreachable: "Пока не удалось получить доступ к /.well-known/nostr.json вашего домена. Сохранённые handle заработают, когда домен будет настроен правильно.", + nip05Enter: "Введите ваш handle NIP-05.", + freeHandleBefore: "Нет собственного домена? Занять бесплатный", + freeHandleAfter: "handle от SkateSpots.", + uploadLabel: "Загрузить {{label}}", + previewLabel: "Предпросмотр {{label}}", + }, + security: { + recoveryCopied: "Код восстановления скопирован. Храните его в надёжном месте.", + savedTitle: "Сохранено!", + recoveryDownloaded: "Код восстановления скачан. Храните его в надёжном месте.", + downloadFailedTitle: "Ошибка скачивания", + downloadFailedDesc: "Скопируйте его вручную.", + loginRequired: "Требуется вход", + loginRequiredDesc: "Войдите, чтобы получить доступ к настройкам безопасности.", + backupConfirmedTitle: "Копия подтверждена! ✅", + backupConfirmedDesc: "Отлично! Ваши ключи в безопасности.", + yourRecoveryCode: "Ваш код восстановления", + recoveryCodeDesc: "Не сохранили его при регистрации? Здесь вы можете получить его в любой момент.", + recoveryCodeBefore: "Этот код —", + only: "единственный", + recoveryCodeAfter: "способ снова войти на новом устройстве или в браузере. Сохраните его в надёжном месте (менеджер паролей или на бумаге). Кто угодно с ним получает контроль над вашим аккаунтом — никогда не передавайте его.", + revealRecovery: "Показать мой код восстановления", + qrHint: "Отсканируйте другим приложением Nostr, чтобы войти. Держите этот экран в тайне.", + neverShareHide: "⚠️ Никогда не передавайте это. Скройте, когда закончите.", + hide: "Скрыть", + amberNoteBefore: "Вы вошли через", + amberNoteAfter: ". Ваш код восстановления хранится внутри Amber — откройте приложение Amber, чтобы сделать копию. SkateSpots никогда не видит ваш ключ.", + bunkerNoteBefore: "Вы вошли через", + remoteSigner: "удалённый подписант (bunker)", + bunkerNoteAfter: ". Ваш код восстановления хранится в сервисе подписанта, а не в SkateSpots. Сделайте копию там.", + extensionNoteBefore: "Вы вошли через", + browserExtension: "расширение браузера", + extensionNoteAfter: ". Ваш код восстановления хранится в расширении — используйте его собственный вариант резервной копии/экспорта. SkateSpots никогда не видит ваш ключ.", + otherNote: "Ваш код восстановления управляется приложением-подписантом, а не SkateSpots. Сделайте копию там.", + backupWarningTitle: "⚠️ Вы сделали резервную копию фразы восстановления или секретного ключа?", + backupWarningBody: "Ваши ключи — ЕДИНСТВЕННЫЙ способ получить доступ к аккаунту. Если вы их потеряете, вы потеряете всё — сброса пароля нет!", + iveBackedUp: "Я сделал резервную копию ключей", + backupConfirmed: "✅ Копия подтверждена", + backupNotConfirmed: "⚠️ Копия не подтверждена", + backupConfirmedStatusDesc: "Вы подтвердили, что ваши ключи надёжно сохранены.", + backupNotConfirmedDesc: "Обязательно сделайте резервную копию фразы восстановления или секретного ключа!", + notSavedYetBefore: "Ещё не сохранили код восстановления? Не проблема — возьмите его в", + notSavedYetAfter: "разделе выше, сохраните в надёжном месте, затем подтвердите ниже.", + yesBackedUp: "Да, я сделал резервную копию ключей", + bestPracticesTitle: "Лучшие практики безопасности ключей", + bestPracticesDesc: "Как защитить ваш аккаунт Nostr", + bp1Title: "Запишите на бумаге", + bp1Desc: "Физическая копия — самая надёжная. Храните в защищённом месте, например в сейфе.", + bp2Title: "Несколько копий", + bp2Desc: "Храните копии в разных надёжных местах (домашний сейф, банковская ячейка и т. д.)", + bp3Title: "Никогда не передавайте ключи", + bp3Desc: "Настоящие приложения Nostr НИКОГДА не запрашивают ваш nsec или фразу восстановления после первого входа", + bp4Title: "Не храните в облаке без шифрования", + bp4Desc: "Избегайте Google Docs, черновиков email или облачного хранилища с открытым текстом", + bp5Title: "Подумайте о расширении браузера", + bp5Desc: "Alby, nos2x или Flamingo надёжно хранят ваши ключи и никогда не показывают их сайтам", + importantReminders: "⚠️ Важные напоминания", + rem1: "Если вы потеряете ключи, вы безвозвратно потеряете аккаунт", + rem2: "Ни одна компания или человек не может сбросить ваш пароль — даже мы", + rem3: "Кто угодно с вашими ключами получает полный контроль над аккаунтом", + rem4: "Ваши ключи управляют всеми вашими данными Nostr во ВСЕХ приложениях", + recommendedSigners: "🔌 Рекомендуемые подписанты Nostr", + recommendedSignersDesc: "Используйте подписант Nostr для лучшей безопасности и удобства", + recommended: "Рекомендуется", + amberDesc: "Безопасный подписант Nostr для Android. Надёжно хранит ключи на телефоне и подписывает события, не раскрывая их.", + albyDesc: "Полнофункциональное расширение с Lightning-кошельком, поддержкой WebLN и NWC.", + flamingoDesc: "Простой, чистый интерфейс. Сфокусирован на подписи Nostr без функций кошелька.", + nos2xDesc: "Минималистичное, лёгкое расширение для продвинутых пользователей.", + nostrConnectTitle: "☁️ Nostr Connect (удалённые подписанты)", + nostrConnectDesc: "Используйте удалённый подписант для доступа к аккаунту с любого устройства", + nostrConnectBody: "Nostr Connect (также называемый «bunker») позволяет хранить ключи на защищённом сервере и входить с любого устройства. Ваши ключи никогда не покидают сервер, но аккаунтом можно пользоваться где угодно!", + nsecAppDesc: "Бесплатный, безопасный удалённый подписант. Создайте bunker:// URI и вставьте при входе.", + nostrumDesc: "Ещё один вариант удалённого подписанта с поддержкой мобильных устройств.", + howToUse: "💡 Как пользоваться:", + howToUseDesc: "Создайте аккаунт в одном из этих сервисов, получите строку подключения bunker:// и вставьте её во вкладке «Nostr Connect» при входе.", + }, + relayList: { + connected: "Подключено", + connecting: "Подключение…", + offline: "Оффлайн", + removeUrl: "Удалить {{url}}", + add: "Добавить", + publishedTitle: "Список Relay опубликован", + publishedDesc: "Синхронизировано с Nostr (kind 10002).", + publishFailedTitle: "Не удалось опубликовать список Relay", + invalidUrlTitle: "Неверный URL Relay", + invalidUrlDesc: "Попробуйте что-то вроде wss://relay.example.com", + alreadyInList: "Relay уже в вашем списке", + keepReadWriteTitle: "Оставьте чтение или запись для", + keepReadWriteDesc: "Relay нужен хотя бы один режим из чтение/запись.", + alreadyInThisList: "Relay уже в этом списке", + dmPublishedTitle: "Relay для DM опубликованы", + dmPublishedDesc: "Входящие NIP-17 обновлены.", + dmPublishFailedTitle: "Не удалось опубликовать Relay для DM", + nip65Title: "Relays (NIP-65)", + nip65DescUser: "Нажмите Read / Write для переключения. Публикуется в Nostr как ваш список kind 10002.", + nip65DescLoggedOut: "Нажмите Read / Write для переключения. Войдите, чтобы опубликовать список в Nostr.", + noRelays: "Пока нет Relays — добавьте ниже.", + local: "Локальный", + read: "Чтение", + readHint: "Получать контент с этого Relay", + write: "Запись", + writeHint: "Публиковать ваши события на этот Relay", + dmTitle: "Relays для входящих DM", + dmDesc: "Где вы получаете личные сообщения NIP-17 (kind 10050). Если пусто, используются ваши write-Relays.", + localTitle: "Локальные Relays", + localDesc: "Только для приложения (напр. узел в локальной сети). Используются для чтения и записи; никогда не публикуются.", + blockedTitle: "Заблокированные Relays", + blockedDesc: "Никогда не подключаться к ним — исключены из любого чтения и записи.", + }, + relatr: { + searchingTitle: "Поиск сервиса Relatr...", + searchingDesc: "Запрос профилей Relatr в Nostr", + foundTitle: "Сервис Relatr найден!", + foundDesc: "Сервис: {{name}}", + unknown: "Неизвестно", + notFoundTitle: "Сервис Relatr не найден", + notFoundDesc: "Попробуйте ввести pubkey вручную или проверьте https://www.relatr.xyz/", + searchFailedTitle: "Поиск не удался", + searchFailedDesc: "Не удалось запросить у Nostr профили Relatr", + invalidPubkeyTitle: "Неверный pubkey", + invalidPubkeyDesc: "Введите действительный hex-pubkey из 64 символов", + enabledTitle: "Relatr включён!", + enabledDesc: "Глобальные оценки доверия теперь активны.", + disabledTitle: "Relatr отключён", + disabledDesc: "Оценки доверия больше не загружаются.", + title: "Оценки доверия Relatr", + desc: "Глобальные оценки доверия помогают выявлять надёжных пользователей и уменьшать спам", + status: "Статус", + active: "Активно", + disabled: "Отключено", + activeStrong: "Relatr активен.", + activeDesc: "Оценки доверия из глобального сетевого анализа ContextVM помогают выявлять надёжных скейтеров и уменьшать спам.", + disabledStrong: "Relatr отключён.", + disabledHint: "Включите его, чтобы получать оценки доверия из глобальной сети Nostr.", + disable: "Отключить Relatr", + enable: "Включить Relatr", + advancedSettings: "Дополнительные настройки", + servicePubkey: "Pubkey сервиса Relatr", + pubkeyPlaceholder: "Введите hex-pubkey из 64 символов...", + searching: "Поиск...", + autoDiscover: "Автообнаружение", + pubkeyDefault: "По умолчанию: официальный сервис Relatr от ContextVM (npub1dvmc...)", + relayLabel: "Relay (где Relatr публикует оценки)", + relayDefault: "По умолчанию: wss://relay.contextvm.org (официальный relay ContextVM)", + applyChanges: "Применить изменения", + learnMore: "Подробнее:", + website: "Сайт Relatr", + github: "Relatr на GitHub", + nip85Spec: "Спецификация NIP-85", + }, + followList: { + unfollow: "Отписаться", + title: "Ваша сеть Nostr", + desc: "Управляйте тем, на кого вы подписаны. Подписки помогают строить вашу сеть доверия и определяют, какие Spot показывают значки доверия.", + following: "Подписки ({{count}})", + followers: "Подписчики ({{count}})", + follow: "Подписаться", + followHint: "💡 Вставьте pubkey Nostr (npub1...), адрес NIP-05 (user@domain.com) или hex-pubkey", + notFollowing: "Вы пока ни на кого не подписаны", + notFollowingHint: "Подписывайтесь на скейтеров, чтобы видеть их Spot со значками ✅ VERIFIED", + trustActiveStrong: "✅ Значки доверия активны:", + trustActive: "Spot, созданные людьми, на которых вы подписаны, теперь будут показывать значки VERIFIED. Spot от их друзей будут показывать значки TRUSTED.", + noFollowers: "Пока нет подписчиков", + noFollowersHint: "Поделитесь своим профилем Nostr, чтобы получить подписчиков!", + howTitle: "💡 Как подписки влияют на значки доверия", + verifiedStrong: "✅ VERIFIED (зелёный):", + verifiedDesc: "Spot, созданные людьми, на которых вы подписаны напрямую", + trustedStrong: "🟡 TRUSTED (жёлтый):", + trustedDesc: "Spot, созданные людьми, на которых подписаны ваши друзья (2 рукопожатия)", + unverifiedStrong: "⚪ Не подтверждено:", + unverifiedDesc: "Spot от пользователей без связи с вашей сетью", + tip: "💡 Совет: подписывайтесь на активных скейтеров, чтобы видеть больше подтверждённых Spot и строить свою сеть доверия!", + }, + notify: { + enableTitle: "Включить уведомления", + enableDesc: "Пусть устройство сообщает вам, когда что-то требует внимания.", + checkingPermission: "Проверка разрешения…", + unsupported: "Это устройство не поддерживает уведомления здесь. Пересоберите приложение для Android, чтобы включить их на телефоне.", + denied: "Уведомления заблокированы для этого сайта. Разрешите их в настройках браузера/ОС и попробуйте снова.", + backgroundTitle: "Фоновые уведомления", + backgroundDesc: "Получайте уведомления о сообщениях и сделках, даже когда SkateSpots закрыт.", + pushUnsupported: "Этот браузер не поддерживает фоновые push-уведомления. На мобильном добавьте SkateSpots на главный экран.", + pushPrivacy: "Чтобы дотянуться до вас, когда приложение закрыто, сервер уведомлений SkateSpots получает сигнал от вашего Relay, когда что-то приходит на ваш ключ, и передаёт его в push-сервис вашего телефона. Он видит только то, что у вашего ключа что-то есть — никогда кто отправил или что там сказано, и не может расшифровать ваши сообщения. Включается отдельно на каждом устройстве.", + bgDeliveryTitle: "Фоновая доставка (Android)", + bgDeliveryDesc: "Проверять новые сообщения, предложения и сделки, пока приложение закрыто — без сервисов Google.", + off: "Выкл.", + standard: "Стандартно (~15 мин)", + fast: "Быстро (~5 мин)", + bgDeliveryNote: "Стандартный режим — по возможности, Android может отложить его в Doze. Быстрый показывает постоянное уведомление и расходует больше батареи. Ничего не расшифровывается на нашем сервере.", + notifyMeAbout: "Уведомлять меня о", + couldNotEnable: "Не удалось включить", + sendTest: "Отправить тестовое уведомление", + testTitle: "Уведомления SkateSpots включены 🛹", + testBody: "Так будет выглядеть DM, Zap или приглашение в Crew.", + footerBefore: "Оповещения создаются на вашем устройстве из данных, которые уже есть у приложения, а оповещения о личных сообщениях никогда не расшифровывают ваши сообщения — поэтому Amber никогда не просят открыть их. С", + footerAfter: "(выкл.) полностью закрытое приложение недоступно, поэтому оповещения придут в следующий раз, когда вы откроете SkateSpots.", + cat_dms_label: "Личные сообщения", + cat_dms_hint: "Кто-то отправляет вам личное сообщение", + cat_crew_label: "Crews", + cat_crew_hint: "Приглашения, заявки на вступление и подтверждения членства", + cat_social_label: "Zaps, ответы и упоминания", + cat_social_hint: "Реакции, репосты, Zaps, ответы и обновления событий", + cat_newsletter_label: "Рассылка", + cat_newsletter_hint: "Новинки SkateSpots (только для подписчиков)", + cat_trades_label: "Предложения и сделки", + cat_trades_hint: "Предложения, встречные предложения и подтверждения сделок", + cat_reminders_label: "Напоминания о событиях", + cat_reminders_hint: "Напоминание за час до событий, которые вы собираетесь посетить (приложение для Android)", + }, + regionBackfill: { + taggedTitle: "Помечено {{count}} мест{{s}}", + taggedSkipped: "{{count}} пропущено (нет координат или совпадений геокодера).", + taggedOk: "Теги регионов записаны на общественный Relay.", + nothingTitle: "Нечего помечать", + nothingDesc: "Ни одну метку не удалось геокодировать. Попробуйте позже.", + failedTitle: "Заполнение не удалось", + title: "Заполнить теги регионов", + admin: "Админ", + descBefore: "Метки, созданные до появления геокодирования, имеют координаты, но без тега города/страны, поэтому карта их рисует, а Community Stats может сказать только «Без категории». Это заново выводит теги из каждой метки и публикует", + descStrong: "ваши собственные", + descAfter: "Spot и Shop без тегов.", + scanning: "Сканирование ваших Spot…", + allTagged: "У каждого вашего Spot и Shop уже есть тег региона. 🎉 Оставшиеся метки «Без категории» принадлежат другим мэпперам — пометить их могут только их собственные ключи.", + countLine: "{{count}} из ваших Spot{{s}}/Shop без тега региона. Ваш подписант может запросить подтверждение для каждого.", + tagging: "Пометка {{done}}/{{total}}…", + run: "Заполнить теги регионов", + summary: "{{updated}} обновлено · {{skipped}} пропущено · {{failed}} с ошибкой", + }, + adminReview: { + title: "Очередь проверки", + flagged: "{{count}} Spot{{s}} срабатывают на сигналы мусора — скрыть или отклонить.", + clean: "Spot, которые выглядят как тестовые записи или оффтопные метки.", + }, + grantPro: { + invalidNpub: "Введите действительный npub (или hex-pubkey)", + invalidDays: "Количество дней должно быть положительным числом", + grantedTitle: "Pro предоставлен ⚡", + grantedDesc: "{{npub}} до {{date}}", + failedTitle: "Не удалось предоставить", + title: "Предоставить Sasquatch Pro", + owner: "Владелец", + desc: "Ручной запасной вариант для подтверждённого платежа, который не отследил zap receipt. Публикует грант, подписанный владельцем; пользователь не может его подделать.", + targetPlaceholder: "npub1… (или hex)", + grant: "Предоставить", + }, + myData: { + reactionTitle: "Реакция {{emoji}}", + deleting: "Удаление...", + requestDeletion: "Запросить удаление", + selectContentTitle: "Выберите контент для удаления", + selectContentDesc: "Выберите конкретные элементы, для которых хотите запросить удаление.", + all: "Все", + spots: "Spot", + events: "События", + shops: "Shop", + listings: "Объявления", + collections: "Коллекции", + lab: "The Lab", + posts: "Посты", + reactions: "Реакции", + selectAll: "Выбрать все", + selectAllVisible: "Выбрать все видимые", + selectedCount: "Выбрано: {{count}}", + noItemsCategory: "В этой категории нет элементов", + decentralizedStrong: "Важно:", + decentralizedNote: "Nostr децентрализован. Relays должны исполнять запросы на удаление, но некоторые могут этого не делать. Это не гарантированное окончательное удаление.", + deleteCount: "Удалить {{count}} элемент{{s}}", + noDataTitle: "Нет данных для экспорта", + noDataDesc: "Вы пока не опубликовали ни одного события.", + exportedTitle: "Данные экспортированы!", + exportedDesc: "Скачано событий: {{count}} (JSON).", + deletionRequestedTitle: "Удаление запрошено", + deletionRequestedDesc: "Запрос на удаление опубликован на Relays.", + deletionRequestedMany: "Запрошено удаление {{count}} элементов. Примечание: некоторые Relays могут не исполнить этот запрос.", + deletionFailedTitle: "Удаление не удалось", + deletionFailedDesc: "Не удалось опубликовать запрос на удаление. Попробуйте ещё раз.", + loginRequired: "Требуется вход", + loginRequiredDesc: "Войдите, чтобы просматривать и управлять своими данными.", + title: "Мои данные", + desc: "Ваш контент в сети Nostr. Эти данные принадлежат вам — экспортируйте в любой момент или запросите удаление.", + coachFilmer: "Тренер/Оператор", + zaps: "Zap", + received: "Получено", + exportAll: "Экспортировать все данные", + recentActivity: "Недавняя активность", + viewAll: "Посмотреть все ({{count}})", + noDataPublished: "Пока ничего не опубликовано", + startBy: "Начните с", + addingASpot: "добавления Spot", + aboutYourData: "О ваших данных", + ownDataStrong: "Данные принадлежат вам.", + ownData: "Весь контент подписан вашими криптографическими ключами и хранится на Relays Nostr. Ни одна компания им не управляет.", + exportAnytimeStrong: "Экспорт в любой момент", + exportAnytime: "- скачайте все свои события в формате JSON", + portableStrong: "Переносимость", + portable: "- используйте свои ключи в любом приложении Nostr", + selectiveStrong: "Выборочное удаление", + selective: "- выбирайте, что именно удалить", + caveatStrong: "Оговорка о децентрализации", + caveat: "- некоторые Relays могут сохранить данные несмотря на запросы на удаление", + }, + settingsPage: { + seoTitle: "Настройки - SkateSpots", + seoDescription: "Управляйте настройками аккаунта SkateSpots.", + heading: "НАСТРОЙКИ", + subtitle: "Параметры аккаунта и приложения", + editProfile: "Редактировать профиль", + profileRefreshed: "Профиль обновлён!", + found: "Найден: {{name}}", + unnamed: "без имени", + profileNotFound: "Профиль не найден", + notFoundOnRelay: "Не найден ни на одном Relay.", + refreshFailed: "Обновление не удалось", + refreshFailedDesc: "Не удалось подключиться к Relays.", + loginToEdit: "Войдите, чтобы редактировать профиль", + noProfileRelays: "Мы не нашли профиль на Relays. Если вы уже создавали его, попробуйте обновить.", + checkDisplayName: "отображаемое имя", + checkPhoto: "фото профиля", + checkBio: "короткое bio", + checkLightning: "Lightning-адрес, чтобы люди могли делать вам Zap", + checkHandle: "бесплатный handle @skate-spots.org", + finishProfile: "Завершите свой профиль", + addItem: "Добавить {{item}}", + nip05Title: "Верификация NIP-05", + nip05Desc: "Получите подтверждённый адрес Nostr (например, name@domain.com), чтобы укрепить доверие. Требуется для создания событий, профилей тренеров и Shop.", + freeFromSkateSpots: "Бесплатно от SkateSpots", + claimHandleBefore: "Занять handle вида", + claimHandleAfter: "— без регистрации, без оплаты, без собственного домена. Займите его во вкладке «Профиль», затем сохраните.", + claimInProfile: "Занять в профиле", + nip05Footer: "После получения NIP-05 добавьте его в поле профиля и сохраните.", + localRelayOn: "Локальный Relay включён", + localRelayOff: "Локальный Relay выключен", + lookingForCitrine: "Поиск Citrine на этом устройстве…", + noLongerUsing: "Больше не используется Relay на устройстве.", + localRelay: "Локальный Relay", + citrineOff: "Быстрое чтение и оффлайн-копия на этом устройстве", + citrineSearching: "Поиск Citrine на этом устройстве…", + citrineLive: "Подключено — чтение и копия локально", + citrineWaiting: "Включено — запустите Citrine для подключения", + toggleCitrine: "Переключить локальный Relay Citrine", + citrineDetected: "Relay Citrine обнаружен", + citrineLooking: "Поиск Citrine…", + citrineNotDetected: "Citrine не обнаружен", + recheckCitrine: "Повторно проверить Relay Citrine", + checking: "Проверка", + recheck: "Проверить снова", + chipInstantReads: "Мгновенное чтение", + chipWorksOffline: "Работает оффлайн", + chipOnDeviceBackup: "Копия на устройстве", + cantReachStrong: "Не удаётся связаться с Citrine.", + cantReachBefore: "Убедитесь, что бесплатное приложение Citrine установлено, а его Relay", + started: "запущен", + cantReachAfter: ", затем нажмите «Проверить снова». Оно запускает приватный Relay Nostr на вашем телефоне для мгновенного чтения и оффлайн-копии.", + citrineStep1Before: "Откройте Citrine → нажмите", + start: "Запустить", + citrineStep2Before: "Вернитесь сюда → нажмите", + getCitrine: "Скачать Citrine", + citrinePrivacy: "Ваш Stash и сообщения остаются end-to-end зашифрованными здесь, как и везде. Локальный Relay только ускоряет работу и хранит копию на вашем устройстве — он никогда не заменяет шифрование.", + communityRelayDisabled: "Общественный Relay отключён", + communityRelayEnabled: "Общественный Relay включён", + usingOnlyPersonal: "Используются только ваши настроенные Relays.", + skateRelayIncluded: "Relay SkateSpots включён.", + relays: "Relays", + relayPrivacyBefore: "Relays могут видеть ваш", + ipAddress: "IP-адрес", + relayPrivacyAfter: "при подключении. Tor скрывает его — а «бесплатный» VPN считайте тревожным сигналом; обычно они зарабатывают на вашем трафике.", + communityRelay: "Общественный Relay", + syncingGlobal: "Синхронизация с глобальным скейт-сообществом", + usingOnlyPersonalShort: "Используются только личные Relays", + appearance: "Внешний вид", + language: "Язык", + darkModeOnly: "Только тёмный режим", + darkModeDesc: "SkateSpots использует тёмную неоновую эстетику, вдохновлённую скейт-культурой. Чёрный фон, неоновый розовый, лаймовый и оранжевый.", + navigation: "Навигация", + sasquatchExpanded: "Sasquatch развёрнут! 🦧 Обновите страницу, чтобы увидеть его.", + advanced: "Продвинутое", + sasquatchGuide: "🦧 Гид Sasquatch", + sasquatchResetDesc: "Сбросить обучающий гид в развёрнутый вид", + expandSasquatch: "Развернуть Sasquatch", + wallet: "Кошелёк", + loginToWallet: "Войдите, чтобы управлять кошельком", + openWallet: "Открыть кошелёк", + balanceSendReceive: "Баланс, отправка, получение", + connectNwc: "Подключить кошелёк NWC", + account: "Аккаунт", + security: "Безопасность", + securitySub: "Ключи, подпись, Amber", + nip05Sub: "Получите подтверждённый адрес Nostr", + app: "Приложение", + myStash: "Мой Stash", + myStashSub: "Приватный инвентарь Gear", + relaysSub: "Подключения к Relay Nostr", + appearanceSub: "Язык и тема", + assistant: "Ассистент", + showSasquatch: "Показывать ассистента Sasquatch", + showSasquatchDesc: "Показывать плавающую кнопку Sasquatch на карте и других экранах.", + showMapFooter: "Показывать панель ссылок карты", + showMapFooterDesc: "Показывать тонкую полосу ссылок внизу карты.", + notifications: "Уведомления", + notificationsSub: "Оповещения о DM, Crews и Zaps", + coordinator: "Координатор", + coordinatorSub: "Ваш групповой сервер Cordn", + data: "Данные", + myData: "Мои данные", + myDataSub: "Экспорт, импорт, управление", + advancedSub: "Relatr, Sasquatch, инструменты", + notLoaded: "Не загружено", + notLoggedIn: "Не выполнен вход", + }, + onboarding: { + seoTitle: "Начать — SkateSpots", + seoDescription: "Присоединяйтесь к децентрализованному скейт-сообществу. Находите Spot, общайтесь с тренерами, отправляйте Zap. Бесплатно навсегда.", + homeSetTitle: "Дом установлен 🛹", + homeSetDesc: "Теперь карта будет открываться в вашем районе.", + locationFailedTitle: "Не удалось определить местоположение", + locationFailedDesc: "Проверьте разрешения на геолокацию или выберите район на карте.", + niceTitle: "🎉 Отлично!", + niceDesc: "Теперь вы понимаете, как работает Nostr. Погнали кататься!", + npubCopied: "npub скопирован в буфер обмена.", + saveLoginNow: "Сохраните данные для входа — сделайте это сейчас", + saveLoginNowDesc: "Код восстановления — единственный способ вернуться в аккаунт. Без email, без сброса пароля.", + betaBadge: "Бета — открыто для скейтеров по всему миру", + headline1: "КАТАЙ", + headline2: "СВОЙ МИР", + heroBefore: "", + decentralized: "Децентрализованное", + heroAfter: "скейт-сообщество. Ни одна компания им не владеет. Никакой алгоритм не скрывает ваши Spot. Никакого бана. Только скейтеры.", + pillMap: "Карта Spot", + pillCoaches: "Тренеры и фильмеры", + pillEvents: "События", + pillGear: "Купить/продать Gear", + pillZaps: "Zap в Bitcoin", + pillStash: "Stash Gear", + pillCrews: "Crews", + createFreeAccount: "Создайте бесплатный аккаунт", + noEmailNoPassword: "Без email. Без пароля. Ваша личность навсегда.", + findSpots: "Найдите Spot рядом", + addFirstSpot: "Добавьте первый Spot", + accountCreated: "Вы в деле! Аккаунт создан ✓", + identityYours: "Ваша личность принадлежит вам — она хранится в вашем ключе, а не на наших серверах.", + whereSkate: "Где вы катаетесь?", + whereSkateDesc: "Укажите свой домашний район один раз, и карта каждый раз будет открываться на ваших Spot. Ваш GPS не покидает устройство.", + useMyLocation: "Использовать моё местоположение", + pickOnMap: "Выбрать на карте", + loginSaved: "Данные для входа сохранены — аккаунт можно восстановить.", + whyBother: "Зачем это нужно?", + why1Title: "Каждый Spot на одной карте", + why1Body: "Леджы, перила, DIY, парки — нанесены на карту скейтерами, которые реально на них катаются. Проверяйте статус перед выездом, чтобы не потратить сессию впустую.", + why2Title: "Сделано скейтерами, а не менеджерами", + why2Body: "Без рекламы, без алгоритма, пихающего мусор вам в лицо, без сбора данных. Открытый исходный код. Карта принадлежит сообществу — в том числе вам.", + why3Title: "Получайте деньги за то, что катаетесь", + why3Body: "Отметьте жемчужину на карте, снимите крутой трюк, проведите сессию — и получайте Zap реальным Bitcoin прямо в кошелёк. Без комиссии платформы, без посредников.", + why4Title: "Ваш аккаунт действительно ваш", + why4Body: "Один ключ открывает вход во все приложения Nostr. Ни одна компания не сможет заблокировать вас или удалить аккаунт по прихоти. Забирайте свою личность куда угодно.", + everythingFree: "Всё, что вы можете делать, — бесплатно", + featSpots: "Находите Spot", + featSpotsDesc: "Интерактивная карта с тысячами Spot по всему миру", + featLab: "The Lab", + featLabDesc: "Находите тренеров, фильмеров и видеомонтажёров рядом", + featEvents: "События", + featEventsDesc: "Соревнования, сессии, встречи", + featGear: "Купить/продать Gear", + featGearDesc: "P2P-маркетплейс для б/у скейт-Gear", + featStash: "Мой Stash", + featStashDesc: "Приватный зашифрованный инвентарь всего, чем вы владеете", + featCrews: "Crews", + featCrewsDesc: "Катайтесь со своим Crew — общие Spot, чат и сессии", + whatIsNostr: "Что такое Nostr?", + whatIsNostrSub: "Протокол, на котором работает SkateSpots", + nostrBefore: "Nostr — открытый протокол, как email, но для социальных приложений. Ваш аккаунт — это", + cryptoKeyPair: "криптографическая пара ключей", + nostrAfter: ", которой вы владеете. Ни одна компания не контролирует ваш аккаунт или данные — вы выбираете, какие Relays их хранят, и даже можете запустить свой. Ваша личность работает во всех приложениях Nostr.", + nostrPoint1: "Вы владеете своими данными и ключами", + nostrPoint2: "Ни одна компания не может вас забанить", + nostrPoint3: "Личность работает везде", + nostrPoint4: "Чаевые в Bitcoin напрямую", + deepDive: "Подробнее: как работает Nostr", + privacyTip: "Совет по приватности: ваш GPS не покидает устройство. Серверы, к которым вы подключаетесь (например, тайлы карты), всё же видят ваш IP — если хотите скрыть и его, подойдёт VPN или Tor. Полностью необязательно.", + readPrivacy: "Прочитайте нашу страницу о приватности", + zapsWallet: "⚡ Zap и кошелёк", + optional: "Необязательно", + walletDesc: "Zap — это чаевые в Bitcoin, которые вы отправляете напрямую скейтеру, который закинул крутой Spot, снял мощный клип или провёл отличную сессию. Без комиссии платформы. Без посредников. 100% достаётся ему.", + builtInWallet: "Встроенный кошелёк Cashu", + builtInWalletDesc: "Получайте платежи Lightning прямо в приложении. Без настройки.", + balance: "Баланс", + connectExternal: "Подключить внешний кошелёк", + connectExternalDesc: "У вас Alby, Mutiny или другой кошелёк? Подключите его через NWC.", + connectViaNwc: "Подключить через NWC", + loginToConnect: "Войдите, чтобы подключить свой кошелёк.", + fiveDollars: "💡 $5 в Bitcoin = сотни Zap для всего сообщества", + commonQuestions: "Частые вопросы", + faq1Q: "SkateSpots бесплатен?", + faq1A: "100% бесплатно. Просматривайте Spot, добавляйте локации, находите тренеров, создавайте события, присоединяйтесь к сессиям — всё бесплатно, навсегда. Bitcoin (Zap) необязателен, если хотите поддержать авторов.", + faq2Q: "Что такое Nostr и почему SkateSpots использует его?", + faq2Before: "Nostr — открытый протокол для децентрализованных приложений, что-то вроде самого интернета, которым не владеет ни одна компания. Ваш аккаунт SkateSpots — это криптографическая пара ключей, которой", + faq2Strong: "владеете вы", + faq2After: ". Ни одна компания не может забанить ваш аккаунт или удерживать ваши данные в заложниках — вы выбираете, какие Relays хранят данные, и даже можете запустить свой. Ваша личность также работает в других приложениях Nostr, таких как Primal, Damus или Amethyst.", + faq3Q: "Что такое nsec и почему это важно?", + faq3Before: "Ваш", + faq3Mid: "— это ваш приватный ключ, единственное доказательство владения аккаунтом. В отличие от паролей, здесь нет", + faq3Strong: "никакого «забыли пароль»", + faq3After: ". Если вы потеряете nsec, аккаунт исчезнет навсегда. При создании аккаунта сразу скачайте резервную копию и храните её в надёжном месте (менеджер паролей, запись офлайн).", + faq4Q: "Какие подписанты/приложения работают со SkateSpots?", + faq4Desktop: "На компьютере:", + faq4Extensions: "расширения браузера.", + faq4Android: "На Android:", + faq4AndroidAfter: "(лучший опыт с нативным приложением).", + faq4Ios: "На iOS:", + faq4IosAfter: "или вставьте nsec напрямую (менее безопасно).", + faq4Note: "Вы также можете войти, вставив nsec напрямую, — но использовать расширение-подписант безопаснее.", + faq5Q: "Можно ли пользоваться SkateSpots на телефоне?", + faq5Before: "Да! SkateSpots — это PWA (Progressive Web App). Откройте", + faq5Mid: "в браузере телефона и нажмите", + faq5Em: "«Добавить на главный экран»", + faq5After: "для полноценной работы как приложение. Или скачайте его из", + faq5End: "— децентрализованного магазина приложений.", + faq6Q: "Что такое Zap?", + faq6A: "Zap — это мгновенные чаевые в Bitcoin, отправленные через Lightning Network. Когда вы делаете Zap скейтеру, sats приходят в его кошелёк за секунды — без PayPal, без Venmo, без комиссий. Тот, кто снял тот самый 4-ступенчатый пролёт, получает деньги напрямую от фанатов.", + faq7Q: "Будут ли удалены мои Spot, если SkateSpots закроется?", + faq7A: "Нет. Ваши Spot публикуются на Relays Nostr — распределённые серверы, которые может запустить любой. Даже если SkateSpots как продукт исчезнет завтра, ваши данные останутся на Relays, и любой клиент Nostr сможет их показать.", + faq8Q: "Можно ли добавить Spot на частной территории?", + faq8A: "Можно, но включите здравый смысл. Spot на частной территории следует соответствующим образом помечать, чтобы скейтеры знали, что к чему. SkateSpots не несёт ответственности за проникновение — всегда уважайте владельцев и местных.", + faq9Q: "Как сообщить об ошибке или оставить отзыв?", + faq9Before: "Напишите команде SkateSpots напрямую в Nostr или свяжитесь с нашим бета-координатором:", + faq9Link: "Отзыв о бете → cordn.net", + readyToShred: "ГОТОВЫ КАТАТЬ?", + stopScrolling: "Хватит скроллить. Скачайте приложение. Найдите Spot. Катайте.", + exploreSpots: "Смотреть Spot", + betaFeedbackTitle: "Бета — нам важен ваш отзыв", + betaFeedbackDesc: "SkateSpots активно развивается. Возможны шероховатости — это наша вина, не ваша. Сообщайте об ошибках, предлагайте функции, говорите, что не устраивает.", + betaCoordinator: "Бета-координатор", + betaCoordinatorDesc: "cordn.net → напишите нам", + dmOnNostr: "DM в Nostr", + fixSameDay: "Нашли ошибку? Мы исправляем в тот же день. Ваши сообщения делают приложение лучше для каждого скейтера.", + relaySetup: "Настройка Relay", + }, + relayEdu: { + understandingNostr: "Понимание Nostr", + stepOf: "Шаг {{current}} из {{total}}", + step1Title: "Понимание Relays", + step1Desc: "Представьте Relays как скейт-магазины, которые делятся новостями о Spot", + you: "Вы", + relays: "Relays", + skaters: "Скейтеры", + s1Good1: "Ни одна компания не владеет вашим аккаунтом", + s1Good1Desc: "Ваша личность хранится на нескольких серверах Relay", + s1Good2: "Вы контролируете, где хранятся ваши данные", + s1Good2Desc: "Ваши посты синхронизируются между выбранными вами Relays — выберите свои или запустите свой собственный", + s1Warn: "Операторы Relay видят публичные посты", + s1WarnDesc: "Представьте, будто вы вешаете объявление на доску", + step2Title: "Публичное и приватное", + step2Desc: "Знайте, что видно, а что зашифровано", + publicTitle: "Публичное (видят все)", + pub1: "Spot, которые вы добавляете на карту", + pub2: "Отзывы и комментарии", + pub3: "Данные вашего профиля (имя, фото)", + pub4: "На кого вы подписаны", + privateTitle: "Приватное (зашифровано)", + priv1: "Личные сообщения", + priv2: "Связь с кошельком", + noteStrong: "Примечание:", + note: "Посты могут храниться на Relays постоянно. Думайте, прежде чем публиковать, — как и в реальной жизни!", + step3Title: "Ваши ключи = ваш аккаунт", + step3Desc: "Это самое важное, что нужно понять", + secretKeyTitle: "Ваш секретный ключ (nsec)", + secretKeyDesc: "Относитесь к нему как к своей доске — никогда никому не одалживайте. Он доказывает, что аккаунт принадлежит вам.", + s3Bad1: "Если потерять — аккаунт не восстановить", + s3Bad2: "Никакого «забыли пароль» — никто не сможет его сбросить", + s3Good: "Сделайте копию и храните в надёжном месте", + publicKeyTitle: "Ваш публичный ключ (npub)", + publicKeyDesc: "Это как ваше имя пользователя — делитесь им свободно, чтобы другие могли вас найти!", + inControl: "🔐 Всё под вашим контролем — ни одна компания не сможет вас заблокировать!", + skip: "Пропустить", + gotIt: "Понятно!", + }, + about: { + seoTitle: "О нас — SkateSpots", + seoDescription: "Узнайте о SkateSpots и нашей миссии — построить децентрализованное скейт-сообщество.", + npubCopied: "npub скопирован в буфер обмена. Вставьте его в любимый клиент Nostr, чтобы отправить DM.", + bugReport: "🐛 Сообщение об ошибке", + bugWhatHappened: "Что произошло:", + bugExpected: "Что я ожидал:", + bugSteps: "Шаги для воспроизведения:", + aboutWord: "О НАС", + heroBefore: "Общайтесь с местными скейт-сценами по всему миру.", + skaterOwned: "Данные, принадлежащие скейтерам,", + heroAfter: ", Relays, которыми управляет сообщество.", + viewStats: "Статистика сообщества", + missionTitle: "Наша миссия", + mission1: "SkateSpots помогает скейтерам находить Spot, общаться с профи в The Lab и организовывать сессии — и всё это без корпоративного контроля. Настоящее катание происходит офлайн, а этот инструмент просто связывает вас с ним.", + mission2: "Знания о скейтбординге должны жить в сообществе, а не быть запертыми в корпоративных приложениях. Поэтому SkateSpots работает на Nostr — системе на основе Relay, где скейтеры сами контролируют свои данные, выбирают, какие Relays их хранят, и даже могут запустить свой. Картой не владеет ни одна компания.", + whyNostr: "Почему Nostr?", + why1Title: "Под контролем сообщества", + why1Desc: "Ваши Spot живут на общественных Relays. Серверы запускают скейтеры, а не корпорации.", + why2Title: "Вы владеете своими данными", + why2Desc: "Ваша личность Nostr принадлежит вам. Переносите её в любое приложение Nostr — без привязки.", + why3Title: "Интеграция с Bitcoin", + why3Desc: "Делайте Zap авторам напрямую в Bitcoin. Никакая платформа не забирает 30%.", + why4Title: "Открытый исходный код", + why4Desc: "Создаётся открыто. Любой может внести вклад или сделать форк кода.", + getInvolved: "Присоединиться", + getInvolvedDesc: "SkateSpots — открытый проект, движимый сообществом. Вносите код, делитесь Spot или помогайте другим начать.", + betaTitle: "Бета-тестирование", + betaDesc: "Дорогой пользователь! Спасибо за бета-тестирование SkateSpots. Учтите, что приложение всё ещё в бете и могут быть ошибки или проблемы с безопасностью. Если вы столкнулись с проблемами или хотите сообщить об ошибке, напишите нам!", + giveFeedback: "Оставьте отзыв:", + copyNpub: "Скопировать npub", + reportBug: "Сообщить об ошибке", + viewProfile: "Посмотреть профиль", + downloadApp: "Скачать приложение", + downloadAppDesc: "Установите SkateSpots на Android через Zapstore — открытый магазин приложений, ориентированный на Bitcoin.", + getOnZapstore: "Установить из Zapstore", + credits: "Благодарности", + creditPoweredBy: "Работает на", + creditNostr: "Децентрализованный протокол", + creditCrewChat: "Чат Crew через", + creditCordn: "Групповой чат с end-to-end шифрованием", + creditEcash: "Ecash через", + creditCashu: "Chaumian ecash для Lightning", + creditWalletConnect: "Подключение кошелька через", + creditNwc: "Nostr Wallet Connect (NIP-47)", + creditSigning: "Подпись на Android через", + creditAmber: "Подписант Nostr для Android", + creditMapData: "Данные карты Bitcoin из", + creditBtcmap: "Места, принимающие Bitcoin", + creditCrowdfunding: "Краудфандинг", + creditAngor: "Децентрализованный краудфандинг в Bitcoin", + creditDistributed: "Распространяется через", + creditZapstore: "Магазин приложений с открытым исходным кодом", + creditTrust: "Доверие и чат Crew через", + creditContextvm: "Оценки доверия Relatr и координация зашифрованного чата Crew", + stillQuestions: "Остались вопросы?", + stillQuestionsDesc: "Sasquatch — наш ИИ-гид, работающий на живых данных SkateSpots. Спросите его о Spot, событиях, тренерах, Gear или о том, как всё устроено.", + askSasquatch: "Спросить Sasquatch", + poweredBy: "Работает на", + decentralized: "Децентрализовано", + communityOwned: "Принадлежит сообществу", + }, + faq: { + seoTitle: "FAQ — SkateSpots", + seoDescription: "Спросите Sasquatch о чём угодно про SkateSpots.", + greeting: "Привет! Я Sasquatch 🦧 — спрашивайте меня о чём угодно про SkateSpots. Spot, события, Gear, кошельки, приватность, Nostr — я помогу. Что хотите узнать?", + gotQuestions: "Есть вопросы?", + heroDesc: "Спросите Sasquatch — он знает всё о SkateSpots, Nostr, Bitcoin и скейтбординге.", + askTitle: "Спросить Sasquatch", + askDesc: "Sasquatch находится в левом нижнем углу экрана — нажмите на него и введите вопрос. У него есть доступ к живым данным о Spot, событиях, тренерах и погоде.", + askQuestion: "Чем ты можешь помочь мне в SkateSpots?", + openSasquatch: "Открыть Sasquatch", + commonQuestions: "Частые вопросы — нажмите, чтобы спросить", + quickAnswers: "Быстрые ответы", + footerHint: "Sasquatch использует живые данные Nostr из Relay SkateSpots и ИИ, чтобы отвечать на ваши вопросы. 🛹", + chip1Label: "Что такое SkateSpots?", + chip1Q: "Что такое SkateSpots и как это работает?", + chip2Label: "Как добавить Spot?", + chip2Q: "Как добавить скейт-Spot на карту?", + chip3Label: "Что такое Zap?", + chip3Q: "Что такое Zap?", + chip4Label: "Это бесплатно?", + chip4Q: "SkateSpots бесплатен?", + chip5Label: "Что такое Мой Stash?", + chip5Q: "Что такое Мой Stash?", + chip6Label: "Как войти?", + chip6Q: "Как войти или создать аккаунт?", + chip7Label: "Что такое Nostr?", + chip7Q: "Что такое Nostr?", + chip8Label: "Приватность и данные", + chip8Q: "Какие данные в SkateSpots публичные, а какие приватные?", + chip9Label: "Как продать Gear?", + chip9Q: "Как продать Gear на SkateSpots?", + chip10Label: "Что такое The Lab?", + chip10Q: "Что такое The Lab?", + fact1Label: "Скейт-Spot по всему миру", + fact1Value: "Находите и добавляйте", + fact2Label: "Zap в Bitcoin Lightning", + fact2Value: "100% бесплатно", + fact3Label: "Децентрализовано на Nostr", + fact3Value: "Вы владеете своими данными", + fact4Label: "Приватный инвентарь Gear", + fact4Value: "Зашифрованный Stash", + s1Q: "Что такое SkateSpots?", + s1A: "Децентрализованная карта и сообщество для скейтбординга, построенные на Nostr. Находите Spot, тренеров и фильмеров, вступайте в Crews, публикуйте события и покупайте/продавайте Gear — без компании посередине.", + s2Q: "Как добавить Spot?", + s2A: "Нажмите на карту или используйте кнопку + / «Добавить Spot», затем поставьте метку и заполните детали. Вам нужен бесплатный аккаунт Nostr (нажмите «Войти» → «Создать аккаунт» — email не нужен).", + s3Q: "Что такое Zap?", + s3A: "Zap — это чаевые в Bitcoin Lightning. Вы можете делать Zap Spot, событиям, Crews и людям, которых цените. Они идут напрямую получателю через Lightning — SkateSpots никогда не хранит ваши средства.", + s4Q: "Это бесплатно?", + s4A: "Да. Создание аккаунта, добавление Spot и просмотр бесплатны. Необязательные платные функции (например, рекомендуемые объявления) и чаевые (Zap) оплачиваются напрямую между людьми.", + s5Q: "Какие данные публичны?", + s5A: "Всё, что вы публикуете — Spot, события, ваш профиль — публично на Relays Nostr. Ваши личные сообщения и Stash защищены end-to-end шифрованием. Подробности на странице «Приватность».", + s6Q: "Что такое The Lab?", + s6A: "The Lab — это место, где вы находите людей, чтобы нанять их или учиться у них: тренеры, инструкторы, фильмеры, видеомонтажёры, фотографы, билдеры, художники и многие другие.", + }, + privacy: { + seoTitle: "Приватность — SkateSpots", + seoDescription: "Как SkateSpots обращается с вашими данными: ваш GPS остаётся на устройстве, опубликованные Spot публичны, а также как скрыть свой IP с помощью VPN или Tor, если хотите.", + heroBefore: "Ваша", + heroHighlight: "приватность", + heroDesc: "Без слежки, без рекламы, без продажи данных. Вот что именно остаётся на вашем устройстве, что публично и как дополнительно всё закрыть, если хотите.", + locationTitle: "Ваше местоположение остаётся на устройстве", + locationBefore: "Когда вы нажимаете", + nearMe: "«Рядом»,", + locationAfter: "ваше местоположение GPS считывается на устройстве и используется только для центрирования карты и сортировки ближайших Spot.", + locationGood1: "Оно никогда не публикуется в Nostr.", + locationGood2: "Оно никогда не отправляется в SkateSpots — сервера SkateSpots, который бы его собирал, не существует.", + locationGood3: "Оно никогда не передаётся третьим лицам.", + locationGood4: "В нативном приложении мы используем собственную систему геолокации телефона и обходимся без сервисов Google Play — поэтому оно работает на телефонах без Google (GrapheneOS, /e/OS), и Google его не видит.", + weatherBefore: "Погода по умолчанию выключена. Когда вы её включаете, она запрашивает условия для", + weatherEm: "публичного местоположения Spot,", + weatherAfter: "а не вашего.", + publicTitle: "Что публично по замыслу", + publicDesc: "SkateSpots — общая карта, поэтому некоторые вещи предназначены для всеобщего обозрения. Когда вы решаете их опубликовать, они становятся публичными в сети Nostr:", + public1Strong: "Spot, которые вы добавляете", + public1: "— включая их координаты. Если вы добавите Spot точно по своему местоположению, оно станет публичным. Подумайте, прежде чем ставить метку у собственного дома.", + public2Strong: "Отзывы, комментарии и ваш публичный профиль", + public2: "(имя, фото).", + public3: "На кого вы подписаны, и публичные реакции.", + public4Strong: "Zap", + public4: "по умолчанию публичны: Zap связывает ваш аккаунт — часто ваш Lightning-адрес — с постом, который вы оплатили, и с самими чаевыми. Ваш кошелёк может отправить их анонимно, если вы предпочитаете иначе.", + publicNoteBefore: "VPN или Tor", + notWord: "не", + publicNoteAfter: "скрывают содержимое того, что вы публикуете — координаты Spot публичны в любом случае. Инструменты приватности скрывают вашу сетевую личность (ваш IP), а не то, что вы решаете публиковать.", + encryptedTitle: "Что приватно и зашифровано", + enc1Strong: "Личные сообщения", + enc1Mid: "и", + enc1Strong2: "чаты Crew", + enc1: "защищены end-to-end шифрованием (NIP-17). Их могут читать только участники.", + enc2Strong: "Мой Stash", + enc2: "— ваш приватный инвентарь Gear — зашифрован вашим собственным ключом.", + enc3Strong: "Участники только своего Crew", + enc3: "могут выбрать видимость только для своих товарищей по Crew.", + ipTitle: "Что покидает устройство: ваш IP", + ipBefore: "Как и любой сайт, серверы, с которыми взаимодействует SkateSpots, видят ваш", + ipAddress: "IP-адрес", + ipAfter: "(грубый показатель вашего региона). Это нормально для любого веб- или картографического приложения и не является особенностью только нас. Эти серверы:", + ipTileStrong: "Тайлы карты", + ipTile: "(OpenStreetMap) — видят ваш IP и то, какую область карты вы просматриваете.", + ipGeoStrong: "Геокодирование Spot/Shop", + ipGeo: "— когда вы создаёте или редактируете Spot или Shop, его координаты отправляются в OpenStreetMap Nominatim, чтобы заполнить тег города/страны. Когда вы открываете «Статистику сообщества», координаты меток без тега локации отправляются в BigDataCloud, чтобы их можно было сгруппировать по регионам (кэшируется на устройстве — не более одного раза на метку). Оба видят ваш IP. Это координаты поставленной вами метки / публичные координаты меток, а не живой GPS вашего устройства.", + ipPushStrong: "Фоновые уведомления", + ipPush: "(по желанию) — если вы их включите, push-сервер SkateSpots видит, что ваш ключ что-то получил, и когда (но никогда — кто отправил или что написано, сообщения остаются зашифрованными), а push-сервис вашей ОС (Google/Mozilla/Apple) доставляет уведомление.", + ipBtcStrong: "Места Bitcoin", + ipBtc: "(BTCMap, когда вы включаете этот слой) — видят ваш IP и просматриваемую область.", + ipRelayStrong: "Relays Nostr", + ipRelay: "— видят ваш IP, когда приложение читает или публикует.", + ipMintStrong: "Минты Cashu", + ipMint: "— видят ваш IP всякий раз, когда кошелёк отправляет, получает или сжигает.", + ipRouteStrong: "Маршруты", + ipRoute: "(OSRM и Transitous для общественного транспорта) — получают начало и конец любого запрошенного маршрута, а не только ваш IP. Маршрутизация остаётся в приложении: ваши начало и пункт назначения никогда не передаются в Google или Apple Maps.", + ipWeatherStrong: "Погода", + ipWeatherMid: "(Open-Meteo, по желанию) и", + ipUploadStrong: "загрузка изображений", + ipWeather: "(Blossom), когда вы ими пользуетесь.", + ipAiStrong: "ИИ Sasquatch", + ipAi: "— ваше сообщение идёт на наш собственный сервер, а затем провайдеру модели.", + ipLink1: "Поскольку вы отправляете свой публичный ключ (npub) по тому же соединению, Relay может связать ваш IP с вами — не просто «кто-то подключился», а «этот человек, с этого адреса».", + ipShieldBefore: "Одно мы всё же защищаем:", + ipMintsStrong: "каталог минтов", + ipShieldAfter: "загружается через наш сервер, поэтому MintRadar никогда не видит ваш IP.", + vpnTitle: "Хотите больше приватности? VPN или Tor (необязательно)", + vpnDesc: "Большинству скейтеров это не нужно — но если вы хотите скрыть свой IP и примерное местоположение от серверов выше, у вас есть два бесплатных варианта:", + vpnReputable: "🛡️ Надёжный VPN", + vpnReputableDesc: "Скрывает ваш IP за серверами VPN. Просто и быстро. Используйте тот, за который платите и которому доверяете; бесплатные VPN обычно зарабатывают на вашем трафике, поэтому относитесь к «бесплатному» как к тревожному сигналу.", + torBrowser: "🧅 Tor Browser", + torDesc: "Бесплатно, максимальная приватность IP, маршрутизация через несколько Relay. Медленнее — карты и некоторые Relays Nostr могут тормозить или блокировать выходные узлы Tor. Отлично для особо осторожных.", + readThis: "Прочитайте это, чтобы вас не обманули", + caveat1Before: "VPN/Tor скрывает ваш", + ipWord: "IP", + caveat1: "— но не Spot, которые вы публикуете. Метка у вашего дома публична независимо от того, используете вы VPN или нет.", + caveat2Before: "Не включайте", + nearMeGps: "«Рядом» / GPS браузера", + caveat2: "если ваша цель — остаться анонимным: точный GPS сводит на нет любое скрытие IP.", + caveat3: "Ни один инструмент не делает вас полностью «анонимным». Они лишь уменьшают то, что серверы могут узнать о вашем сетевом расположении — и всё.", + keysTitle: "Ваши ключи, ваш аккаунт", + keysBefore: "Ваш аккаунт — это криптографическая пара ключей, которой вы владеете. Самый безопасный способ входа —", + signer: "подписант", + keysAfter: "(Alby, nos2x или Amber на Android), чтобы ваш секретный ключ никогда не вставлялся в приложение.", + keysCaveatBefore: "Если вы вставляете свой", + keysCaveatAfter: "напрямую, он сохраняется в браузере. По возможности используйте расширение-подписант, а резервную копию nsec держите в надёжном месте офлайн.", + footerBefore: "Вопросы? Спросите", + sasquatchName: "Sasquatch", + footerMid: "в приложении или прочитайте", + gettingStarted: "руководство для новичков", + about: "О нас", + }, + license: { + seoTitle: "Лицензия — SkateSpots", + seoDescription: "Лицензия SkateSpots. Вы свободны кататься.", + tagline: "Катайтесь, зарабатывайте, получайте удовольствие и тратьте Sats, где бы вы ни были.", + copyright: "Участники SkateSpots и сообщество", + licenseLabel: "Лицензия", + freeLine1: "ВЫ СВОБОДНЫ", + freeLine2: "КАТАТЬСЯ", + body: "Этот проект открыт. Делитесь им, делайте форк, развивайте, катайте. Улицы принадлежат всем. И этот код тоже. Катайтесь, получайте удовольствие, учите трюки, поддерживайте создателей и снова катайтесь.", + builtBefore: "Сделано с ❤️ на", + builtMid: "· Работает на", + lightning: "Bitcoin Lightning ⚡", + viewSource: "Посмотреть исходный код", + aboutSkateSpots: "О SkateSpots", + supporters: "Сторонники", + }, + glossary: { + seoTitle: "Глоссарий трюков · SkateSpots", + seoDescription: "Полный глоссарий скейтбординга — {{count}} записей о флипах, грайндах, слайдах, грабах, эйрах, лип-трюках, хэндплантах, фристайле, терминах перехода, стойке и железе, с альтернативными названиями.", + heading: "ГЛОССАРИЙ ТРЮКОВ", + subheading: "{{count}} записей · трюки, переход, фристайл, стойка и железо", + searchPlaceholder: "Поиск трюков или прозвищ — tre flip, crooks, method…", + clearSearch: "Очистить поиск", + all: "Все", + results: "{{count}} результат{{s}} по запросу", + noMatch: "Нет подходящих трюков. Попробуйте прозвище вроде «tre flip», «crooks» или «melon».", + tricksCount: "{{count}} трюков", + footerBefore: "Знаете трюк или прозвище, которое мы пропустили? У трюков в каждой сцене свои названия — напишите", + sasquatch: "Sasquatch 🦧", + footerAfter: "и сообщите нам.", + }, + signers: { + seoTitle: "Приложения-подписанты — защитите свои ключи Nostr | SkateSpots", + seoDescription: "Узнайте о приложениях-подписантах, которые защищают ваши ключи Nostr. Найдите лучший вариант для Android, iOS или браузеров на компьютере.", + securityGuide: "Руководство по безопасности", + protect: "Защитите свои", + nostrKeys: "ключи Nostr", + heroDesc: "Приложения-подписанты надёжно хранят ваши приватные ключи, подписывая события, не показывая их. Вместо того чтобы вставлять ключ в каждое приложение, доверьте это подписанту.", + whySignerStrong: "Зачем использовать подписант?", + whySigner: "Ваш приватный ключ Nostr — как пароль, который нельзя изменить. Приложение-подписант хранит его в безопасности и позволяет пользоваться любым приложением Nostr.", + androidTitle: "Подписанты для Android", + androidDesc: "Нативные приложения-подписанты для устройств Android, включая GrapheneOS.", + iosTitle: "Подписанты для iOS", + iosDesc: "Варианты подписантов для пользователей iPhone и iPad.", + browserTitle: "Расширения браузера", + browserDesc: "Расширения для браузеров на компьютере для подписи в веб-приложениях.", + recommended: "Рекомендуется", + yourPlatform: "Ваша платформа", + get: "Установить {{name}}", + protocolsTitle: "Понимание протоколов", + nip07Desc: "Стандарт расширений браузера. Расширение добавляет возможность подписи в веб-приложения. Используется Alby, nos2x, Flamingo и подобными расширениями.", + nip46Desc: "Протокол удалённой подписи («bunker»). Ваше приложение-подписант подтверждает запросы от других приложений, не передавая ключи. Используется Nsec.app, Nostria и Nowser.", + nip55Desc: "Протокол подписи для Android. Нативные приложения могут запрашивать подпись у Amber, не показывая ключи. Самый удобный опыт на Android.", + whichChoose: "Что выбрать?", + chooseAndroid: "Android:", + chooseAndroidDesc: "Amber (NIP-55) для нативных приложений", + chooseIos: "iOS:", + chooseIosDesc: "Nsec.app (NIP-46) для наилучшей совместимости", + chooseDesktop: "Компьютер:", + chooseDesktopDesc: "Alby, nos2x или Flamingo (NIP-07)", + amberDesc: "Нативный подписант для Android, ориентированный на безопасность и удобство. Лучший выбор для пользователей Android.", + nsecAppDesc: "Кроссплатформенный удалённый подписант, действующий как надёжное хранилище для ваших ключей.", + nostriaDesc: "Приложение-подписант с хранением ключей в защищённом хранилище устройства.", + nowserDesc: "Мульти-подписант с поддержкой как расширений браузера, так и протоколов удалённой подписи.", + nsecAppIosDesc: "Лучший вариант для iOS. Используйте его как удалённый подписант с любым клиентом Nostr.", + nowserTfDesc: "Подписант для iOS, доступный через TestFlight, с возможностями подписи, похожими на Android.", + nostriaIosDesc: "Удалённый подписант с защищённым хранением ключей на устройстве.", + nos2xDesc: "Простое и надёжное расширение браузера для подписи событий Nostr.", + albyDesc: "Кошелёк Bitcoin Lightning со встроенным управлением ключами Nostr и WebLN.", + flamingoDesc: "Расширение браузера, ориентированное на Nostr, с чистым интерфейсом.", + kiwiDesc: "На Android/GrapheneOS используйте Kiwi Browser, чтобы установить расширения nos2x или Alby.", + fNativeApp: "Нативное приложение", + fMultiKey: "Поддержка нескольких ключей", + fEventSigning: "Подпись событий", + fSecureStorage: "Защищённое хранение ключей", + fRemoteSigning: "Удалённая подпись", + fAnyClient: "Работает с любым клиентом", + fCrossDevice: "Синхронизация между устройствами", + fMultiKeySupport: "Поддержка нескольких ключей", + fNip07: "Поддержка NIP-07", + fNip46: "Поддержка NIP-46", + fFlexibleSigning: "Гибкая подпись", + fNativeIos: "Нативное приложение для iOS", + fLightweight: "Лёгкое", + fEasyToUse: "Простое в использовании", + fChromeSupport: "Поддержка Chrome/Brave/Edge", + fLightningPayments: "Платежи Lightning", + fNostrSigning: "Подпись Nostr", + fWebln: "Поддержка WebLN", + fNwc: "Поддержка NWC", + fCleanUi: "Чистый интерфейс", + fPrivacyFocused: "Ориентировано на приватность", + fExtensionMobile: "Поддержка расширений на мобильных", + fFullBrowser: "Полноценный браузерный опыт", + fGraphene: "Работает на GrapheneOS", + }, + betaDisclaimer: { + title: "Внимание — это бета", + subtitle: "Пара слов, прежде чем начать.", + ossTitle: "Открытый исходный код и эксперимент", + ossBody: "Создано сообществом открыто. Изучайте, форкайте, ломайте.", + betaTitle: "В бете — без аудита", + betaBody: "Код ещё не проходил формальный аудит безопасности. Ошибки случаются.", + moneyTitle: "Работает с реальными Bitcoin и Lightning", + moneyBody: "Используйте деньги на свой риск. Загружайте только то, что можете позволить себе потерять.", + finePrint: "Без каких-либо гарантий. Вы несёте полную ответственность за свои средства и ключи.", + viewCode: "Посмотреть код", + accept: "Понятно, впустите меня", + }, + }, +}; export default ruBatch3; diff --git a/src/i18n/ru/batch4.ts b/src/i18n/ru/batch4.ts index b48c5d0..e085142 100644 --- a/src/i18n/ru/batch4.ts +++ b/src/i18n/ru/batch4.ts @@ -1,4 +1,1115 @@ -/** ru — batch 4. Filled by the translation pass; empty until then. */ -const ruBatch4 = {}; +/** ru — batch 4. Namespace: walletUi (wallet/Cashu, stash, mints, app shop, newsletter, community stats, leaderboards, profile page). */ +const ruBatch4 = { + walletUi: { + page: { + title: 'Кошелёк', + subtitle: 'Bitcoin Lightning + Cashu', + manage: 'Управление', + getAWallet: 'Получить кошелёк', + learnPlanB: 'Узнать больше в Plan B Academy', + walletMinibits: 'Мобильный Cashu · NWC', + walletAlby: 'Расширение браузера · WebLN + NWC', + walletZeus: 'Lightning с самостоятельным хранением', + walletCoinos: 'Веб-версия · работает везде', + whatAreZaps: 'Что такое Zaps?', + whatAreZapsShort: 'Что такое zaps?', + zapsDesc: 'Мгновенные платежи Bitcoin Lightning. Отправляйте sats любому скейтеру, автору спота или тренеру — без посредников и комиссий платформы.', + instant: 'Мгновенно', + instantDesc: 'Зачисляется за секунды', + flexible: 'Гибко', + flexibleDesc: 'Ваш кошелёк, ваши ключи', + private: 'Приватно', + privateDesc: 'Cashu скрывает, кто платит', + direct: 'Напрямую', + directDesc: 'Ценность идёт автору', + loginRequired: 'Требуется вход', + loginRequiredDesc: 'Войдите через аккаунт Nostr, чтобы подключить Lightning-кошелёк и начать отправлять zaps.', + browseMints: 'Обзор Cashu mints', + }, + modal: { + walletName: 'Название кошелька (необязательно)', + walletNamePlaceholder: 'Мой Lightning-кошелёк', + connectionUri: 'URI подключения', + spendLimitTitle: 'Сначала установите лимит расходов', + spendLimitBody1: 'Эта строка позволяет SkateSpots оплачивать Lightning-счета с вашего кошелька. В приложении кошелька задайте для этого подключения небольшой', + dailyBudget: 'дневной бюджет', + spendLimitBody2: '(например, несколько тысяч sats) и разрешите только', + spendLimitBody3: 'Никогда не вставляйте подключение с неограниченным бюджетом. Вы можете отозвать его в своём кошельке в любой момент.', + addWallet: 'Добавить кошелёк', + nwcConnection: 'Подключение NWC', + lightningWallet: 'Lightning-кошелёк', + pasteNwc: 'Вставьте строку подключения NWC, чтобы отправлять zaps', + connectWallet: 'Подключить кошелёк', + browserExtension: 'Расширение браузера (WebLN)', + autoDetected: 'Определяется автоматически, если установлено', + ready: 'Готово', + notFound: 'Не найдено', + getNwcFrom: 'Получить NWC от:', + connectionRequired: 'Требуется URI подключения', + connectionRequiredDesc: 'Пожалуйста, введите корректный URI подключения NWC.', + activeChanged: 'Активный кошелёк изменён', + activeChangedDesc: 'Выбранный кошелёк теперь активен для zaps.', + connectNwc: 'Подключить кошелёк NWC', + connectNwcDesc: 'Введите строку подключения из совместимого кошелька.', + connect: 'Подключить', + connecting: 'Подключение...', + walletSettings: 'Настройки кошелька', + connectDesc: 'Подключите Lightning-кошелёк, чтобы мгновенно отправлять zaps.', + }, + cashu: { + title: 'Кошелёк Cashu', + desc: 'Встроенный ecash-кошелёк — без внешней настройки', + initializing: 'Инициализация кошелька...', + walletError: 'Ошибка кошелька', + balance: 'Баланс', + balanceAria: 'Баланс кошелька {{amount}} sats', + activeMint: 'Активный mint', + selectMint: 'Выберите mint', + receive: 'Получить', + send: 'Отправить', + receiveViaLightning: '⚡ Получить через Lightning', + amountSats: 'Сумма в sats', + generateInvoice: 'Создать счёт', + generating: 'Создание…', + or: 'Или', + receiveCashu: '🥜 Получить токен Cashu', + scanQr: 'Сканировать QR', + pasteCashu: 'Вставьте токен Cashu (cashu...)', + receiveToken: 'Получить токен', + receiving: 'Получение…', + createCashu: '🥜 Создать токен Cashu', + createToken: 'Создать токен', + creating: 'Создание…', + payInvoice: '⚡ Оплатить Lightning-счёт', + pasteInvoice: 'Вставьте Lightning-счёт (lnbc...)', + payInvoiceBtn: 'Оплатить счёт', + processing: 'Обработка...', + payAddress: '📧 Оплатить Lightning Address', + sendToAddress: 'Отправить на адрес', + sending: 'Отправка…', + recentActivity: 'Недавняя активность', + receivedLightning: 'Получено ⚡ Lightning', + sentLightning: 'Отправлено ⚡ Lightning', + sentToken: 'Отправлен 🥜 токен', + receivedToken: 'Получен 🥜 токен', + whatIsCashu: 'Что такое Cashu?', + whatIsCashuDesc: 'Cashu — это цифровая наличность, обеспеченная Bitcoin Lightning. Это токены Bitcoin, которые вы храните в браузере.', + benefitOffline: 'Работает офлайн на спотах', + benefitInstant: 'Мгновенные платежи между людьми', + benefitPrivacy: 'Ориентировано на приватность (mints не могут отследить вас)', + benefitRedeemable: 'Всегда обменивается на Lightning sats', + findMints: 'Ищите mints на mintradar.pedani.eu', + backupTitle: 'Сделайте резервную копию кошелька', + backupDesc: 'Ваш кошелёк защищён фразой восстановления из 12 слов. Сохраните её надёжно — она понадобится для восстановления баланса, если вы очистите данные браузера.', + viewRecovery: 'Показать фразу восстановления', + backupNote: 'Это как ваш Nostr nsec — держите в секрете и храните резервную копию!', + tokenReceived: 'Токен получен', + tokenReceivedDesc: 'Токен Cashu успешно активирован!', + receiveFailed: 'Не удалось получить', + unknownError: 'Неизвестная ошибка', + requestUnsupported: 'Запрос Cashu пока не поддерживается', + requestUnsupportedDesc: 'Этот кошелёк пока не может оплатить запрос Cashu (creq) — попросите Lightning-счёт или адрес.', + onchainUnsupported: 'On-chain здесь не поддерживается', + onchainUnsupportedDesc: 'Это Bitcoin-адрес. Этот кошелёк отправляет только токены Cashu и платежи Lightning.', + nostrProfile: 'Это профиль Nostr', + nostrProfileDesc: 'Отсканируйте токен Cashu, Lightning-счёт или Lightning Address для оплаты.', + clinkUnsupported: 'Код оплаты пока не поддерживается', + clinkUnsupportedDesc: 'Этот кошелёк пока не может оплачивать коды CLINK. Используйте Lightning-счёт или адрес.', + unrecognizedQr: 'Нераспознанный QR-код', + unrecognizedQrDesc: 'Отсканируйте токен Cashu, Lightning-счёт или Lightning Address.', + invalidAmount: 'Недопустимая сумма', + invalidAmountDesc: 'Пожалуйста, введите корректную сумму', + paymentSent: 'Платёж отправлен', + paymentSentDesc: 'Отправлено {{amount}} sats на {{address}}', + paymentFailed: 'Платёж не выполнен', + copied: 'Скопировано', + copiedDesc: '{{label}} скопировано в буфер обмена', + receiveSats: 'Получить {{amount}} sats', + payInvoiceHint: 'Оплатите этот счёт из любого Lightning-кошелька', + invoiceQrAlt: 'QR-код счёта', + lightningInvoice: 'Lightning-счёт', + invoiceLabel: 'Счёт', + waiting: '⏳ Ожидание платежа...', + tokenReady: 'Токен готов к отправке', + shareToken: 'Поделитесь этим токеном с получателем', + tokenQrAlt: 'QR-код токена', + cashuToken: 'Токен Cashu', + tokenLabel: 'Токен', + copyToken: 'Копировать токен', + tokenWarning: 'Любой, у кого есть этот токен, может его забрать — обращайтесь с ним как с наличными!', + browser: { + title: 'Встроенный ecash-кошелёк', + appOnly: 'Только в приложении', + desc: 'Cashu ecash с самостоятельным хранением на базе Bitcoin Lightning', + unlockTitle: 'Откройте полный кошелёк в приложении SkateSpots', + unlockDesc: 'Встроенный ecash-кошелёк позволяет создавать, отправлять и активировать токены Cashu прямо на споте. Он живёт в нативном приложении, где может напрямую связываться с mints — браузеры изолируют такие соединения ради вашей безопасности.', + zapTipTitle: 'Zap и чаевые — работают в браузере уже сейчас', + zapTipDesc: 'Отправка sats спотам, событиям, тренерам и командам работает прямо здесь. Просто подключите Lightning-кошелёк ниже — Nostr Wallet Connect или расширение браузера вроде Alby. Cashu mint не нужен.', + }, + }, + escrow: { + title: 'Эскроу', + desc: 'Продавайте безопасно: включите эскроу, и покупатель сможет заблокировать свои sats для вас в сделке. Вы освобождаете их, когда передаёте товар — если нет, покупатель может вернуть их по истечении согласованного времени.', + active: 'Эскроу включён', + publish: 'Включить эскроу', + published: 'Эскроу включён', + publishedDesc: 'Покупатели теперь могут блокировать средства для вас в сделке.', + failed: 'Не удалось включить эскроу', + }, + escrowSettings: { + title: 'Настройки эскроу', + desc: 'Значения по умолчанию для сделок с эскроу Cashu. Локально на устройстве.', + lockWindow: 'Окно блокировки по умолчанию', + lockWindowHint: 'Как долго средства остаются заблокированными, прежде чем покупатель сможет их вернуть. Дольше — безопаснее для продавца.', + days: 'дней', + preferredMint: 'Mint для эскроу', + activeMint: 'Активный mint', + preferredMintHint: 'Какой mint финансирует эскроу. Используйте надёжный.', + requireListings: 'Требовать эскроу для новых объявлений', + requireListingsHint: 'Предварительно выбирает «Требовать эскроу» при выставлении товара.', + }, + privacy: { + title: 'Советы по приватности', + subtitle: 'Узнайте, как защитить свою финансовую приватность', + cashuRecommended: 'CASHU (РЕКОМЕНДУЕТСЯ)', + anon: 'Анонимные транзакции', + blind: 'Слепые подписи скрывают активность', + noIp: 'Без раскрытия IP', + trustMint: 'Доверяете mint свои средства', + lightningAddress: 'LIGHTNING ADDRESS', + linked: 'Может быть связано с личностью', + traceable: 'История платежей отслеживается', + ipVisible: 'IP виден при выставлении счёта', + selfCustody: 'Возможно самостоятельное хранение', + bestPractices: 'Лучшие практики', + tip1Title: 'Используйте Cashu для получения чаевых', + tip1Desc: 'Встроенный кошелёк Cashu — самый приватный способ получать zaps', + tip2Title: 'Используйте отдельный кошелёк для SkateSpots', + tip2Desc: 'Не используйте свой основной кошелёк для сбережений — держите средства приложения отдельно', + tip3Title: 'Рассмотрите использование VPN или Tor', + tip3Desc: 'Скрывает ваш IP-адрес при совершении транзакций', + tip4Title: 'Избегайте Lightning Address, связанных с личностью', + tip4Desc: 'Используйте псевдонимные адреса, не привязанные к вашему настоящему имени', + proTip: 'Совет профи:', + proTipDesc: 'Сначала получайте платежи на кошелёк Cashu, затем периодически переводите крупные суммы на личный кошелёк, используя VPN для перевода.', + warnTitle: 'Примечание о приватности', + warnDesc: 'Lightning Address потенциально могут связать вашу активность в SkateSpots с вашей реальной личностью.', + betterPrivacy: 'Для лучшей приватности:', + bullet1: 'Используйте отдельный кошелёк для этого приложения', + bullet2: 'Рассмотрите использование кошелька Cashu вместо этого', + bullet3: 'Используйте VPN/Tor для транзакций', + useCashu: 'Использовать Cashu вместо этого', + understand: 'Понятно', + }, + mintPrivacy: { + title: 'Приватность mint', + desc: 'Использование нескольких mints повышает приватность, не позволяя одному mint видеть все ваши транзакции', + distribution: 'Распределение средств', + singleWarning: 'Использование одного mint означает, что этот mint видит всё время и суммы ваших транзакций. Рассмотрите добавление других mints для лучшей приватности.', + yourMints: 'Ваши mints ({{count}})', + default: 'По умолчанию', + addMint: 'Добавить mint', + addMintDesc: 'Добавьте новый Cashu mint в свой кошелёк', + mintUrl: 'URL mint', + add: 'Добавить', + adding: 'Добавление...', + orChoose: 'Или выберите из списка', + recommended: 'Рекомендуемые mints', + allMints: 'Все mints (каталог)', + searchMints: 'Поиск mints…', + noDirectoryMints: 'Нет mints, соответствующих вашему поиску.', + directoryHint: 'Из общественного каталога MintRadar — неофициально и может быть устаревшим.', + added: 'Добавлено', + soon: 'Скоро', + autoDistribute: 'Автораспределение средств', + autoDesc: 'Распределяйте полученные средства между несколькими mints', + autoAria: 'Автораспределение средств (скоро)', + tip1: 'Используйте минимум 2–3 разных mint для лучшей приватности', + tip2: 'Не храните все средства в одном mint — распределяйте их', + tip3: 'Учитывайте юрисдикцию mint (разные страны = разный юридический доступ)', + tip4: 'Mints видят время транзакций, но НЕ то, кому вы платите (слепые подписи)', + future: 'Будущие функции: ротация mints и оценка приватности — следите за новостями!', + findMore: 'Найдите больше mints на mintradar.pedani.eu', + trustWarning: 'Предупреждение о доверии:', + trustWarningDesc: 'Mints являются кастодиальными — они хранят ваши средства. Используйте только те mints, которым доверяете. Если mint исчезнет, ваши средства могут быть потеряны. Распределение средств между несколькими mints снижает риск.', + removeTitle: 'Удалить mint?', + removeDesc: 'Вы уверены, что хотите удалить {{name}}?', + removeMint: 'Удалить mint', + warning: 'Внимание:', + withdrawWarning: 'На этом mint {{amount}} sats. Выведите средства перед удалением!', + invalidUrl: 'Недопустимый URL', + invalidUrlDesc: 'URL mint должен начинаться с https://', + mintAdded: 'Mint добавлен', + mintAddedDesc: 'Новый mint успешно добавлен', + mintAddedNamed: '{{name}} успешно добавлен', + failedAdd: 'Не удалось добавить mint', + failed: 'Не удалось', + noMints: 'Нет mints', + singleMint: 'Один mint', + concentrated: 'Сконцентрировано', + moderate: 'Умеренно', + wellDistributed: 'Хорошо распределено', + mintCoinosWebDesc: 'Веб-совместимый mint (рекомендуется для браузеров)', + mintMinibitsWebDesc: '⚠ Только нативное приложение — недоступен из веб-браузеров', + mintMinibitsNativeDesc: 'Mint SkateSpots — рекомендуется', + mintCoinosDesc: 'Веб-совместимый mint', + mintLnbitsDesc: 'Общественный mint на LNbits', + }, + nwc: { + title: 'Lightning-кошелёк', + noConnection: 'Кошелёк NWC', + refresh: 'Обновить баланс', + createInvoice: 'Создать счёт', + copyInvoice: 'Копировать счёт', + pasteInvoice: 'Вставьте Lightning-счёт (lnbc…)', + amount: 'Сумма: {{amount}} sats', + pasteToSee: 'Вставьте счёт, чтобы увидеть сумму', + pay: 'Оплатить', + invoiceQrAlt: 'QR-код Lightning-счёта', + enterAmount: 'Введите сумму в sats', + readBalanceFailed: 'Не удалось прочитать баланс', + readBalanceFailedDesc: 'Ваш кошелёк не ответил.', + createInvoiceFailed: 'Не удалось создать счёт', + createInvoiceFailedDesc: 'Попробуйте ещё раз через мгновение.', + paymentSent: 'Платёж отправлен', + paidAmount: 'Оплачено {{amount}} sats.', + paid: 'Оплачено.', + paymentRejected: 'Кошелёк отклонил платёж.', + }, + qr: { + title: 'Сканировать QR-код', + desc: 'Поместите QR-код в поле зрения камеры для сканирования', + paste: 'Вставить из буфера обмена', + hint: 'Отсканируйте токен Cashu, Lightning-счёт или Lightning Address', + clipboardEmpty: 'Буфер обмена пуст', + clipboardEmptyDesc: 'В буфере обмена не найден текст', + pasteFailed: 'Не удалось вставить', + pasteFailedDesc: 'Не удалось прочитать из буфера обмена', + }, + recovery: { + title: 'Фраза восстановления', + desc: 'Эти 12 слов — единственный способ восстановить баланс ecash. Запишите их по порядку и храните офлайн — никогда никому не сообщайте.', + tapReveal: 'Нажмите, чтобы показать', + noWatching: 'Убедитесь, что никто не смотрит', + hide: 'Скрыть', + reveal: 'Показать', + paperHint: 'Безопаснее всего записать на бумаге — копирование в буфер обмена может утечь в другие приложения.', + written: 'Я записал(а) их', + revealFirst: 'Сначала покажите слова', + copiedDesc: 'Фраза восстановления скопирована — вставьте её в надёжное место, затем очистите буфер обмена.', + copyFailed: 'Не удалось скопировать', + copyFailedDesc: 'Пожалуйста, запишите слова вручную.', + }, + guide: { + quickGuide: 'Краткое руководство', + fullGuide: 'Руководство по кошельку (издание для скейтеров)', + cashuSummary: 'Приватность + удобство', + mintHoldsFunds: '(mint хранит средства)', + lightningSummary: 'Контроль + безопасность', + youHoldKeys: '(вы держите ключи)', + useBoth: 'Используйте оба: Cashu для чаевых, Lightning для сбережений', + cashuTitle: 'КОШЕЛЁК CASHU', + cashuTagline: 'Как наличные в кармане на скейт-парке', + cashuBullet1: 'Легко достать, чтобы дать чаевые', + cashuBullet2: 'Не храните здесь все свои сбережения', + cashuBullet3: 'Если mint исчезнет, средства могут быть потеряны', + cashuBullet4: 'Никто не знает, сколько у вас (приватность!)', + cashuPerfectFor: 'Перекусы на сессии, zapping клипов, небольшие чаевые', + lightningTitle: 'LIGHTNING-КОШЕЛЁК', + lightningTagline: 'Как ваш банковский счёт — вы контролируете', + lightningBullet1: 'Безопасно, вы контролируете ключи', + lightningBullet2: 'Требует некоторого времени на настройку', + lightningBullet3: 'Полная история транзакций', + lightningBullet4: 'Лучше для крупных сумм', + lightningPerfectFor: 'Покупка снаряжения, сбережения, крупные zaps', + perfectFor: 'Идеально для:', + proTips: 'СОВЕТЫ ПРОФИ', + tip1Title: 'Используйте оба кошелька', + tip1Desc: 'Держите деньги сессии в Cashu, сбережения — в Lightning', + tip2Title: 'Пробуйте разные кошельки', + tip2Desc: 'Экспериментируйте, чтобы найти подходящий. У каждого свои функции и компромиссы', + tip3Title: 'Лучшая приватность', + tip3Desc: 'Использование нескольких кошельков означает, что ни одно приложение не видит всю вашу активность', + tip4Title: 'Набирайтесь опыта', + tip4Desc: 'Чем больше инструментов вы знаете, тем больше у вас возможностей. Начните с малого, учитесь по ходу', + tldr: 'Короче:', + tldrDesc: 'Не существует «лучшего» кошелька — всё зависит от ваших потребностей. Попробуйте оба, используйте то, что подходит, и не храните все свои sats в одном месте!', + }, + zap: { + count: '{{count}} zaps', + connectFirst: 'Сначала подключите кошелёк', + connectFirstDesc: 'Чтобы отправлять zaps (чаевые Bitcoin), нужно подключить Lightning-кошелёк.', + quickSetup: 'Быстрая настройка (30 секунд)', + quickSetupDesc: 'Подключите существующий Lightning-кошелёк через Nostr Wallet Connect (NWC). Дополнительные аккаунты не нужны.', + connectNwc: 'Подключить кошелёк через NWC', + noWallet: 'Нет кошелька? Узнайте как', + skip: 'Пропустить пока (ручной счёт)', + note: 'ℹ️ Примечание:', + noteDesc: 'Вы всё ещё можете создать счёт без подключения кошелька, но его придётся скопировать вручную для оплаты.', + payWithWebln: 'Оплатить через WebLN', + processing: 'Обработка...', + openInWallet: 'Открыть в Lightning-кошельке', + scanHint: 'Отсканируйте QR-код или скопируйте счёт, чтобы оплатить из любого Lightning-кошелька.', + cashuInstant: 'Оплатите мгновенно встроенным кошельком', + satsAvailable: 'sats доступно', + or: 'ИЛИ', + customAmount: 'Своя сумма', + addComment: 'Добавить комментарий (необязательно)', + insufficientBanner: '⚠️ Недостаточно средств в Cashu. Вам нужно ещё {{amount}} sats. Переключитесь на Lightning или пополните кошелёк Cashu.', + creatingInvoice: 'Создание счёта...', + zapAmount: 'Zap {{amount}} sats', + zapAmountCashu: 'Zap {{amount}} sats через Cashu', + lightningInvoice: 'Lightning-счёт', + qrAlt: 'QR-код Lightning-счёта', + enterAmount: 'Введите сумму', + enterAmountDesc: 'Выберите предложенное значение или введите корректное количество sats.', + cashuUnavailable: 'Кошелёк Cashu недоступен', + cashuUnavailableDesc: 'Ваш кошелёк Cashu не готов. Переключитесь на Lightning или сначала откройте кошелёк.', + insufficientCashu: 'Недостаточно средств в Cashu', + insufficientCashuDesc: 'Вам нужно ещё {{amount}} sats. Переключитесь на Lightning или пополните.', + zapSentCashu: 'Zap отправлен! 🥜', + zapSentCashuDesc: 'Отправлено {{amount}} sats из вашего кошелька Cashu.', + cashuFailed: 'Платёж Cashu не выполнен', + cashuFailedDesc: 'Не удалось оплатить из вашего кошелька Cashu.', + invoiceCopied: 'Счёт скопирован', + invoiceCopiedDesc: 'Lightning-счёт скопирован в буфер обмена', + defaultComment: 'Zap на SkateSpots! 🛹', + titleConnect: 'Подключить кошелёк', + titlePayment: 'Платёж Lightning', + titleZap: 'Отправить Zap', + descConnect: 'Подключите Lightning-кошелёк, чтобы отправлять zaps', + descPayment: 'Оплата через Bitcoin Lightning Network', + descZap: 'Zaps — это небольшие платежи Bitcoin, поддерживающие автора этого элемента. Если вам понравилось, рассмотрите возможность отправить zap!', + descZapShort: 'Zaps — это небольшие платежи Bitcoin, поддерживающие авторов. Рассмотрите возможность отправить zap!', + }, + zapCrew: { + title: 'Zap команде', + desc: 'Разделите zap поровну между {{count}} участниками команды с Lightning Address.', + noMembers: 'Сейчас нет других участников команды для zap.', + totalAmount: 'Общая сумма', + customTotal: 'Своя общая сумма', + each: 'sats каждому', + rounded: '(округлено)', + noWallet: 'Кошелёк не подключён — вы получите счёт на каждого участника для ручной оплаты. Подключите кошелёк для разделения одним касанием.', + zapAcross: 'Zap {{amount}} sats между {{count}}', + sentTo: '⚡ Отправлено {{done}}/{{total}}', + none: 'Автоплатежи не выполнены', + copyPending: 'Скопируйте ожидающие счета, чтобы завершить оплату вручную.', + thanks: 'Спасибо за поддержку команды!', + payingCrew: 'Оплата команде…', + defaultComment: 'Zap команде {{crew}}! 🤘', + sent: 'Отправлено', + paying: 'Оплата', + resolving: 'Определение', + skipped: 'Пропущено', + failed: 'Не удалось', + waiting: 'Ожидание', + copyInvoice: 'Копировать счёт', + invoiceCopied: 'Счёт скопирован', + invoiceCopiedDesc: 'Вставьте его в любой Lightning-кошелёк', + }, + zapBadges: { + title: 'Значки Zap', + zaps: 'zaps', + satsSent: 'sats отправлено', + rank: 'ранг', + footnote: 'На основе zaps за последние 30 дней.', + first: 'Первый Zap', + firstHint: 'Отправьте свой первый zap', + regular: 'Постоянный', + regularHint: 'Отправьте 10 zaps', + generous: 'Щедрый', + generousHint: 'Отправьте 10 000 sats', + patron: 'Покровитель', + patronHint: 'Отправьте 100 000 sats', + top10: 'Топ-10', + top10Hint: 'Войдите в топ-10 сторонников', + }, + trust: { + unavailable: 'Оценка доверия недоступна', + yourContent: 'Это ваш контент', + following: 'Вы подписаны на этого пользователя', + friendOfFriend: 'Друг друга (2 рукопожатия)', + nip05: 'Пользователь, подтверждённый NIP-05', + unknown: 'Неизвестный пользователь', + help: 'Оценки доверия помогают выявлять надёжных участников скейтборд-сообщества.', + }, + share: { + title: 'Поделиться профилем', + desc: 'Наведите камеру телефона на код, чтобы открыть профиль {{name}}.', + qrAlt: 'QR-код профиля', + copyLink: 'Копировать ссылку', + copyFailed: 'Не удалось скопировать', + copyFailedDesc: 'Не удалось скопировать ссылку.', + shareEllipsis: 'Поделиться…', + }, + addToCollection: { + title: 'Сохранить в коллекцию', + desc: 'Сохранить «{{spot}}» в одну из ваших коллекций', + loginRequired: 'Пожалуйста, войдите, чтобы сохранять споты в коллекции', + noCollections: 'У вас пока нет коллекций', + createFirst: 'Создайте первую ниже!', + spotCount: '{{count}} спотов', + alreadySavedTag: 'Уже сохранено', + alreadySaved: 'Уже сохранено', + alreadySavedDesc: '«{{spot}}» уже в «{{collection}}»', + saved: 'Спот сохранён!', + savedDesc: '«{{spot}}» добавлен в «{{collection}}»', + saveFailed: 'Не удалось сохранить', + somethingWrong: 'Что-то пошло не так', + created: 'Коллекция создана!', + createdDesc: '«{{spot}}» добавлен в вашу новую коллекцию «{{collection}}»', + createFailed: 'Не удалось создать коллекцию', + name: 'Название коллекции', + descriptionOptional: 'Описание (необязательно)', + creating: 'Создание...', + createAndSave: 'Создать и сохранить', + createNew: 'Создать новую коллекцию', + }, + collection: { + back: 'Назад к коллекциям', + created: 'Создано {{date}}', + deleteTitle: 'Удалить коллекцию?', + deleteDesc: 'Это навсегда удалит «{{title}}». Сами споты не пострадают.', + deleting: 'Удаление...', + deleteFailed: 'Не удалось удалить коллекцию', + deleted: 'Коллекция удалена', + deletedDesc: '«{{title}}» была удалена', + empty: 'В этой коллекции нет спотов', + emptyOwner: 'Добавляйте споты в коллекцию, нажимая «Сохранить в коллекцию» на любом споте', + emptyOther: 'Эта коллекция пуста', + browseSpots: 'Обзор спотов', + linkCopied: 'Ссылка скопирована!', + linkCopiedDesc: 'Ссылка на коллекцию скопирована в буфер обмена', + map: 'Карта коллекции', + removeFailed: 'Не удалось удалить спот', + shareText: 'Зацени коллекцию спотов: {{title}}', + spotRemoved: 'Спот удалён', + spotRemovedDesc: '«{{title}}» был удалён из этой коллекции', + }, + mints: { + title: 'Mints', + subtitle: 'Обзор Cashu mints и их состояния. Операции с кошельком Cashu выполняются в приложении SkateSpots.', + searchPlaceholder: 'Поиск mints по названию или URL…', + onlineOnly: 'Только онлайн', + count: '{{filtered}} из {{total}} mints', + directoryError: 'Не удалось загрузить каталог mints.', + directoryHint: 'Каталог ведёт сообщество, и у него есть ограничение частоты — он может быть временно недоступен.', + goToWallet: 'Перейти к кошельку', + appOnly: 'Добавление mint происходит в приложении SkateSpots (Cashu только в приложении).', + noMatch: 'Нет mints, соответствующих «{{query}}».', + footer: 'Данные о состоянии из общественного проекта MintRadar — неофициально и может быть устаревшим. Всегда проверяйте условия mint, прежде чем доверять ему средства.', + archived: 'В архиве', + degraded: 'Ухудшено', + offline: 'Офлайн', + online: 'Онлайн', + terms: 'Условия', + reliability: 'надёжность', + add: 'Добавить', + addToWallet: 'Добавить в кошелёк', + copyUrl: 'Копировать URL', + openMint: 'Открыть mint', + inWallet: 'В вашем кошельке', + addedBadge: 'Добавлено', + urlCopied: 'URL mint скопирован', + added: 'Mint добавлен', + addedDesc: '{{host}} теперь в вашем кошельке.', + couldNotAdd: 'Не удалось добавить mint', + communityRating: 'Оценка сообщества', + reliabilityLabel: 'Надёжность', + uptime: 'Аптайм 24ч / 7д', + location: 'Расположение', + latency: 'Задержка', + nuts: 'Поддерживаемые NUTs', + units: 'Единицы', + version: 'Версия', + ratedBy: 'Оценка {{rating}}/5 от {{count}} человек на MintRadar.', + noRating: 'Пока нет оценки сообщества на MintRadar.', + reviewsNote1: 'Письменные отзывы не входят в каталог —', + openMintRadar: 'откройте MintRadar', + reviewsNote2: 'чтобы прочитать или оставить отзыв.', + liveness: 'Аудит активности: проверено {{mints}} mints и {{melts}} melts', + livenessErrors: ' · {{errors}}/{{total}} недавних ошибок', + whatsAMint: 'Что такое mint?', + whatsAMintDesc: 'Cashu mint выпускает и погашает ecash в вашем кошельке. Он держит Bitcoin, обеспечивающий ваши токены — поэтому mint, который вы не запускаете сами, требует доверия.', + mintWarning: 'Mints могут уходить в офлайн, менять условия или исчезать вместе со средствами. Храните только небольшие балансы, если не доверяете оператору.', + healthDisclaimer: 'Данные о состоянии ведёт сообщество (MintRadar) — неофициально и возможно устарело.', + }, + appShop: { + title: 'Магазин приложения', + subtitle: 'Мерч SkateSpots для тех, кто поддерживает движение.', + comingSoon: 'Скоро', + wearThe: 'Носи', + scene: 'Сцену', + heroDesc1: 'Мерч для тех, кто поддерживает движение — продаётся', + locally: 'локально, по запросу', + heroDesc2: '. Вы пишете мне, мы обсуждаем детали, и вы платите в', + heroDesc3: '— Lightning или Cashu — когда забираете. Никаких карт, аккаунтов, роботов-оформления и посредников, срезающих долю.', + requestItem: 'Запросить товар', + dmHint: 'Открывает приватное зашифрованное личное сообщение со мной.', + lightning: 'Lightning', + cashu: 'Cashu', + localHandover: 'Локальная передача', + inTheWorks: 'В работе', + notForSale: 'пока не продаётся', + soon: 'скоро', + tees: 'Футболки и худи', + decks: 'Деки', + shopTools: 'Инструменты магазина', + stickerPacks: 'Наборы стикеров', + stickerPacksDesc: 'Наборы в пути. Дизайнов пока нет — но эти два можно напечатать прямо сейчас, бесплатно.', + sticker: 'Стикер', + stickerTip: 'Чёрная вырубка. Печатайте на стикерной бумаге, обрезайте по чёрному краю.', + poster: 'Постер', + posterTip: 'Печатается на A3; уменьшите до A4 (50%) — и всё равно хорошо сканируется.', + printableAlt: 'SkateSpots {{title}} — для печати', + print: 'Печать', + printNote1: 'Печатайте в', + actualSize: '100% / «Реальный размер»', + printNote2: 'чтобы размер был точным, а QR оставался чётким — он ведёт на skate-spots.org. Векторные файлы, поэтому масштабируются без размытия.', + howBuying: 'Как проходит покупка', + dmNotCart: 'это личное сообщение, а не корзина', + step1Title: 'Напишите мне', + step1Desc: 'Отправьте личное сообщение с тем, что хотите — товар, размер, цвет, что угодно.', + step2Title: 'Мы всё обсудим', + step2Desc: 'Цена в sats, а также где и когда встретиться. Это разговор, а не оформление заказа.', + step3Title: 'Заплатите в sats', + step3Desc: 'Lightning или Cashu при передаче, и вещь ваша. Без доставки, без залов ожидания.', + }, + newsletter: { + newIssue: 'Новый выпуск', + composerTitle: 'Опубликовать выпуск рассылки', + composerDesc: 'Публикуется как статья NIP-23 (kind 30023) на общественном Relay. Подписчики получают её в колокольчике уведомлений. Тело поддерживает Markdown.', + fieldTitle: 'Заголовок', + identifier: 'Идентификатор (slug)', + leaveBlank: 'оставьте пустым для автосоздания', + reusingSlug: 'Повторное использование существующего slug редактирует этот выпуск вместо создания нового.', + summary: 'Краткое описание', + optional: 'необязательно', + coverImage: 'URL обложки', + bodyMarkdown: 'Тело (Markdown)', + characters: '{{count}} символов', + publishIssue: 'Опубликовать выпуск', + issuePublished: 'Выпуск опубликован! 🛹', + issuePublishedDesc: 'Подписчики увидят его в своём колокольчике уведомлений.', + publishFailed: 'Не удалось опубликовать', + couldNotReachRelay: 'Не удалось достичь ни одного Relay — проверьте соединение и попробуйте снова.', + tryAgain: 'Пожалуйста, попробуйте снова.', + publishedToNostr: 'Опубликовано в Nostr', + publishedToast: 'Опубликовано!', + postedToNostr: 'Дроп {{number}} опубликован в Nostr.', + postToNostr: 'Опубликовать в Nostr', + previewLabel: 'Предпросмотр', + editFirst: 'Сначала отредактируйте', + previewNoteDesc: 'Так заметка будет выглядеть в большинстве клиентов Nostr. Форматирование зависит от клиента.', + editNoteDesc: 'Отредактируйте текст заметки ниже. Изменения влияют только на эту публикацию — исходный файл остаётся неизменным.', + dropNumber: 'Дроп {{number}}', + publish: 'Опубликовать', + publishing: 'Публикация...', + dropIsOut: 'Дроп {{number}} вышел', + daysAgo: '{{count}} дн. назад', + dismiss: 'Отклонить', + itsMonday: 'Понедельник', + mondayDesc: 'Время выпускать еженедельную рассылку. Один клик — и ИИ напишет её из git-лога.', + writeDrop: 'Написать дроп {{number}}', + dismissReminder: 'Отклонить напоминание', + loginPrompt: 'Войдите через Nostr, чтобы получать новые дропы на почту.', + subscribedToast: 'Вы подписаны! 🛹', + subscribedToastDesc: 'Новые дропы появятся в вашем колокольчике уведомлений в разделе «Новости».', + unsubscribed: 'Отписка выполнена', + unsubscribedDesc: 'Вы по-прежнему можете читать любой выпуск здесь в любое время.', + checking: 'Проверка…', + subscribed: 'Подписаны', + unsubscribe: 'Отписаться', + subscribeCta: 'Подписаться на рассылку', + archiveSynced: 'Архив синхронизирован с Nostr', + missingCount: '{{count}} выпусков архива ещё нет в Nostr', + backfillDesc: 'Опубликуйте {{list}} как статьи NIP-23, чтобы подписчики и читатели длинных текстов увидели весь архив. Страница сохраняет свой богатый вид независимо от этого.', + backfill: 'Заполнить {{count}} в Nostr', + publishing2: 'Публикация…', + publishingLabel: 'Публикация…', + backfilled: 'Заполнено {{count}} выпусков 🛹', + backfilledDesc: 'Теперь архив живёт в Nostr для подписчиков и читателей.', + partialBackfill: 'Опубликовано {{published}}, не удалось {{failed}}', + retryFinish: 'Повторите, чтобы завершить: {{list}}.', + notLoggedIn: 'Вы не вошли', + allIssues: 'Все выпуски', + brand: 'Рассылка SkateSpots', + digTheDrop: 'Нравится дроп? Отправьте zap, чтобы не пропустить следующий.', + sectionStats: 'Сообщество в цифрах', + sectionWhatsNew: 'Что нового', + sectionSpotOfWeek: 'Спот недели', + sectionCommunity: 'Сообщество', + sectionSupport: 'Поддержите проект', + sectionLatestDrops: 'Последние дропы · Вживую из Nostr', + mappedBy: 'На карту нанёс', + viewOnMap: 'Посмотреть на карте', + noSpotPicked: 'На этой неделе спот не выбран. Предложите свой — и он может попасть в следующий дроп.', + browseMap: 'Обзор карты', + spotMap: 'Карта спотов', + statsBadge: 'Статистика', + supportDesc: '100% открытый исходный код, финансируется сообществом, без рекламы, без инвесторов. Если это полезно — отправьте zap или поддержите на Angor.', + readFull: 'Прочитать выпуск полностью', + joinSkaters: 'Присоединяйтесь к {{count}} скейтерам, получающим дропы', + weeklyDrops: 'Еженедельные дропы', + tagline: 'Еженедельная рассылка · выходит когда захотим', + freeNote: 'Бесплатно. Работает на Nostr — ваша подписка живёт на ваших ключах и следует за вами на всех устройствах. Новые дропы появляются в колокольчике уведомлений.', + live: 'Вживую', + builtOn: 'Создано на', + openSource: 'Открытый исходный код', + supportUs: 'Поддержите нас', + freeToSkate: 'Вы свободны кататься на скейтборде', + }, + stats: { + subtitle: 'Метрики в реальном времени, получаемые напрямую из сети Nostr. Прозрачно, децентрализованно, проверяемо кем угодно.', + dataSource: 'Источник данных:', + updated: 'обновлено {{age}}', + refresh: 'Обновить', + partial: 'Не удалось достичь всех Relay — эти числа могут быть неполными.', + error: 'Сейчас не удалось достичь Relay. Статистика загрузится, как только соединение восстановится.', + atAGlance: 'Сообщество одним взглядом', + skateSpots: 'Скейт-споты', + listedShops: 'Магазины в списке', + events: 'События', + mappers: 'Картографы', + uniqueContributors: 'уникальных участников', + labHeader: 'The Lab · Авторы и услуги', + total: '{{count}} всего', + coaches: 'Тренеры', + filmers: 'Операторы', + editors: 'Монтажёры', + photographers: 'Фотографы', + builders: 'Строители', + artists: 'Художники', + graffiti: 'Граффити', + tattoo: 'Тату', + trainers: 'Инструкторы', + musicians: 'Музыканты', + judges: 'Судьи', + organizers: 'Организаторы', + barbers: 'Барберы', + showFewer: 'Показать меньше', + showAllCrafts: 'Показать все 13 ремёсел', + community: 'Сообщество', + tours: 'Туры', + crews: 'Команды', + marketplace: 'Маркетплейс', + liveListings: 'Активные объявления', + tradesRecorded: 'Записанных сделок', + satsTraded: 'Обменено sats', + zapsToMappers: 'Zaps картографам', + tradesNote1: 'взаимных сделок среди', + tradesNote2: 'человек. Sats указывают сами участники сделок — приложение не может наблюдать платёж вне приложения — поэтому в заголовок попадают только', + mutual: 'взаимные', + tradesNote3: 'сделки с лимитом на пару; заявленная сумма —', + tradesNote4: 'sats. «Zaps картографам» учитывает только чеки, адресованные нашим главным участникам — это', + not: 'не', + tradesNote5: 'общий объём zaps.', + byRegion: 'Споты и магазины по регионам', + resolving: 'Определяем {{count}} мест без метки по их координатам… однократно, затем кэшируется на этом устройстве.', + topCountries: 'Топ стран', + topCities: 'Топ городов', + other: 'Другое', + otherCountriesTitle: 'Страны за пределами топ-6', + otherCitiesTitle: 'Города за пределами топ-6', + uncategorised: 'Без категории', + uncategorisedTitle: 'Нет метки города/страны', + regionNote1: 'Считаются', + spotsAndShops: 'споты и магазины', + regionNote2: ', а не скейтеры — по собственной метке города/страны каждого, или получены из координат его пина, если метки нет (кэшируется на вашем устройстве; страны группируются по ISO-коду, когда он есть), только общественный Relay, с исключением скрытого модерацией контента.', + ofTotal: '{{count}} из {{total}}', + regionNote3: 'мест не имеют метки местоположения и показываются как «Без категории».', + growth: 'Рост во времени', + chartCumulativeTitle: 'Нанесённые споты (накопительно)', + chartCumulativeDesc: 'Общее число спотов, добавленных на карту со временем', + chartMonthlyTitle: 'Месячная активность', + chartMonthlyDesc: 'Новый контент, публикуемый каждый месяц', + chartMappersTitle: 'Активные картографы / месяц', + chartMappersDesc: 'Уникальные участники, публикующие каждый месяц', + chartMixTitle: 'Состав контента', + chartMixDesc: 'Разбивка по типу контента (за всё время)', + noData: 'Пока нет данных', + topMappers: 'Лучшие картографы', + mostSpots: '— больше всего добавленных спотов', + noMapperData: 'Пока нет данных о картографах', + topShops: 'Лучшие магазины', + mostShops: '— больше всего добавленных магазинов', + shopCount: '{{count}} магазинов', + noShopData: 'Пока нет данных о магазинах', + supporters: 'Сторонники сообщества', + fundedTitle: 'Финансируется сообществом', + fundedDesc1: 'Децентрализованный краудфандинг Bitcoin через Angor.', + fundedDesc2: 'Без рекламы, без инвесторов, без продажи данных.', + backAngor: 'Поддержите нас на Angor', + communityLink: 'Сообщество →', + footer1: 'Все данные берутся вживую из', + footer2: '— публичного Relay Nostr.', + footer3: 'Каждое событие подписано его создателем и криптографически проверяемо.', + footer4: 'Никакие числа нельзя подделать.', + spots: 'Споты', + shops: 'Магазины', + lab: 'Lab', + thisMonth: '+{{count}} за этот месяц', + fromActive: '{{count}} от активных аккаунтов', + viewAll: 'Посмотреть все', + spotCount: '{{count}} спотов', + }, + leaderboard: { + mapEarn: 'Картируй и зарабатывай', + helpMap: 'ПОМОГИТЕ НАНЕСТИ МИР НА КАРТУ', + intro: 'Добавляйте споты и магазины, получайте zaps от благодарных скейтеров. Лучшие участники могут получить бонусные награды!', + howItWorks: 'Как это работает', + step1Title: '1. Картируйте', + step1Desc: 'Добавляйте споты и магазины с фото и деталями', + step2Title: '2. Зарабатывайте zaps', + step2Desc: 'Скейтеры, которым пригодились ваши споты, отблагодарят вас', + step3Title: '3. Бонусные награды', + step3Desc: 'Лучшие картографы могут получить бонусные награды из нашего фонда', + proTips: '💡 Советы профи для больших zaps:', + tipPhotos: 'Добавьте 3+ фото', + tipDescriptions: 'Пишите подробные описания', + tipLocation: 'Точное местоположение', + mapShop: 'Нанести магазин', + mapShopDesc: 'Скейт-магазины, борд-шопы', + mapSpot: 'Нанести спот', + mapSpotDesc: 'Парки, стритовые споты, DIY', + shops: 'Магазины', + spotsLower: 'спотов', + shopsLower: 'магазинов', + contributions: 'вкладов', + yourRanking: 'Ваш рейтинг', + spotsShops: '{{spots}} спотов • {{shops}} магазинов', + totalLower: 'всего', + overall: 'Общий', + noContributions: 'Пока нет вкладов. Будьте первым!', + addFirstSpot: 'Добавить первый спот', + noShops: 'Пока нет нанесённых магазинов', + addFirstShop: 'Добавить первый магазин', + noSpots: 'Пока нет нанесённых спотов', + poweredBy: 'Работает на zaps сообщества', + poweredByDesc: 'Когда вы находите спот полезным, отправьте zap картографу! Это лучший способ поблагодарить и поощрить новые вклады.', + you: 'Вы', + zapTitle: 'Таблицы лидеров по zaps', + zapSubtitle: 'Споты, получающие больше всего любви — и скейтеры, которые её дарят.', + thisWeek: 'На этой неделе', + thisMonth: 'В этом месяце', + allTime: 'За всё время', + topZappedSpots: 'Споты с наибольшим числом zaps', + noZaps: 'В этот период пока нет zaps. Будьте первым — нажмите ⚡ на споте, который любите.', + topSupporters: 'Лучшие сторонники', + noZapsSent: 'В этот период пока не отправлено zaps.', + fromTop10: '⚡ {{amount}} sats от топ-10', + supporter: 'Сторонник', + skateShop: 'Скейт-магазин', + skateSpot: 'Скейт-спот', + }, + supporters: { + our: 'НАШЕ', + community: 'СООБЩЕСТВО', + heroDesc: 'SkateSpots создаётся сообществом и для сообщества. Сторонники, соратники, партнёры и друзья, поддерживающие проект бесплатным и децентрализованным.', + backAngor: 'Поддержите нас на Angor', + backers: 'Сторонники', + backersDesc: 'Скейтеры, поддержавшие SkateSpots — финансирование on-chain через Angor и Lightning zaps проекту.', + sourceAngor: 'Angor', + supportersTotals: '{{count}} сторонников · {{angor}} sats через Angor · {{zap}} sats отправлено zaps', + quietNote: 'Плюс все, кто помог тихо — спасибо вам. ❤️', + silentTitle: 'Приватно on-chain (silent payments)', + silentDesc: 'Одно имя, новый адрес для каждого платежа — on-chain через silent payments или Lightning из той же записи. Нечего переиспользовать, нечего связывать.', + silentCopyName: 'Копировать имя', + silentCopied: 'Скопировано', + silentWallets: 'Нужен кошелёк с поддержкой payment names / silent payments: Sparrow, Cake, Dana, Phoenix, BlueWallet, Wasabi, Nunchuk или BitBox02.', + wayLightningTitle: 'Мгновенно и публично', + wayLightningDesc: 'Отправьте zap SkateSpots или заплатите тихо. Работает без входа.', + waySilentTitle: 'Приватно on-chain', + waySilentDesc: 'Имя для silent payments — новый адрес для каждого платежа.', + wayAngorTitle: 'Финансируйте разработку', + wayAngorDesc: 'Angor — поэтапное финансирование, возврат при сумме выше 100k sats.', + donateTitle: 'Поддержите SkateSpots', + donateDesc: 'Три способа, три причины — выберите подходящий. Каждый sat сохраняет карту бесплатной, без рекламы и с открытым кодом.', + donatePageLink: 'Открыть простую страницу для пожертвований', + updatedAt: 'Обновлено {{when}}', + tiersNote: 'Уровни: Сторонник до 100k sats · Покровитель 100k–1M · Легенда 1M+', + tierEmpty: 'Пока никого — будьте первым.', + joinSupporters: 'Присоединяйтесь к {{count}} сторонникам', + showAll: 'Показать всех {{count}}', + showLess: 'Показать меньше', + impactSeeStats: 'Увидеть полную картину →', + impactAsOf: 'вживую из общественных Relay', + anonymousBacker: 'Анонимный сторонник', + beFirstBacker: 'Публичных сторонников пока нет — будьте первым.', + backersTotal: '{{count}} сторонников · {{amount}} sats собрано', + verifiedOnChain: 'Проверено on-chain', + supportedBy: 'Поддерживается {{count}}', + tierSupporter: 'Сторонник', + tierPatron: 'Покровитель', + tierLegend: 'Легенда', + topZappers: 'Отправили zap SkateSpots', + topZappersDesc: 'Скейтеры, отправившие публичный zap прямо проекту. Тихие платежи не перечисляются.', + paysFor: 'На что идёт ваша поддержка', + paysForDesc: 'Куда идёт каждый sat — без зарплат, офисов и рекламы.', + payRelay: 'Хостинг Relay', + payDomain: 'Домен и TLS', + payAi: 'Узел ИИ / ContextVM', + payDev: 'Время на разработку', + payOps: 'Операции', + payMarketing: 'Маркетинг', + payRelayDesc: 'Поддерживает карту в сети и устойчивой.', + payDomainDesc: 'Имя, сертификат, защищённое соединение.', + payAiDesc: 'Sasquatch, гид сообщества.', + payDevDesc: 'Создание и исправление SkateSpots.', + payOpsDesc: 'Незаметная работа, которая поддерживает всё в рабочем состоянии.', + payMarketingDesc: 'Охват новых локальных сцен и скейт-магазинов.', + impact: 'Влияние на данный момент', + impactDesc: 'Что построило сообщество — при поддержке скейтеров.', + impactSpots: 'Споты', + impactCrews: 'Команды', + impactEvents: 'События', + impactLab: 'Профи Lab', + impactShops: 'Магазины', + impactMappers: 'Картографы', + support: 'Поддержка', + supportDesc: 'Финансируйте SkateSpots на Angor — децентрализованный краудфандинг Bitcoin on-chain. Без посредников, без KYC.', + collaborators: 'Соратники', + collaboratorsDesc: 'Люди, активно создающие SkateSpots — разработчики, дизайнеры, операторы Relay.', + partners: 'Партнёры', + partnersDesc: 'Организации и проекты, с которыми мы тесно работаем.', + friends: 'Друзья', + friendsDesc: 'Люди, с которыми мы на одной волне.', + backTitle: 'Поддержите проект на Angor', + backDesc: 'Angor — децентрализованное финансирование Bitcoin on-chain, построенное на Nostr — ваши средства остаются под вашим контролем, выдаются поэтапно, и никакой кастодиан не держит банк. Взносы до 100 000 sats работают как пожертвование (без процедуры возврата); более крупные суммы — это инвестиции, неизрасходованные средства которых можно вернуть. Каждый sat идёт на разработку, хостинг Relay и сохранение SkateSpots бесплатным для каждого скейтера на земле.', + donateNote: 'Предпочитаете простое пожертвование? ⚡ Отправьте zap ниже — нечего возвращать, нечего восстанавливать.', + openAngor: 'Открыть Angor', + orZap: 'или ⚡ отправьте zap любому споту, команде или автору прямо в приложении', + wantCollaborate: 'Хотите сотрудничать?', + wantCollaborateDesc: 'Разработчики, дизайнеры, скейтеры с навыками — напишите нам.', + viewNostrHub: 'Смотреть на NostrHub', + wantPartner: 'Хотите стать партнёром SkateSpots? Напишите нам в Nostr.', + comingSoon: 'Скоро', + wantListed: 'Хотите быть в списке?', + wantListedDesc: 'Пришлите логотип (PNG/WebP, прозрачный фон, минимум 200×200px) и ваш URL в личном сообщении в Nostr — только если совпадаете по вайбу.', + whyTitle1: 'Почему нам нужна', + whyTitle2: 'поддержка', + whyDesc: 'SkateSpots на 100% бесплатен, с открытым исходным кодом и построен на Nostr — децентрализованном протоколе без центрального сервера, который можно отключить. Без рекламы, без продажи данных, без инвесторов. Каждый sat идёт напрямую на разработку, хостинг Relay и сохранение этого бесплатным для каждого скейтера на земле.', + why1Title: 'Нативный для Nostr', + why1Desc: 'Нет центрального сервера. Ваши данные живут на Relay, которые вы выбираете.', + why2Title: 'На базе Bitcoin', + why2Desc: 'Зарабатывайте sats за нанесение спотов на карту. Тратьте их в местных магазинах.', + why3Title: 'Бесплатно навсегда', + why3Desc: 'Открытый исходный код, без платных барьеров, без слежки, без венчурного финансирования.', + thankYou: 'Спасибо. Каждый sat сохраняет споты на карте. 🛹⚡', + license: 'Лицензия', + faq: 'FAQ', + }, + admin: { + confirmed: 'Подтверждено', + title: 'Очередь проверки', + subtitle: 'Споты, магазины, события, туры и снаряжение, которые срабатывают на сигналы мусора. «Скрыть» и «Подтвердить» — мягкие, обратимые метки; отчёты идут первыми. Ничего не удаляется.', + tabReports: 'Отчёты', + tabSpots: 'Споты', + tabShops: 'Магазины', + tabEvents: 'События', + tabTours: 'Туры', + tabGear: 'Снаряжение', + tabCrews: 'Команды', + tabLab: 'Lab', + tabClaims: 'Заявки на владение', + nothingToReview: 'Нечего проверять — ничего такого рода не срабатывает на сигналы мусора.', + hideActioned: 'Скрыть обработанные', + showActioned: 'Показать обработанные ({{count}})', + undoAll: 'Отменить все {{count}}', + undoAllTitle: 'Отменить все вердикты на этой вкладке?', + undoAllDesc: 'Это вернёт каждый элемент в нейтральное состояние — не скрыт, не подтверждён. Публикуется одна публичная метка на элемент, поэтому с Amber вы получите {{count}} экранов подтверждения.', + undoCount: 'Отменить {{count}}', + undo: 'Отменить', + confirm: 'Подтвердить', + hide: 'Скрыть', + hideIt: 'Скрыть это', + hideForEveryone: 'Скрыть это для всех?', + hideForEveryoneDesc: 'Это уберёт элемент из обзора и поиска для всех пользователей SkateSpots. Это публичная, обратимая метка — вы можете отменить её из этой очереди.', + hidden: 'Скрыто', + hiddenDesc: 'Убрано из приложения через публичную метку. Обратимо.', + couldNotHide: 'Не удалось скрыть', + notASpot: 'Не скейт-спот', + lookAtIt: 'Посмотреть', + }, + profile: { + nip05Verified: 'NIP-05 подтверждён', + nip05NotVerified: 'NIP-05 не подтверждён для этого ключа', + message: 'Сообщение', + zapsReceived: 'zaps получено', + memberSince: 'Участник с', + badges: 'Значки', + sponsorsSupport: 'Спонсоры и поддержка', + skater: 'Скейтер', + stance: 'Стойка', + skating: 'Катание', + homeSpot: 'Домашний спот', + basedIn: 'Базируется в', + addSkateDetails: 'Добавьте свои скейт-данные', + addSkateDetailsDesc: 'Укажите стойку, стили и уровень, чтобы появиться в каталоге скейтеров.', + spotsAdded: 'Добавлено спотов', + shopsAdded: 'Добавлено магазинов', + noSpots: 'Вы пока не добавили ни одного спота', + noSpotsDesc: 'Нанесите свой локальный спот на карту →', + stash: 'Stash', + gear: 'Снаряжение', + crews: 'Команды', + info: 'Информация', + lightning: 'Lightning', + silentPayment: 'Silent Payment', + coordinator: 'Координатор', + coordinatorAdded: 'Координатор добавлен', + add: 'Добавить', + messagePrivately: 'Написать лично', + founder: 'Основатель', + member: 'Участник', + supportSkater: 'Поддержать этого скейтера', + supportSkaterDesc: 'Отправьте чаевые в благодарность за вклад', + }, + index: { + joinCommunity: 'Присоединяйтесь к сообществу, чтобы добавлять споты, создавать события и многое другое', + topZapped: 'ТОП ПО ZAPS', + topZappedDesc: 'Споты с наибольшей поддержкой в этом месяце', + leaderboard: 'Таблица лидеров', + newHere: 'ВПЕРВЫЕ ЗДЕСЬ?', + newHereDesc: 'Создайте бесплатный аккаунт, чтобы добавлять споты, присоединяться к событиям, общаться со скейтерами и стать частью сообщества. Электронная почта не требуется.', + followFounder: 'Подпишитесь на основателя', + followFounderDesc: 'Удерживайте аватар 3 секунды, чтобы подписаться и быть в курсе новых функций и событий!', + createAccount: 'Создать аккаунт', + accountWorks: 'Ваш аккаунт работает во всех приложениях сети', + footerTagline: 'Открытый исходный код • Принадлежит сообществу • Без рекламы', + }, + stash: { + title: 'Мой Stash', + loginDesc: 'Ваш приватный инвентарь снаряжения. Отслеживайте, что у вас есть, устанавливайте цены и выборочно делитесь с обменщиками.', + encrypted: 'Зашифровано', + syncsEverywhere: 'Синхронизируется везде', + p2pTrading: 'P2P-обмен', + encryptionRequired: 'Требуется шифрование', + encryptionRequiredDesc: 'Ваш Stash зашифрован для приватности. Пожалуйста, используйте подписант с поддержкой шифрования NIP-44 (например, Alby, nos2x или Amber).', + learnSigners: 'Узнать о подписантах', + select: 'Выбрать', + stash: 'Stash', + wishlist: 'Список желаний', + allCategories: 'Все категории', + sortNewest: 'Новые', + sortValue: 'Стоимость', + sortCondition: 'Состояние', + sortAz: 'А–Я', + friendsOnly: 'Только для друзей', + addToWishlist: 'Добавить в список желаний', + addItemToStash: 'Добавить предмет в Stash', + addItem: 'Добавить предмет', + editItem: 'Редактировать предмет', + publicStash: 'Публичный Stash', + listView: 'Список', + gridView: 'Сетка', + uploading: 'Загрузка...', + addPhotos: 'Добавить фото', + wishlistReqPlaceholder: 'Особые требования...', + itemDescPlaceholder: 'Опишите предмет, любые повреждения...', + itemsCount: '{{count}} предмет(ов)', + wishlistEmpty: 'Список желаний пуст', + wishlistEmptyDesc: 'Добавьте снаряжение, которое ищете — мы подберём вам Stash друзей.', + stashEmpty: 'Ваш Stash пуст', + stashEmptyDesc: 'Начните отслеживать своё снаряжение. Деки, подвески, обувь — добавьте один раз, доступно везде через Nostr.', + noMatch: 'Нет подходящих предметов', + noMatchDesc: 'Попробуйте изменить фильтры.', + backupTransfer: 'Резервная копия и перенос', + backupDesc: 'Ваш Stash зашифрован на Nostr. Храните копию под своим контролем — мёртвый Relay или новый аккаунт не смогут потерять ваш список снаряжения.', + exportTitle: 'Зашифрованная резервная копия', + exportDialogDesc: 'Сохраните {{count}} предмет(ов) в файл. Зашифруйте его, чтобы утёкший файл не стал утечкой.', + modePassword: 'Пароль', + modeKey: 'Мой ключ', + password: 'Пароль', + confirmPassword: 'Подтвердите пароль', + passwordHint: 'Используйте не менее 8 символов. Восстановления нет — не забудьте его.', + keyModeHint: 'Зашифровано вашим ключом Nostr. Только этот ключ может его открыть — ничего запоминать не нужно.', + exportPlaintext: 'Экспорт без шифрования', + pwTooShort: 'Используйте не менее 8 символов.', + pwMismatch: 'Пароли не совпадают.', + exportFailed: 'Не удалось создать резервную копию.', + unlockTitle: 'Разблокировать резервную копию', + unlockDesc: 'Эта резервная копия защищена паролем.', + unlock: 'Разблокировать', + unlockFailed: 'Не удалось разблокировать резервную копию.', + show: 'Показать', + hide: 'Скрыть', + strength: 'Надёжность пароля', + strengthWeak: 'Слабый', + strengthFair: 'Средний', + strengthGood: 'Хороший', + strengthStrong: 'Надёжный', + filenameWillSave: 'Будет сохранено как {{name}}', + export: 'Экспорт', + import: 'Импорт', + exported: 'Stash экспортирован', + exportedDesc: '{{count}} предметов сохранено в файл.', + noItemsInFile: 'В этом файле не найдено предметов.', + noValidItems: 'В этом файле не найдено корректных предметов.', + imported: 'Импортировано {{count}} предметов', + importSkipped: '{{count}} пропущено (уже в вашем Stash).', + importAdded: 'Добавлено в ваш Stash.', + importFailed: 'Импорт не удался', + couldNotRead: 'Не удалось прочитать этот файл.', + updateFailed: 'Не удалось обновить ваш Stash', + updatedCount: 'Обновлено {{count}} предметов', + markedForSale: 'Отмечено {{count}} на продажу', + unmarkedCount: 'Снято с продажи {{count}}', + removedCount: 'Удалено {{count}} предметов', + selectedCount: '{{count}} выбрано', + selectAll: 'Выбрать все', + visibilityPublic: 'Публичный', + visibilityPrivate: 'Приватный', + forSale: 'На продажу', + remove: 'Удалить', + bulkDeleteTitle: 'Удалить {{count}} предметов?', + bulkDeleteDesc: 'Это перезапишет ваш зашифрованный Stash одной подписью и не может быть отменено здесь. Сначала экспортируйте резервную копию, если не уверены.', + deleteTitle: 'Удалить из вашего Stash?', + deleteDesc: '«{{title}}» будет удалён из вашего Stash', + deleteDescPublic: ' и снят с публичной витрины', + deleteUndone: '. Это нельзя отменить.', + deleteDescGeneric: 'Этот предмет будет удалён из вашего Stash. Это нельзя отменить.', + listOnMarketplace: 'Выставить на Маркетплейсе', + noPriceSet: 'Цена не указана', + categoryLabel: 'Категория', + photosLabel: 'Фото', + willingToSell: 'Готов продать', + willingToTrade: 'Готов обменять', + whereIsThisItem: 'Где находится этот предмет?', + visibilityLabel: 'Видимость', + visibilityPrivateOnlyYou: 'Приватный — только вы', + visibilityFriendsMutual: 'Друзья — взаимные подписки', + visibilityPublicAnyone: 'Публичный — все', + visibilityFriends: 'Друзья', + brandLabel: 'Бренд', + sizeLabel: 'Размер', + descriptionLabel: 'Описание', + conditionLabel: 'Состояние', + itemName: 'Название предмета', + saveChanges: 'Сохранить изменения', + listItemDialogTitle: 'Выставить «{{title}}»', + pickUpWhere: 'Где покупатели могут забрать этот предмет?', + linkToSpot: 'Привязать к скейт-споту', + linkToSpotDesc: 'Лучше всего для локальных продаж • Показывается на странице спота и карте', + recommended: 'Рекомендуется', + noSpecificSpot: 'Без конкретного спота', + noSpecificSpotDesc: 'Видно только на странице Маркетплейса', + tipLinkedSpots: '💡 Совет: объявления, привязанные к спотам, легче найти местным скейтерам.', + anyoneCanSee: 'Любой может видеть это в вашем профиле.', + seeWhatOthersSee: 'Посмотреть, что видят другие', + inventory: 'Инвентарь', + publicWantsNote: 'Публичные желания публикуются в Маркетплейсе как объявления «ищу», чтобы продавцы могли вас найти.', + howItWorks: 'Как это работает', + tapToMarketplace: 'Нажмите, чтобы перейти в Маркетплейс →', + viewWishlist: 'Посмотреть список желаний', + tipEditItems: 'Редактируйте предметы кнопкой с карандашом', + tipListForSale: 'Выставляйте на продажу кнопкой магазина', + tipAddPhotos: 'Добавляйте фото для лучших предложений обмена', + tipKeySyncs: 'Ключ Nostr синхронизируется на все устройства', + itemsReadyToSell: '{{count}} предмет(ов) готово к продаже', + }, + }, +}; export default ruBatch4; diff --git a/src/i18n/ru/batch5.ts b/src/i18n/ru/batch5.ts index 3b0efd4..f076ffc 100644 --- a/src/i18n/ru/batch5.ts +++ b/src/i18n/ru/batch5.ts @@ -1,4 +1,1603 @@ -/** ru — batch 5. Filled by the translation pass; empty until then. */ -const ruBatch5 = {}; +/** + * Russian (ru-RU) — batch 5: The Lab (labUi) + social/crews/DMs (socialUi). + * + * Skate vocabulary stays English (The Lab, Coach, Filmer, Photographer, Editor, + * Builder, Crew, Spot, Stash, Nostr, Lightning, Zap, sats, DM, NWC, NIP-05); + * all trick names stay English. + */ +const ruBatch5 = { + labUi: { + activeCount: '{{count}} активных', + addMusicProfile: 'Добавить музыкальный профиль', + all: 'Все', + clearAll: 'Очистить всё', + collective: 'Коллектив', + filters: 'Фильтры', + following: 'Подписки', + getRiderCard: 'Получить Rider Card', + judgeEvents: 'Судить события', + justASkater: 'Просто', + labForServices: "The Lab — для услуг. Смотрите и присоединяйтесь ко всему сообществу скейтеров", + loginToOffer: 'Войдите, чтобы предлагать услуги', + newest: 'Новые', + noResults: 'Нет результатов', + offer: 'Предложить', + offerBuilding: 'Предложить строительство', + offerCoaching: 'Предложить коучинг', + offerCuts: 'Предложить монтаж', + offerDesignArt: 'Предложить дизайн / арт', + offerEditing: 'Предложить монтаж', + offerFilming: 'Предложить съёмку', + offerGraffiti: 'Предложить граффити', + offerPhotography: 'Предложить фотографию', + offerServices: 'Предложить услуги', + yourProfiles: 'Ваши профили в The Lab', + preview: { + button: 'Просмотр', + title: 'Живой просмотр', + desc: 'Так будет выглядеть ваш профиль {{noun}} после публикации.', + untitled: 'Ваше имя', + noBio: 'Пока нет описания — добавьте строку о том, что вы предлагаете.', + years: 'Опыт {{count}} лет', + portfolio: 'Портфолио', + note: 'Только просмотр — пока ничего не опубликовано.', + }, + draft: { + title: 'У вас есть несохранённый черновик', + body: 'Продолжите с того места, где остановились — ничего не публикуется, пока вы не нажмёте «Опубликовать».', + resume: 'Продолжить черновик', + discard: 'Удалить черновик', + }, + progress: { + title: 'Заполненность профиля', + count: '{{done}} из {{total}} готово', + photo: 'Фото', + bio: 'Описание', + skills: 'Навыки', + rate: 'Ставка', + location: 'Местоположение', + contact: 'Контакт', + }, + wizard: { + identity: 'Личность', + offer: 'Что вы предлагаете', + rates: 'Ставки', + contact: 'Контакт', + media: 'Медиа', + }, + offerTattoo: 'Предложить тату', + offerTraining: 'Предложить тренировки / физио', + organizeEvents: 'Организовать события', + resultsMany: '{{count}} результатов', + resultsOne: '{{count}} результат', + searchCityPlaceholder: 'Город…', + searchNamePlaceholder: 'Имя, описание…', + showResults: 'Показать результаты', + showResultsActive: 'Показать результаты · {{count}} активных', + skaterWord: 'скейтер', + sortBy: 'Сортировать по', + theCrew: 'The Crew', + topRated: 'Лучшие по рейтингу', + trusted: 'Проверенные', + trustLevel: 'Уровень доверия', + yearsExp: 'опыт {{count}} л.', + tabCoaches: 'Coaches', + tabFilmers: 'Filmers', + tabPhoto: 'Фото', + tabEditors: 'Editors', + tabBuilders: 'Builders', + tabArtists: 'Художники', + tabGraffiti: 'Граффити', + tabTattoo: 'Тату', + tabTrainers: 'Тренеры', + tabMusic: 'Музыка', + tabJudges: 'Судьи', + tabOrganizers: 'Организаторы', + tabBarbers: 'Барберы', + filterSkillsToLearn: 'Навыки для изучения', + filterContentType: 'Тип контента', + filterEquipmentStyle: 'Снаряжение и стиль', + filterServices: 'Услуги', + filterCamera: 'Камера', + filterLenses: 'Объективы', + filterLighting: 'Свет', + filterSupportRig: 'Опоры и оснастка', + filterStyle: 'Стиль', + filterWhatTheyBuild: 'Что они строят', + filterMaterialsTrade: 'Материалы и ремесло', + filterProjectScale: 'Масштаб проекта', + filterWhatTheyMake: 'Что они создают', + filterMedium: 'Материал', + filterSoftwareTools: 'Софт и инструменты', + filterWorkContext: 'Контекст работы', + filterMethod: 'Метод', + filterFocus: 'Направление', + filterInjuriesTreated: 'Какие травмы лечат', + filterCredentialsSetting: 'Квалификация и условия', + filterGenre: 'Жанр', + filterInstrumentsRole: 'Инструменты и роль', + filterEventFormats: 'Форматы событий', + filterSpecialty: 'Специализация', + filterLevelCircuit: 'Уровень / серия', + filterEventTypes: 'Типы событий', + filterWhatYouHandle: 'Что вы берёте на себя', + filterScale: 'Масштаб', + filterWhatTheyOffer: 'Что они предлагают', + filterSignatureStyles: 'Фирменные стили', + filterSetting: 'Условия', + filterEditType: 'Тип монтажа', + role: { + coach: 'Coach', + filmer: 'Filmer', + builder: 'Builder', + editor: 'Editor', + photographer: 'Photographer', + skater: 'Скейтер', + }, + empty: { + footer: 'Есть вопросы? Посмотрите FAQ →', + loginSuffix: 'чтобы создать профиль.', + coachesTitle: 'Пока нет Coach', + coachesBody: 'Станьте первым, кто предлагает обучение скейтбордингу в вашем районе.', + filmersTitle: 'Пока нет Filmer', + filmersBody: 'Станьте первым, кто предлагает скейт-съёмку — клипы, полные парты, освещение соревнований и многое другое.', + photographersTitle: 'Пока нет Photographer', + photographersBody: 'Станьте первым, кто предлагает скейт-фотографию в вашем районе — экшн-кадры, серии, редакционные снимки и многое другое.', + editorsTitle: 'Пока нет Editors', + editorsBody: 'Станьте первым, кто предлагает услуги монтажа скейт-видео.', + buildersTitle: 'Пока нет Builder', + buildersBody: 'Станьте первым, кто добавит строительство рамп, парков или DIY — бетон, дерево, перила и многое другое.', + artistsTitle: 'Пока нет художников', + artistsBody: 'Станьте первым, кто предлагает графику для досок, логотипы, постеры и мерч для сцены.', + graffitiTitle: 'Пока нет граффити-художников', + graffitiBody: 'Станьте первым, кто предлагает работы, муралы и оформление скейт-парков в вашем районе.', + tattooTitle: 'Пока нет мастеров тату', + tattooBody: 'Станьте первым мастером тату в скейт-культуре — флеш, индивидуальные работы, тонкая линия и многое другое.', + trainersTitle: 'Пока нет тренеров', + trainersBody: 'Станьте первым тренером или физио, кто помогает скейтерам становиться сильнее и оставаться здоровыми.', + musiciansTitle: 'Пока нет музыкантов', + musiciansBody: 'Скейтите и делаете музыку? Добавьте свою группу или сольный проект — жанры, инструменты и ссылки.', + judgesTitle: 'Пока нет судей', + judgesBody: 'Проводите честные соревнования? Добавьте себя, чтобы судить Game of S.K.A.T.E., best trick jams, контесты и этапы туров.', + organizersTitle: 'Пока нет организаторов', + organizersBody: 'Устраиваете джемы, контесты, встречи или демо? Добавьте себя, чтобы скейтеры могли найти и пригласить вас.', + barbersTitle: 'Пока нет барберов', + barbersBody: 'Стрижёте скейтеров? Добавьте своё кресло или выездную услугу, чтобы сцена могла освежить стрижку.', + }, + become: { + addNip05: 'Добавьте NIP-05 в настройках', + backToLab: 'Назад в The Lab', + bioWorkLabel: 'Описание / о вашей работе', + checkContact: 'Проверьте контактные данные', + cityArea: 'Город / район', + cityCountry: 'Город, страна', + connectWallet: 'Подключить кошелёк', + connectWalletNwc: 'Подключить кошелёк через NWC', + contactInfo: 'Контактная информация', + contactInfoDesc: 'Как клиенты могут с вами связаться (всё необязательно, но рекомендуется)', + coordinatesOptional: 'Координаты (необязательно)', + email: 'Email', + failedToPublish: 'Не удалось опубликовать', + fromNostrProfile: 'Из вашего профиля Nostr', + geolocationUnsupported: 'Геолокация не поддерживается', + getting: 'Получение…', + headline: 'Заголовок', + headlineHint: 'Показывается как заголовок на вашей карточке в The Lab — например, «{{example}}». По умолчанию — ваше имя.', + imageUploaded: 'Изображение загружено', + instagram: 'Instagram', + invalidEmail: 'Введите корректный адрес email.', + invalidPortfolio: 'Введите корректный URL портфолио.', + invalidWebsite: 'Введите корректный URL сайта.', + latitude: 'Широта', + learnHow: 'Как это работает', + locationError: 'Ошибка местоположения', + locationFound: 'Местоположение найдено', + loginRequired: 'Требуется вход', + loginRequiredDesc: 'Войдите, чтобы создать профиль {{role}}.', + loginRequiredDescCraft: 'Войдите, чтобы создать профиль {{noun}}.', + longitude: 'Долгота', + nip05Recommended: 'Рекомендуется верификация NIP-05', + nip05RecommendedDesc: 'Подтвердите личность, чтобы завоевать доверие клиентов.', + noWallet: 'Кошелёк не подключён', + otherSocial: 'Другие соцсети', + paymentSetup: '⚡ Требуется настройка оплаты', + phoneNumber: 'Номер телефона', + profilePhoto: 'Фото профиля', + profilePublished: 'Ваш профиль опубликован.', + publishing: 'Публикация...', + socialMedia: 'Соцсети', + tip: '💡 Совет: большинство Lightning-кошельков поддерживают NWC (Alby, Minibits, Zeus, Coinos).', + tipWithTime: '💡 Совет: большинство Lightning-кошельков поддерживают NWC (Alby, Minibits, Zeus, Coinos). Настройка занимает 30 секунд.', + upload: 'Загрузить', + uploadFailed: 'Не удалось загрузить', + uploadImage: 'Загрузить изображение', + uploading: 'Загрузка…', + useCurrentLocation: 'Использовать текущее местоположение', + useMyLocation: 'Использовать моё местоположение', + usingNwc: 'Используется Nostr Wallet Connect', + usingWebln: 'Используется расширение WebLN', + walletConnected: 'Кошелёк подключён — готов принимать платежи!', + website: 'Сайт', + yearsExperience: 'Опыт (лет)', + }, + coachForm: { + anonymous: 'Анонимный Coach', + bioLabel: 'Описание / философия обучения', + bioPlaceholder: 'Ваш опыт, стиль преподавания...', + create: 'СОЗДАТЬ ПРОФИЛЬ COACH', + created: 'Профиль Coach создан!', + createPro: 'СОЗДАТЬ ПРОФИЛЬ PRO COACH', + dmNote: '💬 Ученики могут написать вам напрямую через зашифрованные сообщения SkateSpots', + heading: 'Стать Coach', + headlineExample: 'Skate Coach Berlin', + hourlyRate: 'Ставка в час', + identity: 'Ваш образ Coach', + nip05Reason: 'Добавьте идентификатор NIP-05, чтобы подтвердить личность и завоевать доверие учеников — он показывает, что вы настоящий Coach.', + paymentDesc: 'Чтобы получать оплату за занятия от учеников, подключите Lightning-кошелёк. Ученики будут zap’ать вас напрямую за занятия.', + profileDesc: 'Расскажите ученикам о своём опыте', + profileTitle: 'Профиль Coach', + ratePlaceholder: '5000 sats/ч', + selectSkill: 'Выберите хотя бы один навык.', + skillsLabel: 'Навыки, которым я учу * (выберите хотя бы один)', + skillsRequired: 'Требуются навыки', + formatsLabel: 'Форматы занятий', + formatsHint: 'Как вы проводите обучение.', + levelsLabel: 'Уровни обучения', + agesLabel: 'Возрастные группы', + credentialsLabel: 'Квалификация и безопасность', + credentialsHint: 'Заявлено самостоятельно — SkateSpots это не проверяет.', + languagesLabel: 'Языки общения', + languagesHint: 'Добавьте языки, на которых вы можете обучать.', + languagePlaceholder: 'например, English, Español', + availabilityLabel: 'Доступность', + bookingLabel: 'Ссылка для записи', + bookingHint: 'Необязательно — страница, где ученики могут записаться и оплатить.', + galleryLabel: 'Фото портфолио', + galleryHint: 'Покажите реальные занятия, учеников и Spot’ы (до 12).', + galleryAdd: 'Добавить фото портфолио', + galleryUploaded: 'Загружено фото: {{count}}', + videoLabel: 'Лучшие моменты', + videoHint: 'Необязательно — видео вашего обучения на YouTube или Instagram.', + formatOneOnOne: '1-на-1', + formatGroup: 'Группа', + formatCamp: 'Кэмп', + formatVideo: 'Видеоразбор', + formatContestPrep: 'Подготовка к контесту', + formatParkLesson: 'Занятие в парке', + formatAdaptive: 'Адаптивное', + formatGirls: 'Девочки-сессия', + formatAfterSchool: 'После школы', + levelBeginner: 'Начальный', + levelIntermediate: 'Средний', + levelAdvanced: 'Продвинутый', + levelCompetition: 'Соревновательный', + ageKids: 'Дети', + ageTeens: 'Подростки', + ageAdults: 'Взрослые', + ageSeniors: 'Пожилые', + certFirstAid: 'Первая помощь', + certCpr: 'СЛР', + certSafeguarding: 'Защита детей', + certBackgroundCheck: 'Проверка судимости', + certInsured: 'Страховка', + certFederation: 'Тренер национальной федерации', + certQualification: 'Тренерская квалификация', + certJudge: 'Судья соревнований', + certNoteLabel: 'Другая квалификация (необязательно)', + certNotePlaceholder: 'например, Skateboard GB Level 2, 8 лет тренерства…', + availWeekdays: 'Будни', + availWeekends: 'Выходные', + availEvenings: 'Вечера', + availAfterSchool: 'После школы', + availHolidays: 'Школьные каникулы', + availSeasonal: 'Сезонно', + sectionWhatYouCoach: 'Чему вы учите', + sectionCredentials: 'Квалификация и безопасность', + sectionAvailability: 'Доступность и запись', + sectionWhereYouCoach: 'Где вы учите', + sectionPortfolio: 'Портфолио', + rateAmountLabel: 'Ставка', + rateCurrencySats: 'sats', + rateCurrencyUsd: 'USD', + rateCurrencyEur: 'EUR', + rateCurrencyGbp: 'GBP', + perHour: 'в час', + perSession: 'за занятие', + perHalfDay: 'за полдня', + perDay: 'в день', + perCamp: 'за кэмп', + perProject: 'за проект', + perEvent: 'за событие', + perGig: 'за выступление', + perShoot: 'за съёмку', + perPiece: 'за работу', + perCut: 'за монтаж', + perMonth: 'в месяц', + availByAppointment: 'По записи', + rateNotesLabel: 'Примечания к ставке (необязательно)', + rateNotesPlaceholder: 'Гибкая шкала, первое занятие бесплатно, выезд включён…', + sectionPayments: 'Оплата', + paymentMethodsHint: 'Как клиенты могут вам платить. Это заявление — SkateSpots никогда не хранит средства.', + payMethodCash: 'Наличные на месте', + payMethodLightning: 'Lightning', + payMethodCashu: 'Cashu', + payMethodBank: 'Банковский перевод', + payMethodOther: 'Другое', + payWhatYouCanLabel: 'Гибкая шкала / плати сколько можешь', + bookingFeeLabel: 'Плата за запись (необязательно)', + bookingFeeHint: 'Небольшая сумма, которая платится напрямую вам для подтверждения записи. SkateSpots её не хранит и не возвращает.', + paymentNoteLabel: 'Примечание к оплате (необязательно)', + paymentNotePlaceholder: 'Первое занятие бесплатно, выезд включён, оплата после занятия…', + spotsDesc: 'Выберите Spot’ы, где вы проводите занятия', + spotsLabel: 'Spot’ы, где вы учите', + tagline: 'Делитесь своими знаниями о скейтбординге', + update: 'ОБНОВИТЬ ПРОФИЛЬ COACH', + updated: 'Профиль Coach обновлён!', + }, + filmerForm: { + anonymous: 'Анонимный Filmer', + bioPlaceholder: 'Ваш опыт, стиль, оборудование...', + camerasLabel: 'Камеры и оборудование * (выберите хотя бы одно)', + create: 'СОЗДАТЬ ПРОФИЛЬ СЪЁМКИ', + created: 'Профиль съёмки создан!', + createPro: 'СОЗДАТЬ PRO ПРОФИЛЬ СЪЁМКИ', + dmNote: '💬 Клиенты могут написать вам напрямую через зашифрованные сообщения SkateSpots', + gearHelper: 'Перечислите свои камеры, объективы и оснастку — скейтерам важен сетап.', + gearLabel: 'Что в сумке (необязательно)', + gearPlaceholder: 'например, Sony VX1000 + MK1 fisheye, Panasonic HVX200, стедикам DJI RS3, GoPro Hero 12, микрофон Sennheiser...', + heading: 'Стать Filmer', + headlineExample: 'Skate Filmer Berlin', + identity: 'Ваш образ Filmer', + nip05Reason: 'Добавьте идентификатор NIP-05, чтобы подтвердить личность и завоевать доверие клиентов — он показывает, что вы настоящий Filmer.', + paymentDesc: 'Чтобы получать оплату от клиентов за съёмку, подключите Lightning-кошелёк. Клиенты будут zap’ать вас напрямую за работу.', + profileDesc: 'Расскажите клиентам о своём опыте съёмки', + profileTitle: 'Профиль съёмки', + rate: 'Ставка', + ratePlaceholder: '10000 sats/видео', + reelLabel: 'Шоурил / портфолио', + selectService: 'Выберите хотя бы одну услугу.', + selectSkill: 'Выберите хотя бы один навык съёмки.', + servicesLabel: 'Предлагаемые услуги * (выберите хотя бы одну)', + servicesRequired: 'Требуются услуги', + skillsRequired: 'Требуются навыки', + spotsDesc: 'Выберите Spot’ы, где вы снимаете', + spotsLabel: 'Spot’ы, где вы снимаете', + tagline: 'Предложите съёмку скейт-видео — клипы, лайны, полные парты и освещение контестов', + update: 'ОБНОВИТЬ ПРОФИЛЬ СЪЁМКИ', + updated: 'Профиль съёмки обновлён!', + }, + editorForm: { + anonymous: 'Анонимный Editor', + bioPlaceholder: 'Ваш стиль монтажа, опыт, заметные проекты…', + contactPortfolio: 'Контакты и портфолио', + create: 'Опубликовать профиль Editor', + created: 'Профиль Editor создан!', + createPro: 'Опубликовать PRO профиль Editor', + editTypes: 'Типы монтажа * (выберите хотя бы один)', + hardware: 'Оборудование', + hardwarePlaceholder: 'например, MacBook Pro M3, Sony FX3', + heading: 'Стать Editor', + headlineExample: 'Skate Video Editor', + identity: 'Ваша личность', + locationOptional: 'Местоположение (необязательно)', + loginDesc: 'Войдите, чтобы создать профиль Editor.', + phoneTelegram: 'Телефон / Telegram', + portfolioPlaceholder: 'Портфолио (Vimeo, YouTube…)', + profileDesc: 'Расскажите сообществу о своём стиле монтажа и навыках', + profileTitle: 'Профиль Editor', + published: 'Ваш профиль опубликован в SkateSpots.', + rate: 'Ставка / цены', + ratePlaceholder: 'например, 50k sats/мин, цена в DM', + selectService: 'Выберите хотя бы один тип монтажа.', + servicesRequired: 'Требуются услуги', + socialPlaceholder: 'Instagram / ник в соцсети', + software: 'Софт', + softwareHardware: 'Навыки: софт и оборудование', + softwarePlaceholder: 'например, DaVinci Resolve, Premiere', + tagline: 'Предложите услуги монтажа видео скейт-сообществу', + thumbnail: 'Миниатюра профиля / шоурила', + update: 'Обновить профиль Editor', + updated: 'Профиль Editor обновлён!', + walletConnected: 'Кошелёк подключён ✓', + walletDesc: 'Получайте платежи в Bitcoin ⚡ напрямую от клиентов за монтаж.', + walletTitle: '⚡ Lightning-кошелёк для платежей', + yearsExperience: 'Опыт (лет)', + yearsPlaceholder: 'например, 5 лет', + }, + photoForm: { + anonymous: 'Анонимный Photographer', + bioPlaceholder: 'Ваш опыт, стиль, что вы любите снимать...', + cameraLabel: 'Камеры * (выберите хотя бы одну)', + cameraRequired: 'Требуется камера', + contactDesc: 'Как райдеры могут увидеть ваши работы и связаться с вами (всё необязательно, но рекомендуется)', + create: 'СОЗДАТЬ ПРОФИЛЬ ФОТОГРАФИИ', + created: 'Профиль фотографии создан!', + createPro: 'СОЗДАТЬ PRO ПРОФИЛЬ ФОТОГРАФИИ', + dmNote: '💬 Райдеры могут написать вам напрямую через зашифрованные сообщения SkateSpots', + gearHelper: 'Перечислите камеры, объективы и свет — райдерам интересен сетап.', + gearPlaceholder: 'например, Canon R6 II, fisheye 8-15mm, 70-200mm f/2.8, 2× Godox AD200, радиосинхронизаторы, штатив Manfrotto...', + heading: 'Стать Photographer', + headlineExample: 'Skate Photography', + identity: 'Ваш образ Photographer', + lensesLabel: 'Объективы', + lightingLabel: 'Световое оборудование', + nip05Reason: 'Добавьте идентификатор NIP-05, чтобы подтвердить личность и завоевать доверие клиентов.', + paymentDesc: 'Чтобы получать оплату за съёмки, подключите Lightning-кошелёк. Клиенты zap’ают вас напрямую за работу.', + portfolioLabel: 'Портфолио / Instagram', + profileDesc: 'Расскажите райдерам о своём взгляде, снаряжении и услугах', + profileTitle: 'Профиль фотографии', + ratePlaceholder: '20000 sats/съёмка', + selectCamera: 'Выберите хотя бы один тип камеры, на который вы снимаете.', + selectService: 'Выберите хотя бы одну услугу, которую вы предлагаете.', + servicesLabel: 'Предлагаемые услуги * (выберите хотя бы одну)', + servicesRequired: 'Требуются услуги', + spotsDesc: 'Выберите Spot’ы, где вы фотографируете', + spotsLabel: 'Spot’ы, где вы снимаете', + styleLabel: 'Стиль съёмки', + supportLabel: 'Опоры и оснастка', + tagline: 'Снимайте сессии — предложите свою скейт-фотографию', + update: 'ОБНОВИТЬ ПРОФИЛЬ ФОТОГРАФИИ', + updated: 'Профиль фотографии обновлён!', + }, + builderForm: { + anonymous: 'Анонимный Builder', + bioLabel: 'Описание / о ваших постройках', + bioPlaceholder: 'Ваш Crew, заметные постройки, как вы подходите к проекту...', + buildTypesLabel: 'Что вы строите * (выберите хотя бы одно)', + buildTypesRequired: 'Требуются типы построек', + cityBase: 'Город / база', + contactPortfolio: 'Контакты и портфолио', + contactPortfolioDesc: 'Как сцена может увидеть ваши постройки и связаться с вами (всё необязательно, но рекомендуется)', + create: 'СОЗДАТЬ ПРОФИЛЬ BUILDER', + created: 'Профиль Builder создан!', + createPro: 'СОЗДАТЬ PRO ПРОФИЛЬ BUILDER', + dmNote: '💬 Клиенты могут написать вам напрямую через зашифрованные сообщения SkateSpots', + gearHelper: 'Crew и клиенты любят знать ваше оснащение и процесс.', + gearLabel: 'Как вы работаете / оборудование (необязательно)', + gearPlaceholder: 'например, полная бетонная бригада, свой миксер + установка торкрет-бетона, мобильная сварка, берём на себя разрешения и дренаж...', + heading: 'Стать Builder', + headlineExample: 'Ramp & Park Builder', + identity: 'Ваш образ Builder', + insured: 'Лицензия / страховка', + insuredHelper: 'Актуально для работы с общественными парками и муниципалитетами', + logoPhoto: 'Логотип / фото', + materialsLabel: 'Материалы и навыки ремесла', + nip05Reason: 'Добавьте идентификатор NIP-05, чтобы подтвердить личность и завоевать доверие клиентов.', + pastBuilds: 'Прошлые постройки / Instagram', + paymentDesc: 'Чтобы получать оплату за постройки, подключите Lightning-кошелёк. Клиенты zap’ают вас напрямую за работу.', + profileDesc: 'Расскажите сцене, что вы строите и как работаете', + profileTitle: 'Профиль Builder', + rateLabel: 'Ставка / основа сметы', + ratePlaceholder: 'за м² / за проект', + scaleLabel: 'Масштаб проекта', + selectBuild: 'Выберите хотя бы одно, что вы строите.', + serviceArea: 'Зона обслуживания', + serviceAreaPlaceholder: 'например, Каталония, выезжаю по всей ЕС', + spotsDesc: 'Привяжите Spot’ы и парки, которые вы построили, чтобы люди видели вашу работу на карте', + spotsLabel: 'Spot’ы, которые вы построили', + tagline: 'Залей, свари, построй — добавьте строительство рамп и парков', + update: 'ОБНОВИТЬ ПРОФИЛЬ BUILDER', + updated: 'Профиль Builder обновлён!', + yearsBuilding: 'Опыт строительства (лет)', + }, + skaterForm: { + backToSkaters: 'Назад к скейтерам', + bioHelperPulled: 'Взято из вашего профиля — подправьте для карточки скейтера или оставьте как есть.', + bioHelperShort: 'Короткое представление для карточки скейтера.', + bioPlaceholder: 'Сколько вы катаетесь, что вам нравится, над чем работаете…', + browseSpots: 'Смотреть Spot’ы', + changePhoto: 'Сменить фото профиля', + chipBio: 'Описание', + chipPhoto: 'Фото', + cityArea: 'Город / район', + created: 'Вы на карте! 🛹', + custom: 'Свой вариант', + customHelper: 'Своя подпись — показывается на карточке скейтера вместо готовой.', + customPlaceholder: 'например, OG, Weekend Warrior, Retired…', + discoverable: 'Теперь другие скейтеры могут вас найти.', + editFullProfile: 'отредактировать полный профиль', + fromProfile: 'Из вашего профиля', + heroEditPrefix: 'Редактировать', + heroJoinPrefix: 'Присоединиться к', + heroSuffix: 'каталогу', + homeHelper: 'Введите свободно или привяжите реальный Spot с карты, чтобы люди могли туда попасть.', + homePlaceholder: 'Локальный парк / площадь — или нажмите «Смотреть Spot’ы»', + homeSpot: 'Домашний Spot', + layerEnd: 'чтобы изменить их везде.', + layerIntro: 'Это ваш', + layerMid: ', построенный на вашем профиле Nostr. Имя, фото, описание, Lightning и верификация берутся оттуда —', + layerWord: 'скейт-слой', + level: 'Уровень', + linked: 'Привязано к Spot’у на карте', + loadingProfile: 'Загрузка вашего профиля…', + loadingSpots: 'Загрузка Spot’ов…', + locationHelper: 'Помогает другим находить скейтеров рядом. Публикуется только приблизительный район.', + loginToJoin: 'Войдите, чтобы присоединиться', + loginToJoinDesc: 'Создайте профиль скейтера, чтобы сообщество могло вас найти.', + mappedSpot: 'Spot на карте', + noSpots: 'Пока не найдено ни одного Spot’а.', + noSpotsMatch: 'Нет Spot’ов по вашему запросу.', + openMap: 'Открыть карту', + pickEverything: 'Выберите всё, что подходит вашему стилю.', + pickHomeSpot: 'Выберите домашний Spot', + pickStyles: 'Выберите свои стили', + pickStylesDesc: 'Выберите хотя бы одно, на чём вы катаетесь.', + profilePic: 'Фото профиля', + profilePicHelper: 'Карточка скейтера использует фото из вашего профиля Nostr — одно фото везде.', + publishingAs: 'Публикуется как', + putOnMap: 'Добавить меня на карту', + searchSpots: 'Поиск Spot’ов по названию или городу…', + skateStory: 'Ваша скейт-история', + stance: 'Стойка', + unlinkSpot: 'Отвязать Spot', + updateButton: 'Обновить профиль', + updated: 'Профиль обновлён!', + whatYouSkate: 'На чём вы катаетесь *', + yearsPlaceholder: 'например, 8', + yearsSkating: 'Опыт катания (лет)', + yourProfilePic: 'Ваше фото профиля', + zapsOn: 'Zap’ы включены', + }, + skaters: { + clearSearch: 'Очистить поиск', + community: 'Сообщество', + countMany: 'скейтеров', + countOne: 'скейтер', + editProfile: 'Редактировать профиль скейтера', + heroDesc: 'Найдите своих. Смотрите Crew скейтеров, представляющих SkateSpots — по стилю, стойке, уровню и городу.', + nip05Verified: 'NIP-05 подтверждён', + noMatches: 'Нет совпадений', + noneDesc: 'Станьте первым, кто присоединится к каталогу и добавит SkateSpots на карту.', + noneTitle: 'Пока нет скейтеров', + noVerifiedMatch: 'Нет подтверждённых скейтеров по запросу', + searchPlaceholder: 'Поиск по имени, городу или npub…', + tryDifferentSearch: 'Попробуйте другой запрос или очистите фильтры.', + tryTurnOffVerified: 'Попробуйте отключить фильтр «Проверенные», чтобы увидеть всех.', + verifiedFilterTitle: 'Показывать только скейтеров с подтверждённой личностью NIP-05', + }, + skaterCard: { + inDirectory: 'Вы в каталоге скейтеров', + joinDesc: 'Добавьте стойку, стили и уровень, чтобы скейтеры могли вас найти.', + joinTitle: 'Присоединиться к каталогу скейтеров', + }, + crewsStrip: { + allCrews: 'Все Crew', + memberMany: '{{count}} участников', + memberOne: '{{count}} участник', + title: 'Crew в этой сцене', + }, + labLink: { + coach: 'Coach', + filmer: 'Filmer', + editor: 'Editor', + photographer: 'Photographer', + builder: 'Builder', + artist: 'Художник', + graffiti: 'Граффити', + tattoo: 'Тату', + trainer: 'Тренер', + musician: 'Музыкант', + judge: 'Судья', + barber: 'Барбер', + organizer: 'Организатор', + lab: 'The Lab', + linkedProfiles: 'Связанные профили The Lab', + desc: 'Тоже ведёте студию, обучение или строительство? Привяжите свои объявления The Lab, чтобы люди могли нанять ваш Crew. Необязательно. Когда профиль The Lab тоже ссылается на этот Crew, у обоих появляется зелёный', + descEnd: 'значок.', + empty: 'У вас пока нет профилей The Lab. Создайте его в The Lab, чтобы привязать здесь.', + }, + proUpgrade: { + goPro: 'Стать Pro', + optional: '· необязательно', + freeTo: 'Публикация бесплатна. Pro добавляет', + proBadge: 'значок Pro', + featuredPlacement: 'рекомендованное размещение', + atTop: 'вверху The Lab.', + active: 'Активен', + benefit1: 'Золотой значок «Pro» на профиле и карточках', + benefit2: 'Показывается первым, когда скейтеры листают The Lab', + benefit3: 'Поддерживает SkateSpots — без рекламы, без посредников', + platformOwner: 'Владелец платформы — Pro всегда включён.', + proActiveOne: 'Pro активен · остался {{count}} день. Ваш профиль будет рекомендован.', + proActiveMany: 'Pro активен · осталось {{count}} дней. Ваш профиль будет рекомендован.', + context: 'После истечения Pro профиль остаётся доступным бесплатно — вы теряете только значок и продвижение.', + }, + profilePreview: { + viewPublic: 'Открыть публичный вид', + unnamed: 'Скейтер без имени', + noHandle: 'Пока нет ника', + }, + pyramid: { + pyramidWord: 'ПИРАМИДА', + rankingsWord: 'РЕЙТИНГИ', + subtitle: 'Лучшие участники в вашем городе', + yourRank: 'Ваше место', + keepContributing: 'Продолжайте вносить вклад, чтобы подняться выше!', + topContributors: 'Лучшие участники', + noContributors: 'Пока нет участников. Станьте первым, кто добавит Spot или создаст событие!', + spots: 'Spot’ы', + events: 'События', + total: 'Всего', + trust: 'Доверие', + }, + detail: { + joined: 'Присоединился', + about: 'О себе', + howWeWork: 'Как мы работаем', + inTheBag: 'В сумке', + hardware: 'Оборудование', + software: 'Софт', + eventsJudged: 'Сужено событий', + eventsOrganized: 'Организовано событий', + spots: 'Spot’ы', + viewSpot: 'Открыть Spot', + credentialsTitle: 'Квалификация и безопасность', + selfAttested: 'Заявлено самим Coach — SkateSpots это не проверяет.', + formats: 'Форматы', + levels: 'Уровни', + ages: 'Возраст', + languages: 'Языки', + availability: 'Доступность', + bookSession: 'Записаться на занятие', + portfolio: 'Портфолио', + watchReel: 'Смотреть на {{platform}}', + paymentsTitle: 'Оплата', + payWhatYouCan: 'Плати сколько можешь', + bookingFee: 'Плата за запись', + payBookingFee: 'Оплатить запись', + bookingFeeNote: 'Платится напрямую Coach. SkateSpots её не хранит и не возвращает.', + bookingFeeNoRail: 'У этого Coach не указан Lightning-адрес, поэтому оплата в приложении недоступна — свяжитесь с ним, чтобы договориться об оплате.', + serviceArea: 'Зона обслуживания', + licensedInsured: 'Лицензия / страховка', + studio: 'Студия', + shopStudio: 'Магазин / студия', + booksOpen: 'Открыт для заказов', + credentials: 'Квалификация', + remoteOnline: 'Удалённо / онлайн', + graffitiCrew: 'Граффити-Crew', + act: 'Выступает', + listen: 'Слушать', + upcomingGigs: 'Ближайшие выступления', + past: 'Прошлые', + experience: 'Опыт', + yearsCount: '{{count}} лет', + rate: 'Ставка', + contact: 'Контакт', + sendMessage: 'Отправить сообщение', + bookGig: 'Заказать выступление', + portfolioDomain: 'Портфолио · {{domain}}', + manage: 'Управление', + admin: 'Админ', + editProfile: 'Редактировать профиль', + publishedTitle: 'Вы в эфире', + publishedBody: 'Ваш профиль опубликован в The Lab. Поделитесь им, чтобы скейтеры могли вас найти.', + manageRemove: 'Удалить ваш профиль {{noun}} из The Lab.', + adminTakeDown: 'Снять этот профиль {{noun}}. Он будет скрыт во всём SkateSpots.', + entityLabel: 'Профиль {{noun}}', + deleteProfile: 'Удалить профиль', + location: 'Местоположение', + servicesSkills: 'Услуги и навыки', + noun: { + coach: 'Coach', + filmer: 'Filmer', + editor: 'Editor', + photographer: 'Photographer', + builder: 'Builder', + artist: 'художника', + graffiti: 'граффити-художника', + tattoo: 'мастера тату', + trainer: 'тренера', + musician: 'музыканта', + judge: 'судьи событий', + organizer: 'организатора событий', + barber: 'барбера', + profile: 'профиля', + }, + skillsTitle: { + skills: 'Навыки', + servicesGear: 'Услуги и снаряжение', + whatWeBuild: 'Что мы строим', + whatTheyMake: 'Что они создают', + stylesWork: 'Стили и работа', + styles: 'Стили', + focusSpecialties: 'Направление и специализация', + genresInstruments: 'Жанры и инструменты', + formatsSpecialties: 'Форматы и специализация', + servicesStyles: 'Услуги и стили', + eventTypesServices: 'Типы событий и услуги', + }, + }, + rider: { + heroDesc: 'Ваша проверяемая личность скейтера. Подписано Nostr, готово к печати, подделать невозможно.', + heroDesc2: 'Получайте засвидетельствованные значки навыков от других скейтеров. Получайте пропуска в парки. Делитесь карточкой где угодно.', + headerTagline: 'Подписано Nostr · Готово к печати · Проверка по QR', + tabCard: 'Моя карточка', + tabBadges: 'Значки', + tabAward: 'Наградить', + rendering: 'Отрисовка…', + shareCard: 'Поделиться карточкой', + savePng: 'Сохранить PNG', + print: 'Печать', + copyId: 'Копировать ID', + cardType: 'Тип карточки', + licenseLabel: 'Лицензия скейтера', + licenseSub: 'Ваша личная идентичность райдера', + parkLabel: 'Доступ в парк', + parkSub: 'Выдавайте пропуска как владелец парка', + theme: 'Тема', + holoTitle: 'Голографический блеск', + holoDesc: 'Анимированный фольгированный эффект', + cardDetails: 'Детали карточки', + skateStyle: 'Стиль катания', + ridesFor: 'Катается за', + ridesForPlaceholder: 'Локальный магазин…', + sponsors: 'Спонсоры', + sponsorsPlaceholder: 'Бренды…', + showOnCard: 'Показывать на карточке', + zaps: 'Zap’ы ⚡', + skills: 'Навыки', + selected: '{{count}}/6 выбрано', + goldBadgesHint1: 'Золотые значки на вашей карточке появляются, когда другие скейтеры свидетельствуют ваши трюки — смотрите', + goldBadgesHint2: '.', + parkOwnersOnly: 'Только для владельцев парков.', + parkOwnersDesc: 'Выпустите этот пропуск тем же ключом Nostr, которым опубликовали объявление парка. Любой может отсканировать QR и проверить подпись в цепочке — центральный орган не нужен.', + parkDetails: 'Детали парка', + parkName: 'Название парка', + parkNamePlaceholder: 'The Berrics…', + riderName: 'Имя райдера', + riderNamePlaceholder: 'Имя на карточке', + riderNpub: 'Nostr ID райдера (npub)', + accessLevel: 'Уровень доступа', + validThru: 'Действительно до', + publishToNostr: 'Опубликовать в Nostr', + badgesIntro: 'Эти значки засвидетельствованы и подписаны другими скейтерами в Nostr. Они отображаются как золотые чипы ⭐ на вашей карточке.', + earnMore: 'Хотите заработать больше? Катайтесь перед кем-то и попросите засвидетельствовать ваш трюк.', + awardSomeone: 'Вручить значок другому', + youSawIt: 'Вы видели это', + youSawItDesc: 'Подпишите доказательство в Nostr. Оно станет частью их постоянной записи — криптографически привязанной к вашему ключу.', + skillsWitnessed: 'Навыки, которые вы засвидетельствовали', + whereSeen: 'Где вы это видели?', + optional: '(необязательно)', + signingOnNostr: 'Подпись в Nostr…', + awardBadge: 'Вручить значок', + addRiderSkill: 'Добавьте npub райдера и хотя бы один навык', + invalidNpub: 'Некорректный npub', + badgeAwarded: '🏅 Значок вручён!', + badgeSent: '{{skills}} отправлено.', + failed: 'Ошибка', + couldNotRender: 'Не удалось отрисовать карточку', + popupBlocked: 'Всплывающее окно заблокировано', + popupBlockedDesc: 'Разрешите всплывающие окна для этого сайта.', + linkCopied: '🔗 Ссылка скопирована!', + enterRiderNpub: 'Введите npub райдера', + parkPublished: '✅ Карточка доступа в парк опубликована!', + publishFailed: 'Не удалось опубликовать', + noBadges: 'Пока нет значков. Катайтесь перед кем-то и попросите засвидетельствовать ваши трюки!', + showMore: 'Показать ещё {{count}}', + witnessedBy: 'Засвидетельствовал', + at: 'в', + previewLicense: 'Лицензия скейтера', + previewSince: 'С {{year}}', + previewEvts: 'Событ.', + previewScan: 'Сканируйте для проверки', + previewSkatepark: 'Скейт-парк', + previewAccessPass: 'Пропуск доступа', + previewMemberName: 'Имя участника', + previewIssuedBy: 'Выдано владельцем парка · подписано Nostr', + previewValidThru: 'Действительно до', + previewNostrVerified: 'Проверено Nostr', + }, + craftFields: { + detailsTitle: 'Дополнительные детали', + deliverables: 'Что входит', + turnaround: 'Сроки', + surfaces: 'Поверхности / стены', + maxSize: 'Макс. размер', + setLength: 'Длительность сета', + techRider: 'Техрайдер', + travel: 'Выезд', + certifications: 'Сертификаты', + insurance: 'Страховка', + permits: 'Разрешения', + deposit: 'Депозит', + minimum: 'Минимум', + modalities: 'Модальности', + duration: 'Длительность приёма', + drone: 'Дрон', + leadTime: 'Срок подготовки', + warranty: 'Гарантия', + }, + craftForm: { + profileImage: 'Изображение профиля', + nameHeadline: 'Имя / заголовок', + about: 'О себе', + aboutPlaceholder: 'Расскажите скейтерам о вашей работе {{noun}}…', + required: 'обязательно', + nip05Title: 'Добавьте NIP-05, чтобы вызывать доверие', + nip05Desc: 'Идентификатор NIP-05 помогает скейтерам убедиться, что вы настоящий. Настоятельно рекомендуется перед публикацией.', + editingNote: 'Редактируете существующий профиль {{noun}} — публикация заменит его.', + location: 'Местоположение', + pinned: '📍 Закреплено на карте ({{lat}}, {{lng}})', + experienceYears: 'Опыт (лет)', + expPlaceholder: 'например, 5', + ratePlaceholder: 'например, 20k sats / за проект', + contactLinks: 'Контакты и ссылки', + phoneOptional: 'Телефон (необязательно)', + emailOptional: 'Email (необязательно)', + socialPlaceholder: 'Соцсеть (Instagram и т.д.)', + gettingPaid: 'Получение оплаты', + updateProfile: 'Обновить профиль', + publishProfile: 'Опубликовать профиль', + rateLeftBlankNote: 'Необязательно — оставьте пустым, если указанной выше ставки достаточно.', + sectionRequired: 'Раздел «{{section}}» обязателен', + sectionRequiredDesc: 'Выберите хотя бы один вариант в разделе «{{section}}».', + updated: 'Профиль обновлён!', + created: 'Профиль создан!', + headlineExample: 'Skate Coach Berlin', + }, + }, + socialUi: { + agentPanel: { + spot: 'Spot', + event: 'Событие', + labPro: 'Lab pro', + gear: 'Снаряжение', + crew: 'Crew', + description: 'Знает этот Crew — его джемы, состав и открытый набор — а также более широкую сцену с живыми данными.', + greeting: 'Йо! Я Sasquatch, гид {{crew}}. Спросите меня о Crew — наш следующий джем, кто им руководит, что нам нужно — или о более широкой сцене.', + suggestion1: 'Когда наш следующий джем?', + suggestion2: 'Кто руководит этим Crew?', + suggestion3: 'Что мы ищем?', + suggestion4: 'Лучшие Spot’ы рядом с нами?', + suggestion5: 'Какая погода для катания?', + thinking: 'Sasquatch думает…', + placeholder: 'Спросите о вашей локальной сцене…', + disclaimer: 'ИИ может ошибаться — ссылки ведут к реальным объявлениям.', + }, + badge: { + upcomingOne: '{{count}} предстоящее событие', + upcomingMany: '{{count}} предстоящих событий', + comingOne: '{{count}} событие приближается', + comingMany: '{{count}} событий приближается', + }, + bell: { + youAreIn: 'Вы в {{crew}}! 🛹', + membershipConfirmed: 'Участие подтверждено.', + couldNotConfirm: 'Не удалось подтвердить', + addedYouTo: 'добавил вас в', + confirmToAppear: 'Подтвердите, чтобы отображаться как участник.', + notifications: 'Уведомления', + notificationsNew: 'Уведомления ({{count}} новых)', + unreadCount: '{{count}} непрочитанных уведомлений', + markRead: 'Отметить прочитанным', + allClear: 'Всё чисто', + tabAll: 'Все', + tabTrades: 'Сделки', + tabSocial: 'Соцсеть', + tabNews: 'Новости', + tabCrews: 'Crew', + checkingUpdates: 'Проверка обновлений…', + checkingTrades: 'Проверка предложений и сделок…', + loadingDrops: 'Загрузка последних новостей…', + emptyAll: 'Предложения, сделки, Zap’ы, ответы, новостные рассылки и активность Crew появятся здесь.', + emptyTrades: 'Предложения, встречные предложения и подтверждения сделок попадают сюда — продаёте вы, покупаете или меняетесь.', + emptySocial: 'Zap’ы, реакции, репосты, упоминания, ответы, RSVP на события и обновления от организаторов попадают сюда.', + emptyNews: 'Новостные рассылки SkateSpots появятся здесь. Подпишитесь на странице рассылки.', + emptyCrews: 'Приглашения в Crew, запросы на коллектив и запросы на участие появятся здесь.', + subscribeBanner: 'Подпишитесь, чтобы получать новые новости в колокольчик', + read: 'Прочитано', + allCaughtUp: 'Вы всё прочитали', + }, + chat: { + hidden: 'Скрыто', + hideMessageAria: 'Скрыть это сообщение', + hideMessageTitle: 'Скрыть сообщение (админ)', + messageHidden: 'Сообщение скрыто', + messageHiddenDesc: 'Скрыто из чата Crew для всех.', + messageHideFailed: 'Не удалось скрыть сообщение', + encryptionUnavailable: 'Шифрование недоступно', + encryptionUnavailableDesc: 'Ваш подписант не поддерживает шифрование NIP-44. Обновите расширение.', + messageFailed: 'Не удалось отправить сообщение', + couldNotSend: 'Не удалось отправить сообщение.', + noOneToMessage: 'Пока некому написать', + noOneToMessageDesc: 'В этом Crew нет других участников для чата.', + subject: 'чат Crew {{crew}}', + title: 'Чат Crew', + cordnBadgeTitle: 'Маршрутизируется через координатор Cordn этого Crew по ContextVM. Сквозное шифрование.', + private: 'Приватный', + privateBadgeTitle: 'Сквозное шифрование — только участники Crew могут читать эти сообщения.', + encryptedCordn: 'Зашифровано и проходит через координатор Crew (Cordn) — сообщения не попадают на публичные релеи.', + encryptedNip17: 'Зашифрованный групповой чат для основателя и всех участников Crew.', + moderatorNote: ' Как модератор вы можете скрывать сообщения от Crew.', + loginToSee: 'Войдите, чтобы узнать, можете ли вы присоединиться к чату Crew.', + membersOnly: 'Этот чат приватный для участников Crew. Попросите основателя добавить вас в Crew, чтобы присоединиться к разговору.', + noMessages: 'Пока нет сообщений. Начните чат Crew — запланируйте сессию, поделитесь Spot’ом, обсудите клип.', + newMessages: 'Новые сообщения', + new: 'Новое', + placeholder: 'Напишите вашему Crew…', + sendAria: 'Отправить сообщение', + }, + collectiveJoinRequest: { + addedTitle: '{{name}} добавлен в {{collective}} 🛹', + addedDesc: 'Они подтвердят со своей стороны, чтобы отображаться как проверенный участник.', + couldNotAdd: 'Не удалось добавить участника', + couldNotDismiss: 'Не удалось отклонить', + addedDone: 'Добавлено', + addedTo: 'в', + dismissedDone: 'Запрос от {{name}} отклонён', + wantsToJoin: 'хочет присоединиться', + alreadyOnRoster: 'Уже в составе', + openCollective: 'Открыть коллектив', + dismiss: 'Отклонить', + addToCollective: 'Добавить в коллектив', + }, + collectiveMembers: { + confirmed: 'Подтверждён', + pending: 'Ожидает', + pendingTooltip: 'Указан коллективом — ожидается подтверждение этого участника.', + crewOnly: 'Только Crew', + crewOnlyTooltip: 'Этот участник решил быть видимым только для товарищей по Crew. Вы видите его, потому что вы в Crew.', + hiddenMember: 'Скрытый участник', + title: 'Участники', + verifiedOf: '{{confirmed}} из {{total}} подтверждено — каждый подтверждённый участник подписал своим ключом Nostr.', + verifiedPerMember: 'Участие проверяется по каждому участнику. Каждый подтверждает своим ключом Nostr.', + adminsOne: '{{count}} админ помогает управлять Crew.', + adminsMany: '{{count}} админов помогают управлять Crew.', + }, + confirmMembership: { + public: 'Публичный', + crewOnly: 'Только Crew', + confirmedTitle: 'Участие подтверждено!', + confirmedCrew: 'Вы проверены в {{name}} — видно только товарищам по Crew.', + confirmedPublic: 'Теперь вы отображаетесь как проверенный участник {{name}}.', + failed: 'Не удалось подтвердить', + addedTo: 'Вы добавлены в {{name}}', + addedDesc: 'Подтвердите участие, чтобы оно отображалось как проверенное в вашем профиле и у них.', + yourVisibility: 'Ваша видимость', + confirming: 'Подтверждение…', + confirmButton: 'Подтвердить участие', + }, + contacts: { + message: 'Написать', + removePrivate: 'Убрать из приватных контактов', + savePrivate: 'Сохранить в приватные контакты', + seoTitle: 'Контакты - SkateSpots', + seoDescription: 'Ваша сцена — товарищи по Crew, те, на кого вы подписаны, и недавние разговоры, с приватными зашифрованными контактами.', + encryptionUnavailableDesc: 'Ваш подписант не поддерживает шифрование NIP-44.', + removed: 'Убрано из приватных контактов', + saved: 'Сохранено в приватные контакты', + savedDesc: 'Только вы видите этот список.', + updateFailed: 'Не удалось обновить контакты', + loginTitle: 'Ваша сцена в одном месте', + loginDesc: 'Войдите, чтобы видеть товарищей по Crew, подписки и недавние разговоры — и вести приватный зашифрованный список контактов.', + title: 'Контакты', + subtitle: 'Ваша сцена — товарищи по Crew, подписки и разговоры', + filterPlaceholder: 'Фильтр по npub…', + tabCrew: 'Crew', + tabFollows: 'Подписки', + tabDms: 'DM', + tabSaved: 'Сохранённые', + emptyCrewmates: 'Пока нет товарищей по Crew. Вступите в Crew или создайте свой, чтобы построить сеть сцены.', + emptyFollowing: 'Вы пока ни на кого не подписаны.', + emptyDms: 'Пока нет разговоров. Напишите скейтеру, чтобы начать.', + savedHint: 'Этот список зашифрован вашим ключом — только вы можете его прочитать. Нажмите звёздочку на любом, чтобы добавить.', + emptySaved: 'Пока нет сохранённых контактов. Отмечайте людей звёздочкой на любой вкладке, чтобы собрать свою приватную адресную книгу.', + }, + conversation: { + unknown: 'Неизвестно', + seoTitle: 'Чат с {{name}} - SkateSpots', + seoDescription: 'Приватный зашифрованный разговор', + sendFailed: 'Не удалось отправить сообщение', + sendFailedDesc: 'Попробуйте ещё раз через мгновение.', + tradeConfirmed: 'Сделка подтверждена', + tradeConfirmedDesc: 'Репутация обновлена у обоих.', + tradeConfirmFailed: 'Не удалось подтвердить сделку', + somethingWrong: 'Что-то пошло не так.', + soldNote: 'Продано {{name}}.', + saleConfirmed: 'Продажа подтверждена', + saleConfirmedDesc: '{{name}} теперь может подтвердить свою сторону.', + saleConfirmFailed: 'Не удалось подтвердить продажу', + escrowRedeemed: 'Эскроу получен', + escrowRedeemedDesc: 'Средства теперь в вашем кошельке Cashu.', + escrowRedeemFailed: 'Не удалось получить эскроу', + loginTitle: 'Войдите, чтобы просмотреть сообщения', + secureLoginTitle: 'Требуется безопасный вход', + secureLoginDesc: 'Для сообщений нужно приложение-подписант.', + encrypted: 'Зашифровано', + refresh: 'Обновить', + didCompleteTrade: 'Вы завершили эту сделку?', + recordedSale: '{{name}} записал продажу. Подтвердите, чтобы обновить репутацию у обоих.', + confirm: 'Подтвердить', + confirmSale: 'Подтвердить эту продажу?', + askedToRecord: '{{name}} попросил вас записать это. Подтверждение укрепляет репутацию обоих.', + confirmSaleButton: 'Подтвердить продажу', + redeemEscrow: 'Получить эскроу', + escrowAppOnly: 'Эскроу Cashu доступен только в приложении — откройте SkateSpots на телефоне, чтобы получить.', + startThread: 'Отправьте сообщение, чтобы начать разговор', + placeholder: 'Введите сообщение...', + e2eeNote: 'Сообщения защищены сквозным шифрованием с помощью NIP-17', + }, + coordinator: { + secondsAgo: '{{count}} с назад', + minutesAgo: '{{count}} мин назад', + hoursAgo: '{{count}} ч назад', + daysAgo: '{{count}} дн назад', + statusIdle: 'Не проверялся', + statusChecking: 'Проверка…', + statusOnline: 'Подключён', + statusStale: 'Тихий', + statusOffline: 'Не замечен', + statusError: 'Недоступен', + notACoordinator: 'Это не координатор', + notACoordinatorDesc: 'Вставьте nprofile, npub или ссылку cordn.net.', + added: 'Координатор добавлен', + relayOne: '{{count}} релей', + relayMany: '{{count}} релеев', + lastSeen: 'последний раз {{time}}', + onlineDesc: 'Объявляет о себе. Группы, которые его используют, могут доставлять сообщения сейчас.', + staleDesc: 'Найден, но давно не объявлял о себе — возможно, спит.', + offlineDesc: 'Объявлений не видно. Возможно, он приватный (это нормально) или просто офлайн.', + errorDesc: 'Не удалось связаться с релеями.', + idleDesc: 'Проверка…', + checkingDesc: 'Ищем его объявление…', + eventFoundOne: 'Найдено {{count}} событие.', + eventFoundMany: 'Найдено событий: {{count}}.', + check: 'Проверить', + addLinkCopied: 'Ссылка для добавления скопирована', + copyFailed: 'Не удалось скопировать', + copyManually: 'Скопируйте вручную.', + addLink: 'Добавить ссылку', + removeConfirm: 'Удалить этот координатор с этого устройства?', + scanToJoin: 'Отсканируйте в Cordn, чтобы присоединиться к этому координатору.', + noCoordinator: 'Пока нет координатора', + noCoordinatorDescA: 'Координатор доставляет', + encryptedWord: 'зашифрованные', + noCoordinatorDescB: 'групповые сообщения вашего Crew по порядку. Он видит кто, когда и какая группа — но не содержимое. Выберите один или запустите свой.', + change: 'Сменить координатор', + addTitle: 'Добавить координатор', + add: 'Добавить', + scanQR: 'Сканировать QR координатора', + inputPlaceholder: 'nprofile… или ссылка cordn.net', + runOwn: 'Запустите свой', + runOwnDesc: 'Он может жить на старом телефоне, Raspberry Pi или любой маленькой коробочке, которую вы оставите включённой. Группа работает, пока он поднят — и вы можете перенести группу когда угодно.', + onPhone: 'На телефоне', + onPhoneDesc: 'Используйте приложение Cordn Coordinator, затем отсканируйте его QR здесь, чтобы добавить.', + openCordn: 'Открыть Cordn', + scanItsQR: 'Сканировать его QR', + onServer: 'На сервере', + commandCopied: 'Команда скопирована', + copyCommand: 'Копировать команду', + androidSleep: 'Android может усыпить координатор на телефоне. Ожидайте, что группу придётся переносить время от времени.', + privacyNote: '🔒 Координатор видит только шифротекст и метаданные — никогда содержимое сообщений. Запустите свой, чтобы даже метаданные оставались вашими.', + customTitle: 'Пользовательский координатор чата', + customBadge: '· экспериментально · ваш собственный релей', + customDescShort: 'Необязательно — в вашем Crew уже есть встроенный чат со сквозным шифрованием, так что это не нужно. Указывайте только если запускаете свой', + remove: 'Удалить', + pointerNote: 'Пока только указатель: endpoint wss:// используется как релей чата Crew; https:// — через общий релей ContextVM. Настоящий Cordn MLS ещё не подключён.', + cordnCoordinator: 'Координатор Cordn', + invalid: 'Это не похоже на координатор. Вставьте nprofile, ссылку cordn.net или URL https/wss.', + useMine: 'Использовать мой координатор', + }, + createCrew: { + seoTitle: 'Создать Crew - SkateSpots', + seoDescription: 'Создайте свой скейт-Crew — домашняя территория, участники и Spot’ы.', + loginRequired: 'Требуется вход', + loginRequiredDesc: 'Войдите, чтобы создать Crew.', + backToCrews: 'Назад к Crew', + title: 'Создать Crew', + intro: 'Ваша скейт-семья — те, с кем вы катаетесь. Достаточно названия; всё остальное необязательно.', + }, + crew: { + seoTitleNamed: '{{name}} - SkateSpots Crew', + seoTitle: 'Crew - SkateSpots', + seoDescription: 'Скейт-Crew в SkateSpots.', + postHidden: 'Пост скрыт', + postHiddenDesc: 'Удалено из ленты Crew для всех.', + postHideFailed: 'Не удалось скрыть пост', + backToCrews: 'Назад к Crew', + disband: 'Распустить', + youAreCaptain: 'Вы капитан', + member: 'Участник', + askSasquatch: 'Спросить Sasquatch', + agent: 'Агент Crew', + agentDesc: 'ИИ-гид вашего Crew — ближайшие Spot’ы, события, Coach и снаряжение, с живыми данными.', + eventsTab: 'События', + chatTab: 'Чат', + newMessages: 'Новые сообщения', + hostJam: 'Провести джем', + noEvents: 'Пока нет событий Crew. Проведите джем, контест или встречу от имени Crew — это связывает Crew с календарём событий и позволяет людям Zap’ать его.', + support: 'Поддержать', + zapCrew: 'Zap для Crew', + bandTitle: 'Группа Crew', + bandTagline: 'Живая музыка · скейт и звук', + listenTitle: 'Слушать: {{domain}}', + listen: 'Слушать треки', + setUpGig: 'Организовать выступление', + bookGigMessage: 'Привет {{crew}} — интересует бронирование {{band}} на выступление. Есть время обсудить даты?', + messageAboutGig: 'Написать о выступлении', + gigHintA: 'добавляет музыкальное событие в календарь, организованное этим Crew.', + messageShort: 'Написать', + gigHintB: 'открывает зашифрованный DM для Crew, чтобы согласовать даты и детали.', + homeSpots: 'Домашние Spot’ы', + viewSpot: 'Открыть Spot', + seeOnMap: 'Смотреть на карте →', + founderLinks: 'Основатель и ссылки', + startedBy: 'Основано {{name}}', + opens: 'Открывается: {{domain}}', + }, + crews: { + seoTitle: 'Crew - SkateSpots', + seoDescription: 'Найдите своих. Открывайте локальные скейт-Crew, коллективы и сообщества рядом.', + videoPartTooltip: 'У этого Crew есть видео-парт', + part: 'Парт', + bandTooltip: 'Группа Crew: {{name}}', + band: 'Группа', + focusAll: 'Все', + focusAllShort: 'Все', + focusDiy: 'DIY', + focusPhoto: 'Фото', + focusCoaching: 'Коучинг', + focusArt: 'Арт', + focusMusic: 'Музыка', + focusPhysio: 'Физио', + focusMixed: 'Смешанный', + title: 'Crew', + heroLine: 'Ваша скейт-семья на карте — те, с кем вы катаетесь', + heroWith: 'с', + heroRest: ', а не те, кого вы нанимаете (это The Lab).', + crewCountOne: '{{count}} Crew', + crewCountMany: '{{count}} Crew', + cityCountOne: '{{count}} город', + cityCountMany: '{{count}} городов', + createCrew: 'Создать Crew', + create: 'Создать', + searchPlaceholder: 'Поиск Crew по названию или городу…', + filterTitle: 'Фильтр Crew', + filterDesc: 'Чем увлекается Crew.', + nearMe: 'Рядом со мной', + emptySearchTitle: 'Нет Crew по вашему запросу', + emptySearchHint: 'Ничего не найдено по «{{query}}». Попробуйте другое название или город.', + clearSearch: 'Очистить поиск', + emptyFocusTitle: 'Пока нет Crew «{{label}}»', + emptyFocusHint: 'Здесь пока никто не поднимает флаг «{{label}}». Покажите все Crew или создайте этот сами.', + showAll: 'Показать все Crew', + claimTitle: 'Займите свою локальную сцену', + claimHint: 'Здесь ещё нет Crew. Будьте первым — создайте Crew, привяжите домашние Spot’ы и поставьте свою сцену на карту, чтобы все её нашли.', + }, + crewCoordinator: { + privateChat: 'Приватный чат Crew', + on: 'Вкл', + defaultA: 'Вкладка', + chatWord: 'Чат', + defaultB: '—', + e2ee: 'со сквозным шифрованием', + defaultC: 'для основателя и всех указанных участников — настраивать ничего не нужно. Сообщения запечатаны ключом каждого участника (NIP-17), так что читать их может только ваш Crew.', + advancedA: 'Продвинуто: запустите свой', + cordnCoordinator: 'координатор Cordn', + routeThrough: 'Направлять чат через него', + coordinator: 'Координатор', + deliveredOver: 'Доставляется через', + sharedRelay: '— общий релей ContextVM.', + ownRelay: '— собственный релей вашего Crew.', + chatLive: 'Приватный чат активен', + routesA: 'Вкладка', + routesB: 'направляет трафик через этот координатор: сообщения защищены сквозным шифрованием (NIP-44, запечатаны для каждого участника), поэтому он обрабатывает только запечатанный трафик.', + publicWarning: 'Учтите: адресация идёт через общий релей ContextVM, поэтому шифротекст и его метаданные (какой Crew и когда) публично видны — но не читаемы. Направьте Crew на приватный релей wss://, чтобы скрыть и это.', + ownRelaySafe: 'Ничего специфичного для Crew не покидает собственный релей вашего Crew.', + manage: 'Управлять координатором', + open: 'Открыть {{domain}}', + runBy: 'Координатор запущен', + }, + dms: { + securityReminder: 'Напоминание о безопасности', + phishingStrong: 'SkateSpots никогда не пишет вам в DM', + phishingRest: 'с просьбой подтвердить аккаунт, поделиться ключами или отправить платёж. Если кто-то выдаёт себя за поддержку SkateSpots в DM — это мошенничество.', + dismissReminder: 'Скрыть напоминание о безопасности', + peopleCount: '{{count}} человек', + youPrefix: 'Вы: ', + unreadMessages: 'Непрочитанные сообщения', + seoTitle: 'Сообщения - SkateSpots', + seoDescription: 'Приватные зашифрованные сообщения со скейт-сообществом', + loginTitle: 'Войдите, чтобы получить доступ к сообщениям', + loginDesc: 'Приватные зашифрованные сообщения со скейтерами сообщества', + secureLoginTitle: 'Требуется безопасный вход', + secureLoginDesc: 'Для приватных сообщений нужно приложение-подписант, чтобы шифровать разговоры.', + onAndroid: 'На Android:', + useAmber: 'Используйте приложение Amber', + getAmber: 'Установить Amber →', + onIOS: 'На iOS:', + iosHint: 'Попробуйте войти через bunker-подключение (nsec.app) из настроек', + browserHint: 'Попробуйте войти через расширение браузера, например Alby или nos2x, поддерживающее шифрование.', + title: 'Сообщения', + subtitleFull: 'Сквозное шифрование с NIP-17', + subtitleShort: 'Зашифровано', + newMessage: 'Новое сообщение', + groups: 'Группы', + loadFailed: 'Не удалось загрузить сообщения', + emptyTitle: 'Пока нет сообщений', + emptyDesc: 'Начните разговор с кем-нибудь в сообществе', + startConversation: 'Начать разговор', + undecryptableOne: '{{count}} зашифрованное сообщение не удалось открыть вашему подписанту.', + undecryptableMany: '{{count}} зашифрованных сообщений не удалось открыть вашему подписанту.', + }, + editCrew: { + seoTitleNamed: 'Редактировать {{name}} - SkateSpots', + seoTitle: 'Редактировать Crew - SkateSpots', + seoDescription: 'Редактируйте свой скейт-Crew.', + loginRequired: 'Требуется вход', + notYours: 'Не ваш Crew', + notYoursDesc: 'Только основатель Crew может редактировать этот Crew.', + backToCrew: 'Назад к Crew', + title: 'Редактировать Crew', + }, + form: { + add: 'Добавить', + added: 'Добавлено', + addNameInBasicsA: 'Добавьте название Crew обратно в', + addNameInBasicsB: 'чтобы завершить.', + adminsDescA: 'Назначьте доверенных участников', + adminsWord: 'админами', + adminsDescB: '— они могут приглашать участников и модерировать ленту и чат Crew своими ключами. Вы (основатель) всегда остаётесь владельцем идентичности Crew.', + agentDescA: 'Добавьте', + agentDescB: ', ИИ-гида, который действительно знает ваш Crew. Участники могут спрашивать о', + agentDescC: '— а также о ближайших Spot’ах, событиях, Coach и снаряжении из живых данных SkateSpots. Работает прямо в браузере; без ключей и настройки. Это ранняя версия (ИИ бесплатного уровня, поэтому иногда медленно).', + agentDescStrong: 'вашем следующем джеме, кто руководит Crew, что вы ищете и вашей атмосфере', + agentEnabledNote: 'Sasquatch появится на странице вашего Crew после сохранения.', + bandDesc: 'Есть группа? Скейт-сцены и локальная музыка идут рука об руку — укажите название группы и ссылку на треки.', + bandFooterA: 'Для полного профиля группы (жанры, инструменты, выступления) создайте', + musicianWord: 'Музыкант', + bandFooterB: 'в The Lab, затем привяжите его в разделе', + linkedLabWord: 'Связанные профили The Lab', + bandFooterC: 'выше.', + bandMusicWord: 'Группа и музыка', + bandName: 'Название группы', + bandNamePlaceholder: 'например, The Bail Outs', + bandNudgeA: 'У вас есть группа — нажмите, чтобы указать', + crewTypeWord: 'Тип Crew', + bandNudgeB: 'как', + bandNudgeC: 'чтобы вы также появлялись в музыкальной сцене The Lab.', + beta: 'Бета', + bioLabel: 'О нас / манифест', + bioPlaceholder: 'Кто вы, на чём катаетесь, ваша история...', + continue: 'Продолжить', + crewCreated: 'Crew создан!', + crewUpdated: 'Crew обновлён!', + crewName: 'Название Crew', + crewOnlyWord: 'Только Crew', + crewType: 'Тип Crew', + crewTypeDescA: 'Ваш Crew сосредоточен на ремесле? Выберите одно, чтобы также появляться в этой сцене в', + theLab: 'The Lab', + crewTypeDescB: '. Обычные скейт-Crew остаются', + mixedWord: 'смешанными', + crewTypeDescC: '.', + customVibeHint: 'Добавьте свою атмосферу или направление через #', + customVibePlaceholder: 'например, downhill, night-sessions, no-comply', + editDesc: 'Идентичность вашего Crew, домашняя территория и участники', + enableAgent: 'Включить агента Crew', + enableTreasury: 'Включить казну Crew', + failed: 'Ошибка', + founded: 'Основан (год)', + geolocationUnsupported: 'Геолокация не поддерживается', + gettingLocation: 'Получение...', + goalHint: 'Убедитесь, что в вашем профиле Nostr есть Lightning-адрес (lud16), чтобы взносы поступали.', + goalPlaceholder: 'например, залить бетон на DIY-Spot’е', + goalTarget: 'Цель (sats)', + goalWhat: 'Какова цель?', + homeSpots: 'Домашние Spot’ы', + homeSpotsDesc: 'Привяжите Spot’ы, где бывает ваш Crew — они соединятся с вашим Crew на карте', + homeTurf: 'Домашняя территория (город / район)', + homeTurfPlaceholder: 'Бристоль, Великобритания', + instagramDetected: 'Обнаружен клип Instagram', + invalidMember: 'Введите корректный npub, nprofile или hex pubkey.', + latitude: 'Широта', + leaveBlankLocation: 'Оставьте пустым, чтобы сохранить текущее местоположение домашней территории.', + links: 'Ссылки', + locationError: 'Ошибка местоположения', + locationFound: 'Местоположение найдено', + logoAlt: 'Crew', + logoHint: 'Логотип делает ваш Crew мгновенно узнаваемым на карте и в лентах. Лучше всего квадратный.', + logoLabel: 'Логотип / фото Crew', + logoUploaded: 'Логотип загружен', + longitude: 'Долгота', + looksGood: 'Выглядит хорошо', + makeAdmin: 'Сделать админом', + mapPin: 'Метка на карте', + mapPinHint: 'Поставьте свой Crew на карту, чтобы местные могли вас найти. Нажмите кнопку — печатать не нужно.', + memberAlreadyAdded: 'Этот участник уже добавлен.', + members: 'Участники', + membersDesc: 'Добавьте аккаунты Nostr вашего Crew. Каждый участник подтверждает своим ключом — до этого они отображаются как «ожидающие».', + musicLink: 'Ссылка на музыку', + nameCrew: 'Назовите свой Crew', + nameCrewDesc: 'Перед продолжением Crew нужно название.', + nameCrewFirst: 'Сначала назовите свой Crew', + nameHint: 'Единственное, что действительно нужно. Можете изменить позже.', + namePlaceholder: 'например, Backyard Bandits', + nameRequired: 'Требуется название', + nameRequiredDesc: 'Дайте своему Crew название.', + nip05DescA: 'Проверяемый ник, которым вы управляете на любом домене, например', + nip05DescB: '. Он проверяется по ключу основателя этого Crew, и вы можете добавить несколько — каждый показывает зелёную галочку, когда его домен подтверждает.', + nip05Label: 'NIP-05 Crew', + nip05Placeholder: 'crew@yourdomain.com', + nip05Add: 'Добавить', + nip05Invalid: 'Введите ник вида crew@yourdomain.com', + nip05TooMany: 'Можно добавить до {{count}} ников.', + nip05Unverified: 'Не проверен', + nip05Remove: 'Удалить {{handle}}', + notAKeyA: 'Это пока не похоже на ключ Nostr — вставьте', + notAKeyB: ',', + notAKeyC: ', или hex pubkey.', + onlyYouTubeInstagram: 'Поддерживаются только ссылки YouTube и Instagram.', + openCall: 'Открытый набор', + openCallDescA: 'Ищете Filmer, Editor или новых людей? Объявите набор — это покажется на странице Crew, чтобы подходящие люди из', + openCallDescB: 'могли связаться.', + optional: '· необязательно', + optionalParen: '(необязательно)', + otherSocials: 'Другие соцсети', + otherSocialsDesc: 'Добавьте сколько угодно — YouTube, TikTok, Discord, Telegram и т.д.', + ownVisibility: 'собственную видимость', + progress: 'Прогресс', + publicWord: 'Публичный', + publishedToScene: 'Опубликовано для сцены.', + publishFailed: 'Не удалось опубликовать', + publishing: 'Публикация...', + ready: 'Готово', + readyToRollA: 'Всё готово — нажмите', + readyToRollB: 'когда захотите.', + removeAdminRole: 'Снять роль админа', + removeMember: 'Удалить участника', + removeSocial: 'Удалить ссылку на соцсеть', + removeVibe: 'Удалить {{vibe}}', + roles: 'Роли:', + sasquatch: 'Sasquatch', + saveCrew: 'Сохранить Crew', + skipToEnd: 'Перейти в конец', + socialPlaceholder: '@имя или ссылка', + sponsorDesc: 'Если локальный магазин поддерживает ваш Crew, выберите его здесь, чтобы показать баннер «При поддержке» со ссылкой на его магазин.', + stepAria: 'Шаг {{step}}: {{title}}', + stepBasics: 'Основы', + stepBasicsShort: 'Основы', + stepBasicsHint: 'Только самое необходимое — этого шага достаточно, чтобы создать Crew.', + stepVibe: 'Идентичность и атмосфера', + stepVibeShort: 'Атмосфера', + stepVibeHint: 'Как ваш Crew выглядит в приложении. Всё необязательно.', + stepSquad: 'Команда и Spot’ы', + stepSquadShort: 'Команда', + stepSquadHint: 'Добавьте своих людей и домашнюю территорию. Это всегда можно сделать позже.', + stepExtras: 'Дополнительно', + stepExtrasShort: 'Дополнительно', + stepExtrasHint: 'Улучшения на потом — пропускайте всё, в чём не уверены.', + extrasAllOptional: 'Всё на этом шаге необязательно.', + groupIdentity: 'Идентичность', + groupIdentityHint: 'Ник, ссылки', + groupAi: 'Sasquatch AI', + groupShowcase: 'Витрина', + groupPayments: 'Оплата и казна', + groupIntegrations: 'Интеграции', + groupAdvanced: 'Продвинуто', + groupAdvancedHint: 'экспериментально', + pro: 'Pro', + agentProNote: 'Работает на Sasquatch. Pro получает лучшие модели; без Pro используется бесплатный резервный вариант.', + stepOf: 'Шаг {{step}} из {{total}}', + treasuryDescA: 'Собирайте sats на общую цель — починить местный DIY-Spot, поездку Crew, призовой фонд контеста. Это прозрачная Lightning-цель; Zap’ы идут', + treasuryDescStrong: 'прямо в ваш кошелёк', + treasuryDescB: '(через Lightning-адрес вашего профиля). SkateSpots никогда не хранит средства.', + upload: 'Загрузить', + uploadFailed: 'Не удалось загрузить', + useCurrentLocation: 'Использовать текущее местоположение', + vibeLabel: 'Атмосфера / направление', + videoDescA: 'Полный парт, монтаж или последний клип вашего Crew. Вставьте ссылку', + videoDescB: '— он будет воспроизводиться прямо на странице Crew.', + visibilityDescA: 'Каждый участник управляет своей', + visibilityDescB: '— когда он подтверждает своим ключом, он может выбрать', + visibilityDescC: '— скрыт от посторонних). Вы не можете задать это за них; это их решение.', + website: 'Сайт', + yourRoles: 'Ваши роли (тимлид)', + youtubeDetected: 'Обнаружено видео YouTube', + invalidUrl: 'Введите корректную ссылку (например, https://example.com).', + }, + groupConversation: { + seoTitle: 'Групповой чат - SkateSpots', + invalidLink: 'Эта ссылка на групповой чат недействительна.', + loginTitle: 'Войдите, чтобы просмотреть эту группу', + secureSignerTitle: 'Требуется безопасный подписант', + secureSignerDesc: 'Для групповых сообщений нужен подписант с поддержкой NIP-44.', + encryptedGroup: 'Группа со сквозным шифрованием', + empty: 'Пока нет сообщений — поприветствуйте группу.', + placeholder: 'Написать группе...', + }, + hero: { + established: 'Осн. {{year}}', + teamLeader: 'Тимлид: {{name}}', + ledBy: 'Во главе', + }, + inviteCard: { + acceptedTitle: 'Приглашение принято 🛹', + acceptedDesc: 'Основатель Crew подтверждает участников в {{crew}}. Вы появитесь в составе после одобрения.', + couldNotAccept: 'Не удалось принять', + couldNotDecline: 'Не удалось отклонить', + acceptedDone: 'Принято —', + confirmsMembers: 'подтверждает участников', + declinedDone: 'Приглашение в {{crew}} отклонено', + invitedYou: 'пригласил вас присоединиться', + admin: 'Админ', + accept: 'Принять', + decline: 'Отклонить', + }, + inviteDialog: { + messageIntro: 'Йо — присоединяйся к Crew {{crew}} в SkateSpots 🛹', + messageBody: 'Войдите своим ключом Nostr, затем запросите вступление со страницы Crew.', + copyFailed: 'Не удалось скопировать', + shareTitle: 'Присоединиться к {{crew}}', + sentTitle: 'Приглашение отправлено! 🛹', + sentDesc: 'Они получат уведомление принять или отклонить.', + couldNotSend: 'Не удалось отправить приглашение', + trigger: 'Пригласить', + title: 'Пригласить в {{crew}}', + description: 'Отправьте приглашение на ключ Nostr человека или поделитесь ссылкой.', + sendTab: 'Отправить приглашение', + shareTab: 'Поделиться ссылкой', + npubLabel: 'npub скейтера', + invalidNpub: 'Это не похоже на корректный npub.', + noteLabel: 'Заметка', + optional: '(необязательно)', + notePlaceholder: 'Покатаемся вместе…', + inviteAsAdmin: 'Пригласить как админа', + inviteAsAdminDesc: 'Сможет управлять Crew и приглашать других.', + sendButton: 'Отправить приглашение', + sendFooter: 'Они получат уведомление принять или отклонить. Участие засчитывается только после принятия.', + inviteLink: 'Ссылка-приглашение', + messageLabel: 'Сообщение', + copyMessage: 'Копировать сообщение', + founderHint: 'Как основатель вы также можете добавить ключ участника напрямую, а затем он подтвердит.', + addMemberSettings: 'Добавить участника в настройках Crew', + }, + joinRequest: { + moreCount: '+{{count}} ещё', + addedTitle: '{{name}} добавлен в {{crew}} 🛹', + addedDesc: 'Они подтвердят со своей стороны, чтобы отображаться как участник.', + vouchedTitle: 'Вы поручились за {{name}} 🤝', + vouchedDesc: 'Основатель {{crew}} увидит вашу рекомендацию и сможет добавить их.', + couldNotEndorse: 'Не удалось поручиться', + endorsedDoneA: 'Вы поручились за', + endorsedDoneB: '— основатель подтвердит', + vouchedBy: 'Поручился', + approveAndAdd: 'Одобрить и добавить', + addToCrew: 'Добавить в Crew', + vouchedWaiting: 'Поручительство — ожидание основателя', + vouchForThem: 'Поручиться за них', + leadershipOnly: 'Только для руководства Crew.', + adminHelp: 'Админы не могут добавлять участников напрямую — поручительство сообщает основателю, что вы поддерживаете этого райдера.', + }, + leadership: { + teamLeader: 'Тимлид', + captain: 'Капитан', + verifiedMember: 'Проверенный участник', + messageName: 'Написать {{name}}', + title: 'Руководство', + captainsOne: '{{count}} капитан', + captainsMany: '{{count}} капитанов', + footer: 'Тимлид ведёт состав; капитаны помогают приглашать, проводить джемы и поддерживать порядок в Crew.', + }, + linkField: { + title: 'Связанный Crew', + description: 'Тоже ведёте Crew? Привяжите его, чтобы люди могли переходить между вашей студией и вашим Crew. Необязательно. Привяжите этот Crew обратно к профилю из редактора Crew, и у обоих появится зелёный', + descriptionRest: 'значок.', + none: 'У вас пока нет Crew. Создайте его на странице Crew, чтобы привязать здесь.', + linkedCrew: 'Связанный Crew ({{id}})', + }, + lookingFor: { + title: 'Открытый набор', + subtitle: 'Этот Crew ищет:', + }, + memberVisibility: { + updatedTitle: 'Видимость обновлена', + updatedCrew: 'Теперь вы видны только товарищам по Crew.', + updatedPublic: 'Теперь вы публично видны в этом Crew.', + couldNotUpdate: 'Не удалось обновить', + title: 'Ваша видимость в этом Crew', + save: 'Сохранить видимость', + }, + newMessage: { + inCrew: 'В вашем Crew: {{crews}}', + crewmate: 'Товарищ по Crew', + following: 'Вы подписаны', + invalidKey: 'Это не похоже на корректный npub или публичный ключ.', + description: 'Ищите своих людей по имени или вставьте npub, чтобы написать кому угодно. Выберите двух или более, чтобы начать группу.', + searchPlaceholder: 'Поиск по имени или вставьте npub1...', + messageThisKey: 'Написать этому ключу', + loadingPeople: 'Загрузка ваших людей...', + noPeople: 'Пока нет товарищей по Crew или подписок.', + noPeopleHint: 'Вставьте npub кого-нибудь выше, чтобы начать разговор.', + yourCrews: 'Ваши Crew', + selected: '{{count}} выбрано', + startGroup: 'Начать группу ({{count}})', + message: 'Написать', + }, + nip05: { + mismatch: 'Этот домен указывает ник на другой ключ Nostr, не на ключ основателя Crew. Не проверен.', + verified: 'Проверено — домен подтверждает, что этот ник принадлежит ключу основателя Crew.', + }, + requestCollective: { + sentTitle: 'Запрос отправлен 🤝', + sentDesc: '{{name}} увидит его в уведомлениях и сможет добавить вас.', + couldNotSend: 'Не удалось отправить запрос', + title: 'Присоединиться к этому коллективу', + waiting: 'Запрос отправлен — ожидание {{name}}.', + askA: 'Попросите Crew за', + askB: 'добавить вас в состав. Они получат уведомление и смогут добавить вас одним нажатием.', + placeholder: 'Необязательно: скажите, почему вы подходите…', + sendButton: 'Отправить запрос', + }, + requestToJoin: { + sentTitle: 'Запрос отправлен! 🛹', + sentDesc: 'Руководство {{crew}} увидит его в уведомлениях.', + couldNotSend: 'Не удалось отправить запрос', + trigger: 'Запросить вступление', + title: 'Присоединиться к {{crew}}', + description: 'Уведомляет основателя и админов Crew, чтобы они могли добавить вас.', + placeholder: 'Поздоровайтесь — где катаетесь, кого знаете, почему хотите вступить…', + sending: 'Отправка…', + sendButton: 'Отправить запрос на вступление', + }, + sponsorBanner: { + loading: 'Загрузка спонсора…', + sponsoredBy: 'При поддержке', + }, + sponsorPicker: { + selected: 'Спонсор выбран', + setLoading: 'Спонсор установлен (загрузка магазина…)', + set: 'Спонсор установлен', + clearAria: 'Убрать спонсора', + searchPlaceholder: 'Поиск скейт-магазинов по названию или городу…', + loading: 'Загрузка магазинов…', + noMatch: 'Нет подходящих магазинов — попробуйте другой запрос.', + none: 'Пока не найдено магазинов.', + }, + treasury: { + title: 'Казна Crew', + ofGoal: 'из цели {{target}}', + goalReached: 'Цель достигнута!', + funded: '{{percent}}% собрано', + contributionOne: '{{count}} взнос', + contributionMany: '{{count}} взносов', + daysLeft: 'осталось {{days}} дн', + closed: 'закрыто', + nonCustodial: 'Без хранения · Zap’ы идут напрямую в Lightning-кошелёк Crew', + }, + userStatus: { + atSpot: '📍 На Spot’е', + autoClears: '⏱️ Автоочистка через {{min}} мин', + }, + video: { + title: 'Парт', + fullVideo: 'Полное видео · монтаж', + latestClip: 'Последний клип', + watch: 'Смотреть', + iframeTitle: '{{crew}} — видео', + playAria: 'Воспроизвести видео {{crew}}', + thumbAlt: 'Миниатюра видео {{crew}}', + instagramTitle: 'Клип Instagram', + }, + vouch: { + removedTitle: 'Поручительство убрано', + vouchedTitle: 'Поручительство!', + removedDesc: 'Вы больше не поручаетесь за {{name}}.', + vouchedDesc: 'Вы поручились за {{name}}. Сцена доверяет своим.', + couldNotVouch: 'Не удалось поручиться', + title: 'Поручительства сцены', + sceneVerified: 'Проверено сценой', + vouched: 'Поручился', + newUnvouched: 'Новый · без поручительств', + checking: 'Проверяем сцену…', + empty: 'Пока нет поручительств. Поручительства от скейтеров из ваших кругов — лучший сигнал, что человек настоящий, а не случайный прохожий.', + countOne: '{{count}} поручительство', + countMany: '{{count}} поручительств', + trusted: '{{count}} от скейтеров из вашей сети доверия', + remove: 'Убрать поручительство', + vouchFor: 'Поручиться за {{name}}', + ownerNote: 'Скейтеры, которые знают вашу работу, могут поручиться за вас здесь.', + }, + }, +}; export default ruBatch5; diff --git a/src/i18n/ru/batch6.ts b/src/i18n/ru/batch6.ts index 4884bcc..b49fa94 100644 --- a/src/i18n/ru/batch6.ts +++ b/src/i18n/ru/batch6.ts @@ -1,4 +1,1948 @@ -/** ru — batch 6. Filled by the translation pass; empty until then. */ -const ruBatch6 = {}; +/** ru — batch 6: placesUi, marketUi, labOptions. */ +const ruBatch6 = { + 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: "Название Shop", + threePhotos: "3+ фото", + tip: "💡 Чем выше качество — тем больше Zap от сообщества!", + }, + calendar: { + allDay: "Весь день", + eventDay: "День Event", + eventsOnDay: "{{count}} Event", + eventsThisMonth: "Event в этом месяце", + going: "идут", + months: { + january: "Январь", + february: "Февраль", + march: "Март", + april: "Апрель", + may: "Май", + june: "Июнь", + july: "Июль", + august: "Август", + september: "Сентябрь", + october: "Октябрь", + november: "Ноябрь", + december: "Декабрь", + }, + nextMonth: "Следующий месяц", + nothingOnDay: "В этот день ничего нет.", + prevMonth: "Предыдущий месяц", + tapHighlighted: "Нажмите на выделенный день, чтобы увидеть, что там.", + today: "Сегодня", + tourDay: "День Tour", + toursOnDay: "{{count}} Tour", + toursThisMonth: "Tour в этом месяце", + 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: "Добавить новый Spot →", + changeSpot: "Сменить Spot", + created: "Event создан!", + createdDesc: "Ваш Event опубликован в сети.", + entryFee: "Входной сбор", + entryFeeHint: "(необязательно — например, «500 sats» или «£10»)", + entryFeePlaceholder: "Оставьте пустым для бесплатных Event", + featuring: "С участием {{name}}", + featuringDesc: "Этот участник будет отмечен как live music и появится в его списке концертов.", + fundingGoal: "Цель сбора", + fundingGoalHint: "(необязательно — sats для сбора через Zaps)", + fundingGoalPlaceholder: "например, 50000", + geoNotSupported: "Геолокация не поддерживается", + geoNotSupportedDesc: "Ваш браузер не поддерживает геолокацию.", + hideSpots: "Скрыть Spots", + hostingAs: "Проводите как {{name}}", + hostingAsDesc: "Этот Event появится на странице вашего Crew и будет отмечен как проводимый Crew.", + imageUploaded: "Изображение загружено", + imageUploadedDesc: "Ваше изображение успешно загружено.", + invalidDate: "Неверная дата", + invalidDateDesc: "Введите корректные дату и время начала.", + invalidEnd: "Неверное время окончания", + invalidEndDesc: "Время окончания должно быть позже времени начала.", + linkedTo: "Связано с: {{title}}", + linkToSpot: "Связать со Skate Spot", + linkToShop: "Связать с Shop", + selectedShop: "Связано с {{name}}", + selectShopHint: "Необязательно — проводится в скейт-магазине или им.", + selectShop: "Выбрать Shop", + changeShop: "Сменить Shop", + hideShops: "Скрыть Shop", + searchShops: "Поиск Shop…", + noShopsMatch: "Нет Shop по вашему запросу.", + noShopsAvailable: "Пока нет доступных Shop.", + linkToTour: "Связать с Tour (необязательно)", + linkTourDesc: "Свяжите этот Event с Tour, чтобы показать, что он часть серии. Отлично для национальных туров, международных приключений или дней World Destruction Tour.", + loadingSpots: "Загрузка Spots...", + loadingTours: "Загрузка Tour...", + locationError: "Ошибка местоположения", + locationFound: "Местоположение найдено", + locationFoundDesc: "Установлено ваше текущее местоположение.", + logoUrl: "URL логотипа (необязательно)", + noSpotsAvailable: "Нет доступных Spots", + noSpotsMatch: "Нет Spots по вашему запросу", + noTourLinked: "Tour не связан", + optional: "(необязательно)", + pastDesc: "Выберите дату и время в будущем, чтобы скейтеры могли ответить RSVP и прийти.", + pastTitle: "Это время начала уже прошло", + publishFailed: "Не удалось опубликовать", + publishFeatured: "Опубликовать как Featured Event", + removeSponsor: "Удалить спонсора", + searchSpots: "Поиск Spots по названию, местоположению или категории...", + selectedSpot: "Выбрано: {{name}}", + selectSpot: "Выбрать Spot", + selectSpotHint: "Выберите Spot на карте, где проходит этот Event", + selectTour: "Выбрать Tour", + somethingWrong: "Что-то пошло не так", + sponsorName: "Имя спонсора", + sponsors: "Спонсоры", + sponsorsHint: "Есть Shop или бренд, поддерживающий это? Добавьте их логотип — он показывается полосой «Presented by» на Event.", + startRequired: "Требуется время начала", + startRequiredDesc: "Укажите, когда начинается Event.", + titleRequired: "Требуется название", + titleRequiredDesc: "Введите название для этого Event.", + uploadFailed: "Не удалось загрузить", + uploadFailedDesc: "Не удалось загрузить изображение", + websiteUrl: "URL сайта (необязательно)", + }, + createShop: { + address: "Адрес Shop", + addressPlaceholder: "например, 411 N Fairfax Ave, Los Angeles, CA 90036", + addressRequired: "Требуется адрес", + addressRequiredDesc: "Введите адрес вашего Shop.", + contactHint: "Помогите клиентам связаться с вами (рекомендуется хотя бы один способ связи)", + contactInfo: "Контактная информация", + created: "🎉 Shop добавлен!", + createdDesc: "Ваш скейт-магазин теперь на карте. Скейтеры могут отправить вам Zap в знак благодарности!", + descriptionPlaceholder: "Расскажите о своём Shop, что вы продаёте, ваша специализация...", + detailsDesc: "Расскажите сообществу о своём Shop. Все поля со звёздочкой * обязательны.", + email: "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: "Требуется название Shop", + nameRequiredDesc: "Введите название вашего Shop.", + phoneNumber: "Номер телефона", + publishFailedDesc: "Что-то пошло не так. Проверьте консоль для деталей.", + shopPhotoAlt: "Shop", + shopPhotos: "Фото Shop", + subtitle: "Разместите свой Shop на карте и общайтесь с сообществом", + upload: "Загрузить", + }, + createTour: { + acceptedClipSources: "Принимаемые источники клипов", + acceptedClipSourcesDesc: "Какие форматы вы принимаете для клипов?", + accommodationInfo: "Информация о жилье", + accommodationPlaceholder: "Рекомендации или организация жилья, например: «Бюджетные хостелы по маршруту», «Нужно кемпинговое снаряжение», «Airbnb включены»", + addChallenge: "Добавить испытание", + addCity: "Добавить город...", + addCountry: "Добавить страну...", + addShopFirst: "Сначала добавьте Shop", + alsoSelected: "Также выбрано:", + availabilityPlaceholder: "например, Выходные, Только утром, По записи", + availabilityQuestion: "Когда вы обычно доступны?", + availableShops: "Доступные Skate Shops ({{count}})", + challengeDescPlaceholder: "Необязательное описание...", + challenges: "Испытания", + challengesRequired: "Требуются испытания", + challengesRequiredDesc: "Добавьте хотя бы одно испытание для команд.", + challengesSecret: "Все испытания SECRET до даты начала соревнования. Команды не увидят их до этого!", + challengeTitlePlaceholder: "Название испытания, например, «Kickflip a 10 stair»", + citiesLabel: "Города", + citiesOnTour: "Города в Tour", + cityPlaceholder: "например, Берлин, Германия", + cityRegion: "Город / регион", + cityRequired: "Требуется город/регион", + cityRequiredDesc: "Введите ваш город или регион.", + clipAnyUrl: "🔗 Любой URL", + clipBlossom: "📦 Загрузка Blossom", + clipInstagram: "📸 Instagram", + clipYouTube: "▶️ YouTube", + competitionDates: "Даты соревнования", + competitionDatesWarning: "⚠️ Все испытания SECRET до даты начала! Команды не увидят испытания до начала соревнования.", + competitionLocations: "Места соревнования", + competitionLocationsDesc: "Где будут соревноваться команды? Добавьте все города и страны.", + coordsHint: "Координаты необязательны. Добавьте их, чтобы отметить место встречи на карте.", + countriesLabel: "Страны", + countriesRequired: "Требуются страны", + countriesRequiredDesc: "Добавьте хотя бы одну страну для международного Tour.", + createdDestruction: "💀 WORLD DESTRUCTION TOUR СОЗДАН!", + createdDestructionDesc: "Команды могут регистрироваться. Испытания откроются в дату начала!", + createDestructionTour: "Создать World Destruction Tour", + createdInternational: "✈️ Международный Tour создан!", + createdInternationalDesc: "Ваше глобальное приключение в списке! Общайтесь со скейтерами по всему миру.", + createdLocal: "🏠 Локальный Tour создан!", + createdLocalDesc: "Ваш Tour теперь виден. Скейтеры могут записаться через DM!", + createdNational: "🚐 Национальный Tour создан!", + createdNationalDesc: "Ваше road trip опубликовано! Начните координироваться с заинтересованными скейтерами.", + departure: "Отправление *", + departureRequired: "Требуется дата отправления", + departureRequiredDesc: "Укажите, когда отправляется поездка, чтобы скейтеры могли планировать и бронировать.", + descriptionPlaceholder: "Опишите, что испытают скейтеры: Spots, которые посетите, атмосферу, чем ваш Tour уникален...", + destructionDesc: "Настройте глобальное соревнование в стиле KOTR — вы определяете ВСЁ!", + discountHint: "Участники Tour могут показать подтверждение брони в Shop, чтобы получить эту скидку", + discountPercentage: "Процент скидки", + dropTour: "Создать Tour", + duration: "Длительность", + durationHintDestruction: "Сколько длится соревнование? (1-12 месяцев)", + durationHintInternational: "Сколько недель приключение? (до 2 месяцев)", + durationHintLocal: "Сколько длится ваш обычный Tour?", + durationHintNational: "Сколько дней длится road trip?", + durationWeeksMonths: "{{weeks}} нед. (~{{months}} мес.)", + editTour: "Редактировать Tour", + enable: "Включить", + enabled: "Включено", + endBeforeStart: "Окончание раньше начала", + endBeforeStartDesc: "Дата окончания соревнования должна быть не раньше даты начала.", + endDate: "Дата окончания", + entryFeeHint: "Вы получаете 95% • Платформа берёт 5% • Оставьте пустым для бесплатного участия", + entryFeePerTeam: "Взнос за команду (sats)", + entryFeePlaceholder: "например, 100000", + entryPrizes: "Взнос и призы", + filmPremieres: "Премьеры командных фильмов", + filmPremieresDesc: "После соревнования клипы каждой команды становятся полным фильмом, премьера которого может пройти в местных скейт-магазинах по всему миру.", + filmPremieresInfo: "🎥 Команды собирают клипы испытаний в финальный фильм. Shop могут провести премьеры, связывая глобальное соревнование с местными сообществами.", + filmReleaseDate: "Дата выхода фильма (необязательно)", + filmReleaseDateHint: "Когда фильмы будут доступны. Оставьте пустым, чтобы выпустить сразу после окончания соревнования.", + fixedSession: "Фиксированная сессия", + fixedSessionDesc: "Заданные дата и время", + flexible: "Гибко", + flexibleDesc: "Запись в любое время через DM", + hide: "Скрыть", + howDestruction1: "• Глобальное командное соревнование — до 12 месяцев", + howDestruction2: "• ВЫ определяете испытания, очки, призы — мы лишь предоставляем платформу", + howDestruction3: "• Все испытания SECRET до даты начала соревнования", + howDestruction4: "• Клипы через загрузку Blossom ИЛИ внешние ссылки (YouTube, Instagram, любой URL)", + howDestruction5: "• Только продвинутый уровень — все типы Spots включаются автоматически", + howDestruction6: "• Платформа берёт только 5% от взносов (НЕ из призового фонда)", + howDestructionTitle: "💀 WORLD DESTRUCTION TOUR — в стиле KOTR", + howInternational1: "• Трансграничные приключения по нескольким странам", + howInternational2: "• Вы назначаете цену — платформа берёт только 5%", + howInternational3: "• Установите даты отправления и возвращения, чтобы Crew могли забронировать билеты", + howInternational4: "• Соединяйте скейтеров со всего мира", + howInternational5: "• Создавайте незабываемые глобальные впечатления!", + howInternationalTitle: "Как работают международные Tours", + howItWorks: "Как это работает:", + howLocal1: "• Вы назначаете цену — платформа берёт 10%", + howLocal2: "• Скрытые Spots остаются скрытыми — вы показываете их лично", + howLocal3: "• Проводите запланированную сессию или держите гибкий формат / по записи", + howLocal4: "• Скейтеры записываются через DM, платят в Lightning и могут добавить в свой календарь", + howLocal5: "• Стройте репутацию через отзывы и Zaps", + howLocalTitle: "Как работают локальные Tours", + howNational1: "• Многогородские road trips по вашей стране", + howNational2: "• Вы назначаете цену — платформа берёт только 7%", + howNational3: "• Установите даты поездки, чтобы скейтеры могли спланировать отпуск и поездку", + howNational4: "• Укажите информацию о транспорте / жилье для Crew", + howNational5: "• Создавайте легендарные скейт-приключения!", + howNationalTitle: "Как работают национальные Tours", + imageUploadedDesc: "Ваше изображение Tour загружено.", + incompleteCoords: "Неполные координаты", + incompleteCoordsDesc: "Введите и широту, и долготу, или оставьте оба поля пустыми.", + internationalDetails: "Детали международного приключения", + languagesSelected: "{{count}} выбрано", + languagesSpoken: "Языки общения", + latOptional: "Широта (необязательно)", + lngOptional: "Долгота (необязательно)", + loadingProfile: "Загрузка профиля...", + loadingProfileDesc: "Проверка статуса верификации NIP-05.", + loadingShops: "Загрузка Shop...", + localShopPremieres: "Премьеры в местных Shop", + localShopPremieresDesc: "Скейт-магазины по всему миру могут провести киновечера", + loginToCreate: "Нужно войти, чтобы создать Tour.", + maxGroupSize: "Макс. размер группы", + maxTeams: "Макс. команд", + maxTeamSize: "Макс. размер команды", + meetingLocationSet: "Ваше текущее местоположение установлено как место встречи.", + meetingPointDesc: "Где вы встретитесь с участниками Tour? Выберите публичное, известное место.", + meetingPointLabel: "Место встречи", + meetingPointPlaceholder: "например, станция Warschauer Straße", + meetingPointRequired: "Требуется место встречи", + meetingPointRequiredDesc: "Укажите, где вы встретите участников Tour.", + minTeamSize: "Мин. размер команды", + noChallenges: "Пока нет испытаний", + noChallengesDesc: "Добавьте испытания для команд", + noPartnerShop: "Нет партнёрского Shop", + noShopsFound: "Пока не найдено скейт-магазинов в сети.", + noShopsRegistered: "Пока нет зарегистрированных скейт-магазинов", + onlineRelease: "Онлайн-релиз", + onlineReleaseDesc: "Также выпускайте фильмы на YouTube/Nostr", + organizerContact: "Контакты организатора", + organizerContactHint: "Будет видно зарегистрированным командам", + organizerContactPlaceholder: "Как команды могут связаться с вами? например, Nostr npub, email, Telegram и т.д.", + partnerDiscountDesc: "Предложите участникам Tour скидку в местном скейт-магазине", + partnerStep1: "1. Найдите местный скейт-магазин, которому доверяете", + partnerStep2: "2. Установите процент скидки для участников Tour", + partnerStep3: "3. После Tour выдайте участникам подтверждение для предъявления в Shop", + partnerStep4: "4. Shop применяет скидку — укрепляет сообщество и привлекает покупателей!", + percentOff: "{{percent}}% СКИДКА", + photoHint: "Добавьте фото, где вы катаетесь, или крутой Spot из вашего Tour.", + pickRide: "Выберите транспорт", + place1: "🥇 1-е", + place2: "🥈 2-е", + place3: "🥉 3-е", + platformFee: "Вы назначаете цену • Платформа берёт {{percent}}", + points: "Очки:", + pricePerPerson: "Цена за человека (sats)", + pricePlaceholder: "например, 25000", + prizeDistribution: "Распределение призов", + prizePoolHint: "Необязательно — общий призовой фонд", + prizePoolPlaceholder: "например, 2000000", + proTipDesc: "Перед публикацией партнёрской скидки свяжитесь с владельцем Shop через DM, чтобы согласовать процент. Так он будет в курсе и применит скидку для ваших участников.", + proTipTitle: "💡 Совет: сначала согласуйте с Shop!", + return: "Возвращение", + returnBeforeDeparture: "Возвращение раньше отправления", + returnBeforeDepartureDesc: "Дата возвращения должна быть не раньше даты отправления.", + roadTripDetails: "Детали road trip", + schedule: "Расписание", + scheduleDesc: "Проведите как разовую запланированную сессию или оставьте гибкий формат и позвольте скейтерам записаться на время через DM.", + secretUntilStart: "Секретно до начала", + selectPartnerShop: "Выбрать партнёрский Shop", + sessionDateRequired: "Требуется дата сессии", + sessionDateRequiredDesc: "Выберите дату и время для запланированной сессии или переключитесь на гибкое расписание.", + sessionDateTime: "Дата и время сессии", + sessionDateTimeHint: "Скейтеры увидят это время и смогут добавить его в календарь со страницы Tour.", + shopPremieresContact: "Свяжитесь с этими Shop напрямую, чтобы организовать премьерные вечера. Все договорённости приватны.", + shopPremieresHow: "💡 Как работают премьеры в Shop: свяжитесь с Shop напрямую, чтобы организовать премьерные вечера. Все договорённости приватны между вами и Shop.", + shopsCanRegister: "Shop могут зарегистрироваться на /create-shop", + show: "Показать", + showAllLanguages: "Показать все {{count}} языков", + somethingWrong: "Что-то пошло не так.", + spotTypes: "Типы Spots", + spotTypesRequired: "Требуются типы Spots", + spotTypesRequiredDesc: "Выберите хотя бы один тип Spots, который покажете.", + startDate: "Дата начала", + startDateRequired: "Требуется дата начала", + startDateRequiredDesc: "Укажите, когда начинается соревнование (в эту дату откроются испытания).", + startingCity: "Начальный город", + startingCityPlaceholder: "например, Лос-Анджелес, США", + teamSettings: "Настройки команд", + teamsCount: "{{count}} команд", + titlePlaceholder: "например, Berlin Kreuzberg — тур по андеграундным Spots", + titleRequired: "Требуется название Tour", + titleRequiredDesc: "Введите название вашего Tour.", + totalPercent: "Итого: {{percent}}%", + totalPrizePool: "Общий призовой фонд (sats)", + tourDesc: "Расскажите скейтерам, чего ожидать на вашем Tour", + tourDetails: "Детали Tour", + tourPhoto: "Фото Tour", + tourTitle: "Название Tour", + transportDestructionPlaceholder: "Как команды будут добираться между локациями? Есть ли предоставленный или рекомендованный транспорт?", + transportInfo: "Информация о транспорте", + transportPlaceholder: "Как будут добираться участники? например, «Предоставляется фургон», «Летим в Барселону, там арендуем фургон», «Поезд между городами»", + tripDatesDesc: "Зафиксируйте даты, чтобы скейтеры могли взять отгул, забронировать билеты и спланировать поездку.", + tripDatesTitle: "Даты поездки", + updated: "Tour обновлён!", + updatedDesc: "Ваши изменения опубликованы.", + upload: "Загрузить", + view: "Смотреть →", + worldDestruction: "World Destruction Tour", + youReceive: "Вы получаете: {{amount}} sats за человека", + }, + editEvent: { + accessDenied: "Доступ запрещён", + accessDeniedDesc: "Вы можете редактировать только созданные вами Event.", + backToEvent: "Назад к Event", + detailsDesc: "Обновите информацию об этом Event. Все поля со звёздочкой * обязательны.", + eventCover: "Обложка Event", + locationUpdated: "Местоположение обновлено.", + loginToEdit: "Нужно войти, чтобы редактировать этот Event.", + newSpot: "Новый Spot: {{location}}.", + newTime: "Новое время: {{date}} в {{time}}.", + saveChanges: "Сохранить изменения", + saving: "Сохранение...", + title: "Редактировать Event", + updated: "Event обновлён!", + updatedDesc: "Ваши изменения опубликованы в сети.", + updateDetails: "Обновить детали {{title}}", + updatedNotified: "Изменения опубликованы — {{count}} участников уведомлены.", + updateFailed: "Не удалось обновить", + updateMessage: "{{parts}} — подробности в Event.", + }, + editShop: { + accessDeniedDesc: "Вы можете редактировать только созданные вами Shop.", + backToShop: "Назад к Shop", + detailsDesc: "Обновите информацию о вашем Shop. Все поля со звёздочкой * обязательны.", + loginToEdit: "Нужно войти, чтобы редактировать этот Shop.", + updated: "Shop обновлён!", + updateDetails: "Обновить детали {{name}}", + }, + editTour: { + accessDeniedDesc: "Вы можете редактировать только созданные вами Tour.", + loginToEdit: "Нужно войти, чтобы редактировать этот Tour.", + }, + eventCard: { + report: "Пожаловаться", + }, + eventDetail: { + aCrew: "Crew", + addToCalendar: "Добавить в календарь", + backToEvents: "Назад к Events", + cancelled: "Этот Event отменён", + checkUpdate: "— проверьте обновление", + copyFailed: "Не удалось скопировать", + date: "Дата", + editEvent: "Редактировать Event", + eventFallback: "Event", + eventOrganizer: "Организатор Event", + getDirections: "Проложить маршрут", + linkCopied: "Ссылка скопирована", + linkCopiedDesc: "Ссылка на Event скопирована в буфер обмена — вставьте её куда угодно.", + live: "Live:", + liveMusic: "live music", + location: "Местоположение", + newLocation: "Новое местоположение", + noRsvps: "RSVP не зафиксированы.", + organizer: "Организатор", + rsvpsClosed: "RSVP закрыты — этот Event отменён организатором.", + seeMap: "Показать карту", + shareEvent: "Поделиться Event", + shareText: "{{title}} — скейт-Event на SkateSpots", + shareTextFallback: "Зацените этот скейт-Event на SkateSpots", + time: "Время", + timeChanged: "Время изменено", + updatesFromHost: "Обновления от организатора", + where: "Где", + whoCame: "Кто пришёл", + whosGoing: "Кто идёт", + }, + events: { + calendar: "Календарь", + createTour: "Создать Tour", + events: "Events", + faqFooter: "Есть вопросы? Смотрите FAQ →", + hosting: "Провожу", + hostingSubtitle: "Ваши Events — RSVP, обновления и быстрые правки", + list: "Список", + noEventsMatchFilters: "Нет Events по вашим фильтрам. Попробуйте изменить или сбросить их.", + noPast: "Нет прошедших Events", + noPastBody: "Прошедших скейт-Events по вашим фильтрам не найдено.", + noTours: "Tours не найдены", + noToursBody: "Пока нет скейт-Tours. Создайте первый и поведите скейтеров открывать Spots!", + noToursMatchFilters: "Нет Tours по вашим фильтрам. Попробуйте изменить или сбросить их.", + noUpcoming: "Нет предстоящих Events", + noUpcomingBody: "Предстоящих скейт-Events не найдено. Будьте первым, кто создаст!", + past: "Прошедшие", + resultsCount: "{{count}} результатов", + searchCity: "Город…", + searchEvent: "Название Event…", + searchTour: "Название Tour…", + tours: "Tours", + toursSubtitle: "Локальные гиды, road trips и соревнования World Destruction", + upcoming: "Предстоящие", + }, + eventTypes: { + contest: "Контест", + demo: "Демо", + jam: "Jam", + meetup: "Встреча", + premiere: "Премьера", + session: "Сессия", + workshop: "Воркшоп", + }, + featured: { + active: "Активно", + bodyEvent: "Публикация бесплатна. Featured Events получают значок и место вверху страницы Events.", + bodyTour: "Публикация бесплатна. Featured Tours получают значок и место вверху списка Tours.", + contextEvent: "Ваш Event в любом случае остаётся в списке бесплатно — Featured лишь добавляет значок и продвижение.", + contextTour: "Ваш Tour в любом случае остаётся в списке бесплатно — Featured лишь добавляет значок и продвижение.", + daysRemaining: "Featured активно · осталось {{count}} дн.", + headingEvent: "Продвинуть этот Event", + headingTour: "Продвинуть этот Tour", + optional: "необязательно", + platformOwner: "Владелец платформы — Featured всегда включён.", + }, + filters: { + activeCount: "{{count}} активно", + all: "Все", + allLevels: "Все уровни", + eventType: "Тип Event", + following: "Подписки", + newest: "Новые", + popular: "Популярные", + showResults: "Показать результаты", + showResultsActive: "Показать результаты · {{count}} активно", + skillLevel: "Уровень навыка", + sortBy: "Сортировать по", + topRated: "Лучшие по рейтингу", + tourCategory: "Категория Tour", + trusted: "Доверенные", + trustLevel: "Уровень доверия", + verified: "Верифицированные", + }, + food: { + bar: "Бар", + cafe: "Кафе", + call: "Позвонить", + chooseSpot: "Выберите Spot...", + directions: "Маршрут", + fastFood: "Фастфуд", + foodCourt: "Фуд-корт", + locationLabel: "Местоположение:", + noneFound: "Еда рядом не найдена", + noneFoundDesc: "Мы не нашли ресторанов или кафе в радиусе 1 км от этого Spot. Попробуйте выбрать другое место.", + placesFound: "{{count}} мест найдено в радиусе 1 км от {{spot}}", + pub: "Паб", + restaurant: "Ресторан", + selectSpot: "Выберите Skate Spot", + selectSpotDesc: "Выберите Skate Spot в списке выше, чтобы найти ближайшие рестораны, кафе и другие варианты еды.", + selectSpotTitle: "Выберите Skate Spot", + subtitle: "Найдите, где поесть рядом с вашими любимыми Skate Spots", + title: "Еда рядом со Spots", + 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 удалил Shop «{{name}}»", + areYouOwner: "Вы владелец Shop?", + backToMap: "Назад к карте", + claimDesc: "Если вы владеете этим Shop или управляете им, вы можете заявить права и подтвердить владение через NIP-05.", + claimNip05Intro: "Чтобы заявить права на этот Shop, добавьте идентификатор NIP-05, совпадающий с доменом сайта Shop. Например, если сайт Shop —", + claimNip05Your: "ваш NIP-05 должен быть", + contactShop: "Связаться с Shop", + deleted: "Shop удалён", + deletedDesc: "Запрос на удаление отправлен на Relay. Большинство Relay удалят этот контент.", + deleteDialogDesc: "Это навсегда удалит «{{name}}» со всех Relay. Действие необратимо.", + deleteDialogTitle: "Удалить Shop?", + deletedReason: "Удалённый Shop", + deleteFailed: "Не удалось удалить", + deleteShop: "Удалить Shop", + linkCopied: "Ссылка скопирована!", + linkCopiedDesc: "Ссылка на Shop скопирована в буфер обмена.", + nip05Required: "⚠️ Для заявления прав на Shop требуется верификация NIP-05", + opens: "Открывает: {{domain}}", + removeAdmin: "Удалить (админ)", + removed: "Shop удалён", + removedDesc: "Этот Shop снят и будет скрыт во всём SkateSpots.", + removeDialogDesc: "Как админ SkateSpots вы снимаете «{{name}}». Он будет скрыт во всём приложении для всех, и на Relay будет отправлен запрос на удаление.", + removeDialogTitle: "Удалить этот Shop? (админ)", + removeShop: "Удалить Shop", + tipMapper: "Отблагодарить маппера", + tipMapperDesc: "Этот Shop добавил участник сообщества. Отправьте ему 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: "Об этом Tour", + availability: "Доступность", + competitionWindow: "Окно соревнования", + contactToBook: "Связаться с гидом для записи", + discountAt: "{{percent}}% СКИДКА в {{shop}}", + duration: "Длительность", + languages: "Языки", + loginToBook: "Войти для записи", + loginToBookDesc: "Войдите, чтобы связаться с гидом и записаться на этот Tour", + maxGroup: "Макс. группа", + meetingPoint: "Место встречи", + notFound: "Tour не найден", + notFoundDesc: "Этот Tour мог быть удалён или не существует.", + organizer: "Организатор", + partnerDiscount: "Скидка партнёрского Shop", + partnerDiscountDesc: "Запишитесь на этот Tour, чтобы получить скидку в партнёрском скейт-магазине. Покажите подтверждение брони сотрудникам Shop.", + people: "{{count}} человек", + perPerson: "за человека", + price: "Цена", + runsAbout: "Длится около {{duration}}", + scheduledSession: "Запланированная сессия", + shareText: "Зацените этот локальный скейт-Tour: {{title}}", + skillLevel: "Уровень навыка", + spotTypes: "Типы Spots", + tourGuide: "Гид Tour", + tourSponsors: "Спонсоры Tour", + tripDates: "Даты поездки", + viewProfile: "Открыть профиль", + }, + updates: { + admin: "Админ", + adminNote: "Вы публикуете как админ SkateSpots. Это будет чётко помечено как уведомление админа, а не от организатора.", + kindCancelled: "Отменено", + kindNewSpot: "Новый Spot", + kindNewTime: "Новое время", + kindUpdate: "Обновление", + loading: "Загрузка обновлений…", + notifiedCount: "{{count}} человек уведомлено.", + notifiedEveryone: "Все увидят это на Event.", + notifiesRsvps: "Уведомляет {{count}} RSVP", + noUpdates: "Пока нет обновлений от организатора. Ответьте RSVP, и вы узнаете, если что-то изменится.", + placeholder: "Дождь — перенесли на воскресенье, 14:00. Встреча у заднего леджа…", + post: "Опубликовать", + postAdminUpdate: "Опубликовать обновление админа", + posted: "Обновление опубликовано", + postError: "Не удалось опубликовать обновление", + postUpdate: "Опубликовать обновление", + tryAgain: "Попробуйте ещё раз.", + visibleToEveryone: "Видно всем на этом Event", + }, + destination: { + bitcoin: "Bitcoin", + closeSearch: "Закрыть поиск", + nothingMatches: "Ничего не найдено по «{{query}}».", + placeholder: "Поиск Spots, Shop, Bitcoin-мерчантов…", + shop: "Shop", + spot: "Spot", + typeChars: "Введите минимум 2 символа. Поиск по Skate Spots, скейт-магазинам и Bitcoin-мерчантам.", + typeCharsNear: "Введите минимум 2 символа. Поиск по Skate Spots, скейт-магазинам и Bitcoin-мерчантам рядом.", + }, + dateWindow: { + any: "Любая", + anytime: "В любое время", + month: "В этом месяце", + monthShort: "Месяц", + today: "Сегодня", + todayShort: "Сегодня", + week: "На этой неделе", + weekend: "Выходные", + weekendShort: "Вых.", + weekShort: "Нед.", + }, + }, + marketUi: { + gearSwap: { + title: "Gear Swap", + subtitle: "Покупайте и продавайте б/у скейт-Gear с другими скейтерами", + listGear: "Выставить Gear", + searchPlaceholder: "Поиск Gear...", + allCategories: "Все категории", + forSale: "Продажа", + wtb: "WTB", + trust: "Доверие", + filterByTrust: "Фильтр по доверию", + allSellers: "Все продавцы", + verifiedOnly: "Только верифицированные", + trustedPlus: "Доверенные+", + followingOnly: "Только подписки", + pickupOrShip: "Самовывоз или доставка", + localPickup: "Самовывоз", + ships: "Доставка", + sortBy: "Сортировать по", + newest: "Новые", + priceLowHigh: "Цена: по возрастанию", + priceHighLow: "Цена: по убыванию", + trustScore: "Рейтинг доверия", + nearest: "Ближайшие (локально)", + listingFound: "{{count}} объявление найдено", + listingsFound: "{{count}} объявлений найдено", + loadFailed: "Не удалось загрузить объявления", + tryLater: "Попробуйте позже.", + noneTitle: "Объявлений не найдено", + noneFiltered: "Нет Gear по вашим фильтрам. Попробуйте сбросить их или поискать другое.", + noneFirst: "Будьте первым, кто выставит свой Gear — Deck, Trucks, Wheels, кроссовки, что угодно скейтерское!", + listYourGear: "Выставить свой Gear", + faqLink: "Есть вопросы? Смотрите FAQ →", + }, + hub: { + browse: "Обзор", + selling: "Продажа", + myTrades: "Мои сделки", + reputation: "Репутация", + loginListings: "Войдите, чтобы управлять объявлениями.", + loginReputation: "Войдите, чтобы увидеть свою репутацию и отзывы.", + }, + marketplace: { + heroTitle: "Shop и Marketplace", + heroBefore: "Наш Marketplace работает на", + heroAfter: " — децентрализованном Marketplace на Nostr. Скейт-магазины могут выставлять товары, а вы можете покупать и продавать б/у Gear напрямую за Bitcoin.", + whatIsTitle: "Что такое Plebeian Market?", + whatIsBody: "Plebeian Market — децентрализованный Marketplace на Nostr. Покупайте и продавайте скейтборд-Gear напрямую с другими скейтерами за Bitcoin. Без посредников, без комиссий, полная свобода.", + noFeesTitle: "Без комиссий", + noFeesBody: "Никто не забирает 30%. Продажи напрямую между людьми.", + bitcoinTitle: "Оплата Bitcoin", + bitcoinBody: "Платите Bitcoin. Быстро, безопасно, по всему миру.", + decentralizedTitle: "Децентрализация", + decentralizedBody: "Построено на Nostr. Никакая компания не контролирует его.", + visit: "Посетить Plebeian Market", + buySellTitle: "Что можно купить и продать", + catCompletes: "Готовые Deck", + preBuilt: "Собранные комплекты", + customSetups: "Кастомные сборки", + beginnerBoards: "Доски для новичков", + catParts: "Запчасти", + decks: "Decks", + trucks: "Trucks", + wheels: "Wheels", + bearings: "Bearings", + gripTape: "Griptape", + hardware: "Крепёж", + catApparel: "Одежда и защита", + skateShoes: "Скейт-кроссовки", + clothing: "Одежда", + helmets: "Шлемы", + pads: "Защита", + backpacks: "Рюкзаки", + catAccessories: "Аксессуары", + tools: "Инструменты", + wax: "Воск", + rails: "Рейлы", + stickers: "Стикеры", + videos: "Видео", + magazines: "Журналы", + howItWorks: "Как это работает", + step1Title: "Смотрите товары", + step1Body: "Зайдите на Plebeian Market и просмотрите скейтборд-Gear от магазинов и людей по всему миру.", + step2Title: "Свяжитесь с продавцами", + step2Body: "Пишите продавцам напрямую через Nostr. Обсуждайте цены, задавайте вопросы, договаривайтесь о доставке.", + step3Title: "Платите Bitcoin", + step3Body: "Завершите покупку через Bitcoin Lightning — мгновенные платежи с низкой комиссией.", + step4Title: "Оставьте отзыв", + step4Body: "Оцените опыт и укрепите репутацию продавца на Nostr. Ваши отзывы помогают сообществу.", + needBitcoinTitle: "Нужен Bitcoin?", + needBitcoinBefore: "Для покупок понадобится Lightning-кошелёк с sats. Смотрите", + onboardingGuide: "руководство по началу работы", + needBitcoinAfter: "с рекомендациями по кошелькам.", + ownShopTitle: "У вас есть скейт-магазин?", + ownShopBody: "Разместите свой Shop на SkateSpots и продавайте товары на Plebeian Market. Охватите клиентов по всему миру без комиссии платформы.", + addShop: "Добавить свой Shop", + startSelling: "Начать продавать", + }, + listingDetail: { + notFound: "Объявление не найдено", + notFoundBody: "Возможно, оно удалено или ссылка неверна.", + backToGearSwap: "Назад к Gear Swap", + gearSwap: "Gear Swap", + 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: "При продаже Gear нужно хотя бы одно фото", + nip05Required: "Требуется верификация NIP-05", + nip05RequiredBody: "Чтобы выставлять Gear, нужен верифицированный Nostr-адрес", + priceRequired: "Требуется цена для объявлений с фиксированной ценой", + sizeRequired: "Требуется размер", + sizeRequiredBody: "Выберите размер для {{category}}", + conditionRequired: "Требуется состояние", + conditionRequiredBody: "Выберите состояние вашего {{category}}", + wtbPosted: "WTB опубликовано!", + wtbPostedBody: "Продавцы смогут найти ваш запрос.", + listingCreated: "Объявление создано!", + listingCreatedBody: "Ваш Gear теперь выставлен.", + publishFailed: "Не удалось опубликовать", + loginRequired: "Требуется вход", + loginRequiredBody: "Нужно войти, чтобы выставить Gear.", + backToStash: "Назад к Stash", + backToSpot: "Назад к {{title}}", + backToMarketplace: "Назад к Marketplace", + backToMap: "Назад к карте", + wantToBuy: "Хочу купить", + listYourGear: "Выставить свой Gear", + wtbSubtitle: "Расскажите сообществу, какой Gear вы ищете", + sellSubtitle: "Продавайте скейтборд-Gear сообществу", + fromStashTitle: "Объявление из вашего Stash", + fromStashBody: "Предзаполнено данными предмета из Stash. Проверьте и выберите место встречи!", + nip05Banner: "Чтобы предотвратить спам и защитить покупателей, для выставления Gear нужен верифицированный Nostr-адрес (NIP-05).", + verifiedLabel: "Верифицирован:", + checkingTrust: "Проверка вашего уровня доверия...", + trustLevel: "Уровень доверия:", + trusted: "Доверенный", + active: "Активный", + newcomer: "Новичок", + newUser: "Новый пользователь", + remaining: "Осталось {{remaining}} из {{limit}} объявлений в этом месяце", + cooldownBody: "У новых пользователей 24-часовое ожидание между объявлениями.", + timeRemaining: "Осталось времени: {{time}}", + monthlyLimitTitle: "Месячный лимит достигнут", + monthlyLimitBody: "Вы достигли лимита в {{limit}} объявлений в этом месяце. Укрепляйте репутацию, создавая Spots или завершая сделки, чтобы повысить лимит.", + powAccepted: "Proof of work принят!", + feePaid: "Сбор оплачен!", + canCreateNow: "Теперь вы можете создать объявление.", + whatDoTitle: "Что вы хотите сделать?", + sellGear: "ПРОДАТЬ GEAR", + categoryTitle: "Категория *", + categoryHint: "Какой тип Gear?", + detailsTitle: "Детали Gear", + detailsWtbHint: "Опишите, что вы ищете", + detailsSellHint: "Расскажите покупателям о вашем предмете", + titleLabel: "Название *", + titlePlaceholderWtb: "Ищу Deck 8.0\"", + titlePlaceholderSell: "Почти новый Palace Deck 8.25\"", + summaryLabel: "Краткое описание", + summaryPlaceholderWtb: "Любой бренд, предпочтительно минимальный график", + summaryPlaceholderSell: "Отличное состояние, почти не использовался", + descriptionLabel: "Описание", + descriptionPlaceholderWtb: "Опишите точно, что ищете — предпочтения по бренду, требования к состоянию и т.д.", + descriptionPlaceholderSell: "Получил этот Deck на Рождество, но предпочитаю меньший размер. С радостью дам попробовать перед покупкой!", + fulfilmentLabel: "Как доставляется?", + pickup: "Самовывоз", + pickupHint: "Встреча на месте", + ships: "Доставка", + shipsHint: "Отправить почтой", + both: "Оба", + bothHint: "Любой вариант", + addressNote: "Мы никогда не собираем ваш адрес — для доставки делитесь им приватно в чате сделки.", + postageLabel: "Кто оплачивает доставку?", + requireEscrow: "Требовать escrow", + requireEscrowHint: "Попросить покупателя рассчитаться через escrow Cashu.", + postageBuyer: "Покупатель платит", + postageSeller: "Я плачу", + postageSplit: "Пополам", + sizeLabel: "Размер", + selectSize: "Выберите размер", + truckHeight: "Высота Trucks", + selectHeight: "Выберите высоту", + wheelHardness: "Жёсткость Wheels", + selectHardness: "Выберите жёсткость", + pricingTitle: "Цена", + pricingWtbHint: "Как вы хотите заплатить?", + pricingSellHint: "Как вы хотите продать?", + priceLabel: "Цена *", + currencyLabel: "Валюта", + photosTitle: "Фото", + photosSellHint: "Требуется хотя бы одно фото", + photosWtbHint: "Необязательно — добавьте референсные изображения", + productPhoto: "Товар {{n}}", + upload: "Загрузить", + photosNote: "Добавьте до 5 фото. Первое изображение будет главным.", + pickupLocationTitle: "Место самовывоза", + pickupLocationHint: "Свяжите со Skate Spot для удобных встреч", + searchSpots: "Поиск Spots...", + noSpotsFound: "Spots не найдены. Попробуйте другой запрос.", + availabilityLabel: "Когда вы обычно доступны?", + availabilityPlaceholder: "Выходные 10:00-14:00, вторник/четверг вечером", + availabilityHint: "Помогает покупателям согласовать с вами встречу", + durationTitle: "Срок объявления", + durationHint: "Как долго объявление должно оставаться активным?", + publishing: "Публикация...", + checkingEligibility: "Проверка права...", + cooldownButton: "ОЖИДАНИЕ: {{time}}", + limitReachedButton: "ЛИМИТ ДОСТИГНУТ", + payFeeButton: "ОПЛАТИТЬ СБОР", + postWtbButton: "ОПУБЛИКОВАТЬ WTB", + listForSaleButton: "ВЫСТАВИТЬ GEAR НА ПРОДАЖУ", + }, + trades: { + title: "Мои сделки", + loginBody: "Войдите, чтобы управлять сделками на Marketplace и репутацией.", + subtitle: "Подтверждения, запросы и репутация, которую они создают. Оплата согласуется с другим скейтером — приложение лишь фиксирует сделку.", + actionNeeded: "Требуется действие", + askedToConfirmSale: "просит подтвердить продажу", + recordedSale: "зафиксировал продажу — подтвердите свою сторону", + confirmSale: "Подтвердить продажу", + confirm: "Подтвердить", + nothingWaiting: "Сейчас от вас ничего не требуется. 🛹", + yourRecords: "Ваши записи о сделках", + noTrades: "Пока нет сделок. Закройте сделку и подтвердите её, чтобы начать строить репутацию.", + browseGearSwap: "Смотреть Gear Swap", + roleSold: "Продажа", + roleBought: "Покупка", + roleTrade: "Обмен", + with: "с", + viewListing: "Открыть объявление", + revoke: "Отозвать", + revokeTitle: "Отозвать эту запись о сделке?", + revokeBody: "Она перестанет учитываться в вашей репутации. У другой стороны останется своё подтверждение. Используйте для спорной или ошибочной сделки.", + revokeNote: "Отозвано автором.", + revoked: "Запись о сделке отозвана", + revokedBody: "Она больше не учитывается в репутации.", + revokeFailed: "Не удалось отозвать сделку", + saleConfirmed: "Продажа подтверждена", + saleConfirmedBody: "Теперь они могут подтвердить свою сторону.", + saleConfirmFailed: "Не удалось подтвердить продажу", + tradeConfirmed: "Сделка подтверждена", + tradeConfirmedBody: "Репутация обновлена для вас обоих.", + tradeConfirmFailed: "Не удалось подтвердить сделку", + somethingWrong: "Что-то пошло не так.", + }, + card: { + listingDeleted: "Объявление удалено", + listingRemoved: "Объявление снято", + listingDeletedBody: "Ваше объявление удалено. Relay, соблюдающие удаления, перестанут его отдавать.", + listingRemovedBody: "Это объявление снято и будет скрыто во всём SkateSpots.", + removeFailed: "Не удалось снять", + somethingWrong: "Что-то пошло не так", + markedSold: "Отмечено как продано", + markedSoldBody: "Ваше объявление теперь показывается как проданное.", + couldNotUpdate: "Не удалось обновить", + relisted: "Активировано снова", + relistedBody: "Ваше объявление снова активно.", + listingOptions: "Параметры объявления", + report: "Пожаловаться", + removeAdmin: "Удалить (админ)", + postage: "доставка", + newSeller: "Новый продавец", + saleOne: "{{count}} продажа", + saleMany: "{{count}} продаж", + iHaveThis: "У меня есть это!", + deleteTitle: "Удалить «{{title}}»?", + adminRemoveTitle: "Удалить это объявление? (админ)", + deleteBody: "Это попросит Relay удалить ваше объявление «{{title}}». Отсюда это необратимо — придётся создать новое.", + adminRemoveBody: "Как админ SkateSpots вы снимаете «{{title}}». Он будет скрыт во всём приложении для всех, и на Relay будет отправлен запрос на удаление.", + deleting: "Удаление…", + removing: "Снятие…", + deleteListing: "Удалить объявление", + removeListing: "Снять объявление", + reportCount: "{{count}} жалоба", + reports: "{{count}} жалоб", + viewTitle: "Открыть {{title}}", + reportListing: "Пожаловаться на объявление", + manageListing: "Управлять объявлением", + trusted: "Доверенный", + daysOld: "{{n}} дн. назад", + monthsOld: "{{n}} мес. назад", + yearsOld: "{{n}} г. назад", + listingsCount: "{{count}} объявлений", + postageBuyer: "доставка: покупатель", + postageSeller: "доставка: продавец", + postageSplit: "доставка: пополам", + powTitle: "NIP-13 proof of work — бесплатный анти-спам", + verifiedTradeOne: "{{count}} подтверждённая сделка", + verifiedTrades: "{{count}} подтверждённых сделок", + reportSubmitted: "Жалоба отправлена", + reportSubmittedBody: "Спасибо, что помогаете делать Marketplace безопаснее.", + reportFailed: "Не удалось отправить жалобу", + selectReason: "Выберите причину", + reportDialogBody: "Помогите сделать Marketplace безопаснее — жалуйтесь на неприемлемые или вводящие в заблуждение объявления.", + reasonLabel: "Причина жалобы *", + detailsLabel: "Дополнительные детали (необязательно)", + detailsPlaceholder: "Укажите любую дополнительную информацию, которая может помочь...", + reportNote: "Жалобы публикуются на Nostr и помогают сообществу выявлять проблемные объявления. Объявления с несколькими жалобами могут быть автоматически скрыты.", + submitting: "Отправка...", + submitReport: "Отправить жалобу", + }, + tradeActions: { + tradeConfirmed: "Сделка подтверждена", + tradeConfirmedWithProof: "Приложена проверяемая квитанция — она учитывается в подтверждённых сделках.", + tradeConfirmedBody: "Репутация обновлена для вас обоих.", + tradeConfirmFailed: "Не удалось подтвердить сделку", + somethingWrong: "Что-то пошло не так.", + requestNote: "Пожалуйста, подтвердите нашу сделку по «{{title}}».", + requestSent: "Запрос на подтверждение отправлен", + requestSentBody: "Продавец теперь может подтвердить продажу и укрепить репутацию обоих.", + requestFailed: "Не удалось отправить запрос", + escrowRefunded: "Escrow возвращён", + escrowRefundedBody: "Средства вернулись в ваш кошелёк Cashu.", + escrowRefundFailed: "Не удалось вернуть escrow", + confirmThisTrade: "Подтвердить эту сделку", + escrowAndRequest: "Escrow и запрос", + shipsEscrowHint: "Сделка с доставкой — используйте escrow, чтобы никто не отправил в пустоту. Делитесь адресом приватно в чате сделки, никогда здесь.", + shipsHint: "Сделка с доставкой — предпочитайте escrow, если продавец его предлагает, и делитесь адресом только в чате.", + askSeller: "Попросить продавца подтвердить", + waitingSeller: "Запрос отправлен — ждём продавца.", + refundEscrow: "Вернуть escrow", + buyWithSats: "Купить за sats", + depositTitle: "Депозит добросовестности (необязательно)", + payDeposit: "Оплатить депозит", + depositBefore: "У обмена нет счёта, поэтому именно так возникает", + verifiableCost: "проверяемая стоимость", + depositAfter: ". Возврат при доставке (или используйте escrow Cashu для автоматического возврата). ⚠️ Доказывает намерение, а не доставку.", + depositPaid: "Депозит оплачен", + depositPaidBody: "Сохранено — будет приложено при подтверждении сделки.", + paid: "Оплачено ⚡", + paidWithProof: "Проверяемая квитанция сохранена — подтвердите сделку, чтобы она учлась.", + paidBody: "Попросите продавца подтвердить сделку, чтобы она учлась у вас обоих.", + }, + offers: { + accepted: "Принято", + declined: "Отклонено", + withdrawn: "Отозвано", + open: "Открыто", + noAmount: "без суммы", + titleOwner: "Предложения ({{count}})", + titleBuyer: "Ваши переговоры", + you: "Вы", + them: "Они", + paidAskConfirm: "Оплачено — попросите продавца подтвердить сделку.", + payWithSats: "Оплатить в sats", + accept: "Принять", + decline: "Отклонить", + counter: "Встречное", + counterPlaceholder: "Ваше встречное (sats)", + send: "Отправить", + counterItemPlaceholder: "…или встречное предложение предметом для обмена (необязательно)", + waitingOn: "Ждём", + waitingOnSuffix: "— ваш ход вернётся, если они сделают встречное.", + withdraw: "Отозвать", + dmAccepted: "✅ Ваше предложение принято! Напишите, чтобы согласовать передачу.", + dmDeclined: "❌ Ваше предложение отклонено.", + offerAccepted: "Предложение принято", + offerDeclined: "Предложение отклонено", + respondFailed: "Не удалось ответить", + somethingWrong: "Что-то пошло не так.", + offerWithdrawn: "Предложение отозвано", + withdrawFailed: "Не удалось отозвать", + enterAmountOrItem: "Введите сумму или предмет для обмена", + counterDm: "Встречное предложение", + counterSent: "Встречное предложение отправлено", + counterSentBody: "Теперь их ход.", + counterFailed: "Не удалось отправить встречное", + }, + offer: { + validAmount: "Введите корректную сумму", + describeOffer: "Опишите своё предложение", + describeOfferBody: "Добавьте сумму, предмет для обмена или сообщение.", + dmAmount: " за {{amount}} sats", + dmItem: " (предлагаю: {{item}})", + dmBody: "🛹 Новое предложение по вашему объявлению «{{title}}»{{amount}}{{item}}.{{note}}", + sent: "Предложение отправлено", + sentBody: "{{sellerName}} может принять или отклонить его.", + sendFailed: "Не удалось отправить предложение", + somethingWrong: "Что-то пошло не так.", + title: "Сделать предложение", + description: "Предложите sats или обмен на что-то — {{sellerName}} может принять, отклонить или сделать встречное. О передаче договариваетесь между собой.", + amountLabel: "Сумма (sats, необязательно)", + amountPlaceholder: "например, 45000", + itemLabel: "Или обмен на что-то (необязательно)", + itemPlaceholder: "например, мой Deck 8.25 + запасные Wheels", + itemHint: "Обмен? Укажите здесь, что предлагаете — можно совместить с sats.", + messageLabel: "Сообщение (необязательно)", + messagePlaceholder: "Всё, что продавец должен знать…", + send: "Отправить предложение", + }, + markSold: { + enterBuyer: "Введите npub покупателя", + dealClosed: "Сделка закрыта 🎉", + dealClosedBody: "Объявление отмечено как проданное, а сделка опубликована для репутации.", + closeFailed: "Не удалось закрыть сделку", + somethingWrong: "Что-то пошло не так.", + title: "Закрыть сделку", + description: "Отмечает это объявление проданным и записывает подписанное подтверждение сделки для вас и покупателя.", + buyerLabel: "npub покупателя", + methodLabel: "Как было оплачено? (по вашим словам)", + amountLabel: "Сумма в sats (необязательно)", + submit: "Отметить как продано", + }, + handoff: { + title: "Согласовать передачу", + suggest: "Предложить время и место", + suggestDm: "Привет! Хочу купить «{{title}}». Предложите время и место встречи — с радостью встречусь на публичном Skate Spot.", + orMeetAt: "Или встретиться на ближайшем публичном Spot:", + spotDm: "Привет! Хочу купить «{{title}}». Встретимся на {{spot}}? {{url}}", + shareDelivery: "Поделиться данными доставки", + deliveryDm: "Привет! Хочу купить «{{title}}». Вот мои данные доставки:\n\nИмя:\nАдрес:\n\n(Делись только тем, что нужно курьеру.)", + useLocker: "Использовать постамат", + lockerDm: "Привет! Хочу купить «{{title}}». Можем использовать постамат / пункт выдачи вместо домашнего адреса?", + noteBefore: "Эти данные остаются в приватном чате — SkateSpots их не видит. Для сделок с доставкой предпочитайте", + escrow: "escrow", + noteMiddle: ", и", + neverPay: "никогда не платите вне путей приложения", + noteAfter: ". Встречайтесь в публичном месте.", + }, + shipping: { + noCounterparty: "Пока нет второй стороны", + noCounterpartyBody: "Сначала продавец должен записать продажу (указав покупателя).", + markedShipped: "Отмечено как отправлено", + markedReceived: "Отмечено как получено", + issueReported: "Проблема сообщена", + receivedBody: "Спасибо — это не освобождает escrow; рассчитывайтесь напрямую с продавцом.", + notifiedBody: "Вторая сторона уведомлена.", + updateFailed: "Не удалось обновить", + somethingWrong: "Что-то пошло не так.", + title: "Доставка", + shipped: "отправлено", + received: "получено", + issue: "проблема", + trackingPlaceholder: "Номер отслеживания (необязательно)", + iShipped: "Я отправил", + iReceived: "Я получил", + reportIssue: "Сообщить о проблеме", + noteBefore: "По вашим словам — логистическая заметка,", + notProof: "не доказательство", + noteAfter: ". Отметка «получено» не освобождает escrow. ⚠️ Не фотографируйте посылку с видимым адресом и делитесь номером отслеживания, только если вам комфортно, что он будет публичным.", + }, + pay: { + sent: "Платёж отправлен ⚡", + sentWithProof: "Проверяемая квитанция об оплате сохранена — она учтётся как оплата подтверждена.", + sentBody: "Сообщите продавцу — он может подтвердить сделку, чтобы она учлась у вас обоих.", + failed: "Платёж не прошёл", + title: "Оплатить в sats", + descSendPrefix: "Отправить", + descSendSuffix: "для {{sellerName}} в расчёт по этой сделке.", + descSettle: "Рассчитайтесь по этой сделке напрямую с {{sellerName}}.", + paid: "Оплачено!", + paidBody: "Попросите продавца подтвердить сделку — два подтверждения укрепляют репутацию обоих.", + noMethod: "{{sellerName}} не указал способ оплаты (нет Lightning-счёта или адреса). Напишите ему, чтобы согласовать оплату.", + ownListing: "Это ваше собственное объявление.", + paying: "Оплата…", + pay: "Оплатить", + payAmount: "Оплатить {{amount}} sats", + footnote: "Платит из вашего подключённого кошелька (NWC, WebLN или Cashu) напрямую {{sellerName}} — SkateSpots никогда не держит средства.", + }, + spamFee: { + invoiceComment: "Сбор за объявление SkateSpots", + generateFailed: "Не удалось создать счёт", + paymentSuccess: "Платёж прошёл!", + satsSent: "{{amount}} sats отправлено {{name}}", + autoPayFailed: "Автооплата не удалась", + autoPayFailedBody: "Оплатите вручную через QR-код или счёт", + invoiceCopied: "Счёт скопирован!", + copyFailed: "Не удалось скопировать", + received: "Платёж получен!", + receivedBody: "Ваш сбор {{amount}} sats оплачен. Теперь вы можете создать объявление.", + title: "Разовый сбор за объявление", + subtitle: "Как новому участнику, для первого объявления нужен небольшой сбор.", + whyTitle: "Почему нужно платить?", + spamLabel: "Защита от спама:", + spamBody: "Этот сбор останавливает ботов и мошенников, заваливающих Marketplace фальшивыми объявлениями.", + trustLabel: "Укрепление доверия:", + trustBody: "Новым аккаунтам нужно доказать серьёзность до размещения. После нескольких успешных объявлений сбор отменяется.", + supportsLabel: "Поддержка сообщества:", + supportsPrefix: "Сбор идёт", + supportsSpotOwner: " — человеку, создавшему этот Spot!", + supportsPlatform: " — помогает SkateSpots работать.", + oneTimeFee: "~${{usd}} USD • разовый сбор", + payToContinue: "Оплатить {{amount}} sats, чтобы продолжить", + proveWork: "Вместо этого докажите работу — бесплатно", + proveWorkBody: "Потратьте несколько секунд CPU вместо {{amount}} sats. Без денег, без кошелька — налог на спам, а не платёж.", + generating: "Создание счёта...", + processing: "Обработка платежа...", + qrAlt: "QR-код для оплаты", + copyInvoice: "Скопировать счёт", + openWallet: "Открыть кошелёк", + payWithWallet: "Оплатить подключённым кошельком", + scanHint: "Отсканируйте QR-код Lightning-кошельком или используйте кнопки выше", + skipTitle: "Как пропустить этот сбор в будущем:", + skip1: "Добавьте Skate Spot на карту", + skip2: "Завершите 2-3 успешных объявления", + skip3: "Укрепите репутацию в сообществе", + skipNote: "Доверенные участники получают безлимитные бесплатные объявления!", + }, + reputation: { + highlyTrusted: "Очень надёжный продавец", + building: "Репутация формируется", + newTrader: "Новый участник", + title: "Сделки", + verified: "Подтверждено", + sales: "Продажи", + purchases: "Покупки", + tradeConfirmedOne: "взаимно подтверждённая сделка", + tradeConfirmedMany: "взаимно подтверждённых сделок", + with: "с", + personOne: "человеком", + personMany: "людьми", + awaiting: "Ожидает взаимного подтверждения", + withPaymentProof: "с приложенным доказательством оплаты", + selfReported: "(по вашим словам — не подтверждено)", + paymentVerified: "оплата подтверждена", + zapReceipt: "(квитанция Zap)", + singlePartnerWarning: "Все подтверждения с одним и тем же аккаунтом. Взаимное подтверждение делается со слов, поэтому относитесь к этой записи с осторожностью.", + lowDiversityWarning: "Большинство подтверждений от очень немногих аккаунтов. Небольшая группа, ручающаяся друг за друга, может выглядеть активной — относитесь к этой записи с осторожностью.", + ringWarning: "Эти аккаунты в основном торгуют между собой — замкнутый круг. Взаимное подтверждение внутри круга слабое доказательство.", + weighted: "С учётом доверия и активности", + footnote: "Со слов и взаимно подписано — сигнал, а не доказательство оплаты.", + }, + reputationPanel: { + reviewOfYou: "Отзыв о вас", + yourRecord: "ваша запись", + listing: "Объявление", + averageOne: "средняя из {{count}} оценки", + averageMany: "средняя из {{count}} оценок", + reviewsTitle: "Отзывы и записи о сделках", + fromOthers: "{{count}} от других", + emptyBefore: "Пока нет записей о сделках. Завершите сделку и подтвердите её в", + emptyAfter: "— каждое подтверждение становится отзывом в обоих профилях.", + }, + recommendations: { + published: "Рекомендация опубликована", + publishedBody: "Спасибо за поручительство.", + failed: "Не удалось порекомендовать", + somethingWrong: "Что-то пошло не так.", + title: "Надёжный продавец", + recommendedBy: "Рекомендуют", + skaterOne: "скейтер", + skaterMany: "скейтеров", + none: "Пока нет рекомендаций.", + youRecommend: "Вы рекомендуете этого продавца ✓", + recommend: "Рекомендовать как надёжного продавца", + }, + notification: { + newOffer: "Новое предложение", + counterOffer: "Встречное предложение", + offerAccepted: "Предложение принято", + offerDeclined: "Предложение отклонено", + offerWithdrawn: "Предложение отозвано", + confirmTrade: "Подтвердить сделку", + tradeConfirmed: "Сделка подтверждена", + reviewOffer: "Посмотреть предложение", + openListing: "Открыть объявление", + }, + confirmRow: { + rateTrade: "Оцените сделку:", + }, + deckRating: { + title: "{{value}}/10 Deck", + aria: "{{n}} из 10", + }, + clink: { + tip: "Чаевые в Bitcoin", + copiedBody: "Код CLINK скопирован в буфер обмена.", + copyFailed: "Не удалось скопировать", + copyFailedBody: "Нет доступа к буферу обмена.", + whatIs: "Что такое CLINK?", + tooltipTitle: "Платите напрямую Bitcoin через Nostr", + tooltipBody: "CLINK — самокастодиальный платёжный код: без аккаунта, без посредника. Отсканируйте его совместимым Lightning-кошельком, и чаевые уйдут прямо ему.", + descRecipient: "Отправьте самокастодиальный платёж Bitcoin (Lightning) {{recipientName}} — без посредника.", + descGeneric: "Отправьте самокастодиальный платёж Bitcoin (Lightning) через Nostr — без посредника.", + qrAlt: "QR-код CLINK Offer", + copyCode: "Скопировать код CLINK", + openWallet: "Открыть в кошельке CLINK", + copyToWallet: "Скопировать код для кошелька", + priceFixed: "Фиксированно — {{amount}} sats", + priceFixedShort: "Фиксированная цена", + priceVariable: "Переменная цена", + priceVariableCurrency: "Цена в {{currency}}", + priceSpontaneous: "Сумму выбираете вы", + footnote: "Отсканируйте совместимым с CLINK кошельком (например, ShockWallet). Если ничего не открылось, скопируйте код выше — возможно, у вас не установлен совместимый кошелёк. Без кастодиана, без веб-сервера: счёт запрашивается напрямую через 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 Offer", + optional: "(необязательно, для опытных)", + offerId: "Offer: {{id}}", + relay: "Relay: {{relay}}", + invalidBefore: "Это не похоже на корректный код", + invalidAfter: ".", + valid: "Корректный код CLINK — в вашем профиле появится кнопка «Оплатить через CLINK».", + help: "Вставьте самокастодиальный платёжный код CLINK (например, из ShockWallet / Lightning.Pub), чтобы принимать Nostr-нативные Lightning-платежи — без веб-сервера и кастодиана.", + learnSpecs: "Изучить спецификацию", + }, + escrowPanel: { + escrowed: "В escrow {{amount}} sats", + mint: "Mint", + refundSinceBefore: "Покупатель может вернуть с", + redeemBefore: "Продавец может получить сейчас · покупатель вернёт после", + noExpiry: "У этого токена не задан срок истечения.", + }, + escrowRequest: { + enterAmount: "Введите сумму escrow", + minLock: "Блокировка минимум на {{days}} дн.", + requestNote: "В escrow {{amount}} sats для нашей сделки — пожалуйста, подтвердите продажу.", + created: "Escrow создан 🎉", + createdBody: "{{amount}} sats заблокированы на {{days}} дн. {{sellerName}} может получить их при доставке.", + createFailed: "Не удалось создать escrow", + somethingWrong: "Что-то пошло не так.", + title: "Взять эту сделку в escrow", + description: "Средства заблокированы для {{sellerName}} и возвращаются вам, если сделка сорвётся после дедлайна. Требуется подключённый Lightning-кошелёк.", + amountLabel: "Сумма (sats)", + daysLabel: "Возврат покупателю через (дней)", + daysHint: "Спустя столько дней вы можете вернуть средства, если продавец не доставил.", + nativeOnly: "Escrow Cashu доступно только в приложении SkateSpots (не в веб-версии).", + lockAndRequest: "Заблокировать и запросить", + }, + }, + labOptions: { + coach: { + skill: { + basics: "Основы", + ollies: "Ollies", + kickflips: "Kickflips", + grinds: "Grinds и Slides", + manuals: "Manuals", + inverts: "Inverts", + vert: "Vert/рампы", + bowl: "Bowl", + street: "Street", + freestyle: "Freestyle", + safety: "Безопасность", + diy: "DIY-модули", + }, + skillDesc: { + basics: "Толчок, стойка, баланс, повороты", + ollies: "Ollie и вариации (nollie, fakie)", + kickflips: "Kickflip, heelflip и вариации", + grinds: "50-50, 5-0, boardslide и другое", + manuals: "Manual, nose manual, комбо", + inverts: "Invert, handplant, eggplant, andrecht", + vert: "Half-pipe, quarter-pipe, drop-in", + bowl: "Катание в bowl, pump, линии", + street: "Street-препятствия и креативность", + freestyle: "Трюки на плоскости и флоу", + safety: "Как падать, защита, профилактика травм", + diy: "Постройка рамп, рейлов, леджей и других препятствий", + }, + }, + filmer: { + service: { + miniclips: "Мини-клипы", + longparts: "Длинные видеопарты", + koth: "В стиле King of the Road", + documentaries: "Документальные фильмы", + contests: "Съёмка контестов", + raw: "Исходный материал", + followlines: "Follow / съёмка линий", + lines: "Съёмка линий и B-roll", + }, + serviceDesc: { + miniclips: "Клипы 15-60 сек для соцсетей", + longparts: "Полные видеопарты 3-10 мин с музыкой", + koth: "Скейт-видео в стиле приключений и испытаний", + documentaries: "Контент о скейт-культуре и историях", + contests: "Профессиональное освещение контестов и соревнований", + raw: "Необработанные съёмки с разных углов", + followlines: "Съёмка fisheye follow-cam для линий", + lines: "Линии с длинным фокусом и кинематографичный B-roll", + }, + skill: { + vx1000: "VX1000", + hvx: "HVX / HPX", + cinema: "Кинокамера", + dslr: "DSLR / беззеркальная", + actioncam: "GoPro / экшн-камера", + phone: "Съёмка на телефон", + drone: "Дрон / аэросъёмка", + gimbal: "Gimbal / стабилизатор", + fisheye: "Fisheye-объектив", + longlens: "Длинный фокус", + "4k": "4K / высокая частота кадров", + editing: "Видеомонтаж", + color: "Цветокоррекция", + }, + skillDesc: { + vx1000: "Классическая эстетика VX1000 в скейтбординге", + hvx: "Вид Panasonic HVX/HPX SD/HD", + cinema: "Кинокамера (FX3, C-серия, RED, BMPCC)", + dslr: "Качественная DSLR или беззеркальная камера", + actioncam: "GoPro / POV экшн-камеры и крепления", + phone: "Мобильная съёмка на современные смартфоны", + drone: "Аэро- и дрон-съёмка", + gimbal: "Стабилизированное движение gimbal", + fisheye: "Широкоугольные кадры fisheye", + longlens: "Длинный фокус для детальных кадров", + "4k": "Разрешение 4K и slow-mo с высокой частотой кадров", + editing: "Профессиональный видеомонтаж и постпродакшн", + color: "Цветокоррекция и грейдинг", + }, + }, + editor: { + service: { + parts: "Видеопарты", + montages: "Монтажи", + reels: "Reels / короткие клипы", + documentaries: "Документальные фильмы", + contest: "Монтаж контестов", + brand: "Видео для брендов / промо", + motion: "Motion-графика", + colorgrade: "Только цветокоррекция", + }, + serviceDesc: { + parts: "Полные скейт-видеопарты с саундтреком", + montages: "Монтаж-компиляции из исходного материала", + reels: "Клипы и reels для соцсетей 15–60 сек", + documentaries: "Фильмы о скейт-культуре с историями", + contest: "Монтаж-итоги для контестов и Events", + brand: "Промо-контент для брендов и Shop", + motion: "Титры, переходы, эффекты и графика", + colorgrade: "Цветокоррекция и грейдинг на основе LUT", + }, + skill: { + premiere: "Adobe Premiere", + resolve: "DaVinci Resolve", + finalcut: "Final Cut Pro", + aftereffects: "After Effects", + luts: "Кастомные LUT", + vhs: "VHS / ретро-эстетика", + "4k": "4K и RAW-воркфлоу", + sound: "Sound Design / микс", + }, + skillDesc: { + premiere: "Монтаж в Adobe Premiere Pro", + resolve: "Монтаж и грейдинг в DaVinci Resolve", + finalcut: "Монтаж в Final Cut Pro", + aftereffects: "Motion-графика и композитинг", + luts: "Разработка кастомных цветовых образов", + vhs: "VHS-глитч, super-8, ретро-плёнка", + "4k": "Воркфлоу с камерами RAW/LOG высокого разрешения", + sound: "Синхронизация музыки, SFX, мастеринг звука", + }, + }, + photo: { + service: { + action: "Экшн / трюковые кадры", + sequence: "Серийные кадры", + portraits: "Портреты", + editorial: "Editorial / журнал", + product: "Фото товаров / Shop", + events: "Освещение Events", + lifestyle: "Lifestyle / документальное", + prints: "Принты и зины", + }, + serviceDesc: { + action: "Кадры пикового экшна трюков и линий", + sequence: "Мультикадровые серии трюков", + portraits: "Портреты райдеров и командные кадры", + editorial: "Готовые для журнала editorial-развороты", + product: "Фотосъёмка Deck, Gear и товаров Shop", + events: "Освещение контестов, Jam и премьер", + lifestyle: "Закулисье и документалистика о культуре", + prints: "Печатные принты, зины и фотокниги", + }, + camera: { + dslr: "DSLR", + mirrorless: "Беззеркальная", + medium: "Средний формат", + film35: "Плёнка 35 мм", + filmmedium: "Плёнка среднего формата", + point: "Компактная мыльница", + phone: "Телефон", + }, + lens: { + fisheye: "Fisheye", + wide: "Широкоугольный", + standard: "Стандартный / фикс", + telephoto: "Телефото / длинный фокус", + macro: "Макро", + zoom: "Зум", + }, + lighting: { + strobes: "Студийные моноблоки", + speedlights: "Вспышки", + profoto: "Profoto", + elinchrom: "Elinchrom", + godox: "Godox", + triggers: "Радиосинхронизаторы", + continuous: "Постоянный свет / LED", + reflectors: "Отражатели / рассеиватели", + naturallight: "Только естественный свет", + }, + support: { + tripod: "Штатив", + monopod: "Монопод", + lightstands: "Стойки для света", + gimbal: "Gimbal", + bag: "Мобильная установка / сумка", + laptop: "Съёмка с tethering на месте", + }, + style: { + flashfisheye: "Вспышка + fisheye", + natural: "Естественный свет", + bw: "Чёрно-белое", + film: "Плёночная эстетика", + longlens: "Длинный фокус", + studio: "Студия / со светом", + street: "Street / документальное", + }, + }, + builder: { + service: { + diy: "DIY Spots", + concrete: "Бетонные парки", + wood: "Деревянные рампы", + bowls: "Bowl и бассейны", + transitions: "Переходы и quarter", + rails: "Рейлы и леджи", + boxes: "Manny-пады и боксы", + minis: "Мини-рампы", + pumptrack: "Pump track", + foam: "Поролоновые ямы / индор", + repairs: "Ремонт и восстановление покрытия", + design: "Проектирование и консалтинг", + }, + serviceDesc: { + diy: "Общественные DIY Spots и нелегальные постройки", + concrete: "Заливные бетонные скейтпарки и фигуры", + wood: "Деревянные рампы, лонч-боксы и препятствия", + bowls: "Bowl, бассейны и глубокие переходы", + transitions: "Quarterpipe, банки и переходы", + rails: "Стальные рейлы, леджи и грайнд-фигуры", + boxes: "Manny-пады, фанбоксы и street-фигуры", + minis: "Мини-рампы и сборки для двора", + pumptrack: "Pump track и линии флоу", + foam: "Поролоновые ямы, resi и индор-тренажёры", + repairs: "Починка, латание и восстановление существующих Spots", + design: "Планы, чертежи и консалтинг по постройке", + }, + skill: { + concretework: "Бетон / торкрет", + welding: "Сварка / металлоконструкции", + carpentry: "Столярка / дерево", + formwork: "Опалубка и арматура", + masonry: "Кладка / блоки", + coping: "Копинг (бассейн / сталь)", + surfacing: "Skatelite / покрытие", + earthworks: "Земляные работы / экскавация", + }, + scale: { + backyard: "Двор / мини", + diycommunity: "Общественный DIY", + publicpark: "Полноценный общественный парк", + indoor: "Крытое сооружение", + event: "Трасса для Event / контеста", + }, + }, + artist: { + service: { + boardart: "Графика для Deck", + logos: "Логотипы и брендинг", + posters: "Постеры и флаеры", + merch: "Мерч и одежда", + zines: "Зины и печать", + illustration: "Иллюстрация", + stickers: "Стикеры и наклейки", + webdesign: "Веб / digital", + typography: "Типографика / леттеринг", + animation: "Анимация / motion", + }, + serviceDesc: { + boardart: "Графика для Deck и арт на Griptape", + logos: "Айдентика бренда, логотипы и словесные знаки", + posters: "Постеры для Events, флаеры и афиши концертов", + merch: "Футболки, худи и графика для одежды", + zines: "Зины, editorial и вёрстка печати", + illustration: "Кастомная иллюстрация и персонажи", + stickers: "Наборы стикеров, наклейки и слэпы", + webdesign: "Сайты, digital и UI", + typography: "Ручной леттеринг и кастомный шрифт", + animation: "Motion-графика и анимация", + }, + medium: { + digital: "Digital / вектор", + handdrawn: "От руки", + screenprint: "Шелкография", + paint: "Краска / акрил", + collage: "Коллаж / смешанное", + photo: "Фото / Photoshop", + "3d": "3D / рендер", + }, + tool: { + illustrator: "Adobe Illustrator", + photoshop: "Adobe Photoshop", + procreate: "Procreate", + affinity: "Affinity", + figma: "Figma", + blender: "Blender", + aftereffects: "After Effects", + clipstudio: "Clip Studio", + }, + }, + graffiti: { + style: { + throwups: "Throw-ups", + pieces: "Pieces / burners", + murals: "Муралы", + characters: "Персонажи", + lettering: "Леттеринг / wildstyle", + stencil: "Трафарет", + handstyles: "Handstyles / теги", + "3dstyle": "3D-стиль", + abstract: "Абстракция", + }, + styleDesc: { + throwups: "Быстрые двухцветные заливки", + pieces: "Полноцветные pieces и burners", + murals: "Масштабные муралы и постановки", + characters: "Работа с персонажами и фигурами", + lettering: "Wildstyle и структура букв", + stencil: "Трафарет и стрит-арт", + handstyles: "Теги и handstyles", + "3dstyle": "3D и анаморфный леттеринг", + abstract: "Абстракция и фристайл", + }, + medium: { + spray: "Баллончики", + rollers: "Валики / эмульсия", + markers: "Маркеры / чернила", + brush: "Кисть / краска", + digital: "Digital / Procreate", + }, + context: { + legalwalls: "Легальные стены", + commissions: "Заказы", + liveart: "Live-рисование", + skateparks: "Муралы в скейтпарках", + interiors: "Интерьеры / Shop", + workshops: "Воркшопы", + }, + }, + tattoo: { + style: { + traditional: "Traditional / олдскул", + neotraditional: "Неотрадишнл", + fineline: "Тонкая линия", + blackwork: "Blackwork", + realism: "Реализм", + lettering: "Леттеринг / скрипт", + illustrative: "Иллюстративный", + skateflash: "Скейт-флэш", + ignorant: "Ignorant / хендпоук-стиль", + japanese: "Японский / ирэдзуми", + }, + styleDesc: { + traditional: "Жирные линии, классическая американа", + neotraditional: "Традишнл с современной детализацией", + fineline: "Деликатная работа одной иглой", + blackwork: "Сплошной чёрный и узор", + realism: "Фотореализм и портреты", + lettering: "Скрипт, леттеринг и цитаты", + illustrative: "Иллюстративный и графичный", + skateflash: "Флэш-дизайны скейт-культуры", + ignorant: "Ignorant / наивный стиль хендпоука", + japanese: "Японский традиционный / ирэдзуми", + }, + method: { + machine: "Машинка", + handpoke: "Хендпоук / stick & poke", + flash: "Есть флэш", + custom: "Кастомные дизайны", + coverup: "Перекрытия", + }, + }, + trainer: { + focus: { + strength: "Сила и ОФП", + mobility: "Мобильность и гибкость", + injuryprevention: "Профилактика травм", + rehab: "Реабилитация / физио", + recovery: "Восстановление и телесные практики", + balance: "Баланс и стабильность", + cardio: "Кардио / выносливость", + nutrition: "Рекомендации по питанию", + }, + focusDesc: { + strength: "Развитие силы и мощности для катания", + mobility: "Амплитуда движения и гибкость", + injuryprevention: "Прехаб и снижение риска травм", + rehab: "Физиотерапия и реабилитация после травм", + recovery: "Массаж, телесные практики и восстановление", + balance: "Проприоцепция, баланс и стабильность", + cardio: "ОФП и выносливость", + nutrition: "Питание и советы по нему", + }, + injury: { + ankles: "Голеностопы", + knees: "Колени", + wrists: "Запястья", + hips: "Бёдра", + back: "Спина / позвоночник", + shoulders: "Плечи", + heelbruise: "Ушибы пятки", + concussion: "Протокол при сотрясении", + }, + credential: { + physio: "Лицензированный физиотерапевт", + osteo: "Остеопат", + certtrainer: "Сертифицированный тренер", + sportstherapist: "Спортивный терапевт", + massage: "Массажист", + inperson: "Лично", + remote: "Удалённо / онлайн", + }, + }, + musician: { + genre: { + punk: "Punk", + hardcore: "Hardcore", + metal: "Metal", + rock: "Rock", + indie: "Indie / Alt", + hiphop: "Hip-Hop / Rap", + electronic: "Electronic", + lofi: "Lo-Fi / Beats", + reggae: "Reggae / Dub", + ska: "Ska", + jazz: "Jazz", + funk: "Funk / Soul", + flamenco: "Flamenco", + folk: "Folk / Acoustic", + experimental: "Experimental", + grunge: "Grunge", + }, + instrument: { + vocals: "Вокал", + guitar: "Гитара", + bass: "Бас", + drums: "Барабаны", + keys: "Клавиши / синтезатор", + dj: "DJ / вертушки", + producer: "Продюсер / биты", + sax: "Саксофон / духовые", + strings: "Струнные", + other: "Другое", + }, + act: { + solo: "Соло-исполнитель", + band: "Группа", + dj: "DJ", + producer: "Продюсер", + collective: "Коллектив", + }, + }, + judge: { + format: { + game_of_skate: "Game of S.K.A.T.E.", + best_trick: "Best Trick", + jam: "Формат Jam", + contest: "Контест / соревнование", + street_league: "В стиле Street League", + bowl: "Bowl / Vert", + mini_ramp: "Мини-рампа", + park: "Парк", + street: "Street", + freestyle: "Freestyle", + world_tour: "World Destruction Tour", + am_series: "Am Series / квалификации", + local_jam: "Локальный Jam / grassroots", + online: "Онлайн / IG-контест", + }, + specialty: { + head_judge: "Главный судья", + scoring: "Оценка / подсчёт", + mc: "MC / ведущий", + format_design: "Разработка формата", + rules: "Правила / судейство", + brackets: "Сетки / заезды", + livestream: "Судейство в трансляции", + am_scout: "Скаутинг Am", + }, + level: { + local: "Локальный", + regional: "Региональный", + national: "Национальный", + international: "Международный", + pro: "Pro Circuit", + }, + }, + organizer: { + event: { + street_jam: "Street Jam", + best_trick: "Best Trick", + game_of_skate: "Game of S.K.A.T.E.", + contest: "Контест / соревнование", + bowl: "Bowl / Vert", + mini_ramp: "Мини-рампа", + park: "Сессия в парке", + demo: "Демо профи", + clinic: "Клиника / воркшоп", + meetup: "Встреча / покатушки", + downhill: "Даунхилл / гонка", + slalom: "Слалом", + kids: "Дети / молодёжь", + charity: "Благотворительность / сбор средств", + tour_stop: "Этап Tour", + premiere: "Премьера видео", + market: "Маркет / арт-шоу", + }, + service: { + organizing: "Полная организация", + hosting: "Ведущий / MC", + permits: "Разрешения и администрация", + sponsorship: "Спонсорство / сделки с брендами", + promotion: "Продвижение и маркетинг", + livestream: "Трансляция / освещение", + sound: "Звук и музыка", + ramps: "Рампы и препятствия", + safety: "Безопасность и первая помощь", + vendors: "Еда и продавцы", + media: "Фото / видеосъёмка", + registration: "Регистрация и сетки", + }, + scale: { + grassroots: "Grassroots", + local: "Локальный", + regional: "Региональный", + national: "Национальный", + international: "Международный", + pro: "Pro Circuit", + }, + }, + barber: { + service: { + haircut: "Стрижка", + fade: "Fade", + beard: "Стрижка бороды", + lineup: "Line-up / контур", + colour: "Окрашивание и тонирование", + kids: "Детские стрижки", + }, + serviceDesc: { + haircut: "Классическая стрижка — машинкой и ножницами.", + fade: "Плавный fade — низкий, средний или высокий.", + beard: "Стрижка, моделирование и уход за бородой.", + lineup: "Чистые линии у роста волос и на шее.", + colour: "Окрашивание, осветление, тонирование.", + kids: "Аккуратные стрижки для младших скейтеров.", + }, + style: { + skin_fade: "Skin Fade", + taper: "Taper", + buzz: "Buzz Cut", + mohawk: "Ирокез", + mullet: "Маллет", + curly: "Кудри / афро", + long: "Длинные волосы / слои", + classic: "Классическая стрижка ножницами", + }, + setting: { + shop: "Салон / барбершоп", + mobile: "Выезд / на дом", + event: "Скейт-Events и контесты", + }, + }, + tour: { + skill: { + beginner: { + label: "Начальный", + description: "Новичок в катании или базовые трюки", + }, + intermediate: { + label: "Средний", + description: "Уверенно катается на большинстве рельефов", + }, + advanced: { + label: "Продвинутый", + description: "Опытный скейтер, жёсткие Spots", + }, + all: { + label: "Все уровни", + description: "Подходит всем", + }, + }, + }, + }, +}; export default ruBatch6; diff --git a/src/i18n/ru/batch7.ts b/src/i18n/ru/batch7.ts index d877327..f1f8462 100644 --- a/src/i18n/ru/batch7.ts +++ b/src/i18n/ru/batch7.ts @@ -1,4 +1,908 @@ -/** ru — batch 7. Filled by the translation pass; empty until then. */ -const ruBatch7 = {}; +/** ru — batch 7. Translated from the English source. */ +const ruBatch7 = { + events: { + title: 'Скейт-события', + createEvent: 'Создать событие', + editEvent: 'Редактировать событие', + eventDetails: 'Детали события', + eventName: 'Название события', + eventType: 'Тип события', + date: 'Дата', + time: 'Время', + startDate: 'Дата начала', + endDate: 'Дата окончания', + venue: 'Место', + organizer: 'Организатор', + attendees: 'Участники', + going: 'Иду', + interested: 'Интересно', + rsvp: 'RSVP', + ticketPrice: 'Цена билета', + freeEntry: 'Вход свободный', + register: 'Регистрация', + moreInfo: 'Подробнее', + upcomingEvents: 'Предстоящие', + pastEvents: 'Прошедшие', + noEvents: 'События не найдены', + findEvents: 'Находите конкурсы, демо, сессии и многое другое', + searchPlaceholder: 'Поиск событий...', + loginToCreate: 'Войдите, чтобы создавать события', + noEventsMatch: 'Нет предстоящих событий, подходящих под ваши фильтры.', + noUpcoming: 'Предстоящих событий не найдено.', + noPast: 'Прошедших событий не найдено.', + types: { + contest: 'Конкурс', + session: 'Сессия', + meetup: 'Встреча', + premiere: 'Премьера видео', + workshop: 'Воркшоп', + demo: 'Демо', + jam: 'Джем', + }, + }, + wallet: { + title: 'Кошелёк', + balance: 'Баланс', + send: 'Отправить', + receive: 'Получить', + transactions: 'Транзакции', + history: 'История', + noTransactions: 'Транзакций пока нет', + sendSats: 'Отправить sats', + receiveSats: 'Получить sats', + amount: 'Сумма', + recipient: 'Получатель', + lightning: 'Lightning', + onChain: 'On-chain', + invoice: 'Инвойс', + address: 'Адрес', + scanQR: 'Сканировать QR', + paste: 'Вставить', + payInvoice: 'Оплатить инвойс', + createInvoice: 'Создать инвойс', + copied: 'Скопировано в буфер обмена!', + insufficientFunds: 'Недостаточно средств', + paymentSent: 'Платёж отправлен!', + paymentReceived: 'Платёж получен!', + cashu: { + title: 'Кошелёк Cashu', + tokens: 'Токены', + mint: 'Mint', + mints: 'Mints', + manageMints: 'Управление Mints', + addMint: 'Добавить Mint', + removeMint: 'Удалить Mint', + defaultMint: 'Mint по умолчанию', + backup: 'Резервная копия', + restore: 'Восстановить', + recoveryPhrase: 'Фраза восстановления', + viewRecoveryPhrase: 'Показать фразу восстановления', + seedWarning: 'Это как ваш Nostr nsec — держите в секрете и делайте резервные копии!', + }, + }, + spots: { + addSpot: 'Добавить Spot', + editSpot: 'Редактировать Spot', + spotDetails: 'Детали Spot', + spotName: 'Название Spot', + spotType: 'Тип Spot', + description: 'Описание', + location: 'Местоположение', + address: 'Адрес', + photos: 'Фото', + addPhotos: 'Добавить фото', + obstacles: 'Препятствия', + features: 'Особенности', + bustLevel: 'Уровень риска', + bestTime: 'Лучшее время', + tips: 'Советы', + reviews: 'Отзывы', + addReview: 'Добавить отзыв', + reportSpot: 'Пожаловаться на Spot', + directions: 'Маршрут', + shareSpot: 'Поделиться Spot', + createdBy: 'Создано', + lastUpdated: 'Последнее обновление', + types: { + park: 'Скейтпарк', + street: 'Уличный Spot', + diy: 'DIY Spot', + plaza: 'Плаза', + indoor: 'Крытый', + bowl: 'Чаша', + vert: 'Верт', + miniramp: 'Мини-рамп', + }, + bustLevels: { + chill: 'Спокойно', + moderate: 'Средне', + sketchy: 'Рискованно', + heavy: 'Жёстко', + }, + }, + settings: { + title: 'Настройки', + profile: 'Профиль', + editProfile: 'Редактировать профиль', + account: 'Аккаунт', + security: 'Безопасность', + relays: 'Relays', + appearance: 'Внешний вид', + language: 'Язык', + notifications: 'Уведомления', + privacy: 'Конфиденциальность', + about: 'О приложении', + help: 'Помощь', + feedback: 'Обратная связь', + version: 'Версия', + displayName: 'Отображаемое имя', + username: 'Имя пользователя', + bio: 'О себе', + website: 'Сайт', + lightningAddress: 'Lightning-адрес', + profilePicture: 'Фото профиля', + banner: 'Баннер', + saveProfile: 'Сохранить профиль', + backupKeys: 'Резервная копия ключей', + exportKeys: 'Экспорт ключей', + secretKey: 'Секретный ключ', + publicKey: 'Публичный ключ', + showSecretKey: 'Показать секретный ключ', + hideSecretKey: 'Скрыть секретный ключ', + copyKey: 'Скопировать ключ', + keysBackedUp: 'Вы подтвердили, что ваши ключи надёжно сохранены.', + keysNotBackedUp: 'Обязательно сохраните фразу восстановления или секретный ключ!', + selectLanguage: 'Выбрать язык', + english: 'Английский', + spanish: 'Испанский', + }, + createSpot: { + title: 'Добавить скейт-Spot', + subtitle: 'Поделитесь скейт-спотом с сообществом', + backToMap: 'Назад к карте', + namePlaceholder: 'напр., Hollywood High School', + descriptionPlaceholder: 'Опишите Spot, препятствия, лучшее время для катания, информацию о безопасности и т. д.', + addressPlaceholder: 'напр., 1521 N Highland Ave, Los Angeles, CA', + selectType: 'Выберите тип Spot', + selectBustLevel: 'Выберите уровень риска', + uploadPhotos: 'Загрузить', + dragDrop: 'Перетащите или нажмите для загрузки', + maxPhotos: 'Макс. 5 фото', + publishing: 'Публикация...', + success: 'Spot успешно опубликован!', + error: 'Не удалось опубликовать Spot', + locationRequired: 'Пожалуйста, выберите местоположение на карте', + useCurrentLocation: 'Использовать моё текущее местоположение', + pickOnMap: 'Выбрать местоположение на карте', + loginToAdd: 'Вам нужно войти, чтобы добавить скейт-Spot.', + locationLabel: 'Местоположение', + tapToPlace: 'Нажмите на карту, чтобы поставить метку, или перетащите её для точной настройки.', + manualCoords: 'Ввести координаты вручную', + moreDetails: 'Подробнее (необязательно)', + photoHint: 'для публикации нужно фото', + nameRequired: 'Пожалуйста, введите название для этого Spot.', + descriptionRequired: 'Пожалуйста, опишите этот Spot.', + addressRequired: 'Пожалуйста, добавьте адрес или название района.', + photoRequired: 'Пожалуйста, добавьте хотя бы одно фото.', + draftTitle: 'У вас есть несохранённый черновик', + draftBody: 'Продолжите с того места, где остановились, или удалите его.', + draftResume: 'Продолжить', + draftDiscard: 'Удалить черновик', + requiredFields: 'Расскажите нам об этом Spot. Все поля со звёздочкой * обязательны.', + coordinates: 'Координаты', + latitudePlaceholder: 'Широта (напр., 34.1012)', + longitudePlaceholder: 'Долгота (напр., -118.3389)', + gettingLocation: 'Получение местоположения...', + accessType: 'Тип доступа', + publicTitle: 'Общественный — открыт для всех', + publicDesc: 'Скейтпарки, общественные площади, уличные Spot', + privateTitle: 'Частная собственность — нужно разрешение', + privateDesc: 'Рампы во дворе, частная земля, закрытые Spot', + localsTitle: 'Сначала спросите местных', + localsDesc: 'Уважайте Spot, не выжигайте его', + contactInfo: 'Контактная информация', + contactPlaceholder: 'напр., номер телефона, Instagram, email...', + contactHintPrivate: 'Как люди должны связаться с вами для разрешения?', + contactHintLocals: 'Как люди должны обратиться, чтобы узнать про Spot?', + }, + marketplace: { + title: 'Маркетплейс', + subtitle: 'Покупайте, продавайте и обменивайте скейт-Gear', + addListing: 'Добавить объявление', + condition: 'Состояние', + conditions: { + new: 'Новое', + likeNew: 'Как новое', + good: 'Хорошее', + fair: 'Удовлетворительное', + poor: 'Плохое', + }, + categories: { + all: 'Все', + decks: 'Деки', + trucks: 'Траки', + wheels: 'Колёса', + bearings: 'Подшипники', + shoes: 'Обувь', + clothing: 'Одежда', + protection: 'Защита', + other: 'Другое', + }, + priceRange: 'Диапазон цен', + location: 'Местоположение', + seller: 'Продавец', + contact: 'Связаться с продавцом', + makeOffer: 'Предложить цену', + sold: 'Продано', + available: 'Доступно', + gear: 'Gear', + sellGear: 'Продать Gear', + wantToBuy: 'Хочу купить', + }, + auth: { + login: 'Войти', + logout: 'Выйти', + signUp: 'Регистрация', + signUpTitle: 'Впервые в Nostr?', + signUpDesc: 'Создайте новый аккаунт, чтобы начать. Это бесплатно и открыто.', + orLogIn: 'Или войдите', + loginWithExtension: 'Войти через расширение', + loginWithAmber: 'Войти через Amber (Android)', + loginWithKey: 'Секретный ключ (nsec) или фраза восстановления', + loginWithBunker: 'Войти через Nostr Connect', + bunkerUri: 'Строка подключения Bunker', + openAmber: 'Открыть Amber', + connectToBunker: 'Подключиться к Bunker', + noExtension: 'Расширение не обнаружено.', + extensionHelp: 'Попробуйте использовать кнопку «Регистрация» выше, чтобы создать новый аккаунт, или вкладки Amber, Ключ и Bunker, если у вас уже есть учётные данные.', + amberDesc: 'Amber — это безопасное приложение-подписант Nostr для устройств Android. Нажмите кнопку ниже, чтобы открыть Amber и авторизовать доступ.', + bunkerDesc: 'Получайте доступ к аккаунту с любого устройства через удалённый подписант (bunker). Ваши ключи остаются в безопасности на сервере и никогда не попадают на сайты.', + keyPlaceholder: 'nsec1... или ваша фраза восстановления из 12 слов', + keyHint: 'Вы можете вставить либо ваш nsec-ключ, либо фразу восстановления из 12 слов', + uploadKeyFile: 'Загрузить файл с ключом', + loggingIn: 'Вход...', + connecting: 'Подключение...', + verifying: 'Проверка...', + }, + createEvent: { + title: 'Создать событие', + subtitle: 'Организуйте скейт-событие для сообщества', + backToEvents: 'Назад к событиям', + namePlaceholder: 'напр., летняя скейт-сессия', + descriptionPlaceholder: 'Опишите событие, что ожидать, правила, призы и т. д.', + selectType: 'Выберите тип события', + venuePlaceholder: 'напр., Venice Beach Skatepark, CA', + selectDate: 'Выберите дату', + selectTime: 'Выберите время', + ticketPricePlaceholder: 'Оставьте пустым для бесплатных событий', + publishing: 'Публикация...', + success: 'Событие успешно опубликовано!', + error: 'Не удалось опубликовать событие', + loginToCreate: 'Вам нужно войти, чтобы создать событие.', + requiredFields: 'Расскажите нам об этом событии. Все поля со звёздочкой * обязательны.', + startDateTime: 'Дата и время начала', + endDateTime: 'Дата и время окончания (необязательно)', + coordinatesOptional: 'Координаты (необязательно)', + coverImage: 'Обложка', + uploadCover: 'Загрузить обложку', + nip05Recommended: 'Рекомендуется верификация NIP-05', + nip05Desc: 'Добавьте идентификатор NIP-05 в свой профиль, чтобы подтвердить личность и укрепить доверие участников.', + addNip05: 'Добавить NIP-05 в настройках', + }, + labPage: { + title: 'The Lab', + subtitle: 'Учите трюки. Ловите моменты. Общайтесь с другими скейтерами', + coachesTab: 'Коучинг', + filmersTab: 'Съёмка', + offerCoaching: 'ПРЕДЛОЖИТЬ КОУЧИНГ', + offerFilming: 'ПРЕДЛОЖИТЬ СЪЁМКУ', + loginToOffer: 'Войдите, чтобы предлагать услуги', + whatToLearn: 'ЧЕМУ ВЫ ХОТИТЕ НАУЧИТЬСЯ?', + whatContent: 'КАКОЙ ТИП КОНТЕНТА?', + selectSkillsDesc: 'Выберите навыки, и мы подберём вам коучей', + selectFilmingDesc: 'Выберите услуги съёмки, которые вы ищете', + searchPlaceholder: 'Поиск по имени, местоположению или навыкам...', + noServicesYet: 'УСЛУГ ПОКА НЕТ', + beFirstToOffer: 'Станьте первым, кто предложит сообществу услуги коучинга или съёмки!', + skills: 'Навыки', + rate: 'Ставка', + perHour: '/час', + contact: 'Связаться', + viewProfile: 'Смотреть профиль', + noProfilesYet: 'Профилей пока нет', + beFirstCoach: 'Станьте первым зарегистрированным коучем!', + beFirstFilmer: 'Станьте первым зарегистрированным филмером!', + yearsExperience: 'лет опыта', + }, + skills: { + kickflip: 'Kickflip', + heelflip: 'Heelflip', + ollie: 'Ollie', + treflip: '360 Flip', + shuvit: 'Shuvit', + hardflip: 'Hardflip', + varial: 'Varial', + nollie: 'Nollie', + fakie: 'Fakie', + switch: 'Switch', + grind: 'Grind', + slide: 'Slide', + manual: 'Manual', + transition: 'Transition', + bowl: 'Bowl', + vert: 'Vert', + street: 'Street', + flatground: 'Flatground', + }, + lab: { + title: 'The Lab', + subtitle: 'Прокачайте своё катание', + coaches: 'Коучи', + filmers: 'Филмеры', + findCoach: 'Найти коуча', + becomeCoach: 'Стать коучем', + findFilmer: 'Найти филмера', + becomeFilmer: 'Стать филмером', + hourlyRate: 'Почасовая ставка', + experience: 'Опыт', + specialties: 'Специализации', + availability: 'Доступность', + bookSession: 'Забронировать сессию', + contactCoach: 'Связаться с коучем', + noCoaches: 'Коучи в вашем районе не найдены', + noFilmers: 'Филмеры в вашем районе не найдены', + }, + shops: { + title: 'Скейт-Shops', + addShop: 'Добавить Shop', + editShop: 'Редактировать Shop', + shopDetails: 'Детали Shop', + shopName: 'Название Shop', + hours: 'Часы работы', + phone: 'Телефон', + website: 'Сайт', + services: 'Услуги', + brands: 'Бренды', + supportLocal: 'Поддержите местных', + nip05: 'Shop NIP-05', + nip05Hint: 'Необязательный идентификатор, которым вы управляете для этого Shop (напр., shop@yourdomain.com), проверяется по вашему ключу. Добавьте до 5.', + }, + becomeFilmer: { + title: 'Стать филмером', + subtitle: 'Снимайте лучшие клипы для сообщества', + bioPlaceholder: 'Расскажите о своём опыте съёмки и оборудовании...', + specialtiesPlaceholder: 'напр., фишай, длинный объектив, дрон, монтаж', + selectSpecialties: 'Выберите свои специализации', + hourlyRate: 'Почасовая ставка (sats)', + ratePlaceholder: 'напр., 5000', + locationPlaceholder: 'Ваш город или район', + portfolioUrl: 'Ссылка на портфолио', + portfolioPlaceholder: 'Ссылка на ваши работы (YouTube, Instagram и т. д.)', + publishing: 'Публикация профиля...', + success: 'Профиль филмера создан!', + error: 'Не удалось создать профиль', + }, + food: { + title: 'Места с едой', + subtitle: 'Подкрепитесь до или после сессии', + addFood: 'Добавить место с едой', + categories: { + all: 'Все', + burgers: 'Бургеры', + pizza: 'Пицца', + tacos: 'Тако', + coffee: 'Кофе', + drinks: 'Напитки', + snacks: 'Закуски', + }, + skaterFriendly: 'Дружелюбно к скейтерам', + nearSpots: 'Рядом со Spot', + }, + profile: { + posts: 'Посты', + spots: 'Spot', + events: 'События', + following: 'Подписки', + followers: 'Подписчики', + editProfile: 'Редактировать профиль', + follow: 'Подписаться', + unfollow: 'Отписаться', + noPostsYet: 'Постов пока нет', + noBio: 'Описания пока нет', + zapProfile: 'Запнуть этого скейтера', + }, + becomeCoach: { + title: 'Стать коучем', + subtitle: 'Поделитесь навыками и помогите другим скейтерам прогрессировать', + bioPlaceholder: 'Расскажите о своём скейт-опыте и стиле преподавания...', + skillsPlaceholder: 'напр., kickflip, heelflip, грайнды, чаши', + selectSkills: 'Выберите навыки, которым можете научить', + hourlyRate: 'Почасовая ставка (sats)', + ratePlaceholder: 'напр., 5000', + locationPlaceholder: 'Ваш город или район', + publishing: 'Публикация профиля...', + success: 'Профиль коуча создан!', + error: 'Не удалось создать профиль', + }, + weather: { + title: 'Погода', + current: 'Текущие условия', + forecast: 'Прогноз', + humidity: 'Влажность', + wind: 'Ветер', + feelsLike: 'Ощущается как', + goodForSkating: 'Хорошо для катания!', + notIdeal: 'Не идеальные условия', + allWeather: 'Любая погода', + goodWeather: 'Хорошая погода', + perfectWeather: 'Идеальная погода', + }, + errors: { + somethingWentWrong: 'Что-то пошло не так', + tryAgainLater: 'Попробуйте позже', + notFound: 'Не найдено', + pageNotFound: 'Страница не найдена', + unauthorized: 'Доступ запрещён', + loginRequired: 'Пожалуйста, войдите, чтобы продолжить', + networkError: 'Ошибка сети', + checkConnection: 'Проверьте подключение к интернету', + invalidInput: 'Недопустимый ввод', + requiredField: 'Это поле обязательно', + }, + time: { + today: 'Сегодня', + yesterday: 'Вчера', + tomorrow: 'Завтра', + thisWeek: 'На этой неделе', + nextWeek: 'На следующей неделе', + thisMonth: 'В этом месяце', + justNow: 'Только что', + minutesAgo: '{{count}} мин. назад', + hoursAgo: '{{count}} ч. назад', + daysAgo: '{{count}} дн. назад', + }, + spotDetail: { + postedBy: 'Опубликовал', + getDirections: 'Проложить маршрут', + reviews: 'Отзывы', + noReviews: 'Отзывов пока нет', + beFirstReview: 'Станьте первым, кто оставит отзыв об этом Spot!', + writeReview: 'Написать отзыв', + submitReview: 'Отправить отзыв', + rating: 'Оценка', + reviewPlaceholder: 'Поделитесь своим опытом в этом Spot...', + relatedSpots: 'Рядом', + }, + eventDetail: { + organizedBy: 'Организатор', + eventInfo: 'Информация о событии', + location: 'Местоположение', + dateTime: 'Дата и время', + price: 'Цена', + attendeeCount: '{{count}} идут', + interested: 'Интересно', + going: 'Иду', + notGoing: 'Не иду', + share: 'Поделиться событием', + }, + venueAccess: { + title: 'Пропуска доступа', + desc: 'Выдайте подписанный пропуск райдеру, чтобы он мог подтвердить доступ у входа — он показывает карту, и любой может отсканировать QR, чтобы проверить её.', + active: '{{count}} активных', + revoked: '{{count}} отозванных', + issue: 'Выдать пропуск', + verifyHint: 'Проверяется сканированием — для проверки не нужны приложение или аккаунт.', + publicTitle: 'Пропуска доступа', + publicDesc: 'Это заведение выдаёт пропуска доступа. Отсканируйте карту райдера у входа, чтобы проверить её.', + badge: 'Пропуска', + sellerHint: 'Заведение этого продавца выдаёт пропуска доступа', + }, + zaps: { + zapButton: 'Zap', + sendZap: 'Отправить Zap', + zapAmount: 'Сумма Zap', + customAmount: 'Своя сумма', + addMessage: 'Добавить сообщение (необязательно)', + sending: 'Отправка...', + sent: 'Zap отправлен!', + failed: 'Zap не удался', + received: 'Вы получили Zap!', + }, + rewards: { + title: 'Награды', + yourPoints: 'Ваши баллы', + earnPoints: 'Заработать баллы', + redeemPoints: 'Потратить баллы', + leaderboard: 'Таблица лидеров', + achievements: 'Достижения', + dailyTasks: 'Ежедневные задания', + weeklyTasks: 'Еженедельные задания', + }, + errorsUi: { + slammedTitle: 'Слэм', + slammedBody: 'Что-то споткнулось на этом экране. Ваш аккаунт и данные в безопасности — давайте снова в движение.', + tryAgain: 'Попробовать снова', + reloadApp: 'Перезагрузить приложение', + pageSlammedTitle: 'Эта страница слэмнулась', + pageSlammedBody: 'Что-то на этом экране споткнулось. Ваш аккаунт и данные в безопасности. Обычно помогает быстрая перезагрузка.', + reload: 'Перезагрузить', + goBack: 'Назад', + }, + backup: { + title: 'Сохраните свой вход', + subtitle: 'Займёт 10 секунд — сделайте один раз', + message: 'Ваш код восстановления — единственный путь обратно в аккаунт. Сохраните его, и вы сможете войти с любого устройства.', + warning: 'Потеряете его — сброса нет: ни email, ни восстановления пароля.', + backupNow: 'Сохранить сейчас', + confirmed: 'Я сохранил', + remindLater: 'Позже', + }, + bootUi: { + ariaLoading: 'Загрузка SkateSpots', + ariaReady: 'SkateSpots готов', + ready: 'Готово', + statusWaking: 'Пробуждаем сеть', + statusTuning: 'Настраиваем Relays', + statusPulling: 'Подтягиваем Spot', + statusDropping: 'Залетаем', + }, + footer: { + vibedWith: 'Сделано с', + poweredBy: 'Работает на', + openSource: 'Открытый исходный код', + contribute: 'Внести вклад', + decentralized: 'Децентрализовано', + communityOwned: 'Принадлежит сообществу', + }, + role: { + owner: 'Владелец', + admin: 'Админ', + organiser: 'Организатор', + verifiedOwner: 'Подтверждённый владелец', + }, + nfc: { + write: 'Записать на NFC-метку', + written: 'Метка записана', + writtenDesc: 'Приложите метку к телефону, чтобы открыть страницу проверки.', + failed: 'Не удалось записать метку', + }, + collectionUi: { + namePlaceholder: 'Поездка в Барселону 2024', + descriptionPlaceholder: 'Мои любимые Spot из поездки в Барселону...', + }, + toastsUi: { + followingSuccess: 'Вы подписались', + followingSuccessDesc: 'Этот пользователь теперь в вашей сети', + followFailed: 'Не удалось подписаться', + unfollowSuccess: 'Вы отписались', + unfollowSuccessDesc: 'Удалён из вашей сети', + unfollowFailed: 'Не удалось отписаться', + reportThanks: 'Спасибо — отправлено на проверку', + reportFailed: 'Не удалось отправить жалобу', + savedOffline: 'Сохранено офлайн', + savedOfflineDesc: 'Мы опубликуем это автоматически, когда вы снова будете в сети.', + cacheCleaned: 'Кэш очищен', + cacheCleanedDesc: 'Удалено {{count}} старых Spot из кэша', + 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: 'Проверьте строку подключения и попробуйте снова.', + nwcExists: 'Подключение уже существует', + nwcExistsDesc: 'Этот кошелёк уже подключён.', + nwcConnected: 'Кошелёк подключён', + nwcConnectedDesc: 'Успешно подключено к {{alias}}.', + nwcFailed: 'Не удалось подключиться', + nwcFailedDesc: 'Не удалось подключиться к кошельку: {{error}}', + nwcUnknownError: 'Произошла неизвестная ошибка', + nwcDisconnected: 'Кошелёк отключён', + nwcDisconnectedDesc: 'Подключение кошелька удалено.', + deleteApproveAmber: 'Подтвердите в Amber', + deleteApproveAmberDesc: 'Amber откроется — нажмите «Подтвердить», чтобы подтвердить удаление.', + deleteCancelled: 'Отменено', + deleteCancelledDesc: 'Вы отклонили запрос в Amber.', + deleteCouldntSign: 'Не удалось подписать', + deletePublishing: 'Шаг 2/2: публикация…', + deletePublishingDesc: 'Отправляем удаление в Relays.', + 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 успешно погашен!', + 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: 'Редактируйте свой скейт-Shop.', + createTourDesc: 'Организуйте скейт-туры - туры по местным скрытым жемчужинам, национальные роуд-трипы, международные приключения или разрушительные соревнования в стиле KOTR.', + deckDesignerTitle: 'Дизайнер дек — SkateSpots DIY', + deckDesignerDesc: 'Нарисуйте контур скейтборда или лонгборда, затем экспортируйте печатный шаблон 1:1, SVG или DXF — concave, кики, колёсная база и отверстия под траки включены.', + 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 и члены сообщества, которые их поддерживают.', + adminReviewTitle: 'Очередь модерации — SkateSpots', + gearSwapTitle: 'Обмен Gear - SkateSpots', + gearSwapDesc: 'Покупайте и продавайте б/у скейт-Gear с другими скейтерами. Деки, траки, колёса, обувь и многое другое.', + donateTitle: 'Пожертвовать — SkateSpots', + donateDesc: 'Поддержите SkateSpots — Lightning, приватный on-chain (silent payments) или финансирование разработки на Angor.', + verifyCardTitle: 'Проверить — SkateSpots', + verifyCardDesc: 'Проверьте карту SkateSpots или пропуск доступа.', + mapTitle: 'Карта скейт-Spot - SkateSpots', + mapDesc: 'Исследуйте скейтборд-локации по всему миру на нашей интерактивной карте.', + diyTitle: 'DIY — Сделай сам | SkateSpots', + diyDesc: 'Руководства, открытые инструменты и планы, чтобы сделать свои скейтборды, рампы и бетонные Spot — а также люди и места для этого.', + appShopTitle: 'Магазин приложения — SkateSpots', + becomeSkaterTitle: 'Присоединяйтесь к каталогу скейтеров - SkateSpots', + becomeSkaterDesc: 'Создайте профиль скейтера, чтобы сообщество могло вас найти.', + marketplaceTitle: 'Маркетплейс - SkateSpots', + marketplaceDesc: 'Покупайте и продавайте скейт-Gear на децентрализованном 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: 'Добавить скейт-Shop - SkateSpots', + createShopDesc: 'Добавьте свой скейт-Shop в сообщество.', + deckCostTitle: 'Калькулятор стоимости деки — SkateSpots DIY', + deckCostDesc: 'Рассчитайте, сколько стоит производство деки — труд, оборудование, материалы, время процесса, упаковка и маржа — и справедливую цену продажи.', + pyramidTitle: 'Рейтинг Pyramid - SkateSpots', + pyramidDesc: 'Главные контрибьюторы и лидеры сообщества.', + foodTitle: 'Еда рядом со Spot - SkateSpots', + foodDesc: 'Найдите рестораны, кафе и варианты еды рядом со скейт-Spot.', + createListingTitle: 'Продать Gear - SkateSpots', + createListingDesc: 'Разместите скейт-Gear на продажу или найдите Gear, который хотите купить.', + becomeFilmerTitle: 'Стать филмером - SkateSpots', + becomeFilmerDesc: 'Создайте профиль скейт-филмера.', + skatersTitle: 'Скейтеры - SkateSpots', + skatersDesc: 'Открывайте скейтеров в сообществе SkateSpots. Просматривайте по стилю, стойке, уровню и местоположению.', + communityStatsTitle: 'Статистика сообщества — SkateSpots', + communityStatsDesc: 'Живые метрики сообщества SkateSpots — Spot, события, коучи, филмеры, монтажёры, туры и рост со временем. Данные напрямую из Nostr.', + labTitle: 'The Lab - SkateSpots', + labDesc: 'Найдите скейт-коучей, филмеров, фотографов и видеомонтажёров.', + stashTitle: 'Мой Stash - SkateSpots', + stashDesc: 'Управляйте своим приватным инвентарём Gear. Отслеживайте, чем владеете, что хотите продать или обменять.', + bountyLeaderboardTitle: 'Картируй и зарабатывай - SkateSpots', + bountyLeaderboardDesc: 'Отмечайте скейт-Spot и Shop на карте, зарабатывайте Zap от сообщества. Смотрите лучших контрибьюторов.', + spotCollectionsTitle: 'Мои коллекции Spot - SkateSpots', + spotCollectionsDesc: 'Организуйте любимые скейт-Spot в персональные коллекции', + mintsTitle: 'Mints Cashu — SkateSpots', + mintsDesc: 'Просматривайте Mints 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: 'Тип Spot выбран', + failedToLoadComments: 'Не удалось загрузить комментарии', + commentsTitle: 'Комментарии', + noCommentsYet: 'Комментариев пока нет', + beFirstComment: 'Станьте первым, кто поделится мыслями!', + removeMember: 'Удалить участника', + whoIsThisFor: 'Для кого этот профиль?', + individual: 'Частное лицо', + individualDesc: 'Один человек', + collective: 'Коллектив', + collectiveDesc: 'Crew, студия или компания', + membersLabel: 'Участники', + dismissReport: 'Отклонить жалобу', + reportedBy: 'пожаловался', + completingLoginAmber: 'Завершаем вход через Amber...', + entityMembersHint: 'Добавьте Nostr-аккаунты своей Crew. Каждый участник подтверждает свой Spot своим ключом — до этого они отображаются как «ожидающие».', + entityVerifiedHint: 'Участие проверяется для каждого участника — никто не может быть добавлен в вашу Crew без подтверждения со своего аккаунта.', + entityInvalidPubkey: 'Введите корректный npub, nprofile или 64-символьный hex pubkey.', + 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 — без костюмов, без рекламы, только скейтеры, прокладывающие свой путь. Здесь вы владеете своими трюками, своими данными и даже зарабатываете Bitcoin за свой след. Общайтесь со скейтерами из своего района или со всего мира. Никаких правил, кроме катания, никаких следов, кроме ваших.', + homeQ1: 'Спланируй мне 3 дня в Барселоне', + homeQ2: 'Найди Spot для новичков', + homeQ3: 'Есть предстоящие события?', + homeQ4: 'Статистика сообщества', + homeQ5: 'Найди коучей рядом', + homeQ6: 'Gear на продажу?', + homeQ7: 'Что такое Nostr?', + homeQ8: 'Это бесплатно?', + homeLearnMore: 'Узнать больше', + onboardingTitle: 'Начало работы 🚀', + onboardingMessage: 'Давайте помогу разобраться в основах! Nostr — это ваша личность, Bitcoin Lightning позволяет зарабатывать sats за вклад, а Zap — это мгновенные чаевые. Спросите меня о чём угодно про начало работы!', + onboardingQ1: 'Как войти?', + onboardingQ2: 'Что такое Nostr?', + onboardingQ3: 'Как работает Nostr?', + onboardingQ4: 'Что такое Cashu?', + onboardingQ5: 'Как пользоваться кошельком Cashu?', + onboardingQ6: 'Что такое Mints?', + onboardingQ7: 'Что такое Zap?', + onboardingQ8: 'Что такое NWC?', + onboardingStart: 'Начать исследование', + onboardingLogin: 'Войдите, чтобы начать', + labTitle: 'Добро пожаловать в The Lab! 🎓', + labMessage: 'Здесь происходит магия! Найдите коучей, которые научат вас чему угодно — от kickflip до darkslide, или свяжитесь с филмерами, чтобы запечатлеть свои лучшие сессии. Фильтруйте по навыкам, проверяйте опыт и бронируйте сессию. Помните — все с чего-то начинали!', + labQ1: 'Найти коучей', + labQ2: 'Найти филмеров', + labQ3: 'Найти фотографов', + labQ4: 'Найти видеомонтажёров', + labQ5: 'Найти строителя рамп', + labQ6: 'Что такое The Lab?', + labQ7: 'Что такое строитель?', + labQ8: 'Как предложить коучинг?', + labLogin: 'Войдите, чтобы предлагать услуги', + crewsTitle: 'Crew 🤘', + crewsMessage: 'Crew — это ваша скейт-семья, привязанная к карте — люди, с которыми вы катаетесь ВМЕСТЕ, а не которых нанимаете. У каждой Crew есть родная территория на карте, домашние Spot, участники и манифест. Участники подтверждают со своих ключей, поэтому состав легитимный. Создайте свою или найдите своих!', + 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: 'Запнуть SkateSpots', + 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: 'Тусуется на Spot', + onMyWay: 'В пути', + onMyWayDesc: 'Едет на Spot', + takingABreak: 'Перерыв', + takingABreakDesc: 'Отдыхает/пьёт воду', + doneForToday: 'На сегодня всё', + doneForTodayDesc: 'Закончил кататься', + }, +}; export default ruBatch7; diff --git a/src/i18n/ru/batch8.ts b/src/i18n/ru/batch8.ts index b7c2382..9b4fbe2 100644 --- a/src/i18n/ru/batch8.ts +++ b/src/i18n/ru/batch8.ts @@ -1,4 +1,622 @@ -/** ru — batch 8. Filled by the translation pass; empty until then. */ -const ruBatch8 = {}; +/** ru — batch 8. */ +const ruBatch8 = { + deckCostUi: { + presetPrompt: 'Назовите этот пресет', + presetDefaultName: 'Пресет {{n}}', + summaryCopied: 'Сводка скопирована', + couldNotCopy: 'Не удалось скопировать', + resetConfirm: 'Сбросить всё к значениям примера?', + logoTooLarge: 'Логотип слишком большой (макс. 500 КБ)', + loginToFill: 'Войдите, чтобы заполнить из профиля Nostr', + filledFromProfile: 'Заполнено из вашего профиля Nostr', + warnRetailBelowOne: 'Розничная наценка ниже 1× — вы продадите себе в убыток.', + warnWholesaleAboveRetail: 'Оптовая наценка должна быть ниже розничной.', + warnZeroBoards: '{{count}} строк(и) используют 0 досок — себестоимость этой строки игнорируется.', + warnFixedNoBoards: 'Заданы фиксированные месячные расходы, но досок/мес = 0, поэтому стоимость операций игнорируется.', + warnNoMaterials: 'Нет затрат на материалы — добавьте хотя бы один материал.', + warnEquipmentOverhead: 'Оборудование + накладные превышают 60% себестоимости — эта модель предполагает большой объём; проверьте количество досок.', + warnOneBoard: 'Часть оборудования распределена всего на одну доску — увеличьте количество досок для амортизации.', + templateStarterName: 'Хобби-старт', + templateStarterBlurb: 'Несколько строк, без фиксированных расходов', + templateShopName: 'Небольшая мастерская', + templateShopBlurb: 'Полная таблица с арендой и накладными', + currency: 'Валюта', + noCurrencyMatches: 'Нет совпадающих валют.', + ratesUnavailable: 'Живые курсы недоступны — переключение только меняет обозначение.', + liveRates: 'живые курсы BTC · sats включены', + chipCost: 'себестоимость', + chipSell: 'продажа', + chipTotal: 'итого', + startFrom: 'Начать с', + advancedToggleHint: 'Показать ставки и отходы по операциям, настройку партии, налог и кривую стоимости от количества', + advanced: 'Продвинутый', + simple: 'Простой', + sectionLabor: 'Труд', + sectionEquipment: 'Оборудование', + sectionOperations: 'Операционные расходы', + sectionMaterials: 'Материалы', + sectionProcesses: 'Стоимость процессов', + sectionPackaging: 'Упаковка', + sectionMargins: 'Наценки', + subtotalLoaded: '{{value}}/ч с начислениями', + subtotalPerBoard: '{{value}}/доска', + hourlyRate: 'Ставка в час ({{unit}})', + labourBurden: 'Нагрузка на труд (×)', + loadedRate: 'Полная ставка', + loadedRateHintBefore: 'Полная ставка = зарплата × нагрузка (налоги и страховые взносы работодателя на труд). Аренда и счета идут в раздел ', + loadedRateHintAfter: ' — не считайте их дважды.', + colEquipment: 'Оборудование', + colCostUnit: 'Стоимость ({{unit}})', + colCost: 'Стоимость', + colSetupH: 'Настройка (ч)', + colLifetimeBoards: 'Досок за срок службы', + colPerBoard: 'На доску', + colMaterial: 'Материал', + colOrderUnit: 'Заказ ({{unit}})', + colShipUnit: 'Доставка ({{unit}})', + colBoardsOrder: 'Досок / заказ', + colOrderM: 'Заказ (м)', + colUnloadM: 'Разгрузка (м)', + colOrder: 'Заказ', + colShipping: 'Доставка', + colOrderMin: 'Заказ (мин)', + colUnloadMin: 'Разгрузка (мин)', + colProcess: 'Процесс', + colTimeM: 'Время (м)', + colBoardsRun: 'Досок / прогон', + colRateHr: 'Ставка/ч (0 = цех)', + colRateHrShort: 'Ставка/ч', + colScrapPct: 'Отходы %', + colTimeMin: 'Время (мин)', + colPackaging: 'Упаковка', + colTimeBoardM: 'Время/доска (м)', + colTimeBoardMin: 'Время/доска (мин)', + colMaterialsBoardUnit: 'Материалы/доска ({{unit}})', + colMaterialsBoard: 'Материалы/доска', + equipmentPerBoard: 'Оборудование на доску:', + materialsPerBoard: 'Материалы на доску:', + processesPerBoard: 'Процессы на доску:', + packagingPerBoard: 'Упаковка на доску:', + perBoard: 'На доску:', + addEquipment: 'Добавить оборудование', + addMaterial: 'Добавить материал', + addProcess: 'Добавить процесс', + addPackagingStep: 'Добавить этап упаковки', + duplicate: 'Дублировать', + remove: 'Удалить', + boardsPerMonth: 'Досок / месяц', + rentPerMonth: 'Аренда / месяц', + utilitiesPerMonth: 'Коммунальные / месяц', + subscriptionsPerMonth: 'Подписки / месяц', + markup: 'Наценка (×)', + wholesaleMarkup: 'Оптовая наценка (×)', + scrapWaste: 'Отходы / потери (%)', + quantityDecks: 'Количество (decks)', + targetMonthlyProfit: 'Целевая месячная прибыль ({{unit}})', + costNoPackaging: 'Себестоимость / доска (без упаковки)', + costWithPackaging: 'Себестоимость / доска (с упаковкой)', + batchSetupHours: 'Настройка партии (ч / прогон)', + batchSetupCost: 'Стоимость настройки партии ({{unit}} / прогон)', + taxVat: 'Налог / НДС (%)', + quoteTax: 'Налог в предложении', + includedInPrice: 'Включён в цену', + addedOnTop: 'Добавляется сверху', + setupPerBoard: 'Настройка / доска', + marginNoteBefore: 'Наценка {{markup}}× ≈ ', + grossMargin: '{{pct}}% валовой маржи', + marginNoteAfter: ' · отходы {{waste}}% распределены по годным доскам.', + sellingPriceNoPackaging: 'Цена продажи · без упаковки', + sellingPriceWithPackaging: 'Цена продажи · с упаковкой', + profitPerDeck: 'Прибыль / deck', + wholesalePerDeck: 'Опт / deck', + orderTotalQty: 'Сумма заказа ({{qty}})', + orderTotal: 'Сумма заказа', + breakeven: 'Точка безубыточности', + breakevenPerMonth: '{{count}}/мес', + targetDecksHint: 'Чтобы получить {{amount}}/месяц сверх фиксированных расходов, продавайте {{decks}} decks/месяц.', + priceIncludesTax: 'Цена включает налог {{pct}}%: {{amount}} от общей суммы.', + plusTax: 'Плюс налог {{pct}}%: {{amount}} → итого {{total}}.', + costVsQuantity: 'Стоимость от количества (настройка амортизирована)', + deckOne: 'deck', + deckOther: 'decks', + perDeckSuffix: '/ deck', + orderSuffix: 'заказ {{amount}}', + shippingNotIncluded: 'Не включает доставку покупателю.', + clientQuoteDetails: 'Детали предложения клиенту (для PDF)', + fillFromProfileTitle: 'Заполнить имя, сайт, NIP-05, Lightning и npub из профиля Nostr', + fillFromProfile: 'Заполнить из профиля', + businessName: 'Название бизнеса / мастерской', + email: 'Email', + phone: 'Телефон', + website: 'Сайт', + address: 'Адрес', + quoteNumber: 'Предложение №', + nextNumber: 'Следующий номер', + validDays: 'Действительно (дней)', + nip05: 'NIP-05', + lightningAddress: 'Lightning-адрес', + nostrNpub: 'Nostr (npub)', + depositPct: 'Предоплата вперёд (%)', + deliveryTerms: 'Условия поставки (Инкотермс, необязательно)', + paymentMethods: 'Способы оплаты', + paymentTerms: 'Условия оплаты', + paymentDetails: 'Платёжные реквизиты', + notesTerms: 'Заметки / условия', + changeLogo: 'Изменить логотип', + addLogo: 'Добавить логотип', + incotermNone: 'Нет', + incotermExw: 'EXW — самовывоз у продавца', + incotermFca: 'FCA — передан перевозчику покупателя', + incotermDap: 'DAP — доставлено по адресу покупателя', + incotermDdp: 'DDP — доставлено, пошлины оплачены', + payMethodCash: 'Наличные', + payMethodLightning: 'Lightning', + payMethodCashu: 'Cashu', + payMethodBank: 'Банковский перевод', + payMethodCard: 'Карта', + payMethodOther: 'Другое', + listDeckAtPrice: 'Выставить deck по этой цене', + getItMade: 'Заказать изготовление — найти билдера', + savePreset: 'Сохранить пресет', + load: 'Загрузить', + export: 'Экспорт', + import: 'Импорт', + reset: 'Сбросить', + deletePreset: 'Удалить пресет', + exportPdfFull: 'PDF — полная таблица', + exportPdfQuote: 'PDF — предложение клиенту', + exportPng: 'Изображение PNG', + exportXlsx: 'Книга XLSX', + exportCsv: 'CSV (таблица)', + exportMarkdown: 'Markdown', + exportJson: 'JSON (резервная копия)', + exportCopySummary: 'Копировать сводку', + }, + becomeRolesUi: { + artist: { + seoTitle: 'Стать дизайнером / художником - SkateSpots', + seoDescription: 'Разместите свой скейт-дизайн и искусство — графику для досок, логотипы, плакаты, мерч и не только.', + heading: 'Дизайнер / Художник', + tagline: 'Графика для досок, логотипы, плакаты, мерч — покажите своё искусство сцене', + noun: 'художник', + rateLabel: 'Ставка', + portfolioLabel: 'Портфолио / ссылка на магазин', + sectionWhatYouMake: 'Что вы создаёте', + sectionMedium: 'Материал / техника', + sectionSoftwareTools: 'Софт и инструменты', + deliverablesPlaceholder: 'напр. файлы для печати, исходники, графика для досок', + turnaroundPlaceholder: 'напр. 3–5 дней', + }, + graffiti: { + seoTitle: 'Предложить граффити / муралы - SkateSpots', + seoDescription: 'Разместите свои граффити и муралы — работы, настенные росписи, арт для скейт-парков и не только.', + heading: 'Художник граффити / муралов', + tagline: 'Работы, муралы, арт для скейт-парков — раскрасьте сцену', + noun: 'граффити-художник', + rateLabel: 'Ставка', + portfolioLabel: 'Портфолио (IG, сайт)', + sectionStyle: 'Стиль', + sectionMedium: 'Техника', + sectionWorkContext: 'Контекст работы', + crewLabel: 'Crew граффити', + crewPlaceholder: 'Ваш райтинг-Crew (необязательно)', + crewHelper: 'Отдельно от вашего скейт-Crew — те, с кем вы рисуете.', + surfacesPlaceholder: 'напр. бетон, кирпич, разрешённые стены', + maxSizePlaceholder: 'напр. до 10 м', + }, + musician: { + seoTitle: 'Добавить музыкальный профиль - SkateSpots', + seoDescription: 'Катаетесь и делаете музыку? Разместите свою группу или сольный проект — жанры, инструменты и ссылки.', + heading: 'Музыкант / Группа', + tagline: 'Катаетесь и делаете музыку? Получайте заказы на демо, джемы и афтерпати', + noun: 'музыкант', + rateLabel: 'Ставка за выступление', + portfolioLabel: 'Сайт / ссылка на EPK', + sectionGenre: 'Жанр', + sectionInstruments: 'Инструменты и роль', + actLabel: 'Тип проекта', + actPlaceholder: 'соло / группа / dj / продюсер', + spotifyLabel: 'Spotify', + spotifyPlaceholder: 'https://open.spotify.com/…', + bandcampLabel: 'Bandcamp', + bandcampPlaceholder: 'https://…bandcamp.com', + soundcloudLabel: 'SoundCloud', + soundcloudPlaceholder: 'https://soundcloud.com/…', + youtubeLabel: 'YouTube', + youtubePlaceholder: 'https://youtube.com/…', + setLengthPlaceholder: 'напр. 30–45 мин', + techRiderPlaceholder: 'напр. PA, микрофоны, бэклайн', + }, + judge: { + seoTitle: 'Судить скейт-события - SkateSpots', + seoDescription: 'Разместите себя как судью скейт-событий — Game of S.K.A.T.E., best trick, контесты, любительские серии и этапы мирового тура. Получайте заказы на честные, авторитетные события.', + heading: 'Судья скейт-событий', + tagline: 'От Game of S.K.A.T.E. на плоскаче до World Destruction Tour — судите честно и авторитетно', + noun: 'судья', + rateLabel: 'Дневная ставка / гонорар', + portfolioLabel: 'Архив результатов / ссылка на профиль', + sectionEventFormats: 'Форматы событий', + sectionSpecialty: 'Специализация', + sectionLevelCircuit: 'Уровень / серия', + eventsJudgedLabel: 'Отсужено событий', + eventsJudgedPlaceholder: 'напр. 40+ контестов, 3 этапа мирового тура', + eventsJudgedHelper: 'Заметные события, контесты или туры, которые вы судили.', + travelPlaceholder: 'напр. регион / вся страна / международный', + certificationsPlaceholder: 'напр. национальный судейский курс', + }, + organizer: { + seoTitle: 'Организовывать скейт-события - SkateSpots', + seoDescription: 'Разместите себя как организатора скейт-событий — стрит-джемы, best trick, контесты, сходки, демо и этапы туров. Вас найдут и пригласят провести сессию.', + heading: 'Организатор событий', + tagline: 'Джемы, контесты, сходки и демо — проведите сессию и объедините сцену', + noun: 'организатор', + rateLabel: 'Гонорар / бюджет', + portfolioLabel: 'Прошлые события / ссылка на результаты', + sectionEventTypes: 'Типы событий', + sectionWhatYouHandle: 'Что вы берёте на себя', + sectionScale: 'Масштаб', + eventsHostedLabel: 'Организовано событий', + eventsHostedPlaceholder: 'напр. 25 джемов, 3 городских контеста', + eventsHostedHelper: 'Заметные события, контесты или сходки, которые вы проводили.', + insurancePlaceholder: 'напр. гражданская ответственность включена', + permitsPlaceholder: 'напр. разрешения оформлены', + }, + tattoo: { + seoTitle: 'Стать тату-мастером - SkateSpots', + seoDescription: 'Разместите свои тату-работы для скейт-сцены — стили, флэши, кастом и не только.', + heading: 'Тату-мастер', + tagline: 'Тату для сцены — флэш, кастом, тонкие линии и не только', + noun: 'тату-мастер', + rateLabel: 'Ставка / в час', + portfolioLabel: 'Портфолио (IG, сайт)', + sectionStyles: 'Стили', + sectionMethod: 'Метод', + studioLabel: 'Студия / салон', + studioPlaceholder: 'Название студии (необязательно)', + booksOpenLabel: 'Запись открыта', + booksOpenHelper: 'Принимаете ли вы сейчас записи?', + depositPlaceholder: 'напр. 50 EUR без возврата', + minimumPlaceholder: 'напр. 80 EUR', + }, + trainer: { + seoTitle: 'Стать тренером / физио - SkateSpots', + seoDescription: 'Помогите скейтерам стать сильнее и оставаться здоровыми — сила, мобильность, профилактика травм и восстановление.', + heading: 'Тренер / Физио', + tagline: 'Сила, мобильность, профилактика травм и восстановление для скейтеров', + noun: 'тренер', + rateLabel: 'Ставка / за сессию', + portfolioLabel: 'Профиль / ссылка для записи', + sectionFocus: 'Направление', + sectionInjuries: 'Травмы, с которыми работаете', + sectionCredentialsSetting: 'Квалификация и условия', + credentialsPlaceholder: 'напр. BSc физиотерапии, CSCS…', + credentialsHelper: 'Указывайте реальную квалификацию — скейтеры доверяют проверяемым документам.', + remoteLabel: 'Удалённо / онлайн', + remoteHelper: 'Предлагаете ли онлайн-тренировки или консультации?', + modalitiesPlaceholder: 'напр. мануальная терапия, ОФП, сухое иглоукалывание', + }, + barber: { + seoTitle: 'Стать барбером / парикмахером - SkateSpots', + seoDescription: 'Разместите свой барбершоп или кресло для скейт-сцены — стрижки, фейды, стрижка бороды, окрашивание и не только. Получайте записи от скейтеров.', + heading: 'Барбер / Парикмахер', + tagline: 'Стрижки, фейды и борода для сцены — кресло в салоне или выезд', + noun: 'барбер', + rateLabel: 'Цена / стрижка', + portfolioLabel: 'Галерея стрижек / ссылка на IG', + sectionWhatYouOffer: 'Что вы предлагаете', + sectionSignatureStyles: 'Фирменные стили', + sectionSetting: 'Условия', + studioLabel: 'Салон / студия', + studioPlaceholder: 'Название салона или студии (необязательно)', + booksOpenLabel: 'Запись открыта', + booksOpenHelper: 'Принимаете ли вы сейчас записи?', + durationPlaceholder: 'напр. 30–45 мин', + }, + }, + weatherUi: { + condition: { + clearSky: 'Ясное небо', + mainlyClear: 'Преимущественно ясно', + partlyCloudy: 'Переменная облачность', + overcast: 'Пасмурно', + foggy: 'Туман', + depositingRimeFog: 'Туман с изморозью', + lightDrizzle: 'Слабая морось', + moderateDrizzle: 'Умеренная морось', + denseDrizzle: 'Сильная морось', + lightFreezingDrizzle: 'Слабая ледяная морось', + denseFreezingDrizzle: 'Сильная ледяная морось', + slightRain: 'Небольшой дождь', + moderateRain: 'Умеренный дождь', + heavyRain: 'Сильный дождь', + lightFreezingRain: 'Слабый ледяной дождь', + heavyFreezingRain: 'Сильный ледяной дождь', + slightSnow: 'Небольшой снег', + moderateSnow: 'Умеренный снег', + heavySnow: 'Сильный снег', + snowGrains: 'Снежная крупа', + slightRainShowers: 'Небольшие ливни', + moderateRainShowers: 'Умеренные ливни', + violentRainShowers: 'Сильные ливни', + slightSnowShowers: 'Небольшие снегопады', + heavySnowShowers: 'Сильные снегопады', + thunderstorm: 'Гроза', + thunderstormSlightHail: 'Гроза с небольшим градом', + thunderstormHeavyHail: 'Гроза с сильным градом', + unknown: 'Неизвестно', + }, + aqi: { + good: 'Хорошо', + moderate: 'Умеренно', + unhealthySensitive: 'Вредно для чувствительных групп', + unhealthy: 'Вредно', + veryUnhealthy: 'Очень вредно', + hazardous: 'Опасно', + }, + skateability: { + perfect: 'Идеально', + good: 'Хорошо', + okay: 'Нормально', + poor: 'Плохо', + bad: 'Очень плохо', + unrideable: 'Некатабельно', + }, + reason: { + currentlyRaining: 'Сейчас идёт дождь', + raining: 'Дождь', + snowing: 'Снег', + thunderstorm: 'Гроза', + freezingTemperature: 'Минусовая температура', + veryCold: 'Очень холодно', + extremelyHot: 'Чрезвычайно жарко', + veryHot: 'Очень жарко', + veryStrongWind: 'Очень сильный ветер', + strongWind: 'Сильный ветер', + moderateWind: 'Умеренный ветер', + veryUnhealthyAir: 'Очень грязный воздух', + unhealthyAir: 'Грязный воздух', + moderateAirQuality: 'Среднее качество воздуха', + veryHumid: 'Очень влажно', + humid: 'Влажно', + extremeUv: 'Экстремальный УФ — используйте солнцезащитный крем', + highUv: 'Высокий УФ — рекомендуется защита от солнца', + perfectConditions: 'Идеальные условия для катания', + }, + }, + skaterLabelsUi: { + stance: { + regular: 'Regular', + goofy: 'Goofy', + }, + style: { + street: 'Street', + park: 'Park', + vert: 'Vert', + transition: 'Transition', + bowl: 'Bowl', + cruising: 'Cruising', + downhill: 'Downhill', + freestyle: 'Freestyle', + ledges: 'Ledges', + stairs: 'Stairs', + diy: 'DIY', + }, + level: { + grom: 'Grom', + intermediate: 'Средний', + advanced: 'Продвинутый', + ripper: 'Ripper', + }, + sponsor: { + title: 'Титульный спонсор', + gold: 'Золото', + silver: 'Серебро', + partner: 'Партнёр', + }, + }, + notifyUi: { + activity: { + zappedWithAmount: 'Вам прислали zap на {{sats}} sats', + zapped: 'Вам прислали zap', + liked: 'Кому-то понравился ваш пост', + reposted: 'Кто-то сделал репост вашего поста', + mentioned: 'Кто-то упомянул вас', + replied: 'Кто-то ответил вам', + rsvp: 'Кто-то подтвердил участие в вашем событии', + eventUpdated: 'Событие, на которое вы идёте, обновлено', + newActivity: 'Новая активность', + tapToOpen: 'Нажмите, чтобы открыть SkateSpots', + }, + crew: { + inviteTitle: 'Приглашение в Crew', + inviteBody: 'Вас приглашают в {{crew}}', + addedTitle: 'Вас добавили в Crew', + addedBody: '{{crew}} — подтвердите, чтобы присоединиться', + joinRequestTitle: 'Запрос на вступление', + joinRequestBody: 'Кто-то хочет присоединиться к {{name}}', + }, + dm: { + title: 'Новое личное сообщение', + body: 'Нажмите, чтобы прочитать', + }, + trade: { + confirm: 'Подтвердите сделку', + confirmed: 'Сделка подтверждена', + newOffer: 'Новое предложение по вашему объявлению', + counter: 'Встречное предложение', + accepted: 'Предложение принято 🎉', + declined: 'Предложение отклонено', + withdrawn: 'Предложение отозвано', + }, + newsletter: { + drop: 'Новый выпуск SkateSpots', + }, + summary: { + moreUpdates: 'Ещё {{count}} обновлений', + openToCatchUp: 'Откройте SkateSpots, чтобы наверстать', + }, + }, + legacyMiscUi: { + hostingGoing: '{{count}} идут', + hostingInterested: '{{count}} интересуются', + hostingPostUpdate: 'Опубликовать обновление', + hostingEdit: 'Редактировать', + hostingLoginToSee: 'Войдите, чтобы увидеть события, которые вы проводите.', + hostingEmptyTitle: 'Вы пока ничего не проводите', + hostingEmptyBody: 'Проведите джем, контест или сессию. Создайте событие — скейтеры смогут откликнуться, получать обновления и приехать.', + hostingCreateEvent: 'Создать событие', + hostingUpcoming: 'Предстоящие · {{count}}', + hostingPast: 'Прошедшие · {{count}}', + sponsorPartners: 'Партнёры', + sponsorTitleSponsor: 'Титульный спонсор', + sponsorPlatformPartners: 'Партнёры платформы', + reportsUntitled: '(без названия)', + reportsResolveFailed: 'Не удалось найти событие из жалобы (возможно, оно удалено, или жалоба относится к профилю, а не к посту).', + reportsLookAtIt: 'Посмотреть', + reportsNoReports: 'Жалоб пока нет. Либо всё в порядке, либо никто не нашёл кнопку.', + statusSetYourStatus: 'Установите статус', + statusSetDesc: 'Расскажите другим, чем вы заняты. Ваш статус будет виден в профиле и в связанных спотах.', + statusClear: 'Очистить', + statusOrWriteOwn: 'Или напишите свой', + statusCustomPlaceholder: 'Чем вы заняты?', + statusLinkToSpot: 'Привязать к Spot (необязательно)', + statusSpotSelected: 'Spot выбран', + statusSearchSpots: 'Поиск спотов...', + statusNoSpotsFound: 'Споты не найдены.', + statusSelectSpot: 'Выберите Spot', + statusAutoClearAfter: 'Автоочистка через: {{time}}', + statusExpMin: '{{count}} мин', + statusExpOneHour: '1 час', + statusExpHours: '{{count}} ч', + statusExpOneDay: '1 день', + statusExpDays: '{{count}} дн.', + statusSlider15: '15 мин', + statusSlider1h: '1 ч', + statusSlider4h: '4 ч', + statusSlider24h: '24 ч', + statusSetting: 'Установка статуса...', + statusSet: 'Установить статус', + statusSomethingWrong: 'Что-то пошло не так', + seoProfileTitle: 'Профиль - SkateSpots', + seoViewProfile: 'Просмотреть профиль.', + bannerAlt: 'Баннер', + openInCordn: 'Открыть в Cordn', + modHelp: 'Скрыть публикует org.skatespots.moderation / hidden; Подтвердить публикует … / verified; Отменить публикует … / cleared (возврат к нейтральному). Все три — публичные обратимые метки, ничего никогда не удаляется с релеев.', + zapNoActiveMint: 'Активный Cashu-минт не найден.', + altProfile: 'Профиль', + altCardPreview: 'Предпросмотр карты', + altCard: 'Карта', + altCaptured: 'Снято', + ariaPrevPhoto: 'Предыдущее фото', + ariaNextPhoto: 'Следующее фото', + ariaCommentOptions: 'Действия с комментарием', + ariaMessageConversation: 'Переписка', + exportTitle: 'SkateSpots — Калькулятор себестоимости Deck', + exportQuoteTitle: 'ПРЕДЛОЖЕНИЕ', + exportPngTitle: 'Себестоимость Deck', + exportMarkdownTitle: 'Калькулятор себестоимости Deck', + exportSectionLabor: 'Труд', + exportSectionEquipment: 'Оборудование', + exportSectionOperations: 'Операционные расходы', + exportSectionMaterials: 'Материалы', + exportSectionProcesses: 'Стоимость процессов', + exportSectionPackaging: 'Упаковка', + exportSectionResult: 'Результат', + exportLabelOperations: 'Операции', + exportLabelProcesses: 'Процессы', + exportKvHourlyRate: 'Ставка в час', + exportKvLabourBurden: 'Нагрузка на труд', + exportKvLoadedRate: 'Полная ставка', + exportKvEquipmentPerBoard: 'Оборудование на доску', + exportKvBoardsPerMonth: 'Досок / месяц', + exportKvRentPerMonth: 'Аренда / месяц', + exportKvUtilitiesPerMonth: 'Коммунальные / месяц', + exportKvSubscriptionsPerMonth: 'Подписки / месяц', + exportKvPerBoard: 'На доску', + exportKvMaterialsPerBoard: 'Материалы на доску', + exportKvProcessesPerBoard: 'Процессы на доску', + exportKvPackagingPerBoard: 'Упаковка на доску', + exportKvMarkup: 'Наценка', + exportMarkupValue: '{{markup}}× (≈ {{pct}}% валовой маржи)', + exportKvWasteEffective: 'Отходы (эффективные)', + exportKvCostNoPack: 'Себестоимость / доска (без упаковки)', + exportKvCostWithPack: 'Себестоимость / доска (с упаковкой)', + exportKvBatchSetupPerBoard: 'Настройка партии / доска', + exportKvTax: 'Налог ({{pct}}%)', + exportKvTaxIncluded: 'Налог ({{pct}}%, включён)', + exportKvSellingNoPack: 'Цена продажи (без упаковки)', + exportKvSellingWithPack: 'Цена продажи (с упаковкой)', + exportShippingNote: 'Не включает доставку покупателю.', + exportGeneratedBy: 'Создано в SkateSpots · skate-spots.org', + exportGeneratedWith: 'Создано с помощью SkateSpots · skate-spots.org', + exportDetailSetup: '+ {{hours}} ч настройки', + exportDetailBoards: '{{boards}} досок', + exportDetailShip: '+ {{amount}} доставка', + exportDetailMinutes: '{{minutes}} мин', + exportDetailPerBoards: '/ {{boards}} досок', + exportDetailScrap: '{{pct}}% отходов', + exportDetailMaterials: '{{materials}} материалов', + exportQuoteRef: '№ {{ref}}', + exportQuoteLineItem: 'Кастомный скейтборд deck', + exportQuoteLineItemQty: 'Кастомный скейтборд deck × {{qty}}', + exportQuoteLineDesc: 'Собран вручную, отделан и упакован. Количество 1.', + exportQuoteLineDescQty: 'Собран вручную, отделан и упакован. {{price}} за штуку.', + exportQuoteSubtotal: 'Промежуточный итог', + exportQuoteSubtotalQty: 'Промежуточный итог ({{qty}} decks)', + exportQuoteTax: 'Налог / НДС ({{pct}}%)', + exportQuoteTotal: 'Итого', + exportQuoteTotalQty: 'Итого ({{qty}} decks)', + exportQuoteIncludesTax: 'Включает налог {{pct}}% ({{amount}})', + exportQuoteDeposit: 'Предоплата сейчас ({{pct}}%)', + exportQuoteBalance: 'Остаток по завершении', + exportQuotePayment: 'Оплата: {{value}}', + exportQuoteLightning: 'Lightning: {{value}}', + exportQuoteDetails: 'Реквизиты: {{value}}', + exportQuoteTerms: 'Условия: {{value}}', + exportQuoteDelivery: 'Доставка: {{value}}', + exportQuoteValidUntil: 'Не включает доставку. Предложение действительно до {{date}}.', + exportPngSellingWith: 'ЦЕНА ПРОДАЖИ · С УПАКОВКОЙ', + exportPngSellingNo: 'ЦЕНА ПРОДАЖИ · БЕЗ УПАКОВКИ', + exportPngCostWith: 'СЕБЕСТОИМОСТЬ / ДОСКА (С УПАКОВКОЙ)', + exportPngDeposit: 'Предоплата {{pct}}%: {{amount}}', + exportXlsxSummary: 'Сводка', + exportXlsxCurrency: 'Валюта', + exportXlsxDate: 'Дата', + exportXlsxOperationsPerBoard: 'Операции на доску', + exportColCost: 'Стоимость', + exportColSetupH: 'Настройка (ч)', + exportColBoards: 'Доски', + exportColPerBoard: 'На доску', + exportColMaterial: 'Материал', + exportColOrderCost: 'Стоимость заказа', + exportColShipping: 'Доставка', + exportColOrderMin: 'Заказ (мин)', + exportColUnloadMin: 'Разгрузка (мин)', + exportColProcess: 'Процесс', + exportColTimeMin: 'Время (мин)', + exportColTimeBoardMin: 'Время/доска (мин)', + exportColMaterialsBoard: 'Материалы/доска', + exportCopyTitle: 'Себестоимость Deck — {{currency}}', + exportCopyCostWith: 'Себестоимость / доска (с упаковкой): {{amount}}', + exportCopySellingNo: 'Цена продажи (без упаковки): {{amount}}', + exportCopySellingWith: 'Цена продажи (с упаковкой): {{amount}}', + exportCopyBreakdown: 'Оборудование {{equipment}} · Операции {{operations}} · Материалы {{materials}} · Процессы {{processes}} · Упаковка {{packaging}}', + exportMdHourlyRate: 'Ставка в час: {{value}}', + exportMdLabourBurden: 'Нагрузка на труд: {{value}}', + exportMdLoadedRate: 'Полная ставка: {{value}}', + exportMdBoardsPerMonth: 'Досок/месяц: {{value}}', + exportMdRent: 'Аренда: {{value}}', + exportMdUtilities: 'Коммунальные: {{value}}', + exportMdSubscriptions: 'Подписки: {{value}}', + exportMdPerBoard: 'На доску: {{value}}', + exportMdMarkupWaste: 'Наценка: {{markup}}× (≈ {{pct}}% валовой маржи) · Отходы: {{waste}}%', + exportMdCostNoPack: 'Себестоимость/доска (без упаковки): {{value}}', + exportMdCostWithPack: 'Себестоимость/доска (с упаковкой): {{value}}', + exportMdBatchSetup: 'Настройка партии/доска: {{value}}', + exportMdSellingNo: 'Цена продажи (без упаковки): {{value}}', + exportMdSellingWith: 'Цена продажи (с упаковкой): {{value}}', + exportMdDisclaimer: 'Не включает доставку покупателю. Создано в SkateSpots.', + }, +}; export default ruBatch8; diff --git a/src/pages/CreateTourPage.tsx b/src/pages/CreateTourPage.tsx index c598ed2..6dd31ce 100644 --- a/src/pages/CreateTourPage.tsx +++ b/src/pages/CreateTourPage.tsx @@ -77,7 +77,7 @@ const ALL_LANGUAGES = [ { code: 'eu', label: 'Basque', flag: '🏴' }, { code: 'gl', label: 'Galician', flag: '🏴' }, // Asian - { code: 'ko', label: 'Korean', flag: '🇰🇷' }, + { code: 'ko', label: 'Korean', flag: '🇰🇵' }, { code: 'vi', label: 'Vietnamese', flag: '🇻🇳' }, { code: 'th', label: 'Thai', flag: '🇹🇭' }, { code: 'id', label: 'Indonesian', flag: '🇮🇩' },