Skip to content

Terminology Guide — TwoMore (투마) ​

Status: Reference

Single source of truth for all Korean-English terminology. UI labels, domain entities, enums, and code keys.


UI Label Rules ​

  • Top-level navigation vocabulary is fixed: 홈 / 클럽 / 경기 / 기록 / 프로필.
  • English top-level navigation vocabulary is fixed: Home / Clubs / Games / Records / Profile.
  • "클럽" is the bottom tab name (was "모임"). Do not use "모임" as a top-level tab or product navigation label.
  • "세션" (session) never appears in Korean UI. Use "일정".
  • "클럽" not "동호회" in UI (동호회 is spoken-only).
  • "경기" is the top-level games tab and also a played/scored match when context is clear.
  • "일정" is a scheduled session before it is played.
  • "기록" is the records/analytics top-level tab. Use leaderboard only for rank-comparison internals or subroutes.
  • "매치" not "매치 모임" (redundant). Discovery chip label: "매치 찾기". In code/engineering: always pickup (not meets/bunggae).
  • 매치 replaced 번개 (owner review 48, 2026-10-29; the owner: "How about just plain 매치? or 경기?"): 경기 already names the games tab and a played match, so the open game is 매치. The boards and this guide say 매치; the app's copy (packages/app/src/config/i18n/ko/*, and the house-style check's 픽업 → 매치 and 번개 → 매치 rules) says 매치 everywhere since 2026-11-13, push titles included; 천둥번개 is the weather word and stays. 매치 has one meaning: the final-set tiebreak is 타이브레이크 10점, never 매치 타이브레이크.
  • RSVP verb is 참석/불참 (owner 2026-07-29 vernacular migration) — 참석하다 (attend) / 불참하다 (decline), matching the community vernacular Korean tennis players already use on 밴드 (Band) for meetup RSVPs. 참가 is kept ONLY for 참가비 (participation fee) and tournament entry contexts; 참여 stays reserved for achievements.
  • Waitlist vocabulary is 예비 (예비 N번, 예비 등록, 예비 가능) — also 밴드-vernacular alignment. 대기 is retired from waitlist contexts entirely and reserved for process-queuing (e.g. 결제 대기 as a generic pending state, distinct from the session-fee copy below). 대기자 (the noun "waitlisted person") is retired along with it — 예비 covers both the state and the person; never re-introduce 대기자.
  • Session participation-fee transfer copy is 입금 (입금 확인, 입금했다고 알리기: the verb of the transfer), matching club-ledger vernacular (총무 users already say "입금" for dues/fee transfers) — replaces the old 송금 확인. The fee's STATE says the dues' money words (library § 1.19, owner 2026-10-25; moved with 참가비 내역, W4 batch 10): 미납 / 확인 대기 / 완납, and 환불 대기 while the host's refund waits; the retired state words are 입금 필요, 입금 확인 중 and 입금 완료 (and before them 송금 필요/송금 완료/송금 확인 중).
  • Match-generation CTA is 대진 짜기 — 대진 (existing noun, bracket/draw) + 짜다 (to construct/put together) reads as the natural verb Korean club organizers use, replacing the more clinical 경기 생성/경기 만들기.
  • 가입 for club membership, never 참여 or 참가. 참석 is reserved for RSVP/attendance CTAs — including pickup join buttons (e.g. "매치 참석하기"), which are attending a one-off event, not joining an org.
  • Semiannual dues cadence label is 6개월 (e.g. "6개월 30,000원": an amount is written in full, never as 3만원), not 반기 — converged 2026-08 after the create-club wizard's cadence picker shipped 6개월 with a 4:1 majority over 반기 among the club/session/wizard surfaces that render dues cadence.
  • Save buttons use bare 저장, not 저장하기 — matches the 확인/취소/삭제 house style of single-word primary actions. Longer, context-qualified save actions (e.g. "점수 저장") stay two words when the object being saved needs disambiguating, but never add the 하기 suffix. The bare form is the rule for every single-word action (공유, 신고, 초대, 변경, 수정, 거절, 승인, 지명, 반영); the 하기 form survives only on the sanctioned CTA idioms — 시작하기 (get started), 가입하기 (join), 참석하기 (RSVP), 신청하기 (apply), 결제하기 (pay), 입금하기 (pay by transfer, the manual rail's twin of 결제하기; 2026-11-10), 문의하기 (contact us), and the band verbs of the component library's § 1.19 (초대하기, 변경하기, 탈퇴하기, which the owner ratified on 2026-10-25: a band says the verb with 하기, never the noun) — and on …만들기. scripts/lib/i18n-hagi-idioms.mjs is the gate's list and follows that row.
  • One wording per concept (2026-09-13 consolidation; gated by check:i18n-near-duplicates). The same English under two Korean spellings, or the same Korean under two English renderings, is either one concept written inconsistently — folded through a copy plan (docs/design/copy-plans/) — or two concepts that share a word, recorded with a reason in scripts/i18n-near-duplicates-baseline.json. Rulings made in that pass:
    • People are 멤버, never 회원 (밴드 vernacular; 회원 survives only in 회원 탈퇴, the account). Removing a person is 내보내기; removing a thing is 삭제 (never 제거/빼기). Staff are 운영진; the admin role is 총무.
    • A membership offer (2026-11-13, N13 and the fix round). What an official sends a person who did not ask (지명, or 가입 제안 보내기 on a guest) is a 가입 제안 (en: membership offer) — never 가입 안내, which reads as a notice and not as something to answer (and is already the name of a club's joining conditions). The person answers with 수락 or 거절 (en: accept, decline); an official's withdrawal is 제안 취소 (en: withdraw offer, never 취소됨 for a state, never 삭제 or 내보내기, which remove a guest). The official's waiting line is one clause, 답을 기다리고 있어요, and the confirming line is 가입 제안을 보냈어요; the guest conversion says 이미 가입 신청이 와 있어요. 신청 목록에서 정해 주세요 when the guest's own request blocks the offer and 이미 멤버예요 when they already are one. Resolved 2026-11-13: 가입 제안 is only the offer the person answers. The guest shortlist is 가입 후보 (en: membership candidates; the row action 후보 추가, en: add as candidate), and the step that sends the offer is 가입 제안 보내기 (en: send membership offer), never 가입 확정. One word, one meaning: a candidate is a guest the club is considering; an offer is something sent to a person. (History: until then 가입 제안 also named the shortlist, and the step that sent was 가입 확정.)
    • Declining anything is 거절 / 거절됨 — never 거부 (score claims) or 반려 (submissions). Staff approving a submission is 승인; accepting an offer made to you is 수락; finalising is 확정; OK is 확인.
    • States are past participles: 취소됨 (never bare 취소 as a state), 거절됨, 승인됨 (a receipt its sender withdrew, a venue suggestion or an ownership application, reads 취소됨, as its 취소 buttons say). Live status is 진행 중 everywhere; the caps LIVE pill is the one exception (a badge, not a label).
    • Dues: 완납 / 미납 / 일부 납부 for the ledger state, 납부 확인 for the 총무's action — never the verb phrase 납부 완료 (a third wording; gated). Session fees say the same states, 미납 / 확인 대기 / 완납 (§ 1.19), and keep 입금 확인 for the action.
    • Subscription: 클럽 플랜 (상위 플랜, 플랜 업그레이드) — never 등급, which is the rating/trust tier word (gated).
    • Money vocabulary (U-14, 2026-09-17 ruling). 회비 = club dues, a per-member per-period charge; 참가비 = the per-session fee; 정산 = the host's ad-hoc cost split that sets a fee when a session has no fixed 참가비. Verbs: dues take 납부 확인 / 면제 / 납부 취소; session fees take 입금 확인 / 면제 (never 납부 — that word is reserved for dues). Both rosters render the SAME inline verb-pair row grammar — two pills [confirm][waive] on an open (unpaid/pending) row, one pill [undo] on a just-settled row, none on a waived/terminal row — one row grammar, two money vocabularies.
    • How money is written (batch 61). Won is 15,000원 in Korean and 15,000 KRW in English, always through formatCurrency or t().common.won: the sign ₩ is never written (lint no-inline-currency-format over code and the word files, and the house-style gate over both languages). A negative amount keeps its minus in front (-5,000원); a non-integer rounds.
    • One way to write each value (batch 63, the lead's rulings W1 to W8). Money has no 만원 shorthand and no second formatter: 2만원 and 월 3만원 are 20,000원 and 월 30,000원 (formatCurrency, or formatWonOrFree where zero reads 무료; formatKRW is deleted, no-inline-currency-format and the house-style gate fail a 만원 built in code or a word file). A rate per hour reads 시간당 (시간당 12,000원, the Words table's house form) and per day 1일당; any other span states itself (30분당), never 60분당. A recurring dues amount is 월 30,000원 (분기, 6개월, 연, 한 번 for the other cycles: clubList.duesLabelByCycle) on a card, a chip and the join band alike; 매월 is the cadence word of the plan page ("매월 5일까지"), not of an amount. A venue's rating is formatVenueRating: always one decimal, 4.0. A time ago is N분 전 / N시간 전 / N일 전 (notifications.*Ago; English 5m ago); the short chips (5분) are retired. A day read as history is formatPastDate: 11월 14일 within this year, 2025년 11월 14일 in an earlier one (formatRelativeDate is its yearless core; the ISO 2026-11-14 and the dotted 2026.10.05 are never read aloud to a person); a long date with the year always (formatDateLong) stays for the legal and plan dates that need it. A wait or a length is formatDuration: 59분, 1시간, 1일 1시간, never a count of minutes in the thousands. A plan-gated page says one sentence, <page>은/는 클럽 플랜에서 이용할 수 있어요 (en: "<page> is available on the club plan"), and what the page is; it promises no date (준비 중, 곧) and offers no door while there is no plan page. 할 일 is the officer's open work (홈, a club row's several kinds); 처리할 일 is only the 알림 filter, which lists the alerts that ask the viewer to act (the owner's word, library 1.14). The waiting applications on a session's page are 신청 대기 in the roster and on 호스트 관리 alike. A person with no club reads 클럽에 가입하거나 매치에 참석하면 여기에 보여요 under 다음 일정: only their own schedule is promised (소식 below already lists what is open).
    • The reader's pass, ruled (batch 63, W10). A session's level is 수준, its value 수준 무관 (en: Any level; 실력별 복식 and 실력 차이 keep 실력). Money has three states and one word each, 미납 · 확인 대기 · 완납 (common.unpaid, clubDues.pendingConfirmMemberBadge, statusBadges.sessionPayment.paid): 입금 전, 입금 대기 중, 입금 필요, 입금 확인 전 and 입금 확인 중 are retired; a count of the unpaid is 미납 N명. A door is the name of the page it opens: the settings row for the suggestions is 장소 정보 제안 내역 (one key, the page's own). A saved view is 저장됨 (never 즐겨찾기). What is taken back from a sent request is 신청 취소; 철회 stays for a consent only. The reminder is 알림 보내기 (all: 모두에게 알림 보내기); 입금했다고 알림 is a person saying they paid. A count carries its unit wherever it stands (활동 멤버 16명, 일정 12개, 리뷰 38개, 30경기, 6장); a filled-of-total reads 8/16명 (the unit once, at the end). A feed row or a card writes its date compact (MM.DD (요일), common.compactDate, within a week the lone weekday the board draws); a page's own date line writes it in full (M월 D일 (요일), monthDayWeekday). This is the boards' rule (SPEC_HOME "Dates"), which the owner reviewed: the club row's next event stays the board's weekday and time (토 19:00). A badge count on a task Cell (앨범 관리 1) is a mark, not a sentence, and carries no unit (batch 63, L13). The club's own offers waiting for an answer are a group of their own, 보낸 가입 제안, under 가입 신청, which counts and lists only the people who asked to join (the guest row's 초대함 and the offered state stay facts about their rows). 동의 관리 lists a consent under 필수 동의 when the sign-up catalog marks it required (이용약관, 개인정보 처리방침, 국외 이전), whatever its legal basis; a required row has no 철회 and its head says 필수 동의는 회원 탈퇴로만 철회할 수 있어요.
    • Buttons, words and doors ruled in batch 61 (open to the owner's veto). The password form's button reads 변경하기 and the withdrawal form's 탈퇴하기, as the component library's section 1.19 ("The band's verb", ratified by the owner on 2026-10-25) rules: the verb with 하기, never the noun. The lead's first ruling in this batch put the nouns 변경 and 탈퇴 over the table; it was corrected the same day, because the table is the owner's and the house-style gate's list (scripts/lib/i18n-hagi-idioms.mjs) had simply lacked the table's verbs (a test now reads the row and fails when the list lacks one). The page keeps the noun 비밀번호 변경 as its name, and the near-duplicate gate records the two jobs as a ruled distinction. A chat that cannot be opened says 지금은 이 분과 대화할 수 없어요 whoever blocked whom: a block is never named to the other person. The album's door and the trust sheet's door to a session read 일정 보기 (common.viewSession). The finder door is 테니스장 찾기, and the four venue-add lines (the name error, the adopt failure, the unknown-court-count caption, 없는 테니스장 추가) say 테니스장; 장소 stays where the guide names the 장소 page (장소 정보 제안, 장소 소유권, 장소 보기).
    • Lists: 전체 보기 = view all (a navigation to the full list); 더보기 = more (expand, load more, the ⋯ menu) — one spelling, no space, the Naver/Toss convention; the one spaced form is the Expand toggle's count, N개 더 보기 (review 48, the tonal Button at a list's end: a count and a verb), gated by check-i18n-house-style. Trailing dots on progress copy are three periods (불러오는 중...), never the … glyph.
    • Vocabulary axes (revised 2026-09-18, session-event-type-plan.md D5 — supersedes the prior 경기 방식/경기 유형 split below, which had them overloaded and cross-swapped): 종목 = singles/doubles (never 형식/방식 for it); 경기 유형 = event type (정기 · 매치 · 대회 · 리그 · 대항전 — sessions.event_type, the wizard's 경기 유형 picker and the detail info-section row); 경기 방식 = 친선/경쟁, the ELO-affecting style (is_friendly) — lives on the detail info row and the filter panel, never the card; 성격 = club focus only (친목형 / 경쟁형 / 성장형 / 균형형), never a session axis. First encounter: 대회 (the event, an event_type value) ≠ 토너먼트 (a draw/bracket type under 대진 방식) — do not conflate the two. 단식+복식 in full, 단복식 only as a chip; 혼합복식 in full, 혼복 only as a chip. The match board is 대진표.
    • Another person's figures count 경쟁 matches only (batch 66, CALL-5). The public profile's tiles read 경쟁 경기 and 경쟁 승률 (common.competitiveMatches, common.competitiveWinRate; never 총 경기 or a bare 승률 for another person), and another person's 기간 기록 says 경쟁 경기만 보여요 once. A person's own 기록 keeps 총 경기 / 승률 / 연승 over every match, and their 기간 기록 states 경쟁 and 친선 as two rows, each "N경기, 승률 R%" ("0경기, 승률 –" before a match).
    • 출석률 is the measured show-up rate (동호회 vernacular; the officials' page is 출석 현황, and the host's check before and during a session is 참석 확인, was 출석 확인); 참석 is the RSVP and the attended state; 참석자 are the people, 참가자 only for tournament entrants.
    • Trust words (owner review 46, M6; 2026-10-19). On the person-facing trust surfaces (the component library's §4 Trust): 불참 is an absence and 불참 기록 N건 their count (불참 keeps the no_show overlap note under RSVP Status); 사유 인정 is an excused record and 사유 인정 요청 the person's request for one, whose states are 확인 중 and 거절됨; 칭찬 and 칭찬한 사람 N명 name praise (매너 태그 stays the name of the giving flow, 매너 태그 남기기, never of a trust fact); 연속 참석 is the streak; 첫 참석 the Tag of a person with no recorded session; 내 신뢰 기록 the person's records page. 출석률 (a percentage) leaves those surfaces for the count 20회 중 참석; it stays a word of the officials' 출석 현황. No 점수 and no percentage on a trust surface.
    • Club pages (owner review 46, M10, M16, M17, M25, M26). 가입 신청 (the 할 일 row and the request) and 가입 심사 (the page that lists them: 심사 대상, 추천할 만한 게스트, 게스트 지명). 참석 확인 (was 출석 확인) before and during a session; 확인할 사람 (not come 10 minutes after their start), 도착 and 먼저 감 are its states (미응답 is retired); a player checks in with 도착했어요 on 일정 상세, and a player's 참석 시간 is the window (도착 and 퇴장), set with 시간 정하기 (the player) or 시간 바꾸기 (the host). 기록 (the club pane, was 순위) with 시즌, 최고의 파트너, 라이벌과 천적, 상승세. 회비 관리 is the officials' page (the owner's name for its job, 클럽 회비·장부, is a glued pair the code's lint rejects: say 회비와 장부 if both nouns are needed), 내 회비 the member's; 장부, 지출 추가 and 시작 잔액; 장부 내려받기 is the ledger's file (never 내보내기, which removes a member); 한 번 is a dues plan asked once (one name, one 납부 기한). A report's outcome is 확정 or 기각 (확정됨, 기각됨 once decided). 출석 주의 is the officials' flag; 불참 3.5 is a weighted sum.
    • Navigation and best partners (owner review 46, M24, M28). 관리 has two groups, 운영 and 설정. 홈 코트 is the club's home court (a row on 클럽 홈). 출석 주의 N명 is the row on 멤버 관리 that opens 출석 현황. 참가비 내역 is a member's session fees (the page 내 회비 ends in); 내 회비 is the dues. 복식 파트너 추천 ranks members in 추천 순서; each row's number is its 추천 점수 (83점 / 100점, 총점 in the Sheet) and 점수 안내 is its rules; the four parts are 실력 차이, 함께 친 기록, 신뢰 and 출석, and the sum is 합계. A pair with no match together says 함께 친 적이 없어요 and a thin record says N경기뿐이라 N0%만 반영. An album group's doors are 일정 보기 and 게시글 보기; an empty 클럽 대항전 offers 클럽 찾기. On the detail pages: 신청 N건 is the host's Notice for the applicants waiting (it opens 호스트 관리); 장소 and 클럽 are the Cells under a session's hero and in its 정보 group, and under 공개 프로필's identity Block and the two receipts' heroes (제안 접수 내역, 장소 소유권); 같은 장소 매치 is the count of the other open 매치 at a pickup's venue; 예정된 매치 is a venue's coming public 매치 (this venue's only, five at most, no door: the whole list is on 경기) under 진행 중, the live Block of a 매치 in play there, and 홈 코트로 쓰는 클럽 the clubs that call it their home court; 장소 보기 is the door to a venue's one page (a club's court and the directory's venue are the same page, opened by the spine id; there is no separate club court page and no 테니스장 정보 door), and its ⋯ proposes with 장소 정보 제안; 나와의 전적 is my record with one person (같은 편 N승 N패 | 상대 N승 N패) and opens 선수별 전적 filtered to them; 성장 분석 ends in 클럽 설정 and 멤버 초대. A club logo's generated mark is its 문양 (문양 사용), a person's missing photo their 이니셜. 성장 분석's 모집 계획 holds the numbers the club's plan implies: 정원 (the cap the club set), 필요 정원 (what the plan needs) and 주간 연인원 (the weekly attendance, counted per regular meet); the Section head's note, 출석률 60%로 계산했어요, states the assumption, and the line under the tiles says 현재 정원으로 충분해요, or 정원보다 N명 부족해요 when 필요 정원 is over 정원 (the app's own words). On 나와의 전적 (선수별 전적 filtered to one person) 같은 편 and 상대 are the two tiles, each with its 승률, 최근 5경기 is the last five with that person and 함께 친 경기 the matches with them; the English words are With and Against (the kit's), "Your record together" the title.
    • Venue facts: 운영 시간, 야간 조명, 코트 종류 (hard/clay), 시/군/구 for the district field, 지역 for a region, 위치 for a map position; 테니스장 is the label of every row that opens the venue finder (a session, a pickup, a regular meet) and the error beside it; 장소 stays only where the answer may be any place (a club event: a restaurant after the meet) and for the 장소 상세 page; 활동 장소 names a round that meets at a pick or in the region, not a pick (ruling 2026-11-14).
  • Language-specific terms and one format per concept (2026-09-13 house-style pass; gated by check:i18n-house-style, which is this list in regex form with per-key allowlists — a new legitimate exception is added there WITH its reason here). The two consolidation passes caught shared spellings; this one applies the rulings to every leaf (a leak with no twin is still a leak), folds formats (templates: counters, units, ranges, dates, currency, court/round labels — check:i18n-near-duplicates now compares template signatures too), and fixes the English house style:
    • People and roles: 멤버 never 회원/클럽원/회원님; 총무 = club admin (EN admin), 대표 = owner (EN owner), 운영진 = the officers (EN admins; the club's 대표 and 총무, its owners and admins, so 운영진 is also the word for who decides an excusal, beside a 매치's host), 운영팀 = TwoMore staff (EN staff), 호스트 = session host (EN host). Never 관리자/운영자/소유자 for a club role (venue ownership keeps 소유자/소유권); never organizer/manager in English.
    • Actions on people vs things: 내보내기 for a person (never 제거/추방/제외), 삭제 for a thing, 지우기 only for clearing a field; 거절 never 거부/반려. 참석 wherever the thing counted is being at a session (streak weeks, the n번째 session, evening and morning sessions: achievements and milestones included); 참여 only for involvement that is not attendance (taking part in matches); 참가 for 참가비 and tournament entrants; everything else is 참석 (RSVP/attended) — a player taking the court is 출전.
    • Live and format words: 진행 중 for a status, 실시간 for a real-time surface (실시간 스코어카드), 라이브 only on the LIVE pill. 종목 = singles/doubles; 대진 방식 = how the draw is built (KOTC, Mexicano — never 경기 방식, which is the session style); 세트 방식 = the set format in match rules.
    • Spellings: 매치 never 픽업; 초대 코드 and 홈 코트 spaced; 게시글 never 게시물; 사진 never 이미지 (a map image alt excepted); 수정 never 편집; ELO in caps in both languages (never Elo); 입금 for session-fee money (결제 only on the PortOne CTA and a venue's payment methods), 납부 for dues.
    • Korean counters and formats: 사람 N명, 코트 N면 (never N개), 일정 N개 for items and N회 for occurrences, N번 코트 (never 코트 N / N코트), N라운드, N세트, N위, N점, N승 N패 N무, 총 N for a total (never 전체 N); N명 이상 (never N명+). Ranges use ~ with no spaces (1~3년, 2~30자, 10:00~12:00, 9월 1일~7일; formatTimeRange is the one time-range formatter, reading common.timeRange). One exception: a decimal rating band is notation, not prose — NTRP 3.0–3.5 / UTR 5.0–8.0 keep the en dash in both languages (the domain formatters in rating-region.config.ts / tier.config.ts / rating-scale-format.rules.ts cannot read i18n, and were aligned on the en dash 2026-09-13 after formatTierNtrp alone printed ~). The em dash never appears in Korean copy — meta joins with ' · ', prose with a period. Relative time is N분 뒤 / N시간 뒤 (never 후) and N분 전 / N시간 전; a duration is N시간 N분. A referenced label is quoted with straight single quotes ('공유'); the [필수]/[선택] consent markers are the one bracket use.
    • Two teams (owner review 3, 2026-10-11). In a row there is no word between the teams (one team per line). In running text a matchup is " vs " between teams and " & " between partners ("김민준 & 이서연 vs 박지훈 & 최유나"), one lower-case spelling in both languages (the capital VS of matchup.vs becomes vs). 대 appears only where a score is read aloud ("6 대 4").
    • Rating bands (owner 2026-09-14): NTRP in both languages. Every band renders through formatNtrpBand (tier.config.ts) — NTRP 3.0–3.5 with the en dash as notation, 단식 NTRP 3.0–3.5 / Singles NTRP 3.0–3.5 (common.singlesBand), 복식 … / Doubles … (common.doublesBand). The UTR band display is retired (formatUtrBand deleted); UTR stays a model-held inference only.
    • No glued facts (owner 2026-09-14). A leaf never joins two facts with ·; each fact is its own key (or an entry of a readonly string[] leaf) rendered through MetaSegments, or the leaf is rewritten as a sentence. The no-middle-dot-join rule has no waivers.
    • Sanctioned 하기 CTAs grow by three more in batch 63 (the band's verb where the noun was drawn): 정보 보완하기 and 제안 취소하기 on a venue suggestion's page, 동의하기 on 동의 관리; the ownership-claim pages follow the same row (다시 신청하기, 양도 동의하기, 양도 동의 철회하기, 소유권 취소하기, 신청 취소하기; 철회하기 joins the list), where 철회 alone stays the 동의 관리 button on a granted consent. Earlier the list grew by two: 확인하기 (go and check — distinct from 확인 = OK) and 확정하기 (the action — distinct from 확정 / 참석 확정, the state). The full list: 시작하기 가입하기 참석하기 신청하기 결제하기 입금하기 문의하기 확인하기 확정하기 계속하기 (the leave guard's keep button, with 나가기) + …만들기; everything else is the bare form (글쓰기 for a board post, 투표, 기권, 반영).
    • English: sentence case for every label (proper nouns — Kakao Map, Naver Place, Court Climb, TennisTown — and the legal document titles Privacy Policy / Terms of Service excepted); Sign in / Sign out / sign-in never log in/out; waitlist / waitlisted never standby; event never gathering, and "schedule" only for the regular schedule; counts always through enCount / enPlural (never a hand-rolled n === 1 ? '' : 's'); numeric ranges with an en dash (2–30, 10:00–12:00; scores and statute section numbers keep the hyphen); #N for a position (never No. N); Court N, Round N; N going for an RSVP count, N KRW for money (never won); durations N min / N hr / N hr N min / N days N hr, relative times 5m ago / 3h ago / 2d ago; month names through enMonthName (September 2026, never 9/2026 or Month 9); straight quotes, three periods (never the … glyph).
  • Tone: 해요체, contracted. All product copy is 해요체 (never 합니다체/습니다체) and prefers the contracted past-tense form — 됐어요 (not 되었어요), 됐고 (not 되었고). Two sanctioned 합니다체 exceptions only: (1) the PIPA consent checkbox labels (onboarding.consent.purposeLabels.*, e.g. "개인정보 처리방침에 동의합니다") — "~에 동의합니다" is the standard Korean legal-consent register, audit-reviewed 2026-08-09; (2) the delete-account type-to-confirm phrase (deleteAccountScreen.confirmPhrase, "탈퇴합니다") — a formal phrase the user types verbatim to confirm an irreversible action, deliberately weightier than the surrounding 해요체 UI (English sibling: "delete my account", lowercase to match a type-to-confirm affordance rather than a sentence). No other 합니다체 is permitted; i18n.test.ts's tone regex enforces this with exactly these two path allowlists.
  • 테니스장 (venue) vs 코트 (court), owner-ratified 2026-08-28 sweep. Venue-meaning labels — the facility itself: managing/searching/picking/reviewing a place, empty states, toasts — use 테니스장 (EN: venue/venues), never bare 코트. Individual-surface labels — court count, per-court roster, on-court assignment, surface material — keep 코트 (EN: court/courts), since a 테니스장 contains one or more courts. Idiomatic compounds are sanctioned exceptions and stay 코트 regardless of meaning: 홈 코트 (spaced), 코트비, 하드코트, 코트승급전 (owner-locked KOTC naming), and the brand taglines "코트 위에서 만나요" / "코트에서 불릴 이름" / "코트 밖에서의 노력도...". venues.courts.navCourt is a deliberate EN asymmetry — the ko facility-kind chip reads 테니스장 (paired with 연습장) but the EN chip stays "Courts" (colloquially correct for the kind, and "Venues" would misfit the sibling "Practice" chip). A handful of "umbrella" venue+court info-editing keys (fieldCourtInfo/modalTitleCourtInfo, hostConfirmTitle, correctionModalTitle, pendingReviewApproveConfirmMessage) plus two weather-tip strings and the showcase QA copy are still flagged pending a follow-up owner ruling — do not conflate them into either bucket without an explicit call. A third term, 장소 ("place"), is used in the session-creation wizard specifically to differ from the club wizard's 코트/테니스장 vocabulary; that three-way split is also pending an owner ruling and is not resolved by this sweep.

Korean wording guide (owner review 4, point 13) ​

Source and evidence: owner-review-4-lane-f-2026-10-12.md §6.4 (norms from Toss easy-to-speak writing and the National Institute of Korean Language; the 32 caption rewrites are in §6.2). The rules in one list:

  1. 해요체, with the past tense contracted: 됐어요, 바뀌었어요, 사라져요.
  2. Everyday words over Sino-Korean ones: 바뀌었어요 not 변경, 바로 not 즉시, 때 not 시점. Keep the Sino-Korean word where it is clearer (완납, 입금).
  3. Active voice: "복사할 수 있어요", not "복사돼요".
  4. Say what to do, in the positive: "기다려 주세요", not "닫지 마세요".
  5. Invite, don't command: state the fact or the result ("~면 ~돼요"); use "~해 주세요" only when the person must act.
  6. Don't repeat what the title already says.
  7. Read it aloud: one idea per sentence; split a long one.
  8. Auxiliary verbs are spaced ("해 주세요", "알려 드려요"), one way throughout.
  9. Final period: one sentence has none; with two or more, each takes one, the last included. This is a house choice that departs from Toss's per-component rule.
  10. Buttons and choices: never 취소 between two options; use 닫기 or 다음에.
  11. A Dialog's dismiss word (2026-11-13). A Dialog that asks "do X?" offers the verb and 닫기; 취소 appears only as the verb when the action itself is a cancellation (신청 취소, 제안 취소, 일정 취소), and on a running edit's own header or sheet footer (the edit mode's 취소, a Sheet's 취소 + 저장), which are not Dialogs. A guard Dialog (input that would be lost) keeps the work in its first button, named for the work: 계속하기 under "나갈까요?" (with 나가기), 계속 작성 under the create wizards' "나갈까요?" (with 삭제하고 나가기), 계속 수정 under "수정을 그만둘까요?" (with 그만두기), 계속 입력 under "입력을 그만둘까요?" (the score keypad), 계속 확인 under "여기서 끝낼까요?"; never 취소 or 닫기 there. The kit's useEditGuardDialog and useLeaveGuardDialog hold the first two.
  12. One format per concept in code (2026-11-13). A day from a Date or an ISO timestamp is formatRelativeDate ("9월 19일"; the name is old, it is THE month-and-day formatter); minutes from midnight to "HH:MM" is minutesToTime (wraps past midnight); a range is formatTimeRange. Never common.monthDay(getMonth() + 1, getDate()) or padStart by hand. English counts go through enCount / enPlural, never n === 1 ? ... : .... The one named exception: the ui package's own HH:MM helpers (time-band-slider-math.ts, date-time-sheet-visual.ts) stay, because the kit cannot import @twomore/app.
  13. Numbers and separation: "47경기 중 4경기"; two or more facts are divided with "|", not commas or slashes.

Legal text (consent labels, policy articles) stays verbatim until counsel changes it.

Match outcome words (owner review 4, decision D5) ​

A match that does not end in a played score is recorded with one outcome. The Tag is neutral and weak; 일시 중단 alone is a warning, because it is the only outcome still waiting. Written scores follow the ATP and ITF form (6-4 3-1 기권, 6-4 3-1 ret.).

KoreanEnglishMeaningIn the recordRated
기권Retired (ret.)A side stopped after play began (injury, illness, gear, or leaving); the other side wins and the score so far stayscountsat the house half weight if either side has won 4 or more games, else not
부전승Walkover (W/O)A side did not come, before the first serve; the other side wins; no numeralscounts (configurable)never
실격DefaultA side was disqualified by the host or an official (a rule breach, or lateness past the limit)countsas 기권 if play started, else never
일시 중단SuspendedStopped for rain, light or time, with the score so far and a plan to resume; no winner yetnot yetnot yet
미완료Unfinished (abandoned)Stopped and not resumed; the score so far is kept; no winnerdoes not countno
취소됨CancelledThe match was not played; no numeralsdoes not countno
기록 제외Not countedTaken out of the record by rulingdoes not countno

In a person's own history the outcome reads from their side: 기권승 / 기권패, 부전승 / 부전패, 실격승 / 실격패. Only the first three have a winner, so only they get winner emphasis; 일시 중단, 미완료, 취소됨 and 기록 제외 never do. 부전승 is also the draw's bye (a slot with no opponent, see Key Business Terms): the draw word names a slot, the outcome word names a match, and the Tag appears only on a match. The rating weights are one config object (MATCH_OUTCOME_POLICY); this guide fixes the words, not the numbers. A cancelled match's Tag is 취소됨, the same word as the status rule ("취소됨, never bare 취소 as a state", UI Label Rules).

Score review words (owner review 5, honor system) ​

Any player of the match, the host or an official enters the score, and it is settled at once: nobody confirms it. A player may ask for a review; the host or an official decides. The words:

KoreanEnglishUse
검토 중Under reviewThe Tag of a score with an open review (warning, weak). The only result Tag besides 기록 제외 and the stop outcomes: a plain entered score has no Tag.
점수 검토 요청Ask for a reviewThe player's door on the Match state block and the title of the appeal sheet; its button is 검토 요청. Never 이의, never 분쟁: the player asks, nobody is accused.
점수 검토Review the scoreThe title of the host's review sheet; its list is 검토 N경기. The 할 일 row says 점수 검토 요청 and its Button is 검토 (the house style allows no bare 하기 there).
그대로 두기 · 이 점수로 바꾸기 · 점수 고치기Keep it · Use this score · Change the scoreThe host's three answers: keep the entered score (never 그대로 유지), take the one a player gave, or type another on the keypad. 기록에서 제외 is the fourth (a ruling): not a button of the sheet but the one row of its ⋯ menu, then a danger Dialog; the host restores it with 다시 기록에 넣기 (a toast, 기록에서 제외했어요).
점수 저장Save scoreThe one button of ScoreEntry for everyone who enters or changes a score (a stopped match's last button is named for the outcome, below).
경기 중단Stop matchThe tonal button beside 점수 저장 in ScoreEntry: it opens the stop steps. Never 경기 종료 (the ordinary end of every match) and never a sentence such as "경기를 끝까지 못 했나요?": a command is a Button.
기권 저장 · 부전승 저장 · 일시 중단 저장 · 취소 저장 · 실격 저장Save as retired · walkover · suspended · cancelled · defaultThe last button of the stop steps, named for the outcome (never a bare 저장). The rain outcome is 일시 중단 so it never collides with 경기 중단.

Retired as score states (the machine drops them; do not reuse them for a result): 확인 대기 (a result waiting for the other team; it survives only as the RSVP and dues state in Status Labels), 분쟁 (countered or disputed), 호스트 확정 (a host-set result is an attribution line, not a state) and 이의 접수 (a contested host result). 확정 is no longer a result Tag: an entered score is settled and shows none. Also retired in scoring copy: 확인 요청, 점수 확인, 동의 · 거절 on a score, 바로 확정, 모두 확정, 이의 있어요 and 수정 요청.


Live and tournament words (owner review 48, batch 4) ​

KoreanEnglishUse
LIVELiveThe scorecard's first tab: what is in play now.
진행 중Playing nowThe LIVE tab's head over the matches in play; each row's fact is its minutes (18분째), the Match state block's line 경기 18분째.
다음 경기Up nextThe matches that come next: the LIVE tab's head, the resting viewer's block (다음 경기 3번 코트, line 앞 경기 18분째예요) and the tournament console's queue. Never 대기 for a queue: 대기 is a held match's Tag.
예선 리그 · 본선Group stage · KnockoutA tournament's two stages. A group is A조 (a tournament's group, unrelated to a club's 조); a knockout round is 8강, 4강, 결승, the winner 우승. There is no 3·4위전 (Korean club tournaments share 공동 3위).
본선 진출ThroughA group table's rows going through, marked by the rank disc; the caption 1·2위가 본선에 올라요. 같은 승수면 승자승, 게임 득실 순이에요.
미정To be decidedA bracket slot not yet known; a bye's empty slot reads 부전승.
본선 대진 만들기Make the knockoutThe organizer's band once the 예선 is settled, behind a Dialog.
할 일TasksThe operator's inbox on 스코어카드 운영 (the header icon, spoken 할 일, N개): rows derived from the matches, never counted: 점수 입력 전 (대신 입력), 점수 검토 요청 (검토), a court past its time (N분째, 코트 보기), 입금 확인 전 N명 (참석자 관리). Empty: 처리할 일이 없어요.
늦게 온 선수 추가Add a latecomerA row of 스코어카드 운영's ⋯ (with 라운드 추가, 팀 바꾸기, 경기 규칙; before round 1 the ⋯ holds 대진 다시 짜기 instead); its Sheet's button 대진에 넣기.
스코어카드 운영Manage scorecardThe operator's page, the 스코어카드 with the operator layer (L3-39); replaces the name 대진표. Its Notices say a state (3라운드가 모두 끝났어요), never an instruction.
교체 영향 · 예비 선택What it changes · Pick a substituteThe 선수 교체 Sheet: the impact card per changed slot, and the second step that lists the confirmed players not placed (and 비우기).
오늘의 기록Your dayA finished session's recap Block on 스코어카드; its door 공유 opens 결과 공유 (이미지 저장 · 공유하기).

Tab Names (Bottom Navigation) ​

TabKoreanEnglishSub-tabsPurpose
1홈Home—Zone-based dashboard (Anchor/Context/Momentum/Community)
2클럽Clubs내 클럽 / 탐색Manage clubs + discover new ones
3경기Games예정 / 매치 찾기 / 테니스장Upcoming, pickups and venues
4기록Records순위표 / 전적 / 선수별 전적Leaderboard, match history, head-to-head
5프로필Profile—Profile with settings gear

Engineering Term Mapping ​

Code and comments use English. Korean terms appear only in src/config/i18n/.

Korean (UI)Engineering (code)Deprecated termsNotes
매치pickupmeets, bunggae, flash, 번개 (the UI word until 2026-10-29)Always pickup in code, types, variables, file names
일정 / 세션session—Korean UI shows "일정", code uses session
경기match—Single game within a session
클럽clubmoim (partially)Bottom tab label. moim still in some i18n keys
기록recordsranking, statsBottom tab. Use ranking only when specifically comparing rank
프로필profile나Bottom tab and profile routes

Action Verbs ​

ActionKoreanWhen
Join club가입하다Permanent membership
RSVP yes (attend)참석하다Confirming attendance — community-vernacular alignment (밴드 참석 문화)
RSVP no (decline)불참하다Declining attendance — natural opposite of 참석하다
Build the draw대진 짜기Match-generation CTA — 대진(noun) + 짜다(construct), replaces 경기 생성
Attendance stats출석출석률 (the measured show-up rate), 출석 현황 (the admin dashboard)
Involvement (not attendance)참여하다Taking part in matches; session attendance is 참석 even in achievements
Apply (needs approval)신청하다게스트 신청, 가입 신청
Create만들기클럽 만들기, 매치 만들기 (pickup), 일정 만들기
Edit수정하기Content editing
Change변경하다Settings, roles
Delete삭제하다Permanent removal

Status Labels ​

ContextKoreanEnglishNotes
Session open모집 중Recruiting
Session full마감Full
Session live진행 중In Progress
Session done완료Completed
RSVP yes참석 확정ConfirmedWas 참가 확정 — 참가 reserved for fee/tournament contexts (2026-07-29)
RSVP pending확인 대기Pending
Waitlisted예비 (N번)WaitlistedWas 대기 중 — 밴드 예비 문화; N번 is the queue-position sub
Declined불참Declined
Fee payment needed미납UnpaidWas 입금 필요 (송금 필요 before it) — § 1.19 money states (W4 batch 10)
Fee payment submitted확인 대기To confirmWas 입금 확인 중 — § 1.19; the Tag shortens to the board's 12 characters
Fee payment confirmed완납PaidWas 입금 완료 — § 1.19; a waived fee says 면제 (Waived)
Fee refund owed환불 대기Refund dueThe code's refundPendingBadge; never 환불 예정 as a state (a sentence may say 환불 예정이에요)
Fee refund confirmed환불 확인됨Refund ConfirmedrefundConfirmedBadge; the member confirms it with 환불 받았어요

Entities ​

KoreanEnglishCode KeyDescription
클럽ClubclubRegular tennis club with members, sessions, and dues
매치PickuppickupImpromptu game hosted by an individual; auto-creates a pickup club. Engineering term: pickup (deprecated: meets, bunggae)
모임(retired)—Formerly the umbrella concept for 클럽 + 매치; fully retired from UI copy (2026-08 sweep — i18n.test.ts bans the string outright). Use 클럽 or 매치 directly, or 일정 for the scheduled-gathering sense.
일정 / 세션Session—Scheduled gathering with date, time, courts, and RSVP
경기Match—Single game within a session on one court in one round
라운드Round—One rotation cycle where all courts play simultaneously
대진Bracket/Draw—Match assignments for a round
회비Dues—Monthly membership fee record for a member
납부 기록Payment Record—Audit trail entry for a dues payment
프로필Profile—User account with display name, avatar, global ELO
선수 통계Player Stats—Computed stats: win rate, streak, matches played
ELO 기록ELO history—Per-match ELO rating change log
클럽 순위Club rank—A member's rank in a club by their one ELO rating (the global rating filtered to club members); never a separate club rating
게스트 신청Guest Application—Non-member application to join a public session
로테이션 설정Rotation Config—Match generation settings (partner mode, bench mode, etc.)
챌린지Monthly Challenge—Client-side computed monthly goal with progress tracking
업적Achievement—Unlockable badge earned by reaching milestones
구독Subscription—Paid plan subscription (individual or club scope)
테니스장Venue—The facility (venues spine row); a 테니스장 contains one or more courts
코트Court—An individual numbered/named playing surface inside a 테니스장
초대 코드Invite Code—Code shared to let new members join a club
참석RSVP—Attendance confirmation for a session

Roles (ClubRole) ​

KoreanEnglishCode KeyPermissions
대표Ownerownermanage_club, manage_members, manage_schedule, manage_matches, manage_dues
총무Adminadminmanage_club, manage_members, manage_schedule, manage_dues
경기이사Match Directormatch_directormanage_matches, manage_schedule
멤버Membermember(none) — never 회원 in UI (2026-09-13)

Permissions (ClubPermission) ​

KoreanEnglishCode KeyDescription
클럽 관리Manage Clubmanage_clubEdit club settings and info
멤버 관리Manage Membersmanage_membersInvite, remove, change roles
일정 관리Manage Schedulemanage_scheduleCreate and edit sessions
경기 관리Manage Matchesmanage_matchesGenerate rounds, enter scores, rotation config
회비 관리Manage Duesmanage_duesCreate/mark dues, view payment history

Enums ​

Session Status (SessionStatus) ​

KoreanEnglishCode Key
임시저장Draftdraft
모집 중Openopen
마감Lockedlocked
진행 중In Progressin_progress
완료Completedcompleted
취소됨Cancelledcancelled

Session Format (SessionFormat) ​

KoreanEnglishCode Key
복식Doublesdoubles
단식Singlessingles
단식+복식Singles & Doublessingles_doubles
혼합복식Mixed Doublesmixed_doubles

Session Style (SessionStyle) — 경기 방식, the ELO-affecting axis (is_friendly) ​

Corrected 2026-09-18 (session-event-type-plan.md D5) — the type is only two values; the prior 토너먼트 row named a code key SessionStyle never carried (the type is 'social' | 'competitive', session.entity.ts), and 친목/실력별 had already drifted from the shipped labels (친선/경쟁, common.friendly/ common.competitive).

KoreanEnglishCode Key
친선Friendlysocial
경쟁Competitivecompetitive

Session Event Type (SessionEventType) — 경기 유형 (sessions.event_type) ​

Added 2026-09-18 (session-event-type-plan.md D1/D5). Not to be confused with Session Style above — 경기 유형 is WHAT the session is, 경기 방식 is HOW it plays. league/interclub are host-declared labels with no backing structure yet (R7 stays held); pickup is backstopped by a pickup-club trigger and never wizard-picked, tournament is stamped when a bracket attaches.

KoreanEnglishCode Key
정기Regularregular
매치Pickuppickup
대회Tournamenttournament
리그Leagueleague
대항전Club challengeinterclub

Benchmarked 2026-09-18 pm (session-event-type-plan.md D13) against USTA (leagues, flex leagues, ladders, mixers), LTA ClubSpark (box leagues, ladders), KTA/KATA 대회 divisions, Playtomic (open / competitive / tournament / clinic) and the Korean amateur vocabulary — the five values are the closed set. Every other real-world gathering is another AXIS or another PRODUCT, never a sixth value:

Real-world termIs
정모 / 정기 모임regular
교류전interclub + 경기 방식 친선
오픈 대회 / 동호인 대회tournament (the division — 국화부 · 개나리부 … — is bracket config)
박스리그 / 래더 / 라운드로빈대진 방식 (a draw or season structure under tournaments / R7)
게스트 데이regular + the session's guest-invite fields
믹스 소셜 / 랠리regular or pickup + 경기 방식 친선
레슨 / 클리닉not a session — a separate product in every benchmarked app; absent from the schema

Session Visibility (SessionVisibility) ​

KoreanEnglishCode Key
멤버 전용Members onlymembers_only
공개Publicpublic

Public Invite Approval (PublicInviteApproval) ​

KoreanEnglishCode Key
수동 승인Manualmanual
자동 승인Autoauto

RSVP Status (RsvpStatus) ​

KoreanEnglishCode Key
참석Confirmedconfirmed
예비Waitlistedwaitlisted
취소됨Cancelledcancelled
불참No Showno_show

Note: no_show also renders 불참 (a member who RSVP'd 참석 but didn't attend). This is a pre-existing label overlap with the RSVP-decline verb 불참하다 — both read as "not present," which is the intentional plain-Korean meaning in both cases (decline-before vs. absent-after), not a drift bug.

Match Status (MatchStatus) ​

KoreanEnglishCode Key
예정Scheduledscheduled
진행 중In Progressin_progress
완료Completedcompleted
취소됨Cancelledcancelled

Match Format (MatchFormat) ​

KoreanEnglishCode Key
단식Singlessingles
복식Doublesdoubles

Dues / Payment Status (PaymentStatus) ​

KoreanEnglishCode Key
미납Unpaidunpaid
납부 완료Paidpaid
일부 납부Partialpartial
면제Waivedwaived

Guest Application Status (GuestApplicationStatus) ​

KoreanEnglishCode Key
승인 대기Pendingpending
승인됨Approvedapproved
거절됨Rejectedrejected
취소됨Cancelledcancelled

Elo Tiers (EloTier) ​

KoreanEnglishCode KeyRange
초급Beginnerbeginner0-1200
중급Intermediateintermediate1201-1600
상급Advancedadvanced1601+

Rotation Engine ​

Partner Mode (PartnerMode) ​

KoreanEnglishCode Key
전체 로테이션Rotate Allrotate_all
고정 파트너Fixed Pairsfixed_pairs
실력 균형Skill Balancedskill_balanced
랜덤Randomrandom

Bench Mode (BenchMode) ​

KoreanEnglishCode Key
공정 로테이션Fair Rotationfair_rotation
자발적Volunteervolunteer
없음Nonenone

Rotation Presets ​

KoreanEnglishCode Key
친목Socialsocial
실력별Competitivecompetitive
고정 복식Fixed Doublesfixed_doubles
랜덤Randomrandom
친목 단식Singles Socialsingles_social
실력별 단식Singles Competitivesingles_competitive
랜덤 단식Singles Randomsingles_random

Tournament Types ​

KoreanEnglishCode Key
ATP 파이널스ATP Finalsatp_finals
스위스 시스템Swiss Systemswiss
나침반 드로Compass Drawcompass
싱글 엘리미네이션Single Eliminationsingle_elimination
조별리그 + 녹아웃Group + Knockoutgroup_knockout

Challenges & Achievements ​

Challenge Types (ChallengeType) ​

KoreanEnglishCode KeyCategory
경기 도전Match Challengematchesmatches
승리 도전Win Challengewinsmatches
연승 도전Streak Challengestreakmatches
연습 도전Practice Challengepracticeskills
단식 도전Try Singlestry_singlesskills
새 코트 방문Visit New Courtvisit_new_courtfitness
오픈 모임 참가Join Public Meetjoin_public_meetfitness
새 파트너 플레이Play with New Partnersplay_with_new_partnerssocial
친구 초대Invite Friendinvite_friendsocial

Challenge Categories (ChallengeCategory) ​

KoreanEnglishCode Key
경기Matchesmatches
기술Skillsskills
체력Fitnessfitness
소셜Socialsocial

Achievement Tiers (AchievementTier) ​

EnglishCode Key
Bronzebronze
Silversilver
Goldgold
Platinumplatinum

Achievement Categories (AchievementCategory) ​

EnglishCode Key
Matchesmatches
Winswins
Streaksstreaks
Eloelo
Socialsocial
Attendanceattendance
Specialspecial

Subscriptions ​

Plans (PlanType) ​

KoreanEnglishCode KeyScopeMonthly (KRW)
무료Freefreeindividual0
플레이어Playerplayerindividual4,900
베이직Basicbasicclub8,900
프로Proproclub18,900
클럽+Club Plusclub_plusclub37,900

Subscription Status (SubscriptionStatus) ​

EnglishCode Key
Activeactive
Trialingtrialing
Past Duepast_due
Cancelledcancelled
Expiredexpired

Discovery Filters ​

Region (Region) ​

KoreanEnglishCode Key
서울Seoulseoul
부산Busanbusan
대구Daegudaegu
인천Incheonincheon
광주Gwangjugwangju
대전Daejeondaejeon
울산Ulsanulsan
세종Sejongsejong
경기Gyeonggigyeonggi
강원Gangwongangwon
충북Chungbukchungbuk
충남Chungnamchungnam
전북Jeonbukjeonbuk
전남Jeonnamjeonnam
경북Gyeongbukgyeongbuk
경남Gyeongnamgyeongnam
제주Jejujeju

Court Surface Types ​

KoreanEnglishCode Key
하드Hardhard
클레이Clayclay
잔디Grassgrass
실내Indoorindoor
기타Otherother

Payment Methods ​

KoreanEnglish
계좌이체Bank Transfer
현금Cash
카카오페이KakaoPay
토스Toss

Key Business Terms ​

KoreanEnglishDescription
다붓이DabusiApp name, chosen 2026-10-14 -- 다붓이 "붙어 있는 정도가 매우 가깝게" (close together). The old name 투마 / TwoMore stays in code until the rename lands.
총무Chongmu / AdminClub administrator -- primary user persona
정모Regular MeetupRecurring scheduled session
매치PickupImpromptu pickup session (code key: pickup, deprecated: meets/bunggae)
공개 모집Public InviteOpening a session to non-member guest applications
응답 기한Response DeadlineAnswer-by time for member RSVP priority (was RSVP 마감/참석 마감 — RSVP-DEADLINE decision, 2026-09-24: never a cutoff — no server path rejects a member's RSVP after it, and once it passes any still-open seats also open to guests; see docs/canon/status-and-recruitment.md)
예비WaitlistQueue for when session is full (was 대기; 대기 now reserved for process-queuing, e.g. 입금 확인 중 is a state not a 대기 label)
회비 주기Dues CadenceCadence prefix on the dues label: 월 (monthly) / 분기 (quarterly) / 6개월 (semiannual, was 반기) / 연 (yearly)
벤치 / 쉼Bench / Sit-outRound where a player does not play (rotation fairness)
부전승ByeAutomatic advancement when no opponent (odd player count)
위안전ConsolationSecondary bracket for eliminated players (compass draw)
타이브레이크TiebreakTiebreak scoring when set reaches 6-6
연승Win StreakConsecutive wins
연패Loss StreakConsecutive losses
승률Win RateWins divided by total matches (0.0-1.0)

First Encounter (Jargon) ​

U-07b (usability audit 2026-09-16) ratified one grammar for a term a player meets with no prior context — never a bare word + number with no explanation nearby.

  1. A term with a dedicated explainer sheet (실력/티어 → TierInfoSheet; 신뢐 등급 → TrustTierInfoSheet) gets the one shared "?" trigger, InfoHintButton (@twomore/ui) beside its label on a wizard field (LabeledField's labelRight) — never a hand-rolled Pressable + Icon(Info). On a profile/records surface where the term's own fact/badge is already the tap target (EloFactRow, hero-card.tsx's tier-badge Pressable, the public/own-profile trust-tier cell/title-badge), the fact itself opens the sheet instead — a second sanctioned shape, not a gap.
  2. A term with no explainer sheet gets a one-line caption under its label (LabeledField's caption prop) on its FIRST wizard appearance — e.g. 구성 (glossary.composition, "남성, 여성, 혼합 중 누가 참여하는지예요"). Add a key only where a real call site consumes it — an unwired glossary entry is a dead i18n key (check:i18n-dead-keys). 로테이션 needed no entry: its one wizard-adjacent field (몇 명이서 step's duration control) already avoids the bare jargon word (labeled "한 경기 시간" / "직접 입력 (분)", never "로테이션").
  3. A read-only summary row (session detail's FactList, etc.) states the rule as a plain, self-explanatory VALUE — sessionDetail.specRotationValue(n) = "20분마다 교대" — never a bare number sitting next to an unexplained label. The label may still be the terse canonical word (로테이션); only the value must carry the explanation.
  4. 대항전 is the one word for cross-club competition; 인터클럽 is retired (it was the only category chip still in English-loanword form, inconsistent with the other twelve). Surfaces: signals.category.interclub, the Android notification channel name (notification.expo.ts), and the send-push edge function's mirrored category map (supabase/functions/send-push/notification-copy.ts) — all three must move together.
  5. D-day notation stays — native Korean usage, not jargon.

Rejected: tooltips (no hover on a touchscreen), a standalone glossary screen (usability audit: nobody opens one).

Markdown remains the source of truth. Run yarn docs:check before handoff.