diff --git a/frontend/components/Shared/PriorityDropdown.tsx b/frontend/components/Shared/PriorityDropdown.tsx index f62247b..8a4d26a 100644 --- a/frontend/components/Shared/PriorityDropdown.tsx +++ b/frontend/components/Shared/PriorityDropdown.tsx @@ -160,13 +160,11 @@ const PriorityDropdown: React.FC = ({ onClick={() => handleSelect(priority.value as PriorityType) } - className="flex items-center justify-between px-4 py-2 text-sm text-gray-900 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-600 w-full first:rounded-t-md last:rounded-b-md" + className="flex items-center justify-center px-4 py-2 text-sm text-gray-900 dark:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-600 w-full first:rounded-t-md last:rounded-b-md" data-testid={`priority-option-${priority.value || 'none'}`} + title={priority.label} > - - {priority.icon}{' '} - {priority.label} - + {priority.icon} ))} , diff --git a/frontend/components/Task/TaskDetails.tsx b/frontend/components/Task/TaskDetails.tsx index d504fe7..140a7c4 100644 --- a/frontend/components/Task/TaskDetails.tsx +++ b/frontend/components/Task/TaskDetails.tsx @@ -9,10 +9,11 @@ import { Project } from '../../entities/Project'; import { updateTask, deleteTask, - toggleTaskCompletion, fetchTaskByUid, fetchTaskNextIterations, TaskIteration, + toggleTaskToday, + toggleTaskCompletion, } from '../../utils/tasksService'; import { createProject } from '../../utils/projectsService'; import { useStore } from '../../store/useStore'; @@ -21,21 +22,20 @@ import LoadingScreen from '../Shared/LoadingScreen'; import TaskTimeline from './TaskTimeline'; import { TaskDetailsHeader, - TaskSummaryAlerts, TaskContentCard, TaskProjectCard, TaskTagsCard, - TaskPriorityCard, TaskSubtasksCard, TaskRecurrenceCard, TaskDueDateCard, TaskDeferUntilCard, } from './TaskDetails/'; +import { isTaskOverdue } from '../../utils/dateUtils'; const TaskDetails: React.FC = () => { const { uid } = useParams<{ uid: string }>(); const navigate = useNavigate(); - const { t, i18n } = useTranslation(); + const { t } = useTranslation(); const { showSuccessToast, showErrorToast } = useToast(); const projects = useStore((state: any) => state.projectsStore.projects); @@ -55,10 +55,7 @@ const TaskDetails: React.FC = () => { const [taskToDelete, setTaskToDelete] = useState(null); const [focusSubtasks, setFocusSubtasks] = useState(false); const [timelineRefreshKey, setTimelineRefreshKey] = useState(0); - const [isOverdueAlertDismissed, setIsOverdueAlertDismissed] = - useState(false); - const [isSummaryAlertDismissed, setIsSummaryAlertDismissed] = - useState(false); + const [isOverdueBubbleVisible, setIsOverdueBubbleVisible] = useState(false); const [nextIterations, setNextIterations] = useState([]); const [loadingIterations, setLoadingIterations] = useState(false); const [parentTask, setParentTask] = useState(null); @@ -69,19 +66,38 @@ const TaskDetails: React.FC = () => { const actionsMenuRef = useRef(null); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { + const target = e.target as Node; if ( actionsMenuOpen && actionsMenuRef.current && - !actionsMenuRef.current.contains(e.target as Node) + !actionsMenuRef.current.contains(target) ) { setActionsMenuOpen(false); } + + if (isOverdueBubbleVisible) { + const clickedOverdueToggle = + typeof e.composedPath === 'function' + ? e + .composedPath() + .some( + (node) => + node instanceof HTMLElement && + node.hasAttribute('data-overdue-toggle') + ) + : target instanceof HTMLElement && + !!target.closest('[data-overdue-toggle]'); + + if (!clickedOverdueToggle) { + setIsOverdueBubbleVisible(false); + } + } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; - }, [actionsMenuOpen]); + }, [actionsMenuOpen, isOverdueBubbleVisible]); const [isEditingDueDate, setIsEditingDueDate] = useState(false); const [editedDueDate, setEditedDueDate] = useState( task?.due_date || '' @@ -101,6 +117,7 @@ const TaskDetails: React.FC = () => { recurrence_week_of_month: task?.recurrence_week_of_month || null, completion_based: task?.completion_based || false, }); + const [activePill, setActivePill] = useState('overview'); useEffect(() => { setEditedDueDate(task?.due_date || ''); @@ -185,6 +202,25 @@ const TaskDetails: React.FC = () => { setIsEditingRecurrence(true); }; + const isOverdue = task ? isTaskOverdue(task) : false; + + useEffect(() => { + if (!isOverdue) { + setIsOverdueBubbleVisible(false); + } + }, [isOverdue]); + + const handleOverdueIconClick = () => { + if (!isOverdue) { + return; + } + setIsOverdueBubbleVisible((prev) => !prev); + }; + + const handleDismissOverdueAlert = () => { + setIsOverdueBubbleVisible(false); + }; + const handleRecurrenceChange = (field: string, value: any) => { setRecurrenceForm((prev) => ({ ...prev, @@ -299,6 +335,23 @@ const TaskDetails: React.FC = () => { } } + // Check if due date is in the past + if (editedDueDate) { + const dueDate = new Date(editedDueDate); + const today = new Date(); + today.setHours(0, 0, 0, 0); + dueDate.setHours(0, 0, 0, 0); + + if (!isNaN(dueDate.getTime()) && dueDate < today) { + showErrorToast( + t( + 'task.dueDateInPastWarning', + 'Warning: You are setting a due date in the past' + ) + ); + } + } + try { await updateTask(task.uid, { ...task, @@ -413,125 +466,6 @@ const TaskDetails: React.FC = () => { setEditedDeferUntil(task?.defer_until || ''); }; - const getStatusLabel = () => { - switch (task.status) { - case 'not_started': - case 0: - return t('task.status.notStarted', 'not started'); - case 'in_progress': - case 1: - return t('task.status.inProgress', 'in progress'); - case 'done': - case 2: - return t('task.status.done', 'completed'); - case 'archived': - case 3: - return t('task.status.archived', 'archived'); - default: - return t('task.status.unknown', 'ongoing'); - } - }; - - const getPriorityLabel = () => { - if (task.priority === null || task.priority === undefined) { - return null; - } - switch (task.priority) { - case 'low': - case 0: - return t('task.lowPriority', 'low priority'); - case 'medium': - case 1: - return t('task.mediumPriority', 'medium priority'); - case 'high': - case 2: - return t('task.highPriority', 'high priority'); - default: - return null; - } - }; - - const getDueDateDisplay = (dueDate: string) => { - const date = new Date(dueDate); - if (Number.isNaN(date.getTime())) return null; - - const formattedDate = date.toLocaleDateString(i18n.language, { - day: '2-digit', - month: '2-digit', - year: 'numeric', - }); - - const today = new Date(); - today.setHours(0, 0, 0, 0); - const target = new Date(date); - target.setHours(0, 0, 0, 0); - - const diffDays = Math.round( - (target.getTime() - today.getTime()) / (1000 * 60 * 60 * 24) - ); - - if (diffDays === 0) { - return { - formattedDate, - relativeText: t('dateIndicators.today', 'today'), - }; - } - if (diffDays === 1) { - return { - formattedDate, - relativeText: t('dateIndicators.tomorrow', 'tomorrow'), - }; - } - if (diffDays === -1) { - return { - formattedDate, - relativeText: t('dateIndicators.yesterday', 'yesterday'), - }; - } - - const relativeText = - diffDays > 0 - ? t('task.inDays', 'in {{count}} days', { count: diffDays }) - : t('task.daysAgo', '{{count}} days ago', { - count: Math.abs(diffDays), - }); - - return { formattedDate, relativeText }; - }; - - const getTaskPlainSummary = () => { - const statusText = getStatusLabel(); - const priorityText = getPriorityLabel(); - const dueInfo = task.due_date ? getDueDateDisplay(task.due_date) : null; - - return ( - - {t('task.thisTask', 'This task')} {t('task.is', 'is')}{' '} - {statusText} - {priorityText && ( - <> - {' '} - {t('task.and', 'and')} {t('task.has', 'has')}{' '} - {priorityText} - - )} - {dueInfo && ( - <> - {`, ${t('task.dueOn', 'due')} ${dueInfo.relativeText}`}{' '} - ({dueInfo.formattedDate}) - - )} - {task.Project && ( - <> - {`, ${t('task.fromProject', 'from project')}`}{' '} - {task.Project.name} - - )} - . - - ); - }; - useEffect(() => { const fetchTaskData = async () => { if (!uid) { @@ -850,11 +784,13 @@ const TaskDetails: React.FC = () => { [parentTask?.id, parentTask?.recurrence_type] ); - const handleToggleCompletion = async () => { - if (!task?.uid) return; + const handleToggleTodayPlan = async () => { + if (!task?.id || !task?.uid) { + return; + } try { - const updatedTask = await toggleTaskCompletion(task.uid, task); + const updatedTask = await toggleTaskToday(task.id, task); let latestTaskData: Task | null = updatedTask; if (uid) { @@ -871,19 +807,109 @@ const TaskDetails: React.FC = () => { } await refreshRecurringSetup(latestTaskData); + setTimelineRefreshKey((prev) => prev + 1); + showSuccessToast( + updatedTask.today + ? t('tasks.addToToday', 'Add to today plan') + : t('tasks.removeFromToday', 'Remove from today plan') + ); + } catch (error) { + console.error('Error toggling today plan:', error); + showErrorToast( + t('task.statusUpdateError', 'Failed to update status') + ); + } + }; - const statusMessage = - updatedTask.status === 'done' || updatedTask.status === 2 - ? t('task.completedSuccess', 'Task marked as completed') - : t('task.reopenedSuccess', 'Task reopened'); + const handleQuickStatusToggle = async () => { + if (!task?.uid) { + return; + } - showSuccessToast(statusMessage); + const isCurrentlyInProgress = + task.status === 'in_progress' || task.status === 1; + const isToggleable = + task.status === 'not_started' || + task.status === 0 || + isCurrentlyInProgress; + + if (!isToggleable) { + return; + } + + try { + const nextStatusPayload: Task = { + ...task, + status: isCurrentlyInProgress ? 0 : 1, + today: isCurrentlyInProgress ? task.today : true, + }; + + await updateTask(task.uid, nextStatusPayload); + + let latestTaskData: Task | null = null; + + if (uid) { + const updatedTaskFromServer = await fetchTaskByUid(uid); + latestTaskData = updatedTaskFromServer; + const existingIndex = tasksStore.tasks.findIndex( + (t: Task) => t.uid === uid + ); + if (existingIndex >= 0) { + const updatedTasks = [...tasksStore.tasks]; + updatedTasks[existingIndex] = updatedTaskFromServer; + tasksStore.setTasks(updatedTasks); + } + } + + if (!latestTaskData) { + latestTaskData = nextStatusPayload; + } + + await refreshRecurringSetup(latestTaskData); + setTimelineRefreshKey((prev) => prev + 1); + showSuccessToast( + isCurrentlyInProgress + ? t('tasks.setNotStarted', 'Set to not started') + : t('tasks.setInProgress', 'Set in progress') + ); + } catch (error) { + console.error('Error toggling in-progress status:', error); + showErrorToast( + t('task.statusUpdateError', 'Failed to update status') + ); + } + }; + + const handleStatusUpdate = async (newStatus: number) => { + if (!task?.uid) return; + + try { + await updateTask(task.uid, { + ...task, + status: newStatus, + }); + + if (uid) { + const updatedTask = await fetchTaskByUid(uid); + const existingIndex = tasksStore.tasks.findIndex( + (t: Task) => t.uid === uid + ); + if (existingIndex >= 0) { + const updatedTasks = [...tasksStore.tasks]; + updatedTasks[existingIndex] = updatedTask; + tasksStore.setTasks(updatedTasks); + } + } + + showSuccessToast( + t('task.statusUpdated', 'Status updated successfully') + ); setTimelineRefreshKey((prev) => prev + 1); } catch (error) { - console.error('Error toggling task completion:', error); + console.error('Error updating status:', error); showErrorToast( - t('task.toggleError', 'Failed to update task status') + t('task.statusUpdateError', 'Failed to update status') ); } }; @@ -1180,101 +1206,70 @@ const TaskDetails: React.FC = () => { } return ( -
+
{/* Header Section with Title and Action Buttons */} - - {/* Summary and Overdue Alerts */} - setIsSummaryAlertDismissed(true)} - onDismissOverdue={() => setIsOverdueAlertDismissed(true)} + activePill={activePill} + onPillChange={setActivePill} + showOverdueIcon={isOverdue} + onOverdueIconClick={handleOverdueIconClick} + isOverdueAlertVisible={isOverdue && isOverdueBubbleVisible} + onDismissOverdueAlert={handleDismissOverdueAlert} + onToggleTodayPlan={handleToggleTodayPlan} + onQuickStatusToggle={handleQuickStatusToggle} /> {/* Content - Full width layout */} -
-
- {/* Left Column - Main Content */} -
- {/* Notes Section - Always Visible */} - +
+ {/* Overview Pill */} + {activePill === 'overview' && ( +
+ {/* Left Column - Main Content */} +
+ +
- + {/* Right Column - Project and Tags */} +
+ - + tagsStore.loadTags()} + getTagLink={getTagLink} + /> +
+ )} - {/* Right Column - Metadata and Recent Activity */} -
- {/* Project Section */} - - - {/* Tags Section */} - tagsStore.loadTags()} - getTagLink={getTagLink} - /> - - {/* Priority Section */} - - + {/* Schedule Pill */} + {activePill === 'schedule' && ( +
{ onCancel={handleCancelDeferUntilEdit} /> - {/* Recent Activity Section */} -
-

- {t( - 'task.recentActivity', - 'Recent Activity' - )} -

-
- -
+
+
-
+ )} + + {/* Subtasks Pill */} + {activePill === 'subtasks' && ( +
+ +
+ )} + + {/* Attachments Pill */} + {activePill === 'attachments' && ( +
+

+ {t( + 'task.attachmentsComingSoon', + 'Attachments feature coming soon' + )} +

+
+ )} + + {/* Activity Pill */} + {activePill === 'activity' && ( +
+

+ {t('task.recentActivity', 'Recent Activity')} +

+
+ +
+
+ )}
{/* End of main content sections */} diff --git a/frontend/components/Task/TaskDetails/TaskContentCard.tsx b/frontend/components/Task/TaskDetails/TaskContentCard.tsx index 8395f91..8d726d3 100644 --- a/frontend/components/Task/TaskDetails/TaskContentCard.tsx +++ b/frontend/components/Task/TaskDetails/TaskContentCard.tsx @@ -57,10 +57,7 @@ const TaskContentCard: React.FC = ({ }; return ( -
-

- {t('task.content', 'Content')} -

+
{isEditing ? (
@@ -170,7 +167,7 @@ const TaskContentCard: React.FC = ({
- {t('task.noNotes', 'No content added yet')} + {t('task.noNotes', 'Add some content')}
diff --git a/frontend/components/Task/TaskDetails/TaskDetailsHeader.tsx b/frontend/components/Task/TaskDetails/TaskDetailsHeader.tsx index 7da24b5..d2d4fa6 100644 --- a/frontend/components/Task/TaskDetails/TaskDetailsHeader.tsx +++ b/frontend/components/Task/TaskDetails/TaskDetailsHeader.tsx @@ -5,36 +5,69 @@ import { XMarkIcon, FolderIcon, TagIcon, + ChevronDownIcon, + PauseCircleIcon, + PlayCircleIcon, + CheckCircleIcon, + ExclamationTriangleIcon, + CalendarDaysIcon, + CalendarIcon, + PlayIcon, + FireIcon, + ArrowUpIcon, + ArrowDownIcon, } from '@heroicons/react/24/outline'; import { Link } from 'react-router-dom'; -import TaskPriorityIcon from '../TaskPriorityIcon'; -import { Task } from '../../../entities/Task'; +import { Task, PriorityType } from '../../../entities/Task'; +import { formatDateTime } from '../../../utils/dateUtils'; interface TaskDetailsHeaderProps { task: Task; - onToggleCompletion: () => void; onTitleUpdate: (newTitle: string) => Promise; + onStatusUpdate: (newStatus: number) => Promise; + onPriorityUpdate: (newPriority: PriorityType) => Promise; onEdit: () => void; onDelete: () => void; getProjectLink?: (project: any) => string; getTagLink?: (tag: any) => string; + activePill: string; + onPillChange: (pill: string) => void; + showOverdueIcon?: boolean; + onOverdueIconClick?: () => void; + isOverdueAlertVisible?: boolean; + onDismissOverdueAlert?: () => void; + onToggleTodayPlan?: () => void; + onQuickStatusToggle?: () => void; } const TaskDetailsHeader: React.FC = ({ task, - onToggleCompletion, onTitleUpdate, + onStatusUpdate, + onPriorityUpdate, onEdit, onDelete, getProjectLink, getTagLink, + activePill, + onPillChange, + showOverdueIcon = false, + onOverdueIconClick, + isOverdueAlertVisible = false, + onDismissOverdueAlert, + onToggleTodayPlan, + onQuickStatusToggle, }) => { const { t } = useTranslation(); const [isEditingTitle, setIsEditingTitle] = useState(false); const [editedTitle, setEditedTitle] = useState(task.name); const [actionsMenuOpen, setActionsMenuOpen] = useState(false); + const [statusDropdownOpen, setStatusDropdownOpen] = useState(false); + const [priorityDropdownOpen, setPriorityDropdownOpen] = useState(false); const titleInputRef = useRef(null); const actionsMenuRef = useRef(null); + const statusDropdownRef = useRef(null); + const priorityDropdownRef = useRef(null); useEffect(() => { setEditedTitle(task.name); @@ -56,14 +89,28 @@ const TaskDetailsHeader: React.FC = ({ ) { setActionsMenuOpen(false); } + if ( + statusDropdownOpen && + statusDropdownRef.current && + !statusDropdownRef.current.contains(e.target as Node) + ) { + setStatusDropdownOpen(false); + } + if ( + priorityDropdownOpen && + priorityDropdownRef.current && + !priorityDropdownRef.current.contains(e.target as Node) + ) { + setPriorityDropdownOpen(false); + } }; - if (actionsMenuOpen) { + if (actionsMenuOpen || statusDropdownOpen || priorityDropdownOpen) { document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); } - }, [actionsMenuOpen]); + }, [actionsMenuOpen, statusDropdownOpen, priorityDropdownOpen]); const handleStartTitleEdit = () => { setIsEditingTitle(true); @@ -89,21 +136,165 @@ const TaskDetailsHeader: React.FC = ({ } }; + const getStatusLabel = () => { + const status = task.status; + if (status === 'not_started' || status === 0) { + return t('task.status.notStarted', 'Not started'); + } else if (status === 'in_progress' || status === 1) { + return t('task.status.inProgress', 'In progress'); + } else if (status === 'done' || status === 2) { + return t('task.status.done', 'Done'); + } else if (status === 'archived' || status === 3) { + return t('task.status.archived', 'Archived'); + } else if (status === 'waiting' || status === 4) { + return t('task.status.waiting', 'Waiting'); + } + return t('task.status.notStarted', 'Not started'); + }; + + const getStatusButtonClass = () => { + const status = task.status; + + if (status === 'not_started' || status === 0) { + return 'px-2.5 py-1 rounded-md text-xs font-medium transition-colors flex items-center gap-2 sm:ml-2 border border-gray-300 text-gray-600 dark:border-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800/60'; + } + + const baseClass = + 'px-2.5 py-1 rounded-md text-xs font-medium transition-colors flex items-center gap-2 sm:ml-2 border'; + + if (status === 'in_progress' || status === 1) { + return `${baseClass} border-blue-500 text-blue-600 dark:border-blue-400 dark:text-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900/30`; + } else if (status === 'done' || status === 2) { + return `${baseClass} border-green-500 text-green-600 dark:border-green-400 dark:text-green-300 hover:bg-green-50 dark:hover:bg-green-900/30`; + } else if (status === 'archived' || status === 3) { + return `${baseClass} border-purple-500 text-purple-600 dark:border-purple-400 dark:text-purple-300 hover:bg-purple-50 dark:hover:bg-purple-900/30`; + } else if (status === 'waiting' || status === 4) { + return `${baseClass} border-yellow-500 text-yellow-600 dark:border-yellow-400 dark:text-yellow-300 hover:bg-yellow-50 dark:hover:bg-yellow-900/30`; + } + return `${baseClass} border-gray-300 text-gray-700 dark:border-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800/60`; + }; + + const handleStatusChange = async (newStatus: number | string) => { + setStatusDropdownOpen(false); + const statusNum = + typeof newStatus === 'string' ? parseInt(newStatus) : newStatus; + await onStatusUpdate(statusNum); + }; + + const getStatusIcon = ( + statusOverride?: number | string + ): React.ElementType => { + const status = + typeof statusOverride !== 'undefined' + ? statusOverride + : task.status; + + if (status === 'in_progress' || status === 1) { + return PlayCircleIcon; + } else if (status === 'done' || status === 2) { + return CheckCircleIcon; + } + return PauseCircleIcon; + }; + + const getStatusIconClass = (statusOverride?: number | string) => { + const status = + typeof statusOverride !== 'undefined' + ? statusOverride + : task.status; + + if (status === 'in_progress' || status === 1) { + return 'text-blue-500 dark:text-blue-400'; + } else if (status === 'done' || status === 2) { + return 'text-green-500 dark:text-green-400'; + } + return 'text-gray-500 dark:text-gray-400'; + }; + + const getPriorityLabel = (priorityOverride?: PriorityType) => { + const priority = + typeof priorityOverride !== 'undefined' + ? priorityOverride + : task.priority; + + if (priority === 'low' || priority === 0) { + return t('priority.low', 'Low'); + } else if (priority === 'medium' || priority === 1) { + return t('priority.medium', 'Medium'); + } else if (priority === 'high' || priority === 2) { + return t('priority.high', 'High'); + } + return t('priority.none', 'None'); + }; + + const getPriorityButtonClass = () => { + const priority = task.priority; + + if (priority === null || priority === undefined) { + return 'px-2.5 py-1 rounded-md text-xs font-medium transition-colors flex items-center gap-2 sm:ml-1 border border-gray-300 text-gray-600 dark:border-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800/60'; + } + + const baseClass = + 'px-2.5 py-1 rounded-md text-xs font-medium transition-colors flex items-center gap-2 sm:ml-1 border'; + + if (priority === 'low' || priority === 0) { + return `${baseClass} border-blue-500 text-blue-600 dark:border-blue-400 dark:text-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900/30`; + } else if (priority === 'medium' || priority === 1) { + return `${baseClass} border-yellow-500 text-yellow-600 dark:border-yellow-400 dark:text-yellow-300 hover:bg-yellow-50 dark:hover:bg-yellow-900/30`; + } else if (priority === 'high' || priority === 2) { + return `${baseClass} border-red-500 text-red-600 dark:border-red-400 dark:text-red-300 hover:bg-red-50 dark:hover:bg-red-900/30`; + } + return `${baseClass} border-gray-300 text-gray-700 dark:border-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800/60`; + }; + + const handlePriorityChange = async (newPriority: PriorityType) => { + setPriorityDropdownOpen(false); + await onPriorityUpdate(newPriority); + }; + + const getPriorityIcon = ( + priorityOverride?: PriorityType + ): React.ElementType => { + const priority = + typeof priorityOverride !== 'undefined' + ? priorityOverride + : task.priority; + + if (priority === 'low' || priority === 0) { + return ArrowDownIcon; + } else if (priority === 'medium' || priority === 1) { + return ArrowUpIcon; + } else if (priority === 'high' || priority === 2) { + return FireIcon; + } + return XMarkIcon; + }; + + const getPriorityIconClass = (priorityOverride?: PriorityType) => { + const priority = + typeof priorityOverride !== 'undefined' + ? priorityOverride + : task.priority; + + if (priority === 'low' || priority === 0) { + return 'text-blue-500 dark:text-blue-400'; + } else if (priority === 'medium' || priority === 1) { + return 'text-yellow-500 dark:text-yellow-400'; + } else if (priority === 'high' || priority === 2) { + return 'text-red-500 dark:text-red-400'; + } + return 'text-gray-500 dark:text-gray-400'; + }; + + const formattedUpdatedAt = task.updated_at + ? formatDateTime(new Date(task.updated_at)) + : null; + return (
-
-
-
- -
-
+
+
+
{isEditingTitle ? (
= ({
) : ( <> -

- {task.name} -

+
+

+ {task.name} +

+ + {/* Status Dropdown Button - Next to title */} +
+
+ + {statusDropdownOpen && ( +
+ + + +
+ )} +
+ + {/* Priority Dropdown Button - Next to status */} +
+ + {priorityDropdownOpen && ( +
+ + + + +
+ )} +
+ {formattedUpdatedAt && ( + + {t( + 'task.lastUpdatedAt', + 'Last updated at' + )} + :{' '} + + {formattedUpdatedAt} + + + )} +
+
{/* Project and tags display below title */} {(task.Project || (task.tags && task.tags.length > 0)) && ( @@ -173,7 +674,7 @@ const TaskDetailsHeader: React.FC = ({ {task.tags && task.tags.length > 0 && (
-
+
{task.tags.map( ( tag: any, @@ -208,7 +709,7 @@ const TaskDetailsHeader: React.FC = ({ .length - 1 && ( - , + {', '} )} @@ -223,44 +724,262 @@ const TaskDetailsHeader: React.FC = ({ )}
-
- - {actionsMenuOpen && ( -
- + + + + +
+ {(showOverdueIcon || + onToggleTodayPlan || + onQuickStatusToggle) && ( +
+ {showOverdueIcon && ( +
+ + {isOverdueAlertVisible && ( +
+
+ +
+ +
+

+ {t( + 'task.overdueAlert', + "This task was in your plan yesterday and wasn't completed." + )} +

+

+ {t( + 'task.overdueYesterday', + 'Consider prioritizing this task or breaking it into smaller steps.' + )} +

+
+
+
+
+ )} +
+ )} + {onToggleTodayPlan && ( + + )} + {onQuickStatusToggle && + (task.status === 'not_started' || + task.status === 'in_progress' || + task.status === 0 || + task.status === 1) && ( + + )} +
- {t('common.edit', 'Edit')} - - + + {actionsMenuOpen && ( +
+ + +
+ )} +
)}
diff --git a/frontend/components/Task/TaskDetails/TaskPriorityCard.tsx b/frontend/components/Task/TaskDetails/TaskPriorityCard.tsx index 5968e4c..6edd7c6 100644 --- a/frontend/components/Task/TaskDetails/TaskPriorityCard.tsx +++ b/frontend/components/Task/TaskDetails/TaskPriorityCard.tsx @@ -1,5 +1,11 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; +import { + ArrowDownIcon, + ArrowUpIcon, + FireIcon, + XMarkIcon, +} from '@heroicons/react/24/outline'; import { Task, PriorityType } from '../../../entities/Task'; interface TaskPriorityCardProps { @@ -26,46 +32,50 @@ const TaskPriorityCard: React.FC = ({
diff --git a/frontend/components/Task/TaskDetails/TaskProjectCard.tsx b/frontend/components/Task/TaskDetails/TaskProjectCard.tsx index 117bd37..4976c50 100644 --- a/frontend/components/Task/TaskDetails/TaskProjectCard.tsx +++ b/frontend/components/Task/TaskDetails/TaskProjectCard.tsx @@ -1,7 +1,7 @@ import React, { useRef, useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; -import { ArrowRightIcon } from '@heroicons/react/24/outline'; +import { ArrowRightIcon, FolderIcon } from '@heroicons/react/24/outline'; import ProjectDropdown from '../../Shared/ProjectDropdown'; import { Project } from '../../../entities/Project'; import { Task } from '../../../entities/Task'; @@ -84,12 +84,27 @@ const TaskProjectCard: React.FC = ({ setFilteredProjects(projects); }; + const containerClasses = [ + 'rounded-lg', + 'shadow-sm', + 'bg-white', + 'dark:bg-gray-900', + 'transition-colors', + ]; + + if (task.Project || projectDropdownOpen) { + containerClasses.push( + 'border-2', + 'border-gray-50', + 'dark:border-gray-800', + 'hover:border-gray-200', + 'dark:hover:border-gray-700' + ); + } + return ( -
-

- {t('task.project', 'Project')} -

-
+
+
{projectDropdownOpen ? ( = ({ ) : (
setProjectDropdownOpen(true)} - className="rounded-lg shadow-sm bg-white dark:bg-gray-900 hover:border-gray-400 dark:hover:border-gray-600 p-6 cursor-pointer transition-colors flex items-center justify-center" + className="rounded-lg shadow-sm bg-white dark:bg-gray-900 p-6 cursor-pointer transition-colors" > - - {t( - 'task.noProject', - 'No project - Click to assign' - )} - +
+ + + {t('task.noProject', 'Assign to a project')} + +
)}
diff --git a/frontend/components/Task/TaskDetails/TaskSubtasksCard.tsx b/frontend/components/Task/TaskDetails/TaskSubtasksCard.tsx index 6919890..d5b1263 100644 --- a/frontend/components/Task/TaskDetails/TaskSubtasksCard.tsx +++ b/frontend/components/Task/TaskDetails/TaskSubtasksCard.tsx @@ -31,10 +31,7 @@ const TaskSubtasksCard: React.FC = ({ const { t } = useTranslation(); return ( -
-

- {t('task.subtasks', 'Subtasks')} -

+
{isEditing ? (
= ({
- {t( - 'task.noSubtasksClickToAdd', - 'No subtasks yet, click to add' - )} + {t('task.noSubtasksClickToAdd', 'Add subtasks')}
diff --git a/frontend/components/Task/TaskDetails/TaskSummaryAlerts.tsx b/frontend/components/Task/TaskDetails/TaskSummaryAlerts.tsx deleted file mode 100644 index 07ff7a3..0000000 --- a/frontend/components/Task/TaskDetails/TaskSummaryAlerts.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { - XMarkIcon, - InformationCircleIcon, - ExclamationTriangleIcon, -} from '@heroicons/react/24/outline'; -import { Task } from '../../../entities/Task'; -import { isTaskOverdue } from '../../../utils/dateUtils'; - -interface TaskSummaryAlertsProps { - task: Task; - summaryMessage: React.ReactNode; - isSummaryDismissed: boolean; - isOverdueDismissed: boolean; - onDismissSummary: () => void; - onDismissOverdue: () => void; -} - -const TaskSummaryAlerts: React.FC = ({ - task, - summaryMessage, - isSummaryDismissed, - isOverdueDismissed, - onDismissSummary, - onDismissOverdue, -}) => { - const { t } = useTranslation(); - - return ( - <> - {/* Summary Alert */} - {!isSummaryDismissed && ( -
- -
- -
-

- {summaryMessage} -

-
-
-
- )} - - {/* Overdue Alert */} - {isTaskOverdue(task) && !isOverdueDismissed && ( -
- -
- -
-

- {t( - 'task.overdueAlert', - "This task was in your plan yesterday and wasn't completed." - )} -

-

- {t( - 'task.overdueYesterday', - 'Consider prioritizing this task or breaking it into smaller steps.' - )} -

-
-
-
- )} - - ); -}; - -export default TaskSummaryAlerts; diff --git a/frontend/components/Task/TaskDetails/TaskTagsCard.tsx b/frontend/components/Task/TaskDetails/TaskTagsCard.tsx index db5b2b1..0a9ca2c 100644 --- a/frontend/components/Task/TaskDetails/TaskTagsCard.tsx +++ b/frontend/components/Task/TaskDetails/TaskTagsCard.tsx @@ -63,10 +63,7 @@ const TaskTagsCard: React.FC = ({ }; return ( -
-

- {t('task.tags', 'Tags')} -

+
{isEditing ? (
@@ -131,11 +128,14 @@ const TaskTagsCard: React.FC = ({ ) : (
- - {t('task.noTags', 'No tags')} - +
+ + + {t('task.noTags', 'Add tags')} + +
)}
diff --git a/frontend/components/Task/TaskDetails/index.ts b/frontend/components/Task/TaskDetails/index.ts index b4613f8..491f8ed 100644 --- a/frontend/components/Task/TaskDetails/index.ts +++ b/frontend/components/Task/TaskDetails/index.ts @@ -1,5 +1,4 @@ export { default as TaskDetailsHeader } from './TaskDetailsHeader'; -export { default as TaskSummaryAlerts } from './TaskSummaryAlerts'; export { default as TaskContentCard } from './TaskContentCard'; export { default as TaskProjectCard } from './TaskProjectCard'; export { default as TaskTagsCard } from './TaskTagsCard'; diff --git a/frontend/components/Task/TaskModal.tsx b/frontend/components/Task/TaskModal.tsx index e5dbebe..e16036a 100644 --- a/frontend/components/Task/TaskModal.tsx +++ b/frontend/components/Task/TaskModal.tsx @@ -394,6 +394,23 @@ const TaskModal: React.FC = ({ setIsSaving(true); try { + // Check if due date is in the past + if (formData.due_date) { + const dueDate = new Date(formData.due_date); + const today = new Date(); + today.setHours(0, 0, 0, 0); + dueDate.setHours(0, 0, 0, 0); + + if (!isNaN(dueDate.getTime()) && dueDate < today) { + showErrorToast( + t( + 'task.dueDateInPastWarning', + 'Warning: You are setting a due date in the past' + ) + ); + } + } + // Add new tags to the global store const existingTagNames = availableTags.map((tag: any) => tag.name); const newTagNames = tags.filter( diff --git a/public/locales/ar/translation.json b/public/locales/ar/translation.json index 112a7b9..04eab00 100644 --- a/public/locales/ar/translation.json +++ b/public/locales/ar/translation.json @@ -420,7 +420,7 @@ "title": "العنوان", "description": "الوصف", "dueDate": "تاريخ الاستحقاق", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "الأولوية", "status": "الحالة", "assignedTo": "مُعين إلى", @@ -438,7 +438,7 @@ "status": "الحالة", "priority": "الأولوية", "dueDate": "تاريخ الاستحقاق", - "deferUntil": "Defer until", + "deferUntil": "تأجيل حتى", "note": "ملاحظة", "recurrenceType": "تكرار", "recurrenceInterval": "كل", @@ -447,8 +447,7 @@ "weekOfMonth": "أسبوع من الشهر", "recurrenceEndDate": "تاريخ الانتهاء (اختياري)", "completionBased": "كرر بعد الانتهاء", - "repeatOn": "التكرار في", - "deferUntil": "تأجيل حتى" + "repeatOn": "التكرار في" }, "projectSearchPlaceholder": "ابحث أو أنشئ مشروعًا...", "noMatchingProjects": "لا توجد مشاريع مطابقة", @@ -712,7 +711,7 @@ "overdueYesterday": "فكر في إعطاء أولوية لهذه المهمة أو تقسيمها إلى خطوات أصغر.", "overdueMultipleDays": "تم تأجيل هذه المهمة {{count}} مرات.", "content": "المحتوى", - "noNotes": "لم يتم إضافة محتوى بعد", + "noNotes": "أضف بعض المحتوى", "subtasks": "المهام الفرعية", "noSubtasks": "لا توجد مهام فرعية بعد", "recentActivity": "النشاط الأخير", @@ -726,20 +725,22 @@ "mediumPriority": "أولوية متوسطة", "highPriority": "أولوية عالية", "status": { - "notStarted": "لم تبدأ", - "inProgress": "قيد التنفيذ", - "done": "مكتملة", - "archived": "مؤرشفة", - "unknown": "جارية" + "notStarted": "لم يبدأ", + "inProgress": "قيد التقدم", + "done": "منجز", + "archived": "مؤرشف", + "unknown": "جارية", + "waiting": "في الانتظار", + "setAsDone": "تعيين كمنجز" }, - "noSubtasksClickToAdd": "لا توجد مهام فرعية بعد، انقر لإضافة", + "noSubtasksClickToAdd": "أضف مهام فرعية", "project": "المشروع", - "noProject": "لا يوجد مشروع - انقر للتعيين", + "noProject": "تعيين لمشروع", "tags": "الوسوم", - "noTags": "لا توجد وسوم", + "noTags": "أضف علامات", "priority": "الأولوية", "dueDate": "تاريخ الاستحقاق", - "deferUntil": "Defer until", + "deferUntil": "تأجيل حتى", "recurringSetup": "إعداد متكرر", "notRecurring": "هذه المهمة ليست متكررة بعد.", "clickToEditTitle": "انقر لتحرير العنوان", @@ -781,10 +782,19 @@ "includingToday": "بما في ذلك اليوم", "has": "يمتلك", "fromProject": "من المشروع", - "deferUntil": "تأجيل حتى", "noDeferUntil": "لا تأجيل حتى", "deferUntilUpdated": "تأجيل حتى يتم التحديث بنجاح", - "deferUntilUpdateError": "فشل في تحديث التأجيل حتى" + "deferUntilUpdateError": "فشل في تحديث التأجيل حتى", + "showOverdueWarning": "عرض تحذير التأخير", + "dueDateInPastWarning": "تحذير: أنت تقوم بتعيين تاريخ استحقاق في الماضي", + "overview": "نظرة عامة", + "schedule": "جدول", + "attachments": "المرفقات", + "attachmentsComingSoon": "ميزة المرفقات قادمة قريبًا", + "activity": "نشاط", + "lastUpdatedAt": "آخر تحديث في", + "statusUpdated": "تم تحديث الحالة بنجاح", + "statusUpdateError": "فشل في تحديث الحالة" }, "projects": { "loading": "جارٍ تحميل المشاريع...", @@ -944,7 +954,7 @@ "title": "العنوان", "status": "الحالة", "dueDate": "تاريخ الاستحقاق", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "الأولوية", "project": "المشروع", "area": "المنطقة", @@ -1146,7 +1156,7 @@ "searchText": "نص البحث", "priority": "الأولوية", "dueDate": "تاريخ الاستحقاق", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "لم يتم تعيين أي معايير محددة", "priorityLabel": "الأولوية:", "dueLabel": "استحقاق:", diff --git a/public/locales/bg/translation.json b/public/locales/bg/translation.json index fe0638e..20b684c 100644 --- a/public/locales/bg/translation.json +++ b/public/locales/bg/translation.json @@ -420,7 +420,7 @@ "title": "Заглавие", "description": "Описание", "dueDate": "Краен срок", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Приоритет", "status": "Статус", "assignedTo": "Назначен на", @@ -438,7 +438,7 @@ "status": "Статус", "priority": "Приоритет", "dueDate": "Краен срок", - "deferUntil": "Defer until", + "deferUntil": "Отложи до", "note": "Бележка", "recurrenceType": "Повтаряне", "recurrenceInterval": "Всеки", @@ -447,8 +447,7 @@ "weekOfMonth": "Седмица от месеца", "recurrenceEndDate": "Краен срок (по избор)", "completionBased": "Повторете след завършване", - "repeatOn": "Повтаряй на", - "deferUntil": "Отложи до" + "repeatOn": "Повтаряй на" }, "projectSearchPlaceholder": "Търсене или създаване на проект...", "noMatchingProjects": "Няма съвпадащи проекти", @@ -750,7 +749,9 @@ "inProgress": "в процес на изпълнение", "done": "завършено", "archived": "архивирано", - "unknown": "в ход" + "unknown": "в ход", + "waiting": "В очакване", + "setAsDone": "Задай като завършено" }, "noSubtasksClickToAdd": "Все още няма подзадачи, кликнете, за да добавите", "project": "Проект", @@ -759,7 +760,7 @@ "noTags": "Няма тагове", "priority": "Приоритет", "dueDate": "Срок", - "deferUntil": "Defer until", + "deferUntil": "Отложи до", "recurringSetup": "Настройка на повтарящи се", "notRecurring": "Тази задача все още не е повтаряща се.", "clickToEditTitle": "Кликнете, за да редактирате заглавието", @@ -781,10 +782,19 @@ "includingToday": "включително днес", "has": "има", "fromProject": "от проекта", - "deferUntil": "Отложи до", "noDeferUntil": "Няма отлагане до", "deferUntilUpdated": "Отложи до успешно актуализиране", - "deferUntilUpdateError": "Неуспешно актуализиране на отлагането до" + "deferUntilUpdateError": "Неуспешно актуализиране на отлагането до", + "showOverdueWarning": "Покажи предупреждение за просрочие", + "dueDateInPastWarning": "Предупреждение: Задавате срок в миналото", + "overview": "Обзор", + "schedule": "График", + "attachments": "Прикачени файлове", + "attachmentsComingSoon": "Функцията за прикачени файлове ще бъде налична скоро", + "activity": "Активност", + "lastUpdatedAt": "Последно обновено на", + "statusUpdated": "Статусът е обновен успешно", + "statusUpdateError": "Неуспешно обновяване на статуса" }, "projects": { "loading": "Зареждане на проекти...", @@ -944,7 +954,7 @@ "title": "Заглавие", "status": "Статус", "dueDate": "Краен срок", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Приоритет", "project": "Проект", "area": "Област", @@ -1146,7 +1156,7 @@ "searchText": "Текст за търсене", "priority": "Приоритет", "dueDate": "Срок", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Не са зададени конкретни критерии", "priorityLabel": "Приоритет:", "dueLabel": "Срок:", diff --git a/public/locales/da/translation.json b/public/locales/da/translation.json index 381fe08..42dd9d6 100644 --- a/public/locales/da/translation.json +++ b/public/locales/da/translation.json @@ -420,7 +420,7 @@ "title": "Titel", "description": "Beskrivelse", "dueDate": "Forfaldsdato", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritet", "status": "Status", "assignedTo": "Tildelt Til", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioritet", "dueDate": "Forfaldsdato", - "deferUntil": "Defer until", + "deferUntil": "Udsæt indtil", "note": "Bemærkning", "recurrenceType": "Gentag", "recurrenceInterval": "Hver", @@ -447,8 +447,7 @@ "weekOfMonth": "Uge i måneden", "recurrenceEndDate": "Slutdato (valgfri)", "completionBased": "Gentag efter fuldførelse", - "repeatOn": "Gentag på", - "deferUntil": "Udsæt indtil" + "repeatOn": "Gentag på" }, "projectSearchPlaceholder": "Søg eller opret et projekt...", "noMatchingProjects": "Ingen matchende projekter", @@ -750,7 +749,9 @@ "inProgress": "i gang", "done": "fuldført", "archived": "arkiveret", - "unknown": "gående" + "unknown": "gående", + "waiting": "Venter", + "setAsDone": "Sæt som færdig" }, "noSubtasksClickToAdd": "Ingen underopgaver endnu, klik for at tilføje", "project": "Projekt", @@ -759,7 +760,7 @@ "noTags": "Ingen tags", "priority": "Prioritet", "dueDate": "Forfaldsdato", - "deferUntil": "Defer until", + "deferUntil": "Udsæt indtil", "recurringSetup": "Gentagen opsætning", "notRecurring": "Denne opgave er ikke gentagende endnu.", "clickToEditTitle": "Klik for at redigere titel", @@ -781,10 +782,19 @@ "includingToday": "inklusive i dag", "has": "har", "fromProject": "fra projektet", - "deferUntil": "Udsæt indtil", "noDeferUntil": "Ingen udsættelse indtil", "deferUntilUpdated": "Udsæt indtil opdateret med succes", - "deferUntilUpdateError": "Fejl ved opdatering af udsættelse indtil" + "deferUntilUpdateError": "Fejl ved opdatering af udsættelse indtil", + "showOverdueWarning": "Vis advarsel om forfaldne opgaver", + "dueDateInPastWarning": "Advarsel: Du sætter en forfaldsdato i fortiden", + "overview": "Oversigt", + "schedule": "Planlægning", + "attachments": "Vedhæftninger", + "attachmentsComingSoon": "Funktion til vedhæftninger kommer snart", + "activity": "Aktivitet", + "lastUpdatedAt": "Sidst opdateret den", + "statusUpdated": "Status opdateret med succes", + "statusUpdateError": "Fejl ved opdatering af status" }, "projects": { "loading": "Indlæser projekter...", @@ -944,7 +954,7 @@ "title": "Titel", "status": "Status", "dueDate": "Forfaldsdato", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritet", "project": "Projekt", "area": "Område", @@ -1146,7 +1156,7 @@ "searchText": "Søgetekst", "priority": "Prioritet", "dueDate": "Forfaldsdato", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Ingen specifikke kriterier sat", "priorityLabel": "Prioritet:", "dueLabel": "Forfalder:", diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 7b2d45c..3684040 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -215,10 +215,9 @@ "status": "Status", "priority": "Priorität", "dueDate": "Fälligkeitsdatum", - "deferUntil": "Defer until", + "deferUntil": "Aufschieben bis", "note": "Notiz", - "repeatOn": "Wiederholen am", - "deferUntil": "Aufschieben bis" + "repeatOn": "Wiederholen am" }, "recurrenceSettings": "Wiederholungseinstellungen", "completionBasedHelp": "Falls aktiviert, wird die nächste Aufgabe basierend auf dem Abschlussdatum statt dem Fälligkeitsdatum erstellt", @@ -249,7 +248,7 @@ "noteTitlePlaceholder": "Notiz-Titel eingeben", "noteContentPlaceholder": "Notiz-Inhalt eingeben", "dueDate": "Fälligkeitsdatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorität", "status": "Status", "assignedTo": "Zugewiesen an", @@ -682,7 +681,9 @@ "inProgress": "in Bearbeitung", "done": "abgeschlossen", "archived": "archiviert", - "unknown": "laufend" + "unknown": "laufend", + "waiting": "Warten", + "setAsDone": "Als erledigt markieren" }, "noSubtasksClickToAdd": "Noch keine Unteraufgaben, klicken Sie zum Hinzufügen", "project": "Projekt", @@ -691,7 +692,7 @@ "noTags": "Keine Tags", "priority": "Priorität", "dueDate": "Fälligkeitsdatum", - "deferUntil": "Defer until", + "deferUntil": "Bis später verschieben", "recurringSetup": "Wiederkehrende Einrichtung", "notRecurring": "Diese Aufgabe ist noch nicht wiederkehrend.", "clickToEditTitle": "Klicken Sie, um den Titel zu bearbeiten", @@ -713,10 +714,19 @@ "includingToday": "einschließlich heute", "has": "hat", "fromProject": "vom Projekt", - "deferUntil": "Bis später verschieben", "noDeferUntil": "Keine Verschiebung bis", "deferUntilUpdated": "Bis zur erfolgreichen Aktualisierung verschieben", - "deferUntilUpdateError": "Aktualisierung der Verschiebung bis fehlgeschlagen" + "deferUntilUpdateError": "Aktualisierung der Verschiebung bis fehlgeschlagen", + "showOverdueWarning": "Überfällige Warnung anzeigen", + "dueDateInPastWarning": "Warnung: Sie setzen ein Fälligkeitsdatum in der Vergangenheit", + "overview": "Übersicht", + "schedule": "Zeitplan", + "attachments": "Anhänge", + "attachmentsComingSoon": "Die Funktion für Anhänge kommt bald", + "activity": "Aktivität", + "lastUpdatedAt": "Zuletzt aktualisiert am", + "statusUpdated": "Status erfolgreich aktualisiert", + "statusUpdateError": "Fehler beim Aktualisieren des Status" }, "calendar": { "month": "Monat", @@ -747,7 +757,7 @@ "title": "Titel", "status": "Status", "dueDate": "Fälligkeitsdatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorität", "project": "Projekt", "area": "Bereich", @@ -1155,7 +1165,7 @@ "searchText": "Suchtext", "priority": "Priorität", "dueDate": "Fälligkeitsdatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Keine spezifischen Kriterien festgelegt", "priorityLabel": "Priorität:", "dueLabel": "Fällig:", diff --git a/public/locales/el/translation.json b/public/locales/el/translation.json index cfe1087..e55866a 100644 --- a/public/locales/el/translation.json +++ b/public/locales/el/translation.json @@ -539,7 +539,7 @@ "title": "Τίτλος", "description": "Περιγραφή", "dueDate": "Ημερομηνία Λήξης", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Προτεραιότητα", "status": "Κατάσταση", "assignedTo": "Ανατέθηκε Σε", @@ -574,7 +574,7 @@ "status": "Κατάσταση", "priority": "Προτεραιότητα", "dueDate": "Ημερομηνία Λήξης", - "deferUntil": "Defer until", + "deferUntil": "Αναβολή μέχρι", "note": "Σημείωση", "recurrenceType": "Επανάληψη", "recurrenceInterval": "Κάθε", @@ -583,8 +583,7 @@ "weekOfMonth": "Εβδομάδα του μήνα", "recurrenceEndDate": "Ημερομηνία λήξης (προαιρετικό)", "completionBased": "Επανάληψη μετά την ολοκλήρωση", - "repeatOn": "Επανάληψη στις", - "deferUntil": "Αναβολή μέχρι" + "repeatOn": "Επανάληψη στις" }, "recurrenceSettings": "Ρυθμίσεις Επανάληψης", "completionBasedHelp": "Αν είναι ενεργοποιημένο, η επόμενη εργασία θα δημιουργηθεί με βάση την ημερομηνία ολοκλήρωσης αντί της ημερομηνίας λήξης", @@ -704,7 +703,9 @@ "inProgress": "σε εξέλιξη", "done": "ολοκληρώθηκε", "archived": "αρχειοθετημένο", - "unknown": "σε εξέλιξη" + "unknown": "σε εξέλιξη", + "waiting": "Αναμονή", + "setAsDone": "Ορισμός ως ολοκληρωμένο" }, "noSubtasksClickToAdd": "Δεν υπάρχουν υποκαθήκοντα ακόμη, κάντε κλικ για να προσθέσετε", "project": "Έργο", @@ -713,7 +714,7 @@ "noTags": "Δεν υπάρχουν ετικέτες", "priority": "Προτεραιότητα", "dueDate": "Ημερομηνία λήξης", - "deferUntil": "Defer until", + "deferUntil": "Αναβολή μέχρι", "recurringSetup": "Ρύθμιση επανάληψης", "notRecurring": "Αυτή η εργασία δεν είναι επαναλαμβανόμενη ακόμη.", "clickToEditTitle": "Κάντε κλικ για να επεξεργαστείτε τον τίτλο", @@ -735,10 +736,19 @@ "includingToday": "συμπεριλαμβανομένης της σημερινής ημέρας", "has": "έχει", "fromProject": "από το έργο", - "deferUntil": "Αναβολή μέχρι", "noDeferUntil": "Καμία αναβολή μέχρι", "deferUntilUpdated": "Αναβολή μέχρι να ενημερωθεί επιτυχώς", - "deferUntilUpdateError": "Αποτυχία ενημέρωσης αναβολής μέχρι" + "deferUntilUpdateError": "Αποτυχία ενημέρωσης αναβολής μέχρι", + "showOverdueWarning": "Εμφάνιση προειδοποίησης καθυστέρησης", + "dueDateInPastWarning": "Προειδοποίηση: Ορίζετε μια προθεσμία στο παρελθόν", + "overview": "Επισκόπηση", + "schedule": "Προγραμματισμός", + "attachments": "Συνημμένα", + "attachmentsComingSoon": "Η δυνατότητα συνημμένων έρχεται σύντομα", + "activity": "Δραστηριότητα", + "lastUpdatedAt": "Τελευταία ενημέρωση στις", + "statusUpdated": "Η κατάσταση ενημερώθηκε με επιτυχία", + "statusUpdateError": "Αποτυχία ενημέρωσης κατάστασης" }, "dateFormats": { "long": "EEEE, d MMMM yyyy", @@ -948,7 +958,7 @@ "title": "Τίτλος", "status": "Κατάσταση", "dueDate": "Ημερομηνία Λήξης", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Προτεραιότητα", "project": "Έργο", "area": "Περιοχή", @@ -1150,7 +1160,7 @@ "searchText": "Κείμενο Αναζήτησης", "priority": "Προτεραιότητα", "dueDate": "Ημερομηνία Λήξης", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Δεν έχουν οριστεί συγκεκριμένα κριτήρια", "priorityLabel": "Προτεραιότητα:", "dueLabel": "Λήξη:", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 03045ff..6b29d94 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -706,16 +706,16 @@ "overdueYesterday": "Consider prioritizing this task or breaking it into smaller steps.", "overdueMultipleDays": "This task has been postponed {{count}} times.", "content": "Content", - "noNotes": "No content added yet", + "noNotes": "Add some content", "subtasks": "Subtasks", "noSubtasks": "No subtasks yet", - "noSubtasksClickToAdd": "No subtasks yet, click to add", + "noSubtasksClickToAdd": "Add subtasks", "recentActivity": "Recent Activity", "noActivityYet": "No activity yet", "project": "Project", - "noProject": "No project - Click to assign", + "noProject": "Assign to a project", "tags": "Tags", - "noTags": "No tags", + "noTags": "Add tags", "priority": "Priority", "dueDate": "Due Date", "noDueDate": "No due date", @@ -731,6 +731,7 @@ "contentPlaceholder": "Add content here... (Markdown supported)", "contentEditHint": "Press Cmd/Ctrl+Enter to save, Esc to cancel", "noContentPreview": "No content to preview. Switch to Edit mode to add content.", + "showOverdueWarning": "Show overdue warning", "deleteConfirmTitle": "Delete Task", "deleteConfirmMessage": "Are you sure you want to delete this task? This action cannot be undone.", "noMoreIterations": "No more iterations scheduled", @@ -755,6 +756,7 @@ "recurrenceUpdateError": "Failed to update recurrence", "dueDateUpdated": "Due date updated successfully", "dueDateUpdateError": "Failed to update due date", + "dueDateInPastWarning": "Warning: You are setting a due date in the past", "titleUpdated": "Task title updated successfully", "titleUpdateError": "Failed to update task title", "contentUpdated": "Task content updated successfully", @@ -767,17 +769,26 @@ "projectClearError": "Failed to clear project", "priorityUpdated": "Priority updated successfully", "priorityUpdateError": "Failed to update priority", + "overview": "Overview", + "schedule": "Schedule", + "attachments": "Attachments", + "attachmentsComingSoon": "Attachments feature coming soon", + "activity": "Activity", + "lastUpdatedAt": "Last updated at", + "status": { + "notStarted": "Not started", + "inProgress": "In progress", + "done": "Done", + "archived": "Archived", + "waiting": "Waiting", + "setAsDone": "Set as done" + }, + "statusUpdated": "Status updated successfully", + "statusUpdateError": "Failed to update status", "deferUntil": "Defer Until", "noDeferUntil": "No defer until", "deferUntilUpdated": "Defer until updated successfully", - "deferUntilUpdateError": "Failed to update defer until", - "status": { - "notStarted": "not started", - "inProgress": "in progress", - "done": "completed", - "archived": "archived", - "unknown": "ongoing" - } + "deferUntilUpdateError": "Failed to update defer until" }, "subtasks": { "placeholder": "Add a subtask..." diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index ab0ad21..54a393b 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -511,7 +511,7 @@ "title": "Título", "description": "Descripción", "dueDate": "Fecha de Vencimiento", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioridad", "status": "Estado", "assignedTo": "Asignado a", @@ -542,7 +542,7 @@ "status": "Estado", "priority": "Prioridad", "dueDate": "Fecha de Vencimiento", - "deferUntil": "Defer until", + "deferUntil": "Aplazar hasta", "note": "Nota", "recurrenceType": "Repetir", "recurrenceInterval": "Cada", @@ -551,8 +551,7 @@ "weekOfMonth": "Semana del mes", "recurrenceEndDate": "Fecha de fin (opcional)", "completionBased": "Repetir después de completar", - "repeatOn": "Repetir en", - "deferUntil": "Aplazar hasta" + "repeatOn": "Repetir en" }, "projectSearchPlaceholder": "Buscar o crear un proyecto...", "noMatchingProjects": "No hay proyectos coincidentes", @@ -714,7 +713,9 @@ "inProgress": "en progreso", "done": "completado", "archived": "archivado", - "unknown": "en curso" + "unknown": "en curso", + "waiting": "Esperando", + "setAsDone": "Marcar como hecho" }, "noSubtasksClickToAdd": "No hay subtareas aún, haz clic para agregar", "project": "Proyecto", @@ -723,7 +724,7 @@ "noTags": "Sin etiquetas", "priority": "Prioridad", "dueDate": "Fecha de vencimiento", - "deferUntil": "Defer until", + "deferUntil": "Aplazar hasta", "recurringSetup": "Configuración recurrente", "notRecurring": "Esta tarea aún no es recurrente.", "clickToEditTitle": "Haz clic para editar el título", @@ -745,10 +746,19 @@ "includingToday": "incluyendo hoy", "has": "tiene", "fromProject": "del proyecto", - "deferUntil": "Aplazar hasta", "noDeferUntil": "No aplazar hasta", "deferUntilUpdated": "Aplazar hasta que se actualice correctamente", - "deferUntilUpdateError": "Error al actualizar el aplazamiento" + "deferUntilUpdateError": "Error al actualizar el aplazamiento", + "showOverdueWarning": "Mostrar advertencia de vencimiento", + "dueDateInPastWarning": "Advertencia: Estás estableciendo una fecha de vencimiento en el pasado", + "overview": "Resumen", + "schedule": "Programar", + "attachments": "Adjuntos", + "attachmentsComingSoon": "Función de adjuntos próximamente", + "activity": "Actividad", + "lastUpdatedAt": "Última actualización en", + "statusUpdated": "Estado actualizado con éxito", + "statusUpdateError": "Error al actualizar el estado" }, "dateIndicators": { "today": "HOY", @@ -928,7 +938,7 @@ "title": "Título", "status": "Estado", "dueDate": "Fecha de Vencimiento", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioridad", "project": "Proyecto", "area": "Área", @@ -1147,7 +1157,7 @@ "searchText": "Texto de Búsqueda", "priority": "Prioridad", "dueDate": "Fecha de Vencimiento", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "No se han establecido criterios específicos", "priorityLabel": "Prioridad:", "dueLabel": "Vence:", diff --git a/public/locales/fi/translation.json b/public/locales/fi/translation.json index ab61b4e..0ad7da0 100644 --- a/public/locales/fi/translation.json +++ b/public/locales/fi/translation.json @@ -420,7 +420,7 @@ "title": "Otsikko", "description": "Kuvaus", "dueDate": "Eräpäivä", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioriteetti", "status": "Tila", "assignedTo": "Määrätty", @@ -438,7 +438,7 @@ "status": "Tila", "priority": "Prioriteetti", "dueDate": "Eräpäivä", - "deferUntil": "Defer until", + "deferUntil": "Viivytä kunnes", "note": "Huomautus", "recurrenceType": "Toista", "recurrenceInterval": "Joka", @@ -447,8 +447,7 @@ "weekOfMonth": "Kuukauden viikko", "recurrenceEndDate": "Loppupäivämäärä (valinnainen)", "completionBased": "Toista valmistumisen jälkeen", - "repeatOn": "Toista", - "deferUntil": "Viivytä kunnes" + "repeatOn": "Toista" }, "projectSearchPlaceholder": "Etsi tai luo projekti...", "noMatchingProjects": "Ei vastaavia projekteja", @@ -750,7 +749,9 @@ "inProgress": "käynnissä", "done": "valmis", "archived": "arkistoitu", - "unknown": "käynnissä" + "unknown": "käynnissä", + "waiting": "Odottaa", + "setAsDone": "Merkitse valmiiksi" }, "noSubtasksClickToAdd": "Ei alitehtäviä vielä, napsauta lisätäksesi", "project": "Projekti", @@ -759,7 +760,7 @@ "noTags": "Ei tunnisteita", "priority": "Prioriteetti", "dueDate": "Eräpäivä", - "deferUntil": "Defer until", + "deferUntil": "Viivytä kunnes", "recurringSetup": "Toistuva asetukset", "notRecurring": "Tämä tehtävä ei ole vielä toistuva.", "clickToEditTitle": "Napsauta muokataksesi otsikkoa", @@ -781,10 +782,19 @@ "includingToday": "mukana tänään", "has": "on", "fromProject": "projektista", - "deferUntil": "Viivytä kunnes", "noDeferUntil": "Ei viivytystä ennen", "deferUntilUpdated": "Viivytä kunnes päivitys onnistuu", - "deferUntilUpdateError": "Viivytyksen päivittäminen epäonnistui" + "deferUntilUpdateError": "Viivytyksen päivittäminen epäonnistui", + "showOverdueWarning": "Näytä erääntynyt varoitus", + "dueDateInPastWarning": "Varoitus: Asetat eräpäivän menneisyyteen", + "overview": "Yhteenveto", + "schedule": "Aikataulu", + "attachments": "Liitteet", + "attachmentsComingSoon": "Liitteet-ominaisuus tulossa pian", + "activity": "Toiminta", + "lastUpdatedAt": "Viimeksi päivitetty", + "statusUpdated": "Tila päivitetty onnistuneesti", + "statusUpdateError": "Tilapäivitys epäonnistui" }, "projects": { "loading": "Ladataan projekteja...", @@ -944,7 +954,7 @@ "title": "Otsikko", "status": "Tila", "dueDate": "Eräpäivä", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioriteetti", "project": "Projekti", "area": "Alue", @@ -1146,7 +1156,7 @@ "searchText": "Hakuteksti", "priority": "Prioriteetti", "dueDate": "Eräpäivä", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Ei erityisiä kriteereitä asetettu", "priorityLabel": "Prioriteetti:", "dueLabel": "Eräpäivä:", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 7f65a3e..454c80b 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -420,7 +420,7 @@ "title": "Titre", "description": "Description", "dueDate": "Date d'échéance", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorité", "status": "Statut", "assignedTo": "Assigné à", @@ -438,7 +438,7 @@ "status": "Statut", "priority": "Priorité", "dueDate": "Date d'échéance", - "deferUntil": "Defer until", + "deferUntil": "Reporter jusqu'à", "note": "Note", "recurrenceType": "Répéter", "recurrenceInterval": "Chaque", @@ -447,8 +447,7 @@ "weekOfMonth": "Semaine du mois", "recurrenceEndDate": "Date de fin (optionnel)", "completionBased": "Répéter après achèvement", - "repeatOn": "Répéter le", - "deferUntil": "Reporter jusqu'à" + "repeatOn": "Répéter le" }, "projectSearchPlaceholder": "Rechercher ou créer un projet...", "noMatchingProjects": "Aucun projet correspondant", @@ -750,7 +749,9 @@ "inProgress": "en cours", "done": "terminé", "archived": "archivé", - "unknown": "en cours" + "unknown": "en cours", + "waiting": "En attente", + "setAsDone": "Marquer comme fait" }, "noSubtasksClickToAdd": "Pas encore de sous-tâches, cliquez pour ajouter", "project": "Projet", @@ -759,7 +760,7 @@ "noTags": "Pas d'étiquettes", "priority": "Priorité", "dueDate": "Date d'échéance", - "deferUntil": "Defer until", + "deferUntil": "Différer jusqu'à", "recurringSetup": "Configuration récurrente", "notRecurring": "Cette tâche n'est pas encore récurrente.", "clickToEditTitle": "Cliquez pour modifier le titre", @@ -781,10 +782,19 @@ "includingToday": "y compris aujourd'hui", "has": "a", "fromProject": "du projet", - "deferUntil": "Différer jusqu'à", "noDeferUntil": "Pas de différé jusqu'à", "deferUntilUpdated": "Différer jusqu'à mise à jour réussie", - "deferUntilUpdateError": "Échec de la mise à jour du différé jusqu'à" + "deferUntilUpdateError": "Échec de la mise à jour du différé jusqu'à", + "showOverdueWarning": "Afficher l'avertissement de retard", + "dueDateInPastWarning": "Avertissement : Vous définissez une date d'échéance dans le passé", + "overview": "Aperçu", + "schedule": "Calendrier", + "attachments": "Pièces jointes", + "attachmentsComingSoon": "Fonctionnalité des pièces jointes à venir", + "activity": "Activité", + "lastUpdatedAt": "Dernière mise à jour à", + "statusUpdated": "Statut mis à jour avec succès", + "statusUpdateError": "Échec de la mise à jour du statut" }, "projects": { "loading": "Chargement des projets...", @@ -944,7 +954,7 @@ "title": "Titre", "status": "Statut", "dueDate": "Date d'échéance", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorité", "project": "Projet", "area": "Zone", @@ -1146,7 +1156,7 @@ "searchText": "Texte de recherche", "priority": "Priorité", "dueDate": "Date d'échéance", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Aucun critère spécifique défini", "priorityLabel": "Priorité :", "dueLabel": "Échéance :", diff --git a/public/locales/id/translation.json b/public/locales/id/translation.json index eb38aa5..b987145 100644 --- a/public/locales/id/translation.json +++ b/public/locales/id/translation.json @@ -420,7 +420,7 @@ "title": "Judul", "description": "Deskripsi", "dueDate": "Tanggal Jatuh Tempo", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritas", "status": "Status", "assignedTo": "Ditetapkan Untuk", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioritas", "dueDate": "Tanggal Jatuh Tempo", - "deferUntil": "Defer until", + "deferUntil": "Tunda Hingga", "note": "Catatan", "recurrenceType": "Ulangi", "recurrenceInterval": "Setiap", @@ -447,8 +447,7 @@ "weekOfMonth": "Minggu dalam bulan", "recurrenceEndDate": "Tanggal akhir (opsional)", "completionBased": "Ulangi setelah penyelesaian", - "repeatOn": "Ulangi pada", - "deferUntil": "Tunda Hingga" + "repeatOn": "Ulangi pada" }, "projectSearchPlaceholder": "Cari atau buat proyek...", "noMatchingProjects": "Tidak ada proyek yang cocok", @@ -750,7 +749,9 @@ "inProgress": "sedang berlangsung", "done": "selesai", "archived": "diarsipkan", - "unknown": "berlangsung" + "unknown": "berlangsung", + "waiting": "Menunggu", + "setAsDone": "Tandai sebagai selesai" }, "noSubtasksClickToAdd": "Belum ada subtugas, klik untuk menambah", "project": "Proyek", @@ -759,7 +760,7 @@ "noTags": "Tidak ada tag", "priority": "Prioritas", "dueDate": "Tanggal Jatuh Tempo", - "deferUntil": "Defer until", + "deferUntil": "Tunda Hingga", "recurringSetup": "Pengaturan Berulang", "notRecurring": "Tugas ini belum berulang.", "clickToEditTitle": "Klik untuk mengedit judul", @@ -781,10 +782,19 @@ "includingToday": "termasuk hari ini", "has": "memiliki", "fromProject": "dari proyek", - "deferUntil": "Tunda Hingga", "noDeferUntil": "Tidak ada tunda hingga", "deferUntilUpdated": "Tunda hingga diperbarui dengan sukses", - "deferUntilUpdateError": "Gagal memperbarui tunda hingga" + "deferUntilUpdateError": "Gagal memperbarui tunda hingga", + "showOverdueWarning": "Tampilkan peringatan keterlambatan", + "dueDateInPastWarning": "Peringatan: Anda sedang menetapkan tanggal jatuh tempo di masa lalu", + "overview": "Ikhtisar", + "schedule": "Jadwal", + "attachments": "Lampiran", + "attachmentsComingSoon": "Fitur lampiran akan segera hadir", + "activity": "Aktivitas", + "lastUpdatedAt": "Terakhir diperbarui pada", + "statusUpdated": "Status berhasil diperbarui", + "statusUpdateError": "Gagal memperbarui status" }, "projects": { "loading": "Memuat proyek...", @@ -944,7 +954,7 @@ "title": "Judul", "status": "Status", "dueDate": "Tanggal Jatuh Tempo", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritas", "project": "Proyek", "area": "Area", @@ -1146,7 +1156,7 @@ "searchText": "Teks Pencarian", "priority": "Prioritas", "dueDate": "Tanggal Jatuh Tempo", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Tidak ada kriteria spesifik yang ditetapkan", "priorityLabel": "Prioritas:", "dueLabel": "Jatuh Tempo:", diff --git a/public/locales/it/translation.json b/public/locales/it/translation.json index 2cd85cf..bbdad23 100644 --- a/public/locales/it/translation.json +++ b/public/locales/it/translation.json @@ -420,7 +420,7 @@ "title": "Titolo", "description": "Descrizione", "dueDate": "Data di Scadenza", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorità", "status": "Stato", "assignedTo": "Assegnato a", @@ -438,7 +438,7 @@ "status": "Stato", "priority": "Priorità", "dueDate": "Data di Scadenza", - "deferUntil": "Defer until", + "deferUntil": "Rimanda fino a", "note": "Nota", "recurrenceType": "Ripeti", "recurrenceInterval": "Ogni", @@ -447,8 +447,7 @@ "weekOfMonth": "Settimana del mese", "recurrenceEndDate": "Data di fine (opzionale)", "completionBased": "Ripeti dopo il completamento", - "repeatOn": "Ripeti il", - "deferUntil": "Rimanda fino a" + "repeatOn": "Ripeti il" }, "projectSearchPlaceholder": "Cerca o crea un progetto...", "noMatchingProjects": "Nessun progetto corrispondente", @@ -750,7 +749,9 @@ "inProgress": "in corso", "done": "completato", "archived": "archiviato", - "unknown": "in corso" + "unknown": "in corso", + "waiting": "In attesa", + "setAsDone": "Segna come completato" }, "noSubtasksClickToAdd": "Nessuna sottocompito ancora, clicca per aggiungere", "project": "Progetto", @@ -759,7 +760,7 @@ "noTags": "Nessun tag", "priority": "Priorità", "dueDate": "Data di scadenza", - "deferUntil": "Defer until", + "deferUntil": "Rimanda fino a", "recurringSetup": "Impostazione ricorrente", "notRecurring": "Questo compito non è ancora ricorrente.", "clickToEditTitle": "Clicca per modificare il titolo", @@ -781,10 +782,19 @@ "includingToday": "incluso oggi", "has": "ha", "fromProject": "dal progetto", - "deferUntil": "Rimanda fino a", "noDeferUntil": "Nessun rimando fino a", "deferUntilUpdated": "Rimandato fino a aggiornato con successo", - "deferUntilUpdateError": "Impossibile aggiornare il rimando fino a" + "deferUntilUpdateError": "Impossibile aggiornare il rimando fino a", + "showOverdueWarning": "Mostra avviso di scadenza", + "dueDateInPastWarning": "Attenzione: Stai impostando una data di scadenza nel passato", + "overview": "Panoramica", + "schedule": "Pianificazione", + "attachments": "Allegati", + "attachmentsComingSoon": "La funzione allegati arriverà presto", + "activity": "Attività", + "lastUpdatedAt": "Ultimo aggiornamento il", + "statusUpdated": "Stato aggiornato con successo", + "statusUpdateError": "Aggiornamento dello stato non riuscito" }, "projects": { "loading": "Caricamento progetti...", @@ -944,7 +954,7 @@ "title": "Titolo", "status": "Stato", "dueDate": "Data di Scadenza", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorità", "project": "Progetto", "area": "Area", @@ -1146,7 +1156,7 @@ "searchText": "Testo di Ricerca", "priority": "Priorità", "dueDate": "Data di Scadenza", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Nessun criterio specifico impostato", "priorityLabel": "Priorità:", "dueLabel": "Scadenza:", diff --git a/public/locales/jp/translation.json b/public/locales/jp/translation.json index e5391c6..df46d80 100644 --- a/public/locales/jp/translation.json +++ b/public/locales/jp/translation.json @@ -403,7 +403,7 @@ "title": "タイトル", "description": "説明", "dueDate": "期限", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "優先度", "status": "状態", "assignedTo": "担当者", @@ -431,10 +431,9 @@ "status": "ステータス", "priority": "優先度", "dueDate": "期限日", - "deferUntil": "Defer until", + "deferUntil": "延期するまで", "note": "ノート", - "repeatOn": "繰り返し", - "deferUntil": "延期するまで" + "repeatOn": "繰り返し" }, "recurrenceSettings": "繰り返し設定", "completionBasedHelp": "チェックすると、次のタスクは期限日ではなく完了日に基づいて作成されます", @@ -819,7 +818,9 @@ "inProgress": "進行中", "done": "完了", "archived": "アーカイブ済み", - "unknown": "進行中" + "unknown": "進行中", + "waiting": "待機中", + "setAsDone": "完了として設定" }, "noSubtasksClickToAdd": "まだサブタスクはありません。クリックして追加", "project": "プロジェクト", @@ -828,7 +829,7 @@ "noTags": "タグがありません", "priority": "優先度", "dueDate": "期限日", - "deferUntil": "Defer until", + "deferUntil": "延期するまで", "recurringSetup": "繰り返し設定", "notRecurring": "このタスクはまだ繰り返しではありません。", "clickToEditTitle": "タイトルを編集するにはクリック", @@ -850,10 +851,19 @@ "includingToday": "今日を含む", "has": "持っている", "fromProject": "プロジェクトから", - "deferUntil": "延期するまで", "noDeferUntil": "延期なし", "deferUntilUpdated": "正常に延期が更新されました", - "deferUntilUpdateError": "延期の更新に失敗しました" + "deferUntilUpdateError": "延期の更新に失敗しました", + "showOverdueWarning": "期限超過警告を表示", + "dueDateInPastWarning": "警告: 過去の日付を期限に設定しています", + "overview": "概要", + "schedule": "スケジュール", + "attachments": "添付ファイル", + "attachmentsComingSoon": "添付ファイル機能が近日登場", + "activity": "アクティビティ", + "lastUpdatedAt": "最終更新日時", + "statusUpdated": "ステータスが正常に更新されました", + "statusUpdateError": "ステータスの更新に失敗しました" }, "calendar": { "month": "月", @@ -884,7 +894,7 @@ "title": "タイトル", "status": "ステータス", "dueDate": "期限", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "優先度", "project": "プロジェクト", "area": "エリア", @@ -1146,7 +1156,7 @@ "searchText": "検索テキスト", "priority": "優先度", "dueDate": "期限", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "特定の条件は設定されていません", "priorityLabel": "優先度:", "dueLabel": "期限:", diff --git a/public/locales/ko/translation.json b/public/locales/ko/translation.json index 5ad1b7d..0a2c962 100644 --- a/public/locales/ko/translation.json +++ b/public/locales/ko/translation.json @@ -420,7 +420,7 @@ "title": "제목", "description": "설명", "dueDate": "마감일", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "우선순위", "status": "상태", "assignedTo": "담당자", @@ -438,7 +438,7 @@ "status": "상태", "priority": "우선 순위", "dueDate": "마감일", - "deferUntil": "Defer until", + "deferUntil": "연기할 때까지", "note": "메모", "recurrenceType": "반복", "recurrenceInterval": "매", @@ -447,8 +447,7 @@ "weekOfMonth": "월의 주", "recurrenceEndDate": "종료일 (선택 사항)", "completionBased": "완료 후 반복", - "repeatOn": "반복", - "deferUntil": "연기할 때까지" + "repeatOn": "반복" }, "projectSearchPlaceholder": "프로젝트 검색 또는 생성...", "noMatchingProjects": "일치하는 프로젝트가 없습니다", @@ -750,7 +749,9 @@ "inProgress": "진행 중", "done": "완료됨", "archived": "보관됨", - "unknown": "진행 중" + "unknown": "진행 중", + "waiting": "대기 중", + "setAsDone": "완료로 설정" }, "noSubtasksClickToAdd": "아직 하위 작업이 없습니다. 클릭하여 추가하세요", "project": "프로젝트", @@ -759,7 +760,7 @@ "noTags": "태그가 없습니다", "priority": "우선순위", "dueDate": "마감일", - "deferUntil": "Defer until", + "deferUntil": "연기할 때까지", "noDueDate": "마감일이 없습니다", "recurringSetup": "반복 설정", "notRecurring": "이 작업은 아직 반복되지 않습니다.", @@ -781,10 +782,19 @@ "includingToday": "오늘 포함", "has": "있음", "fromProject": "프로젝트에서", - "deferUntil": "연기할 때까지", "noDeferUntil": "연기할 때까지 없음", "deferUntilUpdated": "연기할 때까지 성공적으로 업데이트됨", - "deferUntilUpdateError": "연기할 때까지 업데이트 실패" + "deferUntilUpdateError": "연기할 때까지 업데이트 실패", + "showOverdueWarning": "연체 경고 표시", + "dueDateInPastWarning": "경고: 과거의 기한을 설정하고 있습니다", + "overview": "개요", + "schedule": "일정", + "attachments": "첨부파일", + "attachmentsComingSoon": "첨부파일 기능이 곧 제공됩니다", + "activity": "활동", + "lastUpdatedAt": "마지막 업데이트 시각", + "statusUpdated": "상태가 성공적으로 업데이트되었습니다", + "statusUpdateError": "상태 업데이트에 실패했습니다" }, "projects": { "loading": "프로젝트 로딩 중...", @@ -944,7 +954,7 @@ "title": "제목", "status": "상태", "dueDate": "마감일", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "우선순위", "project": "프로젝트", "area": "영역", @@ -1146,7 +1156,7 @@ "searchText": "검색 텍스트", "priority": "우선순위", "dueDate": "마감일", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "특정 기준이 설정되지 않음", "priorityLabel": "우선순위:", "dueLabel": "마감:", diff --git a/public/locales/nl/translation.json b/public/locales/nl/translation.json index 94e5c04..955d9af 100644 --- a/public/locales/nl/translation.json +++ b/public/locales/nl/translation.json @@ -420,7 +420,7 @@ "title": "Titel", "description": "Beschrijving", "dueDate": "Vervaldatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioriteit", "status": "Status", "assignedTo": "Toegewezen Aan", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioriteit", "dueDate": "Vervaldatum", - "deferUntil": "Defer until", + "deferUntil": "Uitstellen Tot", "note": "Opmerking", "recurrenceType": "Herhaal", "recurrenceInterval": "Elke", @@ -447,8 +447,7 @@ "weekOfMonth": "Week van de maand", "recurrenceEndDate": "Einddatum (optioneel)", "completionBased": "Herhaal na voltooiing", - "repeatOn": "Herhaal op", - "deferUntil": "Uitstellen Tot" + "repeatOn": "Herhaal op" }, "projectSearchPlaceholder": "Zoek of maak een project...", "noMatchingProjects": "Geen overeenkomende projecten", @@ -750,7 +749,9 @@ "inProgress": "bezig", "done": "voltooid", "archived": "gearchiveerd", - "unknown": "lopende" + "unknown": "lopende", + "waiting": "Wachten", + "setAsDone": "Markeer als voltooid" }, "noSubtasksClickToAdd": "Nog geen subtaken, klik om toe te voegen", "project": "Project", @@ -759,7 +760,7 @@ "noTags": "Geen tags", "priority": "Prioriteit", "dueDate": "Vervaldatum", - "deferUntil": "Defer until", + "deferUntil": "Uitstellen Tot", "noDueDate": "Geen vervaldatum", "recurringSetup": "Terugkerende instellingen", "notRecurring": "Deze taak is nog niet terugkerend.", @@ -781,10 +782,19 @@ "includingToday": "inclusief vandaag", "has": "heeft", "fromProject": "van het project", - "deferUntil": "Uitstellen Tot", "noDeferUntil": "Geen uitstel tot", "deferUntilUpdated": "Uitstel tot succesvol bijgewerkt", - "deferUntilUpdateError": "Bijwerken van uitstel tot is mislukt" + "deferUntilUpdateError": "Bijwerken van uitstel tot is mislukt", + "showOverdueWarning": "Toon waarschuwing voor achterstallige taken", + "dueDateInPastWarning": "Waarschuwing: U stelt een vervaldatum in het verleden in", + "overview": "Overzicht", + "schedule": "Schema", + "attachments": "Bijlagen", + "attachmentsComingSoon": "Bijlagenfunctie komt binnenkort", + "activity": "Activiteit", + "lastUpdatedAt": "Laatst bijgewerkt op", + "statusUpdated": "Status succesvol bijgewerkt", + "statusUpdateError": "Status bijwerken mislukt" }, "projects": { "loading": "Projecten laden...", @@ -944,7 +954,7 @@ "title": "Titel", "status": "Status", "dueDate": "Vervaldatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioriteit", "project": "Project", "area": "Gebied", @@ -1146,7 +1156,7 @@ "searchText": "Zoektekst", "priority": "Prioriteit", "dueDate": "Vervaldatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Geen specifieke criteria ingesteld", "priorityLabel": "Prioriteit:", "dueLabel": "Vervaldatum:", diff --git a/public/locales/no/translation.json b/public/locales/no/translation.json index 61f7a7e..e483c35 100644 --- a/public/locales/no/translation.json +++ b/public/locales/no/translation.json @@ -420,7 +420,7 @@ "title": "Tittel", "description": "Beskrivelse", "dueDate": "Forfallsdato", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritet", "status": "Status", "assignedTo": "Tildelt Til", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioritet", "dueDate": "Forfallsdato", - "deferUntil": "Defer until", + "deferUntil": "Utsett til", "note": "Merk", "recurrenceType": "Gjenta", "recurrenceInterval": "Hver", @@ -447,8 +447,7 @@ "weekOfMonth": "Uke i måneden", "recurrenceEndDate": "Sluttdato (valgfritt)", "completionBased": "Gjenta etter fullføring", - "repeatOn": "Gjenta på", - "deferUntil": "Utsett til" + "repeatOn": "Gjenta på" }, "projectSearchPlaceholder": "Søk eller opprett et prosjekt...", "noMatchingProjects": "Ingen matchende prosjekter", @@ -721,7 +720,7 @@ "tags": "Merker", "priority": "Prioritet", "dueDate": "Forfallsdato", - "deferUntil": "Defer until", + "deferUntil": "Utsett til", "recurringSetup": "Gjentakende oppsett", "thisTask": "Denne oppgaven", "is": "er", @@ -756,7 +755,9 @@ "inProgress": "pågår", "done": "fullført", "archived": "arkivert", - "unknown": "pågående" + "unknown": "pågående", + "waiting": "Venter", + "setAsDone": "Sett som fullført" }, "noSubtasksClickToAdd": "Ingen deloppgaver ennå, klikk for å legge til", "noProject": "Ingen prosjekt - Klikk for å tildele", @@ -781,10 +782,19 @@ "includingToday": "inkludert i dag", "has": "har", "fromProject": "fra prosjektet", - "deferUntil": "Utsett til", "noDeferUntil": "Ingen utsettelse til", "deferUntilUpdated": "Utsettelse oppdatert vellykket", - "deferUntilUpdateError": "Kunne ikke oppdatere utsettelse" + "deferUntilUpdateError": "Kunne ikke oppdatere utsettelse", + "showOverdueWarning": "Vis advarsel for forfalt", + "dueDateInPastWarning": "Advarsel: Du setter en forfallsdato i fortiden", + "overview": "Oversikt", + "schedule": "Plan", + "attachments": "Vedlegg", + "attachmentsComingSoon": "Vedleggsfunksjonen kommer snart", + "activity": "Aktivitet", + "lastUpdatedAt": "Sist oppdatert kl", + "statusUpdated": "Status oppdatert med suksess", + "statusUpdateError": "Feil ved oppdatering av status" }, "projects": { "loading": "Laster prosjekter...", @@ -944,7 +954,7 @@ "title": "Tittel", "status": "Status", "dueDate": "Forfallsdato", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritet", "project": "Prosjekt", "area": "Område", @@ -1146,7 +1156,7 @@ "searchText": "Søk Tekst", "priority": "Prioritet", "dueDate": "Forfallsdato", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Ingen spesifikke kriterier satt", "priorityLabel": "Prioritet:", "dueLabel": "Forfall:", diff --git a/public/locales/pl/translation.json b/public/locales/pl/translation.json index 759c85d..7b3f758 100644 --- a/public/locales/pl/translation.json +++ b/public/locales/pl/translation.json @@ -420,7 +420,7 @@ "title": "Tytuł", "description": "Opis", "dueDate": "Termin", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorytet", "status": "Status", "assignedTo": "Przydzielone do", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Priorytet", "dueDate": "Termin", - "deferUntil": "Defer until", + "deferUntil": "Odłóż do", "note": "Notatka", "recurrenceType": "Powtórz", "recurrenceInterval": "Co", @@ -447,8 +447,7 @@ "weekOfMonth": "Tydzień miesiąca", "recurrenceEndDate": "Data zakończenia (opcjonalnie)", "completionBased": "Powtórz po zakończeniu", - "repeatOn": "Powtarzaj w", - "deferUntil": "Odłóż do" + "repeatOn": "Powtarzaj w" }, "projectSearchPlaceholder": "Szukaj lub utwórz projekt...", "noMatchingProjects": "Brak pasujących projektów", @@ -723,7 +722,7 @@ "noTags": "Brak tagów", "priority": "Priorytet", "dueDate": "Termin", - "deferUntil": "Defer until", + "deferUntil": "Odłóż do", "recurringSetup": "Ustawienia powtarzalności", "notRecurring": "To zadanie jeszcze nie jest powtarzalne.", "clickToEditTitle": "Kliknij, aby edytować tytuł", @@ -772,7 +771,9 @@ "inProgress": "w trakcie", "done": "ukończone", "archived": "zarchiwizowane", - "unknown": "w toku" + "unknown": "w toku", + "waiting": "Oczekiwanie", + "setAsDone": "Oznacz jako zrobione" }, "noSubtasksClickToAdd": "Brak podzadań, kliknij, aby dodać", "noDueDate": "Brak daty wykonania", @@ -781,10 +782,19 @@ "includingToday": "w tym dzisiaj", "has": "ma", "fromProject": "z projektu", - "deferUntil": "Odłóż do", "noDeferUntil": "Brak odłożenia do", "deferUntilUpdated": "Odłożono do zaktualizowania pomyślnie", - "deferUntilUpdateError": "Nie udało się zaktualizować odłożenia do" + "deferUntilUpdateError": "Nie udało się zaktualizować odłożenia do", + "showOverdueWarning": "Pokaż ostrzeżenie o przeterminowaniu", + "dueDateInPastWarning": "Ostrzeżenie: Ustawiasz datę wymagalności w przeszłości", + "overview": "Przegląd", + "schedule": "Harmonogram", + "attachments": "Załączniki", + "attachmentsComingSoon": "Funkcja załączników wkrótce dostępna", + "activity": "Aktywność", + "lastUpdatedAt": "Ostatnia aktualizacja o", + "statusUpdated": "Status zaktualizowany pomyślnie", + "statusUpdateError": "Nie udało się zaktualizować statusu" }, "projects": { "loading": "Ładowanie projektów...", @@ -944,7 +954,7 @@ "title": "Tytuł", "status": "Status", "dueDate": "Termin", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Priorytet", "project": "Projekt", "area": "Obszar", @@ -1146,7 +1156,7 @@ "searchText": "Tekst Wyszukiwania", "priority": "Priorytet", "dueDate": "Termin", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Nie ustawiono konkretnych kryteriów", "priorityLabel": "Priorytet:", "dueLabel": "Termin:", diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 37e8e92..6d94fb1 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -420,7 +420,7 @@ "title": "Título", "description": "Descrição", "dueDate": "Data de Vencimento", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioridade", "status": "Status", "assignedTo": "Atribuído A", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioridade", "dueDate": "Data de Vencimento", - "deferUntil": "Defer until", + "deferUntil": "Adiar até", "note": "Nota", "recurrenceType": "Repetir", "recurrenceInterval": "A cada", @@ -447,8 +447,7 @@ "weekOfMonth": "Semana do mês", "recurrenceEndDate": "Data de término (opcional)", "completionBased": "Repetir após conclusão", - "repeatOn": "Repetir em", - "deferUntil": "Adiar até" + "repeatOn": "Repetir em" }, "projectSearchPlaceholder": "Pesquisar ou criar um projeto...", "noMatchingProjects": "Nenhum projeto correspondente", @@ -723,7 +722,7 @@ "noTags": "Sem tags", "priority": "Prioridade", "dueDate": "Data de Vencimento", - "deferUntil": "Defer until", + "deferUntil": "Adiar até", "recurringSetup": "Configuração Recorrente", "notRecurring": "Esta tarefa ainda não é recorrente.", "clickToEditTitle": "Clique para editar o título", @@ -772,7 +771,9 @@ "inProgress": "em progresso", "done": "completo", "archived": "arquivado", - "unknown": "em andamento" + "unknown": "em andamento", + "waiting": "Aguardando", + "setAsDone": "Marcar como concluído" }, "noSubtasksClickToAdd": "Nenhuma subtarefa ainda, clique para adicionar", "noDueDate": "Sem data de vencimento", @@ -781,10 +782,19 @@ "includingToday": "incluindo hoje", "has": "tem", "fromProject": "do projeto", - "deferUntil": "Adiar até", "noDeferUntil": "Sem adiamento até", "deferUntilUpdated": "Adiado até atualizado com sucesso", - "deferUntilUpdateError": "Falha ao atualizar o adiamento até" + "deferUntilUpdateError": "Falha ao atualizar o adiamento até", + "showOverdueWarning": "Mostrar aviso de atraso", + "dueDateInPastWarning": "Aviso: Você está definindo uma data de vencimento no passado", + "overview": "Visão geral", + "schedule": "Agenda", + "attachments": "Anexos", + "attachmentsComingSoon": "Recurso de anexos em breve", + "activity": "Atividade", + "lastUpdatedAt": "Última atualização em", + "statusUpdated": "Status atualizado com sucesso", + "statusUpdateError": "Falha ao atualizar o status" }, "projects": { "loading": "Carregando projetos...", @@ -944,7 +954,7 @@ "title": "Título", "status": "Status", "dueDate": "Data de Vencimento", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioridade", "project": "Projeto", "area": "Área", @@ -1146,7 +1156,7 @@ "searchText": "Texto de Pesquisa", "priority": "Prioridade", "dueDate": "Data de Vencimento", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Nenhum critério específico definido", "priorityLabel": "Prioridade:", "dueLabel": "Vencimento:", diff --git a/public/locales/ro/translation.json b/public/locales/ro/translation.json index a09f53c..b2b1218 100644 --- a/public/locales/ro/translation.json +++ b/public/locales/ro/translation.json @@ -420,7 +420,7 @@ "title": "Titlu", "description": "Descriere", "dueDate": "Data Limită", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritate", "status": "Stare", "assignedTo": "Atribuit Către", @@ -438,7 +438,7 @@ "status": "Stare", "priority": "Prioritate", "dueDate": "Data limită", - "deferUntil": "Defer until", + "deferUntil": "Amână până la", "note": "Notă", "recurrenceType": "Repetare", "recurrenceInterval": "Fiecare", @@ -447,8 +447,7 @@ "weekOfMonth": "Săptămâna lunii", "recurrenceEndDate": "Data de sfârșit (opțional)", "completionBased": "Repetare după finalizare", - "repeatOn": "Repetă pe", - "deferUntil": "Amână până la" + "repeatOn": "Repetă pe" }, "projectSearchPlaceholder": "Caută sau creează un proiect...", "noMatchingProjects": "Niciun proiect corespunzător", @@ -723,7 +722,7 @@ "noTags": "Niciună etichetă", "priority": "Prioritate", "dueDate": "Data limită", - "deferUntil": "Defer until", + "deferUntil": "Amână până la", "recurringSetup": "Configurare recurentă", "notRecurring": "Această sarcină nu este încă recurentă.", "clickToEditTitle": "Fă clic pentru a edita titlul", @@ -772,7 +771,9 @@ "inProgress": "în desfășurare", "done": "finalizat", "archived": "archivat", - "unknown": "în desfășurare" + "unknown": "în desfășurare", + "waiting": "Așteptare", + "setAsDone": "Marchează ca finalizat" }, "noSubtasksClickToAdd": "Nu există subtasks încă, dă click pentru a adăuga", "noDueDate": "Fără dată limită", @@ -781,10 +782,19 @@ "includingToday": "inclusiv astăzi", "has": "are", "fromProject": "din proiect", - "deferUntil": "Amână până la", "noDeferUntil": "Nicio amânare până la", "deferUntilUpdated": "Amânare până la actualizare cu succes", - "deferUntilUpdateError": "Actualizarea amânării până la a eșuat" + "deferUntilUpdateError": "Actualizarea amânării până la a eșuat", + "showOverdueWarning": "Afișează avertismentul de întârziere", + "dueDateInPastWarning": "Avertisment: Setezi o dată limită în trecut", + "overview": "Prezentare generală", + "schedule": "Program", + "attachments": "Atașamente", + "attachmentsComingSoon": "Funcția de atașamente va fi disponibilă în curând", + "activity": "Activitate", + "lastUpdatedAt": "Ultima actualizare la", + "statusUpdated": "Starea a fost actualizată cu succes", + "statusUpdateError": "Actualizarea stării a eșuat" }, "projects": { "loading": "Se încarcă proiectele...", @@ -944,7 +954,7 @@ "title": "Titlu", "status": "Stare", "dueDate": "Data Limită", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritate", "project": "Proiect", "area": "Domeniu", @@ -1146,7 +1156,7 @@ "searchText": "Text de căutare", "priority": "Prioritate", "dueDate": "Data limită", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Niciun criteriu specific setat", "priorityLabel": "Prioritate:", "dueLabel": "Termen:", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index 74dc22d..fbdabbb 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -420,7 +420,7 @@ "title": "Название", "description": "Описание", "dueDate": "Срок выполнения", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Приоритет", "status": "Статус", "assignedTo": "Назначено на", @@ -438,7 +438,7 @@ "status": "Статус", "priority": "Приоритет", "dueDate": "Срок выполнения", - "deferUntil": "Defer until", + "deferUntil": "Отложить до", "note": "Заметка", "recurrenceType": "Повторять", "recurrenceInterval": "Каждый", @@ -447,8 +447,7 @@ "weekOfMonth": "Неделя месяца", "recurrenceEndDate": "Дата окончания (необязательно)", "completionBased": "Повторять после завершения", - "repeatOn": "Повторять в", - "deferUntil": "Отложить до" + "repeatOn": "Повторять в" }, "projectSearchPlaceholder": "Поиск или создание проекта...", "noMatchingProjects": "Нет подходящих проектов", @@ -724,7 +723,7 @@ "noTags": "Нет тегов", "priority": "Приоритет", "dueDate": "Срок выполнения", - "deferUntil": "Defer until", + "deferUntil": "Отложить до", "recurringSetup": "Настройка повторения", "notRecurring": "Эта задача пока не является повторяющейся.", "clickToEditTitle": "Нажмите, чтобы редактировать заголовок", @@ -773,7 +772,9 @@ "inProgress": "в процессе", "done": "завершено", "archived": "архивировано", - "unknown": "в процессе" + "unknown": "в процессе", + "waiting": "Ожидание", + "setAsDone": "Установить как выполнено" }, "noDueDate": "Нет срока выполнения", "instanceOf": "Это экземпляр повторяющейся задачи", @@ -781,10 +782,19 @@ "includingToday": "включая сегодня", "has": "имеет", "fromProject": "из проекта", - "deferUntil": "Отложить до", "noDeferUntil": "Нет отложения до", "deferUntilUpdated": "Отложено до обновления успешно", - "deferUntilUpdateError": "Не удалось обновить отложение до" + "deferUntilUpdateError": "Не удалось обновить отложение до", + "showOverdueWarning": "Показать предупреждение о просрочке", + "dueDateInPastWarning": "Предупреждение: Вы устанавливаете срок в прошлом", + "overview": "Обзор", + "schedule": "Расписание", + "attachments": "Вложения", + "attachmentsComingSoon": "Функция вложений скоро появится", + "activity": "Активность", + "lastUpdatedAt": "Последнее обновление в", + "statusUpdated": "Статус успешно обновлён", + "statusUpdateError": "Не удалось обновить статус" }, "projects": { "loading": "Загрузка проектов...", @@ -944,7 +954,7 @@ "title": "Название", "status": "Статус", "dueDate": "Срок выполнения", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Приоритет", "project": "Проект", "area": "Область", @@ -1146,7 +1156,7 @@ "searchText": "Текст поиска", "priority": "Приоритет", "dueDate": "Срок выполнения", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Не установлены конкретные критерии", "priorityLabel": "Приоритет:", "dueLabel": "Срок:", diff --git a/public/locales/sl/translation.json b/public/locales/sl/translation.json index 21432bf..6bb727f 100644 --- a/public/locales/sl/translation.json +++ b/public/locales/sl/translation.json @@ -420,7 +420,7 @@ "title": "Naslov", "description": "Opis", "dueDate": "Rok", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioriteta", "status": "Status", "assignedTo": "Dodeljeno", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioriteta", "dueDate": "Rok", - "deferUntil": "Defer until", + "deferUntil": "Odmik do", "note": "Opomba", "recurrenceType": "Ponovi", "recurrenceInterval": "Vsak", @@ -447,8 +447,7 @@ "weekOfMonth": "Teden v mesecu", "recurrenceEndDate": "Datum konca (neobvezno)", "completionBased": "Ponovi po zaključku", - "repeatOn": "Ponovi na", - "deferUntil": "Odmik do" + "repeatOn": "Ponovi na" }, "projectSearchPlaceholder": "Išči ali ustvari projekt...", "noMatchingProjects": "Brez ustreznih projektov", @@ -724,7 +723,7 @@ "noTags": "Brez oznak", "priority": "Prioriteta", "dueDate": "Rok", - "deferUntil": "Defer until", + "deferUntil": "Odmik do", "recurringSetup": "Nastavitev ponavljanja", "notRecurring": "Ta naloga še ni ponavljajoča.", "clickToEditTitle": "Kliknite za urejanje naslova", @@ -773,7 +772,9 @@ "inProgress": "v teku", "done": "zaključeno", "archived": "arhivirano", - "unknown": "poteka" + "unknown": "poteka", + "waiting": "Čaka", + "setAsDone": "Označi kot opravljeno" }, "noDueDate": "Brez roka", "instanceOf": "To je instanca ponavljajoče se naloge", @@ -781,10 +782,19 @@ "includingToday": "vključno s danes", "has": "ima", "fromProject": "iz projekta", - "deferUntil": "Odmik do", "noDeferUntil": "Brez odloga do", "deferUntilUpdated": "Odmik do uspešno posodobljen", - "deferUntilUpdateError": "Posodobitev odloga do ni uspela" + "deferUntilUpdateError": "Posodobitev odloga do ni uspela", + "showOverdueWarning": "Prikaži opozorilo o zamudi", + "dueDateInPastWarning": "Opozorilo: Nastavljate datum zapadlosti v preteklosti", + "overview": "Pregled", + "schedule": "Razpored", + "attachments": "Priloge", + "attachmentsComingSoon": "Funkcija prilog kmalu na voljo", + "activity": "Dejavnost", + "lastUpdatedAt": "Zadnja posodobitev ob", + "statusUpdated": "Status uspešno posodobljen", + "statusUpdateError": "Posodobitev statusa ni uspela" }, "projects": { "loading": "Nalagam projekte...", @@ -944,7 +954,7 @@ "title": "Naslov", "status": "Status", "dueDate": "Rok", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioriteta", "project": "Projekt", "area": "Območje", @@ -1146,7 +1156,7 @@ "searchText": "Iskalno besedilo", "priority": "Prioriteta", "dueDate": "Rok", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Nobena specifična merila niso nastavljena", "priorityLabel": "Prioriteta:", "dueLabel": "Rok:", diff --git a/public/locales/sv/translation.json b/public/locales/sv/translation.json index e5199e3..4802a23 100644 --- a/public/locales/sv/translation.json +++ b/public/locales/sv/translation.json @@ -420,7 +420,7 @@ "title": "Titel", "description": "Beskrivning", "dueDate": "Förfallodatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritet", "status": "Status", "assignedTo": "Tilldelad till", @@ -438,7 +438,7 @@ "status": "Status", "priority": "Prioritet", "dueDate": "Förfallodatum", - "deferUntil": "Defer until", + "deferUntil": "Skjut upp till", "note": "Anteckning", "recurrenceType": "Upprepa", "recurrenceInterval": "Varje", @@ -447,8 +447,7 @@ "weekOfMonth": "Vecka i månaden", "recurrenceEndDate": "Slutdatum (valfritt)", "completionBased": "Upprepa efter slutförd", - "repeatOn": "Upprepa på", - "deferUntil": "Skjut upp till" + "repeatOn": "Upprepa på" }, "projectSearchPlaceholder": "Sök eller skapa ett projekt...", "noMatchingProjects": "Inga matchande projekt", @@ -724,7 +723,7 @@ "noTags": "Inga taggar", "priority": "Prioritet", "dueDate": "Förfallodatum", - "deferUntil": "Defer until", + "deferUntil": "Skjut upp till", "recurringSetup": "Återkommande inställning", "notRecurring": "Denna uppgift är inte återkommande ännu.", "clickToEditTitle": "Klicka för att redigera titel", @@ -773,7 +772,9 @@ "inProgress": "pågående", "done": "avslutad", "archived": "arkiverad", - "unknown": "pågår" + "unknown": "pågår", + "waiting": "Väntar", + "setAsDone": "Markera som klar" }, "noDueDate": "Ingen förfallodatum", "instanceOf": "Detta är en instans av en återkommande uppgift", @@ -781,10 +782,19 @@ "includingToday": "inklusive idag", "has": "har", "fromProject": "från projektet", - "deferUntil": "Skjut upp till", "noDeferUntil": "Ingen uppskjutning", "deferUntilUpdated": "Uppskjutning uppdaterad framgångsrikt", - "deferUntilUpdateError": "Misslyckades med att uppdatera uppskjutning" + "deferUntilUpdateError": "Misslyckades med att uppdatera uppskjutning", + "showOverdueWarning": "Visa försenad varning", + "dueDateInPastWarning": "Varning: Du sätter ett förfallodatum i det förflutna", + "overview": "Översikt", + "schedule": "Schema", + "attachments": "Bifogade filer", + "attachmentsComingSoon": "Funktionen för bifogade filer kommer snart", + "activity": "Aktivitet", + "lastUpdatedAt": "Senast uppdaterad kl", + "statusUpdated": "Status uppdaterad framgångsrikt", + "statusUpdateError": "Misslyckades med att uppdatera status" }, "projects": { "loading": "Laddar projekt...", @@ -944,7 +954,7 @@ "title": "Titel", "status": "Status", "dueDate": "Förfallodatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Prioritet", "project": "Projekt", "area": "Område", @@ -1146,7 +1156,7 @@ "searchText": "Söktext", "priority": "Prioritet", "dueDate": "Förfallodatum", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Inga specifika kriterier angivna", "priorityLabel": "Prioritet:", "dueLabel": "Förfall:", diff --git a/public/locales/tr/translation.json b/public/locales/tr/translation.json index 1df636a..e83a584 100644 --- a/public/locales/tr/translation.json +++ b/public/locales/tr/translation.json @@ -420,7 +420,7 @@ "title": "Başlık", "description": "Açıklama", "dueDate": "Son Tarih", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Öncelik", "status": "Durum", "assignedTo": "Atanan", @@ -438,7 +438,7 @@ "status": "Durum", "priority": "Öncelik", "dueDate": "Son Tarih", - "deferUntil": "Defer until", + "deferUntil": "Erteleme Tarihi", "note": "Not", "recurrenceType": "Tekrar", "recurrenceInterval": "Her", @@ -447,8 +447,7 @@ "weekOfMonth": "Ayın Haftası", "recurrenceEndDate": "Bitiş tarihi (isteğe bağlı)", "completionBased": "Tamamlandıktan sonra tekrar et", - "repeatOn": "Şu tarihlerde tekrar et", - "deferUntil": "Erteleme Tarihi" + "repeatOn": "Şu tarihlerde tekrar et" }, "projectSearchPlaceholder": "Proje ara veya oluştur...", "noMatchingProjects": "Eşleşen proje yok", @@ -724,7 +723,7 @@ "noTags": "Etiket yok", "priority": "Öncelik", "dueDate": "Son Tarih", - "deferUntil": "Defer until", + "deferUntil": "Erteleme Tarihi", "recurringSetup": "Tekrarlayan Ayar", "notRecurring": "Bu görev henüz tekrarlanmıyor.", "clickToEditTitle": "Başlığı düzenlemek için tıklayın", @@ -773,7 +772,9 @@ "inProgress": "devam ediyor", "done": "tamamlandı", "archived": "arşivlendi", - "unknown": "süreçte" + "unknown": "süreçte", + "waiting": "Bekliyor", + "setAsDone": "Tamamlandı olarak ayarla" }, "noDueDate": "Son tarih yok", "instanceOf": "Bu, tekrarlayan bir görevin bir örneğidir", @@ -781,10 +782,19 @@ "includingToday": "bugün dahil", "has": "var", "fromProject": "projeden", - "deferUntil": "Erteleme Tarihi", "noDeferUntil": "Erteleme yok", "deferUntilUpdated": "Başarıyla erteleme tarihi güncellendi", - "deferUntilUpdateError": "Erteleme tarihini güncelleme başarısız oldu" + "deferUntilUpdateError": "Erteleme tarihini güncelleme başarısız oldu", + "showOverdueWarning": "Geçmiş tarih uyarısını göster", + "dueDateInPastWarning": "Uyarı: Geçmişte bir son tarih belirliyorsunuz", + "overview": "Genel Bakış", + "schedule": "Program", + "attachments": "Ekler", + "attachmentsComingSoon": "Ekler özelliği yakında geliyor", + "activity": "Etkinlik", + "lastUpdatedAt": "Son güncelleme zamanı", + "statusUpdated": "Durum başarıyla güncellendi", + "statusUpdateError": "Durum güncellenemedi" }, "projects": { "loading": "Projeler yükleniyor...", @@ -944,7 +954,7 @@ "title": "Başlık", "status": "Durum", "dueDate": "Son Tarih", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Öncelik", "project": "Proje", "area": "Alan", @@ -1146,7 +1156,7 @@ "searchText": "Arama Metni", "priority": "Öncelik", "dueDate": "Son Tarih", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Belirli bir kriter ayarlanmamış", "priorityLabel": "Öncelik:", "dueLabel": "Son Tarih:", diff --git a/public/locales/ua/translation.json b/public/locales/ua/translation.json index 52303ab..e9a0c27 100644 --- a/public/locales/ua/translation.json +++ b/public/locales/ua/translation.json @@ -263,10 +263,9 @@ "status": "Статус", "priority": "Пріоритет", "dueDate": "Термін виконання", - "deferUntil": "Defer until", + "deferUntil": "Відкласти до", "note": "Примітка", - "repeatOn": "Повторювати в", - "deferUntil": "Відкласти до" + "repeatOn": "Повторювати в" }, "recurrenceSettings": "Налаштування повторення", "completionBasedHelp": "Якщо відмічено, наступне завдання буде створене на основі дати завершення замість дати виконання", @@ -295,7 +294,7 @@ "title": "Назва", "description": "Опис", "dueDate": "Термін виконання", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Пріоритет", "status": "Статус", "assignedTo": "Призначено", @@ -702,7 +701,7 @@ "noTags": "Немає тегів", "priority": "Пріоритет", "dueDate": "Термін виконання", - "deferUntil": "Defer until", + "deferUntil": "Відкласти до", "recurringSetup": "Налаштування повторення", "notRecurring": "Ця задача ще не є повторюваною.", "clickToEditTitle": "Натисніть, щоб редагувати заголовок", @@ -751,7 +750,9 @@ "inProgress": "в процесі", "done": "завершено", "archived": "архівовано", - "unknown": "триває" + "unknown": "триває", + "waiting": "Очікування", + "setAsDone": "Позначити як виконане" }, "noDueDate": "Без терміну виконання", "instanceOf": "Це екземпляр повторювального завдання", @@ -759,10 +760,19 @@ "includingToday": "включаючи сьогодні", "has": "має", "fromProject": "з проєкту", - "deferUntil": "Відкласти до", "noDeferUntil": "Не відкладати до", "deferUntilUpdated": "Відкладено до успішного оновлення", - "deferUntilUpdateError": "Не вдалося оновити відкладення до" + "deferUntilUpdateError": "Не вдалося оновити відкладення до", + "showOverdueWarning": "Показати попередження про прострочення", + "dueDateInPastWarning": "Попередження: Ви встановлюєте дату виконання в минулому", + "overview": "Огляд", + "schedule": "Розклад", + "attachments": "Вкладення", + "attachmentsComingSoon": "Функція вкладень незабаром", + "activity": "Активність", + "lastUpdatedAt": "Останнє оновлення", + "statusUpdated": "Статус успішно оновлено", + "statusUpdateError": "Не вдалося оновити статус" }, "calendar": { "month": "Місяць", @@ -793,7 +803,7 @@ "title": "Назва", "status": "Статус", "dueDate": "Термін виконання", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Пріоритет", "project": "Проект", "area": "Область", @@ -1146,7 +1156,7 @@ "searchText": "Текст пошуку", "priority": "Пріоритет", "dueDate": "Термін виконання", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Не встановлено жодних конкретних критеріїв", "priorityLabel": "Пріоритет:", "dueLabel": "Термін:", diff --git a/public/locales/vi/translation.json b/public/locales/vi/translation.json index a57ad24..c56723a 100644 --- a/public/locales/vi/translation.json +++ b/public/locales/vi/translation.json @@ -420,7 +420,7 @@ "title": "Tiêu đề", "description": "Mô tả", "dueDate": "Ngày hết hạn", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Độ ưu tiên", "status": "Trạng thái", "assignedTo": "Giao cho", @@ -438,7 +438,7 @@ "status": "Trạng thái", "priority": "Độ ưu tiên", "dueDate": "Ngày hết hạn", - "deferUntil": "Defer until", + "deferUntil": "Hoãn đến", "note": "Ghi chú", "recurrenceType": "Lặp lại", "recurrenceInterval": "Mỗi", @@ -447,8 +447,7 @@ "weekOfMonth": "Tuần trong tháng", "recurrenceEndDate": "Ngày kết thúc (tùy chọn)", "completionBased": "Lặp lại sau khi hoàn thành", - "repeatOn": "Lặp lại vào", - "deferUntil": "Hoãn đến" + "repeatOn": "Lặp lại vào" }, "projectSearchPlaceholder": "Tìm kiếm hoặc tạo một dự án...", "noMatchingProjects": "Không có dự án nào phù hợp", @@ -724,7 +723,7 @@ "noTags": "Không có thẻ", "priority": "Độ ưu tiên", "dueDate": "Ngày hết hạn", - "deferUntil": "Defer until", + "deferUntil": "Hoãn đến", "recurringSetup": "Cài đặt lặp lại", "notRecurring": "Công việc này chưa lặp lại.", "clickToEditTitle": "Nhấp để chỉnh sửa tiêu đề", @@ -773,7 +772,9 @@ "inProgress": "đang tiến hành", "done": "đã hoàn thành", "archived": "đã lưu trữ", - "unknown": "đang diễn ra" + "unknown": "đang diễn ra", + "waiting": "Đang chờ", + "setAsDone": "Đánh dấu là đã hoàn thành" }, "noDueDate": "Không có ngày hết hạn", "instanceOf": "Đây là một phiên bản của một nhiệm vụ định kỳ", @@ -781,10 +782,19 @@ "includingToday": "bao gồm hôm nay", "has": "có", "fromProject": "từ dự án", - "deferUntil": "Hoãn đến", "noDeferUntil": "Không có hoãn đến", "deferUntilUpdated": "Hoãn đến đã được cập nhật thành công", - "deferUntilUpdateError": "Cập nhật hoãn đến không thành công" + "deferUntilUpdateError": "Cập nhật hoãn đến không thành công", + "showOverdueWarning": "Hiển thị cảnh báo quá hạn", + "dueDateInPastWarning": "Cảnh báo: Bạn đang đặt ngày đến hạn trong quá khứ", + "overview": "Tổng quan", + "schedule": "Lịch trình", + "attachments": "Tệp đính kèm", + "attachmentsComingSoon": "Tính năng tệp đính kèm sẽ sớm ra mắt", + "activity": "Hoạt động", + "lastUpdatedAt": "Cập nhật lần cuối vào", + "statusUpdated": "Cập nhật trạng thái thành công", + "statusUpdateError": "Cập nhật trạng thái thất bại" }, "projects": { "loading": "Đang tải dự án...", @@ -944,7 +954,7 @@ "title": "Tiêu đề", "status": "Trạng thái", "dueDate": "Ngày hết hạn", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "Độ ưu tiên", "project": "Dự án", "area": "Khu vực", @@ -1146,7 +1156,7 @@ "searchText": "Văn bản tìm kiếm", "priority": "Độ ưu tiên", "dueDate": "Ngày đến hạn", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "Không có tiêu chí cụ thể nào được thiết lập", "priorityLabel": "Độ ưu tiên:", "dueLabel": "Đến hạn:", diff --git a/public/locales/zh/translation.json b/public/locales/zh/translation.json index a8bd68a..3d9c0e5 100644 --- a/public/locales/zh/translation.json +++ b/public/locales/zh/translation.json @@ -420,7 +420,7 @@ "title": "标题", "description": "描述", "dueDate": "截止日期", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "优先级", "status": "状态", "assignedTo": "分配给", @@ -438,7 +438,7 @@ "status": "状态", "priority": "优先级", "dueDate": "截止日期", - "deferUntil": "Defer until", + "deferUntil": "延迟至", "note": "备注", "recurrenceType": "重复类型", "recurrenceInterval": "每", @@ -447,8 +447,7 @@ "weekOfMonth": "每月的周", "recurrenceEndDate": "结束日期(可选)", "completionBased": "完成后重复", - "repeatOn": "重复于", - "deferUntil": "延迟至" + "repeatOn": "重复于" }, "projectSearchPlaceholder": "搜索或创建项目...", "noMatchingProjects": "没有匹配的项目", @@ -724,7 +723,7 @@ "noTags": "没有标签", "priority": "优先级", "dueDate": "截止日期", - "deferUntil": "Defer until", + "deferUntil": "延迟至", "recurringSetup": "重复设置", "notRecurring": "此任务尚未重复。", "clickToEditTitle": "点击编辑标题", @@ -773,7 +772,9 @@ "inProgress": "进行中", "done": "已完成", "archived": "已归档", - "unknown": "进行中" + "unknown": "进行中", + "waiting": "等待中", + "setAsDone": "标记为完成" }, "noDueDate": "没有截止日期", "instanceOf": "这是一个重复任务的实例", @@ -781,10 +782,19 @@ "includingToday": "包括今天", "has": "有", "fromProject": "来自项目", - "deferUntil": "延迟至", "noDeferUntil": "无延迟至", "deferUntilUpdated": "成功更新延迟至", - "deferUntilUpdateError": "更新延迟至失败" + "deferUntilUpdateError": "更新延迟至失败", + "showOverdueWarning": "显示逾期警告", + "dueDateInPastWarning": "警告:您正在设置一个过去的截止日期", + "overview": "概览", + "schedule": "日程", + "attachments": "附件", + "attachmentsComingSoon": "附件功能即将推出", + "activity": "活动", + "lastUpdatedAt": "最后更新于", + "statusUpdated": "状态更新成功", + "statusUpdateError": "更新状态失败" }, "projects": { "loading": "加载项目中...", @@ -944,7 +954,7 @@ "title": "标题", "status": "状态", "dueDate": "截止日期", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "priority": "优先级", "project": "项目", "area": "区域", @@ -1146,7 +1156,7 @@ "searchText": "搜索文本", "priority": "优先级", "dueDate": "到期日期", - "deferUntil": "Defer until", + "deferUntil": "Defer until", "noCriteriaSet": "未设置特定条件", "priorityLabel": "优先级:", "dueLabel": "到期:",