언어 키를 선택하세요
좌측 목록에서 편집할 언어 키를 클릭하세요
diff --git a/frontend/app/(main)/admin/userMng/companyList/page.tsx b/frontend/app/(main)/admin/userMng/companyList/page.tsx
index 1f08f097..c3a2f4bd 100644
--- a/frontend/app/(main)/admin/userMng/companyList/page.tsx
+++ b/frontend/app/(main)/admin/userMng/companyList/page.tsx
@@ -10,6 +10,109 @@ import { ScrollToTop } from "@/components/common/ScrollToTop";
import { useAuth } from "@/hooks/useAuth";
import { AlertCircle } from "lucide-react";
import { Button } from "@/components/ui/button";
+import { usePageMultiLang } from "@/hooks/usePageMultiLang";
+
+// 다국어 키 목록
+const LANG_KEYS = [
+ "company.page.title",
+ "company.page.description",
+ "company.access.denied.title",
+ "company.access.denied.description",
+ "company.access.denied.back",
+ "company.toolbar.total",
+ "company.toolbar.create",
+ "company.table.companyCode",
+ "company.table.companyName",
+ "company.table.writer",
+ "company.table.diskUsage",
+ "company.table.diskNoInfo",
+ "company.table.fileCount",
+ "company.table.actions",
+ "company.table.empty",
+ "company.table.cardWriter",
+ "company.table.cardDiskUsage",
+ "company.table.actionDept",
+ "company.table.actionEdit",
+ "company.table.actionDelete",
+ "company.form.titleCreate",
+ "company.form.titleEdit",
+ "company.form.companyName",
+ "company.form.companyNamePlaceholder",
+ "company.form.businessNumber",
+ "company.form.businessNumberHint",
+ "company.form.representativeName",
+ "company.form.representativeNamePlaceholder",
+ "company.form.representativePhone",
+ "company.form.email",
+ "company.form.website",
+ "company.form.address",
+ "company.form.addressPlaceholder",
+ "company.form.companyCodeLabel",
+ "company.form.writerLabel",
+ "company.form.regdateLabel",
+ "company.form.cancel",
+ "company.form.save",
+ "company.form.update",
+ "company.delete.title",
+ "company.delete.description",
+ "company.delete.companyName",
+ "company.delete.companyCode",
+ "company.delete.writer",
+ "company.delete.regdate",
+ "company.delete.cancel",
+ "company.delete.confirm",
+] as const;
+
+// 한국어 기본 텍스트
+const DEFAULT_TEXTS: Record
= {
+ "company.page.title": "회사 관리",
+ "company.page.description": "시스템에서 사용하는 회사 정보를 관리합니다",
+ "company.access.denied.title": "접근 권한 없음",
+ "company.access.denied.description": "회사 관리는 최고 관리자만 접근할 수 있습니다.",
+ "company.access.denied.back": "뒤로 가기",
+ "company.toolbar.total": "총",
+ "company.toolbar.create": "회사 등록",
+ "company.table.companyCode": "회사코드",
+ "company.table.companyName": "회사명",
+ "company.table.writer": "등록자",
+ "company.table.diskUsage": "디스크 사용량",
+ "company.table.diskNoInfo": "정보 없음",
+ "company.table.fileCount": "{count}개 파일",
+ "company.table.actions": "작업",
+ "company.table.empty": "등록된 회사가 없습니다.",
+ "company.table.cardWriter": "작성자",
+ "company.table.cardDiskUsage": "디스크 사용량",
+ "company.table.actionDept": "부서관리",
+ "company.table.actionEdit": "수정",
+ "company.table.actionDelete": "삭제",
+ "company.form.titleCreate": "새 회사 등록",
+ "company.form.titleEdit": "회사 정보 수정",
+ "company.form.companyName": "회사명",
+ "company.form.companyNamePlaceholder": "회사명을 입력하세요",
+ "company.form.businessNumber": "사업자등록번호",
+ "company.form.businessNumberHint": "10자리 숫자 (자동 하이픈 추가)",
+ "company.form.representativeName": "대표자명",
+ "company.form.representativeNamePlaceholder": "대표자명을 입력하세요",
+ "company.form.representativePhone": "대표 연락처",
+ "company.form.email": "이메일",
+ "company.form.website": "웹사이트",
+ "company.form.address": "회사 주소",
+ "company.form.addressPlaceholder": "서울특별시 강남구...",
+ "company.form.companyCodeLabel": "회사 코드:",
+ "company.form.writerLabel": "등록자:",
+ "company.form.regdateLabel": "등록일:",
+ "company.form.cancel": "취소",
+ "company.form.save": "등록",
+ "company.form.update": "수정",
+ "company.delete.title": "회사 삭제 확인",
+ "company.delete.description": "선택한 회사를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
+ "company.delete.companyName": "회사명",
+ "company.delete.companyCode": "회사 코드",
+ "company.delete.writer": "등록자",
+ "company.delete.regdate": "등록일",
+ "company.delete.cancel": "취소",
+ "company.delete.confirm": "삭제",
+};
/**
* 회사 관리 페이지
@@ -19,6 +122,12 @@ export default function CompanyPage() {
const { user: currentUser } = useAuth();
const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN";
+ const { t } = usePageMultiLang({
+ keys: LANG_KEYS,
+ defaults: DEFAULT_TEXTS,
+ menuCode: "company.management",
+ });
+
const {
// 데이터
companies,
@@ -62,17 +171,17 @@ export default function CompanyPage() {
-
회사 관리
-
시스템에서 사용하는 회사 정보를 관리합니다
+
{t("company.page.title")}
+
{t("company.page.description")}
-
접근 권한 없음
+
{t("company.access.denied.title")}
- 회사 관리는 최고 관리자만 접근할 수 있습니다.
+ {t("company.access.denied.description")}
@@ -85,8 +194,8 @@ export default function CompanyPage() {
{/* 페이지 헤더 */}
-
회사 관리
-
시스템에서 사용하는 회사 정보를 관리합니다
+
{t("company.page.title")}
+
{t("company.page.description")}
{/* 디스크 사용량 요약 */}
@@ -100,10 +209,11 @@ export default function CompanyPage() {
onSearchChange={updateSearchFilter}
onSearchClear={clearSearchFilter}
onCreateClick={openCreateModal}
+ t={t}
/>
{/* 회사 목록 테이블 */}
-
+
{/* 회사 등록/수정 모달 */}
{/* 회사 삭제 확인 다이얼로그 */}
@@ -124,6 +235,7 @@ export default function CompanyPage() {
onClose={closeDeleteDialog}
onConfirm={deleteCompany}
onClearError={clearError}
+ t={t}
/>
diff --git a/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx b/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx
index f78b4a37..9ba74114 100644
--- a/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx
+++ b/frontend/app/(main)/admin/userMng/rolesList/[id]/page.tsx
@@ -11,6 +11,81 @@ import { DualListBox } from "@/components/common/DualListBox";
import { MenuPermissionsTable } from "@/components/admin/MenuPermissionsTable";
import { useMenu } from "@/contexts/MenuContext";
import { ScrollToTop } from "@/components/common/ScrollToTop";
+import { usePageMultiLang } from "@/hooks/usePageMultiLang";
+
+const LANG_KEYS = [
+ "detail.loading",
+ "detail.error.title",
+ "detail.error.load",
+ "detail.error.load.generic",
+ "detail.error.notfound",
+ "detail.button.backToList",
+ "detail.status.active",
+ "detail.status.inactive",
+ "detail.tab.members",
+ "detail.tab.permissions",
+ "detail.members.title",
+ "detail.members.description",
+ "detail.members.mode.user",
+ "detail.members.mode.dept",
+ "detail.members.saving",
+ "detail.members.save",
+ "detail.members.available",
+ "detail.members.selected",
+ "detail.members.dept.available",
+ "detail.members.dept.selected",
+ "detail.members.summary",
+ "detail.members.summary.count",
+ "detail.members.empty",
+ "detail.members.save.success",
+ "detail.members.save.fail",
+ "detail.members.save.error",
+ "detail.permissions.title",
+ "detail.permissions.description",
+ "detail.permissions.saving",
+ "detail.permissions.save",
+ "detail.permissions.save.success",
+ "detail.permissions.save.fail",
+ "detail.permissions.save.error",
+ "detail.count.members",
+] as const;
+
+const DEFAULT_TEXTS: Record
= {
+ "detail.loading": "권한 그룹 정보를 불러오는 중...",
+ "detail.error.title": "오류 발생",
+ "detail.error.load": "권한 그룹 정보를 불러오는데 실패했습니다.",
+ "detail.error.load.generic": "권한 그룹 정보를 불러오는 중 오류가 발생했습니다.",
+ "detail.error.notfound": "권한 그룹을 찾을 수 없습니다.",
+ "detail.button.backToList": "목록으로 돌아가기",
+ "detail.status.active": "활성",
+ "detail.status.inactive": "비활성",
+ "detail.tab.members": "멤버 관리",
+ "detail.tab.permissions": "메뉴 권한",
+ "detail.members.title": "멤버 관리",
+ "detail.members.description": "이 권한 그룹에 속한 사용자를 관리합니다",
+ "detail.members.mode.user": "사용자별",
+ "detail.members.mode.dept": "부서별",
+ "detail.members.saving": "저장 중...",
+ "detail.members.save": "멤버 저장",
+ "detail.members.available": "전체 사용자",
+ "detail.members.selected": "그룹 멤버",
+ "detail.members.dept.available": "부서 목록 (선택 시 소속 사용자 전체 추가)",
+ "detail.members.dept.selected": "추가된 부서",
+ "detail.members.summary": "현재 그룹 멤버",
+ "detail.members.summary.count": "현재 그룹 멤버 ({count}명)",
+ "detail.members.empty": "멤버가 없습니다",
+ "detail.members.save.success": "멤버가 성공적으로 저장되었습니다.",
+ "detail.members.save.fail": "멤버 저장에 실패했습니다.",
+ "detail.members.save.error": "멤버 저장 중 오류가 발생했습니다.",
+ "detail.permissions.title": "메뉴 권한 설정",
+ "detail.permissions.description": "이 권한 그룹에서 접근 가능한 메뉴와 권한을 설정합니다",
+ "detail.permissions.saving": "저장 중...",
+ "detail.permissions.save": "권한 저장",
+ "detail.permissions.save.success": "메뉴 권한이 성공적으로 저장되었습니다.",
+ "detail.permissions.save.fail": "메뉴 권한 저장에 실패했습니다.",
+ "detail.permissions.save.error": "메뉴 권한 저장 중 오류가 발생했습니다.",
+ "detail.count.members": "{count}명",
+};
/**
* 권한 그룹 상세 페이지
@@ -26,6 +101,7 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
const { user: currentUser } = useAuth();
const router = useRouter();
const { refreshMenus } = useMenu();
+ const { t } = usePageMultiLang({ keys: LANG_KEYS, defaults: DEFAULT_TEXTS, menuCode: "roles.management" });
const isSuperAdmin = currentUser?.companyCode === "*" && currentUser?.userType === "SUPER_ADMIN";
@@ -61,11 +137,11 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
if (response.success && response.data) {
setRoleGroup(response.data);
} else {
- setError(response.message || "권한 그룹 정보를 불러오는데 실패했습니다.");
+ setError(response.message || t("detail.error.load"));
}
} catch (err) {
console.error("권한 그룹 정보 로드 오류:", err);
- setError("권한 그룹 정보를 불러오는 중 오류가 발생했습니다.");
+ setError(t("detail.error.load.generic"));
} finally {
setIsLoading(false);
}
@@ -130,7 +206,7 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
return {
id: `dept_${deptCode}`,
label: dept.deptName || dept.dept_name || deptCode,
- description: `${userIds.length}명`,
+ description: t("detail.count.members", { count: userIds.length }),
userIds,
};
}).filter((d: any) => d.userIds.length > 0),
@@ -236,17 +312,17 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
const response = await roleAPI.updateMembers(roleGroup.objid, selectedUserIds);
if (response.success) {
- alert("멤버가 성공적으로 저장되었습니다.");
+ alert(t("detail.members.save.success"));
loadMembers(); // 새로고침
// 사이드바 메뉴 새로고침 (현재 사용자가 영향받을 수 있음)
await refreshMenus();
} else {
- alert(response.message || "멤버 저장에 실패했습니다.");
+ alert(response.message || t("detail.members.save.fail"));
}
} catch (err) {
console.error("멤버 저장 오류:", err);
- alert("멤버 저장 중 오류가 발생했습니다.");
+ alert(t("detail.members.save.error"));
} finally {
setIsSavingMembers(false);
}
@@ -261,17 +337,17 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
const response = await roleAPI.setMenuPermissions(roleGroup.objid, menuPermissions);
if (response.success) {
- alert("메뉴 권한이 성공적으로 저장되었습니다.");
+ alert(t("detail.permissions.save.success"));
loadMenuPermissions(); // 새로고침
// 사이드바 메뉴 새로고침 (권한 변경 즉시 반영)
await refreshMenus();
} else {
- alert(response.message || "메뉴 권한 저장에 실패했습니다.");
+ alert(response.message || t("detail.permissions.save.fail"));
}
} catch (err) {
console.error("메뉴 권한 저장 오류:", err);
- alert("메뉴 권한 저장 중 오류가 발생했습니다.");
+ alert(t("detail.permissions.save.error"));
} finally {
setIsSavingPermissions(false);
}
@@ -282,7 +358,7 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
-
권한 그룹 정보를 불러오는 중...
+
{t("detail.loading")}
);
@@ -292,10 +368,10 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
return (
-
오류 발생
-
{error || "권한 그룹을 찾을 수 없습니다."}
+
{t("detail.error.title")}
+
{error || t("detail.error.notfound")}
);
@@ -321,7 +397,7 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
roleGroup.status === "active" ? "bg-emerald-100 text-emerald-800" : "bg-muted text-foreground"
}`}
>
- {roleGroup.status === "active" ? "활성" : "비활성"}
+ {roleGroup.status === "active" ? t("detail.status.active") : t("detail.status.inactive")}
@@ -337,7 +413,7 @@ export default function RoleDetailPage({ params }: { params: Promise<{ id: strin
}`}
>
- 멤버 관리 ({selectedUsers.length})
+ {t("detail.tab.members")} ({selectedUsers.length})