diff --git a/src/locales/ko.json b/src/locales/ko.json
new file mode 100644
index 0000000..a259948
--- /dev/null
+++ b/src/locales/ko.json
@@ -0,0 +1,228 @@
+{
+ "gameTitle": "스카이마인",
+ "home": {
+ "title": "스카이마인 솔로 헬퍼",
+ "play1": "스카이마인의 솔로 모드 상대인 루나와 게임을 플레이하세요.",
+ "play2": "이 헬퍼 애플리케이션은 오토마 카드와 루나 플레이어 보드를 대체합니다.",
+ "feedback": "토론 및 피드백:"
+ },
+ "setup": {
+ "title": "게임 설정",
+ "players": {
+ "title": "플레이어",
+ "playerCount": "인간 플레이어",
+ "playerCountItem": "플레이어 {count}명 | 플레이어 {count}명",
+ "playerColor": "플레이어 색상 | 플레이어 {index} 색상",
+ "playerBonusMarkers": "각 인간 플레이어는 보너스 마커 {count}개를 받습니다.",
+ "botCount": "루나 봇",
+ "botCountItem": "루나 봇 {count}개 | 루나 봇 {count}개",
+ "botColor": "루나 색상 | 루나 {index} 색상"
+ },
+ "difficultyLevel": {
+ "title": "난이도",
+ "easy": "쉬움",
+ "hard": "어려움"
+ }
+ },
+ "setupLuna": {
+ "title": "루나 설정",
+ "forEach": "각 루나 봇마다 다음과 같이 전용 구역을 준비하세요:",
+ "playerToken": "봇의 색상과 일치하는 플레이어 토큰.",
+ "coinsBonusMarkers": "크립코인 1개와 보너스 마커 5개 전부.",
+ "trackMarkers": "트랙 마커 4개를 가져와서 각 회사 트랙의 0번 칸에 하나씩 놓으세요.",
+ "startingBonus": "여분의 시작 연구 토큰 중 하나를 무작위로 선택하여 트랙 마커에 시작 보너스를 적용하세요. 그런 다음 해당 시작 연구 토큰을 게임 박스로 되돌려놓으세요.",
+ "finalNotes": "봇은 플레이어 보드가 필요하지 않으며, 앱이 오토마 카드를 관리하고 헬륨 및 연구 레벨을 자동으로 계산합니다. 또한 봇의 플레이어 색상에 해당하는 시작 행동 카드와 여분의 단일 에너지 카드는 모두 게임 박스에 그대로 두세요.",
+ "heliumBonus": {
+ "title": "헬륨 보너스 설정",
+ "introduction": "헬륨 보너스가 있는 시작 연구 토큰을 루나에게 뽑았다면, 여기에 보너스를 입력하세요:",
+ "heliumNone": "없음",
+ "heliumCount": "헬륨 {count}개"
+ }
+ },
+ "turnPlayer": {
+ "title": "플레이어 | 플레이어 {player}",
+ "makeTurn": "당신의 턴을 진행하세요.",
+ "playerStatus": {
+ "turn": "턴 {round}-{turn}",
+ "majorities": "루나 다수",
+ "scientist": "과학자",
+ "titanium": "티타늄",
+ "carbon": "탄소",
+ "energy": "에너지",
+ "minerals": "광물",
+ "claimFirstPlayer": "첫 번째 플레이어 획득"
+ },
+ "pass": {
+ "title": "패스: 행동 페이즈에서 제외",
+ "step1": "행동 구역의 뒷면 카드를 앞면으로 뒤집으세요.",
+ "step2": "휴식 덱 중 정확히 1개를 가져오세요.",
+ "step3": "그런 다음 행동 슬롯에 있는 각 카드를 원하는 다른 휴식 슬롯으로 이동하여 행동 구역을 정리하세요.",
+ "step4": "마지막으로 행동 구역에 있는 보너스 타일을 반납하세요."
+ }
+ },
+ "turnBot": {
+ "title": "루나 | 루나 {bot}",
+ "botStatus": {
+ "turn": "턴 {round}-{turn}",
+ "helium": "헬륨",
+ "research": "연구",
+ "slot": "슬롯 {slot}"
+ },
+ "action": {
+ "lunaGains": "루나가 획득:",
+ "advanceCompany": {
+ "most-valuable": "가장 가치 있는 회사 트랙에서",
+ "most-valuable-two-each": "가장 가치 있는 2개 회사 트랙 각각에서",
+ "second-most-valuable": "두 번째로 가치 있는 회사 트랙에서",
+ "least-valuable": "가장 가치 없는 회사 트랙에서",
+ "lead-biggest-margin": "루나가 가장 큰 차이로 앞서는 회사 트랙에서",
+ "lead-biggest-margin-two-each": "루나가 가장 큰 차이로 앞서는 2개 회사 트랙 각각에서",
+ "all-four-each": "4개 회사 트랙 각각에서",
+ "help": {
+ "title": "회사 트랙 전진",
+ "instruction": "카드에 명시된 회사 트랙에서 내 트랙 마커를 이만큼 앞으로 이동합니다 (아래 참조).",
+ "rulesHint": "다음 규칙을 염두에 두세요:",
+ "hint1": "내 트랙 마커(또는 당신의 마커)가 보너스 임계점을 지날 때마다, 해당하는 크립코인 보상이 평소대로 분배됩니다.",
+ "hint2": "내 트랙 마커가 자금 장벽을 지날 때마다, 그 비용을 내 크립코인으로 지불해야 합니다. 충분한 크립코인이 없다면 가진 만큼만 지불하고 트랙 마커를 계속 앞으로 이동합니다.",
+ "hint3": "내 마커가 회사 트랙의 끝에 도달한 후: 이제부터 이 트랙에서 일반적으로 앞으로 이동할 각 칸마다 대신 크립코인 2개를 얻습니다.",
+ "hint4": "내 마커가 해금하는 모든 트랙 보너스는 나에게는 무시됩니다.",
+ "mostValuable": "가장 가치 있는 회사 트랙은 스테이션에서 가장 많은 코인 아이콘이 보이는 트랙입니다.",
+ "tied": "회사 트랙의 가치가 동일할 때는, 스테이션에 더 많은 빈 홈 공간이 있는 트랙이 더 가치 있는 것으로 간주됩니다. 이것으로도 동점이 해결되지 않으면, ID가 알파벳 순서로 앞서는 트랙입니다.",
+ "biggestMargin": "내가 가장 큰 차이로 앞서는 트랙은 내 트랙 마커와 2위 마커 사이의 공간이 가장 많은 트랙입니다(자금 장벽은 공간이 아님). 내가 어느 트랙에서도 앞서지 않으면, 공동 선두인 트랙입니다. 모든 트랙에서 뒤처져 있다면, 선두 마커보다 가장 적게 뒤처진 트랙입니다. 동점일 때는 더 가치 있는 트랙을 선택합니다.",
+ "farthestBehind": "내가 가장 멀리 뒤처진 트랙은 내 트랙 마커와 선두 마커 사이의 공간이 가장 많은 트랙입니다. 어느 트랙에서도 뒤처지지 않으면, 공동 선두이거나 가장 작은 차이로 앞서는 트랙입니다. 동점일 때는 더 가치 있는 트랙을 선택합니다."
+ }
+ },
+ "discardResearchPlan": {
+ "discard": "루나는 {plan}-연구 계획을 버립니다. 보충 공간에 있는 크립코인도 함께 얻습니다:",
+ "discardSpecial": "루나는 가장 최근에 공개된 특별 연구 계획을 버립니다.",
+ "help": {
+ "title": "연구 계획 버리기",
+ "instruction": "행동이 연구 계획을 버리게 할 때마다, 연구 진열대에서 지정된 계획을 게임에서 제거합니다. 그 후 연구 진열대의 빈 문자 공간을 평소대로 채웁니다.",
+ "specialResearchPlan": "가장 최근에 공개된 특별 연구 계획을 버린다는 것은: 라운드 트랙의 앞면 특별 연구 계획 중 가장 마지막에 공개된 것을 버린다는 의미입니다. 없다면 아무것도 버리지 않습니다."
+ }
+ },
+ "expandCompany": {
+ "expand": "그런 다음 해당 회사를 확장합니다:",
+ "expandMultiple": "그런 다음 이 회사들을 각각 확장합니다:
(가치가 낮은 것부터 시작)",
+ "min": "MIN",
+ "max": "MAX",
+ "help": {
+ "title": "회사 확장",
+ "instruction": "행동이 회사를 확장하게 할 때마다, 해당 카드는 어느 회사를 얼마나 많은 확장 포인트로 확장할지를 명시합니다. 이는 플레이하는 보드 면에 따라 다르게 수행됩니다 (아래 참조).",
+ "rulesHint": "중요한 사전 참고사항:",
+ "hint1": "명확성을 위해, 각 스테이션의 열 중 하나가 현재 주요 전초기지 열로 간주되며, 다음과 같이 정의됩니다: 가장 많은 빈 홈 공간을 가진 전초기지 열이지만, 마지막 홈 공간(코인 아이콘 2개를 보여주는)이 비어있지 않은 열입니다. 모든 열의 마지막 홈 공간이 비어있는 경우에만, 가장 많은 빈 홈 공간을 가지면서도 가장 적은 코인 아이콘을 보여주는 열입니다. 동점일 때는 보드의 회사 로고에 더 가까운 열을 선택합니다.",
+ "hint2": "내 턴에 진입한 섹터/벨트 공간의 보상은 절대 받지 않습니다.",
+ "hint3": "스테이션에 정상적으로 배치할 수 있는 전초기지/셔틀이 남아있지 않아 회사를 확장할 수 없으면, 확장 포인트는 상실됩니다.",
+ "moon": {
+ "title": "달 면",
+ "rulesHint": "각 확장 포인트마다, 확장하는 회사의 스테이션에서 전초기지 1개를 다음과 같이 달에 배치합니다:",
+ "hint1": "확장하는 회사의 주요 전초기지 열에서 맨 위 전초기지를 가져와서 다음 규칙으로 정의되는 섹터에 배치합니다:",
+ "hint2": "섹터는 도달 가능해야 합니다. 즉, 확장하는 회사의 스테이션이나 확장하는 회사의 전초기지가 있는 어떤 섹터와 인접해야 합니다. (단일선이나 이중선으로 도달 가능한지는 중요하지 않습니다.)",
+ "hint3": "확장 포인트 기호가 MIN을 보여주면, 도달 가능한 빈 섹터 중 가장 낮은 섹터 번호여야 합니다.",
+ "hint4": "확장 포인트 기호가 MAX를 보여주면, 도달 가능한 빈 섹터 중 가장 높은 섹터 번호여야 합니다.",
+ "hint5": "도달 가능한 섹터가 모두 차있다면, 그 중에서 내가 가장 멀리 뒤처진 도달 가능한 회사의 전초기지가 있는 섹터 중 가장 낮은(MIN)/가장 높은(MAX) 섹터 번호를 선택합니다. 평소처럼 기존 전초기지를 스테이션으로 되돌려서 주요 전초기지 열의 가장 낮은 빈 홈 공간에 배치합니다."
+ },
+ "belt": {
+ "title": "벨트 면",
+ "rulesHint": "각 확장 포인트마다, 확장하는 회사의 스테이션에서 전초기지/셔틀 1개를 다음과 같이 벨트 공간에 배치합니다:",
+ "hint1": "먼저, 확장하는 회사의 도달 범위 내에서 다음 빈 목표를 결정합니다. 그 목표는 빈 셔틀 공간이거나 확장하는 회사가 전초기지를 두지 않았고 최소 하나의 빈 전초기지 공간이 있는 소행성이어야 합니다.",
+ "hint2": "이 중에서 확장 포인트 기호가 MIN을 보여주면 가장 낮은 목표 번호를, MAX를 보여주면 가장 높은 목표 번호를 선택합니다.",
+ "hint3": "목표가 셔틀 공간이면, 회사 스테이션에서 맨 위 셔틀을 가져와서 해당 공간에 배치합니다. (열에 셔틀이 남아있지 않으면, 목표는 소행성이어야 합니다.)",
+ "hint4": "목표가 소행성이면, 주요 전초기지 열에서 맨 위 전초기지를 가져와서 해당 소행성의 빈 전초기지 공간에 배치합니다.",
+ "hint5": "위 기준에 맞는 목표가 없다면, 확장하는 회사의 전초기지가 이미 있는 소행성 중 가장 낮은(MIN)/가장 높은(MAX) 목표 번호를 가진 소행성의 빈 전초기지 공간에 전초기지를 배치합니다.",
+ "hint6": "도달 범위 내에 빈 벨트 공간이 전혀 없다면, 내가 가장 멀리 뒤처진 도달 가능한 회사에 속하면서 도달 범위 내에 있는 셔틀과 전초기지를 결정합니다. 이 셔틀과 전초기지 중에서 가장 낮은(MIN)/가장 높은(MAX) 목표 번호를 가진 것을 선택하여 평소 규칙에 따라 스테이션으로 추방합니다. 추방된 전초기지는 주요 전초기지 열의 가장 낮은 빈 홈 공간에 배치되어야 합니다."
+ }
+ }
+ },
+ "gainCard": {
+ "matchSlot": "루나는 진열된 카드 각각을 얻습니다:",
+ "mostValuableShare": "루나는 가장 가치 있는 주식을 가진 카드를 얻습니다 (여러 개가 있다면, 가장 낮은 번호의 공간에서).",
+ "help": {
+ "title": "카드 얻기",
+ "instruction": "행동이 카드를 얻게 할 때마다, 카드 진열대에서 지정된 카드를 가져와서 내 보유품에 뒷면으로 쌓아 놓습니다.",
+ "hint1": "카드를 얻는 것은 비용이 들지 않습니다.",
+ "hint2": "지정된 공간이 비어있으면 카드를 얻지 않습니다.",
+ "hint3": "수집된 행동 카드는 최종 점수 계산 페이즈까지 내 보유품에 남아 있습니다.",
+ "hint4": "가장 가치 있는 주식을 가진 카드를 얻는다는 것은: 진열된 카드 중에서 가장 가치 있는 회사의 추가 주식을 보여주는 카드를 주는 것입니다. 해당 회사의 카드가 여러 개 있다면, 가장 낮은 번호의 공간에서 가져옵니다. 진열대에 주식이 있는 카드가 없다면, 카드를 얻지 않습니다."
+ }
+ },
+ "gainCoin": {
+ "help": {
+ "title": "크립코인 얻기",
+ "instruction": "은행에서 이만큼의 크립코인을 내 보유품에 추가합니다."
+ }
+ },
+ "placeBonusMarker": {
+ "place": "루나가 보너스 마커를 배치합니다:",
+ "help": {
+ "title": "보너스 마커 배치",
+ "instruction": "행동이 보너스 마커를 배치하게 할 때마다, 내 보유품에서 보너스 마커를 가져와서 카드에서 지정한 보너스 공간에 배치하세요.",
+ "hint1": "보너스 마커를 배치하는 것은 비용이 들지 않고 보상도 받지 않습니다.",
+ "hint2": "보너스 공간이 이미 차있다면, 보너스 마커를 배치하지 않습니다."
+ }
+ }
+ }
+ },
+ "endOfRound": {
+ "title": "라운드 {round} 준비",
+ "flipSpecialResearchTile": "다음 특별 연구 계획을 앞면으로 뒤집으세요",
+ "returnBonusMarkers": "보너스 마커를 플레이어에게 돌려주세요 (가능한 보너스 타일 포함)",
+ "fillUpCardDisplay": "카드 진열대를 채우세요",
+ "planningPhase": "계획 페이즈를 수행하세요"
+ },
+ "endOfGame": {
+ "title": "게임 종료",
+ "introduction": "각 플레이어와 루나의 회사 주식을 계산하세요. 행동 카드에 있는 추가 주식도 잊지 말고 계산하세요.",
+ "scoring": {
+ "companyValueTitle": "회사 가치",
+ "scoringTitle": "점수 계산",
+ "shareValue": "주식 가치",
+ "shareCount": "주식 개수",
+ "crypCoin": "크립코인",
+ "heliumCoin": "헬륨 크립코인",
+ "researchCoin": "연구 크립코인",
+ "totalCoin": "총계"
+ }
+ },
+ "standaloneScoring": {
+ "title": "스카이마인 점수 계산",
+ "introduction": "각 플레이어의 회사 주식을 계산하세요. 행동 카드에 있는 추가 주식도 잊지 말고 계산하세요."
+ },
+ "difficultyLevel": {
+ "0": "레벨 0 - 쉬움",
+ "1": "레벨 1 - 쉬움",
+ "2": "레벨 2 - 표준",
+ "3": "레벨 3 - 고급",
+ "4": "레벨 4 - 고급",
+ "5": "레벨 5 - 고급",
+ "6": "레벨 6 - 고급",
+ "7": "레벨 7 - 고급",
+ "8": "레벨 8 - 고급"
+ },
+ "notfound": {
+ "title": "찾을 수 없음"
+ },
+ "action": {
+ "playGame": "게임 플레이",
+ "startGame": "게임 시작",
+ "next": "다음",
+ "nextRound": "다음 라운드",
+ "abortGame": "게임 중단",
+ "abortGameConfirm": "실행 중인 게임을 중단합니다 - 정말입니까?",
+ "endGame": "게임 종료",
+ "endGameConfirm": "이 게임을 종료하고 홈 화면으로 돌아갑니다 - 정말입니까?",
+ "cancel": "취소",
+ "backToHome": "홈으로 돌아가기",
+ "back": "뒤로",
+ "close": "닫기",
+ "reset": "재설정",
+ "pass": "패스"
+ },
+ "footer": {
+ "credits": "크레딧"
+ },
+ "serviceWorkerUpdatedRefresh": {
+ "title": "앱 새로고침",
+ "notice": "애플리케이션이 업데이트되었습니다 - 최신 버전을 사용하기 위해 새로고침하시겠습니까?"
+ }
+}
\ No newline at end of file