diff --git a/client/src/components/ArtefactDetailPanel.jsx b/client/src/components/ArtefactDetailPanel.jsx
index a1f183d..b42b10e 100644
--- a/client/src/components/ArtefactDetailPanel.jsx
+++ b/client/src/components/ArtefactDetailPanel.jsx
@@ -65,7 +65,7 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
// New version modal
const [showNewVersionModal, setShowNewVersionModal] = useState(false)
const [newVersionNotes, setNewVersionNotes] = useState('')
- const [copyFromPrevious, setCopyFromPrevious] = useState(true)
+ const [copyFromPrevious, setCopyFromPrevious] = useState(false)
const [creatingVersion, setCreatingVersion] = useState(false)
// File upload (for design/video)
@@ -109,7 +109,7 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
}
} catch (err) {
console.error('Failed to load versions:', err)
- toast.error('Failed to load versions')
+ toast.error(t('artefacts.failedLoadVersions'))
} finally {
setLoading(false)
}
@@ -126,7 +126,7 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
setComments(commentsRes.data || commentsRes || [])
} catch (err) {
console.error('Failed to load version data:', err)
- toast.error('Failed to load version data')
+ toast.error(t('artefacts.failedLoadVersionData'))
}
}
@@ -143,15 +143,15 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
copy_from_previous: artefact.type === 'copy' ? copyFromPrevious : false,
})
- toast.success('New version created')
+ toast.success(t('artefacts.versionCreated'))
setShowNewVersionModal(false)
setNewVersionNotes('')
- setCopyFromPrevious(true)
+ setCopyFromPrevious(false)
loadVersions()
onUpdate()
} catch (err) {
console.error('Create version failed:', err)
- toast.error('Failed to create version')
+ toast.error(t('artefacts.failedCreateVersion'))
} finally {
setCreatingVersion(false)
}
@@ -159,20 +159,20 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const handleAddLanguage = async () => {
if (!languageForm.language_code || !languageForm.language_label || !languageForm.content) {
- toast.error('All fields are required')
+ toast.error(t('artefacts.allFieldsRequired'))
return
}
setSavingLanguage(true)
try {
await api.post(`/artefacts/${artefact.Id}/versions/${selectedVersion.Id}/texts`, languageForm)
- toast.success('Language added')
+ toast.success(t('artefacts.languageAdded'))
setShowLanguageModal(false)
setLanguageForm({ language_code: '', language_label: '', content: '' })
loadVersionData(selectedVersion.Id)
} catch (err) {
console.error('Add language failed:', err)
- toast.error('Failed to add language')
+ toast.error(t('artefacts.failedAddLanguage'))
} finally {
setSavingLanguage(false)
}
@@ -181,10 +181,10 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const handleDeleteLanguage = async (textId) => {
try {
await api.delete(`/artefact-version-texts/${textId}`)
- toast.success('Language deleted')
+ toast.success(t('artefacts.languageDeleted'))
loadVersionData(selectedVersion.Id)
} catch (err) {
- toast.error('Failed to delete language')
+ toast.error(t('artefacts.failedDeleteLanguage'))
}
}
@@ -197,11 +197,11 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const formData = new FormData()
formData.append('file', file)
await api.upload(`/artefacts/${artefact.Id}/versions/${selectedVersion.Id}/attachments`, formData)
- toast.success('File uploaded')
+ toast.success(t('artefacts.fileUploaded'))
loadVersionData(selectedVersion.Id)
} catch (err) {
console.error('Upload failed:', err)
- toast.error('Upload failed')
+ toast.error(t('artefacts.uploadFailed'))
} finally {
setUploading(false)
}
@@ -209,7 +209,7 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const handleAddDriveVideo = async () => {
if (!driveUrl.trim()) {
- toast.error('Please enter a Google Drive URL')
+ toast.error(t('artefacts.enterDriveUrl'))
return
}
@@ -218,13 +218,13 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
await api.post(`/artefacts/${artefact.Id}/versions/${selectedVersion.Id}/attachments`, {
drive_url: driveUrl,
})
- toast.success('Video link added')
+ toast.success(t('artefacts.videoLinkAdded'))
setShowVideoModal(false)
setDriveUrl('')
loadVersionData(selectedVersion.Id)
} catch (err) {
console.error('Add Drive link failed:', err)
- toast.error('Failed to add video link')
+ toast.error(t('artefacts.failedAddVideoLink'))
} finally {
setUploading(false)
}
@@ -233,10 +233,10 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const handleDeleteAttachment = async (attId) => {
try {
await api.delete(`/artefact-attachments/${attId}`)
- toast.success('Attachment deleted')
+ toast.success(t('artefacts.attachmentDeleted'))
loadVersionData(selectedVersion.Id)
} catch (err) {
- toast.error('Failed to delete attachment')
+ toast.error(t('artefacts.failedDeleteAttachment'))
}
}
@@ -245,10 +245,10 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
try {
const res = await api.post(`/artefacts/${artefact.Id}/submit-review`)
setReviewUrl(res.reviewUrl || res.data?.reviewUrl || '')
- toast.success('Submitted for review!')
+ toast.success(t('artefacts.submittedForReview'))
onUpdate()
} catch (err) {
- toast.error('Failed to submit for review')
+ toast.error(t('artefacts.failedSubmitReview'))
} finally {
setSubmitting(false)
}
@@ -257,7 +257,7 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const copyReviewLink = () => {
navigator.clipboard.writeText(reviewUrl)
setCopied(true)
- toast.success('Link copied to clipboard')
+ toast.success(t('artefacts.linkCopied'))
setTimeout(() => setCopied(false), 2000)
}
@@ -269,11 +269,11 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
await api.post(`/artefacts/${artefact.Id}/versions/${selectedVersion.Id}/comments`, {
content: newComment.trim(),
})
- toast.success('Comment added')
+ toast.success(t('artefacts.commentAdded'))
setNewComment('')
loadVersionData(selectedVersion.Id)
} catch (err) {
- toast.error('Failed to add comment')
+ toast.error(t('artefacts.failedAddComment'))
} finally {
setAddingComment(false)
}
@@ -282,16 +282,16 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
const handleUpdateField = async (field, value) => {
try {
await api.patch(`/artefacts/${artefact.Id}`, { [field]: value || null })
- toast.success('Updated')
+ toast.success(t('artefacts.updated'))
onUpdate()
} catch (err) {
- toast.error('Failed to update')
+ toast.error(t('artefacts.failedUpdate'))
}
}
const handleSaveDraft = async () => {
if (!editTitle.trim()) {
- toast.error('Title is required')
+ toast.error(t('artefacts.titleRequired'))
return
}
setSavingDraft(true)
@@ -300,10 +300,10 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
title: editTitle.trim(),
description: editDescription.trim() || null,
})
- toast.success('Draft saved')
+ toast.success(t('artefacts.draftSaved'))
onUpdate()
} catch (err) {
- toast.error('Failed to save draft')
+ toast.error(t('artefacts.failedSaveDraft'))
} finally {
setSavingDraft(false)
}
@@ -314,7 +314,7 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
try {
await onDelete(artefact.Id || artefact.id || artefact._id)
} catch (err) {
- toast.error('Failed to delete')
+ toast.error(t('artefacts.failedDelete'))
setDeleting(false)
}
}
@@ -377,17 +377,17 @@ export default function ArtefactDetailPanel({ artefact, onClose, onUpdate, onDel
onClick={handleSaveDraft}
disabled={savingDraft}
className="flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium bg-brand-primary text-white rounded-lg hover:bg-brand-primary-light disabled:opacity-50 transition-colors"
- title="Save draft"
+ title={t('artefacts.saveDraftTooltip')}
>
No languages added yet
+{t('artefacts.noLanguages')}
{artefact.feedback}
MP4, MOV, AVI, etc.
+{t('artefacts.videoFormats')}
- Paste a Google Drive share link. Make sure the file is publicly accessible. + {t('artefacts.publiclyAccessible')}
- {roleInfo.icon} {roleInfo.label} + {roleInfo.icon} {t(roleInfo.labelKey)}
{user?.email}
{issueData.description || 'No description provided'}
+{issueData.description || t('issues.noDescription')}
No updates yet
+{t('issues.noUpdates')}
)}- {uploadingFile ? 'Uploading...' : 'Click to upload file'} + {uploadingFile ? t('issues.uploading') : t('issues.clickToUpload')}
No attachments
+{t('issues.noAttachments')}
)} @@ -538,13 +538,13 @@ export default function IssueDetailPanel({ issue, onClose, onUpdate, teamMembers {/* Resolve Modal */} {showResolveModal && ( -Provide a resolution summary that will be visible to the submitter.
+{t('issues.resolveSummaryHint')}
Provide a reason for declining this issue. This will be visible to the submitter.
+{t('issues.declineReasonHint')}
- {dragActive ? t('posts.dropFiles') : t('posts.uploadFiles')}
+
+ {dragActive ? t('posts.dropFiles') : t('posts.dragToUpload')}
{t('posts.selectAssets')}
Track and manage issue submissions
+{t('issues.subtitle')}