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
leaderboardonly 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.mjsis 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 inscripts/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 and15,000 KRWin English, always throughformatCurrencyort().common.won: the sign₩is never written (lintno-inline-currency-formatover 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만원are20,000원and월 30,000원(formatCurrency, orformatWonOrFreewhere zero reads 무료;formatKRWis deleted,no-inline-currency-formatand 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 isformatVenueRating: always one decimal, 4.0. A time ago is N분 전 / N시간 전 / N일 전 (notifications.*Ago; English5m ago); the short chips (5분) are retired. A day read as history isformatPastDate: 11월 14일 within this year, 2025년 11월 14일 in an earlier one (formatRelativeDateis its yearless core; the ISO2026-11-14and the dotted2026.10.05are 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 isformatDuration: 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, anevent_typevalue) ≠ 토너먼트 (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_showoverlap 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-duplicatesnow 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일;
formatTimeRangeis the one time-range formatter, readingcommon.timeRange). One exception: a decimal rating band is notation, not prose —NTRP 3.0–3.5/UTR 5.0–8.0keep the en dash in both languages (the domain formatters inrating-region.config.ts/tier.config.ts/rating-scale-format.rules.tscannot read i18n, and were aligned on the en dash 2026-09-13 afterformatTierNtrpalone 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
VSofmatchup.vsbecomesvs). 대 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.5with 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 (formatUtrBanddeleted); 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 areadonly string[]leaf) rendered throughMetaSegments, or the leaf is rewritten as a sentence. Theno-middle-dot-joinrule 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-rolledn === 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 throughenMonthName(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.navCourtis 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:
- 해요체, with the past tense contracted: 됐어요, 바뀌었어요, 사라져요.
- Everyday words over Sino-Korean ones: 바뀌었어요 not 변경, 바로 not 즉시, 때 not 시점. Keep the Sino-Korean word where it is clearer (완납, 입금).
- Active voice: "복사할 수 있어요", not "복사돼요".
- Say what to do, in the positive: "기다려 주세요", not "닫지 마세요".
- Invite, don't command: state the fact or the result ("~면 ~돼요"); use "~해 주세요" only when the person must act.
- Don't repeat what the title already says.
- Read it aloud: one idea per sentence; split a long one.
- Auxiliary verbs are spaced ("해 주세요", "알려 드려요"), one way throughout.
- 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.
- Buttons and choices: never 취소 between two options; use 닫기 or 다음에.
- 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
useEditGuardDialoganduseLeaveGuardDialoghold the first two. - One format per concept in code (2026-11-13). A day from a
Dateor an ISO timestamp isformatRelativeDate("9월 19일"; the name is old, it is THE month-and-day formatter); minutes from midnight to "HH:MM" isminutesToTime(wraps past midnight); a range isformatTimeRange. Nevercommon.monthDay(getMonth() + 1, getDate())orpadStartby hand. English counts go throughenCount/enPlural, nevern === 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. - 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.).
| Korean | English | Meaning | In the record | Rated |
|---|---|---|---|---|
| 기권 | Retired (ret.) | A side stopped after play began (injury, illness, gear, or leaving); the other side wins and the score so far stays | counts | at 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 numerals | counts (configurable) | never |
| 실격 | Default | A side was disqualified by the host or an official (a rule breach, or lateness past the limit) | counts | as 기권 if play started, else never |
| 일시 중단 | Suspended | Stopped for rain, light or time, with the score so far and a plan to resume; no winner yet | not yet | not yet |
| 미완료 | Unfinished (abandoned) | Stopped and not resumed; the score so far is kept; no winner | does not count | no |
| 취소됨 | Cancelled | The match was not played; no numerals | does not count | no |
| 기록 제외 | Not counted | Taken out of the record by ruling | does not count | no |
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:
| Korean | English | Use |
|---|---|---|
| 검토 중 | Under review | The 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 review | The 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 score | The 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 score | The 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 score | The 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 match | The 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 · default | The 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)
| Korean | English | Use |
|---|---|---|
| LIVE | Live | The scorecard's first tab: what is in play now. |
| 진행 중 | Playing now | The 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 next | The 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 · Knockout | A 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위). |
| 본선 진출 | Through | A group table's rows going through, marked by the rank disc; the caption 1·2위가 본선에 올라요. 같은 승수면 승자승, 게임 득실 순이에요. |
| 미정 | To be decided | A bracket slot not yet known; a bye's empty slot reads 부전승. |
| 본선 대진 만들기 | Make the knockout | The organizer's band once the 예선 is settled, behind a Dialog. |
| 할 일 | Tasks | The 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 latecomer | A row of 스코어카드 운영's ⋯ (with 라운드 추가, 팀 바꾸기, 경기 규칙; before round 1 the ⋯ holds 대진 다시 짜기 instead); its Sheet's button 대진에 넣기. |
| 스코어카드 운영 | Manage scorecard | The 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 substitute | The 선수 교체 Sheet: the impact card per changed slot, and the second step that lists the confirmed players not placed (and 비우기). |
| 오늘의 기록 | Your day | A finished session's recap Block on 스코어카드; its door 공유 opens 결과 공유 (이미지 저장 · 공유하기). |
Tab Names (Bottom Navigation)
| Tab | Korean | English | Sub-tabs | Purpose |
|---|---|---|---|---|
| 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 terms | Notes |
|---|---|---|---|
| 매치 | pickup | meets, 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 |
| 클럽 | club | moim (partially) | Bottom tab label. moim still in some i18n keys |
| 기록 | records | ranking, stats | Bottom tab. Use ranking only when specifically comparing rank |
| 프로필 | profile | 나 | Bottom tab and profile routes |
Action Verbs
| Action | Korean | When |
|---|---|---|
| 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
| Context | Korean | English | Notes |
|---|---|---|---|
| Session open | 모집 중 | Recruiting | |
| Session full | 마감 | Full | |
| Session live | 진행 중 | In Progress | |
| Session done | 완료 | Completed | |
| RSVP yes | 참석 확정 | Confirmed | Was 참가 확정 — 참가 reserved for fee/tournament contexts (2026-07-29) |
| RSVP pending | 확인 대기 | Pending | |
| Waitlisted | 예비 (N번) | Waitlisted | Was 대기 중 — 밴드 예비 문화; N번 is the queue-position sub |
| Declined | 불참 | Declined | |
| Fee payment needed | 미납 | Unpaid | Was 입금 필요 (송금 필요 before it) — § 1.19 money states (W4 batch 10) |
| Fee payment submitted | 확인 대기 | To confirm | Was 입금 확인 중 — § 1.19; the Tag shortens to the board's 12 characters |
| Fee payment confirmed | 완납 | Paid | Was 입금 완료 — § 1.19; a waived fee says 면제 (Waived) |
| Fee refund owed | 환불 대기 | Refund due | The code's refundPendingBadge; never 환불 예정 as a state (a sentence may say 환불 예정이에요) |
| Fee refund confirmed | 환불 확인됨 | Refund Confirmed | refundConfirmedBadge; the member confirms it with 환불 받았어요 |
Entities
| Korean | English | Code Key | Description |
|---|---|---|---|
| 클럽 | Club | club | Regular tennis club with members, sessions, and dues |
| 매치 | Pickup | pickup | Impromptu 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)
| Korean | English | Code Key | Permissions |
|---|---|---|---|
| 대표 | Owner | owner | manage_club, manage_members, manage_schedule, manage_matches, manage_dues |
| 총무 | Admin | admin | manage_club, manage_members, manage_schedule, manage_dues |
| 경기이사 | Match Director | match_director | manage_matches, manage_schedule |
| 멤버 | Member | member | (none) — never 회원 in UI (2026-09-13) |
Permissions (ClubPermission)
| Korean | English | Code Key | Description |
|---|---|---|---|
| 클럽 관리 | Manage Club | manage_club | Edit club settings and info |
| 멤버 관리 | Manage Members | manage_members | Invite, remove, change roles |
| 일정 관리 | Manage Schedule | manage_schedule | Create and edit sessions |
| 경기 관리 | Manage Matches | manage_matches | Generate rounds, enter scores, rotation config |
| 회비 관리 | Manage Dues | manage_dues | Create/mark dues, view payment history |
Enums
Session Status (SessionStatus)
| Korean | English | Code Key |
|---|---|---|
| 임시저장 | Draft | draft |
| 모집 중 | Open | open |
| 마감 | Locked | locked |
| 진행 중 | In Progress | in_progress |
| 완료 | Completed | completed |
| 취소됨 | Cancelled | cancelled |
Session Format (SessionFormat)
| Korean | English | Code Key |
|---|---|---|
| 복식 | Doubles | doubles |
| 단식 | Singles | singles |
| 단식+복식 | Singles & Doubles | singles_doubles |
| 혼합복식 | Mixed Doubles | mixed_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).
| Korean | English | Code Key |
|---|---|---|
| 친선 | Friendly | social |
| 경쟁 | Competitive | competitive |
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.
| Korean | English | Code Key |
|---|---|---|
| 정기 | Regular | regular |
| 매치 | Pickup | pickup |
| 대회 | Tournament | tournament |
| 리그 | League | league |
| 대항전 | Club challenge | interclub |
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 term | Is |
|---|---|
| 정모 / 정기 모임 | 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)
| Korean | English | Code Key |
|---|---|---|
| 멤버 전용 | Members only | members_only |
| 공개 | Public | public |
Public Invite Approval (PublicInviteApproval)
| Korean | English | Code Key |
|---|---|---|
| 수동 승인 | Manual | manual |
| 자동 승인 | Auto | auto |
RSVP Status (RsvpStatus)
| Korean | English | Code Key |
|---|---|---|
| 참석 | Confirmed | confirmed |
| 예비 | Waitlisted | waitlisted |
| 취소됨 | Cancelled | cancelled |
| 불참 | No Show | no_show |
Note:
no_showalso 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)
| Korean | English | Code Key |
|---|---|---|
| 예정 | Scheduled | scheduled |
| 진행 중 | In Progress | in_progress |
| 완료 | Completed | completed |
| 취소됨 | Cancelled | cancelled |
Match Format (MatchFormat)
| Korean | English | Code Key |
|---|---|---|
| 단식 | Singles | singles |
| 복식 | Doubles | doubles |
Dues / Payment Status (PaymentStatus)
| Korean | English | Code Key |
|---|---|---|
| 미납 | Unpaid | unpaid |
| 납부 완료 | Paid | paid |
| 일부 납부 | Partial | partial |
| 면제 | Waived | waived |
Guest Application Status (GuestApplicationStatus)
| Korean | English | Code Key |
|---|---|---|
| 승인 대기 | Pending | pending |
| 승인됨 | Approved | approved |
| 거절됨 | Rejected | rejected |
| 취소됨 | Cancelled | cancelled |
Elo Tiers (EloTier)
| Korean | English | Code Key | Range |
|---|---|---|---|
| 초급 | Beginner | beginner | 0-1200 |
| 중급 | Intermediate | intermediate | 1201-1600 |
| 상급 | Advanced | advanced | 1601+ |
Rotation Engine
Partner Mode (PartnerMode)
| Korean | English | Code Key |
|---|---|---|
| 전체 로테이션 | Rotate All | rotate_all |
| 고정 파트너 | Fixed Pairs | fixed_pairs |
| 실력 균형 | Skill Balanced | skill_balanced |
| 랜덤 | Random | random |
Bench Mode (BenchMode)
| Korean | English | Code Key |
|---|---|---|
| 공정 로테이션 | Fair Rotation | fair_rotation |
| 자발적 | Volunteer | volunteer |
| 없음 | None | none |
Rotation Presets
| Korean | English | Code Key |
|---|---|---|
| 친목 | Social | social |
| 실력별 | Competitive | competitive |
| 고정 복식 | Fixed Doubles | fixed_doubles |
| 랜덤 | Random | random |
| 친목 단식 | Singles Social | singles_social |
| 실력별 단식 | Singles Competitive | singles_competitive |
| 랜덤 단식 | Singles Random | singles_random |
Tournament Types
| Korean | English | Code Key |
|---|---|---|
| ATP 파이널스 | ATP Finals | atp_finals |
| 스위스 시스템 | Swiss System | swiss |
| 나침반 드로 | Compass Draw | compass |
| 싱글 엘리미네이션 | Single Elimination | single_elimination |
| 조별리그 + 녹아웃 | Group + Knockout | group_knockout |
Challenges & Achievements
Challenge Types (ChallengeType)
| Korean | English | Code Key | Category |
|---|---|---|---|
| 경기 도전 | Match Challenge | matches | matches |
| 승리 도전 | Win Challenge | wins | matches |
| 연승 도전 | Streak Challenge | streak | matches |
| 연습 도전 | Practice Challenge | practice | skills |
| 단식 도전 | Try Singles | try_singles | skills |
| 새 코트 방문 | Visit New Court | visit_new_court | fitness |
| 오픈 모임 참가 | Join Public Meet | join_public_meet | fitness |
| 새 파트너 플레이 | Play with New Partners | play_with_new_partners | social |
| 친구 초대 | Invite Friend | invite_friend | social |
Challenge Categories (ChallengeCategory)
| Korean | English | Code Key |
|---|---|---|
| 경기 | Matches | matches |
| 기술 | Skills | skills |
| 체력 | Fitness | fitness |
| 소셜 | Social | social |
Achievement Tiers (AchievementTier)
| English | Code Key |
|---|---|
| Bronze | bronze |
| Silver | silver |
| Gold | gold |
| Platinum | platinum |
Achievement Categories (AchievementCategory)
| English | Code Key |
|---|---|
| Matches | matches |
| Wins | wins |
| Streaks | streaks |
| Elo | elo |
| Social | social |
| Attendance | attendance |
| Special | special |
Subscriptions
Plans (PlanType)
| Korean | English | Code Key | Scope | Monthly (KRW) |
|---|---|---|---|---|
| 무료 | Free | free | individual | 0 |
| 플레이어 | Player | player | individual | 4,900 |
| 베이직 | Basic | basic | club | 8,900 |
| 프로 | Pro | pro | club | 18,900 |
| 클럽+ | Club Plus | club_plus | club | 37,900 |
Subscription Status (SubscriptionStatus)
| English | Code Key |
|---|---|
| Active | active |
| Trialing | trialing |
| Past Due | past_due |
| Cancelled | cancelled |
| Expired | expired |
Discovery Filters
Region (Region)
| Korean | English | Code Key |
|---|---|---|
| 서울 | Seoul | seoul |
| 부산 | Busan | busan |
| 대구 | Daegu | daegu |
| 인천 | Incheon | incheon |
| 광주 | Gwangju | gwangju |
| 대전 | Daejeon | daejeon |
| 울산 | Ulsan | ulsan |
| 세종 | Sejong | sejong |
| 경기 | Gyeonggi | gyeonggi |
| 강원 | Gangwon | gangwon |
| 충북 | Chungbuk | chungbuk |
| 충남 | Chungnam | chungnam |
| 전북 | Jeonbuk | jeonbuk |
| 전남 | Jeonnam | jeonnam |
| 경북 | Gyeongbuk | gyeongbuk |
| 경남 | Gyeongnam | gyeongnam |
| 제주 | Jeju | jeju |
Court Surface Types
| Korean | English | Code Key |
|---|---|---|
| 하드 | Hard | hard |
| 클레이 | Clay | clay |
| 잔디 | Grass | grass |
| 실내 | Indoor | indoor |
| 기타 | Other | other |
Payment Methods
| Korean | English |
|---|---|
| 계좌이체 | Bank Transfer |
| 현금 | Cash |
| 카카오페이 | KakaoPay |
| 토스 | Toss |
Key Business Terms
| Korean | English | Description |
|---|---|---|
| 다붓이 | Dabusi | App name, chosen 2026-10-14 -- 다붓이 "붙어 있는 정도가 매우 가깝게" (close together). The old name 투마 / TwoMore stays in code until the rename lands. |
| 총무 | Chongmu / Admin | Club administrator -- primary user persona |
| 정모 | Regular Meetup | Recurring scheduled session |
| 매치 | Pickup | Impromptu pickup session (code key: pickup, deprecated: meets/bunggae) |
| 공개 모집 | Public Invite | Opening a session to non-member guest applications |
| 응답 기한 | Response Deadline | Answer-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) |
| 예비 | Waitlist | Queue for when session is full (was 대기; 대기 now reserved for process-queuing, e.g. 입금 확인 중 is a state not a 대기 label) |
| 회비 주기 | Dues Cadence | Cadence prefix on the dues label: 월 (monthly) / 분기 (quarterly) / 6개월 (semiannual, was 반기) / 연 (yearly) |
| 벤치 / 쉼 | Bench / Sit-out | Round where a player does not play (rotation fairness) |
| 부전승 | Bye | Automatic advancement when no opponent (odd player count) |
| 위안전 | Consolation | Secondary bracket for eliminated players (compass draw) |
| 타이브레이크 | Tiebreak | Tiebreak scoring when set reaches 6-6 |
| 연승 | Win Streak | Consecutive wins |
| 연패 | Loss Streak | Consecutive losses |
| 승률 | Win Rate | Wins 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.
- 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'slabelRight) — never a hand-rolledPressable+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-badgePressable, the public/own-profile trust-tier cell/title-badge), the fact itself opens the sheet instead — a second sanctioned shape, not a gap. - A term with no explainer sheet gets a one-line
captionunder its label (LabeledField'scaptionprop) 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 "로테이션"). - 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. - 대항전 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. - 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).