- Contract Number
+ {t('contracts.contractNumber')}
{contract.contract_number}
@@ -155,7 +157,7 @@ export default function ContractDetailsPage() {
{contract.contract_name && (
- Contract Name
+ {t('contracts.contractName')}
{contract.contract_name}
@@ -165,7 +167,7 @@ export default function ContractDetailsPage() {
{contract.customer_contract_number && (
- Customer Contract Number
+ {t('contracts.customerContractNumber')}
{contract.customer_contract_number}
@@ -175,7 +177,7 @@ export default function ContractDetailsPage() {
{contract.customer && (
- Customer
+ {t('contracts.customer')}
{contract.customer}
@@ -185,7 +187,7 @@ export default function ContractDetailsPage() {
{contract.investor && (
- Investor
+ {t('contracts.investor')}
{contract.investor}
@@ -195,7 +197,7 @@ export default function ContractDetailsPage() {
{contract.date_signed && (
- Date Signed
+ {t('contracts.dateSigned')}
{formatDate(contract.date_signed)}
@@ -205,7 +207,7 @@ export default function ContractDetailsPage() {
{contract.finish_date && (
- Finish Date
+ {t('contracts.finishDate')}
{formatDate(contract.finish_date)}
@@ -221,22 +223,22 @@ export default function ContractDetailsPage() {
- Summary
+ {t('contracts.summary')}
- Projects Count
+ {t('contracts.projectsCount')}
- {projects.length} Projects
+ {projects.length} {t('contracts.projects')}
{contract.finish_date && (
- Contract Status
+ {t('contracts.contractStatus')}
{new Date(contract.finish_date) > new Date()
- ? "Active"
- : "Expired"}
+ ? t('contracts.active')
+ : t('contracts.expired')}
)}
@@ -262,7 +264,7 @@ export default function ContractDetailsPage() {
- Contract Documents ({attachments.length})
+ {t('contracts.contractDocuments')} ({attachments.length})
- Upload Document
+ {t('contracts.uploadDocument')}
@@ -300,7 +302,7 @@ export default function ContractDetailsPage() {
- Associated Projects ({projects.length})
+ {t('contracts.associatedProjects')} ({projects.length})
@@ -339,13 +341,13 @@ export default function ContractDetailsPage() {
- No projects yet
+ {t('contracts.noProjectsYet')}
- Get started by creating your first project for this contract
+ {t('contracts.getStartedMessage')}
-
+
) : (
@@ -411,22 +413,22 @@ export default function ContractDetailsPage() {
size="sm"
>
{project.project_status === "registered"
- ? "Registered"
+ ? t('projectStatus.registered')
: project.project_status === "in_progress_design"
- ? "In Progress (Design)"
+ ? t('projectStatus.in_progress_design')
: project.project_status ===
"in_progress_construction"
- ? "In Progress (Construction)"
+ ? t('projectStatus.in_progress_construction')
: project.project_status === "fulfilled"
- ? "Completed"
- : "Unknown"}
+ ? t('projectStatus.fulfilled')
+ : t('projectStatus.unknown')}
diff --git a/src/app/contracts/new/page.js b/src/app/contracts/new/page.js
index ffa0503..2240140 100644
--- a/src/app/contracts/new/page.js
+++ b/src/app/contracts/new/page.js
@@ -1,15 +1,19 @@
+"use client";
+
import ContractForm from "@/components/ContractForm";
import PageContainer from "@/components/ui/PageContainer";
import PageHeader from "@/components/ui/PageHeader";
import Button from "@/components/ui/Button";
import Link from "next/link";
+import { useTranslation } from "@/lib/i18n";
export default function NewContractPage() {
+ const { t } = useTranslation();
return (
}
diff --git a/src/components/ContractForm.js b/src/components/ContractForm.js
index bf4eee6..c21cece 100644
--- a/src/components/ContractForm.js
+++ b/src/components/ContractForm.js
@@ -6,8 +6,10 @@ import { Card, CardHeader, CardContent } from "@/components/ui/Card";
import Button from "@/components/ui/Button";
import { Input } from "@/components/ui/Input";
import { formatDateForInput } from "@/lib/utils";
+import { useTranslation } from "@/lib/i18n";
export default function ContractForm() {
+ const { t } = useTranslation();
const [form, setForm] = useState({
contract_number: "",
contract_name: "",
@@ -42,13 +44,11 @@ export default function ContractForm() {
const contract = await res.json();
router.push(`/contracts/${contract.contract_id}`);
} else {
- alert(
- "Failed to create contract. Please check the data and try again."
- );
+ alert(t('contracts.failedToCreateContract'));
}
} catch (error) {
console.error("Error creating contract:", error);
- alert("Failed to create contract. Please try again.");
+ alert(t('contracts.failedToCreateContract'));
} finally {
setLoading(false);
}
@@ -58,7 +58,7 @@ export default function ContractForm() {
- Contract Details
+ {t('contracts.contractDetails')}
@@ -67,73 +67,73 @@ export default function ContractForm() {
{" "}
{" "}
router.back()}
disabled={loading}
>
- Cancel
+ {t('common.cancel')}
diff --git a/src/components/FileAttachmentsList.js b/src/components/FileAttachmentsList.js
index 46bfac9..eaf5177 100644
--- a/src/components/FileAttachmentsList.js
+++ b/src/components/FileAttachmentsList.js
@@ -3,10 +3,12 @@
import { useState, useEffect } from "react";
import Button from "@/components/ui/Button";
import { formatDate } from "@/lib/utils";
+import { useTranslation } from "@/lib/i18n";
export default function FileAttachmentsList({ entityType, entityId, onFilesChange }) {
const [files, setFiles] = useState([]);
const [loading, setLoading] = useState(true);
+ const { t } = useTranslation();
const fetchFiles = async () => {
try {
@@ -30,7 +32,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang
}, [entityType, entityId]);
const handleDelete = async (fileId) => {
- if (!confirm("Are you sure you want to delete this file?")) {
+ if (!confirm(t('contracts.confirmDeleteFile'))) {
return;
}
@@ -45,11 +47,11 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang
onFilesChange(files.filter(file => file.file_id !== fileId));
}
} else {
- alert("Failed to delete file");
+ alert(t('contracts.failedToDeleteFile'));
}
} catch (error) {
console.error("Error deleting file:", error);
- alert("Failed to delete file");
+ alert(t('contracts.failedToDeleteFile'));
}
};
@@ -102,7 +104,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang
-
Loading files...
+
{t('contracts.loadingFiles')}
);
}
@@ -113,7 +115,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang
-
No documents uploaded yet
+
{t('contracts.noDocumentsUploaded')}
);
}
@@ -156,7 +158,7 @@ export default function FileAttachmentsList({ entityType, entityId, onFilesChang
- Download
+ {t('contracts.download')}
diff --git a/src/lib/i18n.js b/src/lib/i18n.js
index f0940cc..e63ab32 100644
--- a/src/lib/i18n.js
+++ b/src/lib/i18n.js
@@ -198,6 +198,7 @@ const translations = {
contracts: {
title: "Umowy",
subtitle: "---",
+ contract: "Umowa",
newContract: "Nowa umowa",
editContract: "Edytuj umowę",
deleteContract: "Usuń umowę",
@@ -226,7 +227,50 @@ const translations = {
signedOn: "Zawarcie:",
finishOn: "Zakończenie:",
customerLabel: "Zleceniodawca:",
- investorLabel: "Inwestor:"
+ investorLabel: "Inwestor:",
+ loadingContractDetails: "Ładowanie szczegółów umowy...",
+ contractNotFound: "Umowa nie została znaleziona.",
+ backToContracts: "Powrót do umów",
+ addProject: "Dodaj projekt",
+ contractInformation: "Informacje o umowie",
+ contractNumber: "Numer umowy",
+ contractName: "Nazwa umowy",
+ customerContractNumber: "Numer umowy klienta",
+ customer: "Klient",
+ investor: "Inwestor",
+ dateSigned: "Data zawarcia",
+ finishDate: "Data zakończenia",
+ summary: "Podsumowanie",
+ projectsCount: "Liczba projektów",
+ projects: "projektów",
+ contractStatus: "Status umowy",
+ active: "Aktywna",
+ expired: "Przeterminowana",
+ contractDocuments: "Dokumenty umowy",
+ uploadDocument: "Prześlij dokument",
+ associatedProjects: "Powiązane projekty",
+ noProjectsYet: "Brak projektów",
+ getStartedMessage: "Rozpocznij od utworzenia pierwszego projektu dla tej umowy",
+ createFirstProject: "Utwórz pierwszy projekt",
+ viewDetails: "Zobacz szczegóły",
+ createNewContract: "Utwórz nową umowę",
+ addNewContractDescription: "Dodaj nową umowę do swojego portfolio",
+ contractDetails: "Szczegóły umowy",
+ failedToCreateContract: "Nie udało się utworzyć umowy. Sprawdź dane i spróbuj ponownie.",
+ // File upload translations
+ uploadDocumentTitle: "Prześlij dokument",
+ descriptionOptional: "Opis (opcjonalny)",
+ descriptionPlaceholder: "Krótki opis dokumentu...",
+ uploading: "Przesyłanie...",
+ dropFilesHere: "Upuść pliki tutaj lub kliknij, aby przeglądać",
+ supportedFiles: "PDF, DOC, XLS, Obrazy do 10MB",
+ chooseFile: "Wybierz plik",
+ failedToUploadFile: "Nie udało się przesłać pliku",
+ loadingFiles: "Ładowanie plików...",
+ noDocumentsUploaded: "Brak przesłanych dokumentów",
+ download: "Pobierz",
+ confirmDeleteFile: "Czy na pewno chcesz usunąć ten plik?",
+ failedToDeleteFile: "Nie udało się usunąć pliku"
},
// Tasks