From c54a2445b6285d06c0ce3afa1cd3aa6aecf6de94 Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Mon, 24 Nov 2025 20:13:50 +0900 Subject: (김준회) dolce rebuild: i18n 지원 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(partners)/dolce-upload/dolce-upload-page.tsx | 110 +++++++++++---------- .../partners/(partners)/dolce-upload/page.tsx | 15 ++- 2 files changed, 71 insertions(+), 54 deletions(-) (limited to 'app') diff --git a/app/[lng]/partners/(partners)/dolce-upload/dolce-upload-page.tsx b/app/[lng]/partners/(partners)/dolce-upload/dolce-upload-page.tsx index db8d528b..43800838 100644 --- a/app/[lng]/partners/(partners)/dolce-upload/dolce-upload-page.tsx +++ b/app/[lng]/partners/(partners)/dolce-upload/dolce-upload-page.tsx @@ -1,6 +1,7 @@ "use client"; import { useState, useEffect, useCallback, useMemo } from "react"; +import { useParams } from "next/navigation"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Skeleton } from "@/components/ui/skeleton"; @@ -16,6 +17,7 @@ import { } from "@/components/ui/select"; import { InfoIcon, RefreshCw, Search, Upload } from "lucide-react"; import { toast } from "sonner"; +import { useTranslation } from "@/i18n/client"; import { UnifiedDwgReceiptItem, fetchDwgReceiptList, @@ -33,6 +35,10 @@ interface DolceUploadPageProps { } export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) { + const params = useParams(); + const lng = params?.lng as string; + const { t } = useTranslation(lng, "dolce"); + // URL에서 초기 프로젝트 코드 const initialProjNo = (searchParams.projNo as string) || ""; @@ -78,7 +84,7 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) fetchVendorProjects(), ]); - setVendorInfo(vendorInfoData); + setVendorInfo(vendorInfoData as typeof vendorInfo); setProjects(projectsData); // 초기 프로젝트가 있으면 도면 로드 @@ -92,12 +98,12 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) } } catch (err) { console.error("초기 데이터 로드 실패:", err); - setError(err instanceof Error ? err.message : "데이터 로드 실패"); - toast.error("데이터 로드 실패"); + setError(err instanceof Error ? err.message : t("page.initialLoadError")); + toast.error(t("page.initialLoadError")); } finally { setIsLoading(false); } - }, [initialProjNo]); + }, [initialProjNo, t]); // 도면 목록 조회 const loadDrawings = useCallback(async () => { @@ -114,21 +120,28 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) }); setDrawings(drawingsData); - toast.success("도면 목록을 갱신했습니다"); + toast.success(t("page.drawingLoadSuccess")); } catch (err) { console.error("도면 로드 실패:", err); - setError(err instanceof Error ? err.message : "도면 로드 실패"); - toast.error("도면 로드 실패"); + setError(err instanceof Error ? err.message : t("page.drawingLoadError")); + toast.error(t("page.drawingLoadError")); } finally { setIsRefreshing(false); } - }, [projNo, vendorInfo]); + }, [projNo, vendorInfo, t]); // 초기 데이터 로드 useEffect(() => { loadInitialData(); }, [loadInitialData]); + // 프로젝트 변경 시 자동 검색 + useEffect(() => { + if (projNo && vendorInfo) { + loadDrawings(); + } + }, [projNo, vendorInfo, loadDrawings]); + // 도면 클릭 핸들러 const handleDrawingClick = (drawing: UnifiedDwgReceiptItem) => { setSelectedDrawing(drawing); @@ -227,7 +240,7 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) - 프로젝트를 선택하여 도면 목록을 조회하세요. + {t("page.selectProject")} )} @@ -235,16 +248,16 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) {/* 필터 카드 */} - 검색 필터 + {t("filter.title")}
{/* 프로젝트 선택 */}
- + setDrawingNo(e.target.value)} - placeholder="도면번호 입력" + placeholder={t("filter.drawingNoPlaceholder")} />
{/* 도면명 검색 */}
- + setDrawingName(e.target.value)} - placeholder="도면명 입력" + placeholder={t("filter.drawingNamePlaceholder")} />
{/* 설계공종 검색 */}
- + setDiscipline(e.target.value)} - placeholder="설계공종 입력" + placeholder={t("filter.disciplinePlaceholder")} />
{/* 담당자명 검색 (클라이언트 필터) */}
- + setManager(e.target.value)} - placeholder="담당자명 입력" + placeholder={t("filter.managerPlaceholder")} />
{/* B4(GTT) 전용: Document Type 필터 */} {vendorInfo?.drawingKind === "B4" && (
- +
)}
-
+
- {/* B4 벤더인 경우에만 일괄 업로드 버튼 표시 */} {vendorInfo?.drawingKind === "B4" && ( @@ -338,9 +343,16 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) disabled={!projNo || isRefreshing} > - 일괄 업로드 + {t("filter.bulkUploadButton")} )} +
@@ -350,24 +362,20 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) - 도면 리스트 - {filteredDrawings.length > 0 && ` (${filteredDrawings.length}건)`} + {t("drawingList.title")} + {filteredDrawings.length > 0 && ` ${t("drawingList.count", { count: filteredDrawings.length })}`} - {vendorInfo.drawingKind === "B4" ? ( - - ) : ( - - )} + )} @@ -383,6 +391,7 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) userName={vendorInfo.userName} userEmail={vendorInfo.email} drawingKind={vendorInfo.drawingKind} + lng={lng} /> )} @@ -397,6 +406,7 @@ export default function DolceUploadPage({ searchParams }: DolceUploadPageProps) userEmail={vendorInfo.email} vendorCode={vendorInfo.vendorCode} onUploadComplete={handleBulkUploadComplete} + lng={lng} /> )}
diff --git a/app/[lng]/partners/(partners)/dolce-upload/page.tsx b/app/[lng]/partners/(partners)/dolce-upload/page.tsx index 97582819..4d7b1a74 100644 --- a/app/[lng]/partners/(partners)/dolce-upload/page.tsx +++ b/app/[lng]/partners/(partners)/dolce-upload/page.tsx @@ -31,11 +31,14 @@ function DolceUploadSkeleton() { } export default async function DolceUploadPageWrapper({ + params, searchParams, }: { + params: Promise<{ lng: string }>; searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { - const params = await searchParams; + const { lng } = await params; + const resolvedParams = await searchParams; return ( @@ -43,17 +46,21 @@ export default async function DolceUploadPageWrapper({

- DOLCE 문서 업로드 + {lng === "ko" + ? "DOLCE 도면 업로드" + : "DOLCE Drawing Upload"}

- 설계문서를 조회하고 업로드할 수 있습니다 + {lng === "ko" + ? "설계문서를 조회하고 업로드할 수 있습니다" + : "View and upload design documents"}

{/* 메인 컨텐츠 */} }> - +
); -- cgit v1.2.3