summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/[lng]/evcp/(evcp)/(eng)/cover/page.tsx6
-rw-r--r--app/[lng]/evcp/(evcp)/(eng)/document-list-ship/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(eng)/vendor-data/layout.tsx11
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/general-contracts/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/itb-create/page.tsx15
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/pcr/page.tsx14
-rw-r--r--app/[lng]/evcp/(evcp)/(procurement)/tbe-last/page.tsx15
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/approval/line/page.tsx7
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/approval/log/page.tsx14
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/approval/template/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/change-vendor/page.tsx20
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/email-log/page.tsx6
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/email-template/page.tsx9
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/email-whitelist/page.tsx9
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/information/page.tsx4
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/integration-log/page.tsx13
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/integration/page.tsx13
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/login-history/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/menu-access-dept/page.tsx22
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/menu-access/page.tsx10
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/menu-list/page.tsx24
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/notice/page.tsx14
-rw-r--r--app/[lng]/evcp/(evcp)/(system)/page-visits/page.tsx8
-rw-r--r--app/[lng]/evcp/(evcp)/edp-progress/page.tsx10
-rw-r--r--components/information/information-button.tsx2
25 files changed, 185 insertions, 93 deletions
diff --git a/app/[lng]/evcp/(evcp)/(eng)/cover/page.tsx b/app/[lng]/evcp/(evcp)/(eng)/cover/page.tsx
index 9f2b2e61..891296db 100644
--- a/app/[lng]/evcp/(evcp)/(eng)/cover/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(eng)/cover/page.tsx
@@ -9,12 +9,16 @@ import { searchParamsProjectsCache } from "@/lib/projects/validation"
import { InformationButton } from "@/components/information/information-button"
import { getProjectListsForCover } from "@/lib/cover/service"
import { ProjectsTableForCover } from "@/lib/cover/table/projects-table"
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function IndexPage(props: IndexPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
const search = searchParamsProjectsCache.parse(searchParams)
@@ -35,7 +39,7 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 프로젝트 리스트
+ {t('menu.engineering_management.cover')}
</h2>
<InformationButton pagePath="evcp/projects" />
</div>
diff --git a/app/[lng]/evcp/(evcp)/(eng)/document-list-ship/page.tsx b/app/[lng]/evcp/(evcp)/(eng)/document-list-ship/page.tsx
index 822e7cd4..018c5e73 100644
--- a/app/[lng]/evcp/(evcp)/(eng)/document-list-ship/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(eng)/document-list-ship/page.tsx
@@ -15,11 +15,15 @@ import { getUserVendorDocumentStats, getUserVendorDocumentStatsAll, getUserVendo
import { UserVendorDocumentDisplay } from "@/components/ship-vendor-document/user-vendor-document-table-container"
import { InformationButton } from "@/components/information/information-button"
import { UserVendorALLDocumentDisplay } from "@/components/ship-vendor-document-all/user-vendor-document-table-container"
+import { useTranslation } from "@/i18n"
interface IndexPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function IndexPage(props: IndexPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
const search = searchParamsShipDocuCache.parse(searchParams)
const validFilters = getValidFilters(search.filters)
@@ -35,11 +39,11 @@ export default async function IndexPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 문서 관리
+ {t('menu.engineering_management.document_list_ship')}
</h2>
</div>
{/* <p className="text-muted-foreground">
- 소속 회사의 모든 도서/도면을 확인하고 관리합니다.
+ {t('menu.engineering_management.document_list_ship_desc')}
</p> */}
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(eng)/vendor-data/layout.tsx b/app/[lng]/evcp/(evcp)/(eng)/vendor-data/layout.tsx
index 7d00359c..be6bb5eb 100644
--- a/app/[lng]/evcp/(evcp)/(eng)/vendor-data/layout.tsx
+++ b/app/[lng]/evcp/(evcp)/(eng)/vendor-data/layout.tsx
@@ -5,12 +5,19 @@ import { Shell } from "@/components/shell"
import { getVendorProjectsAndContracts } from "@/lib/vendor-data/services"
import { VendorDataContainer } from "@/components/vendor-data/vendor-data-container"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
+
// Layout 컴포넌트는 서버 컴포넌트입니다
export default async function VendorDataLayout({
+ params,
children,
}: {
+ params: Promise<{ lng: string }>
children: React.ReactNode
}) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
+
// evcp: 전체 계약 대상으로 프로젝트 데이터 가져오기
const projects = await getVendorProjectsAndContracts()
@@ -32,7 +39,7 @@ export default async function VendorDataLayout({
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 협력업체 데이터 입력
+ {t('menu.engineering_management.vendor_data')}
</h2>
<InformationButton pagePath="partners/vendor-data" />
</div>
@@ -64,4 +71,4 @@ export default async function VendorDataLayout({
</section>
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/general-contracts/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/general-contracts/page.tsx
index a6d5057c..96f03d09 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/general-contracts/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/general-contracts/page.tsx
@@ -12,6 +12,7 @@ import { GeneralContractsTable } from "@/lib/general-contracts/main/general-cont
import { getValidFilters } from "@/lib/data-table"
import { type SearchParams } from "@/types/table"
import { InformationButton } from "@/components/information/information-button"
+import { useTranslation } from "@/i18n"
export const metadata = {
title: "일반계약 관리",
@@ -19,10 +20,13 @@ export const metadata = {
}
interface IndexPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function GeneralContractsPage(props: IndexPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
// ✅ searchParams 파싱
const searchParams = await props.searchParams
const search = searchParamsCache.parse(searchParams)
@@ -52,12 +56,12 @@ export default async function GeneralContractsPage(props: IndexPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 일반계약 관리
+ {t('menu.procurement.general_contract')}
</h2>
<InformationButton pagePath="evcp/general-contracts" />
</div>
<p className="text-muted-foreground">
- 일반계약을 생성하고 관리할 수 있습니다. 계약 상세정보, 품목정보, 납품확인서 등을 관리할 수 있습니다.
+ {t('menu.procurement.general_contract_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/itb-create/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/itb-create/page.tsx
index 54040e7f..77dc54ee 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/itb-create/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/itb-create/page.tsx
@@ -12,17 +12,16 @@ import Link from "next/link";
import { searchParamsPurchaseRequestCache } from "@/lib/itb/validations";
import { getAllPurchaseRequests, getPurchaseRequestStats } from "@/lib/itb/service";
import { PurchaseRequestsTable } from "@/lib/itb/table/purchase-requests-table";
+import { useTranslation } from "@/i18n"
interface PurchaseRequestsPageProps {
- params: {
- lng: string;
- };
+ params: Promise<{ lng: string }>;
searchParams: Promise<SearchParams>;
}
export default async function PurchaseRequestsPage(props: PurchaseRequestsPageProps) {
- const resolvedParams = await props.params;
- const lng = resolvedParams.lng;
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams;
@@ -44,10 +43,10 @@ export default async function PurchaseRequestsPage(props: PurchaseRequestsPagePr
<div className="flex items-center justify-between">
<div>
<h2 className="text-2xl font-bold tracking-tight">
- 구매 요청 관리
+ {t('menu.engineering_management.itb')}
</h2>
<p className="text-muted-foreground">
- 프로젝트별 자재 구매 요청을 생성하고 관리합니다.
+ {t('menu.engineering_management.itb_desc')}
</p>
</div>
</div>
@@ -161,4 +160,4 @@ async function PurchaseRequestStats({
export const metadata = {
title: "Purchase Request Management",
description: "Create and manage material purchase requests for projects",
-}; \ No newline at end of file
+};
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/pcr/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/pcr/page.tsx
index 7617bf58..22e0c124 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/pcr/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/pcr/page.tsx
@@ -5,12 +5,17 @@ import { InformationButton } from "@/components/information/information-button"
import { PcrTable } from "@/lib/pcr/table/pcr-table";
import { getPcrPoList } from "@/lib/pcr/service";
+import { useTranslation } from "@/i18n"
export const metadata = {
title: "PCR 관리",
description: "Purchase Change Request를 생성하고 관리할 수 있습니다.",
};
+interface IndexPageProps {
+ params: Promise<{ lng: string }>
+}
+
async function PcrTableWrapper() {
// 기본 데이터 조회 (EvcP용 - 모든 데이터 조회)
const tableData = await getPcrPoList({
@@ -21,7 +26,10 @@ async function PcrTableWrapper() {
return <PcrTable tableData={tableData} isEvcpPage={true} currentVendorId={undefined} />;
}
-export default function PcrPage() {
+export default async function PcrPage({ params }: IndexPageProps) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
+
return (
<Shell className="gap-4">
{/* ═══════════════════════════════════════════════════════════════ */}
@@ -32,12 +40,12 @@ export default function PcrPage() {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- PCR 관리
+ {t('menu.procurement.pcr')}
</h2>
<InformationButton pagePath="evcp/pcr" />
</div>
<p className="text-muted-foreground">
- Purchase Change Request를 생성하고 관리할 수 있습니다. PCR 승인 상태, 변경 구분, PO/계약 정보 등을 확인할 수 있습니다.
+ {t('menu.procurement.pcr_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(procurement)/tbe-last/page.tsx b/app/[lng]/evcp/(evcp)/(procurement)/tbe-last/page.tsx
index 61e7ce05..81d2af51 100644
--- a/app/[lng]/evcp/(evcp)/(procurement)/tbe-last/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(procurement)/tbe-last/page.tsx
@@ -10,17 +10,16 @@ import { Shell } from "@/components/shell"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
import { Button } from "@/components/ui/button"
import { Plus } from "lucide-react"
+import { useTranslation } from "@/i18n"
interface TbeLastPageProps {
- params: {
- lng: string
- }
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function TbeLastPage(props: TbeLastPageProps) {
- const resolvedParams = await props.params
- const lng = resolvedParams.lng
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
@@ -41,10 +40,10 @@ export default async function TbeLastPage(props: TbeLastPageProps) {
<div className="flex items-center justify-between">
<div>
<h2 className="text-2xl font-bold tracking-tight">
- Technical Bid Evaluation (TBE)
+ {t('menu.engineering_management.tbe')}
</h2>
<p className="text-muted-foreground">
- RFQ 발송 후 기술 평가를 진행하고 문서를 검토합니다.
+ {t('menu.engineering_management.tbe_desc')}
</p>
</div>
@@ -71,4 +70,4 @@ export default async function TbeLastPage(props: TbeLastPageProps) {
export const metadata = {
title: "TBE Management",
description: "Technical Bid Evaluation for RFQ responses",
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/approval/line/page.tsx b/app/[lng]/evcp/(evcp)/(system)/approval/line/page.tsx
index 2e96b434..0e227e0b 100644
--- a/app/[lng]/evcp/(evcp)/(system)/approval/line/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/approval/line/page.tsx
@@ -9,16 +9,21 @@ import { getApprovalLineList } from '@/lib/approval-line/service';
import { SearchParamsApprovalLineCache } from '@/lib/approval-line/validations';
import { ApprovalLineTable } from '@/lib/approval-line/table/approval-line-table';
+import { useTranslation } from "@/i18n";
+
export const metadata: Metadata = {
title: '결재선 관리',
description: '결재용 결재선을 관리합니다.',
};
interface PageProps {
+ params: Promise<{ lng: string }>;
searchParams: Promise<SearchParams>;
}
export default async function ApprovalLinePage(props: PageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams;
const search = SearchParamsApprovalLineCache.parse(searchParams);
// getValidFilters 반환값이 undefined 인 경우 폴백
@@ -37,7 +42,7 @@ export default async function ApprovalLinePage(props: PageProps) {
<div className="flex items-center justify-between space-y-2">
<div>
<div className="flex items-center gap-2">
- <h2 className="text-2xl font-bold tracking-tight">결재선 관리</h2>
+ <h2 className="text-2xl font-bold tracking-tight">{t('menu.information_system.approval_line')}</h2>
</div>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(system)/approval/log/page.tsx b/app/[lng]/evcp/(evcp)/(system)/approval/log/page.tsx
index f5b069df..d6ab6282 100644
--- a/app/[lng]/evcp/(evcp)/(system)/approval/log/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/approval/log/page.tsx
@@ -5,8 +5,16 @@ import { Skeleton } from "@/components/ui/skeleton";
import { ApprovalLogTable } from "@/lib/approval-log/table/approval-log-table";
import { getApprovalLogList } from "@/lib/approval-log/service";
import React from "react";
+import { useTranslation } from "@/i18n";
+
+interface approvalLogPageProps {
+ params: Promise<{ lng: string }>
+}
+
+export default async function ApprovalLogPage({ params }: approvalLogPageProps) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
-export default async function ApprovalLogPage() {
// 기본 데이터 조회 (첫 페이지, 기본 정렬)
const promises = Promise.all([
getApprovalLogList({
@@ -23,7 +31,7 @@ export default async function ApprovalLogPage() {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 결재 로그
+ {t('menu.information_system.approval_log')}
</h2>
<InformationButton pagePath="evcp/approval/log" />
</div>
@@ -46,4 +54,4 @@ export default async function ApprovalLogPage() {
</React.Suspense>
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/approval/template/page.tsx b/app/[lng]/evcp/(evcp)/(system)/approval/template/page.tsx
index c5834b05..91118d90 100644
--- a/app/[lng]/evcp/(evcp)/(system)/approval/template/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/approval/template/page.tsx
@@ -8,6 +8,7 @@ import { getValidFilters } from '@/lib/data-table';
import { getApprovalTemplateList } from '@/lib/approval-template/service';
import { SearchParamsApprovalTemplateCache } from '@/lib/approval-template/validations';
import { ApprovalTemplateTable } from '@/lib/approval-template/table/approval-template-table';
+import { useTranslation } from "@/i18n";
export const metadata: Metadata = {
title: '결재 템플릿 관리',
@@ -15,10 +16,13 @@ export const metadata: Metadata = {
};
interface PageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>;
}
export default async function ApprovalTemplatePage(props: PageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams;
const search = SearchParamsApprovalTemplateCache.parse(searchParams);
// getValidFilters 반환값이 undefined 인 경우 폴백
@@ -37,7 +41,7 @@ export default async function ApprovalTemplatePage(props: PageProps) {
<div className="flex items-center justify-between space-y-2">
<div>
<div className="flex items-center gap-2">
- <h2 className="text-2xl font-bold tracking-tight">결재 템플릿 관리</h2>
+ <h2 className="text-2xl font-bold tracking-tight">{t('menu.information_system.approval_template')}</h2>
</div>
</div>
</div>
@@ -66,4 +70,4 @@ export default async function ApprovalTemplatePage(props: PageProps) {
</React.Suspense>
</Shell>
);
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/change-vendor/page.tsx b/app/[lng]/evcp/(evcp)/(system)/change-vendor/page.tsx
index 4b4b0a8d..8b4ba5b5 100644
--- a/app/[lng]/evcp/(evcp)/(system)/change-vendor/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/change-vendor/page.tsx
@@ -2,6 +2,11 @@ import * as React from 'react';
import { type Metadata } from 'next';
import { Shell } from '@/components/shell';
import { ChangeVendorClient } from './change-vendor-client';
+import { useTranslation } from "@/i18n";
+
+interface changeVendorPageProps {
+ params: Promise<{ lng: string }>
+}
export const metadata: Metadata = {
title: '벤더 변경',
@@ -10,15 +15,20 @@ export const metadata: Metadata = {
export const dynamic = 'force-dynamic';
-export default async function ChangeVendorPage() {
+export default async function ChangeVendorPage({ params }: changeVendorPageProps) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
+
return (
<Shell className="gap-6">
<div className="flex items-center justify-between space-y-2">
<div>
- <h2 className="text-2xl font-bold tracking-tight">벤더 변경</h2>
- <p className="text-muted-foreground">
- 유저를 검색하고 선택한 후, 해당 유저의 벤더를 변경할 수 있습니다.
- </p>
+ <h2 className="text-2xl font-bold tracking-tight">
+ {t('menu.information_system.change_vendor')}
+ </h2>
+ {/* <p className="text-muted-foreground"> */}
+ {/* 유저를 검색하고 선택한 후, 해당 유저의 벤더를 변경할 수 있습니다. */}
+ {/* </p> */}
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(system)/email-log/page.tsx b/app/[lng]/evcp/(evcp)/(system)/email-log/page.tsx
index 41001cc7..07699daf 100644
--- a/app/[lng]/evcp/(evcp)/(system)/email-log/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/email-log/page.tsx
@@ -7,6 +7,7 @@ import { SearchParams } from "@/types/table"
import { SearchParamsEmailLogCache } from "@/lib/email-log/validations"
import { getEmailLogList } from "@/lib/email-log/service"
import { EmailLogTable } from "@/lib/email-log/table/email-log-table"
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: "이메일 발신 이력 조회",
@@ -14,10 +15,13 @@ export const metadata: Metadata = {
}
interface EmailLogPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function EmailLogPage(props: EmailLogPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
const search = SearchParamsEmailLogCache.parse(searchParams)
@@ -31,7 +35,7 @@ export default async function EmailLogPage(props: EmailLogPageProps) {
<div className="flex items-center justify-between space-y-2">
<div>
<div className="flex items-center gap-2">
- <h2 className="text-2xl font-bold tracking-tight">이메일 발신 이력 조회</h2>
+ <h2 className="text-2xl font-bold tracking-tight">{t('menu.information_system.email_log')}</h2>
</div>
</div>
</div>
diff --git a/app/[lng]/evcp/(evcp)/(system)/email-template/page.tsx b/app/[lng]/evcp/(evcp)/(system)/email-template/page.tsx
index 16c75dab..c4437994 100644
--- a/app/[lng]/evcp/(evcp)/(system)/email-template/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/email-template/page.tsx
@@ -15,6 +15,7 @@ import { Shell } from "@/components/shell"
import { getValidFilters } from "@/lib/data-table"
import { Skeleton } from "@/components/ui/skeleton"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: "템플릿 관리",
@@ -22,10 +23,14 @@ export const metadata: Metadata = {
}
interface TemplatePageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function TemplatePage(props: TemplatePageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
+
const searchParams = await props.searchParams
const search = SearchParamsEmailTemplateCache.parse(searchParams)
@@ -48,7 +53,7 @@ export default async function TemplatePage(props: TemplatePageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 이메일 템플릿 관리
+ {t('menu.information_system.email_template')}
</h2>
{/* <InformationButton pagePath="evcp/equip-class" /> */}
</div>
@@ -73,4 +78,4 @@ export default async function TemplatePage(props: TemplatePageProps) {
</React.Suspense>
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/email-whitelist/page.tsx b/app/[lng]/evcp/(evcp)/(system)/email-whitelist/page.tsx
index 95abd556..2613ce65 100644
--- a/app/[lng]/evcp/(evcp)/(system)/email-whitelist/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/email-whitelist/page.tsx
@@ -17,6 +17,7 @@ import { WhitelistTable } from "@/lib/email-whitelist/table/whitelist-table"
import { Shell } from "@/components/shell"
import { Skeleton } from "@/components/ui/skeleton"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
+import { useTranslation } from "@/i18n"
// export const metadata: Metadata = {
// title: "이메일 화이트리스트 관리",
@@ -24,11 +25,13 @@ import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
// }
interface WhitelistPageProps {
+ params: Promise<{ lng: string }>
searchParams: SearchParams
}
export default async function WhitelistPage(props: WhitelistPageProps) {
-
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
// 기본 검색 파라미터 처리
@@ -52,7 +55,7 @@ export default async function WhitelistPage(props: WhitelistPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 이메일 화이트리스트 관리
+ {t('menu.information_system.email_whitelist')}
</h2>
</div>
<p className="text-muted-foreground">
@@ -79,4 +82,4 @@ export default async function WhitelistPage(props: WhitelistPageProps) {
</React.Suspense>
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/information/page.tsx b/app/[lng]/evcp/(evcp)/(system)/information/page.tsx
index 8a6d348b..ff8c7024 100644
--- a/app/[lng]/evcp/(evcp)/(system)/information/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/information/page.tsx
@@ -39,7 +39,7 @@ export default async function InformationPage({ params }: InformationPageProps)
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 안내사항 관리
+ {t('menu.information_system.information')}
</h2>
<InformationButton pagePath="/evcp/information" />
</div>
@@ -49,4 +49,4 @@ export default async function InformationPage({ params }: InformationPageProps)
<InformationClient initialData={translatedData} />
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/integration-log/page.tsx b/app/[lng]/evcp/(evcp)/(system)/integration-log/page.tsx
index c10a41ea..75796b98 100644
--- a/app/[lng]/evcp/(evcp)/(system)/integration-log/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/integration-log/page.tsx
@@ -7,12 +7,16 @@ import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton";
import { SearchParamsCache } from "@/lib/integration-log/validations";
import { getIntegrationLogs } from "@/lib/integration-log/service";
import { IntegrationLogTable } from "@/lib/integration-log/table/integration-log-table";
+import { useTranslation } from "@/i18n";
interface IntegrationLogPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>;
}
export default async function IntegrationLogPage(props: IntegrationLogPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams;
const search = SearchParamsCache.parse(searchParams);
const validFilters = getValidFilters(search.filters);
@@ -28,10 +32,9 @@ export default async function IntegrationLogPage(props: IntegrationLogPageProps)
<Shell className="gap-2">
<div className="flex items-center justify-between space-y-2">
<div>
- <h2 className="text-2xl font-bold tracking-tight">인터페이스 이력 조회</h2>
- <p className="text-muted-foreground">
- 인터페이스 실행 이력을 조회합니다. 검색, 필터링, 정렬이 가능합니다.
- </p>
+ <h2 className="text-2xl font-bold tracking-tight">
+ {t('menu.information_system.integration_log')}
+ </h2>
</div>
</div>
<React.Suspense fallback={<Skeleton className="h-7 w-52" />}></React.Suspense>
@@ -50,4 +53,4 @@ export default async function IntegrationLogPage(props: IntegrationLogPageProps)
</React.Suspense>
</Shell>
);
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/integration/page.tsx b/app/[lng]/evcp/(evcp)/(system)/integration/page.tsx
index f2266bca..6aeaf041 100644
--- a/app/[lng]/evcp/(evcp)/(system)/integration/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/integration/page.tsx
@@ -7,12 +7,16 @@ import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton";
import { SearchParamsCache } from "@/lib/integration/validations";
import { getIntegrations } from "@/lib/integration/service";
import { IntegrationTable } from "@/lib/integration/table/integration-table";
+import { useTranslation } from "@/i18n";
interface IndexPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>;
}
export default async function IndexPage(props: IndexPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams;
const search = SearchParamsCache.parse(searchParams);
const validFilters = getValidFilters(search.filters);
@@ -28,10 +32,9 @@ export default async function IndexPage(props: IndexPageProps) {
<Shell className="gap-2">
<div className="flex items-center justify-between space-y-2">
<div>
- <h2 className="text-2xl font-bold tracking-tight">인터페이스 관리</h2>
- <p className="text-muted-foreground">
- 시스템 인터페이스를 등록, 수정, 삭제할 수 있습니다.
- </p>
+ <h2 className="text-2xl font-bold tracking-tight">
+ {t('menu.information_system.integration_list')}
+ </h2>
</div>
</div>
<React.Suspense fallback={<Skeleton className="h-7 w-52" />}></React.Suspense>
@@ -50,4 +53,4 @@ export default async function IndexPage(props: IndexPageProps) {
</React.Suspense>
</Shell>
);
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/login-history/page.tsx b/app/[lng]/evcp/(evcp)/(system)/login-history/page.tsx
index dbc8089f..3c3d9255 100644
--- a/app/[lng]/evcp/(evcp)/(system)/login-history/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/login-history/page.tsx
@@ -9,12 +9,16 @@ import { Shell } from "@/components/shell"
import { getLoginSessions } from "@/lib/login-session/service"
import { searchParamsCache } from "@/lib/login-session/validation"
import { LoginSessionsTable } from "@/lib/login-session/table/login-sessions-table"
+import { useTranslation } from "@/i18n"
interface LoginHistoryPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function LoginHistoryPage(props: LoginHistoryPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
const search = searchParamsCache.parse(searchParams)
@@ -34,7 +38,7 @@ export default async function LoginHistoryPage(props: LoginHistoryPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 로그인 세션 이력
+ {t('menu.information_system.login_history')}
</h2>
</div>
{/* <p className="text-muted-foreground">
@@ -63,4 +67,4 @@ export default async function LoginHistoryPage(props: LoginHistoryPageProps) {
</React.Suspense>
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/menu-access-dept/page.tsx b/app/[lng]/evcp/(evcp)/(system)/menu-access-dept/page.tsx
index dfda9172..25c27ada 100644
--- a/app/[lng]/evcp/(evcp)/(system)/menu-access-dept/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/menu-access-dept/page.tsx
@@ -3,8 +3,16 @@ import { Separator } from "@/components/ui/separator";
import { Shell } from "@/components/shell";
import { DepartmentMenuAccessManager } from "./_components/department-menu-access-manager";
import { getAllDepartmentsTree, getCurrentCompanyInfo } from "@/lib/users/knox-service";
+import { useTranslation } from "@/i18n";
+
+interface menuAccessDeptPageProps {
+ params: Promise<{ lng: string }>
+}
+
+export default async function DepartmentMenuAccessPage({ params }: menuAccessDeptPageProps) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
-export default async function DepartmentMenuAccessPage() {
// Promise들을 생성하여 클라이언트 컴포넌트에 전달
const departmentsPromise = getAllDepartmentsTree();
const companyInfo = await getCurrentCompanyInfo();
@@ -14,11 +22,13 @@ export default async function DepartmentMenuAccessPage() {
<div className="space-y-6">
{/* 헤더 섹션 */}
<div className="space-y-2">
- <h1 className="text-2xl font-bold tracking-tight">부서별 메뉴 접근권한 관리</h1>
- <p className="text-muted-foreground">
- Knox 조직도를 기반으로 부서별 도메인을 할당하여 메뉴 접근 권한을 관리할 수 있습니다.
- 상위 부서를 선택하면 하위 부서들도 자동으로 포함됩니다.
- </p>
+ <h1 className="text-2xl font-bold tracking-tight">
+ {t('menu.information_system.menu_access_dept')}
+ </h1>
+ {/* <p className="text-muted-foreground"> */}
+ {/* Knox 조직도를 기반으로 부서별 도메인을 할당하여 메뉴 접근 권한을 관리할 수 있습니다. */}
+ {/* 상위 부서를 선택하면 하위 부서들도 자동으로 포함됩니다. */}
+ {/* </p> */}
</div>
<Separator />
diff --git a/app/[lng]/evcp/(evcp)/(system)/menu-access/page.tsx b/app/[lng]/evcp/(evcp)/(system)/menu-access/page.tsx
index 7f5228df..4fa712f1 100644
--- a/app/[lng]/evcp/(evcp)/(system)/menu-access/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/menu-access/page.tsx
@@ -8,11 +8,15 @@ import { searchParamsUsersCache } from "@/lib/admin-users/validations"
import { getUsersNotPartners } from "@/lib/users/service";
import { UserAccessControlTable } from "@/lib/users/access-control/users-table";
import { InformationButton } from "@/components/information/information-button";
+import { useTranslation } from "@/i18n";
interface IndexPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>;
}
export default async function IndexPage(props: IndexPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams;
const search = searchParamsUsersCache.parse(searchParams);
const validFilters = getValidFilters(search.filters);
@@ -29,7 +33,9 @@ export default async function IndexPage(props: IndexPageProps) {
<div className="flex items-center justify-between space-y-2">
<div>
<div className="flex items-center gap-2">
- <h2 className="text-2xl font-bold tracking-tight">메뉴 접근제어 관리</h2>
+ <h2 className="text-2xl font-bold tracking-tight">
+ {t('menu.information_system.menu_access')}
+ </h2>
<InformationButton pagePath="evcp/menu-access" />
</div>
{/* <p className="text-muted-foreground">
@@ -53,4 +59,4 @@ export default async function IndexPage(props: IndexPageProps) {
</React.Suspense>
</Shell>
);
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/menu-list/page.tsx b/app/[lng]/evcp/(evcp)/(system)/menu-list/page.tsx
index 5a1f71a5..2cff434e 100644
--- a/app/[lng]/evcp/(evcp)/(system)/menu-list/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/menu-list/page.tsx
@@ -1,9 +1,7 @@
// app/evcp/menu-list/page.tsx
import { Suspense } from "react";
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
-import { Button } from "@/components/ui/button";
-import { RefreshCw, Settings } from "lucide-react";
+import { Card, CardContent } from "@/components/ui/card";
import { getActiveUsers, getMenuAssignments } from "@/lib/menu-list/servcie";
import { InitializeButton } from "@/lib/menu-list/table/initialize-button";
import { MenuListTable } from "@/lib/menu-list/table/menu-list-table";
@@ -42,7 +40,7 @@ export default async function MenuListPage({ params }: MenuListPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 메뉴 관리
+ {t('menu.information_system.menu_list')}
</h2>
<InformationButton pagePath="evcp/menu-list" />
</div>
@@ -61,21 +59,7 @@ export default async function MenuListPage({ params }: MenuListPageProps) {
}
>
<Card>
- <CardHeader>
- <CardTitle className="flex items-center gap-2">
- <Settings className="h-5 w-5" />
- 메뉴 리스트
- </CardTitle>
- <CardDescription>
- 시스템의 모든 메뉴와 담당자 정보를 확인할 수 있습니다.
- {menusResult.data?.length > 0 && (
- <span className="ml-2 text-sm">
- 총 {menusResult.data.length}개의 메뉴
- </span>
- )}
- </CardDescription>
- </CardHeader>
- <CardContent>
+ <CardContent className="pt-6">
<Suspense fallback={<div className="text-center py-8">로딩 중...</div>}>
<MenuListTable
initialMenus={translatedMenus}
@@ -88,4 +72,4 @@ export default async function MenuListPage({ params }: MenuListPageProps) {
</Shell>
);
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/notice/page.tsx b/app/[lng]/evcp/(evcp)/(system)/notice/page.tsx
index a4157d1b..ab01edfa 100644
--- a/app/[lng]/evcp/(evcp)/(system)/notice/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/notice/page.tsx
@@ -7,13 +7,21 @@ import { NoticeClient } from "@/components/notice/notice-client"
import { InformationButton } from "@/components/information/information-button"
import { getNoticeLists } from "@/lib/notice/service"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
+import { useTranslation } from "@/i18n"
export const metadata: Metadata = {
title: "공지사항 관리",
description: "페이지별 공지사항을 관리합니다.",
}
-export default async function NoticePage() {
+interface noticePageProps {
+ params: Promise<{ lng: string }>
+}
+
+export default async function NoticePage({ params }: noticePageProps) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
+
noStore()
// 세션에서 사용자 ID 가져오기
@@ -47,7 +55,7 @@ export default async function NoticePage() {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 공지사항 관리
+ {t('menu.information_system.notice')}
</h2>
<InformationButton pagePath="evcp/notice" />
</div>
@@ -57,4 +65,4 @@ export default async function NoticePage() {
<NoticeClient initialData={initialData?.data || []} currentUserId={currentUserId} />
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/(system)/page-visits/page.tsx b/app/[lng]/evcp/(evcp)/(system)/page-visits/page.tsx
index 07275cad..6b8e4a2a 100644
--- a/app/[lng]/evcp/(evcp)/(system)/page-visits/page.tsx
+++ b/app/[lng]/evcp/(evcp)/(system)/page-visits/page.tsx
@@ -8,12 +8,16 @@ import { Shell } from "@/components/shell"
import { getPageVisits } from "@/lib/page-visits/service"
import { searchParamsCache } from "@/lib/page-visits/validation"
import { PageVisitsTable } from "@/lib/page-visits/table/page-visits-table"
+import { useTranslation } from "@/i18n"
interface PageVisitsPageProps {
+ params: Promise<{ lng: string }>
searchParams: Promise<SearchParams>
}
export default async function PageVisitsPage(props: PageVisitsPageProps) {
+ const { lng } = await props.params
+ const { t } = await useTranslation(lng, 'menu')
const searchParams = await props.searchParams
const search = searchParamsCache.parse(searchParams)
@@ -33,7 +37,7 @@ export default async function PageVisitsPage(props: PageVisitsPageProps) {
<div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 페이지 방문 이력
+ {t('menu.information_system.page_visits')}
</h2>
</div>
{/* <p className="text-muted-foreground">
@@ -58,4 +62,4 @@ export default async function PageVisitsPage(props: PageVisitsPageProps) {
</React.Suspense>
</Shell>
)
-} \ No newline at end of file
+}
diff --git a/app/[lng]/evcp/(evcp)/edp-progress/page.tsx b/app/[lng]/evcp/(evcp)/edp-progress/page.tsx
index fe040709..9464c037 100644
--- a/app/[lng]/evcp/(evcp)/edp-progress/page.tsx
+++ b/app/[lng]/evcp/(evcp)/edp-progress/page.tsx
@@ -4,15 +4,21 @@ import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
import { Shell } from "@/components/shell"
import { InformationButton } from "@/components/information/information-button"
import { VendorFormStatusTable } from "@/components/form-data-stat/form-data-stat-table"
+import { useTranslation } from "@/i18n"
+interface edpProgressPageProps {
+ params: Promise<{ lng: string }>
+}
-export default async function IndexPage() {
+export default async function IndexPage({ params: edpProgressPageProps }) {
+ const { lng } = await params
+ const { t } = await useTranslation(lng, 'menu')
return (
<Shell className="gap-2">
<div className="flex items-center justify-between space-y-2">
<div className="flex items-center gap-2">
- <h2 className="text-2xl font-bold tracking-tight">벤더 데이터 진척도 현황</h2>
+ <h2 className="text-2xl font-bold tracking-tight">{t('menu.engineering_management.vendor_progress')}</h2>
<InformationButton pagePath="evcp/edp-progress" />
</div>
</div>
diff --git a/components/information/information-button.tsx b/components/information/information-button.tsx
index e03fffd9..744b0867 100644
--- a/components/information/information-button.tsx
+++ b/components/information/information-button.tsx
@@ -589,4 +589,4 @@ export function InformationButton({
/> */}
</>
)
-} \ No newline at end of file
+}