diff --git a/src/entities/account/ui/account-tab.tsx b/src/entities/account/ui/account-tab.tsx index 601d3f2..8d69c75 100644 --- a/src/entities/account/ui/account-tab.tsx +++ b/src/entities/account/ui/account-tab.tsx @@ -1,13 +1,15 @@ +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { - AccountTabKeys, - AccountTabProps +import { + AccountTabKeys, + AccountTabProps } from '../model/types'; export const AccountTab = ({ activeTab }: AccountTabProps) => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const onClickToNavigation = (tab: AccountTabKeys) => { @@ -23,14 +25,14 @@ export const AccountTab = ({ return( <>
- - + + onClick={ () => onClickToNavigation(AccountTabKeys.PasswordManage) } + >{t('account.passwordManagement')}
); diff --git a/src/entities/account/ui/account-user-tab.tsx b/src/entities/account/ui/account-user-tab.tsx index 0ef154f..d5de9c4 100644 --- a/src/entities/account/ui/account-user-tab.tsx +++ b/src/entities/account/ui/account-user-tab.tsx @@ -1,8 +1,9 @@ +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { +import { AccountUserTabKeys, - AccountUserTabProps + AccountUserTabProps } from '../model/types'; export const AccountUserTab = ({ @@ -12,6 +13,7 @@ export const AccountUserTab = ({ idCL, status, }: AccountUserTabProps) => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const onClickToNavigation = (tab: AccountUserTabKeys) => { @@ -41,14 +43,14 @@ export const AccountUserTab = ({ return( <>
- - + + onClick={ () => onClickToNavigation( AccountUserTabKeys.AccountAuth) } + >{t('account.accountPermission')}
); diff --git a/src/entities/account/ui/password-manage-wrap.tsx b/src/entities/account/ui/password-manage-wrap.tsx index c53c013..8a5b865 100644 --- a/src/entities/account/ui/password-manage-wrap.tsx +++ b/src/entities/account/ui/password-manage-wrap.tsx @@ -1,7 +1,9 @@ +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; export const PasswordManageWrap = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); return ( @@ -9,16 +11,16 @@ export const PasswordManageWrap = () => {
- - + + >{t('account.changeCancelPassword')}
diff --git a/src/entities/account/ui/user-login-auth-info-wrap.tsx b/src/entities/account/ui/user-login-auth-info-wrap.tsx index aeee3d7..cfd5d51 100644 --- a/src/entities/account/ui/user-login-auth-info-wrap.tsx +++ b/src/entities/account/ui/user-login-auth-info-wrap.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { UserFindAuthMethodParams, UserAuthMethodData, AuthMethodModifyItem } from '@/entities/user/model/types'; import { useUserFindAuthMethodMutation } from '@/entities/user/api/use-user-find-authmethod-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; @@ -13,6 +14,7 @@ export const UserLoginAuthInfoWrap = ({ idCL, status, }: UserFindAuthMethodParams) => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const [pageParam] = useState(DEFAULT_PAGE_PARAM); const [authMethodData, setAuthMethodData] = useState(); @@ -26,7 +28,7 @@ export const UserLoginAuthInfoWrap = ({ const { mutateAsync: userFindAuthMethod } = useUserFindAuthMethodMutation(); const { mutateAsync: userModifyAuthMethod } = useUserModifyAuthMethodMutation({ onSuccess: () => { - snackBar('사용자 정보가 성공적으로 저장되었습니다.'); + snackBar(t('account.userInfoSavedSuccessfully')); navigate(PATHS.account.user.manage, { state: { mid: mid, @@ -34,7 +36,7 @@ export const UserLoginAuthInfoWrap = ({ }); }, onError: (error) => { - snackBar(error?.response?.data?.message || '사용자 정보 저장에 실패했습니다.'); + snackBar(error?.response?.data?.message || t('account.userInfoSaveFailed')); } }); @@ -395,11 +397,11 @@ export const UserLoginAuthInfoWrap = ({
-
이메일 주소
+
{t('account.emailAddress')}
@@ -415,7 +417,7 @@ export const UserLoginAuthInfoWrap = ({ @@ -433,7 +435,7 @@ export const UserLoginAuthInfoWrap = ({ @@ -443,11 +445,11 @@ export const UserLoginAuthInfoWrap = ({
-
휴대폰 번호
+
{t('account.phoneNumber')}
@@ -457,13 +459,13 @@ export const UserLoginAuthInfoWrap = ({ @@ -474,20 +476,20 @@ export const UserLoginAuthInfoWrap = ({ handleNewPhoneChange(index, e.target.value)} readOnly={readOnlyPhones.has(index) || index !== editablePhoneIndex} />
))} -
※ 탭을 변경하면 미저장 내용은 초기화됩니다.
+
{t('account.tabChangeResetNotice')}
@@ -496,7 +498,7 @@ export const UserLoginAuthInfoWrap = ({ disabled={!isSaveButtonEnabled()} onClick={handleSave} > - 저장 + {t('common.save')}
diff --git a/src/entities/account/ui/user-manage-wrap.tsx b/src/entities/account/ui/user-manage-wrap.tsx index ea27098..56c2dc7 100644 --- a/src/entities/account/ui/user-manage-wrap.tsx +++ b/src/entities/account/ui/user-manage-wrap.tsx @@ -1,4 +1,5 @@ import { ChangeEvent, useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; @@ -8,6 +9,7 @@ import { UserListItem } from '@/entities/user/model/types'; import { useStore } from '@/shared/model/store'; export const UserManageWrap = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const midOptions = useStore.getState().UserStore.selectOptionsMids; const userMid = useStore.getState().UserStore.mid; @@ -60,7 +62,7 @@ export const UserManageWrap = () => {
-
등록 현황
+
{t('account.registrationStatus')}
@@ -76,7 +78,7 @@ export const UserManageWrap = () => { + >{t('account.addUser')}
diff --git a/src/locales/en.json b/src/locales/en.json index 576a899..6c01166 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -189,6 +189,56 @@ "logout": "Logout" }, "account": { + "title": "Account Management", + "userManagement": "User Management", + "passwordManagement": "Password Management", + "userSettings": "User Settings", + "addUser": "Add User", + "addAccount": "Add Account", + "loginAuthInfo": "Login Authentication Info", + "accountPermission": "Account Permission", + "registrationStatus": "Registration Status", + "userId": "User ID", + "password": "Password", + "loginRange": "Login Range", + "merchant": "Merchant", + "currentPassword": "Current Password", + "newPassword": "New Password", + "reEnterNewPassword": "Re-enter New Password", + "changeLoginPassword": "Change Login Password", + "changeCancelPassword": "Change Cancel Password", + "identityVerificationInfo": "Identity Verification Information", + "identityVerificationNotice": "The information you provide will be used for login and sending merchant-related materials.", + "emailAddress": "Email Address", + "phoneNumber": "Phone Number", + "addEmail": "Add Email", + "addPhone": "Add Phone", + "pleaseEnterId": "Please enter ID", + "pleaseEnterPassword": "Please enter password", + "pleaseEnter8OrMoreCharacters": "Please enter 8 or more characters", + "enterPassword": "Enter password", + "reEnterPassword": "Re-enter password", + "enterPhoneNumber": "Enter phone number", + "checking": "Checking...", + "availableId": "This ID is available.", + "duplicateIdExists": "This ID already exists.", + "inputMismatch": "Input mismatch", + "processing": "Processing...", + "userAddedSuccessfully": "User added successfully.", + "userAddFailed": "Failed to add user.", + "userInfoSavedSuccessfully": "User information saved successfully.", + "userInfoSaveFailed": "Failed to save user information.", + "passwordChangedSuccessfully": "Password changed successfully.", + "passwordChangeFailed": "Failed to change password.", + "permissionSavedSuccessfully": "Permission saved successfully.", + "permissionSaveFailed": "Failed to save permission.", + "permissionSaved": "Permission saved.", + "setMenuPermissions": "Please set menu permissions.", + "permissionRestrictionsNotice": "Function usage will be restricted according to selected permissions.", + "save": "Save", + "execute": "Execute", + "download": "Download", + "tabChangeResetNotice": "※ Unsaved content will be reset when switching tabs.", "accountStatus": "Account Status", "active": "Active", "inactive": "Inactive", diff --git a/src/locales/ko.json b/src/locales/ko.json index b9153e3..77a117c 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -194,6 +194,56 @@ "logout": "로그아웃" }, "account": { + "title": "계정 관리", + "userManagement": "사용자 관리", + "passwordManagement": "비밀번호 관리", + "userSettings": "사용자 설정", + "addUser": "사용자 추가", + "addAccount": "계정 추가", + "loginAuthInfo": "로그인 인증정보", + "accountPermission": "계정권한", + "registrationStatus": "등록 현황", + "userId": "사용자ID", + "password": "비밀번호", + "loginRange": "로그인 범위", + "merchant": "가맹점", + "currentPassword": "기존 비밀번호", + "newPassword": "변경 비밀번호", + "reEnterNewPassword": "변경 비밀번호 재입력", + "changeLoginPassword": "로그인 비밀번호 변경", + "changeCancelPassword": "거래취소 비밀번호 변경", + "identityVerificationInfo": "본인인증용 정보 입력", + "identityVerificationNotice": "입력하신 정보는 이후 로그인 및 가맹점 관련 자료 발송에 이용됩니다.", + "emailAddress": "이메일 주소", + "phoneNumber": "휴대폰 번호", + "addEmail": "이메일 추가", + "addPhone": "휴대폰 추가", + "pleaseEnterId": "ID를 입력해 주세요", + "pleaseEnterPassword": "비밀번호를 입력해 주세요", + "pleaseEnter8OrMoreCharacters": "8자리 이상 입력해 주세요", + "enterPassword": "비밀번호를 입력하세요", + "reEnterPassword": "비밀번호를 다시 입력하세요", + "enterPhoneNumber": "휴대폰 번호 입력", + "checking": "확인 중...", + "availableId": "사용 가능한 ID입니다.", + "duplicateIdExists": "동일한 ID가 이미 존재합니다.", + "inputMismatch": "입력 정보 불일치", + "processing": "처리중...", + "userAddedSuccessfully": "사용자가 성공적으로 추가되었습니다.", + "userAddFailed": "사용자 추가에 실패했습니다.", + "userInfoSavedSuccessfully": "사용자 정보가 성공적으로 저장되었습니다.", + "userInfoSaveFailed": "사용자 정보 저장에 실패했습니다.", + "passwordChangedSuccessfully": "비밀번호가 성공적으로 변경되었습니다.", + "passwordChangeFailed": "비밀번호 변경에 실패했습니다.", + "permissionSavedSuccessfully": "권한이 성공적으로 저장되었습니다.", + "permissionSaveFailed": "권한 저장에 실패했습니다.", + "permissionSaved": "권한이 저장되었습니다.", + "setMenuPermissions": "메뉴별 사용 권한을 설정해 주세요.", + "permissionRestrictionsNotice": "선택한 권한에 따라 기능 이용이 제한됩니다.", + "save": "저장", + "execute": "실행", + "download": "다운로드", + "tabChangeResetNotice": "※ 탭을 변경하면 미저장 내용은 초기화됩니다.", "accountStatus": "계정 상태", "active": "사용", "inactive": "미사용", diff --git a/src/pages/account/password/manage-page.tsx b/src/pages/account/password/manage-page.tsx index 70c5016..b997f28 100644 --- a/src/pages/account/password/manage-page.tsx +++ b/src/pages/account/password/manage-page.tsx @@ -1,11 +1,12 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { AccountTab } from '@/entities/account/ui/account-tab'; import { PasswordManageWrap } from '@/entities/account/ui/password-manage-wrap'; import { AccountTabKeys } from '@/entities/account/model/types'; import { HeaderType } from '@/entities/common/model/types'; -import { +import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, @@ -13,10 +14,11 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; export const PasswordManagePage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const [activeTab, setActiveTab] = useState(AccountTabKeys.PasswordManage); - useSetHeaderTitle(t('account.manage')); + useSetHeaderTitle(t('account.title')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { diff --git a/src/pages/account/password/modify-cancel-password-page.tsx b/src/pages/account/password/modify-cancel-password-page.tsx index 41a60dd..0218f1c 100644 --- a/src/pages/account/password/modify-cancel-password-page.tsx +++ b/src/pages/account/password/modify-cancel-password-page.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { HeaderType } from '@/entities/common/model/types'; @@ -13,6 +14,7 @@ import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib/toast'; export const PasswordModifyCancelPasswordPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const midOptions = useStore.getState().UserStore.selectOptionsMids; const userMid = useStore.getState().UserStore.mid; @@ -23,7 +25,7 @@ export const PasswordModifyCancelPasswordPage = () => { const changeCancelPasswordMutation = useUserChangeCancelPasswordMutation({ onSuccess: () => { - snackBar('비밀번호가 성공적으로 변경되었습니다.'); + snackBar(t('account.passwordChangedSuccessfully')); // Clear form setPassword(''); setConfirmPassword(''); @@ -31,11 +33,11 @@ export const PasswordModifyCancelPasswordPage = () => { navigate(PATHS.account.password.manage); }, onError: (error) => { - snackBar(error?.response?.data?.message || '비밀번호 변경에 실패했습니다.'); + snackBar(error?.response?.data?.message || t('account.passwordChangeFailed')); } }); - useSetHeaderTitle('거래취소 비밀번호 변경'); + useSetHeaderTitle(t('account.changeCancelPassword')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { @@ -69,7 +71,7 @@ export const PasswordModifyCancelPasswordPage = () => {
-
가맹점 *
+
{t('account.merchant')} *
-
변경 비밀번호 *
+
{t('account.newPassword')} *
setPassword(e.target.value)} />
-
변경 비밀번호 재입력 *
+
{t('account.reEnterNewPassword')} *
setConfirmPassword(e.target.value)} />
{confirmPassword && password !== confirmPassword && ( -
입력 정보 불일치
+
{t('account.inputMismatch')}
)}
@@ -116,7 +118,7 @@ export const PasswordModifyCancelPasswordPage = () => { type="button" disabled={!isFormValid() || changeCancelPasswordMutation.isPending} onClick={handleSave} - >{changeCancelPasswordMutation.isPending ? '처리중...' : '저장'} + >{changeCancelPasswordMutation.isPending ? t('account.processing') : t('common.save')}
diff --git a/src/pages/account/password/modify-login-password-page.tsx b/src/pages/account/password/modify-login-password-page.tsx index 7ef4e0e..7580932 100644 --- a/src/pages/account/password/modify-login-password-page.tsx +++ b/src/pages/account/password/modify-login-password-page.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { HeaderType } from '@/entities/common/model/types'; @@ -12,6 +13,7 @@ import { useUserChangePasswordMutation } from '@/entities/user/api/use-user-chan import { snackBar } from '@/shared/lib/toast'; export const PasswordModifyLoginPasswordPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const [currentPassword, setCurrentPassword] = useState(''); const [newPassword, setNewPassword] = useState(''); @@ -20,7 +22,7 @@ export const PasswordModifyLoginPasswordPage = () => { const changePasswordMutation = useUserChangePasswordMutation({ onSuccess: () => { - snackBar('비밀번호가 성공적으로 변경되었습니다.'); + snackBar(t('account.passwordChangedSuccessfully')); // Clear form setCurrentPassword(''); setNewPassword(''); @@ -29,11 +31,11 @@ export const PasswordModifyLoginPasswordPage = () => { navigate(PATHS.account.password.manage); }, onError: (error) => { - snackBar(error?.response?.data?.message || '비밀번호 변경에 실패했습니다.'); + snackBar(error?.response?.data?.message || t('account.passwordChangeFailed')); } }); - useSetHeaderTitle('로그인 비밀번호 변경'); + useSetHeaderTitle(t('account.changeLoginPassword')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { @@ -70,7 +72,7 @@ export const PasswordModifyLoginPasswordPage = () => {
-
기존 비밀번호 *
+
{t('account.currentPassword')} *
{ />
-
변경 비밀번호 *
+
{t('account.newPassword')} *
{ />
-
변경 비밀번호 재입력 *
+
{t('account.reEnterNewPassword')} *
{ />
{confirmPassword && newPassword !== confirmPassword && ( -
입력 정보 불일치
+
{t('account.inputMismatch')}
)}
@@ -110,7 +112,7 @@ export const PasswordModifyLoginPasswordPage = () => { type="button" disabled={!isFormValid() || changePasswordMutation.isPending} onClick={handleSave} - >{changePasswordMutation.isPending ? '처리중...' : '저장'} + >{changePasswordMutation.isPending ? t('account.processing') : t('common.save')}
diff --git a/src/pages/account/user/account-auth-page.tsx b/src/pages/account/user/account-auth-page.tsx index 713c0eb..ccfe07c 100644 --- a/src/pages/account/user/account-auth-page.tsx +++ b/src/pages/account/user/account-auth-page.tsx @@ -1,12 +1,13 @@ import { useEffect, useState } from 'react'; import { useLocation } from 'react-router'; +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { AccountUserTab } from '@/entities/account/ui/account-user-tab'; import { UserAccountAuthWrap } from '@/entities/account/ui/user-account-auth-wrap'; import { AccountUserTabKeys } from '@/entities/account/model/types'; import { HeaderType } from '@/entities/common/model/types'; -import { +import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, @@ -14,12 +15,13 @@ import { } from '@/widgets/sub-layout/use-sub-layout'; export const UserAccountAuthPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const location = useLocation(); const { mid, usrid, idCL, status } = location.state || {}; const [activeTab, ] = useState(AccountUserTabKeys.AccountAuth); - useSetHeaderTitle('사용자 설정'); + useSetHeaderTitle(t('account.userSettings')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { diff --git a/src/pages/account/user/add-account-page.tsx b/src/pages/account/user/add-account-page.tsx index 611d05c..56b171c 100644 --- a/src/pages/account/user/add-account-page.tsx +++ b/src/pages/account/user/add-account-page.tsx @@ -1,3 +1,4 @@ +import { useTranslation } from 'react-i18next'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { HeaderType } from '@/entities/common/model/types'; @@ -15,16 +16,17 @@ import { useLocation } from 'react-router'; import { snackBar } from '@/shared/lib/toast'; export const UserAddAccountPage = () => { + const { t } = useTranslation(); const { navigate } = useNavigate(); const location = useLocation(); const { mid } = location.state || {}; const { mutateAsync: userCreate, isPending } = useUserCreateMutation({ onSuccess: () => { - snackBar('사용자가 성공적으로 추가되었습니다.'); + snackBar(t('account.userAddedSuccessfully')); }, onError: (error) => { - snackBar(error?.response?.data?.message || '사용자 추가에 실패했습니다.'); + snackBar(error?.response?.data?.message || t('account.userAddFailed')); } }); @@ -67,13 +69,13 @@ export const UserAddAccountPage = () => { if (userExistsData && shouldCheckUsrid) { setIsCheckingUsrid(false); if (userExistsData.exists) { - setErrors(prev => ({ ...prev, usrid: '동일한 ID가 이미 존재합니다.' })); + setErrors(prev => ({ ...prev, usrid: t('account.duplicateIdExists') })); } else { setErrors(prev => ({ ...prev, usrid: '' })); } setShouldCheckUsrid(false); } - }, [userExistsData, shouldCheckUsrid]); + }, [userExistsData, shouldCheckUsrid, t]); // 이메일/전화번호 관리 함수들 (user-login-auth-info-wrap 방식) const handleAddEmail = () => { @@ -159,9 +161,9 @@ export const UserAddAccountPage = () => { // 비밀번호 검증 함수 const validatePassword = (password: string) => { if (!password.trim()) { - return '비밀번호를 입력해 주세요'; + return t('account.pleaseEnterPassword'); } else if (password.length < 8) { - return '8자리 이상 입력해 주세요'; + return t('account.pleaseEnter8OrMoreCharacters'); } return ''; }; @@ -317,16 +319,16 @@ export const UserAddAccountPage = () => { // 사용자 ID 검증 if (!formData.usrid.trim()) { - newErrors.usrid = 'ID를 입력해 주세요'; + newErrors.usrid = t('account.pleaseEnterId'); isValid = false; } // 비밀번호 검증 if (!formData.password.trim()) { - newErrors.password = '비밀번호를 입력해 주세요'; + newErrors.password = t('account.pleaseEnterPassword'); isValid = false; } else if (formData.password.length < 8) { - newErrors.password = '8자리 이상 입력해 주세요'; + newErrors.password = t('account.pleaseEnter8OrMoreCharacters'); isValid = false; } @@ -382,12 +384,12 @@ export const UserAddAccountPage = () => { if (response.status) { // 성공 시 사용자 관리 페이지로 이동 - snackBar('사용자가 성공적으로 추가되었습니다.'); + snackBar(t('account.userAddedSuccessfully')); navigate(PATHS.account.user.manage); } else if (response.error) { // 에러 처리 if (response.error.errKey === 'USER_DUPLICATE') { - setErrors(prev => ({ ...prev, usrid: '동일한 ID가 이미 존재합니다.' })); + setErrors(prev => ({ ...prev, usrid: t('account.duplicateIdExists') })); } else { // 기타 에러 처리 console.error('User creation failed:', response.error.message); @@ -398,7 +400,7 @@ export const UserAddAccountPage = () => { } }; - useSetHeaderTitle('사용자 추가'); + useSetHeaderTitle(t('account.addUser')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { @@ -413,12 +415,12 @@ export const UserAddAccountPage = () => {
-
사용자ID *
+
{t('account.userId')} *
handleInputChange('usrid', e.target.value)} /> @@ -431,22 +433,22 @@ export const UserAddAccountPage = () => { fontSize: '12px', color: '#666' }}> - 확인 중... + {t('account.checking')}
)}
{errors.usrid &&
{errors.usrid}
} {!errors.usrid && formData.usrid && userExistsData && !userExistsData.exists && ( -
사용 가능한 ID입니다.
+
{t('account.availableId')}
)}
-
비밀번호 *
+
{t('account.password')} *
handleInputChange('password', e.target.value)} onBlur={handlePasswordBlur} @@ -455,7 +457,7 @@ export const UserAddAccountPage = () => { {errors.password &&
{errors.password}
}
-
로그인 범위
+
{t('account.loginRange')}
{ {hasDefaultPermission(menu.menuId, PERMISSION.EXECUTE) && (
- 실행 + {t('account.execute')}