diff options
| -rw-r--r-- | app/[lng]/partners/(partners)/basic-contract/page.tsx | 10 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/bid/page.tsx | 13 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/document-list-ship/page.tsx | 6 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/evaluation/page.tsx | 10 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/general-contract-review/page.tsx | 14 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/pcr/page.tsx | 14 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/po/page.tsx | 8 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/pq_new/page.tsx | 22 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/rfq-last/page.tsx | 12 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/swp-document-upload/page.tsx | 13 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/tbe-last/page.tsx | 8 |
11 files changed, 89 insertions, 41 deletions
diff --git a/app/[lng]/partners/(partners)/basic-contract/page.tsx b/app/[lng]/partners/(partners)/basic-contract/page.tsx index e2213c57..c651ee54 100644 --- a/app/[lng]/partners/(partners)/basic-contract/page.tsx +++ b/app/[lng]/partners/(partners)/basic-contract/page.tsx @@ -11,13 +11,15 @@ import { BasicContractsVendorTable } from "@/lib/basic-contract/vendor-table/bas import { getServerSession } from "next-auth"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
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 session = await getServerSession(authOptions)
const vendorId = session?.user.companyId
@@ -43,7 +45,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.vendor.procurement.basic_contract_sign')}
</h2>
<InformationButton pagePath="partners/basic-contract" />
</div>
@@ -77,4 +79,4 @@ export default async function IndexPage(props: IndexPageProps) { </React.Suspense>
</Shell>
)
-}
\ No newline at end of file +}
diff --git a/app/[lng]/partners/(partners)/bid/page.tsx b/app/[lng]/partners/(partners)/bid/page.tsx index a09dec72..87b52021 100644 --- a/app/[lng]/partners/(partners)/bid/page.tsx +++ b/app/[lng]/partners/(partners)/bid/page.tsx @@ -5,8 +5,15 @@ import { authOptions } from "@/app/api/auth/[...nextauth]/route" import { getBiddingListForPartners } from '@/lib/bidding/detail/service' import { Shell } from '@/components/shell' import { DataTableSkeleton } from '@/components/data-table/data-table-skeleton' +import { useTranslation } from "@/i18n" -export default async function PartnersBidPage() { +interface IndexPageProps { + params: Promise<{ lng: string }> +} + +export default async function PartnersBidPage({ params }: IndexPageProps) { + const { lng } = await params; + const { t } = await useTranslation(lng, 'menu') // 세션에서 companyId 가져오기 const session = await getServerSession(authOptions) const companyId = session?.user?.companyId @@ -31,9 +38,9 @@ export default async function PartnersBidPage() { <div className="container mx-auto py-6 space-y-6"> <div className="flex items-center justify-between"> <div> - <h1 className="text-3xl font-bold">입찰 참여</h1> + <h1 className="text-3xl font-bold">{t('menu.vendor.bidding.list')}</h1> <p className="text-muted-foreground mt-2"> - 참여 가능한 입찰 목록을 확인하고 응찰하실 수 있습니다. + {t('menu.vendor.bidding.list_desc')} </p> </div> </div> diff --git a/app/[lng]/partners/(partners)/document-list-ship/page.tsx b/app/[lng]/partners/(partners)/document-list-ship/page.tsx index 46800a77..d67e96df 100644 --- a/app/[lng]/partners/(partners)/document-list-ship/page.tsx +++ b/app/[lng]/partners/(partners)/document-list-ship/page.tsx @@ -3,6 +3,7 @@ import { Skeleton } from "@/components/ui/skeleton"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import DolceUploadPageV2 from "./dolce-upload-page-v2"; import { Shell } from "@/components/shell"; +import { useTranslation } from "@/i18n" // ============================================================================ // 로딩 스켈레톤 @@ -39,6 +40,7 @@ export default async function DolceUploadPageWrapper({ searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const { lng } = await params; + const { t } = await useTranslation(lng, 'menu') const resolvedParams = await searchParams; return ( @@ -47,9 +49,7 @@ export default async function DolceUploadPageWrapper({ <div className="flex items-center justify-between flex-shrink-0"> <div> <h2 className="text-2xl font-bold tracking-tight"> - {lng === "ko" - ? "조선 도면 업로드" - : "Shipbuilding Drawing Upload"} + {t('menu.vendor.engineering.document_list_ship')} </h2> </div> </div> diff --git a/app/[lng]/partners/(partners)/evaluation/page.tsx b/app/[lng]/partners/(partners)/evaluation/page.tsx index be88ef3e..3680a826 100644 --- a/app/[lng]/partners/(partners)/evaluation/page.tsx +++ b/app/[lng]/partners/(partners)/evaluation/page.tsx @@ -13,11 +13,15 @@ import { getEvaluationSubmissions } from "@/lib/vendor-evaluation-submit/service import { getEvaluationsSubmitSchema } from "@/lib/vendor-evaluation-submit/validation" import { EvaluationSubmissionsTable } from "@/lib/vendor-evaluation-submit/table/submit-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 = getEvaluationsSubmitSchema.parse(searchParams) const validFilters = getValidFilters(search.filters) @@ -34,7 +38,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.vendor.procurement.evaluation_input')} </h2> <InformationButton pagePath="partners/evaluation" /> </div> @@ -105,7 +109,7 @@ export default async function IndexPage(props: IndexPageProps) { <div className="flex items-center justify-between space-y-2"> <div> <h2 className="text-2xl font-bold tracking-tight"> - 평가자료 입력 + {t('menu.vendor.procurement.evaluation_input')} </h2> {/* <p className="text-muted-foreground"> 요청된 정기평가를 입력하고 제출할 수 있습니다. @@ -133,4 +137,4 @@ export default async function IndexPage(props: IndexPageProps) { </React.Suspense> </Shell> ) -}
\ No newline at end of file +} diff --git a/app/[lng]/partners/(partners)/general-contract-review/page.tsx b/app/[lng]/partners/(partners)/general-contract-review/page.tsx index 27afd859..5af40906 100644 --- a/app/[lng]/partners/(partners)/general-contract-review/page.tsx +++ b/app/[lng]/partners/(partners)/general-contract-review/page.tsx @@ -6,10 +6,16 @@ import { getVendorContractReviews } from "@/lib/general-contracts/service" import { VendorGeneralContractReviewTable } from "./vendor-general-contract-review-table"
import { InformationButton } from "@/components/information/information-button"
import { unstable_noStore as noStore } from 'next/cache'
+import { useTranslation } from "@/i18n"
-export default async function VendorGeneralContractReviewPage() {
+interface pageProps {
+ params: { lng: string }
+}
+
+export default async function VendorGeneralContractReviewPage({ params }: pageProps) {
noStore()
-
+ const { lng } = await params;
+ const { t } = await useTranslation(lng, 'menu')
const session = await getServerSession(authOptions)
if (!session?.user?.companyId) {
@@ -31,12 +37,12 @@ export default async function VendorGeneralContractReviewPage() { <div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- 일반계약 조건검토
+ {t('menu.vendor.procurement.general_contract_review')}
</h2>
<InformationButton pagePath="partners/general-contract-review" />
</div>
<p className="text-muted-foreground">
- 조건검토 요청된 계약 목록을 확인하고 검토합니다.
+ {t('menu.vendor.procurement.general_contract_review_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/partners/(partners)/pcr/page.tsx b/app/[lng]/partners/(partners)/pcr/page.tsx index dc639aa8..7148aedd 100644 --- a/app/[lng]/partners/(partners)/pcr/page.tsx +++ b/app/[lng]/partners/(partners)/pcr/page.tsx @@ -5,7 +5,7 @@ import { redirect } from "next/navigation"; import { Shell } from "@/components/shell"
import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton"
import { InformationButton } from "@/components/information/information-button"
-
+import { useTranslation } from "@/i18n"
import { PcrTable } from "@/lib/pcr/table/pcr-table";
import { getPcrPoListForPartners } from "@/lib/pcr/service";
@@ -14,6 +14,10 @@ export const metadata = { description: "Purchase Change Request를 조회하고 관리할 수 있습니다.",
};
+interface pageProps {
+ params: { lng: string }
+}
+
async function PartnersPcrTableWrapper() {
// 세션에서 사용자 정보 확인
const session = await getServerSession(authOptions);
@@ -33,7 +37,9 @@ async function PartnersPcrTableWrapper() { return <PcrTable tableData={tableData} isEvcpPage={false} isPartnersPage={true} currentVendorId={vendorId} />;
}
-export default function PartnersPcrPage() {
+export default async function PartnersPcrPage({ params }: pageProps) {
+ const { lng } = await params;
+ const { t } = await useTranslation(lng, 'menu')
return (
<Shell className="gap-4">
{/* ═══════════════════════════════════════════════════════════════ */}
@@ -44,12 +50,12 @@ export default function PartnersPcrPage() { <div>
<div className="flex items-center gap-2">
<h2 className="text-2xl font-bold tracking-tight">
- PCR 관리
+ {t('menu.vendor.procurement.pcr')}
</h2>
<InformationButton pagePath="partners/pcr" />
</div>
<p className="text-muted-foreground">
- Purchase Change Request를 조회하고 관리할 수 있습니다. PCR 승인 상태, 변경 구분, PO/계약 정보 등을 확인할 수 있습니다.
+ {t('menu.vendor.procurement.pcr_desc')}
</p>
</div>
</div>
diff --git a/app/[lng]/partners/(partners)/po/page.tsx b/app/[lng]/partners/(partners)/po/page.tsx index 709b975c..a2ab2916 100644 --- a/app/[lng]/partners/(partners)/po/page.tsx +++ b/app/[lng]/partners/(partners)/po/page.tsx @@ -11,12 +11,16 @@ import { getVendorPOs } from "@/lib/po/vendor-table/service" import { vendorPoSearchParamsCache } from "@/lib/po/vendor-table/validations" import { VendorPoTable } from "@/lib/po/vendor-table/vendor-po-table" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" interface VendorPOPageProps { + params: Promise<{ lng: string }> searchParams: Promise<SearchParams> } export default async function VendorPO(props: VendorPOPageProps) { + const { lng } = await props.params; + const { t } = await useTranslation(lng, 'menu') const searchParams = await props.searchParams const search = vendorPoSearchParamsCache.parse(searchParams) @@ -47,7 +51,7 @@ export default async function VendorPO(props: VendorPOPageProps) { <div> <div className="flex items-center gap-2"> <h2 className="text-2xl font-bold tracking-tight"> - PO/계약 목록 + {t('menu.vendor.procurement.po')} </h2> <InformationButton pagePath="partners/po" /> </div> @@ -72,4 +76,4 @@ export default async function VendorPO(props: VendorPOPageProps) { </React.Suspense> </Shell> ) -}
\ No newline at end of file +} diff --git a/app/[lng]/partners/(partners)/pq_new/page.tsx b/app/[lng]/partners/(partners)/pq_new/page.tsx index eea5b21d..fb77ce0e 100644 --- a/app/[lng]/partners/(partners)/pq_new/page.tsx +++ b/app/[lng]/partners/(partners)/pq_new/page.tsx @@ -25,6 +25,11 @@ import { DropdownMenuContent, DropdownMenuItem, } from "@/components/ui/dropdown-menu"; +import { useTranslation } from "@/i18n" + +interface IndexPageProps { + params: Promise<{ lng: string }> +} export const metadata: Metadata = { title: "사전 평가 (PQ) 목록", @@ -60,10 +65,11 @@ function getFormattedDate(date: Date | null) { }).format(new Date(date)); } -export default async function PQListPage() { +export default async function PQListPage({ params }: IndexPageProps) { // 캐시 비활성화 noStore(); - + const { lng } = await params; + const { t } = await useTranslation(lng, 'menu') // 인증 확인 const session = await getServerSession(authOptions); @@ -74,10 +80,10 @@ export default async function PQListPage() { <div className="flex items-center justify-between"> <div> <h2 className="text-2xl font-bold tracking-tight"> - 사전 평가 (PQ) 목록 + {t('menu.vendor.procurement.pq_new')} </h2> <p className="text-muted-foreground"> - 요청된 사전 평가 목록을 확인하고 작성합니다. + {t('menu.vendor.procurement.pq_new_desc')} </p> </div> </div> @@ -139,11 +145,13 @@ export default async function PQListPage() { <div className="flex justify-between items-center"> <div> <div className="flex items-center gap-2"> - <h2 className="text-2xl font-bold tracking-tight">사전 평가 (PQ) 목록</h2> + <h2 className="text-2xl font-bold tracking-tight"> + {t('menu.vendor.procurement.pq_new')} + </h2> <InformationButton pagePath="partners/pq_new" /> </div> <p className="text-muted-foreground"> - 요청된 사전 평가 목록을 확인하고 작성합니다. + {t('menu.vendor.procurement.pq_new_desc')} </p> </div> </div> @@ -295,4 +303,4 @@ export default async function PQListPage() { </Card> </Shell> ); -}
\ No newline at end of file +} diff --git a/app/[lng]/partners/(partners)/rfq-last/page.tsx b/app/[lng]/partners/(partners)/rfq-last/page.tsx index a49ed648..5a64d4b2 100644 --- a/app/[lng]/partners/(partners)/rfq-last/page.tsx +++ b/app/[lng]/partners/(partners)/rfq-last/page.tsx @@ -15,6 +15,7 @@ import { searchParamsVendorRfqCache } from "@/lib/rfq-last/vendor-response/valid import { InformationButton } from "@/components/information/information-button" import { getVendorQuotationsLast,getQuotationStatusCountsLast } from "@/lib/rfq-last/vendor-response/service"; import { VendorQuotationsTableLast } from "@/lib/rfq-last/vendor-response/vendor-quotations-table"; +import { useTranslation } from "@/i18n" export const metadata: Metadata = { title: "견적 목록", @@ -22,11 +23,14 @@ export const metadata: Metadata = { }; 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 = searchParamsVendorRfqCache.parse(searchParams) const validFilters = getValidFilters(search.filters) @@ -41,7 +45,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.vendor.procurement.rfq_response')} </h2> <InformationButton pagePath="partners/rfq-last" /> </div> @@ -112,9 +116,9 @@ export default async function IndexPage(props: IndexPageProps) { <Shell className="gap-6"> <div className="flex justify-between items-center"> <div> - <h2 className="text-2xl font-bold tracking-tight">견적 목록</h2> + <h2 className="text-2xl font-bold tracking-tight">{t('menu.vendor.procurement.rfq_response')}</h2> <p className="text-muted-foreground"> - 진행 중인 견적서 목록을 확인하고 관리합니다. + {t('menu.vendor.procurement.rfq_response_desc')} </p> </div> </div> @@ -190,4 +194,4 @@ export default async function IndexPage(props: IndexPageProps) { </React.Suspense> </Shell> ); -}
\ No newline at end of file +} diff --git a/app/[lng]/partners/(partners)/swp-document-upload/page.tsx b/app/[lng]/partners/(partners)/swp-document-upload/page.tsx index b97bc7fc..55073062 100644 --- a/app/[lng]/partners/(partners)/swp-document-upload/page.tsx +++ b/app/[lng]/partners/(partners)/swp-document-upload/page.tsx @@ -3,6 +3,7 @@ import { Skeleton } from "@/components/ui/skeleton"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import VendorDocumentPage from "./vendor-document-page"; import { Shell } from "@/components/shell"; +import { useTranslation } from "@/i18n" export const metadata = { title: "Document Search and Upload", @@ -31,11 +32,15 @@ function VendorDocumentSkeleton() { } export default async function DocumentUploadPage({ + params, searchParams, }: { + params: Promise<{ lng: string }> searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { - const params = await searchParams; + const { lng } = await params; + const { t } = await useTranslation(lng, 'menu') + const resolvedParams = await searchParams; return ( <Shell> @@ -43,15 +48,15 @@ export default async function DocumentUploadPage({ <div className="flex items-center justify-between"> <div> <h2 className="text-2xl font-bold tracking-tight"> - SWP Document Submission + {t('menu.vendor.engineering.document_submission')} </h2> </div> </div> {/* 메인 컨텐츠 */} <Suspense fallback={<VendorDocumentSkeleton />}> - <VendorDocumentPage searchParams={params} /> + <VendorDocumentPage searchParams={resolvedParams} /> </Suspense> </Shell> ); -}
\ No newline at end of file +} diff --git a/app/[lng]/partners/(partners)/tbe-last/page.tsx b/app/[lng]/partners/(partners)/tbe-last/page.tsx index 62a982c7..c8da944a 100644 --- a/app/[lng]/partners/(partners)/tbe-last/page.tsx +++ b/app/[lng]/partners/(partners)/tbe-last/page.tsx @@ -10,6 +10,8 @@ import { Skeleton } from "@/components/ui/skeleton" import { DataTableSkeleton } from "@/components/data-table/data-table-skeleton" import { Shell } from "@/components/shell" import { InformationButton } from "@/components/information/information-button" +import { useTranslation } from "@/i18n" + interface IndexPageProps { // Next.js 13 App Router에서 기본으로 주어지는 객체들 params: { @@ -20,8 +22,8 @@ interface IndexPageProps { } export default async function RfqTBEPage(props: IndexPageProps) { - const resolvedParams = await props.params - const lng = resolvedParams.lng + const { lng } = await props.params + const { t } = await useTranslation(lng, 'menu') // 2) SearchParams 파싱 (Zod) // - "filters", "page", "perPage", "sort" 등 contact 전용 컬럼 @@ -51,7 +53,7 @@ export default async function RfqTBEPage(props: IndexPageProps) { <div> <div className="flex items-center gap-2"> <h2 className="text-2xl font-bold tracking-tight"> - TBE 관리 + {t('menu.vendor.engineering.tbe')} </h2> <InformationButton pagePath="partners/tbe" /> </div> |
