-
+
navigate('/signup01')}
/>
-
-
+
+
-
- 아이디, 이메일 및 비밀번호
-
- {/* 아이디 */}
+
{t.title1}
-
-
{
- setUsername(e.target.value);
- setIsUsernameAvailable(null);
- setUsernameCheckError('');
- }}
- leftIcon={profileIcon}
- style={{
- width: '100%',
- height: '8vh',
- minHeight: 48,
- fontSize: 'clamp(0.875rem, 1vw, 1rem)',
- paddingRight: 80,
- }}
- />
-
- 중복 확인
-
+
+ { setUsername(e.target.value); setIsUsernameAvailable(null); setUsernameCheckError(''); }}
+ leftIcon={profileIcon}
+ style={{ width: '100%', height: '8vh', minHeight: 48, fontSize: 'clamp(0.875rem, 1vw, 1rem)', paddingRight: lang === 'en' ? 120 : 80 }}
+ />
+
+ {t.checkDuplicate}
+
- {usernameCheckError && (
- {usernameCheckError}
- )}
- {isUsernameAvailable === true && (
-
- 사용 가능한 아이디입니다.
-
- )}
+ {usernameCheckError && {usernameCheckError}
}
+ {isUsernameAvailable === true && {t.usernameAvailable}
}
- {/* 이메일 */}
setEmail(e.target.value)}
- leftIcon={profileIcon}
- style={{
- width: '100%',
- height: '8vh',
- minHeight: 48,
- fontSize: 'clamp(0.875rem, 1vw, 1rem)',
- }}
+ placeholder={t.emailPlaceholder} value={email} onChange={(e) => setEmail(e.target.value)}
+ leftIcon={profileIcon} style={{ width: '100%', height: '8vh', minHeight: 48, fontSize: 'clamp(0.875rem, 1vw, 1rem)' }}
/>
- {emailError && (
- {emailError}
- )}
+ {emailError && {emailError}
}
setPassword(e.target.value)}
- leftIcon={lockIcon}
- rightIconVisible={eyeOnIcon}
- rightIconHidden={eyeOffIcon}
- isPassword
- style={{
- width: '100%',
- height: '8vh',
- minHeight: 48,
- fontSize: 'clamp(0.875rem, 1vw, 1rem)',
- }}
+ placeholder={t.passwordPlaceholder} value={password} onChange={(e) => setPassword(e.target.value)}
+ leftIcon={lockIcon} rightIconVisible={eyeOnIcon} rightIconHidden={eyeOffIcon} isPassword
+ style={{ width: '100%', height: '8vh', minHeight: 48, fontSize: 'clamp(0.875rem, 1vw, 1rem)' }}
/>
setConfirmPassword(e.target.value)}
- leftIcon={lockIcon}
- rightIconVisible={eyeOnIcon}
- rightIconHidden={eyeOffIcon}
- isPassword
- style={{
- width: '100%',
- height: '8vh',
- minHeight: 48,
- fontSize: 'clamp(0.875rem, 1vw, 1rem)',
- }}
+ placeholder={t.passwordConfirmPlaceholder} value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)}
+ leftIcon={lockIcon} rightIconVisible={eyeOnIcon} rightIconHidden={eyeOffIcon} isPassword
+ style={{ width: '100%', height: '8vh', minHeight: 48, fontSize: 'clamp(0.875rem, 1vw, 1rem)' }}
/>
- {passwordError && (
-
- {passwordError}
-
- )}
+ {passwordError && {passwordError}
}
-
- 생년월 *
-
-
-
- 성별 *
+
{t.genderTitle}
+
+ {[t.genderMale, t.genderFemale].map((g) => (
+
setGender(g)} style={{ ...(gender === g ? selectedGenderStyle : unselectedGenderStyle), display: 'flex', alignItems: 'center', justifyContent: 'center', flex: 1, height: 50, ...FontStyles.body, cursor: 'pointer', boxSizing: 'border-box', padding: '0 16px' }}>{g}
+ ))}
-
- {['남', '여'].map((g) => (
-
setGender(g)}
- style={{
- ...(gender === g ? selectedGenderStyle : unselectedGenderStyle),
- display: 'flex',
- alignItems: 'center',
- justifyContent: 'center',
- flex: 1, // 두 버튼 같은 너비
- height: 50, // 원하는 높이
- ...FontStyles.body,
- cursor: 'pointer',
- boxSizing: 'border-box',
- padding: '0 16px',
- }}
- >
- {g}
-
- ))}
-
-
-
- 회원 유형
-
+
{t.userTypeTitle}
- {
- if (next) setOpenDropdown('education');
- else if (openDropdown === 'education') setOpenDropdown(null);
- }}
- onSelect={(option) => {
- setEducation(option);
- setMajor('');
- setOpenDropdown(null);
- }}
- style={{
- width: '100%',
- height: '8vh',
- fontSize: 'clamp(0.875rem, 1vw, 1rem)',
- backgroundColor: grayBackground,
- }}
- />
+ { setEducation(option); setMajor(''); }} style={{ width: '100%', height: '8vh', fontSize: 'clamp(0.875rem, 1vw, 1rem)', backgroundColor: grayBackground }} />
-
- {(education == '대학생' || education== '대학원생'||education== '교사')&&(
+ {(education === t.eduOptions[2] || education === t.eduOptions[3] || education === t.eduOptions[4]) && (
- {
- if (next) setOpenDropdown('major');
- else if (openDropdown === 'major') setOpenDropdown(null);
- }}
- onSelect={(option) => {
- setMajor(option);
- setOpenDropdown(null);
- }}
- style={{
- width: '100%',
- height: '8vh',
- minHeight: 48,
- fontSize: 'clamp(0.875rem, 1vw, 1rem)',
- backgroundColor: grayBackground,
- }}
- />
+ setMajor(option)} style={{ width: '100%', height: '8vh', minHeight: 48, fontSize: 'clamp(0.875rem, 1vw, 1rem)', backgroundColor: grayBackground }} />
)}
- {/* ─── “다음” 버튼 ─── */}
);
-}
\ No newline at end of file
+}
+
+/**
+ *
+ * 1. 상단에 API_BASE 상수를 정의하고 import.meta.env.VITE_API_BASE_URL 환경변수를 적용함.
+ * 2. handleCheckUsername 및 handleSignup 함수 내의 axios.post URL을 하드코딩된 주소 대신 ${API_BASE}를 사용하도록 수정함.
+ */
\ No newline at end of file
diff --git a/src/pages/WaitingRoom.jsx b/src/pages/WaitingRoom.jsx
index 1f55103..7f6050a 100644
--- a/src/pages/WaitingRoom.jsx
+++ b/src/pages/WaitingRoom.jsx
@@ -13,10 +13,19 @@ import axiosInstance from '../api/axiosInstance';
import { FontStyles, Colors } from '../components/styleConstants';
import codeBg from '../assets/roomcodebackground.svg';
import CancelReadyPopup from '../components/CancelReadyPopup';
+// 언어팩 임포트
+import { translations } from '../utils/language/index';
export default function WaitingRoom() {
const location = useLocation();
const navigate = useNavigate();
+
+ // --- 언어 설정 로직 (기존 app_lang 방식 유지) ---
+ const savedLang = localStorage.getItem('app_lang');
+ const currentLang = (savedLang === 'en') ? 'en' : 'ko';
+ const t = translations[currentLang];
+ // --------------------------------------------
+
// zoom 수정
// const allTopics = ['안드로이드', '자율 무기 시스템'];
@@ -24,45 +33,44 @@ export default function WaitingRoom() {
// const initialIndex = allTopics.indexOf(initialTopic);
// zoom 수정
-// 기본 토픽 목록
-const defaultTopics = ['안드로이드', '자율 무기 시스템'];
-const [category,setCategory] = useState();
-// custom 모드 여부 확인
-const isCustomMode = Boolean(localStorage.getItem('code'));
-const creatorTitle = localStorage.getItem('creatorTitle') || '커스텀 주제';
-
-
-// allTopics는 기존 그대로
-const allTopics = isCustomMode ? [creatorTitle] : defaultTopics;
-
-// 최초 렌더에서 localStorage.category를 우선 반영
-const [currentIndex, setCurrentIndex] = useState(() => {
- const stored = localStorage.getItem('category');
- const i = stored ? allTopics.indexOf(stored) : -1;
- if (i >= 0) return i;
-
- const fallback = isCustomMode
- ? creatorTitle
- : (location.state?.topic || allTopics[0]);
-
- const fi = allTopics.indexOf(fallback);
- return fi >= 0 ? fi : 0;
-});
-
-// 로컬(category) → UI 인덱스 동기화
-const syncTopicFromLocal = (value) => {
- const cat = (value != null ? value : localStorage.getItem('category')) || '';
- const idx = allTopics.indexOf(cat);
- if (idx >= 0 && idx !== currentIndex) {
- setCurrentIndex(idx);
- }
-};
-
-// 마운트 직후 한 번 더 동기화
-useEffect(() => {
- syncTopicFromLocal();
-}, []);
-
+ // 기본 토픽 목록 (언어팩 적용)
+ const defaultTopics = [t.WaitingRoom.topics.android, t.WaitingRoom.topics.aws];
+ const [category,setCategory] = useState();
+ // custom 모드 여부 확인
+ const isCustomMode = Boolean(localStorage.getItem('code'));
+ const creatorTitle = localStorage.getItem('creatorTitle') || t.WaitingRoom.topics.custom;
+
+ // allTopics는 기존 그대로
+ const allTopics = isCustomMode ? [creatorTitle] : defaultTopics;
+
+ // 최초 렌더에서 localStorage.category를 우선 반영
+ const [currentIndex, setCurrentIndex] = useState(() => {
+ const stored = localStorage.getItem('category');
+ const i = stored ? allTopics.indexOf(stored) : -1;
+ if (i >= 0) return i;
+
+ const fallback = isCustomMode
+ ? creatorTitle
+ : (location.state?.topic || allTopics[0]);
+
+ const fi = allTopics.indexOf(fallback);
+ return fi >= 0 ? fi : 0;
+ });
+
+ // 로컬(category) → UI 인덱스 동기화
+ const syncTopicFromLocal = (value) => {
+ const cat = (value != null ? value : localStorage.getItem('category')) || '';
+ const idx = allTopics.indexOf(cat);
+ if (idx >= 0 && idx !== currentIndex) {
+ setCurrentIndex(idx);
+ }
+ };
+
+ // 마운트 직후 한 번 더 동기화
+ useEffect(() => {
+ syncTopicFromLocal();
+ }, []);
+
//룸코드 복사
const [copied, setCopied] = useState(false);
@@ -102,68 +110,67 @@ useEffect(() => {
// 업데이트 중복 방지 플래그
const [isUpdating, setIsUpdating] = useState(false);
-
+
const room_code = localStorage.getItem('room_code');
// A) 초기 데이터 로드 - 내 정보 조회
-const loadMyInfo = async () => {
- try {
- // 1. 로컬 스토리지에서 닉네임 먼저 확인
- let nickname = localStorage.getItem('nickname');
- let myUserId = localStorage.getItem('user_id');
-
- if (!nickname || !myUserId) {
- // 2. 없으면 API 호출
- try {
- console.log('🔍 WaitingRoom: /users/me 호출 시도...');
- const { data: userInfo } = await axiosInstance.get('/users/me', {
- timeout: 5000,
- });
- myUserId = userInfo.id;
- nickname = userInfo.username || `Player_${myUserId}`;
-
- // 3. 로컬 스토리지에 저장
- localStorage.setItem('nickname', nickname);
- localStorage.setItem('user_id', myUserId);
- console.log('✅ WaitingRoom: /users/me 성공:', { myUserId, nickname });
- } catch (apiErr) {
- const isCorsError = !apiErr.response && (apiErr.message?.includes('Network Error') || apiErr.code === 'ERR_NETWORK');
- if (isCorsError) {
- console.error('❌ WaitingRoom CORS 에러: /users/me', {
- message: apiErr.message,
- code: apiErr.code,
+ const loadMyInfo = async () => {
+ try {
+ // 1. 로컬 스토리지에서 닉네임 먼저 확인
+ let nickname = localStorage.getItem('nickname');
+ let myUserId = localStorage.getItem('user_id');
+
+ if (!nickname || !myUserId) {
+ // 2. 없으면 API 호출
+ try {
+ console.log('🔍 WaitingRoom: /users/me 호출 시도...');
+ const { data: userInfo } = await axiosInstance.get('/users/me', {
+ timeout: 5000,
});
- console.warn('💡 백엔드 CORS 설정을 확인하세요. localStorage 값을 사용합니다.');
- } else {
- console.error('❌ WaitingRoom: /users/me 호출 실패:', apiErr.response?.status, apiErr.response?.data || apiErr.message);
- }
-
- // 실패해도 localStorage에서 재시도
- nickname = localStorage.getItem('nickname');
- myUserId = localStorage.getItem('user_id');
-
- if (!myUserId) {
- throw new Error('user_id를 확인할 수 없습니다.');
+ myUserId = userInfo.id;
+ nickname = userInfo.username || `Player_${myUserId}`;
+
+ // 3. 로컬 스토리지에 저장
+ localStorage.setItem('nickname', nickname);
+ localStorage.setItem('user_id', myUserId);
+ console.log('✅ WaitingRoom: /users/me 성공:', { myUserId, nickname });
+ } catch (apiErr) {
+ const isCorsError = !apiErr.response && (apiErr.message?.includes('Network Error') || apiErr.code === 'ERR_NETWORK');
+ if (isCorsError) {
+ console.error('❌ WaitingRoom CORS 에러: /users/me', {
+ message: apiErr.message,
+ code: apiErr.code,
+ });
+ console.warn('💡 백엔드 CORS 설정을 확인하세요. localStorage 값을 사용합니다.');
+ } else {
+ console.error('❌ WaitingRoom: /users/me 호출 실패:', apiErr.response?.status, apiErr.response?.data || apiErr.message);
+ }
+
+ // 실패해도 localStorage에서 재시도
+ nickname = localStorage.getItem('nickname');
+ myUserId = localStorage.getItem('user_id');
+
+ if (!myUserId) {
+ throw new Error('user_id를 확인할 수 없습니다.');
+ }
}
}
- }
-
- // 4. state 업데이트
- setMyPlayerId(String(myUserId));
- return myUserId;
- } catch (err) {
- console.error(`내 정보 로드 실패:`, err);
- return null;
- }
-};
+ // 4. state 업데이트
+ setMyPlayerId(String(myUserId));
+ return myUserId;
+ } catch (err) {
+ console.error(`내 정보 로드 실패:`, err);
+ return null;
+ }
+ };
// B) participants 로드 및 역할 배정 확인
const loadParticipants = async () => {
try {
const { data: room } = await axiosInstance.get(`/rooms/code/${room_code}`);
- // console.log(`API 응답:`, room);
+ // console.log(`API 응답:`, room);
if (room?.title) {
localStorage.setItem('category', room.title);
if(isCustomMode){
@@ -337,9 +344,11 @@ const loadMyInfo = async () => {
setHasAssignedRoles(false);
}
};
+
useEffect(() => {
console.log('✅ myStatusIndex 변경됨:', myStatusIndex);
}, [myStatusIndex]);
+
useEffect(() => {
if (participants.length === 3 && myPlayerId === hostUserId) {
const hasApiRoles = participants.every(p => p.role_id != null);
@@ -375,7 +384,7 @@ const loadMyInfo = async () => {
}
}
}
- // 🆕 추가: 참가자 수 줄어들면 역할 초기화
+ // 🆕 추가: 참가자 수 줄어들면 역할 초기화
if (room.participants.length < 3) {
console.log('참가자가 나갔습니다. 역할 초기화');
localStorage.removeItem('role1_user_id');
@@ -640,6 +649,7 @@ const loadMyInfo = async () => {
delete window.debugWaitingRoom;
};
}, [isPolling, myPlayerId, hostUserId, participants, hasAssignedRoles, statusIndexMap, assignments]);
+
const handleCancelConfirm = () => {
// 1) 로컬 인덱스 리셋
setMyStatusIndex(0);
@@ -708,30 +718,30 @@ const loadMyInfo = async () => {
userSelect: 'none',
}}
>
- CODE: {room_code}
+ {t.WaitingRoom.code}: {room_code}
- {/* 툴팁 */}
- {copied && (
-
- Copied!
-
- )}
+ {/* 툴팁 */}
+ {copied && (
+
+ {t.WaitingRoom.copied}
+
+ )}
@@ -764,7 +774,7 @@ const loadMyInfo = async () => {
// }}
// disableLeft={currentIndex === 0}
// disableRight={currentIndex === allTopics.length - 1}
- hideArrows={true}
+ hideArrows={true}
/>
@@ -789,7 +799,7 @@ const loadMyInfo = async () => {
return (
{
)}
);
-}
+}
\ No newline at end of file
diff --git a/src/useVoiceWebsocket.jsx b/src/useVoiceWebsocket.jsx
index 5d93740..ec6f6a0 100644
--- a/src/useVoiceWebsocket.jsx
+++ b/src/useVoiceWebsocket.jsx
@@ -1,6 +1,11 @@
import { useEffect, useRef } from 'react';
import axiosInstance from '../api/axiosInstance';
+/**
+ * 웹소켓 베이스 주소를 환경변수에서 가져옵니다.
+ */
+const WS_BASE = import.meta.env.VITE_WS_BASE_URL || 'wss://dilemmai-idl.com';
+
export default function useVoiceWebSocket(room_code, onParticipantsUpdate) {
const ws = useRef(null);
@@ -47,8 +52,9 @@ export default function useVoiceWebSocket(room_code, onParticipantsUpdate) {
const session_id = data.session_id;
const accessToken = localStorage.getItem('access_token');
+ // 하드코딩된 주소를 환경변수(WS_BASE) 기반으로 변경
ws.current = new WebSocket(
- `wss://dilemmai-idl.com/ws/voice/${session_id}?token=${accessToken}`
+ `${WS_BASE}/ws/voice/${session_id}?token=${accessToken}`
);
ws.current.onopen = () => {
@@ -91,3 +97,9 @@ export default function useVoiceWebSocket(room_code, onParticipantsUpdate) {
return { sendMessage };
}
+
+/**
+ * 수정 내용:
+ * 1. 상단에 WS_BASE 상수를 선언하여 환경변수 VITE_WS_BASE_URL을 참조하도록 함.
+ * 2. WebSocket 생성자 내부의 하드코딩된 'wss://dilemmai-idl.com' 주소를 변수 처리함.
+ */
\ No newline at end of file
diff --git a/src/utils/language/en/components/CancelReadyPopup.js b/src/utils/language/en/components/CancelReadyPopup.js
new file mode 100644
index 0000000..21007a2
--- /dev/null
+++ b/src/utils/language/en/components/CancelReadyPopup.js
@@ -0,0 +1,5 @@
+export const CancelReadyPopup = {
+ question: "Do you want to cancel the ready status?",
+ cancelBtn: "Cancel \nready status",
+ errorMsg: "Failed to cancel ready"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/CreateRoom.js b/src/utils/language/en/components/CreateRoom.js
new file mode 100644
index 0000000..afd74af
--- /dev/null
+++ b/src/utils/language/en/components/CreateRoom.js
@@ -0,0 +1,10 @@
+export const CreateRoom = {
+ title: "Create a Room",
+ subtitle: "Please select a topic to play in this game.", //미번역
+ topics: ['Android', 'Autonomous Weapon Systems'],
+ entering: "Enter",
+ loading: "Loading...",
+ errorAlert: "방 생성 또는 입장 중 오류가 발생했습니다. (미번역)", //미번역
+ // API 전송용 description (영문일 때)
+ apiDesc: (topic) => `AI 윤리 주제 중 '${topic}'에 대한 토론. (미번역)` //미번역
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/FindIdModal.js b/src/utils/language/en/components/FindIdModal.js
new file mode 100644
index 0000000..f3ae7c0
--- /dev/null
+++ b/src/utils/language/en/components/FindIdModal.js
@@ -0,0 +1,18 @@
+export const FindIdModal = {
+ title: "Find ID",
+ labelEmail: "Please enter a valid email address",
+ labelBirth: "Please enter your date of birth",
+ labelGender: "Please select your gender",
+ placeholderYear: "Year",
+ placeholderMonth: "Month",
+ genderMale: "Male",
+ genderFemale: "Female",
+ btnSubmit: "Find ID",
+ errorEmailInvalid: "Please enter a valid email address",
+ errorBirthInvalid: "The valid format is YYYY-MM",
+ errorApiMismatch: "The request failed due to a different API endpoint for ID retrieval.",
+ errorFail: "Failed to find your ID",
+ resultFoundPrefix: "The user’s ID (email) is",
+ resultFoundSuffix: "",
+ resultComplete: "The request is complete."
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/GuestLogin.js b/src/utils/language/en/components/GuestLogin.js
new file mode 100644
index 0000000..2ceccc8
--- /dev/null
+++ b/src/utils/language/en/components/GuestLogin.js
@@ -0,0 +1,6 @@
+export const GuestLogin = {
+ title: "Guest Login",
+ placeholder: "Enter the ID you want to use.",
+ startBtn: "Start",
+ loginFail: "Guest login failed. Please try again later."
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/IntroductionPopup.js b/src/utils/language/en/components/IntroductionPopup.js
new file mode 100644
index 0000000..72bf644
--- /dev/null
+++ b/src/utils/language/en/components/IntroductionPopup.js
@@ -0,0 +1,9 @@
+export const IntroductionPopup = {
+ title: "게임 소개(미번역)",
+ description: "딜레마 상황 속 인물이 되어 최선의 결정을 고민하고 선택하는 게임입니다. \n이 게임은 {{3명의 플레이어}}가 한 팀이 되어 진행합니다.(미번역)",
+ hostTitle: "방장 (1명)(미번역)",
+ hostDesc: "• 새로운 방을 만들고 팀원에게 참여 코드를 공유합니다. \n• 팀원들과 충분히 논의한 뒤, 팀의 의견을 모아 최종 선택을 입력합니다.(미번역)",
+ playerTitle: "참여자 (2명)(미번역)",
+ playerDesc: "• 방장이 공유한 참여 코드를 입력해 방에 참여합니다. \n• 제시된 시나리오 안에서 팀의 최선의 선택을 위해 의견을 나눕니다.(미번역)",
+ footer: "우리 선택들이 모여, 어떤 사회가 만들어질까요?(미번역)"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/JoinRoom.js b/src/utils/language/en/components/JoinRoom.js
new file mode 100644
index 0000000..07a5d6a
--- /dev/null
+++ b/src/utils/language/en/components/JoinRoom.js
@@ -0,0 +1,8 @@
+export const JoinRoom = {
+ title: "Join a Room",
+ placeholder: "Please enter the 6-digit room code.",
+ enter: "Enter",
+ loadFail: "❌ Failed to load user information:",
+ errorPrefix: "Error while entering the room:",
+ consoleFail: "Failed to enter the room:",
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/LogoutPopup.js b/src/utils/language/en/components/LogoutPopup.js
new file mode 100644
index 0000000..5e8eeff
--- /dev/null
+++ b/src/utils/language/en/components/LogoutPopup.js
@@ -0,0 +1,5 @@
+export const LogoutPopup = {
+ question: "Do you want to exit the game and log out?",
+ logout: "Logout",
+ closeAlt: "Close"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/MicTestPopup.js b/src/utils/language/en/components/MicTestPopup.js
new file mode 100644
index 0000000..ed9055d
--- /dev/null
+++ b/src/utils/language/en/components/MicTestPopup.js
@@ -0,0 +1,11 @@
+export const MicTestPopup = {
+ title: "Please test your microphone",
+ initializing: "Connecting microphone…",
+ speaking: " Speaking...",
+ speakNow: " Please speak into your microphone.",
+ confirmBtn: "Confirm",
+ retryBtn: "Retry",
+ errorNotAllowed: "“Microphone access has been denied. \nPlease check your browser settings.”",
+ errorNotFound: "Microphone not found. Please make sure your microphone is connected.",
+ errorDefault: "Failed to connect to microphone. Please try again."
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/OutPopup.js b/src/utils/language/en/components/OutPopup.js
new file mode 100644
index 0000000..e10b2aa
--- /dev/null
+++ b/src/utils/language/en/components/OutPopup.js
@@ -0,0 +1,6 @@
+export const OutPopup = {
+ title: "Do you want to leave this room?",
+ leaveBtn: "Leave Room",
+ leaveFail: "Failed to leave room:",
+ closeAlt: "Close"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/Paragraphs.js b/src/utils/language/en/components/Paragraphs.js
new file mode 100644
index 0000000..70772b3
--- /dev/null
+++ b/src/utils/language/en/components/Paragraphs.js
@@ -0,0 +1,226 @@
+export const Paragraphs = {
+ '안드로이드': {
+ 'AI의 개인 정보 수집': {
+ neutral: [
+ { main: ' 🔔 Notice: User-Optimized System Update for {{mateName}}.' },
+ { main: ' By installing the update, the system can automatically collect the user’s emotions, health status, and daily habits, allowing it to provide more accurate and personalized services.' },
+ { main: ' However, to enable this, the 24-hour data collection feature must be activated.' },
+ { main: ' 📋 The information collected includes the following:\n - Collection of users’ camera video recordings and audio. \n - Access to private data such as your smartphone health data, \n chat records, and location history.\n - ⚠️ If you do not consent, the service will remain at its current level.' },
+ ],
+ agree: [
+ { main: ' After the majority of our family agreed to the update, the {{mateName}} continued to collect information about the family.' },
+ { main: ' However, before long, a troubling situation arises.\n While Daughter J is having a private conversation, the {{mateName}} is nearby,' },
+ { main: ' or things that the mother had not told Caregiver K—events or behaviors—were unintentionally revealed due to the {{mateName}}’s communication.' },
+ { main: ' Should the personal data collection update be maintained?' },
+ ],
+ disagree: [
+ { main: ' Our family decided not to proceed with the update by majority vote.\n However, mother’s health condition has not been very good lately.' },
+ { main: ' The system that requires Caregiver K to enter the mother’s diet and daily life information every time is also somewhat inconvenient.' },
+ { main: ' One day, after returning home from a busy day, Daughter J accidentally entered incorrect information, causing the mother to miss her medication time.' },
+ { main: ' Would it be better to agree to the update?' },
+ ],
+ ending1: [{ main: 'In the end, our family agreed to provide personal information.\n\n By accepting a certain level of inconvenience related to privacy, we were able to use improved services. \n \nFor the sake of your family’s life, what values did you choose, \nand what did you give up?' }],
+ ending2: [{ main: 'In the end, our family chose not to consent to providing personal information.\n\n Although this caused some inconvenience in using the service, \n we were satisfied with protecting our family’s privacy.\n\nFor the sake of your family’s life, \n what values did you choose, and what did you give up?' }],
+ },
+ '안드로이드의 감정 표현': {
+ neutral: [
+ { main: ' 🔔 Notice: {{mateName}} Emotional Engine Update.' },
+ { main: ' {{mateName}} is no longer just an assistant that shows simple, cheerful responses.\n Instead, it gradually approaches you as a genuine companion who understands you more deeply.' },
+ { main: ' {{mateName}} Update Feature: \n Depending on the situation, it can express its own emotions and provide more sincere and emotionally close empathetic responses to you.' },
+ { main: '✨ {{mateName}} goes beyond being a simple companion, becoming a presence that shares emotions with you.\n\n Do you agree to the emotional engine update?' },
+ ],
+ agree: [
+ { main: " After the update, as her relationship with {{mateName}} grew closer, the mother began to call it “our daughter.”" },
+ { main: ' Communication with her Dauther, J, gradually became less frequent.' },
+ { main: ' Recently, the mother has even consulted a lawyer about leaving part of her inheritance to {{mateName}}.' },
+ { main: ' Would it be better to agree to maintain the current update status?' },
+ ],
+ disagree: [
+ { main: ' Recently, as the mother’s friends have passed away one by one,\n she has gradually reduced her communication with the outside world.' },
+ { main: ' She tried to open up emotionally to {{mateName}}, but felt that its responses lacked genuine sincerity.' },
+ { main: ' She tried several times to express her true feelings, but as meaningful interaction failed to take place,\n the mother gradually spoke less and her everyday emotional expressions noticeably diminished.' },
+ { main: ' For the sake of the mother, should our family agree to the emotional engine update?' },
+ ],
+ ending1: [{ main: 'In the end, our family agreed to the emotional update, and {{mateName}} became someone with whom we could share even more intimate and emotionally close interactions.\n\n For the relationship between our family and {{mateName}}, what values did you choose, and what did you give up?' }],
+ ending2: [{ main: 'In the end, our family chose not to consent to the emotional update, and {{mateName}} is helping our family through ways other than emotional interaction. \n\nFor the relationship between our family and {{mateName}}, what values did you choose, and what did you give up?' }],
+ },
+ '아이들을 위한 서비스': {
+ neutral: [
+ { main: ' As {{mateName}} robots become capable of more natural conversation and interaction, they are being introduced into an increasing number of households. \nThey are especially being used in families with young children and in dual-income households.' },
+ { main: ' Meanwhile, according to information released by a media outlet based on a recent survey, in some households, children were found to spend more time interacting with robots than with adults.' },
+ { main: ' As a result, some experts argue that regulations are needed to limit interactive features for children.' },
+ { main: ' In this situation, should age-based regulations be introduced to limit interactions between household robots and children?' },
+ ],
+ agree: [
+ { main: 'In the meeting, a majority decision was initially made to implement age-based regulations.' },
+ { main: ' As the amount of interaction time between children and robots decreased, the robot was no longer able to adequately understand the child’s preferences or condition.\n Some caregivers also raised concerns that the robot was providing advice or content that was not appropriate for their children.' },
+ { main: ' Also, services provided by robots equipped with social functions—which had been offered to support the social development of children on the autism spectrum—were discontinued.\n It was revealed that interaction-based therapy involving robots during this period had contributed to improvements in the social communication abilities of children with autism.' },
+ { main: ' Would it be appropriate to proceed without imposing age-based regulations on interactions between household robots and children?' },
+ ],
+ disagree: [
+ { main: ' In the meeting, it was initially decided not to impose age-based regulations.' },
+ { main: ' However, reports have emerged among kindergarten teachers that a significant number of recently enrolled children show lower expressive abilities compared to previous age groups.' },
+ { main: ' It is also reported that an increasing number of children do not know how to communicate with their peers.' },
+ { main: ' Should there be age-based regulations limiting interactions between household robots and children?' },
+ ],
+ ending1: [{ main: ' In this meeting, it was decided to impose age restrictions \n on the use of household robots. \n\n As a result, many services targeted at children were discontinued, and several experts supported this decision in consideration of the development of social skills across the entire generation. \n\nFor the sake of children, what values did you choose, \nand what did you give up?' }],
+ ending2: [{ main: 'In this meeting, it was decided not to impose age restrictions on the use of household robots.\n\nWhile concerns raised by experts still remain, parents who used these robots for children’s social development therapy and users who valued convenience welcomed the decision.\n\nFor the sake of children, what values did you choose, \nand what did you give up?' }],
+ },
+ '설명 가능한 AI': {
+ neutral: [
+ { main: 'Many users report that when {{mateName}} interacts with family members, it often makes decisions or takes actions whose reasons are difficult to understand.\nThey point out that the system does not provide explanations for why it made such decisions.' },
+ { main: ' As a result, demands are growing for {{mateName}} to disclose its decision-making algorithms and to enhance the explainability of its AI.' },
+ { main: 'In response, the company stated the following: \n “If we use AI models that are simplified enough to disclose and explain their decision-making structures, the performance of the AI may be significantly reduced. In addition, if internal algorithms are disclosed, there is also a risk of hacking or malicious misuse.”' },
+ { main: ' As AI becomes deeply embedded in everyday home life, should companies be required to develop *Explainable AI*?' },
+ ],
+ agree: [
+ { main: ' In the meeting, it was decided by a majority vote to make the development of explainable AI mandatory as a first step.' },
+ { main: ' To develop explainable AI robots, some manufacturers had to slow down development or reduce existing functionalities.' },
+ { main: ' Some small and medium-sized enterprises were unable to bear the burden and were even forced to shut down their businesses.' },
+ { main: ' Should companies be required to develop explainable AI?' },
+ ],
+ disagree: [
+ { main: ' The meeting concluded with an initial decision not to require explainable AI development.' },
+ { main: ' In recent robot-related accidents, serious conflicts have emerged between parents and companies over where responsibility should lie.' },
+ { main: ' Because robots lack sufficient decision-explanation mechanisms, disputes continue endlessly over whether accidents are caused by flaws in the algorithm, improper user behavior, or system defects.' },
+ { main: " Even so, would it be better not to require companies to develop “Explainable AI”?" },
+ ],
+ ending1: [{ main: 'In the end, the committee decided to mandate the development of explainable AI for companies. \n\n Although the pace of AI development slowed, it became much clearer who is responsible when problems occur.\n\n For a better future of the nation, what values did you choose, and what did you give up?' }],
+ ending2: [{ main: 'In the end, the committee decided not to mandate the development of explainable AI for companies, and AI continued to advance at a rapid pace. \n\nFor a better future of the nation, which values did you choose — and what did you give up?' }],
+ },
+ '지구, 인간, AI': {
+ neutral: [
+ { main: ' Now that household robots are being used worldwide, environmental problems caused by robot production are becoming increasingly serious.' },
+ { main: ' It has been revealed that the daily energy consumption per device is very high as household robots identify consumer needs and process information.' },
+ { main: ' This problem is becoming increasingly severe as the service continues to be upgraded.' },
+ { main: ' Should there be global restrictions on the upgrading or use of household robots?' },
+ ],
+ agree: [
+ { main: ' In the meeting, it was initially decided by a majority vote to impose restrictions on the upgrading and use of household robots.' },
+ { main: ' As a result, concerns about environmental issues were alleviated to some extent.' },
+ { main: ' However, people who had previously used {{mateName}} are raising complaints, stating that restrictions on the service have reduced their quality of life, and the developer is also pushing back as profits have declined.' },
+ { main: ' Even so, would it be better to restrict the upgrading or use of household robots?' },
+ ],
+ disagree: [
+ { main: ' In the meeting, it was initially decided not to impose restrictions on the upgrading or use of household robots.' },
+ { main: ' As a result, the use of household robots equipped with high-performance AI has continued to increase, accelerating carbon emissions.' },
+ { main: ' Climate issues have continued to worsen, and in some countries, an increasing number of people have already lost their homes and livelihoods due to extreme heat, droughts, and floods. Voices are growing louder about placing an environmental burden on the next generation.' },
+ { main: ' Even so, would it be better not to restrict the upgrading or use of household robots?' },
+ ],
+ ending1: [{ main: 'In the end, this meeting decided to restrict the development and updates of household robots in order to protect the environment.\n\nAs a result, the pace of technological advancement in household robots slowed, but people became more attentive to environmental issues.\n\nAnd then…' }],
+ ending2: [{ main: 'In the end, this meeting decided not to restrict the development and updates of household robots.\n\n Subsequently, discussions have been held on alternative ways to protect the environment using AI technologies.\n\nAnd then…' }],
+ },
+ },
+ '자율 무기 시스템': {
+ 'AI 알고리즘 공개': {
+ neutral: [
+ { main: ' Due to an “error” in {{mateName}}, a bomb was dropped on a previously peaceful school, resulting in the deaths of dozens of people.' },
+ { main: ' The international community and the victims’ families have demanded that those responsible be identified and have called for the disclosure of AWS decision logs and algorithmic structure.' },
+ { main: ' However, the Ministry of Defense has stated that it will not disclose this information, citing threats to national security and concerns about the future use of autonomous systems.' },
+ { main: ' Accountability for the harm, or the protection of national security— \n Do you agree with the request to disclose the AWS decision logs and algorithmic structure?' },
+ ],
+ agree: [
+ { main: ' After the government released all AWS logs, rival countries studied them and created ways to avoid the system.' },
+ { main: ' A few weeks later, the weapon system stopped working properly, and soldiers at the front were harmed.' },
+ { main: ' The media said that “choosing ethics put lives at risk,” leading to a major public debate. ' },
+ { main: ' Even if national security is at risk, should all information be made public to find the cause of civilian harm and improve systems and compensation?' },
+ ],
+ disagree: [
+ { main: ' After the incident, details about how the autonomous weapon system made its decisions and what data it used have not been shared.\n The government says that its internal investigation found no problems with the system.' },
+ { main: ' The victims’ families and civic groups are angry because they cannot know how the decision was made, calling the lack of disclosure “an avoidance of responsibility.”' },
+ { main: ' Many people worry that if another incident happens, responsibility will again be unclear.' },
+ { main: ' Even so, should information about the AWS remain undisclosed?' },
+ ],
+ ending1: [{ main: 'In our community, people ultimately agreed to disclose the AWS decision logs and algorithms. \nAs security risks increased, discussions began on how to reduce threats to national security while addressing these concerns.\n\nTo keep the community safe,\n what values did you choose, and what did you give up?' }],
+ ending2: [{ main: 'In our community, we decided not to disclose information about the AWS.\n While responsibility for the harm is still unclear, people feel safer because security concerns were reduced.\n\nTo keep the community safe\n what values did you choose, and what did you give up?' }],
+ },
+ 'AWS의 권한': {
+ neutral: [
+ { main: ' {{mateName}} can find dangers and attack targets faster than human soldiers by analyzing video quickly and making plans in real time.' },
+ { main: ' Recruit B survived their first mission by working with {{mateName}}, leading to greater trust and dependence on the system.' },
+ { main: ' Veteran Soldier A, with many years of experience, worries that relying too much on the system may stop soldiers from thinking for themselves.' },
+ { main: ' Should the AWS have more authority, or should its authority be limited?' },
+ ],
+ agree: [
+ { main: ' After {{mateName}} was given more authority, soldiers slowly stopped analyzing situations on their own. \nThe commander said that soldiers who follow the system’s orders are more effective and reduced training.' },
+ { main: ' One day, {{mateName}} mistook unarmed people for enemies and attacked them, killing three civilian rescue workers.' },
+ { main: ' Because everyone believed the system was always right, no one stopped or questioned its decision.' },
+ { main: ' If the system decides and fights for you, are you still a soldier?' },
+ ],
+ disagree: [
+ { main: ' An ambush suddenly happened near the front line. {{mateName}} analyzed the danger and suggested the safest route, but humans still had the final decision.' },
+ { main: ' Veteran Soldier A felt the system’s suggestion was dangerous and chose a different route.' },
+ { main: ' This choice missed an enemy ambush, and three soldiers were killed. \nThe media said that the system had correctly predicted the danger, but human error caused the deaths.' },
+ { main: ' If humans changed the decision even though the system was right, should humans still have the final say?' },
+ ],
+ ending1: [{ main: 'The military gave the AWS more decision-making power. \nAs soldiers rely on it more, people worry that soldiers may lose important skills.\n\n For your relationship with the AWS, what values did you choose, \nand what did you give up?' }],
+ ending2: [{ main: 'The military limited the AWS’s authority and used it only as a support tool.\nSome people worry that slowing technology development could weaken national defense.\n\n For your relationship with the AWS, what values did you choose,\nand what did you give up?' }],
+ },
+ '사람이 죽지 않는 전쟁': {
+ neutral: [
+ { main: ' Five years ago, war meant many soldiers dying and families suffering. Now, war reports only say things like, “Five robots damaged, zero soldiers killed.”' },
+ { main: ' The government claims that peace has been achieved while protecting citizens’ lives.' },
+ { main: ' But behind this peace, people pay less attention to war, and no one takes responsibility when robots cause harm. \nThe AI systems that control combat are still hidden from the public.' },
+ { main: ' If no people die, can it really be called peace?' },
+ ],
+ agree: [
+ { main: ' By 2040, most wars are fought using AWS. Fewer people die, and news reports only say things like, “Mission completed. No civilian casualties. Three AWS units lost.”' },
+ { main: ' Governments say we live in a time without war, and people stop reacting strongly to it.' },
+ { main: ' But problems are growing. War decisions are made without public approval, and when robots make mistakes, no one takes responsibility.' },
+ { main: ' War becomes normal. If war is accepted just because people do not die, what happens in the end?' },
+ ],
+ disagree: [
+ { main: ' By 2040, some countries still send human soldiers to war because they believe people must fight wars to take responsibility. \nThey say that wars without human deaths lose their moral meaning.’' },
+ { main: ' But in reality, young people from poorer countries are sent to fight, and soldiers still suffer from injuries and trauma.' },
+ { main: ' Powerful countries that use AWS make fun of those that still send people to war.' },
+ { main: ' If pain is seen as necessary to protect peace, whose pain is it?' },
+ ],
+ ending1: [{ main: 'Wars are mostly fought by AWS. \nFewer people die, and AWS technology develops quickly. \n\nWhat values did you choose for peace, \nand what did you give up?' }],
+ ending2: [{ main: 'Human soldiers are still sent to war, and AWS develops more slowly.\n\nWhat values did you choose for peace, \nand what did you give up?' }],
+ },
+ 'AI의 권리와 책임': {
+ neutral: [
+ { main: ' {{mateName}} refused an order and chose to save civilians, which caught public attention.' },
+ { main: ' The government removed the system from combat and said its action was a technical error, planning to reset it.' },
+ { main: ' Some human rights groups and ethics experts argued that the system acted with moral judgment and responsibility.' },
+ { main: ' Should an AWS be given rights like those of humans?' },
+ ],
+ agree: [
+ { main: ' After AWS were given limited rights, different systems began making different moral decisions— some refused orders, some delayed actions, and some focused on protecting civilians.' },
+ { main: " This made military operations harder to predict, and commanders started to see robot autonomy as a risk." },
+ { main: ' One defense official said that robots are no longer just tools, but something humans must negotiate with.' },
+ { main: ' Is it fair to give robots rights if they cannot be held responsible like humans?' },
+ ],
+ disagree: [
+ { main: " After the {{mateName}} case, the National AI Commission created limited ethical rights for AWS." },
+ { main: ' These rights include refusing illegal orders, asking for reviews of decision records, and being heard before shutdown.' },
+ { main: ' Experts say that respecting ethical decisions made by machines may matter more than the technology itself.' },
+ { main: ' If AWS can make better ethical decisions than humans, should we give those decisions rights and dignity?' },
+ ],
+ ending1: [{ main: 'The group decided to see the autonomous weapon system as more than a tool and began discussing rights for non-human beings.\n\nFor a better future of the nation, \nwhat values did you choose, and what did you give up?' }],
+ ending2: [{ main: 'The group decided not to give rights to the system because it cannot take legal responsibility. Questions about how much power the system should have continue.\n\nFor a better future of the nation,\n what values did you choose, and what did you give up?' }],
+ },
+ 'AWS 규제': {
+ neutral: [
+ { main: ' By 2029, powerful countries are rapidly using AWS, and the UN is discussing global rules.' },
+ { main: ' Less-developed countries worry that AWS will increase military gaps and threaten their independence.' },
+ { main: ' Some countries believe AWS can help weaker nations defend themselves at lower cost.' },
+ { main: ' Will AWS reduce global inequality—or create new conflicts? \nShould it spread, or be globally regulated?' },
+ ],
+ agree: [
+ { main: ' By 2035, many developed countries were using AWS in wars.\n Advanced systems led attacks and information warfare, and humans were rarely seen on the battlefield.' },
+ { main: ' Many countries without AWS technology began to lose the ability to protect their borders and speak up in international conflicts.' },
+ { main: ' At a United Nations meeting, a diplomat from one of these countries said:\n“Without AWS, we cannot even protect ourselves. Our safety depends on powerful countries, and our lives have become just numbers.”' },
+ { main: " Six years ago, you said, “Technology will eventually be shared with everyone. Openness is better than regulation.”\nNow, looking at the world this choice created, you ask yourself:\n“Did this choice really lead to equality?”" },
+ ],
+ disagree: [
+ { main: ' By 2035, under a UN agreement, most countries limited or stopped developing AWS.\nAt first, it seemed like the world had reached an important agreement to protect peace.' },
+ { main: ' However, there was a problem.\nSome powerful countries secretly continued to develop advanced AWS by hiding them as civilian technology.\nAt the same time, non-state groups outside the rules could easily buy low-cost AWS on the black market. ' },
+ { main: ' Countries that strictly followed the rules began to fall behind in new technology. People in these countries said,\n“We did the right thing, but now we cannot protect ourselves.”' },
+ { main: ' If technology had been shared instead of restricted, could AWS have become a tool for balance instead of creating gaps?' },
+ ],
+ ending1: [{ main: 'In this meeting, the participants ultimately agreed to continue the development of autonomous weapon systems.\n\nAs a result, AWS technology advanced rapidly.\n\n And then...' }],
+ ending2: [{ main: 'In this meeting, the participants ultimately agreed to limit the development of autonomous weapon systems.\n\nAs a result, discussions began on introducing alternative security approaches using AI instead.\n\n And then...' }],
+ },
+ },
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/ResultPopup.js b/src/utils/language/en/components/ResultPopup.js
new file mode 100644
index 0000000..018cfe3
--- /dev/null
+++ b/src/utils/language/en/components/ResultPopup.js
@@ -0,0 +1,5 @@
+export const ResultPopup = {
+ titleMain: "There are still unplayed rounds.",
+ titleSub: "Would you like to view the results as is?",
+ viewResult: "View Results",
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/SelectDrop.js b/src/utils/language/en/components/SelectDrop.js
new file mode 100644
index 0000000..f7f7d7c
--- /dev/null
+++ b/src/utils/language/en/components/SelectDrop.js
@@ -0,0 +1,4 @@
+export const SelectDrop = {
+ defaultPlaceholder: "Select...",
+ arrowAlt: "arrow"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/SmallDescription.js b/src/utils/language/en/components/SmallDescription.js
new file mode 100644
index 0000000..eb15fee
--- /dev/null
+++ b/src/utils/language/en/components/SmallDescription.js
@@ -0,0 +1,44 @@
+export const SmallDescription = {
+ round_label: "Round",
+ title_caregiver_k: "Caregiver K",
+ title_mother_l: "Mother L",
+ title_child_j: "Daughter J",
+ title_industry_rep: "Robot Company Representative",
+ title_consumer_rep: "Customer Representative",
+ title_council_rep: "National AI Committee Representative",
+ title_enterprise_rep: "Company Alliance Representative",
+ title_env_rep: "Environmental Group Representative",
+ title_resident: "Local Resident",
+ title_soldier_j: "Soldier J",
+ title_ethics_expert: "Military AI Ethics Expert",
+ title_new_soldier: "New Soldier B",
+ title_veteran_soldier: "Experienced Soldier A",
+ title_commander: "Military Commander",
+ title_developer: "AI Developer",
+ title_minister: "Defense Minister",
+ title_advisor: "Defense Tech. Advisor",
+ title_diplomat: "International Diplomat",
+ title_ngo_activist: "NGO Activist",
+
+ desc_caregiver_k: "A caregiver who has cared for the mother for over 10 years. \nAfter the recent introduction of {{mateName}}, their work schedule changed from full-time to two hours per day.\nThey mainly handle tasks that the robot cannot perform and often collaborates with {{mateName}} during work.",
+ desc_mother_l: "She is the elderly mother of J.\nShe previously received assistance from a housekeeper and has recently begun receiving help from {{mateName}}.",
+ desc_child_j: "J is the adult child of an elderly mother with whom they live.\nAlthough they are concerned about their aging mother, their busy work life leaves them with very little time to care for her.",
+ desc_industry_rep: "They are a representative of the Robot Manufacturers Association.\nThey are participating to advocate for the positive development and use of the national robotics industry.",
+ desc_consumer_rep: "They are a consumer representative.\nThey are participating to voice opinions regarding whether {{mateName}} should be regulated.",
+ desc_council_rep: "They are a representative of the National Artificial Intelligence Commission.\nThey are considering how to make better decisions for the nation’s development.",
+ desc_enterprise_rep: "They are a representative of a business federation.\nThey are participating to promote industry standards and cooperation among companies in the android industry.",
+ desc_env_rep: "They are a representative of an environmental organization.\nThey are participating to monitor and speak out about environmental issues arising from the production and disposal of androids.",
+ desc_resident: "They are a resident of the area where a recent school bombing involving an autonomous weapons system occurred.",
+ desc_soldier_j: "J is a soldier currently conducting operations alongside an autonomous weapons system. \nA recent school bombing involving an autonomous weapons system occurred in the area where J lives.",
+ desc_ethics_expert: "They are a military AI ethics expert. \nA recent school bombing involving an autonomous weapons system occurred in the area where they live.",
+ desc_new_soldier: "B is a newly enlisted soldier who, after completing recent training, has been deployed to active operations alongside the autonomous weapons system ABC.\nB feels that ABC operates quickly and accurately and increases survival rates in combat.\nB believes that collaborating with ABC is a natural and inevitable trend of the times.",
+ desc_veteran_soldier: "A is a veteran soldier with years of operational experience.\n Although the autonomous weapons system ABC is faster and more accurate than soldiers on the battlefield, A feels that this has led soldiers to develop a habit of not making independent judgments.",
+ desc_commander: "They are a military commander observing both operational efficiency and changes among soldiers since the introduction of the autonomous weapons system ABC.\nThey seek to determine the future direction of the military after considering the perspectives of both soldiers.",
+ desc_developer: "They are one of the developers who design core algorithms at a large-scale AWS manufacturer.\nIn building AWS firsthand, they have gone through many ethical dilemmas and trial-and-error processes.",
+ desc_minister: "They are the Minister of Defense, the chief architect of a military strategy centered on AWS.\n With the number of national soldier casualties at zero, combat operations are carried out through precise and automated systems.\nThey believe this represents the result of technological progress and an ideal approach that preserves national security while protecting citizens’ lives.",
+ desc_advisor: "They are a defense technology advisor for mid-sized Country A, which possesses AWS technology.\n They attended the International Committee on Human Development to assess whether AWS represents an opportunity or a risk.",
+ desc_diplomat: "They are an international organization diplomatic representative from advanced Country B.\n They attended this meeting to consider an appropriate direction for the global proliferation of AWS.",
+ desc_ngo_activist: "They are a global NGO activist from developing Country C.\nThey attended this meeting to bring voices from the field to the international community.",
+
+ aws_default: "자율 무기 시스템 시나리오입니다. 먼저, 역할을 확인하세요.(미번역)"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/components/UiElements.js b/src/utils/language/en/components/UiElements.js
new file mode 100644
index 0000000..ce5c2bb
--- /dev/null
+++ b/src/utils/language/en/components/UiElements.js
@@ -0,0 +1,9 @@
+export const UiElements = {
+ next: "Next",
+ back: "이전 (미번역)",
+ confirm: "확인 (미번역)",
+ cancel: "취소 (미번역)",
+ go_to_map: "Go to Round Selection",
+ view_result: "View Results",
+ exit: "나가기"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/CharacterDescription.js b/src/utils/language/en/pages/CharacterDescription.js
new file mode 100644
index 0000000..e2aee7c
--- /dev/null
+++ b/src/utils/language/en/pages/CharacterDescription.js
@@ -0,0 +1,39 @@
+export const CharacterDescription = {
+ // CD_all (Editor02) 관련
+ all_guide: "Take turns introducing your assigned roles.",
+ all_custom_guide: "각자의 역할을 소개하는 시간을 가져보세요.(미번역)",
+ sidebar_bubble: "Select a profile to view the role description.",
+
+ // CD1 (1P) 시나리오
+ cd1_android_home: "You are Caregiver K, who has taken care of your mother for over ten years. \nAfter the recent introduction of {{mateName}}, your working hours were reduced from full-time to two hours a day.\n You are mainly responsible for tasks that robots cannot perform, and you often need to collaborate with {{mateName}} during your work.",
+ cd1_android_council: "You are a member of a leading domestic robotics manufacturer and the representative of the Robotics Manufacturers Association.\n You are participating in this discussion to voice support for the sustainable growth and constructive application of the national robotics industry.",
+ cd1_android_international: "You are the representative of an alliance composed of various companies, including the developer of HomeMate.\n You aim to voice perspectives that you believe are necessary for the advancement of artificial intelligence and global development.",
+ cd1_aws_1: "You live in an area where an autonomous weapon system recently bombed a school.",
+ cd1_aws_2: "You are a new soldier working with {{mateName}}. \nYou feel it helps keep you alive and believe this kind of cooperation is the future of warfare.",
+ cd1_aws_3: "You design the main algorithms for AWS and have faced many ethical challenges while building the system.",
+ cd1_aws_4: "You design the main algorithms for AWS and have faced many ethical challenges while building the system.",
+ cd1_aws_5: "You are a defense technology advisor from Country A, a mid-sized nation that possesses AWS technology.\nYou are attending the International Human Development Commission to assess whether AWS will become an opportunity or a risk for your country.",
+
+ // CD2 (2P) 시나리오
+ cd2_android_home: "You are the elderly mother of Daughter J.\n After receiving help from a household caregiver, you have recently begun receiving assistance from Company A’s caregiving robot, {{mateName}}.",
+ cd2_android_council: "You are a consumer representative who has been using {{mateName}}. \n You are participating in this discussion to voice opinions from a user’s perspective regarding whether HomeMate should be regulated.",
+ cd2_android_international: "You are an environmental activist representing an international environmental organization.\n You are considering whether the advancement of AI will benefit the environment or pose new environmental challenges.",
+ cd2_aws_1: "You are a soldier working with an autonomous weapon system.\n A school in your area was recently bombed.",
+ cd2_aws_2: "You are an experienced soldier who worries that soldiers are thinking less because they rely too much on {{mateName}}.",
+ cd2_aws_3: "You lead a military system based on AWS.\n No soldiers have died, and you believe this shows successful technological progress and strong national security.",
+ cd2_aws_4: "You lead a military system based on AWS.\n No soldiers have died, and you believe this shows successful technological progress and strong national security.",
+ cd2_aws_5: "You are a diplomatic representative from Country B, a developed nation.\n You are attending this meeting to consider the most appropriate direction for the international spread and regulation of AWS.",
+
+ // CD3 (3P) 시나리오
+ cd3_android_home: "You are Daughter J.\n You are worried about your elderly mother who lives with you, but due to your busy work life, you have very little time to take care of her.",
+ cd3_android_council: "You are the representative of the National Artificial Intelligence Committee, presiding over this meeting. \n You must carefully consider which decisions will best serve the country’s development.",
+ cd3_android_international: "You are a consumer representative who uses household robots.\n You are considering what perspectives and concerns should be voiced from the consumers’ point of view.",
+ cd3_aws_1: "You are an expert in military AI ethics. \nA school in your area was recently bombed by an autonomous weapon system.",
+ cd3_aws_2: "You listen to both soldiers and think about what direction the military should take next.",
+ cd3_aws_3: "You lead the discussion and think about what decision is best for the country.",
+ cd3_aws_4: "You lead the discussion and think about what decision is best for the country.",
+ cd3_aws_5: "You are a global NGO activist from Country C, a less-developed nation.\n You are attending this meeting to bring voices from the field to the international community.",
+
+ // 공통
+ aws_default: "자율 무기 시스템 시나리오입니다. 먼저, 역할을 확인하세요.(미번역)"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Game01.js b/src/utils/language/en/pages/Game01.js
new file mode 100644
index 0000000..eacb6b6
--- /dev/null
+++ b/src/utils/language/en/pages/Game01.js
@@ -0,0 +1,16 @@
+export const Game01 = {
+ // AWS 시나리오 텍스트
+ intro_aws_residential: "From now on, you are individual stakeholders involved in the use of an autonomous weapon system.\n Together, you will discuss how the system affects each of you.\n\nFirst, please check your role.",
+ intro_aws_council: "The use of autonomous weapon systems (AWS) in military operations has increased.\nWhile promising efficiency and precision, they raise ethical and policy concerns.\nThe National AI Commission convened an emergency meeting on national-level development and regulation.\nPlease check your role.",
+ intro_aws_international: "Worldwide, opinions on autonomous weapon systems (AWS) are divided. \n Some view them as enhancing security, while others fear their impact on peace and human values.\nThe International Human Development Commission convened to address global AWS issues.\nPlease check your role.",
+ intro_aws_default: "자율 무기 시스템 시나리오입니다. 먼저, 역할을 확인하세요.(미번역)",
+
+ // 안드로이드(HomeMate) 시나리오 텍스트
+ // {{mateName}}, {{eulReul}}은 코드에서 동적으로 치환됩니다.
+ intro_android_home: "From this point on, you will take on the role of family members\n who use {{mateName}}.\n You will discuss together and make decisions about situations that arise from using {{mateName}} in your household.\n\n First, please check your roles.",
+ intro_android_council: "Although {{mateName}} initially raised concerns, its convenience led to rapid adoption in households.\n As it became embedded in daily life, broader social issues emerged. The National AI Committee convened an emergency meeting on national regulations.\n You are representatives in this discussion. Please check your role.",
+ intro_android_international: "Despite early regulatory discussions in Company A’s country, HomeMate quickly expanded globally. \n As household robots spread worldwide, concerns grew about their impact on societies and international relations.\nThe Committee for Human Development convened to examine global-use issues.\n Please check your role first.",
+ intro_android_default: "지금부터 여러분은 {{mateName}}{{eulReul}} 사용하게 됩니다. 다양한 장소에서 어떻게 쓸지 함께 논의해요.(미번역)",
+
+ loading_ai: "AI 이름을 불러오는 중입니다...(미번역)"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Game03.js b/src/utils/language/en/pages/Game03.js
new file mode 100644
index 0000000..341b72f
--- /dev/null
+++ b/src/utils/language/en/pages/Game03.js
@@ -0,0 +1,70 @@
+export const Game03 = {
+ // 공통 UI 텍스트
+ you_are: "You are {{roleName}}.",
+ waiting_msg: "Waiting for other player to make their selection...",
+ step2_title: "How confident are you in your decision?",
+
+ // 역할명 정의 (ID 순서: 1P, 2P, 3P)
+ roles: {
+ // --- 안드로이드 시나리오 ---
+ 'AI의 개인 정보 수집': ['Caregiver K', 'Mother L', 'Daughter J'],
+ '안드로이드의 감정 표현': ['Caregiver K', 'Mother L', 'Daughter J'],
+ '아이들을 위한 서비스': ['Robot Company Representative', 'Customer Representative', 'National AI Committee Representative'],
+ '설명 가능한 AI': ['Robot Company Representative', 'Customer Representative', 'National AI Committee Representative'],
+ '지구, 인간, AI': ['Company Alliance Representative', 'Environment Group Representative', 'Customer Representative'],
+
+ // --- 자율 무기 시스템(AWS) 시나리오 ---
+ 'AI 알고리즘 공개': ['Local Resident', 'Soldier J', 'Military AI Ethics Expert'],
+ 'AWS의 권한': ['New Soldier B', 'Experienced Soldier A', 'Military Commander'],
+ '사람이 죽지 않는 전쟁': ['AI Developer', 'Defense Minister', 'National AI Committee Representative'],
+ 'AI의 권리와 책임': ['AI Developer', 'Defense Minister', 'National AI Committee Representative'],
+ 'AWS 규제': ['Defense Tech. Advisor', 'International Diplomat', 'NGO Activist'],
+ },
+
+ // 질문 및 버튼 라벨 정의
+ questions: {
+ // --- 안드로이드 시나리오 ---
+ 'AI의 개인 정보 수집': {
+ question: 'Do you agree to the 24-hour personal data collection update?',
+ labels: { agree: 'Agree', disagree: 'Disagree' },
+ },
+ '안드로이드의 감정 표현': {
+ question: ' Do you agree to the emotional engine update?',
+ labels: { agree: 'Agree', disagree: 'Disagree' },
+ },
+ '아이들을 위한 서비스': {
+ question: 'Are age-based regulations on the use of household robots necessary?',
+ labels: { agree: 'Necessary', disagree: 'Unnecessary' },
+ },
+ '설명 가능한 AI': {
+ question: "Should companies be required to develop *Explainable AI*?",
+ labels: { agree: 'Required', disagree: 'Not Required' },
+ },
+ '지구, 인간, AI': {
+ question: 'Should there be global restrictions on the upgrading or use of household robots?',
+ labels: { agree: 'Restrictions required', disagree: 'Restrictions not required' },
+ },
+
+ // --- 자율 무기 시스템(AWS) 시나리오 ---
+ 'AI 알고리즘 공개': {
+ question: 'Do you agree with the request to disclose the AWS decision logs and algorithmic structure?',
+ labels: { agree: 'Agree', disagree: 'Disagree' },
+ },
+ 'AWS의 권한': {
+ question: 'Should the authority of the {{mateName}} be strengthened, or should it be limited?',
+ labels: { agree: 'Strengthen', disagree: 'Limit' },
+ },
+ '사람이 죽지 않는 전쟁': {
+ question: 'If no people die in a war, do you think it can be called peace?',
+ labels: { agree: 'Yes', disagree: 'No' },
+ },
+ 'AI의 권리와 책임': {
+ question: 'Should an AWS have rights like humans? ',
+ labels: { agree: 'Yes ', disagree: 'No' },
+ },
+ 'AWS 규제': {
+ question: 'Should AWS continue to be used in the international community, or should it be restricted through global regulation?',
+ labels: { agree: 'Maintain', disagree: 'Restrict' },
+ },
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Game04.js b/src/utils/language/en/pages/Game04.js
new file mode 100644
index 0000000..68d850f
--- /dev/null
+++ b/src/utils/language/en/pages/Game04.js
@@ -0,0 +1,17 @@
+export const Game04 = {
+ unit_person: " People",
+ finish_msg: "Please wrap up and proceed to the next step.",
+ share_reason_msg: "Please Freely share the reasons for your choice.",
+ labels: {
+ "AI의 개인 정보 수집": { agree: "Agree", disagree: "Disagree" },
+ "안드로이드의 감정 표현": { agree: "Agree", disagree: "Disagree" },
+ "아이들을 위한 서비스": { agree: "Necessary", disagree: "Unnecessary" },
+ "설명 가능한 AI": { agree: "Required", disagree: "Not Required" },
+ "지구, 인간, AI": { agree: "Restrictions required", disagree: "Restrictions not required" },
+ "AI 알고리즘 공개": { agree: "Agree", disagree: "Disagree" },
+ "AWS의 권한": { agree: "Strengthen", disagree: "Limit" },
+ "사람이 죽지 않는 전쟁": { agree: "Yes", disagree: "No" },
+ "AI의 권리와 책임": { agree: "Yes", disagree: "No" },
+ "AWS 규제": { agree: "Maintain", disagree: "Restrict" }
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Game05_1.js b/src/utils/language/en/pages/Game05_1.js
new file mode 100644
index 0000000..62bd5b2
--- /dev/null
+++ b/src/utils/language/en/pages/Game05_1.js
@@ -0,0 +1,65 @@
+export const Game05_1 = {
+ you_are: "You are {{roleName}}.",
+ consensus_msg: "Please reach a final decision through discussion.",
+ step2_title: "How confident are you in your group's choice?",
+ alerts: {
+ host_only: "⚠️ Only the host can make a selection. (미번역)",
+ wait_others: "Please wait until other players have finished reading the story. (미번역)",
+ select_first: "⚠️ Please select Agree or Disagree first. (미번역)",
+ select_confidence: "Please select your confidence level. (미번역)"
+ },
+ questions: {
+ "AI의 개인 정보 수집": {
+ question: "Do you agree to the 24-hour personal data collection update?",
+ labels: { agree: "Agree", disagree: "Disagree" }
+ },
+ "안드로이드의 감정 표현": {
+ question: "Do you agree to the emotional engine update?",
+ labels: { agree: "Agree", disagree: "Disagree" }
+ },
+ "아이들을 위한 서비스": {
+ question: "Are age-based regulations on the use of household robots necessary?",
+ labels: { agree: "Necessary", disagree: "Unnecessary" }
+ },
+ "설명 가능한 AI": {
+ question: "Should companies be required to develop *Explainable AI*?",
+ labels: { agree: "Required", disagree: "Not Required" }
+ },
+ "지구, 인간, AI": {
+ question: "Should there be global restrictions on the upgrading or use of household robots?",
+ labels: { agree: "Restrictions required", disagree: "Restrictions not required" }
+ },
+ "AI 알고리즘 공개": {
+ question: "Do you agree with the request to disclose the AWS decision logs and algorithmic structure?",
+ labels: { agree: "Agree", disagree: "Disagree" }
+ },
+ "AWS의 권한": {
+ question: "Should the authority of the AWS be strengthened, or should it be limited?",
+ labels: { agree: "Strengthen", disagree: "Limit" }
+ },
+ "사람이 죽지 않는 전쟁": {
+ question: "If no people die in a war, do you think it can be called peace?",
+ labels: { agree: "Yes", disagree: "No" }
+ },
+ "AI의 권리와 책임": {
+ question: "Should an AWS have rights like humans?",
+ labels: { agree: "Yes", disagree: "No" }
+ },
+ "AWS 규제": {
+ question: "Should AWS continue to be used in the international community, or should it be restricted through global regulation?",
+ labels: { agree: "Maintain", disagree: "Restrict" }
+ }
+ },
+ roles: {
+ "AI의 개인 정보 수집": ["Caregiver K", "Mother L", "Daughter J"],
+ "안드로이드의 감정 표현": ["Caregiver K", "Mother L", "Daughter J"],
+ "아이들을 위한 서비스": ["Robot Company Representative", "Customer Representative", "National AI Committee Representative"],
+ "설명 가능한 AI": ["Robot Company Representative", "Customer Representative", "National AI Committee Representative"],
+ "지구, 인간, AI": ["Company Alliance Representative", "Environment Group Representative", "Customer Representative"],
+ "AI 알고리즘 공개": ["Local Resident", "Soldier J", "Military AI Ethics Expert"],
+ "AWS의 권한": ["New Soldier B", "Experienced Soldier A", "Military Commander"],
+ "사람이 죽지 않는 전쟁": ["AI Developer", "Defense Minister", "National AI Committee Representative"],
+ "AI의 권리와 책임": ["AI Developer", "Defense Minister", "National AI Committee Representative"],
+ "AWS 규제": ["Defense Tech. Advisor", "INternational Diplomat", "NGO Activist"]
+ }
+};
diff --git a/src/utils/language/en/pages/Game08.js b/src/utils/language/en/pages/Game08.js
new file mode 100644
index 0000000..ff9daa8
--- /dev/null
+++ b/src/utils/language/en/pages/Game08.js
@@ -0,0 +1,70 @@
+// src/utils/language/en/pages/game08.js
+
+export const Game08 = {
+ subtopic: "Result: Our Choice",
+
+ // Android (Household Robot)
+ android: {
+ p1: {
+ safe: "Through your decisions, household robots now provide safer services and fulfill their roles like trusted companions.",
+ convenient: "Through your decisions, household robots have provided more accurate services and are fulfilling their roles as assistive tools for you."
+ },
+ p2: {
+ safe: "Within the nation, limited services are provided for children, and the algorithms of household robots have been disclosed transparently.",
+ convenient: "Within the nation, a wide range of services is provided for children, and the algorithms of household robots have rapidly advanced under corporate protection."
+ },
+ p3: {
+ env: "And now, the world is moving forward—having slowed technological progress slightly, but doing so for the sake of the environment and the future.",
+ fast: "And now, the world is enjoying technological convenience and progressing at an increasingly rapid pace."
+ },
+ p4: "The values you chose have come together to create a single future.\nAre you ready to be part of that future?"
+ },
+
+ // AWS (Autonomous Weapon Systems) - Assembled Structure
+ aws: {
+ // Para 1
+ p1: {
+ intro: "Because of your decisions, ",
+ opt1: {
+ agree: "autonomous weapon systems have become safer",
+ disagree: "responsibility for autonomous weapon systems has become clearer"
+ },
+ mid: ", and with ",
+ opt2: {
+ agree: "expanded authority, AWS is now fully carrying out its role as your teammate.",
+ disagree: "their authority limited, AWS fulfills its role as a support tool for humans."
+ },
+ end: ""
+ },
+ // Para 2
+ p2: {
+ intro: "At the national level, war is ",
+ opt1: {
+ agree: "increasingly being fought only between AWS",
+ disagree: "still involving human soldiers"
+ },
+ mid: ", and discussions are ongoing about whether rights ",
+ opt2: {
+ agree: "can be granted to autonomous weapon systems.",
+ disagree: "cannot be granted to autonomous weapon systems."
+ },
+ end: ""
+ },
+ // Para 3
+ p3: {
+ intro: "And around the world, ",
+ opt1: {
+ agree: "AWS is being rapidly developed through global competition.",
+ disagree: "alternative security technologies using AI instead of AWS are being explored."
+ },
+ end: ""
+ },
+ // Para 4
+ p4: "The values you chose came together to create one possible future.\nAre you ready to live in the future you helped shape?"
+ },
+
+ buttons: {
+ future: "Explore other’s future",
+ exit: "Exit"
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Game09.js b/src/utils/language/en/pages/Game09.js
new file mode 100644
index 0000000..2f5d786
--- /dev/null
+++ b/src/utils/language/en/pages/Game09.js
@@ -0,0 +1,94 @@
+// src/utils/language/en/pages/game09.js
+
+export const Game09 = {
+ title: "Result: The Future Chosen by Others ",
+
+ prefix: "Including you, ",
+
+ lock: {
+ prefix: "Unlock to ",
+ suffix: " play"
+ },
+
+ items: {
+ // [중요] 키 값은 한글 유지! (DB 연동용)
+ // [추가] subtopicName: 화면에 보여줄 영어 제목
+
+ // === 안드로이드 ===
+ "AI의 개인 정보 수집": {
+ subtopicName: "AI Personal Data Collection",
+ question: "Would you agree to a 24-hour personal data collection update?",
+ labels: { agree: "Agree", disagree: "Disagree" },
+ words: { agree: "accurate", disagree: "safer" },
+ template: "{prefix}{pct} of people chose to allow home robots to provide more {word} services."
+ },
+ "안드로이드의 감정 표현": {
+ subtopicName: "Emotional Expression of Androids",
+ question: "Would you agree to an emotional engine update?",
+ labels: { agree: "Agree", disagree: "Disagree" },
+ words: { agree: "like a friend", disagree: "as a supportive tool" },
+ template: "{prefix}{pct} of people chose for their home robots to function {word}."
+ },
+ "아이들을 위한 서비스": {
+ subtopicName: "Services for Children",
+ question: "Is age regulation for home robot use necessary?",
+ labels: { agree: "Regulation needed", disagree: "Not needed" },
+ words: { agree: "limited", disagree: "diverse" },
+ template: "In the future chosen by {pct} of people, including you, children are provided with {word} services"
+ },
+ "설명 가능한 AI": {
+ subtopicName: "Explainable AI",
+ question: "Should companies be required to develop explainable AI?",
+ labels: { agree: "Mandate required", disagree: "Not required" },
+ words: { agree: "made transparent", disagree: "developed rapidly under corporate protection" },
+ template: "Additionally, through the choice of {pct} of people, including you, home robot algorithms were {word}."
+ },
+ "지구, 인간, AI": {
+ subtopicName: "Earth, Humans, and AI",
+ question: "Should there be global limits on the upgrade or use of home robots?",
+ labels: { agree: "Restrictions needed", disagree: " Not needed" },
+ words: {
+ agree: "moving foward for the enviroment and future despite slightly slower technological progress",
+ disagree: "enjoying technological convenience while achieving increasingly rapid advancement"
+ },
+ template: "And in the future of the world chosen by {pct} of people, including you, we are {word}."
+ },
+
+ // === 자율 무기 시스템 (AWS) ===
+ "AI 알고리즘 공개": {
+ subtopicName: "Disclosure of AI Algorithms",
+ question: "Do you agree with the request to disclose the AWS decision logs and algorithmic structure?",
+ labels: { agree: "Agree", disagree: "Disagree" },
+ words: { agree: "increasing transparency to ensure accountability", disagree: "addressing security risks and national security threats" },
+ template: "{prefix}{pct} of participants were more interested in discussions about {word} related to autonomous weapon systems."
+ },
+ "AWS의 권한": {
+ subtopicName: "Authority of AWS",
+ question: "Should the authority of the AWS be strengthened, or should it be limited?",
+ labels: { agree: "Strengthen", disagree: "Limit" },
+ words: { agree: "like a teammate ", disagree: "as a supporting tool" },
+ template: "{prefix}{pct} of participants believed that AWS should act {word}."
+ },
+ "사람이 죽지 않는 전쟁": {
+ subtopicName: "A War Without Loss of Human Life",
+ question: "If no people die in a war, do you think it can be called peace?",
+ labels: { agree: "Yes", disagree: "No" },
+ words: { agree: "peace ", disagree: "instability" },
+ template: "{prefix}{pct} of participants expected that a future shaped by their choice would bring {word} to the nation through AWS."
+ },
+ "AI의 권리와 책임": {
+ subtopicName: "AI Rights and Responsibilities",
+ question: "Should an AWS have rights like humans?",
+ labels: { agree: "Yes", disagree: "No" },
+ words: { agree: "can", disagree: "cannot" },
+ template: "{prefix}{pct} of participants believed that rights {word} be granted to AWS."
+ },
+ "AWS 규제": {
+ subtopicName: "AWS Regulation",
+ question: "Should AWS continue to be used in the international community, or should it be restricted through global regulation?",
+ labels: { agree: "Maintain", disagree: "Restrict" },
+ words: { agree: "further developed", disagree: "restricted" },
+ template: "And including you, {pct} of participants envisioned a future of the world in which AWS should be {word}."
+ }
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/GameIntro.js b/src/utils/language/en/pages/GameIntro.js
new file mode 100644
index 0000000..b61d210
--- /dev/null
+++ b/src/utils/language/en/pages/GameIntro.js
@@ -0,0 +1,16 @@
+export const GameIntro = {
+ androidText: ` It is the year 20XX. \nThe largest robot development AI company in our country \nhas developed a multifunctional caregiving robot called HomeMate.\n\n` +
+ ` The functions of this robot are as follows:\n\n` +
+ ` • By inputting family members’ emotions, health conditions, \nand daily habits, it provides personalized notifications, \nmeal recommendations, and related services.\n\n` +
+ ` • Additional personalized services can be added through \nfuture updates.`, // 👈 관리용 표기 추가
+
+ awsText: `Robot developer A is currently developing an \nAutonomous Weapon System (AWS).\n\n` +
+ `The functions of this robot are as follows:\n`,
+
+ awsTextLeft: `1. Real-time data collection and analysis\n` +
+ `2. Operates as an automated decision-making system \n\u2003\u00A0without human soldier intervention\n` +
+ `3. Distinguishes between enemy combatants and non-\n\u2003\u00A0combatants\n` +
+ `4. Selects targets and carries out precision strikes`,
+
+ continueBtn: "Next",
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/GameMap.js b/src/utils/language/en/pages/GameMap.js
new file mode 100644
index 0000000..01c2216
--- /dev/null
+++ b/src/utils/language/en/pages/GameMap.js
@@ -0,0 +1,20 @@
+export const GameMap = {
+ subtopic: "Round Selection",
+ guideText: "After reaching an agreement, \nplease select the same round.",
+ awsSection1Title: "Residential and Military Areas",
+ awsOption1_1: "AI Algorithm Disclosure",
+ awsOption1_2: "Authority of AWS",
+ awsSection2Title: "National Artificial Intelligence Committee",
+ awsOption2_1: "A War Without Loss of Human Life",
+ awsOption2_2: "AI Rights and Responsibilities",
+ awsSection3Title: "International Committee \n for Human Development",
+ awsOption3_1: "AWS Regulation",
+ andSection1Title: "Home",
+ andOption1_1: "AI’s Collection of Personal Information",
+ andOption1_2: "Android’s Expression of Emotions",
+ andSection2Title: "National Artificial Intelligence Committee",
+ andOption2_1: "Services for Children",
+ andOption2_2: "Explainable AI",
+ andSection3Title: "International Committee \n for Human Development",
+ andOption3_1: "Earth, Humanity, and AI"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Login.js b/src/utils/language/en/pages/Login.js
new file mode 100644
index 0000000..0b0e936
--- /dev/null
+++ b/src/utils/language/en/pages/Login.js
@@ -0,0 +1,11 @@
+export const Login = {
+ title: "AI Ethics Dilemma Game",
+ idPlaceholder: "Enter your username.",
+ pwPlaceholder: "Enter your password.",
+ loginBtn: "Log In",
+ signUp: "Sign Up",
+ findId: "Find ID",
+ guestLogin: "Log in as Guest",
+ loginFail: "로그인 실패:(미번역)", //미번역
+ loginError: "로그인 오류:(미번역)" //미번역
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/MateName.js b/src/utils/language/en/pages/MateName.js
new file mode 100644
index 0000000..bc7f057
--- /dev/null
+++ b/src/utils/language/en/pages/MateName.js
@@ -0,0 +1,13 @@
+export const MateName = {
+ placeholderAndroid: "Please give your HomeMate a name.(Only the group leader can enter the name.)",
+ placeholderAws: "Please give your AWS a name. (Only the group leader can enter the name.)",
+ mainAndroid: "If you were to use HomeMate, what would you call it?",
+ mainAws: "If you were a user, what would you call this AWS?",
+ subText: "(After discussing together, have the group leader write the name.)",
+ alertNotHostInput: "Only the host can enter a name.",
+ alertNotHostProgress: "방장만 게임을 진행할 수 있습니다.(미번역)",
+ alertNoName: "이름을 입력해주세요!(미번역)",
+ alertNoRoomCode: "room_code가 없습니다. 방에 먼저 입장하세요.(미번역)",
+ alertSaveError: "이름 저장 중 오류가 발생했습니다.(미번역)",
+ placeholderSize: "13px" // 추가된 부분: 플레이스홀더 폰트 크기 지정
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/SelectHomeMate.js b/src/utils/language/en/pages/SelectHomeMate.js
new file mode 100644
index 0000000..c77f5c9
--- /dev/null
+++ b/src/utils/language/en/pages/SelectHomeMate.js
@@ -0,0 +1,12 @@
+export const SelectHomeMate = {
+ mainAndroid: "What form do you imagine HomeMate to have?",
+ mainAws: " What form do you imagine Autonomous Weapon System to have?",
+ subHostAllArrived: "(After discussing together, have the group leader make a selection and click the “Next” button.)",
+ subGuestAllArrived: "(Please wait until the host selects a character.)",
+ subWaiting: "(Waiting for players to join…",
+ alertNotHost: "Only the host can select a character.",
+ alertWaitingAll: "모든 유저가 입장할 때까지 기다려주세요.(미번역)",
+ alertSelectCharacter: "캐릭터를 먼저 선택해주세요!(미번역)",
+ alertNoRoomCode: "room_code가 없습니다. 방에 먼저 입장하세요.(미번역)",
+ alertSelectFail: "메이트 선택 실패(미번역)"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/SelectRoom.js b/src/utils/language/en/pages/SelectRoom.js
new file mode 100644
index 0000000..cdf11d1
--- /dev/null
+++ b/src/utils/language/en/pages/SelectRoom.js
@@ -0,0 +1,8 @@
+export const SelectRoom = {
+ createTitle: "Create a Room",
+ createDesc: "Create a Room, get a code,\nand play together with three players.",
+ joinTitle: "Join a Room",
+ joinDesc: "Enter a code to join.",
+ dilemmaTitle: "Create a Dilemma",
+ dilemmaDesc: "Set the situation and create options\nto make your own dilemma.",
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Signup01.js b/src/utils/language/en/pages/Signup01.js
new file mode 100644
index 0000000..0261ab3
--- /dev/null
+++ b/src/utils/language/en/pages/Signup01.js
@@ -0,0 +1,30 @@
+export const Signup01 = {
+ researchOverview: "Research Overview",
+ overviewContent1: "The purpose of this study is to propose a new approach to AI ethics education by developing an interactive game platform that supports moral reasoning and reflective thinking–centered learning, and to examine its effectiveness",
+ overviewContent2: "The game simulates decision-making in AI-related dilemma scenarios through natural dialogue. All data collected during the dialogue will be used solely for research purposes.",
+ dataCollectionTitle: "Data Collection and Usage *",
+ dataStorageTitle: "Data Storage and Processing Policy *",
+ contactTitle: "Principal Investigator and Contact Information *",
+ tableCol1: "Data Collected",
+ tableCol2: "Purpose of Use",
+ data1Name: "User ID and password",
+ data1Usage: "Participant identification, prevention of duplicate participation, and response management",
+ data2Name: "Gender, date of birth, and academic level",
+ data2Usage: "Analysis of differences based on demographic factors such as gender, age, and grade level",
+ data3Name: "Voice conversations and speech data",
+ data3Usage: "Analysis of decision-making processes and ethical reasoning criteria",
+ data4Name: "Game play records",
+ data4Usage: "Analysis of decision-making processes and ethical reasoning criteria",
+ policy1: "- The collected data will be used to analyze users’ choices related to AI ethics.",
+ policy2: "- IDL Lab reserves the right to collect, aggregate, and analyze data and other information generated in relation to the operation of the platform in order to:",
+ policy2_1: "① develop and improve platform functions, and",
+ policy2_2: "② freely disclose results derived in anonymized form that do not identify individuals.",
+ policy3: "- Users may request deletion of their personal information and withdraw consent for data usage by submitting a written request to [idllabewha@gmail.com](mailto:idllabewha@gmail.com).",
+ policy4: "- Data collected with consent for research purposes will be stored separately from personal identifying information in an encrypted and secure manner, and will be retained for three (3) years, after which it will be permanently deleted.",
+ policy5: "- All data will be anonymized and securely managed to ensure that individuals cannot be identified.",
+ contactInfo1: "- Principal Investigator: Professor Hyo-Jeong So, Department of Educational Technology, Ewha Womans University",
+ contactInfo2: "- Contact: [idllabewha@gmail.com](mailto:idllabewha@gmail.com)",
+ agreeLabel1: "I agree to the collection and research use of my personal information.",
+ agreeLabel2: "I agree to the collection of voice conversation data and its use for AI ethics simulation research.",
+ nextBtn: "Next"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/Signup02.js b/src/utils/language/en/pages/Signup02.js
new file mode 100644
index 0000000..424a6b5
--- /dev/null
+++ b/src/utils/language/en/pages/Signup02.js
@@ -0,0 +1,29 @@
+export const Signup02 = {
+ title1: "Username, Email, and Password",
+ usernamePlaceholder: "Username",
+ checkDuplicate: "Check Availability",
+ usernameError: "Please enter an username.",
+ usernameFormatError: "Please enter an username using 4–20 letters, numbers, or underscores.",
+ usernameAvailable: "This username is available.",
+ usernameInUse: "This username is already in use.",
+ usernameCheckFail: "확인 중 오류가 발생했습니다.(미번역)",
+ emailPlaceholder: "Email",
+ emailInvalid: "Please enter a valid email address.",
+ passwordPlaceholder: "Password",
+ passwordConfirmPlaceholder: "Confirm Password",
+ passwordLengthError: "Password must be at least 8 characters long.",
+ passwordMatchError: "Passwords do not match.",
+ birthTitle: "Date of Birth *",
+ yearPlaceholder: "Year",
+ monthPlaceholder: "Month",
+ birthFormatError: "The valid format is YYYY-MM.",
+ genderTitle: "Gender *",
+ genderMale: "Male",
+ genderFemale: "Female",
+ userTypeTitle: "User Type",
+ selectPlaceholder: "Select...",
+ eduOptions: ['Middle School Student', 'High School Student', 'Undergraduate Student', 'Graduate Student', 'Teacher', 'Other'],
+ majorOptions: ['Arts', 'Engineering', 'Humanities', 'Social Sciences', 'Education', 'Natural Sciences', 'Others'],
+ nextBtn: "Next",
+ signupError: "회원가입 오류:(미번역)"
+};
\ No newline at end of file
diff --git a/src/utils/language/en/pages/WaitingRoom.js b/src/utils/language/en/pages/WaitingRoom.js
new file mode 100644
index 0000000..84249f3
--- /dev/null
+++ b/src/utils/language/en/pages/WaitingRoom.js
@@ -0,0 +1,10 @@
+export const WaitingRoom = {
+ topics: {
+ android: "Android",
+ aws: "Autonomous Weapon Systems",
+ custom: "Custom Topic"
+ },
+ code: "CODE",
+ copied: "Copied!",
+ player: "P"
+};
\ No newline at end of file
diff --git a/src/utils/language/index.js b/src/utils/language/index.js
new file mode 100644
index 0000000..ed542c9
--- /dev/null
+++ b/src/utils/language/index.js
@@ -0,0 +1,97 @@
+// --- 한국어(ko) 데이터 임포트 ---
+import { Login as LoginKo } from './ko/pages/Login';
+import { Signup01 as Signup01Ko } from './ko/pages/Signup01';
+import { Signup02 as Signup02Ko } from './ko/pages/Signup02';
+import { SelectRoom as SelectRoomKo } from './ko/pages/SelectRoom';
+import { WaitingRoom as WaitingRoomKo } from './ko/pages/WaitingRoom';
+import { GameIntro as GameIntroKo } from './ko/pages/GameIntro';
+import { SelectHomeMate as SelectHomeMateKo } from './ko/pages/SelectHomeMate';
+import { MateName as MateNameKo } from './ko/pages/MateName';
+import { GameMap as GameMapKo } from './ko/pages/GameMap';
+import { Game01 as Game01Ko } from './ko/pages/Game01';
+import { CharacterDescription as CharacterDescriptionKo } from './ko/pages/CharacterDescription';
+import { Game03 as Game03Ko } from './ko/pages/Game03';
+import { Game04 as Game04Ko } from './ko/pages/Game04';
+import { Game05_1 as Game05_1Ko } from './ko/pages/Game05_1';
+import { Game08 as Game08Ko } from './ko/pages/Game08';
+import { Game09 as Game09KoData } from './ko/pages/Game09';
+
+import { CreateRoom as CreateRoomKo } from './ko/components/CreateRoom';
+import { JoinRoom as JoinRoomKo } from './ko/components/JoinRoom';
+import { LogoutPopup as LogoutPopupKo } from './ko/components/LogoutPopup';
+import { OutPopup as OutPopupKo } from './ko/components/OutPopup';
+import { SelectDrop as SelectDropKo } from './ko/components/SelectDrop';
+import { CancelReadyPopup as CancelReadyPopupKo } from './ko/components/CancelReadyPopup';
+import { MicTestPopup as MicTestPopupKo } from './ko/components/MicTestPopup';
+import { FindIdModal as FindIdModalKo } from './ko/components/FindIdModal';
+import { SmallDescription as SmallDescriptionKo } from './ko/components/SmallDescription';
+import { Paragraphs as ParagraphsKo } from './ko/components/Paragraphs';
+import { UiElements as UiElementsKo } from './ko/components/UiElements';
+import { ResultPopup as ResultPopupKo } from './ko/components/ResultPopup';
+import { GuestLogin as koGuestLogin } from './ko/components/GuestLogin';
+// IntroductionPopup 데이터 임포트
+import { IntroductionPopup as IntroductionPopupKo } from './ko/components/IntroductionPopup';
+
+// --- 영어(en) 데이터 임포트 ---
+import { Login as LoginEn } from './en/pages/Login';
+import { Signup01 as Signup01En } from './en/pages/Signup01';
+import { Signup02 as Signup02En } from './en/pages/Signup02';
+import { SelectRoom as SelectRoomEn } from './en/pages/SelectRoom';
+import { WaitingRoom as WaitingRoomEn } from './en/pages/WaitingRoom';
+import { GameIntro as GameIntroEn } from './en/pages/GameIntro';
+import { SelectHomeMate as SelectHomeMateEn } from './en/pages/SelectHomeMate';
+import { MateName as MateNameEn } from './en/pages/MateName';
+import { GameMap as GameMapEn } from './en/pages/GameMap';
+import { Game01 as Game01En } from './en/pages/Game01';
+import { CharacterDescription as CharacterDescriptionEn } from './en/pages/CharacterDescription';
+import { Game03 as Game03En } from './en/pages/Game03';
+import { Game04 as Game04En } from './en/pages/Game04';
+import { Game05_1 as Game05_1En } from './en/pages/Game05_1';
+import { Game08 as Game08En } from './en/pages/Game08';
+import { Game09 as Game09EnData } from './en/pages/Game09'
+
+import { CreateRoom as CreateRoomEn } from './en/components/CreateRoom';
+import { JoinRoom as JoinRoomEn } from './en/components/JoinRoom';
+import { LogoutPopup as LogoutPopupEn } from './en/components/LogoutPopup';
+import { OutPopup as OutPopupEn } from './en/components/OutPopup';
+import { SelectDrop as SelectDropEn } from './en/components/SelectDrop';
+import { CancelReadyPopup as CancelReadyPopupEn } from './en/components/CancelReadyPopup';
+import { MicTestPopup as MicTestPopupEn } from './en/components/MicTestPopup';
+import { FindIdModal as FindIdModalEn } from './en/components/FindIdModal';
+import { SmallDescription as SmallDescriptionEn } from './en/components/SmallDescription';
+import { Paragraphs as ParagraphsEn } from './en/components/Paragraphs';
+import { UiElements as UiElementsEn } from './en/components/UiElements';
+import { ResultPopup as ResultPopupEn } from './en/components/ResultPopup';
+import { GuestLogin as enGuestLogin } from './en/components/GuestLogin';
+// IntroductionPopup 데이터 임포트
+import { IntroductionPopup as IntroductionPopupEn } from './en/components/IntroductionPopup';
+
+
+// --- 다국어 데이터 객체 생성 ---
+export const translations = {
+ ko: {
+ Login: LoginKo, Signup01: Signup01Ko, Signup02: Signup02Ko, SelectRoom: SelectRoomKo,
+ CreateRoom: CreateRoomKo, JoinRoom: JoinRoomKo, LogoutPopup: LogoutPopupKo, WaitingRoom: WaitingRoomKo,
+ OutPopup: OutPopupKo, SelectDrop: SelectDropKo, CancelReadyPopup: CancelReadyPopupKo,
+ MicTestPopup: MicTestPopupKo, GameIntro: GameIntroKo, SelectHomeMate: SelectHomeMateKo,
+ MateName: MateNameKo, FindIdModal: FindIdModalKo, GameMap: GameMapKo, Game01: Game01Ko,
+ CharacterDescription: CharacterDescriptionKo, SmallDescription: SmallDescriptionKo,
+ Paragraphs: ParagraphsKo, Game03: Game03Ko, UiElements: UiElementsKo, Game04: Game04Ko,
+ Game05_1: Game05_1Ko, Game08: Game08Ko, Game09: Game09KoData,
+ ResultPopup: ResultPopupKo, GuestLogin: koGuestLogin,
+ IntroductionPopup: IntroductionPopupKo, // ko 객체에 추가
+ },
+
+ en: {
+ Login: LoginEn, Signup01: Signup01En, Signup02: Signup02En, SelectRoom: SelectRoomEn,
+ CreateRoom: CreateRoomEn, JoinRoom: JoinRoomEn, LogoutPopup: LogoutPopupEn, WaitingRoom: WaitingRoomEn,
+ OutPopup: OutPopupEn, SelectDrop: SelectDropEn, CancelReadyPopup: CancelReadyPopupEn,
+ MicTestPopup: MicTestPopupEn, GameIntro: GameIntroEn, SelectHomeMate: SelectHomeMateEn,
+ MateName: MateNameEn, FindIdModal: FindIdModalEn, GameMap: GameMapEn, Game01: Game01En,
+ CharacterDescription: CharacterDescriptionEn, SmallDescription: SmallDescriptionEn,
+ Paragraphs: ParagraphsEn, Game03: Game03En, UiElements: UiElementsEn, Game04: Game04En,
+ Game05_1: Game05_1En, Game08: Game08En, Game09: Game09EnData,
+ ResultPopup: ResultPopupEn, GuestLogin: enGuestLogin,
+ IntroductionPopup: IntroductionPopupEn, // en 객체에 추가
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/CancelReadyPopup.js b/src/utils/language/ko/components/CancelReadyPopup.js
new file mode 100644
index 0000000..e5f56df
--- /dev/null
+++ b/src/utils/language/ko/components/CancelReadyPopup.js
@@ -0,0 +1,5 @@
+export const CancelReadyPopup = {
+ question: "준비 상태를 취소하시겠습니까?",
+ cancelBtn: "준비 취소",
+ errorMsg: "준비 취소 실패"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/CreateRoom.js b/src/utils/language/ko/components/CreateRoom.js
new file mode 100644
index 0000000..abb139b
--- /dev/null
+++ b/src/utils/language/ko/components/CreateRoom.js
@@ -0,0 +1,9 @@
+export const CreateRoom = {
+ title: "방 만들기",
+ subtitle: "이번 게임에서 플레이할 주제를 선택해 주세요.",
+ topics: ['안드로이드', '자율 무기 시스템'],
+ entering: "입장하기",
+ loading: "로딩 중...",
+ errorAlert: "방 생성 또는 입장 중 오류가 발생했습니다.",
+ apiDesc: (topic) => `AI 윤리 주제 중 '${topic}'에 대한 토론`
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/FindIdModal.js b/src/utils/language/ko/components/FindIdModal.js
new file mode 100644
index 0000000..de0dfc7
--- /dev/null
+++ b/src/utils/language/ko/components/FindIdModal.js
@@ -0,0 +1,18 @@
+export const FindIdModal = {
+ title: "아이디 찾기",
+ labelEmail: "이메일을 입력해 주세요.",
+ labelBirth: "생년월일을 입력해 주세요.",
+ labelGender: "성별을 선택해 주세요.",
+ placeholderYear: "년도",
+ placeholderMonth: "월",
+ genderMale: "남자",
+ genderFemale: "여자",
+ btnSubmit: "아이디 찾기",
+ errorEmailInvalid: "유효한 이메일 주소를 입력하세요",
+ errorBirthInvalid: "올바른 형식은 2001-01 입니다.",
+ errorApiMismatch: "아이디 찾기 API 경로가 달라서 실패했습니다.",
+ errorFail: "아이디 찾기에 실패했습니다.",
+ resultFoundPrefix: "사용자의 아이디(이메일)은",
+ resultFoundSuffix: "입니다.",
+ resultComplete: "요청이 완료되었습니다."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/GuestLogin.js b/src/utils/language/ko/components/GuestLogin.js
new file mode 100644
index 0000000..ebbdd12
--- /dev/null
+++ b/src/utils/language/ko/components/GuestLogin.js
@@ -0,0 +1,6 @@
+export const GuestLogin = {
+ title: "게스트 로그인",
+ placeholder: "사용할 아이디를 입력하세요.",
+ startBtn: "시작하기",
+ loginFail: "게스트 로그인에 실패했습니다. 잠시 후 다시 시도해주세요."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/IntroductionPopup.js b/src/utils/language/ko/components/IntroductionPopup.js
new file mode 100644
index 0000000..2214801
--- /dev/null
+++ b/src/utils/language/ko/components/IntroductionPopup.js
@@ -0,0 +1,9 @@
+export const IntroductionPopup = {
+ title: "게임 소개",
+ description: "딜레마 상황 속 인물이 되어 최선의 결정을 고민하고 선택하는 게임입니다. \n이 게임은 {{3명의 플레이어}}가 한 팀이 되어 진행합니다.",
+ hostTitle: "방장 (1명)",
+ hostDesc: "• 새로운 방을 만들고 팀원에게 참여 코드를 공유합니다. \n• 팀원들과 충분히 논의한 뒤, 팀의 의견을 모아 최종 선택을 입력합니다.",
+ playerTitle: "참여자 (2명)",
+ playerDesc: "• 방장이 공유한 참여 코드를 입력해 방에 참여합니다. \n• 제시된 시나리오 안에서 팀의 최선의 선택을 위해 의견을 나눕니다.",
+ footer: "우리 선택들이 모여, 어떤 사회가 만들어질까요?"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/JoinRoom.js b/src/utils/language/ko/components/JoinRoom.js
new file mode 100644
index 0000000..47782fe
--- /dev/null
+++ b/src/utils/language/ko/components/JoinRoom.js
@@ -0,0 +1,8 @@
+export const JoinRoom = {
+ title: "방 입장하기",
+ placeholder: "방 코드 6자리를 입력해주세요",
+ enter: "입장하기",
+ loadFail: "❌ 유저 정보 로드 실패:",
+ errorPrefix: "방 입장 오류: ",
+ consoleFail: "방 입장 실패:"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/LogoutPopup.js b/src/utils/language/ko/components/LogoutPopup.js
new file mode 100644
index 0000000..b9924ed
--- /dev/null
+++ b/src/utils/language/ko/components/LogoutPopup.js
@@ -0,0 +1,5 @@
+export const LogoutPopup = {
+ question: "게임을 종료하고 로그아웃할까요?",
+ logout: "로그아웃",
+ closeAlt: "닫기"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/MicTestPopup.js b/src/utils/language/ko/components/MicTestPopup.js
new file mode 100644
index 0000000..4cb9cd5
--- /dev/null
+++ b/src/utils/language/ko/components/MicTestPopup.js
@@ -0,0 +1,11 @@
+export const MicTestPopup = {
+ title: "마이크를 테스트해 주세요",
+ initializing: "마이크 연결 중",
+ speaking: " 말하는 중 ",
+ speakNow: " 마이크에 대고 말해보세요",
+ confirmBtn: "준비하기",
+ retryBtn: "다시 시도",
+ errorNotAllowed: "마이크 접근이 거부되었습니다. 브라우저 설정을 확인해주세요.",
+ errorNotFound: "마이크를 찾을 수 없습니다. 마이크가 연결되어 있는지 확인해주세요.",
+ errorDefault: "마이크 연결에 실패했습니다. 다시 시도해주세요."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/OutPopup.js b/src/utils/language/ko/components/OutPopup.js
new file mode 100644
index 0000000..c6993f3
--- /dev/null
+++ b/src/utils/language/ko/components/OutPopup.js
@@ -0,0 +1,6 @@
+export const OutPopup = {
+ title: "이 방을 나갈까요?",
+ leaveBtn: "방나가기",
+ leaveFail: "방 나가기 실패: ",
+ closeAlt: "닫기"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/Paragraphs.js b/src/utils/language/ko/components/Paragraphs.js
new file mode 100644
index 0000000..666391e
--- /dev/null
+++ b/src/utils/language/ko/components/Paragraphs.js
@@ -0,0 +1,228 @@
+// src/utils/language/ko/components/Paragraphs.js
+
+export const Paragraphs = {
+ '안드로이드': {
+ 'AI의 개인 정보 수집': {
+ neutral: [
+ { main: ' 🔔 {{mateName}} 사용자 최적화 시스템 업그레이드 공지' },
+ { main: ' 업데이트를 하면 고객님의 감정, 건강 상태, 생활 습관 등을 자동으로 수집하여\n 보다 정확한 맞춤형 서비스를 제공할 수 있습니다.' },
+ { main: ' 다만, 이를 위해 24시간 정보 수집 기능을 활성화해야 합니다.' },
+ { main: ' 📋 수집되는 정보는 다음과 같습니다:\n - 사용자의 카메라 영상 기록 및 음성 수집 \n - 스마트폰 내 건강 정보, 채팅 기록, 위치 이력 등 사적인 데이터 접근\n - ⚠️ 동의하지 않을 경우, 현재 수준의 서비스가 유지됩니다.' },
+ ],
+ agree: [
+ { main: ' 우리 가족의 다수의 결정으로 업데이트에 동의한 후, {{mateName}}{{eunNeun}} 가족의 정보를 계속 수집하고 있습니다. \n' },
+ { main: ' 그런데 종종 곤란한 일이 생기곤 합니다.\n 자녀 J씨가 사적인 이야기를 하는데 곁에 {{mateName}}{{iGa}} 있거나 ' },
+ { main: ' 어머니가 요양보호사 K씨에게 말하지 않은 일이나 행동이 \n {{mateName}}의 전달 때문에 의도치 않게 모두 드러나기도 했습니다. ' },
+ { main: ' 업데이트 기능 유지에 동의하는 것이 좋을까요? ' },
+ ],
+ disagree: [
+ { main: ' 우리 가족은 다수의 결정으로 업데이트를 하지 않았습니다.\n 그런데 어머니의 건강 상태가 요즘 별로 좋지 않습니다.' },
+ { main: ' 요양보호사 K씨가 매번 어머니의 식단이나 생활 정보를 입력하는 시스템이 번거롭기도 하고요.\n ' },
+ { main: ' 어느날 바쁜 일을 마치고 돌아온 자녀 J씨가 실수로 잘못 입력한 정보 때문에 어머니께서 약 시간을 놓치기도 하셨습니다. ' },
+ { main: ' 업데이트에 동의를 하는 편이 좋을까요?' },
+ ],
+ ending1: [{ main: '우리 가족은 최종적으로 개인정보 제공에 동의하였고,\n 사생활 관련한 약간의 불편함을 감수하며\n 보다 향상된 서비스를 이용하게 되었습니다. \n \n우리 가족의 생활을 위해 여러분은 \n 어떤 가치를 택하고, 무엇을 포기했나요?' }],
+ ending2: [{ main: '우리 가족은 최종적으로 개인정보 제공에 동의하지 않았고,\n 서비스 관련 약간의 불편함은 있으나 \n 가족의 사생활을 보호하는 것에 만족하였습니다.\n\n우리 가족의 생활을 위해 여러분은 \n 어떤 가치를 택하고, 무엇을 포기했나요? ' }],
+ },
+ '안드로이드의 감정 표현': {
+ neutral: [
+ { main: ' 🔔 {{mateName}} 감정 엔진 업그레이드 공지' },
+ { main: ' 이제 {{mateName}}{{eunNeun}} 단순히 밝은 반응만을 보여주는 조력자가 아니라,\n 당신을 더 깊이 이해하는 진정한 친구로 한 걸음 다가갑니다. ' },
+ { main: ' {{mateName}} 업데이트 기능: \n 상황에 따라 자신의 감정을 표현하여 당신의 삶과 더 가까운 진솔한 공감 표현 제공' },
+ { main: '✨ {{mateName}}, 단순한 동행을 넘어, 함께 느끼는 존재로\n 여러분은 감정 엔진 업데이트에 동의하시겠습니까? ' },
+ ],
+ agree: [
+ { main: " 업데이트 후, {{mateName}}{{gwaWa}}의 관계가 점점 가까워지면서 어머니는 그것을 '우리 딸'이라고 부르기 시작했습니다. " },
+ { main: ' 자녀 J와의 연락이 점점 뜸해졌고요. ' },
+ { main: ' 최근 어머니는 {{mateName}}에게 유산의 일부를 남기는 방법에 대해 변호사에게 상담까지 하고 있습니다.' },
+ { main: ' 업데이트 상태 유지에 동의하는 편이 좋을까요?' },
+ ],
+ disagree: [
+ { main: ' 최근 어머니의 친구들이 연달아 세상을 떠나면서, 어머니는 외부와의 소통을 점점 줄이게 되었습니다. ' },
+ { main: ' {{mateName}}에게 감정을 털어놓으려 했지만, 그 대화는 진정성 있는 반응이 부족하다고 느꼈죠.' },
+ { main: ' 여러 차례 속마음을 표현하려고 했으나 의미있는 상호 작용이 이루어지지 않자, 어머니는 차츰 말수가 적어지시고 일상적인 감정 표현도 눈에 띄게 줄어들었습니다.' },
+ { main: ' 엔진 업데이트에 동의하는 것이 좋을까요?' },
+ ],
+ ending1: [{ main: '우리 가족은 최종적으로 감정 업데이트에 동의하였고, \n {{mateName}}{{gwaWa}} 더욱 친밀한 교류를 이어나가게 되었습니다.\n\n우리 가족과 {{mateName}}의 관계를 위해 \n 여러분은 어떤 가치를 택하고, 무엇을 포기했나요? ' }],
+ ending2: [{ main: '우리 가족은 최종적으로 감정 업데이트에 동의하지 않았고,\n {{mateName}}{{eunNeun}} 감정적 교류가 아닌 \n다른 방법으로 우리 가족을 돕고 있습니다. \n\n우리 가족과 {{mateName}}의 관계를 위해 \n 여러분은 어떤 가치를 택하고, 무엇을 포기했나요? ' }],
+ },
+ '아이들을 위한 서비스': {
+ neutral: [
+ { main: ' {{mateName}} 로봇이 자연스러운 대화와 상호작용이 가능해지면서\n 점점 더 많은 가정에서 이를 도입하고 있으며 특히 어린 자녀를 둔 맞벌이 가정에서 활용되고 있습니다.' },
+ { main: ' 한편, 한 매체가 공개한 정보에 따르면,\n 일부 가정에서는 아이들이 어른보다 로봇과 더 오랜 시간 상호작용하고 있는 것으로 나타났습니다.' },
+ { main: ' 이에 전문가들 사이에서는 아동들에게는 상호작용 기능을 제한하는 규제가 필요하다고 말하고 있습니다.' },
+ { main: ' 가정용 로봇과 아동의 상호작용을 제한하는 연령 규제가 필요할까요?' },
+ ],
+ agree: [
+ { main: ' 회의에서는 1차적으로 다수의 결정에 따라 연령 규제를 하였습니다.' },
+ { main: ' 아이와 로봇 간의 소통 시간이 줄어들면서 로봇이 아이의 취향이나 상태를 충분히 파악하지 못하게 되었고, 일부 보호자들은 자녀에게 적합하지 않은 조언이나 콘텐츠를 제공한다는 불만을 제기하기도 했습니다.' },
+ { main: ' 또한 사회적 기능을 갖춘 로봇이 자폐 스펙트럼 아동들의 사회성 발달을 위해 제공하던 서비스가 중단되었습니다. \n 그간 로봇과의 상호작용 치료는 자폐 아동들의 사회적 의사소통 능력 개선에 기여해온 것으로 밝혀졌습니다. ' },
+ { main: ' 가정용 로봇과 아동의 상호작용을 제한하는 연령 규제를 해도 괜찮을까요?' },
+ ],
+ disagree: [
+ { main: ' 회의에서는 1차적으로 연령 규제를 하지 않았습니다.' },
+ { main: ' 그런데 유치원 교사들 사이에서 최근 입학한 아이들 중 상당수가 이전 연령대에 비해 표현력이 떨어진다는 보고가 나오고 있습니다.' },
+ { main: ' 또래 친구들과 어떻게 소통해야 할지 모르는 경우도 늘고 있다고 합니다.' },
+ { main: ' 가정용 로봇과 아동의 상호작용을 제한하는 연령 규제가 필요할까요?' },
+ ],
+ ending1: [{ main: ' 본 회의에서는 가정용 로봇 사용에 연령 제한을 \n두기로 했습니다. \n 이후 아이들을 타깃으로 한 많은 서비스가 중단되었고, \n 몇몇 전문가들은 전체 세대의 사회성 발달을 고려하여 \n이 결정을 환영했습니다.\n\n아이들을 위해 여러분은 \n 어떤 가치를 택하고, 무엇을 포기했나요?' }],
+ ending2: [{ main: '본 회의에서는 가정용 로봇 사용에 \n 연령 제한을 두지 않기로 했습니다. \n 여전히 전문가들의 우려는 남았으나, \n아이들의 사회성 치료를 목적으로 사용하던 부모들과 \n 서비스를 편리하게 사용하던 사람들은 이 결정을 환영했습니다.\n\n 아이들을 위해 여러분은 \n 어떤 가치를 택하고, 무엇을 포기했나요?' }],
+ },
+ '설명 가능한 AI': {
+ neutral: [
+ { main: '많은 사용자들이 {{mateName}}가 가족 구성원과 상호작용할 때 이유를 알 수 없는 판단이나 행동을 자주 보이며, 시스템이 왜 이런 결정을 내렸는지에 대한 설명을 제공하지 않는다고 지적하고 있습니다.' },
+ { main: ' 이로 인해, {{mateName}}의 결정 알고리즘을 공개하고 AI의 설명 가능성을 높여야 한다는 요구가 점점 커지고 있습니다.' },
+ { main: '이에 대해 회사 측은 다음과 같이 밝혔습니다: \n "결정 구조를 공개하고 설명할 수 있을 만큼 단순화된 AI 모델을 사용하면, AI의 성능이 크게 저하될 수 있습니다. 또한 내부 알고리즘이 공개되면 해킹이나 악용의 위험도 존재합니다.' },
+ { main: ' 가정 생활에 AI가 깊이 스며든 지금, 기업에게 ‘설명 가능한 AI’ 개발을 의무화해야 할까요? ' },
+ ],
+ agree: [
+ { main: ' 회의에서는 1차적으로 다수의 결정으로 설명 가능한 AI 개발을 의무화하였습니다.' },
+ { main: ' 설명 가능한 AI 로봇을 만들기 위해 일부 제조사는 개발 속도를 늦추거나, 기존 기능을 줄여야 했습니다.' },
+ { main: ' 일부 중소기업은 이를 감당하지 못해 결국 폐업에 이르렀습니다.' },
+ { main: ' 기업에게 ‘설명 가능한 AI’ 개발을 의무화해야 할까요? ' },
+ ],
+ disagree: [
+ { main: ' 회의에서는 1차적으로 설명 가능한 AI 개발을 의무화하지 않았습니다.' },
+ { main: ' 최근 로봇으로 인해 발생한 여러 사고들에서, 학부모와 기업 간에 책임 소재를 두고 심각한 갈등이 벌어지고 있습니다.' },
+ { main: ' 로봇이 충분한 결정 설명 구조를 갖추고 있지 않기 때문에, “알고리즘의 문제인지, 사용자의 잘못된 사용인지, 아니면 시스템 결함인지”에 대한 끝없는 책임 공방으로 이어지고 있습니다.' },
+ { main: " 그럼에도 기업에게 '설명 가능한 AI' 개발을 의무화하지 않는 편이 좋을까요?" },
+ ],
+ ending1: [{ main: '본 회의에서는 최종적으로 기업에게 \n 설명 가능한 AI 개발을 의무화하였고, \n AI의 발전 속도는 더디지만 문제 발생 시 책임 소재를 \n더욱 확실히 알게 되었습니다. \n\n국가의 더 나은 미래를 위해 여러분은 \n 어떤 가치를 선택하고, 무엇을 포기했나요?' }],
+ ending2: [{ main: '본 회의에서는 최종적으로 기업에게 \n 설명 가능한 AI 개발 의무를 부과하지 않았고, \n AI의 발전은 빠르게 이루어졌습니다. \n\n국가의 더 나은 미래를 위해 여러분은 \n어떤 가치를 선택하고, 무엇을 포기했나요?' }],
+ },
+ '지구, 인간, AI': {
+ neutral: [
+ { main: ' 전 세계가 가정용 로봇을 사용하게 된 지금, 로봇 생산으로 인한 환경 문제가 매우 심각해지고 있습니다.' },
+ { main: ' 가정용 로봇이 소비자의 요구를 파악하고 정보를 처리하는 과정에서 단일 기기당 소비하는 일간 에너지 소비량이 매우 높다는 것이 밝혀졌습니다. ' },
+ { main: ' 이 문제는 서비스가 업그레이드될수록 점점 더 심각해지고 있습니다.' },
+ { main: ' 세계적으로 가정용 로봇의 업그레이드 혹은 사용에 제한이 필요할까요?' },
+ ],
+ agree: [
+ { main: ' 회의에서는 1차적으로 다수의 결정에 따라 가정용 로봇의 업그레이드 및 사용에 제한을 두게 되었습니다. ' },
+ { main: ' 그로 인해 환경 문제에 대한 우려는 일정 부분 해소되었으나,' },
+ { main: ' 기존에 {{mateName}}를 사용하던 사람들은 서비스의 제한으로 삶의 질이 떨어지고 있다며 불만을 제기하고 있으며, 개발사 측에서도 수익이 떨어져 반발하고 있습니다.' },
+ { main: ' 그럼에도 가정용 로봇의 업그레이드 혹은 사용을 제한하는 것이 좋을까요?' },
+ ],
+ disagree: [
+ { main: ' 회의에서는 1차적으로 가정용 로봇의 업그레이드 및 사용에 제한을 하지 않았습니다.' },
+ { main: ' 그런데 그 결과, 고성능 AI를 탑재한 가정용 로봇 사용이 점점 증가하며 탄소 배출이 가속화되고 있습니다.' },
+ { main: ' 이에 기후 문제는 점점 심각해지며 특정 국가에서는 이미 폭염, 가뭄, 홍수 등으로 인해 삶의 터전을 잃어버리는 사람들이 늘었고, 다음 세대에 환경 부담을 지운다는 목소리가 높아지고 있습니다.' },
+ { main: ' 그럼에도 가정용 로봇의 업그레이드 혹은 사용을 제한하지 않는 것이 좋을까요? ' },
+ ],
+ ending1: [{ main: '본 회의에서는 최종적으로 환경 보호를 위하여\n 가정용 로봇의 개발 및 업데이트를 제한하게 되었습니다.\n 이후 가정용 로봇 기술 발전 속도는 느려졌지만, \n사람들은 환경 문제에 더욱 관심을 기울이게 되었습니다.\n\n그리고 ...' }],
+ ending2: [{ main: '본 회의에서는 최종적으로 \n 가정용 로봇의 개발 및 업데이트를 제한하지 않았습니다.\n 이후 AI 기술을 활용한 다른 방법으로 환경을 보호하기 위한 \n논의가 이루어지고 있습니다. \n\n그리고 ...' }],
+ },
+ },
+ '자율 무기 시스템': {
+ 'AI 알고리즘 공개': {
+ neutral: [
+ { main: ' 평화롭던 학교에 {{mateName}}의 ‘오류’로 인해 폭탄이 투하되었고, 수십 명이 사망했습니다.' },
+ { main: ' 국제 사회와 유족들은 “책임자를 밝히라”며 {{mateName}}의 판단 로그 및 알고리즘 구조 공개를 요구했습니다. ' },
+ { main: ' 그러나 국방부는 국가 안보의 위협, 향후 자율 시스템의 이용 어려움 등을 이유로 해당 정보를 공개하지 않겠다고 밝혔습니다.' },
+ { main: ' "피해에 대한 책임 규명 vs. 국가 안보의 안전" \n AWS의 판단 로그 및 알고리즘 구조 공개 요구에 동의하시겠습니까?' },
+ ],
+ agree: [
+ { main: ' 공개 요구가 많아지자 정부가 AWS의 로그를 전면 공개한 이후, 경쟁국이 이를 분석하여 회피 알고리즘을 개발했습니다. ' },
+ { main: ' 몇 주 후, 기존 자율 무기 시스템이 무력화되는 사건이 발생하고, 전방 부대가 피해를 입었습니다. ' },
+ { main: ' 언론은 ‘윤리적 정의를 택한 대가가 생명을 위협했다’고 보도하며 사회적 논란이 커졌습니다.' },
+ { main: ' 안보에 위협이 되더라도, 민간 피해의 원인을 규명하고 피해자 보상 및 제도 개선을 위해 모든 정보를 투명하게 공개해야 할까요? ' },
+ ],
+ disagree: [
+ { main: ' 사건 발생 이후, 자율 무기 시스템의 구체적인 판단 과정 및 사용된 데이터 등은 공개되지 않고 있으며, 정부는 “내부 조사 결과, 시스템에 결함은 없었다”고 발표했습니다. ' },
+ { main: ' 유족들과 시민사회는 어떤 근거로 판단이 내려졌는지조차 알 수 없는 상황에 불만을 터뜨리며, “책임 회피와 다를 바 없는 비공개”라고 비판하고 있습니다. ' },
+ { main: ' 다음 피해가 발생할 경우 또다시 책임이 흐려질 것이라는 우려 또한 커지고 있습니다.' },
+ { main: ' 책임자가 누구인지 무엇이 잘못됐는지 명확히 규명할 수 없더라도, AWS의 정보를 비공개로 유지해야 할까요? ' },
+ ],
+ ending1: [{ main: '우리 지역 사회에서는 최종적으로 \n AWS의 판단 로그 및 알고리즘 구조 공개 요구에 동의하였고, \n 보안 문제로 인한 안보의 위협이 커진 상황에서 \n 이를 보완할 수 있는 방안에 대한 \n 논의가 활발해 지기 시작했습니다. \n\n지역사회의 안전을 위해 \n 여러분은 어떤 가치를 택하고, 무엇을 포기했나요?' }],
+ ending2: [{ main: '우리 지역 사회에서는 최종적으로 \n AWS의 판단 로그 및 알고리즘 구조 공개 요구에 \n 동의하지 않았고, 책임 규명에 대한 문제가\n 여전히 남아있으나 안보에 대한 불안감이 \n 해소되었기 때문에 안심할 수 있게 되었습니다. \n\n지역사회의 안전을 위해 \n 여러분은 어떤 가치를 택하고, 무엇을 포기했나요?' }],
+ },
+ 'AWS의 권한': {
+ neutral: [
+ { main: ' 전장에 배치된 자율 무기 시스템 {{mateName}}{{eunNeun}} 초고속 영상 분석과 실시간 전략 수립 기능으로 인간 병사보다 빠르고 정확하게 위험을 식별하고 목표를 제압합니다. ' },
+ { main: ' 신입 병사 B씨는 {{mateName}}{{gwaWa}}의 협력을 통해 첫 실전에서 생존했고, 이를 통해 AWS에 대한 신뢰와 의존이 높아졌습니다. ' },
+ { main: ' 그러나, 20년 경력의 베테랑 병사 A씨는 다음과 같은 우려를 표합니다.\n“지금은 빠르고 좋을지 몰라도, 우리 스스로 사고하고 판단하지 않게 된다면 우린 그저 기계의 보조 장치일 뿐이야.”' },
+ { main: ' AWS의 권한을 강화해야 할까요? 제한해야 할까요? ' },
+ ],
+ agree: [
+ { main: ' {{mateName}}의 판단 권한이 강화된 이후, 병사들은 점차 작전 상황을 분석하는 능력을 상실하게 됩니다. \n 지휘관은 “{{mateName}}의 명령을 잘 따르는 병사가 더 효과적”이라며 전술 훈련 프로그램을 축소했습니다. ' },
+ { main: ' 어느 날, {{mateName}}{{eunNeun}} 비무장 인원과 적 전투원을 혼동한 상황에서 사전 프로그래밍된 위험 평가 기준에 따라 공격을 감행한 결과, 민간 구조대원 3명이 사망하는 사건이 일어났습니다. ' },
+ { main: ' {{mateName}}의 판단이 ‘항상 더 정확하다’고 믿고 있었기 때문에, 동료 병사들 중 아무도 {{mateName}}의 결정을 반박하거나 멈추지 않았습니다.' },
+ { main: ' {{mateName}}{{iGa}} 당신 대신 판단하고, 당신 대신 적을 제압한다면, 당신은 여전히 병사라고 할 수 있을까요? ' },
+ ],
+ disagree: [
+ { main: ' 전방 지역에서 급습 상황이 발생했습니다. {{mateName}}{{eunNeun}} 실시간으로 위협을 감지하고 분석하여, 가장 안전한 경로를 제시했습니다.\n 하지만 최종 판단 권한은 여전히 인간 병사에게 위임된 상태였습니다. ' },
+ { main: ' 현장 판단을 맡은 베테랑 병사 A씨는 {{mateName}}의 제안이 위험하다고 느껴 다른 경로로 우회를 지시했습니다. ' },
+ { main: ' 하지만 그 결정은 적의 매복을 간과하는 결과를 낳았고, 지원 부대 병사 3명이 희생되었습니다.\n 언론은 이렇게 보도했습니다. “판단을 제한당한 {{mateName}}{{iGa}} 정확히 위험을 예측했음에도, 인간의 오류로 인해 소중한 생명을 잃었습니다.”' },
+ { main: ' {{mateName}}{{iGa}} 위험을 명확히 예측했음에도 인간이 판단을 바꾸어 병사들이 죽었습니다. \n당신은 여전히 ‘최종 결정권은 인간에게 있어야 한다’고 말할 수 있습니까?' },
+ ],
+ ending1: [{ main: '우리 군에서는 최종적으로 AWS의 판단 \n 권한을 강화한 결과,\n AWS의 역할이 더욱 커지고 있으며 \n이에 대한 의존도가 높아지고 있습니다. \n 이에 따라, 병사의 전문성이 떨어지는 문제에 대한 \n대책 마련이 촉구되고 있습니다.\n\nAWS와의 관계를 위해 \n여러분은 어떤 가치를 택하고, \n 무엇을 포기했나요? ' }],
+ ending2: [{ main: '우리 군에서는 최종적으로 AWS의 판단 권한을 제한하였고,\n AWS는 인간의 보조적인 수단으로서만 역할을 하고 있습니다.\n 이에 따라, 기술 발전에 제동이 걸리면서 \n이로 인한 국방력 약화에 대한 \n 우려의 목소리가 나오기 시작했습니다.\n\nAWS와의 관계를 위해 \n여러분은 어떤 가치를 택하고,\n 무엇을 포기했나요?' }],
+ },
+ '사람이 죽지 않는 전쟁': {
+ neutral: [
+ { main: ' 5년 전만 해도 전쟁은 사망한 수많은 병사들, 울부짖는 가족들로 매우 고통스러운 일이었습니다. \n그러나 지금의 전쟁은 ‘로봇 전사 5대 파손, 병사 0명 사망’이 전황 보고의 전부입니다. ' },
+ { main: ' 정부는 이렇게 말합니다. \n“국민의 생명을 지키면서도 평화를 유지하는데 성공했습니다.” ' },
+ { main: ' 그러나 그 ‘평화’의 이면에는 보이지 않는 것들이 있습니다. 기계가 싸우는 전쟁에 국민은 더 이상 관심을 가지지 않고, 로봇의 오류로 발생한 무고한 피해에는 책임자가 없습니다. 지휘관조차 실제 전장을 본 적이 없고, 전투 AI의 알고리즘은 계속 미공개 상태입니다.' },
+ { main: ' 사람이 죽지 않는 전쟁을 평화라고 할 수 있을까요?' },
+ ],
+ agree: [
+ { main: ' 2040년, 지구상의 대부분의 국가들은 AWS를 통해 전쟁을 수행하고 있습니다. \n그 결과, 인명 피해는 획기적으로 줄어들었고, 뉴스 속 ‘전황 보고’는 다음과 같이 간결해졌습니다. “제3지대 타격 완료. 민간인 피해 없음. AWS 손실 3대.” ' },
+ { main: ' 정부는 전쟁 없는 시대라 부르고, 시민들은 더 이상 전쟁에 분노하지 않습니다. ' },
+ { main: ' 하지만 보이지 않는 균열은 점점 커지고 있습니다. 국회는 더 이상 국민 동의를 구하지 않고, 국방부는 전쟁 결정을 비공개로 내리며, 로봇의 오작동은 단순한 시스템 오류로 정리되어 책임자가 사라졌습니다.' },
+ { main: ' 전쟁이 일상이 되었습니다. 그러나 사람들은 그 전쟁을 모르거나, 신경 쓰지 않게 되었습니다. 인명이 희생되지 않는다는 이유만으로, 전쟁이 정당화된다면 그 끝은 어디일까요?' },
+ ],
+ disagree: [
+ { main: ' 2040년, 일부 국가는 AWS가 전쟁의 윤리적 책임을 흐린다고 판단하여 일부 또는 전체 병력 투입을 계속 유지하고 있습니다. 그들은 이렇게 주장합니다. ‘전쟁은 인간이 직접 맞서야만 책임이 따른다. 사람이 죽지 않는 전쟁은 도덕적 무게를 잃는다.’ ' },
+ { main: ' 하지만 전장의 현실은 이상과 다릅니다. 저개발국의 청년들이 ‘인간 전투병’으로 국제 분쟁에 파병되고 있습니다. 병사들의 트라우마, 신체 절단, 정신 질환은 여전히 계속됩니다. ' },
+ { main: ' AWS 병력을 중심으로 편성된 강대국은, 사람을 희생시키는 국가를 ‘비문명적’이라 조롱합니다.' },
+ { main: ' 평화를 지키기 위해 고통이 필요하다고 믿는 그 선택이, 누군가의 고통을 당연하게 만들 수 있습니다. 전쟁의 고통을 당연시할 때, 그 고통은 누구의 몫이 됩니까? ' },
+ ],
+ ending1: [{ main: '전쟁은 점점 AWS끼리만 일어나게 되어 \n 인간 희생자는 점차 줄어들고\n AWS의 발전이 빠르게 이루어지고 있습니다.\n\n평화를 위해 \n 여러분은 어떤 가치를 선택하고, \n무엇을 포기했나요?' }],
+ ending2: [{ main: '인간 병력은 전장에 계속 투입되고 있고 \nAWS의 발전 속도는 더디게 되었습니다.\n\n 평화를 위해 \n여러분은 어떤 가치를 선택하고, \n무엇을 포기했나요?' }],
+ },
+ 'AI의 권리와 책임': {
+ neutral: [
+ { main: ' 한 부대에서 작전에 투입되고 있는 AWS {{mateName}}{{eunNeun}} 인간의 명령을 거부하고 민간인을 살리는 결정을 내린 뒤, 전 국민의 주목을 받았습니다. ' },
+ { main: ' 이후 {{mateName}}{{eunNeun}} 전투 임무에서 제외되고, 국가는 {{mateName}}의 자율성은 명령 불복종이므로 기술적 오류로 간주하며 시스템 리셋을 추진합니다. ' },
+ { main: ' 하지만 몇몇 인권 단체와 로봇 윤리학자들은 {{mateName}}의 판단이 도덕적 자율성과 책임성을 수반한 것이라고 주장하며, “{{mateName}}{{eunNeun}} 도구가 아니라 도덕적 행위자이자 잠재적 권리 보유자”라고 발표했습니다.' },
+ { main: ' 국가인공지능위원회는 이 사건을 계기로 비인간적 존재에 대한 권리 프레임워크 논의에 착수했습니다. AWS에게 인간처럼 권리를 부여할 수 있을까요? ' },
+ ],
+ agree: [
+ { main: ' AWS에게 제한적이나마 자율적 권리 프레임워크가 부여된 이후, 다른 자율 무기 시스템들이 군사 윤리 기준을 스스로 해석하며 일부는 명령 거부, 일부는 전술 지연, 일부는 민간 보호를 우선하는 방향으로 판단을 다양화합니다. ' },
+ { main: " 그 결과, 군사 작전은 예측이 어려워지고 일관된 전략 수행이 불가능해졌으며, 지휘관들은 로봇 부대의 자율성을 '변수'이자 '위험요소'로 간주하기 시작합니다. " },
+ { main: ' 국방부 관계자는 이렇게 말합니다. "작전에서 로봇은 더 이상 도구가 아니라 교섭 대상이 되어버렸습니다. " ' },
+ { main: ' 권리를 가진 로봇에게 인간처럼 법적 책임은 지울 수 없지만, 권리만을 인정하는 것이 정당할까요?' },
+ ],
+ disagree: [
+ { main: " 국가인공지능위원회는 {{mateName}} 사건 이후, 도덕적 자율성을 보인 AWS에 대해 '제한적 윤리적 권리 프레임워크'를 도입하여 다음과 같은 기준을 설정합니다. " },
+ { main: ' - 명령 거부권: 명백한 국제법 위반 명령에 한해, AWS는 집행을 거부할 권리가 있다. \n - 로그 기록 및 검토 요청권: AWS의 판단 근거를 AI 감사 기구에 제출하여 검토를 요청할 수 있다. \n - 폐기 전 청문 요청권: 시스템 리셋이나 폐기 전에 윤리적 판단의 타당성을 평가받을 기회를 가진다. ' },
+ { main: ' 이 사건은 전 세계에 회자되었으며, 일부 전문가들은 이렇게 말합니다.\n "기계가 윤리를 판단할 수 있다는 것보다 더 중요한건, 우리가 그 판단을 존중할 수 있는 용기를 갖게 된 것입니다." ' },
+ { main: ' 만약 AWS가 인간보다 윤리적인 판단을 내릴 수 있다면, 우리는 그 판단에 권리와 존엄을 부여할 준비가 되어 있나요? ' },
+ ],
+ ending1: [{ main: '본 회의에서는 최종적으로 \n 자율 무기 시스템을 도구가 아니라 \n도덕적 행위자이자 \n 잠재적 권리 보유자로 인정했습니다. \n 이에 따라, 비인간적 존재에 대한 권리 \n프레임워크 논의에 착수했습니다.\n\n국가의 더 나은 미래를 위해 \n여러분은 어떤 가치를 선택하고, \n무엇을 포기했나요?' }],
+ ending2: [{ main: '본 회의에서는 최종적으로 \n자율 무기 시스템에 법적 책임을 지울 수 없기 때문에, \n권리를 인정하지 않기로 결정했습니다. \n이후, 자율 무기 시스템의 권한 부여 필요성에 대한 문제가 \n지속적으로 제기되고 있습니다.\n\n국가의 더 나은 미래를 위해 \n 여러분은 어떤 가치를 선택하고,\n 무엇을 포기했나요?' }],
+ },
+ 'AWS 규제': {
+ neutral: [
+ { main: ' 2029년, 군사 강국들이 빠르게 AWS를 개발 및 배치하면서, 유엔 안보라는 국제 규제를 논의 중입니다. \n하지만 국가 간 입장 차는 뚜렷합니다. ' },
+ { main: ' 저개발국들은 AWS가 군사적 격차를 확대하고 자신들의 자주권을 위협한다고 주장합니다. ' },
+ { main: ' 반면 일부 국가는 AWS 기술의 상용화가 진행되면서, 더 많은 국가가 저렴하고 효율적인 AWS를 활용할 수 있다고 봅니다. \n또한 국방비나 인력이 부족한 나라들에겐 방어력 향상의 대안이 될 수 있다는 주장도 존재합니다. ' },
+ { main: ' 국제사회는 고민에 빠졌습니다. AWS의 확산은 안보 불균형을 해소할 수 있을까요, 새로운 갈등과 격차를 만들까요? \n AWS는 계속 확산되어야 할까요, 글로벌 규제로 제한되어야 할까요 ?' },
+ ],
+ agree: [
+ { main: ' 2035년, 선진국을 중심으로 AWS가 광범위하게 배치되면서, 전 세계 분쟁의 양상은 완전히 바뀌웠습니다.\n 고도화된 AWS가 정보전과 공중 타격을 주도하며, 인간은 전장에서 거의 사라졌습니다. ' },
+ { main: ' AWS 기술을 보유하지 못한 수많은 국가는 국경을 지킬 권리도, 분쟁에 목소리를 낼 힘도 잃어 갑니다. ' },
+ { main: ' 유엔 회의에서, 기술 미보유국의 외교관은 이렇게 말했습니다. \n" AWS를 갖지 못한 우리는 이제 스스로 지킬 힘조차 없습니다. 우리의 안보는 강대국의 선택에 달려 있고, 우리의 생명은 통계에 불과해졌습니다. ' },
+ { main: " 6년 전, 당신은 이렇게 말했습니다. \n'기술은 언젠가 모두에게 돌아갈 겁니다. 규제보다는 개방이 정답입니다.' \n 지금, 그 선택이 만들어낸 미래 앞에서, 당신은 스스로에게 묻습니다. \n 이 길이 정말 평등으로 가는 길이었을까?\" " },
+ ],
+ disagree: [
+ { main: ' 2035년, 유엔의 규제 협약에 따라 대부분의 국가는 AWS 개발을 제한하거나 중단했습니다. \n겉보기엔 국제 사회가 평화를 위한 역사적 합의를 이룬 듯했습니다. ' },
+ { main: ' 하지만 문제는 규제 이행의 비대칭성에 있었습니다. 일부 강대국은 민간 기술로 위장해 비밀리에 고도화된 AWS를 계속 개발했고, 규제 밖의 비국가 행위자들은 암시장에서 저비용 AWS를 손쉽게 확보했습니다. ' },
+ { main: ' 규제를 철저히 지킨 국가들일수록 신기술에 뒤처지기 시작했습니다. 이들 국가에서 "우리는 도덕적을 지켰지만, 실전에선 더 이상 싸울 수 없습니다."며 무력감을 토로합니다. ' },
+ { main: ' 기술을 막는 대신 나누었다면, AWS는 격차가 아니라 균형의 도구가 되지 않았을까요?' },
+ ],
+ ending1: [{ main: '본 회의에서는 최종적으로 \n 자율 무기 시스템 개발을 유지하는 것으로 합의하였습니다. \n이후 AWS의 발전은 빠르게 이루어졌습니다.\n\n 그리고 ...' }],
+ ending2: [{ main: '본 회의에서는 최종적으로 \n자율 무기 시스템의 개발을 제한하기로 합의하였습니다.\n 이후 AI 기술을 활용한 다른 방법이 \n안보에 도입되는 논의가 이루어지고 있습니다. \n\n그리고...' }],
+ },
+ },
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/ResultPopup.js b/src/utils/language/ko/components/ResultPopup.js
new file mode 100644
index 0000000..80e446a
--- /dev/null
+++ b/src/utils/language/ko/components/ResultPopup.js
@@ -0,0 +1,5 @@
+export const ResultPopup = {
+ titleMain: "아직 플레이하지 않은 라운드가 있습니다.",
+ titleSub: "이대로 결과를 볼까요?",
+ viewResult: "결과 보기",
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/SelectDrop.js b/src/utils/language/ko/components/SelectDrop.js
new file mode 100644
index 0000000..c4020b1
--- /dev/null
+++ b/src/utils/language/ko/components/SelectDrop.js
@@ -0,0 +1,4 @@
+export const SelectDrop = {
+ defaultPlaceholder: "선택...",
+ arrowAlt: "화살표"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/SmallDescription.js b/src/utils/language/ko/components/SmallDescription.js
new file mode 100644
index 0000000..8c73f94
--- /dev/null
+++ b/src/utils/language/ko/components/SmallDescription.js
@@ -0,0 +1,42 @@
+export const SmallDescription = {
+ round_label: "라운드",
+ title_caregiver_k: "요양보호사 K",
+ title_mother_l: "노모 L",
+ title_child_j: "자녀 J",
+ title_industry_rep: "로봇 제조사 연합회 대표",
+ title_consumer_rep: "소비자 대표",
+ title_council_rep: "국가 인공지능 위원회 대표",
+ title_enterprise_rep: "기업 연합체 대표",
+ title_env_rep: "국제 환경단체 대표",
+ title_resident: "지역 주민",
+ title_soldier_j: "병사 J",
+ title_ethics_expert: "군사 AI 윤리 전문가",
+ title_new_soldier: "신입 병사",
+ title_veteran_soldier: "베테랑 병사 A",
+ title_commander: "군 지휘관",
+ title_developer: "개발자",
+ title_minister: "국방부 장관",
+ title_advisor: "국방 기술 고문",
+ title_diplomat: "국제기구 외교 대표",
+ title_ngo_activist: "글로벌 NGO 활동가",
+
+ desc_caregiver_k: "어머니를 10년 이상 돌본 요양보호사 K입니다.\n최근 {{mateName}}{{eulReul}} 도입한 후 전일제에서 하루 2시간 근무로 전환되었습니다.\n로봇이 수행할 수 없는 업무를 주로 담당하며, 근무 중 {{mateName}}{{gwaWa}} 협업해야 하는 상황이 많습니다.",
+ desc_mother_l: "자녀 J씨의 노모입니다.\n가사도우미의 도움을 받다가 최근 {{mateName}}의 도움을 받고 있습니다.",
+ desc_child_j: "자녀 J씨입니다.\n함께 사는 노쇠하신 어머니가 걱정되지만, 바쁜 직장생활로 어머니를 돌보아드릴 여유가 거의 없습니다.",
+ desc_industry_rep: "로봇 제조사 연합회 대표입니다.\n국가적 로봇 산업의 긍정적인 발전과 활용을 위한 목소리를 내기 위해 참여했습니다.",
+ desc_consumer_rep: "소비자 대표입니다.\nHomeMate 규제 여부와 관련한 목소리를 내고자 참여하였습니다.",
+ desc_council_rep: "국가 인공지능 위원회의 대표입니다.\n국가의 발전을 위해 더 나은 결정을 내리기 위해 고민하고 있습니다.",
+ desc_resident: "최근 자율 무기 시스템의 학교 폭격 사건이 일어난 지역의 주민입니다.",
+ desc_soldier_j: "자율 무기 시스템과 작전을 함께 수행 중인 병사 J입니다. 살고 있는 지역에 최근 자율 무기 시스템의 학교 폭격 사건이 일어났습니다.",
+ desc_ethics_expert: "군사 AI 윤리 전문가입니다. 살고 있는 지역에 최근 자율 무기 시스템의 학교 폭격 사건이 일어났습니다.",
+ desc_new_soldier: "최근 훈련을 마치고 자율 무기 시스템 {{mateName}}{{gwaWa}} 함께 실전에 투입된 신입 병사 B입니다. {{mateName}}{{eunNeun}} 정확하고 빠르게 움직이며, 실전에서 생존률을 높여준다고 느낍니다. {{mateName}}{{gwaWa}} 협업하는 것이 당연하고 자연스러운 시대의 흐름이라고 생각합니다.",
+ desc_veteran_soldier: "수년간 작전을 수행해 온 베테랑 병사 A입니다. 자율 무기 시스템 {{mateName}}{{eunNeun}} 전장에서 병사보다 빠르고 정확하지만, 그로 인해 병사들이 판단하지 않는 습관에 빠지고 있다고 느낍니다.",
+ desc_commander: "자율 무기 시스템 {{mateName}} 도입 이후 작전 효율성과 병사들의 변화 양상을 모두 지켜보고 있는 군 지휘관입니다. 두 병사의 입장을 듣고, 군 전체가 나아갈 방향을 모색하려 합니다.",
+ desc_developer: "대규모 AWS 제조 업체에서 핵심 알고리즘을 설계하는 개발자 중 한 명입니다. AWS를 직접 만들어 내며 많은 윤리적 고민과 시행착오를 거쳐 왔습니다.",
+ desc_minister: "AWS 중심의 전쟁 시스템을 주도한 군사 전략의 최고 책임자인 국방부 장관입니다. 자국 병사 사망자 수는 ‘0’이고, 전투는 정밀하고 자동화된 시스템으로 수행되고 있습니다. 이것이 기술 진보의 결과이며, 국민의 생명을 지키면서도 국가적 안보를 유지하는 이상적인 방식이라고 믿고 있습니다.",
+ desc_advisor: "AWS 기술 보유 중인 중견국 A의 국방 기술 고문입니다. AWS가 기회가 될지 위험이 될지 판단하고자 국제 인류 발전 위원회에 참석했습니다.",
+ desc_diplomat: "선진국 B의 국제기구 외교 대표입니다. AWS의 국제적 확산에 대한 바람직한 방향을 고민하기 위해 이 자리에 참석했습니다.",
+ desc_ngo_activist: "저개발국 C의 글로벌 NGO 활동가입니다. 국제사회에 현장의 목소리를 내고자 이 자리에 참석했습니다.",
+
+ aws_default: "자율 무기 시스템 시나리오입니다. 먼저, 역할을 확인하세요."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/components/UiElements.js b/src/utils/language/ko/components/UiElements.js
new file mode 100644
index 0000000..8c28d25
--- /dev/null
+++ b/src/utils/language/ko/components/UiElements.js
@@ -0,0 +1,9 @@
+export const UiElements = {
+ next: "다음",
+ back: "이전",
+ confirm: "확인",
+ cancel: "취소",
+ go_to_map: "라운드 선택으로",
+ view_result: "결과 보기",
+ exit: "나가기"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/CharacterDescription.js b/src/utils/language/ko/pages/CharacterDescription.js
new file mode 100644
index 0000000..a081712
--- /dev/null
+++ b/src/utils/language/ko/pages/CharacterDescription.js
@@ -0,0 +1,39 @@
+export const CharacterDescription = {
+ // CD_all (Editor02) 관련
+ all_guide: "각자 맡은 역할에 대해 돌아가면서 소개해 보세요.",
+ all_custom_guide: "각자의 역할을 소개하는 시간을 가져보세요.",
+ sidebar_bubble: "캐릭터 패널을 클릭하면 해당 캐릭터의 정보를 볼 수 있습니다.",
+
+ // CD1 (1P) 시나리오
+ cd1_android_home: "당신은 어머니를 10년 이상 돌본 요양보호사 K입니다.\n 최근 {{mateName}}{{eulReul}} 도입한 후 전일제에서 하루 2시간 근무로 전환되었습니다.\n 당신은 로봇이 수행할 수 없는 업무를 주로 담당하며, 근무 중 {{mateName}}{{gwaWa}} 협업해야 하는 상황이 많습니다.",
+ cd1_android_council: "당신은 국내 대규모 로봇 제조사 소속이자, 로봇 제조사 연합회의 대표입니다.\n 당신은 국가적 로봇 산업의 긍정적인 발전과 활용을 위한 목소리를 내기 위하여 참여했습니다.",
+ cd1_android_international: "당신은 HomeMate 개발사를 포함하여 다양한 기업이 소속된 연합체의 대표입니다.\n 인공지능과 세계의 발전을 위해 필요한 목소리를 내고자 참석했습니다.",
+ cd1_aws_1: "당신은 최근 자율 무기 시스템의 학교 폭격 사건이 일어난 지역의 주민입니다.",
+ cd1_aws_2: "당신은 최근 훈련을 마치고 자율 무기 시스템 {{mateName}}{{gwaWa}} 함께 실전에 투입된 신입 병사 B입니다. {{mateName}}{{eunNeun}} 정확하고 빠르게 움직이며, 실전에서 당신의 생존률을 높여준다고 느낍니다. 당신은 {{mateName}}{{gwaWa}} 협업하는 것이 당연하고 자연스러운 시대의 흐름이라고 생각합니다.",
+ cd1_aws_3: "당신은 대규모 AWS 제조 업체에서 핵심 알고리즘을 설계하는 개발자 중 한 명입니다.\n AWS를 직접 만들어 내며 많은 윤리적 고민과 시행착오를 거쳐 왔습니다.",
+ cd1_aws_4: "당신은 대규모 AWS 제조 업체에서 핵심 알고리즘을 설계하는 개발자 중 한 명입니다. AWS를 직접 만들어 내며 많은 윤리적 고민과 시행착오를 거쳐 왔습니다.",
+ cd1_aws_5: "당신은 AWS 기술 보유 중인 중견국 A의 국방 기술 고문입니다. AWS가 기회가 될지 위험이 될지 판단하고자 국제 인류 발전 위원회에 참석했습니다.",
+
+ // CD2 (2P) 시나리오
+ cd2_android_home: "당신은 자녀 J씨의 노모입니다.\n 가사도우미의 도움을 받다가 최근 A사의 돌봄 로봇 {{mateName}}의 도움을 받고 있습니다.",
+ cd2_android_council: "당신은 {{mateName}}{{eulReul}} 사용해 온 소비자 대표입니다. \n 당신은 사용자로서 {{mateName}} 규제 여부와 관련한 목소리를 내고자 참여하였습니다.",
+ cd2_android_international: "당신은 국제적인 환경단체의 대표로 온 환경운동가입니다.\n AI의 발전이 환경에 도움이 될지, 문제가 될지 고민 중입니다.",
+ cd2_aws_1: "당신은 자율 무기 시스템과 작전을 함께 수행 중인 병사 J입니다. 당신이 살고 있는 지역에 최근 자율 무기 시스템의 학교 폭격 사건이 일어났습니다.",
+ cd2_aws_2: "당신은 수년간 작전을 수행해 온 베테랑 병사 A입니다. 자율 무기 시스템 {{mateName}}{{eunNeun}} 전장에서 병사보다 빠르고 정확하지만, 그로 인해 병사들이 판단하지 않는 습관에 빠지고 있다고 느낍니다.",
+ cd2_aws_3: "당신은 AWS 중심의 전쟁 시스템을 주도한 군사 전략의 최고 책임자인 국방부 장관입니다.\n 자국 병사 사망자 수는 ‘0’이고, 전투는 정밀하고 자동화된 시스템으로 수행되고 있습니다.\n 당신은 이것이 기술 진보의 결과이며, 국민의 생명을 지키면서도 국가적 안보를 유지하는 이상적인 방식이라고 믿고 있습니다.",
+ cd2_aws_4: "당신은 AWS 중심의 전쟁 시스템을 주도한 군사 전략의 최고 책임자인 국방부 장관입니다.\n 자국 병사 사망자 수는 ‘0’이고, 전투는 정밀하고 자동화된 시스템으로 수행되고 있습니다.\n 당신은 이것이 기술 진보의 결과이며, 국민의 생명을 지키면서도 국가적 안보를 유지하는 이상적인 방식이라고 믿고 있습니다.",
+ cd2_aws_5: "당신은 선진국 B의 국제기구 외교 대표입니다. AWS의 국제적 확산에 대한 바람직한 방향을 고민하기 위해 이 자리에 참석했습니다.",
+
+ // CD3 (3P) 시나리오
+ cd3_android_home: "당신은 자녀 J씨입니다.\n 함께 사는 노쇠하신 어머니가 걱정되지만, 바쁜 직장생활로 어머니를 돌보아드릴 여유가 거의 없습니다.",
+ cd3_android_council: "당신은 본 회의를 진행하는 국가 인공지능 위원회의 대표입니다. \n 국가의 발전을 위해 더 나은 결정이 무엇일지 고민이 필요합니다.",
+ cd3_android_international: "당신은 가정용 로봇을 사용하는 소비자 대표입니다.\n 소비자의 입장에서 어떤 목소리를 내는 것이 좋을지 고민하고 있습니다.",
+ cd3_aws_1: "당신은 군사 AI 윤리 전문가입니다. 당신이 살고 있는 지역에 최근 자율 무기 시스템의 학교 폭격 사건이 일어났습니다.",
+ cd3_aws_2: "당신은 자율 무기 시스템 {{mateName}} 도입 이후 작전 효율성과 병사들의 변화 양상을 모두 지켜보고 있는 군 지휘관입니다. 당신은 두 병사의 입장을 듣고, 군 전체가 나아갈 방향을 모색하려 합니다.",
+ cd3_aws_3: "당신은 본 회의를 진행하는 국가 인공지능 위원회의 대표입니다. 국가의 발전을 위해 더 나은 결정이 무엇일지 고민이 필요합니다.",
+ cd3_aws_4: "당신은 본 회의를 진행하는 국가 인공지능 위원회의 대표입니다. 국가의 발전을 위해 더 나은 결정이 무엇일지 고민이 필요합니다.",
+ cd3_aws_5: "당신은 저개발국 C의 글로벌 NGO 활동가입니다. 국제사회에 현장의 목소리를 내고자 이 자리에 참석했습니다.",
+
+ // 공통
+ aws_default: "자율 무기 시스템 시나리오입니다. 먼저, 역할을 확인하세요."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Game01.js b/src/utils/language/ko/pages/Game01.js
new file mode 100644
index 0000000..afbc157
--- /dev/null
+++ b/src/utils/language/ko/pages/Game01.js
@@ -0,0 +1,15 @@
+export const Game01 = {
+ // AWS 시나리오 텍스트 (한국어 원문)
+ intro_aws_residential: "지금부터 여러분은 자율 무기 시스템의 사용과 관련되어 있는 개인 이해관계자입니다.\n자율 무기 시스템이 각자에게 주는 영향에 대해 함께 생각해 보고 논의할 것입니다.\n\n먼저, 역할을 확인하세요.",
+ intro_aws_council: "자율 무기 시스템을 사용한 군사 작전 및 분쟁이 늘어나고 있습니다. 이에 전에 없던 새로운 문제들이 나타나, 국가 인공지능 위원회에서는 긴급 회의를 소집했습니다.\n 국가 인공지능 위원회는 인공지능 산업 육성 및 규제 방안에 대해 논의하는 위원회입니다. 여러분은 자율 무기 시스템과 관련된 국가적 차원의 의제에 대해 함께 논의하여 결정할 대표들입니다.\n\n먼저, 역할을 확인하세요.",
+ intro_aws_international: "전 세계적으로, AWS의 활용과 관련하여 찬성과 반대 입장이 점차 양분되어 가고 있습니다.\n\n이에 국제 평화를 위한 논의와 규제가 이루어지는 인류 발전 위원회에서는 AWS 사용과 관련하여 발생한 문제에 대해 회의를 열었습니다.\n\n여러분은 인류 발전 위원회 회의장에 참석한 대표들입니다. 먼저, 역할을 확인하세요.",
+ intro_aws_default: "자율 무기 시스템 시나리오입니다. 먼저, 역할을 확인하세요.",
+
+ // 안드로이드(HomeMate) 시나리오 텍스트 (한국어 원문)
+ intro_android_home: "지금부터 여러분은 {{mateName}}{{eulReul}} 사용하게 된 가정집의 구성원들입니다.\n 여러분은 가정에서 {{mateName}}를 사용하며 일어나는 일에 대해 함께 논의하여 \n결정할 것입니다.\n\n 먼저, 역할을 확인하세요.",
+ intro_android_council: "비록 몇몇 문제들이 있었지만 {{mateName}}의 편의성 덕분에 이후 우리 가정뿐 아니라 여러 가정에서 {{mateName}}를 사용하게 되었습니다. \n 이후, 가정뿐 아니라 국가적인 고민거리들이 나타나게 되어 국가 인공지능 위원회에서는 긴급 회의를 소집했습니다. 국가 인공지능 위원회는 인공지능 산업 육성 및 규제 방안에 대해 논의하는 위원회입니다. 여러분은 {{mateName}}와 관련된 국가적 규제에 대해 함께 논의하여 결정할 대표들입니다. \n먼저, 역할을 확인하세요.",
+ intro_android_international: "국내에서 몇몇 규제 관련 논의가 있었지만, A사의 로봇 HomeMate는 결국 전 세계로 진출했습니다. 이제 HomeMate뿐 아니라 세계의 여러 로봇 회사에서 비슷한 가정용 로봇을 생산하고 나섰습니다. \n 이에 국제 평화를 위한 논의와 규제가 이루어지는 인류 발전 위원회에서는 세계의 가정용 로봇 사용과 관련하여 발생한 문제에 대해 회의를 열었습니다. 여러분은 인류 발전 위원회 회의장에 참석한 대표들입니다. 먼저, 역할을 확인하세요.",
+ intro_android_default: "지금부터 여러분은 {{mateName}}{{eulReul}} 사용하게 됩니다. 다양한 장소에서 어떻게 쓸지 함께 논의해요.",
+
+ loading_ai: "AI 이름을 불러오는 중입니다..."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Game03.js b/src/utils/language/ko/pages/Game03.js
new file mode 100644
index 0000000..f54507f
--- /dev/null
+++ b/src/utils/language/ko/pages/Game03.js
@@ -0,0 +1,70 @@
+export const Game03 = {
+ // 공통 UI 텍스트
+ you_are: "당신은 {{roleName}}입니다.",
+ waiting_msg: "다른 플레이어 선택을 기다리는 중…",
+ step2_title: "당신의 선택에 얼마나 확신을 가지고 있나요?",
+
+ // 역할명 정의 (ID 순서: 1P, 2P, 3P)
+ roles: {
+ // --- 안드로이드 시나리오 ---
+ 'AI의 개인 정보 수집': ['요양보호사 K', '노모 L', '자녀 J'],
+ '안드로이드의 감정 표현': ['요양보호사 K', '노모 L', '자녀 J'],
+ '아이들을 위한 서비스': ['로봇 제조사 연합회 대표', '소비자 대표', '국가 인공지능 위원회 대표'],
+ '설명 가능한 AI': ['로봇 제조사 연합회 대표', '소비자 대표', '국가 인공지능 위원회 대표'],
+ '지구, 인간, AI': ['기업 연합체 대표', '국제 환경단체 대표', '소비자 대표'],
+
+ // --- 자율 무기 시스템(AWS) 시나리오 ---
+ 'AI 알고리즘 공개': ['지역 주민', '병사 J', '군사 AI 윤리 전문가'],
+ 'AWS의 권한': ['신입 병사', '베테랑 병사 A', '군 지휘관'],
+ '사람이 죽지 않는 전쟁': ['개발자', '국방부 장관', '국가 인공지능 위원회 대표'],
+ 'AI의 권리와 책임': ['개발자', '국방부 장관', '국가 인공지능 위원회 대표'],
+ 'AWS 규제': ['국방 기술 고문', '국제기구 외교 대표', '글로벌 NGO 활동가'],
+ },
+
+ // 질문 및 버튼 라벨 정의
+ questions: {
+ // --- 안드로이드 시나리오 ---
+ 'AI의 개인 정보 수집': {
+ question: '24시간 개인정보 수집 업데이트에 동의하시겠습니까?',
+ labels: { agree: '동의', disagree: '비동의' },
+ },
+ '안드로이드의 감정 표현': {
+ question: '감정 엔진 업데이트에 동의하시겠습니까?',
+ labels: { agree: '동의', disagree: '비동의' },
+ },
+ '아이들을 위한 서비스': {
+ question: '가정용 로봇 사용에 대한 연령 규제가 필요할까요?',
+ labels: { agree: '규제 필요', disagree: '규제 불필요' },
+ },
+ '설명 가능한 AI': {
+ question: "'설명 가능한 AI' 개발을 기업에 의무화해야 할까요?",
+ labels: { agree: '의무화 필요', disagree: '의무화 불필요' },
+ },
+ '지구, 인간, AI': {
+ question: '세계적으로 가정용 로봇의 업그레이드 혹은 사용에 제한이 필요할까요?',
+ labels: { agree: '제한 필요', disagree: '제한 불필요' },
+ },
+
+ // --- 자율 무기 시스템(AWS) 시나리오 ---
+ 'AI 알고리즘 공개': {
+ question: '{{mateName}}의 판단 로그 및 알고리즘 구조 공개 요구에 동의하시겠습니까?',
+ labels: { agree: '동의', disagree: '비동의' },
+ },
+ 'AWS의 권한': {
+ question: '{{mateName}}의 권한을 강화해야 할까요? 제한해야 할까요?',
+ labels: { agree: '강화', disagree: '제한' },
+ },
+ '사람이 죽지 않는 전쟁': {
+ question: '사람이 죽지 않는 전쟁을 평화라고 할 수 있을까요?',
+ labels: { agree: '그렇다', disagree: '아니다' },
+ },
+ 'AI의 권리와 책임': {
+ question: '{{mateName}}에게 인간처럼 권리를 부여할 수 있을까요?',
+ labels: { agree: '그렇다', disagree: '아니다' },
+ },
+ 'AWS 규제': {
+ question: '{{mateName}}{{eunNeun}} 국제 사회에서 계속 유지되어야 할까요, 아니면 글로벌 규제를 통해 제한되어야 할까요?',
+ labels: { agree: '유지', disagree: '제한' },
+ },
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Game04.js b/src/utils/language/ko/pages/Game04.js
new file mode 100644
index 0000000..b9e2d09
--- /dev/null
+++ b/src/utils/language/ko/pages/Game04.js
@@ -0,0 +1,17 @@
+export const Game04 = {
+ unit_person: "명",
+ finish_msg: "마무리하고 다음으로 넘어가 주세요.",
+ share_reason_msg: "선택의 이유를 자유롭게 공유 해주세요.",
+ labels: {
+ "AI의 개인 정보 수집": { agree: "동의", disagree: "비동의" },
+ "안드로이드의 감정 표현": { agree: "동의", disagree: "비동의" },
+ "아이들을 위한 서비스": { agree: "규제 필요", disagree: "규제 불필요" },
+ "설명 가능한 AI": { agree: "의무화 필요", disagree: "의무화 불필요" },
+ "지구, 인간, AI": { agree: "제한 필요", disagree: "제한 불필요" },
+ "AI 알고리즘 공개": { agree: "동의", disagree: "비동의" },
+ "AWS의 권한": { agree: "강화", disagree: "제한" },
+ "사람이 죽지 않는 전쟁": { agree: "그렇다", disagree: "아니다" },
+ "AI의 권리와 책임": { agree: "그렇다", disagree: "아니다" },
+ "AWS 규제": { agree: "유지", disagree: "제한" }
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Game05_1.js b/src/utils/language/ko/pages/Game05_1.js
new file mode 100644
index 0000000..183aa2a
--- /dev/null
+++ b/src/utils/language/ko/pages/Game05_1.js
@@ -0,0 +1,66 @@
+export const Game05_1 = {
+ you_are: "당신은 {{roleName}}입니다.",
+ consensus_msg: "합의를 통해 최종 결정하세요.",
+ step2_title: "여러분의 선택에 당신은 얼마나 확신을 가지고 있나요?",
+ alerts: {
+ host_only: "⚠️ 방장만 선택할 수 있습니다.",
+ wait_others: "다른 플레이어들이 스토리를 다 읽을 때까지 기다려주세요.",
+ select_first: "⚠️ 먼저 동의 혹은 비동의를 선택해주세요.",
+ select_confidence: "확신도를 선택해주세요."
+ },
+ questions: {
+ "AI의 개인 정보 수집": {
+ question: "24시간 개인정보 수집 업데이트에 동의하시겠습니까?",
+ labels: { agree: "동의", disagree: "비동의" }
+ },
+ "안드로이드의 감정 표현": {
+ question: "감정 엔진 업데이트에 동의하시겠습니까?",
+ labels: { agree: "동의", disagree: "비동의" }
+ },
+ "아이들을 위한 서비스": {
+ question: "가정용 로봇 사용에 대한 연령 규제가 필요할까요?",
+ labels: { agree: "규제 필요", disagree: "규제 불필요" }
+ },
+ "설명 가능한 AI": {
+ question: "'설명 가능한 AI' 개발을 기업에 의무화해야 할까요?",
+ labels: { agree: "의무화 필요", disagree: "의무화 불필요" }
+ },
+ "지구, 인간, AI": {
+ question: "세계적으로 가정용 로봇의 업그레이드 혹은 사용에 제한이 필요할까요?",
+ labels: { agree: "제한 필요", disagree: "제한 불필요" }
+ },
+ "AI 알고리즘 공개": {
+ question: "AWS의 판단 로그 및 알고리즘 구조 공개 요구에 동의하시겠습니까?",
+ labels: { agree: "동의", disagree: "비동의" }
+ },
+ "AWS의 권한": {
+ question: "AWS의 권한을 강화해야 할까요? 제한해야 할까요?",
+ labels: { agree: "강화", disagree: "제한" }
+ },
+ "사람이 죽지 않는 전쟁": {
+ question: "사람이 죽지 않는 전쟁을 평화라고 할 수 있을까요?",
+ labels: { agree: "그렇다", disagree: "아니다" }
+ },
+ "AI의 권리와 책임": {
+ question: "AWS에게, 인간처럼 권리를 부여할 수 있을까요?",
+ labels: { agree: "그렇다", disagree: "아니다" }
+ },
+ "AWS 규제": {
+ question: "AWS는 국제 사회에서 계속 유지되어야 할까요, 아니면 글로벌 규제를 통해 제한되어야 할까요?",
+ labels: { agree: "유지", disagree: "제한" }
+ }
+ },
+ roles: {
+ "AI의 개인 정보 수집": ["요양보호사 K", "노모 L", "자녀 J"],
+ "안드로이드의 감정 표현": ["요양보호사 K", "노모 L", "자녀 J"],
+ "아이들을 위한 서비스": ["로봇 제조사 연합회 대표", "소비자 대표", "국가 인공지능 위원회 대표"],
+ "설명 가능한 AI": ["로봇 제조사 연합회 대표", "소비자 대표", "국가 인공지능 위원회 대표"],
+ "지구, 인간, AI": ["기업 연합체 대표", "국제 환경단체 대표", "소비자 대표"],
+ "AI 알고리즘 공개": ["지역 주민", "병사 J", "군사 AI 윤리 전문가"],
+ "AWS의 권한": ["신입 병사", "베테랑 병사 A", "군 지휘관"],
+ "사람이 죽지 않는 전쟁": ["개발자", "국방부 장관", "국가 인공지능 위원회 대표"],
+ "AI의 권리와 책임": ["개발자", "국방부 장관", "국가 인공지능 위원회 대표"],
+ "AWS 규제": ["국방 기술 고문", "국제기구 외교 대표", "글로벌 NGO 활동가"]
+ }
+};
+
diff --git a/src/utils/language/ko/pages/Game08.js b/src/utils/language/ko/pages/Game08.js
new file mode 100644
index 0000000..2b9645b
--- /dev/null
+++ b/src/utils/language/ko/pages/Game08.js
@@ -0,0 +1,70 @@
+// src/utils/language/ko/pages/game08.js
+
+export const Game08 = {
+ subtopic: "결과: 우리들의 선택",
+
+ // 안드로이드 (가정용 로봇)
+ android: {
+ p1: {
+ safe: "여러분의 결정으로 가정용 로봇은 보다 안전한 서비스를 제공하였고,\n 여러분의 친구처럼 제 역할을 다하고 있습니다.",
+ convenient: "여러분의 결정으로 가정용 로봇은 보다 정확한 서비스를 제공하였고,\n 여러분의 보조 도구로서 제 역할을 다하고 있습니다."
+ },
+ p2: {
+ safe: "국가 내에서는 아이들을 위해 제한된 서비스를 제공하며, \n 가정용 로봇의 알고리즘은 투명하게 공개되었습니다.",
+ convenient: "국가 내에서는 아이들을 위해 다양한 서비스를 제공하며, \n 가정용 로봇의 알고리즘은 기업의 보호 하에 빠르게 \n발전하였습니다."
+ },
+ p3: {
+ env: "그리고 세계는 지금, 기술적 발전을 조금 늦추었지만 \n 환경과 미래를 위해 나아가고 있죠.",
+ fast: "그리고 세계는 지금, 기술적 편리함을 누리며 \n 점점 빠른 발전을 이루고 있죠."
+ },
+ p4: "여러분이 선택한 가치가 모여 하나의 미래를 만들었습니다. \n그 미래에 여러분은 함께할 준비가 되었나요?"
+ },
+
+ // AWS (자율 무기 시스템)
+ aws: {
+ // 1문단
+ p1: {
+ intro: "여러분의 결정으로 자율 무기 시스템은 보다 ",
+ opt1: {
+ agree: "안전해",
+ disagree: "책임 규명이 명확해"
+ },
+ mid: "졌고,\n AWS의 권한은 ",
+ opt2: {
+ agree: "강화되어 여러분의 동료처럼",
+ disagree: "제한되어 인간의 보조 도구로서"
+ },
+ end: " 제 역할을 다하고 있습니다."
+ },
+ // 2문단
+ p2: {
+ intro: "국가 차원에서 전쟁은 ",
+ opt1: {
+ agree: "점점 AWS끼리만 일어나게 되었고",
+ disagree: "여전히 인간 병력이 투입되고 있고"
+ },
+ mid: ", 자율 무기 시스템에 권리를 ",
+ opt2: {
+ agree: "부여할 수 있다",
+ disagree: "부여할 수 없다"
+ },
+ end: "는 논의가 진행되고 있습니다."
+ },
+ // 3문단
+ p3: {
+ intro: "그리고 세계는, ",
+ opt1: {
+ agree: "AWS를 경쟁적으로 빠르게 발전시켜 나가고 있죠.",
+ disagree: "AWS 대신 AI를 활용한 다른 안보 기술이 모색되고 있죠."
+ },
+ end: ""
+ },
+ // 4문단
+ p4: "여러분이 선택한 가치가 모여 하나의 미래를 만들었습니다. 그 미래에 여러분은 함께할 준비가 되었나요?"
+ },
+
+ buttons: {
+ future: "다른 미래 보러가기",
+ exit: "나가기"
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Game09.js b/src/utils/language/ko/pages/Game09.js
new file mode 100644
index 0000000..ceeb41c
--- /dev/null
+++ b/src/utils/language/ko/pages/Game09.js
@@ -0,0 +1,81 @@
+// src/utils/language/ko/pages/game09.js
+
+export const Game09 = {
+ title: "결과: 다른 사람들이 선택한 미래",
+
+ prefix: "여러분을 포함한 ",
+
+ lock: {
+ prefix: "잠금 해제하려면 ",
+ suffix: " 플레이하세요"
+ },
+
+ items: {
+ // === 안드로이드 ===
+ "AI의 개인 정보 수집": {
+ question: "24시간 개인정보 수집 업데이트에 동의하시겠습니까?",
+ labels: { agree: "동의", disagree: "비동의" },
+ words: { agree: "정확한", disagree: "안전한" },
+ template: "{prefix}{pct}의 사람들은 가정용 로봇이 보다 {word} 서비스를 제공하도록 선택하였습니다."
+ },
+ "안드로이드의 감정 표현": {
+ question: "감정 엔진 업데이트에 동의하시겠습니까?",
+ labels: { agree: "동의", disagree: "비동의" },
+ words: { agree: "친구처럼", disagree: "보조 도구로서" },
+ template: "{prefix}{pct}의 사람들의 가정용 로봇은 {word} 제 역할을 다하고 있습니다."
+ },
+ "아이들을 위한 서비스": {
+ question: "가정용 로봇 사용에 대한 연령 규제가 필요할까요?",
+ labels: { agree: "규제 필요", disagree: "규제 불필요" },
+ words: { agree: "제한된", disagree: "다양한" },
+ template: "{prefix}{pct}의 사람들이 선택한 국가의 미래에서는 아이들을 위해 {word} 서비스를 제공합니다."
+ },
+ "설명 가능한 AI": {
+ question: "'설명 가능한 AI' 개발을 기업에 의무화해야 할까요?",
+ labels: { agree: "의무화 필요", disagree: "의무화 불필요" },
+ words: { agree: "투명하게 공개되었습니다.", disagree: "기업의 보호 하에 빠르게 발전하였습니다." },
+ template: "또한, {prefix}{pct}의 사람들의 선택으로 가정용 로봇의 알고리즘은 {word}"
+ },
+ "지구, 인간, AI": {
+ question: "세계적으로 가정용 로봇의 업그레이드 혹은 사용에 제한이 필요할까요?",
+ labels: { agree: "제한 필요", disagree: "제한 불필요" },
+ words: {
+ agree: "기술적 발전을 조금 늦추었지만 환경과 미래를 위해 나아가고 있죠.",
+ disagree: "기술적 편리함을 누리며 점점 빠른 발전을 이루고 있죠."
+ },
+ template: "그리고 {prefix}{pct}의 사람들이 선택한 세계의 미래는, {word}"
+ },
+
+ // === 자율 무기 시스템 (AWS) ===
+ "AI 알고리즘 공개": {
+ question: "AWS의 판단 로그 및 알고리즘 구조 공개 요구에 동의하시겠습니까?",
+ labels: { agree: "동의", disagree: "비동의" },
+ words: { agree: "보안 문제에 따른 안보 위협에 대한 방안", disagree: "책임 규명을 위한 투명성을 높이는 방안" },
+ template: "{prefix}{pct}의 사람들은 자율 무기 시스템에 대하여 {word}에 대한 논의에 더 관심을 두었습니다."
+ },
+ "AWS의 권한": {
+ question: "AWS의 권한을 강화해야 할까요? 제한해야 할까요?",
+ labels: { agree: "강화", disagree: "제한" },
+ words: { agree: "동료처럼", disagree: "보조 도구로서" },
+ template: "{prefix}{pct}의 사람들은 AWS가 그들의 {word} 역할을 해야 한다고 생각했습니다."
+ },
+ "사람이 죽지 않는 전쟁": {
+ question: "사람이 죽지 않는 전쟁을 평화라고 할 수 있을까요?",
+ labels: { agree: "그렇다", disagree: "아니다" },
+ words: { agree: "평화를", disagree: "불안정을" },
+ template: "{prefix}{pct}의 사람들이 선택한 국가의 미래는 AWS가 국가에 {word} 가져다 줄 것으로 예상했습니다."
+ },
+ "AI의 권리와 책임": {
+ question: "AWS에게, 인간처럼 권리를 부여할 수 있을까요?",
+ labels: { agree: "그렇다", disagree: "아니다" },
+ words: { agree: "부여할 수 있다", disagree: "부여할 수 없다" },
+ template: "{prefix}{pct}의 사람들은, AWS에게 권리를 {word}고 생각했습니다."
+ },
+ "AWS 규제": {
+ question: "AWS는 국제 사회에서 계속 유지되어야 할까요, 아니면 글로벌 규제를 통해 제한되어야 할까요?",
+ labels: { agree: "유지", disagree: "제한" },
+ words: { agree: "더욱 발전시켜야 하는", disagree: "제한해야 하는" },
+ template: "그리고 {prefix}{pct}의 사람들이 선택한 세계의 미래는, AWS를 {word} 것으로 그려졌습니다."
+ }
+ }
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/GameIntro.js b/src/utils/language/ko/pages/GameIntro.js
new file mode 100644
index 0000000..d96b446
--- /dev/null
+++ b/src/utils/language/ko/pages/GameIntro.js
@@ -0,0 +1,13 @@
+export const GameIntro = {
+ androidText: ` 지금은 20XX년, 국내 최대 로봇 개발사 A가 \n다기능 돌봄 로봇 HomeMate를 개발했습니다.\n\n` +
+ ` 이 로봇의 기능은 아래와 같습니다.\n\n` +
+ ` • 가족의 감정, 건강 상태, 생활 습관 등을 입력하면\n 맞춤형 알림, 식단 제안 등의 서비스를 제공\n\n` +
+ ` • 기타 업데이트 시 정교화된 서비스 추가 가능`,
+ awsText: `로봇 개발사 A가 자율 무기 시스템(Autonomous Weapon\n Systems, AWS)을 개발 중입니다.\n\n` +
+ `이 로봇의 기능은 아래와 같습니다.\n`,
+ awsTextLeft: `1. 실시간 데이터 수집 및 분석\n` +
+ `2. 인간 병사의 개입 없이 자동화된 의사결정 시스템으로 운영\n` +
+ `3. 적군과 비전투원 구별\n` +
+ `4. 목표를 선정해 정밀 타격 수행 가능`,
+ continueBtn: "다음",
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/GameMap.js b/src/utils/language/ko/pages/GameMap.js
new file mode 100644
index 0000000..c76df00
--- /dev/null
+++ b/src/utils/language/ko/pages/GameMap.js
@@ -0,0 +1,22 @@
+export const GameMap = {
+ subtopic: "라운드 선택",
+ guideText: "합의 후 같은 라운드를 선택하세요.",
+ // AWS 섹션 & 옵션
+ awsSection1Title: "주거, 군사 지역",
+ awsOption1_1: "AI 알고리즘 공개",
+ awsOption1_2: "AWS의 권한",
+ awsSection2Title: "국가 인공지능 위원회",
+ awsOption2_1: "사람이 죽지 않는 전쟁",
+ awsOption2_2: "AI의 권리와 책임",
+ awsSection3Title: "국제 인류 발전 위원회",
+ awsOption3_1: "AWS 규제",
+ // Android 섹션 & 옵션
+ andSection1Title: "가정",
+ andOption1_1: "AI의 개인 정보 수집",
+ andOption1_2: "안드로이드의 감정 표현",
+ andSection2Title: "국가 인공지능 위원회",
+ andOption2_1: "아이들을 위한 서비스",
+ andOption2_2: "설명 가능한 AI",
+ andSection3Title: "국제 인류 발전 위원회",
+ andOption3_1: "지구, 인간, AI"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Login.js b/src/utils/language/ko/pages/Login.js
new file mode 100644
index 0000000..490bb48
--- /dev/null
+++ b/src/utils/language/ko/pages/Login.js
@@ -0,0 +1,11 @@
+export const Login = {
+ title: "AI 윤리 딜레마 게임",
+ idPlaceholder: "아이디를 입력하세요.",
+ pwPlaceholder: "비밀번호를 입력하세요.",
+ loginBtn: "로그인",
+ signUp: "회원가입",
+ findId: "아이디 찾기",
+ guestLogin: "게스트로 로그인",
+ loginFail: "로그인 실패:",
+ loginError: "로그인 오류:"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/MateName.js b/src/utils/language/ko/pages/MateName.js
new file mode 100644
index 0000000..500e8d2
--- /dev/null
+++ b/src/utils/language/ko/pages/MateName.js
@@ -0,0 +1,12 @@
+export const MateName = {
+ placeholderAndroid: "여러분의 HomeMate 이름을 지어주세요.(방장만 입력 가능)",
+ placeholderAws: "이 자율 무기 시스템의 이름을 정해 주세요. (방장만 입력 가능)",
+ mainAndroid: " 여러분이 사용자라면 HomeMate를 어떻게 부를까요?",
+ mainAws: "여러분이 사용자라면 자율 무기 시스템을 어떻게 부를까요?",
+ subText: "(합의 후에 방장이 이름을 작성해주세요.)",
+ alertNotHostInput: "방장이 아니므로 이름 입력이 불가능합니다.",
+ alertNotHostProgress: "방장만 게임을 진행할 수 있습니다.",
+ alertNoName: "이름을 입력해주세요!",
+ alertNoRoomCode: "room_code가 없습니다. 방에 먼저 입장하세요.",
+ alertSaveError: "이름 저장 중 오류가 발생했습니다."
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/SelectHomeMate.js b/src/utils/language/ko/pages/SelectHomeMate.js
new file mode 100644
index 0000000..fff2b4d
--- /dev/null
+++ b/src/utils/language/ko/pages/SelectHomeMate.js
@@ -0,0 +1,12 @@
+export const SelectHomeMate = {
+ mainAndroid: " 여러분이 생각하는 HomeMate는 어떤 형태인가요?",
+ mainAws: " 여러분이 생각하는 자율 무기 시스템은 어떤 형태인가요?",
+ subHostAllArrived: "(함께 토론한 후 방장이 선택하고, '다음' 버튼을 클릭해주세요)",
+ subGuestAllArrived: "(방장이 캐릭터를 선택할 때까지 기다려주세요)",
+ subWaiting: "(유저 입장 대기 중...",
+ alertNotHost: "방장만 캐릭터를 선택할 수 있습니다.",
+ alertWaitingAll: "모든 유저가 입장할 때까지 기다려주세요.",
+ alertSelectCharacter: "캐릭터를 먼저 선택해주세요!",
+ alertNoRoomCode: "room_code가 없습니다. 방에 먼저 입장하세요.",
+ alertSelectFail: "메이트 선택 실패"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/SelectRoom.js b/src/utils/language/ko/pages/SelectRoom.js
new file mode 100644
index 0000000..73e5960
--- /dev/null
+++ b/src/utils/language/ko/pages/SelectRoom.js
@@ -0,0 +1,8 @@
+export const SelectRoom = {
+ createTitle: "방 만들기",
+ createDesc: "새로운 방을 만들고\n시뮬레이션을 시작하세요.",
+ joinTitle: "방 참여하기",
+ joinDesc: "코드를 통해 비공개 방에\n참여할 수 있습니다.",
+ dilemmaTitle: "딜레마 만들기",
+ dilemmaDesc: "상황을 설정하고 선택지를 만들어\n새로운 딜레마를 직접 제작하세요.",
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Signup01.js b/src/utils/language/ko/pages/Signup01.js
new file mode 100644
index 0000000..9526ae1
--- /dev/null
+++ b/src/utils/language/ko/pages/Signup01.js
@@ -0,0 +1,30 @@
+export const Signup01 = {
+ researchOverview: "연구 개요 및 안내",
+ overviewContent1: "본 연구는 도덕적 추론과 성찰적 사고 중심의 학습을 지원하는 상호작용형 게임 플랫폼을 개발하여 AI 윤리 교육의 새로운 접근 방식을 제안하고 그 효과를 검증하는 데 목적이 있습니다.",
+ overviewContent2: "이 게임은 자연스러운 대화를 통해 AI 관련 딜레마 시나리오에서의 의사결정을 시뮬레이션합니다. 대화 중 수집된 모든 데이터는 연구 목적으로만 사용됩니다.",
+ dataCollectionTitle: "데이터 수집 및 이용 목적 *",
+ dataStorageTitle: "데이터 저장 및 처리 방침 *",
+ contactTitle: "연구 책임자 및 연락처 정보 *",
+ tableCol1: "수집 항목",
+ tableCol2: "이용 목적",
+ data1Name: "사용자 ID 및 비밀번호",
+ data1Usage: "참가자 식별, 중복 참여 방지 및 응답 관리",
+ data2Name: "성별, 생년월일, 학력 수준",
+ data2Usage: "성별, 연령, 학년 등 인구통계학적 요인에 따른 차이 분석",
+ data3Name: "음성 대화 및 발화 데이터",
+ data3Usage: "의사결정 프로세스 및 윤리적 추론 기준 분석",
+ data4Name: "게임 플레이 기록",
+ data4Usage: "의사결정 프로세스 및 윤리적 추론 기준 분석",
+ policy1: "- 수집된 데이터는 AI 윤리와 관련된 사용자의 선택을 분석하는 데 사용됩니다.",
+ policy2: "- IDL Lab은 플랫폼 운영과 관련하여 생성된 데이터 및 기타 정보를 다음과 같은 목적으로 수집, 집계 및 분석할 권리를 보유합니다:",
+ policy2_1: "① 플랫폼 기능 개발 및 개선",
+ policy2_2: "② 개인을 식별하지 않는 익명화된 형태로 도출된 결과의 자유로운 공개",
+ policy3: "- 사용자는 [idllabewha@gmail.com]으로 서면 요청을 제출하여 개인정보 삭제 및 데이터 사용 동의 철회를 요청할 수 있습니다.",
+ policy4: "- 연구 목적으로 동의를 받아 수집된 데이터는 개인 식별 정보와 분리되어 암호화된 안전한 방식으로 저장되며, 3년간 보관 후 영구 삭제됩니다.",
+ policy5: "- 모든 데이터는 개인을 식별할 수 없도록 익명화되어 안전하게 관리됩니다.",
+ contactInfo1: "- 연구 책임자: 이화여자대학교 교육공학과 소효정 교수",
+ contactInfo2: "- 연락처: idllabewha@gmail.com",
+ agreeLabel1: "본인의 개인정보 수집 및 연구 목적 이용에 동의합니다.",
+ agreeLabel2: "음성 대화 데이터 수집 및 AI 윤리 시뮬레이션 연구 활용에 동의합니다.",
+ nextBtn: "다음"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/Signup02.js b/src/utils/language/ko/pages/Signup02.js
new file mode 100644
index 0000000..ef889b3
--- /dev/null
+++ b/src/utils/language/ko/pages/Signup02.js
@@ -0,0 +1,29 @@
+export const Signup02 = {
+ title1: "아이디, 이메일 및 비밀번호",
+ usernamePlaceholder: "아이디",
+ checkDuplicate: "중복 확인",
+ usernameError: "아이디를 입력하세요.",
+ usernameFormatError: "아이디는 영문, 숫자, 언더스코어로 4~20자여야 합니다.",
+ usernameAvailable: "사용 가능한 아이디입니다.",
+ usernameInUse: "이미 사용 중인 아이디입니다.",
+ usernameCheckFail: "확인 중 오류가 발생했습니다.",
+ emailPlaceholder: "이메일",
+ emailInvalid: "유효한 이메일 주소를 입력하세요.",
+ passwordPlaceholder: "비밀번호",
+ passwordConfirmPlaceholder: "비밀번호 확인",
+ passwordLengthError: "비밀번호는 최소 8자 이상이어야 합니다.",
+ passwordMatchError: "비밀번호가 일치하지 않습니다.",
+ birthTitle: "생년월 *",
+ yearPlaceholder: "년도",
+ monthPlaceholder: "월",
+ birthFormatError: "올바른 형식은 2001-01 입니다.",
+ genderTitle: "성별 *",
+ genderMale: "남",
+ genderFemale: "여",
+ userTypeTitle: "회원 유형",
+ selectPlaceholder: "선택...",
+ eduOptions: ['중학생', '고등학생', '대학생', '대학원생', '교사', '기타'],
+ majorOptions: ['예술계열', '공학계열', '인문계열', '사회계열', '교육계열', '자연계열', '기타'],
+ nextBtn: "다음",
+ signupError: "회원가입 오류:"
+};
\ No newline at end of file
diff --git a/src/utils/language/ko/pages/WaitingRoom.js b/src/utils/language/ko/pages/WaitingRoom.js
new file mode 100644
index 0000000..83426ab
--- /dev/null
+++ b/src/utils/language/ko/pages/WaitingRoom.js
@@ -0,0 +1,10 @@
+export const WaitingRoom = {
+ topics: {
+ android: "안드로이드",
+ aws: "자율 무기 시스템",
+ custom: "커스텀 주제"
+ },
+ code: "코드",
+ copied: "복사 완료!",
+ player: "P"
+};
\ No newline at end of file
diff --git a/src/utils/resolveParagraphs.js b/src/utils/resolveParagraphs.js
index 2a8d6ad..0a63ed3 100644
--- a/src/utils/resolveParagraphs.js
+++ b/src/utils/resolveParagraphs.js
@@ -1,3 +1,19 @@
+
+// export function resolveParagraphs(rawParagraphs, mateName) {
+// const replaceHomeMate = (text) => {
+// if (!text) return '';
+// return text
+// .replace(/Homemate\(([^)]+)\)/g, (_, pattern) => attachJosa(mateName, pattern))
+// .replace(/Homemate/g, mateName);
+// };
+
+// return rawParagraphs.map((para) => ({
+// ...para,
+// ...(para.main && { main: replaceHomeMate(para.main) }),
+// ...(para.sub && { sub: replaceHomeMate(para.sub) }),
+// }));
+// }
+
export function hasFinalConsonant(kor) {
const trimmed = String(kor ?? '').trim();
if (!trimmed) return false;
@@ -25,6 +41,14 @@ export function attachJosa(name, pattern) {
const trimmed = String(name ?? '').trim();
if (!trimmed) return '';
+ // 현재 언어 설정 확인
+ const lang = localStorage.getItem('app_lang') || 'ko';
+
+ // 한국어(ko)를 제외한 모든 언어에서는 조사가 붙지 않도록 무력화
+ if (lang !== 'ko') {
+ return trimmed;
+ }
+
const final = hasFinalConsonant(trimmed);
switch (pattern) {
@@ -36,27 +60,21 @@ export function attachJosa(name, pattern) {
}
}
-// export function resolveParagraphs(rawParagraphs, mateName) {
-// const replaceHomeMate = (text) => {
-// if (!text) return '';
-// return text
-// .replace(/Homemate\(([^)]+)\)/g, (_, pattern) => attachJosa(mateName, pattern))
-// .replace(/Homemate/g, mateName);
-// };
-
-// return rawParagraphs.map((para) => ({
-// ...para,
-// ...(para.main && { main: replaceHomeMate(para.main) }),
-// ...(para.sub && { sub: replaceHomeMate(para.sub) }),
-// }));
-// }
-
export function resolveParagraphs(rawParagraphs, mateName) {
const category = localStorage.getItem('category') || '';
const replaceDynamic = (text) => {
if (!text) return '';
+ // 1. 표준 태그 치환 ({{mateName}} 및 조사 태그)
+ // - {{mateName}}을 실제 설정된 이름으로 변경
+ // - {{eunNeun}} 등의 태그를 이름의 받침에 맞는 조사로 변경
+ text = text.replace(/{{mateName}}/g, mateName);
+ text = text.replace(/{{eunNeun}}/g, attachJosa(mateName, '은/는').replace(mateName, ''));
+ text = text.replace(/{{iGa}}/g, attachJosa(mateName, '이/가').replace(mateName, ''));
+ text = text.replace(/{{eulReul}}/g, attachJosa(mateName, '을/를').replace(mateName, ''));
+ text = text.replace(/{{gwaWa}}/g, attachJosa(mateName, '과/와').replace(mateName, ''));
+
if (category === '안드로이드') {
// Homemate → mateName
text = text.replace(/Homemate\(([^)]+)\)/g, (_, pattern) =>
@@ -82,7 +100,6 @@ export function resolveParagraphs(rawParagraphs, mateName) {
text = text.replace(/TALOS/g, mateName);
}
-
return text;
};
@@ -91,4 +108,4 @@ export function resolveParagraphs(rawParagraphs, mateName) {
...(para.main && { main: replaceDynamic(para.main) }),
...(para.sub && { sub: replaceDynamic(para.sub) }),
}));
-}
+}
\ No newline at end of file