Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
afad13e
chore: 국제화 라이브러리 설치
useon Sep 16, 2025
c8cfc46
feat: i18next 초기화 및 언어 감지/HTTP 백엔드 설정
useon Sep 16, 2025
9accb6f
feat: 국제화 라우팅 래퍼 생성
useon Sep 16, 2025
f300703
feat: 중첩 라우팅 구조로 변경 및 국제화 라우팅 래퍼 적용
useon Sep 16, 2025
595e717
chore: 필요한 바벨 설정 및 스크립트 추가
useon Oct 7, 2025
7882759
feat: 파일 관련 유틸 생성
useon Oct 7, 2025
8a89637
feat: ATS 관련 및 국제화 훅 추가, t wrapper 유틸 생성
useon Oct 7, 2025
b859bc9
feat: 한글 키를 기준으로 각 언어 JSON에 키 추가 유틸 생성
useon Oct 7, 2025
4bc7525
feat: React 컴포넌트의 한글 텍스트 자동 변환 기능 구현
useon Oct 7, 2025
5f02869
fix: 테스트 파일과 스토리북 파일이 포함되는 문제 해결
useon Oct 7, 2025
c0eb304
refactor: 컴포넌트 판별 로직을 분리하여 여러 형태에 대응할 수 있도록 수정
useon Oct 8, 2025
87e9a1c
feat: 템플릿 리터럴 자동 변환 및 키 추출 기능 구현
useon Nov 19, 2025
52e7622
refactor: 컴포넌트 내부에 있는 한글 문자열만 변환되도록 수정
useon Nov 21, 2025
21ee43c
refactor: 복잡한 확장자 처리를 위한 라이브러리 사용으로 더이상 사용하지 않는 확장자 찾는 함수 삭제
useon Nov 21, 2025
8ff5e40
fix: ts-node 실행 오류 해결 및 tsx 기반으로 스크립트 전환
useon Dec 1, 2025
f4ee51c
Merge branch 'develop' of https://github.com/debate-timer/debate-time…
useon Dec 8, 2025
9914402
refactor: 불필요한 주석 삭제
useon Dec 8, 2025
dd3fa50
feat: 언어셀렉터 추가
useon Dec 26, 2025
197e441
refactor: 언어 라우팅 로직 분리 및 유틸 추가
useon Dec 29, 2025
887458f
refactor: prop default 값의 한글이 번역되지 않아 컴포넌트 구조 수정
useon Dec 29, 2025
4701c69
refactor: br태그로 인해 번역키가 쪼개져 번역 어순 문제가 발생해 하나의 번역키가 되도록 \n구조로 수정
useon Dec 29, 2025
fcfe9d4
refactor: 현재 사용하지 않는 컴포넌트와 유틸 삭제
useon Dec 29, 2025
cbfb9b8
fix: prettier로 인해 줄바꿈이 되어 번역 키에 공백이 들어가는 문제 해결
useon Dec 29, 2025
fef0a0f
fix: 언어 라우팅 리다이렉트 시 쿼리스트링 유지가 안되는 문제 해결
useon Dec 29, 2025
6e51d9d
fix: 템플릿 리터럴에서 escape 문자가 포함된 한글 문자열 처리 오류 수정
useon Dec 29, 2025
8ca75ce
refactor: i18n자동화를 이용해서 컴포넌트 변환, import 및 hook 추가
useon Jan 27, 2026
4358d8e
feat: i18n 자동화를 적용한 언어별 key, value 생성
useon Jan 27, 2026
5e096bf
Merge branch 'develop' of https://github.com/debate-timer/debate-time…
useon Jan 27, 2026
c8beb3f
refactor: 언어 라우팅 쿼리 유지 및 경로 전환 문제 해결
useon Jan 27, 2026
0f68fa1
refactor: 발언 유형 관련 로직 유틸화
useon Jan 27, 2026
372fa18
feat: develop 병합으로 인한 새로운 키 추가
useon Jan 27, 2026
eb99216
refactor: Neutral오타 수정
useon Feb 3, 2026
302f617
refactor: 에러메세지 추가 및 동사형으로 투표완료 번역 내용 수정
useon Feb 3, 2026
f73ade7
fix: 한글 에러 메세지가 그대로 들어오는 경우 번역 안되는 문제 해결
useon Feb 3, 2026
50b96a8
refactor: 단수, 복수 구분되도록 i18n Plurals 규칙 적용
useon Feb 3, 2026
69b0ae7
refactor: 투표 인원 카운트와 단위 사이에 공백 추가 및 투표 인원이 중복돼서 나오는 문제 수정
useon Feb 3, 2026
486a574
refactor: 경로 하드코딩을 언어 경로 라우팅 buildLangPath 이용하여 정리
useon Feb 3, 2026
ddb54e6
fix: 개발환경에서도 설정한 base url이 들어갈 수 있도록 수정하여 개발환경에서 시간표 공유 오류 해결
useon Feb 3, 2026
88976f4
refactor: 줄바꿈 설정 빠진 부분 수정
useon Feb 3, 2026
a5e35f3
refactor: 발언자 길이 검증 로직 일관적이게 수정
useon Feb 3, 2026
5468e74
refactor: 상수라서 번역 안되던 부분 번역
useon Feb 3, 2026
bdb2459
refactor: 띄어쓰기 적용 안 된 번역키 수정
useon Feb 3, 2026
b911eda
refactor: 종소리 설정 대문자 시작으로 수정
useon Feb 3, 2026
006c2cc
refactor: 불필요한 코드 삭제
useon Feb 3, 2026
39de0dd
refactor: 언어 선택 핸들러에 셀렉터 닫는 코드도 함께 넣도록 수정
useon Feb 3, 2026
b89265e
refactor: 종소리 라벨 번역 및 시간 표기 띄어쓰기 추가
useon Feb 3, 2026
b16f675
refactor: tailwind 오타 수정
useon Feb 3, 2026
05e359a
refactor: 루트 경로 비교 시 trailing slash 처리하는 정규화 추가
useon Feb 5, 2026
6304306
refactor: 자유토론 편집 시 입력 무시되는 문제를 TIME_BASED를 입력값 우선으로 처리하도록 해결
useon Feb 5, 2026
f1bd2d8
refactor: 중립 라벨 번역 추가
useon Feb 5, 2026
bd742e4
fix: 국제화 코드 추가로 인한 테스트 코드 수정
useon Feb 5, 2026
83956a5
test: MSW 번역 핸들러에 실제 문자열 응답 추가
useon Feb 5, 2026
9f5cd5c
test: i18n locale 고정, 라우트 추가
useon Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
252 changes: 252 additions & 0 deletions public/locales/en/translation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
{
"모달 닫기": "Close modal",
"유효하지 않은 투표 링크입니다.": "Invalid vote link.",
"승패투표": "Win/Loss Vote",
"참여자 :": "Participants:",
"찬성팀": "Affirmative Team",
"반대팀": "Negative Team",
"투표완료": "Submit vote",
"다시 투표하기": "Vote again",
"제출하기": "Submit",
"투표를 제출하시겠습니까?": "Submit your vote?",
"(제출 후에는 변경이 불가능 합니다.)": "(You cannot change it after submitting.)",
"투표가 완료되었습니다.": "Your vote has been submitted.",
"테이블 이름 없음": "Unnamed table",
"주제 없음": "No Topic",
"도움말": "Help",
"전체 화면": "Fullscreen",
"테이블 ID가 올바르지 않습니다.": "Invalid table ID.",
"공유받은 테이블을 저장하지 못했어요.": "Couldn't save the shared table.",
"테이블 데이터를 확인할 수 없어요.": "Can't find the table data.",
"공유된 데이터가 비어 있어요.": "Shared data is empty.",
"공유된 토론 테이블을 DB에 저장하지 못했어요.": "Couldn't save the shared debate table to the database.",
"데이터를 처리하고 있습니다...": "Processing data...",
"공유받은 데이터 처리에 실패했어요.": "Failed to process the shared data.",
"팀 선정하기": "Select teams",
"토론하기": "Start debate",
"토론 시간표를 선택해주세요": "Please select a debate schedule",
"테이블 모드가 올바르지 않습니다.": "Invalid table mode.",
"시간표 1": "Schedule 1",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

번역: 다른 번역 제안

'시간표'라는 단어를 번역한 'schedule'은 시간표보다는 일정의 느낌이 더 강하게 느껴집니다. 개인적으로는 'timetable'이 조금 더 잘 어울리지 않을까 싶어요.

"찬성": "Affirmative",
"반대": "Negative",
"시간표 정보를 불러오지 못했어요.\n다시 시도할까요?": "Couldn't load the schedule.\nTry again?",
"무승부": "Tie",
"유효하지 않은 투표 결과 링크입니다.": "Invalid vote result link.",
"세부 결과 확인하기": "View detailed results",
"아니오": "No",
"네": "Yes",
"정말로 세부 결과를 공개할까요?": "Show detailed results?",
"토론을 모두 마치셨습니다": "You have finished the debate",
"박수": "Applause",
"피드백 타이머": "Feedback Timer",
"심사평 및 Q&A용 타이머 →": "Timer for feedback & Q&A →",
"피드백 타이머로 이동": "Go to Feedback Timer",
"승패투표 진행하기": "Start Win/Loss Vote",
"QR 코드를 통해 투표 페이지로 이동해요.": "Go to the voting page via QR code.",
"승패투표 생성 및 진행": "Create and run Win/Loss Vote",
"스캔해 주세요!": "Please scan!",
"참여자": "Participants",
"등록된 토론자가 없어요.": "No debaters registered.",
"투표 결과 보기": "View vote results",
"QR 코드를 불러오지 못했어요.\n다시 시도하시겠어요?": "Couldn't load the QR code.\nTry again?",
"링크가 클립보드에 복사됨": "Link copied to clipboard",
"링크 준비 중": "Preparing link",
"공유 링크 복사": "Copy share link",
"이전 차례": "Previous turn",
"다음 차례": "Next turn",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

번역: 다른 표현 제안

'차례'라는 한국어 표현을 직역해서 'turn'이라는 결과물이 나온 것 같습니다. 그러나 저는 이 단어가 다소 어색하게 느껴지는데요. 그 이유는 'turn'이라는 표현은 누구의 차례인지에 초점이 맞춰져 있는데, 토론은 입론/반론 등 다양한 역할을 수행해야 하기에 누구의 차례인지보다는 무엇을 해야 하는지가 더 중요하다고 생각하기 때문이에요.

따라서 'turn'보다는 'phase'를 제안해봅니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

번역과 관련된 부분은 이번 PR말고 전체 검토 후 한번에 바꾸도록 하겠습니다! 남겨주셔서 참고하는데 도움이 될 것 같아요. 감사합니다 ☺️

"토론 종료": "End debate",
"알림 개수_one": "{{displayCount}} notification",
"알림 개수_other": "{{displayCount}} notifications",
"{{team}} 팀": "{{team}} team",
"데이터를 불러오고 있습니다...": "Loading data...",
"토론 종료 화면으로 돌아가기": "Back to debate end screen",
"데이터를 불러오지 못했어요.\n다시 시도할까요?": "Couldn't load the data.\nTry again?",
"다시 시도하기": "Try again",
"페이지를 찾을 수 없어요...": "Page not found...",
"요청 URL": "Requested URL",
"오류 내용": "Error details",
"요청하신 페이지를 찾을 수 없어요.\n홈 화면으로 돌아가 처음부터 다시 시도해주세요.": "Couldn't find the page you requested.\nPlease return to Home and try again.",
"홈으로 돌아가기": "Go to Home",
"{{status}} 오류": "{{status}} Error",
"오류가 발생했어요...": "Something went wrong...",
"스택": "Stack",
"선택": "Select",
"타이머 초기화": "Reset timer",
"일시정지": "Pause",
"재생": "Play",
"A키": "A key",
"L키": "L key",
"전체 시간": "Total time",
"현재 시간": "Current time",
"팀": "Team",
"토론자": "Debater",
"작전 시간 사용": "Use Prep Time",
"토론을 끝내셨군요!\n지금까지의 시간표를 로그인하고 저장할까요?": "You've finished the debate!\nLog in to save your schedule so far?",
"자유토론 타이머 조작": "Open Debate Timer Controls",
"재생 버튼을 눌러 타이머를 시작": "Press Play to start the timer",
"타이머가 동작 중일 때, 일시정지 버튼을 눌러 타이머를 일시정지": "When the timer is running, press Pause to pause it",
"초기화 버튼을 눌러 타이머를 원래 시간으로 초기화": "Press Reset to restore the timer to its original time",
"마우스를 사용하여 타이머를 클릭 시, 진영 변경": "Click the timer with the mouse to switch Stance",
"타이머 동작 중 진영이 변경될 경우, 상대 진영의 타이머로 전환과 동시에 시작": "When Stance changes while running, switch to the other side's timer and start immediately",
"일반 토론 타이머 조작": "Standard Debate Timer Controls",
"작전 시간 사용 버튼을 눌러 별도의 작전 시간 타이머 사용 가능": "Press Use Prep Time to use a separate Prep Time timer",
"키보드 조작": "Keyboard controls",
"스페이스 바로 타이머를 시작 및 일시정지": "Use the Spacebar to start/pause the timer",
"R 키로 타이머 초기화": "Use R to reset the timer",
"좌우 방향키로 이전/다음 차례로 이동": "Use Left/Right arrows to go to the previous/next turn",
"A/L 키로 토론 진영 변경": "Use A/L to switch Stance",
"Enter 키로 상대 진영으로 변경": "Use Enter to switch to the opposing Stance",
"화면 우측 상단 헤더의 전체 화면 버튼 <0/> 으로 활성화": "Activate fullscreen with the header button <0/> in the top right",
"화면 우측 상단 헤더의 전체 화면 닫기 버튼 <0/> 또는 ESC 키를 눌러 전체 화면 비활성화": "Exit fullscreen with the header close button <0/> or press ESC",
"닫기": "Close",
"작전 시간": "Prep Time",
"-1분": "-1 min",
"-30초": "-30 sec",
"+30초": "+30 sec",
"+1분": "+1 min",
"-5분": "-5 min",
"+5분": "+5 min",
"비회원 상태로 토론하기": "Debate as guest",
"저장하기": "Save",
"공유받은 토론 시간표를 내 시간표 목록에 저장하시겠어요?": "Save the shared debate schedule to my schedules?",
"수정하기": "Edit",
"삭제하기": "Delete",
"공유하기": "Share",
"주제 | ": "Topic | ",
"취소": "Cancel",
"삭제": "Delete",
"테이블을 삭제하시겠습니까?": "Delete this table?",
"타이머 화면": "Timer screen",
"원하는 때에\n작전 시간 사용하기": "Use Prep Time\nwhenever you need it",
"토론자가 작전 시간을\n요청하면 <0/>\n버튼을 눌러 시간을 사용해요": "If a debater requests Prep Time\npress <0/>\nto use time",
"작전 시간이 나타나면\n원하는 시간을 입력하세요!": "When Prep Time appears,\nenter the time you want!",
"키보드 방향키로\n더 편리한 조작": "More convenient control\nwith arrow keys",
"시간표 설정화면": "Schedule setup screen",
"간편한 시간표 구성": "Simple schedule setup",
"시간표 추가": "Add schedule",
"시간표 추가 버튼": "Add schedule button",
"두가지 타이머": "Two timers",
"일반형과 자유토론형 타이머로\n다양한 토론 방식을 지원해요.": "Support various debate formats\nwith Standard and Open Debate timers.",
"종소리 설정": "Bell settings",
"시간에 따른 종소리를 내마음대로\n커스터마이징 할 수 있어요.": "Customize the bell by time\nhowever you like.",
"다양한 토론 템플릿을 원클릭으로 만나보세요!": "Explore various debate templates with one click!",
"{{title}} 로고": "{{title}} logo",
"{{label}} 토론하기": "Debate {{label}}",
"템플릿 신청하기": "Request a template",
"새로운 템플릿도 신청해 볼까요?": "Want to request a new template too?",
"신청하기": "Apply",
"홈 | 설정": "Home | Settings",
"토론 정보\n관리 및 기록": "Debate info\nManagement and records",
"토론 기본 정보 설정": "Set debate basics",
"시간표 이름부터 주제까지!": "From schedule name to Topic!",
"시간표 목록": "Schedule list",
"내가 만든 시간표를 저장하고 싶나요?": "Want to save the schedules you made?",
"시간표를 저장하려면,\n디베이트 타이머에 로그인해 보세요!": "To save your schedule,\nplease log in to Debate Timer!",
"3초 로그인 하기": "3-second login",
"아래로 스크롤": "Scroll down",
"이미 많은 사람들이 디베이트 타이머로\n더 나은 토론환경을 만들고 있어요.": "Many people already use Debate Timer\nto create a better debate environment.",
"비회원으로 시작하기": "Start as guest",
"버그 및 불편사항 제보": "Report bugs or issues",
"디베이트 타이머 사용 중 불편함을 느끼셨나요?": "Did you run into issues while using Debate Timer?",
"접수하기": "Submit",
"디베이트 타이머": "Debate Timer",
"개인정보처리방침": "Privacy Policy",
"서비스 이용약관": "Terms of Service",
"브라우저에서 비디오를 지원하지 않습니다.": "Your browser does not support video.",
"토론 진행을 더 쉽고 빠르게": "Run debates easier and faster",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

번역: 다른 표현 제안

"Run debates"라는 표현은 '토론을 실행하다'라는 느낌이 나서 뭔가 너무 컴퓨터공학적이고 딱딱해 보여요. Gemini에게 몇 가지 후보를 물어보았는데 다음 2가지를 추가로 제안해봅니다:

  • "Streamline your debates."
  • "Debate, made easier and faster"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

번역과 관련된 부분은 이번 PR말고 전체 검토 후 한번에 바꾸도록 하겠습니다! 남겨주셔서 참고하는데 도움이 될 것 같아요. 감사합니다 ☺️

"대시보드로 이동": "Go to Dashboard",
"3초 로그인": "3-second login",
"로그아웃": "Log out",
"왕관": "Crown",
"투표 세부 결과": "Detailed vote results",
"명_one": " person",
"명_other": " people",
"시간표로 돌아가기": "Back to schedule",
"비회원 모드": "Guest mode",
"홈으로 이동": "Go to Home",
"로그인": "Log in",
"비회원으로 사용하던 시간표가 있습니다.\n로그인 후에도 이 시간표를 계속 사용하시겠습니까?": "You have schedules created in guest mode.\nDo you want to keep using them after you log in?",
"언어 선택": "Select language",
"팀별로\n동전의 앞 / 뒷면 중\n하나를 선택해 주세요.": "For each team,\nchoose heads or tails\non the coin.",
"동전": "Coin",
"동전 던지는 중...": "Flipping coin...",
"앞": "Heads",
"뒤": "Tails",
"동전 던지기": "Flip coin",
"토론 정보 수정하기": "Edit debate info",
"토론 바로 시작하기": "Start debate now",
"입론": "Constructive",
"반론": "Rebuttal",
"최종발언": "Final Focus",
"작전시간": "Prep Time",
"교차조사": "Cross Fire",
"직접입력": "Custom",
"발언 시간은 1초 이상이어야 해요.": "Speaking Time must be at least 1 second.",
"종료 전 타종은 발언 시간보다 길 수 없어요.": "The bell before the end cannot be longer than the Speaking Time.",
"팀당 발언 시간은 1초 이상이어야 해요.": "Speaking Time per team must be at least 1 second.",
"1회당 발언 시간은 팀당 발언 시간을 초과할 수 없어요.": "Speaking Time per turn cannot exceed the team's total Speaking Time.",
"발언 유형은 최대 10자까지 입력할 수 있습니다.": "Speech Type can be up to 10 characters.",
"발언자는 최대 5자까지 입력할 수 있습니다.": "Speaker can be up to 5 characters.",
"1회당 발언 시간은 팀당 총 발언 시간보다 클 수 없습니다.": "Per-turn Speaking Time cannot exceed the total team Speaking Time.",
"발언 유형을 입력해주세요.": "Please enter a Speech Type.",
"자유토론": "Open Debate",
"중립은 발언 유형이 '직접 입력'일 경우에만 선택할 수 있습니다.": "Neutral can only be selected when Speech Type is 'Custom'.",
"중립": "Neutral",
"일반 타이머": "Standard timer",
"자유토론 타이머": "Open Debate timer",
"한 팀의 발언 시간이 세팅된 일반적인 타이머": "A standard timer with a single team's Speaking Time set",
"팀별 발언 시간과 1회당 발언 시간이 세팅된 타이머\n1회당 발언 시간이 지나면, 상대 팀으로 발언권이 넘어감": "A timer with team time and per-turn time set\nWhen a per-turn time ends, the turn passes to the other team",
"종류": "Type",
"발언자": "Speaker",
"N번 토론자": "Speaker N",
"발언 시간": "Speaking Time",
"1회당\n발언 시간": "Per-turn\nSpeaking Time",
"팀당\n발언 시간": "Per-team\nSpeaking Time",
"발언 유형": "Speech Type",
"주도권 토론 등": "e.g. Lead debate",
"입론, 반론, 작전 시간 등": "e.g. Constructive, Rebuttal, Prep Time",
"종소리 설정 접기": "Collapse bell settings",
"종소리 설정 펼치기": "Expand bell settings",
"종료 전": "Before end",
"종료 후": "After end",
"시작 후": "After start",
"분": "min",
"초": "sec",
"횟수": "Count",
"설정 완료": "Save settings",
"타이머 추가": "Add timer",
"수정 완료": "Save changes",
"추가하기": "Add",
"복사하기": "Copy",
"이 타이머를 삭제하시겠습니까?": "Delete this timer?",
"{{minutes}}분 {{seconds}}초": "{{minutes}} min {{seconds}} sec",
"팀당 {{minutes}}분 {{seconds}}초": "{{minutes}} min {{seconds}} sec per team",
"발언당 {{minutes}}분 {{seconds}}초": "{{minutes}} min {{seconds}} sec per speech",
"위/아래로 드래그": "Drag up/down",
" | {{speaker}} 토론자": " | {{speaker}} Debater",
"토론 정보를 {{val0}}해주세요": "Please {{val0}} the debate info",
"수정": "Edit",
"설정": "Settings",
"토론 시간표 이름": "Debate schedule name",
"토론 주제": "Debate Topic",
"토론 주제를 입력해주세요": "Please enter a debate Topic",
"팀명": "Team name",
"팀명은 최대 8자까지 입력할 수 있습니다.": "Team name can be up to 8 characters.",
"다음": "Next",
"볼륨 조절": "Volume control",
"투표 종료에 실패했습니다.": "Failed to end the vote.",
"마감하기": "Close voting",
"투표를 마감하시겠습니까?": "Do you want to close the vote?",
"투표를 마감하면 더이상 표를 받을 수 없습니다!": "Once you close the vote, you can no longer receive votes!",
"음소거": "Mute",
"음소거 해제": "Unmute",
"발언자는 최대 {{MAX_SPEAKER_LEN}}자까지 입력할 수 있습니다.": "Speaker can be up to {{MAX_SPEAKER_LEN}} characters.",
"400 잘못된 요청": "400 Bad Request",
"401 권한 없음": "401 Unauthorized",
"403 거부됨": "403 Forbidden",
"404 찾을 수 없음": "404 Not Found",
"500 내부 서버 오류": "500 Internal Server Error",
"502 게이트웨이 불량": "502 Bad Gateway",
"503 서비스가 일시적으로 중단됨": "503 Service Unavailable",
"504 게이트웨이 시간 초과": "504 Gateway Timeout"
}
Loading