Feat improve task details (#585)

* Fix project section

* Add project and tags sections

* Enhance task details page and add translations

* Enhance Task Details page

* Enhance project details page

* Note details page fix

* Enhance Views Tags Search

* Search enhancements

* fixup! Search enhancements
This commit is contained in:
Chris 2025-11-21 18:43:10 +02:00 committed by GitHub
parent 0213f79b0a
commit 8dc6194c80
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
53 changed files with 4793 additions and 1182 deletions

View file

@ -17,6 +17,10 @@ function buildTaskAttributes(body, userId, timezone, isUpdate = false) {
body.recurrence_weekday !== undefined
? body.recurrence_weekday
: null,
recurrence_weekdays:
body.recurrence_weekdays !== undefined
? body.recurrence_weekdays
: null,
recurrence_month_day:
body.recurrence_month_day !== undefined
? body.recurrence_month_day
@ -65,6 +69,10 @@ function buildUpdateAttributes(body, task, timezone) {
body.recurrence_weekday !== undefined
? body.recurrence_weekday
: task.recurrence_weekday,
recurrence_weekdays:
body.recurrence_weekdays !== undefined
? body.recurrence_weekdays
: task.recurrence_weekdays,
recurrence_month_day:
body.recurrence_month_day !== undefined
? body.recurrence_month_day

View file

@ -445,6 +445,7 @@ router.patch('/task/:id', requireTaskWriteAccess, async (req, res) => {
'recurrence_interval',
'recurrence_end_date',
'recurrence_weekday',
'recurrence_weekdays',
'recurrence_month_day',
'recurrence_week_of_month',
'completion_based',

View file

@ -51,7 +51,18 @@ async function handleRecurrenceUpdate(task, recurrenceFields, reqBody) {
if (newRecurrenceType !== 'none') {
for (const futureInstance of futureInstances) {
await futureInstance.destroy();
try {
await futureInstance.destroy();
} catch (error) {
// If dependent records block deletion (e.g., subtasks FK), skip that instance
console.warn(
'Skipping recurring instance deletion due to constraint:',
{
id: futureInstance.id,
error: error?.message,
}
);
}
}
}
}

View file

@ -8,7 +8,7 @@ const TASK_INCLUDES = [
},
{
model: Project,
attributes: ['id', 'name', 'uid'],
attributes: ['id', 'name', 'uid', 'image_url'],
required: false,
},
];

View file

@ -147,9 +147,13 @@ test('user can mark a task as complete', async ({ page, baseURL }) => {
await createTask(page, taskName);
// Enable "Show completed" first to ensure completed tasks remain visible
const showCompletedButton = page.locator('button:has-text("Show completed")').first();
if (await showCompletedButton.isVisible()) {
await showCompletedButton.click();
const sortFilterButton = page.getByRole('button', { name: /sort tasks/i });
await expect(sortFilterButton).toBeVisible({ timeout: 5000 });
await sortFilterButton.click();
const showCompletedToggle = page.getByRole('button', { name: /show completed/i });
if (await showCompletedToggle.isVisible()) {
await showCompletedToggle.click();
await page.waitForLoadState('networkidle');
}
@ -169,8 +173,8 @@ test('user can mark a task as complete', async ({ page, baseURL }) => {
// Wait for network idle after completing the task
await page.waitForLoadState('networkidle');
// Click the "Show completed" toggle to make completed tasks visible
const showCompletedToggle = page.getByText('Show completed');
// Click the "Show completed" toggle to make completed tasks visible (now inside the sort/filter dropdown)
await sortFilterButton.click();
await expect(showCompletedToggle).toBeVisible({ timeout: 5000 });
await showCompletedToggle.click();
await page.waitForLoadState('networkidle');
@ -198,4 +202,4 @@ test('user can mark a task as complete', async ({ page, baseURL }) => {
// task completion API worked (we saw status 200 and status: 2 in the response)
const showCompletedState = await page.getByText('Show completed').textContent();
}
});
});

View file

@ -28,7 +28,7 @@ import {
} from './utils/projectsService';
import { createTask, updateTask } from './utils/tasksService';
import { isAuthError } from './utils/authUtils';
import { Link } from 'react-router-dom';
import { Link, useLocation } from 'react-router-dom';
interface LayoutProps {
currentUser: User;
@ -47,6 +47,8 @@ const Layout: React.FC<LayoutProps> = ({
}) => {
const { t } = useTranslation();
const { showSuccessToast } = useToast();
const location = useLocation();
const isUpcomingView = location.pathname === '/upcoming';
const [isSidebarOpen, setIsSidebarOpen] = useState(
window.innerWidth >= 1024
);
@ -336,7 +338,11 @@ const Layout: React.FC<LayoutProps> = ({
}
};
const mainContentMarginLeft = isSidebarOpen ? 'ml-72' : 'ml-0';
const mainContentMarginLeft = isUpcomingView
? 'ml-0'
: isSidebarOpen
? 'ml-72'
: 'ml-0';
const isLoading =
isNotesLoading ||
@ -460,9 +466,9 @@ const Layout: React.FC<LayoutProps> = ({
>
<div className="flex flex-col bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 min-h-screen overflow-y-auto">
<div
className={`flex-grow py-0 px-0 md:px-4 transition-all duration-300 ${
className={`flex-grow py-0 px-0 transition-all duration-300 ${
isMobileSearchOpen ? 'pt-32' : 'pt-20'
} md:pt-20`}
} md:pt-20 ${isUpcomingView ? '' : 'md:px-4'}`}
>
<div className="w-full">{children}</div>
</div>

View file

@ -526,11 +526,11 @@ const Notes: React.FC = () => {
onClick={() => handleSelectNote(note)}
className={`p-5 cursor-pointer ${
previewNote?.uid === note.uid
? 'bg-white dark:bg-gray-900 border-b border-transparent'
? 'bg-white dark:bg-gray-900 border-b border-transparent mr-4 rounded-lg'
: index !==
sortedNotes.length - 1
? 'border-b border-gray-200/50 dark:border-gray-700/50 hover:bg-gray-50 dark:hover:bg-gray-800'
: 'border-b border-transparent hover:bg-gray-50 dark:hover:bg-gray-800'
? 'border-b border-gray-200/30 dark:border-gray-700/30 hover:bg-gray-50 dark:hover:bg-gray-800 mr-4'
: 'border-b border-transparent hover:bg-gray-50 dark:hover:bg-gray-800 mr-4'
}`}
>
<h3 className="text-sm font-semibold text-gray-900 dark:text-gray-100 truncate">

View file

@ -854,10 +854,11 @@ const ProjectDetails: React.FC = () => {
}
return (
<div className="flex justify-center px-4 lg:px-2">
<div className="w-full max-w-5xl">
<div className="w-full">
{/* Project Banner - Full Width */}
<div className="w-full">
{/* Project Banner - Unified for both with and without images */}
<div className="mb-6 rounded-lg overflow-hidden relative group">
<div className="mb-6 overflow-hidden relative group">
{/* Background - Image or Gradient */}
{project.image_url ? (
<img
@ -1021,79 +1022,175 @@ const ProjectDetails: React.FC = () => {
</button>
</div>
</div>
</div>
{/* Header with Tab Links and Controls */}
<div className="mb-4">
{/* Mobile Layout */}
<div className="sm:hidden">
<div className="flex items-center justify-between mb-3">
{/* Content Container - Centered with max width */}
<div className="flex justify-center px-4 lg:px-2">
<div className="w-full max-w-5xl">
{/* Header with Tab Links and Controls */}
<div className="mb-4">
{/* Mobile Layout */}
<div className="sm:hidden">
<div className="flex items-center justify-between mb-3">
{/* Tab Navigation Links */}
<div className="flex items-center space-x-6">
<button
onClick={() => setActiveTab('tasks')}
className={`flex items-center py-2 text-sm font-medium transition-colors ${
activeTab === 'tasks'
? 'text-gray-900 dark:text-gray-100'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
}`}
>
<span>
{t('sidebar.tasks', 'Tasks')}
</span>
<span
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
displayTasks.length > 0
? 'bg-gray-200 dark:bg-gray-600'
: 'bg-transparent'
}`}
style={{
minWidth: '20px',
visibility:
displayTasks.length > 0
? 'visible'
: 'hidden',
}}
>
{displayTasks.length > 0
? displayTasks.length
: '0'}
</span>
</button>
<button
onClick={() => setActiveTab('notes')}
className={`flex items-center py-2 text-sm font-medium transition-colors ${
activeTab === 'notes'
? 'text-gray-900 dark:text-gray-100'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
}`}
>
<span>
{t('sidebar.notes', 'Notes')}
</span>
<span
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
notes.length > 0
? 'bg-gray-200 dark:bg-gray-600'
: 'bg-transparent'
}`}
style={{
minWidth: '20px',
visibility:
notes.length > 0
? 'visible'
: 'hidden',
}}
>
{notes.length > 0
? notes.length
: '0'}
</span>
</button>
</div>
{/* Inline Controls - Always visible for tasks tab */}
{activeTab === 'tasks' && (
<div className="flex items-center gap-2 flex-wrap justify-end">
{/* Search Button */}
<button
onClick={() =>
setIsSearchExpanded((v) => !v)
}
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-1.5 ${
isSearchExpanded
? 'bg-blue-50/70 dark:bg-blue-900/20'
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
}`}
aria-expanded={isSearchExpanded}
aria-label={
isSearchExpanded
? 'Collapse search panel'
: 'Show search input'
}
title={
isSearchExpanded
? 'Hide search'
: 'Search Tasks'
}
>
<MagnifyingGlassIcon className="h-4 w-4 text-gray-600 dark:text-gray-200" />
</button>
<IconSortDropdown
options={sortOptions}
value={orderBy}
onChange={handleSortChange}
ariaLabel={t(
'projects.sortTasks',
'Sort tasks'
)}
title={t(
'projects.sortTasks',
'Sort tasks'
)}
dropdownLabel={t(
'tasks.sortBy',
'Sort by'
)}
extraContent={renderShowCompletedToggle()}
/>
</div>
)}
</div>
</div>
{/* Desktop Layout */}
<div className="hidden sm:flex items-center justify-between min-h-[2.5rem]">
{/* Tab Navigation Links */}
<div className="flex items-center space-x-6">
<button
onClick={() => setActiveTab('tasks')}
className={`flex items-center py-2 text-sm font-medium transition-colors ${
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
activeTab === 'tasks'
? 'text-gray-900 dark:text-gray-100'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
}`}
>
<span>{t('sidebar.tasks', 'Tasks')}</span>
<span
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
displayTasks.length > 0
? 'bg-gray-200 dark:bg-gray-600'
: 'bg-transparent'
}`}
style={{
minWidth: '20px',
visibility:
displayTasks.length > 0
? 'visible'
: 'hidden',
}}
>
{displayTasks.length > 0
? displayTasks.length
: '0'}
</span>
{displayTasks.length > 0 && (
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
{displayTasks.length}
</span>
)}
</button>
<button
onClick={() => setActiveTab('notes')}
className={`flex items-center py-2 text-sm font-medium transition-colors ${
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
activeTab === 'notes'
? 'text-gray-900 dark:text-gray-100'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
}`}
>
<span>{t('sidebar.notes', 'Notes')}</span>
<span
className={`ml-2 px-2 py-0.5 text-xs rounded-full ${
notes.length > 0
? 'bg-gray-200 dark:bg-gray-600'
: 'bg-transparent'
}`}
style={{
minWidth: '20px',
visibility:
notes.length > 0
? 'visible'
: 'hidden',
}}
>
{notes.length > 0 ? notes.length : '0'}
</span>
{notes.length > 0 && (
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
{notes.length}
</span>
)}
</button>
</div>
{/* Inline Controls - Always visible for tasks tab */}
{activeTab === 'tasks' && (
<div className="flex items-center gap-2 flex-wrap justify-end">
<div className="flex items-center gap-4">
{/* Search Button */}
<button
onClick={() =>
setIsSearchExpanded((v) => !v)
}
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-1.5 ${
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
isSearchExpanded
? 'bg-blue-50/70 dark:bg-blue-900/20'
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
@ -1110,7 +1207,7 @@ const ProjectDetails: React.FC = () => {
: 'Search Tasks'
}
>
<MagnifyingGlassIcon className="h-4 w-4 text-gray-600 dark:text-gray-200" />
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
</button>
<IconSortDropdown
options={sortOptions}
@ -1135,298 +1232,217 @@ const ProjectDetails: React.FC = () => {
</div>
</div>
{/* Desktop Layout */}
<div className="hidden sm:flex items-center justify-between min-h-[2.5rem]">
{/* Tab Navigation Links */}
<div className="flex items-center space-x-6">
<button
onClick={() => setActiveTab('tasks')}
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
activeTab === 'tasks'
? 'text-gray-900 dark:text-gray-100'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
}`}
>
<span>{t('sidebar.tasks', 'Tasks')}</span>
{displayTasks.length > 0 && (
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
{displayTasks.length}
</span>
)}
</button>
<button
onClick={() => setActiveTab('notes')}
className={`flex items-center space-x-2 text-sm font-medium transition-colors ${
activeTab === 'notes'
? 'text-gray-900 dark:text-gray-100'
: 'text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200'
}`}
>
<span>{t('sidebar.notes', 'Notes')}</span>
{notes.length > 0 && (
<span className="ml-2 px-2 py-0.5 text-xs bg-gray-200 dark:bg-gray-600 rounded-full">
{notes.length}
</span>
)}
</button>
</div>
{/* Inline Controls - Always visible for tasks tab */}
{activeTab === 'tasks' && (
<div className="flex items-center gap-4">
{/* Search Button */}
<button
onClick={() =>
setIsSearchExpanded((v) => !v)
}
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
isSearchExpanded
? 'bg-blue-50/70 dark:bg-blue-900/20'
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
}`}
aria-expanded={isSearchExpanded}
aria-label={
isSearchExpanded
? 'Collapse search panel'
: 'Show search input'
}
title={
isSearchExpanded
? 'Hide search'
: 'Search Tasks'
}
>
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
</button>
<IconSortDropdown
options={sortOptions}
value={orderBy}
onChange={handleSortChange}
ariaLabel={t(
'projects.sortTasks',
'Sort tasks'
{/* Search input section, collapsible - only for tasks tab */}
{activeTab === 'tasks' && (
<div
className={`transition-all duration-300 ease-in-out ${
isSearchExpanded
? 'max-h-24 opacity-100 mb-4'
: 'max-h-0 opacity-0 mb-0'
} overflow-hidden`}
>
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
<input
type="text"
placeholder={t(
'tasks.searchPlaceholder',
'Search tasks...'
)}
title={t(
'projects.sortTasks',
'Sort tasks'
)}
dropdownLabel={t('tasks.sortBy', 'Sort by')}
extraContent={renderShowCompletedToggle()}
value={taskSearchQuery}
onChange={(e) =>
setTaskSearchQuery(e.target.value)
}
className="w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white"
/>
</div>
)}
</div>
</div>
</div>
)}
{/* Search input section, collapsible - only for tasks tab */}
{activeTab === 'tasks' && (
<div
className={`transition-all duration-300 ease-in-out ${
isSearchExpanded
? 'max-h-24 opacity-100 mb-4'
: 'max-h-0 opacity-0 mb-0'
} overflow-hidden`}
>
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
<input
type="text"
placeholder={t(
'tasks.searchPlaceholder',
'Search tasks...'
)}
value={taskSearchQuery}
onChange={(e) =>
setTaskSearchQuery(e.target.value)
}
className="w-full bg-transparent border-none focus:ring-0 focus:outline-none dark:text-white"
{/* Auto-suggest form for tasks with no items */}
{activeTab === 'tasks' && showAutoSuggestForm && (
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 mb-6">
<AutoSuggestNextActionBox
onAddAction={(actionDescription) => {
if (project?.id) {
handleCreateNextAction(
project.id,
actionDescription
);
}
}}
onDismiss={handleSkipNextAction}
/>
</div>
</div>
)}
)}
{/* Auto-suggest form for tasks with no items */}
{activeTab === 'tasks' && showAutoSuggestForm && (
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 mb-6">
<AutoSuggestNextActionBox
onAddAction={(actionDescription) => {
if (project?.id) {
handleCreateNextAction(
project.id,
actionDescription
);
}
}}
onDismiss={handleSkipNextAction}
/>
</div>
)}
{/* Tasks Tab Content */}
{activeTab === 'tasks' && (
<>
<div
className={`transition-all duration-300 ease-in-out overflow-hidden mb-1.5 ${
!showAutoSuggestForm
? 'opacity-100 max-h-96 transform translate-y-0'
: 'opacity-0 max-h-0 transform -translate-y-2'
}`}
>
<NewTask onTaskCreate={handleTaskCreate} />
</div>
{/* Tasks Tab Content */}
{activeTab === 'tasks' && (
<>
<div
className={`transition-all duration-300 ease-in-out overflow-hidden mb-1.5 ${
!showAutoSuggestForm
? 'opacity-100 max-h-96 transform translate-y-0'
: 'opacity-0 max-h-0 transform -translate-y-2'
}`}
>
<NewTask onTaskCreate={handleTaskCreate} />
</div>
<div className="transition-all duration-300 ease-in-out overflow-visible">
{displayTasks.length > 0 ? (
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 overflow-visible">
<TaskList
tasks={displayTasks}
onTaskUpdate={handleTaskUpdate}
onTaskDelete={handleTaskDelete}
projects={allProjects}
hideProjectName={true}
onToggleToday={handleToggleToday}
showCompletedTasks={showCompleted}
/>
</div>
) : (
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0">
<p className="text-gray-500 dark:text-gray-400">
{taskSearchQuery.trim()
? t(
'tasks.noTasksAvailable',
'No tasks available.'
)
: showCompleted
? t(
'project.noCompletedTasks',
'No completed tasks.'
)
: t(
'project.noTasks',
'No tasks.'
)}
</p>
</div>
)}
</div>
</>
)}
<div className="transition-all duration-300 ease-in-out overflow-visible">
{displayTasks.length > 0 ? (
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0 overflow-visible">
<TaskList
tasks={displayTasks}
onTaskUpdate={handleTaskUpdate}
onTaskDelete={handleTaskDelete}
projects={allProjects}
hideProjectName={true}
onToggleToday={handleToggleToday}
showCompletedTasks={showCompleted}
/>
{/* Notes Content */}
{activeTab === 'notes' && (
<div className="transition-all duration-300 ease-in-out">
{/* Create New Note Button - Always visible */}
<div className="mb-4">
<button
type="button"
className="inline-flex items-center gap-2 px-3 py-1.5 text-sm rounded-md bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 transition-colors"
onClick={() => {
if (!project?.id || !project.name)
return;
setSelectedNote({
title: '',
content: '',
tags: [],
project_id: project.id,
project: {
id: project.id,
name: project.name,
uid: project.uid,
},
project_uid: project.uid,
});
setIsNoteModalOpen(true);
}}
>
<PlusCircleIcon className="h-5 w-5" />
{t('noteCreation', 'Create New Note')}
</button>
</div>
{/* Notes Grid or Empty State */}
{notes.length > 0 ? (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{notes.map((note) => (
<NoteCard
key={note.uid}
note={note}
onEdit={handleEditNote}
onDelete={(note) => {
setNoteToDelete(note);
setIsConfirmDialogOpen(true);
}}
showActions={true}
showProject={false}
/>
))}
</div>
) : (
<div className="transition-all duration-300 ease-in-out opacity-100 transform translate-y-0">
<p className="text-gray-500 dark:text-gray-400">
{taskSearchQuery.trim()
? t(
'tasks.noTasksAvailable',
'No tasks available.'
)
: showCompleted
? t(
'project.noCompletedTasks',
'No completed tasks.'
)
: t(
'project.noTasks',
'No tasks.'
)}
<div className="text-gray-500 dark:text-gray-400">
<p>
{t(
'project.noNotes',
'No notes for this project.'
)}
</p>
</div>
)}
</div>
</>
)}
)}
{/* Notes Content */}
{activeTab === 'notes' && (
<div className="transition-all duration-300 ease-in-out">
{/* Create New Note Button - Always visible */}
<div className="mb-4">
<button
type="button"
className="inline-flex items-center gap-2 px-3 py-1.5 text-sm rounded-md bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 transition-colors"
onClick={() => {
if (!project?.id || !project.name) return;
setSelectedNote({
title: '',
content: '',
tags: [],
project_id: project.id,
project: {
id: project.id,
name: project.name,
uid: project.uid,
},
project_uid: project.uid,
});
setIsNoteModalOpen(true);
}}
>
<PlusCircleIcon className="h-5 w-5" />
{t('noteCreation', 'Create New Note')}
</button>
</div>
{/* Notes Grid or Empty State */}
{notes.length > 0 ? (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{notes.map((note) => (
<NoteCard
key={note.uid}
note={note}
onEdit={handleEditNote}
onDelete={(note) => {
setNoteToDelete(note);
setIsConfirmDialogOpen(true);
}}
showActions={true}
showProject={false}
/>
))}
</div>
) : (
<div className="text-gray-500 dark:text-gray-400">
<p>
{t(
'project.noNotes',
'No notes for this project.'
)}
</p>
</div>
)}
</div>
)}
<ProjectModal
isOpen={isModalOpen}
onClose={closeModal}
onSave={handleSaveProject}
project={project}
areas={areas}
/>
{/* NoteModal */}
<NoteModal
isOpen={isNoteModalOpen}
onClose={() => {
setIsNoteModalOpen(false);
setSelectedNote(null);
}}
onSave={handleSaveNote}
note={selectedNote}
projects={allProjects}
/>
{isConfirmDialogOpen && noteToDelete && (
<ConfirmDialog
title="Delete Note"
message={`Are you sure you want to delete the note "${noteToDelete.title}"?`}
onConfirm={() => {
const identifier =
noteToDelete?.uid ??
(noteToDelete?.id !== undefined
? String(noteToDelete.id)
: null);
if (identifier) {
handleDeleteNote(identifier);
}
}}
onCancel={() => {
setIsConfirmDialogOpen(false);
setNoteToDelete(null);
}}
<ProjectModal
isOpen={isModalOpen}
onClose={closeModal}
onSave={handleSaveProject}
project={project}
areas={areas}
/>
)}
{isConfirmDialogOpen && !noteToDelete && (
<ConfirmDialog
title={t(
'modals.deleteProject.title',
'Delete Project'
)}
message={t(
'modals.deleteProject.message',
'Deleting this project will remove the project only. All items inside will be retained but will no longer belong to any project. Continue?'
)}
onConfirm={handleDeleteProject}
onCancel={() => setIsConfirmDialogOpen(false)}
{/* NoteModal */}
<NoteModal
isOpen={isNoteModalOpen}
onClose={() => {
setIsNoteModalOpen(false);
setSelectedNote(null);
}}
onSave={handleSaveNote}
note={selectedNote}
projects={allProjects}
/>
)}
{isConfirmDialogOpen && noteToDelete && (
<ConfirmDialog
title="Delete Note"
message={`Are you sure you want to delete the note "${noteToDelete.title}"?`}
onConfirm={() => {
const identifier =
noteToDelete?.uid ??
(noteToDelete?.id !== undefined
? String(noteToDelete.id)
: null);
if (identifier) {
handleDeleteNote(identifier);
}
}}
onCancel={() => {
setIsConfirmDialogOpen(false);
setNoteToDelete(null);
}}
/>
)}
{isConfirmDialogOpen && !noteToDelete && (
<ConfirmDialog
title={t(
'modals.deleteProject.title',
'Delete Project'
)}
message={t(
'modals.deleteProject.message',
'Deleting this project will remove the project only. All items inside will be retained but will no longer belong to any project. Continue?'
)}
onConfirm={handleDeleteProject}
onCancel={() => setIsConfirmDialogOpen(false)}
/>
)}
</div>
</div>
</div>
);

View file

@ -271,10 +271,10 @@ const DatePicker: React.FC<DatePickerProps> = ({
<div className="relative">
<button
type="button"
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
disabled
? 'opacity-50 cursor-not-allowed'
: 'hover:bg-gray-50 dark:hover:bg-gray-800'
: 'hover:bg-gray-50 dark:hover:bg-gray-700'
}`}
onClick={(e) => {
e.preventDefault();

View file

@ -101,10 +101,10 @@ const NumberSelectDropdown: React.FC<NumberSelectDropdownProps> = ({
>
<button
type="button"
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
disabled
? 'opacity-50 cursor-not-allowed'
: 'hover:bg-gray-50 dark:hover:bg-gray-800'
: 'hover:bg-gray-50 dark:hover:bg-gray-700'
}`}
onClick={(e) => {
e.preventDefault();

View file

@ -98,10 +98,10 @@ const RecurrenceSelectDropdown: React.FC<RecurrenceSelectDropdownProps> = ({
>
<button
type="button"
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-900 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-900 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
className={`inline-flex justify-between w-full px-3 py-2 bg-white dark:bg-gray-800 text-sm text-gray-900 dark:text-gray-100 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 transition-colors ${
disabled
? 'opacity-50 cursor-not-allowed'
: 'hover:bg-gray-50 dark:hover:bg-gray-800'
: 'hover:bg-gray-50 dark:hover:bg-gray-700'
}`}
onClick={(e) => {
e.preventDefault();

View file

@ -24,7 +24,8 @@ import { Tag } from '../../entities/Tag';
import { useStore } from '../../store/useStore';
import { updateTag, deleteTag } from '../../utils/tagsService';
import { getApiPath } from '../../config/paths';
import SortFilterButton, { SortOption } from '../Shared/SortFilterButton';
import { SortOption } from '../Shared/SortFilterButton';
import IconSortDropdown from '../Shared/IconSortDropdown';
const TagDetails: React.FC = () => {
const { t } = useTranslation();
@ -374,50 +375,28 @@ const TagDetails: React.FC = () => {
aria-expanded={isSearchExpanded}
aria-label={
isSearchExpanded
? 'Collapse search panel'
: 'Show search input'
? t(
'common.hideSearch',
'Collapse search panel'
)
: t(
'common.showSearch',
'Show search input'
)
}
title={
isSearchExpanded
? 'Hide search'
: 'Search Tasks'
? t('common.hideSearch', 'Hide search')
: t('common.search', 'Search tasks')
}
>
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
</button>
<div className="flex items-center gap-2">
<span className="text-sm text-gray-600 dark:text-gray-400">
Show completed
<span className="sr-only">
{isSearchExpanded
? t('common.hideSearch', 'Hide search')
: t('common.search', 'Search tasks')}
</span>
<button
onClick={() => setShowCompleted((v) => !v)}
className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${
showCompleted
? 'bg-blue-600'
: 'bg-gray-200 dark:bg-gray-600'
}`}
aria-pressed={showCompleted}
aria-label={
showCompleted
? 'Hide completed tasks'
: 'Show completed tasks'
}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
showCompleted
? 'translate-x-4'
: 'translate-x-0.5'
}`}
/>
</button>
</div>
<SortFilterButton
options={sortOptions}
value={orderBy}
onChange={setOrderBy}
size="desktop"
/>
</button>
<button
ref={editButtonRef}
type="button"
@ -505,12 +484,74 @@ const TagDetails: React.FC = () => {
</div>
{/* Tasks Section */}
{displayTasks.length > 0 && (
<div className="mb-8">
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-4 flex items-center">
<div className="mb-8">
<div className="flex items-center justify-between mb-4">
<h3 className="text-lg font-semibold text-gray-900 dark:text-white flex items-center">
<CheckIcon className="h-5 w-5 mr-2" />
{t('tasks.title')} ({displayTasks.length})
</h3>
<IconSortDropdown
options={sortOptions}
value={orderBy}
onChange={setOrderBy}
ariaLabel={t('tasks.sortTasks', 'Sort tasks')}
title={t('tasks.sortTasks', 'Sort tasks')}
dropdownLabel={t('tasks.sortBy', 'Sort by')}
extraContent={
<button
type="button"
onClick={() => setShowCompleted((v) => !v)}
className="w-full flex items-center justify-between text-sm text-gray-700 dark:text-gray-300"
aria-pressed={showCompleted}
aria-label={
showCompleted
? t(
'tasks.hideCompleted',
'Hide completed tasks'
)
: t(
'tasks.showCompleted',
'Show completed tasks'
)
}
title={
showCompleted
? t(
'tasks.hideCompleted',
'Hide completed tasks'
)
: t(
'tasks.showCompleted',
'Show completed tasks'
)
}
>
<span>
{t(
'tasks.showCompleted',
'Show completed'
)}
</span>
<span
className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${
showCompleted
? 'bg-blue-600'
: 'bg-gray-200 dark:bg-gray-600'
}`}
>
<span
className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${
showCompleted
? 'translate-x-4'
: 'translate-x-0.5'
}`}
/>
</span>
</button>
}
/>
</div>
{displayTasks.length > 0 ? (
<TaskList
tasks={displayTasks}
onTaskUpdate={handleTaskUpdate}
@ -520,8 +561,12 @@ const TagDetails: React.FC = () => {
onToggleToday={handleToggleToday}
showCompletedTasks={showCompleted}
/>
</div>
)}
) : (
<p className="text-sm text-gray-500 dark:text-gray-400">
{t('tasks.noTasksAvailable', 'No tasks available.')}
</p>
)}
</div>
{/* Notes Section */}
{notes.length > 0 && (

View file

@ -199,13 +199,15 @@ const TagInput: React.FC<TagInputProps> = ({
<div className="space-y-2 relative">
<div
ref={containerRef}
className="flex flex-wrap items-center border border-gray-300 dark:border-gray-900 bg-white dark:bg-gray-900 rounded-md p-2 min-h-[40px]"
className={`flex flex-wrap items-start gap-2 border border-gray-300 dark:border-gray-900 bg-white dark:bg-gray-900 rounded-md px-2 min-h-[40px] ${
tags.length > 3 ? 'py-3' : 'py-2'
}`}
>
{tags.length > 0 ? (
tags.map((tag, index) => (
<span
key={index}
className="flex items-center bg-gray-200 text-gray-700 text-xs font-medium mr-2 px-2.5 py-0.5 rounded"
className="flex items-center bg-gray-200 text-gray-700 text-xs font-medium px-2.5 py-0.5 rounded"
>
{tag}
<button

View file

@ -26,6 +26,7 @@ const Tags: React.FC = () => {
useState<boolean>(false);
const [tagToDelete, setTagToDelete] = useState<Tag | null>(null);
const [searchQuery, setSearchQuery] = useState<string>('');
const [isSearchExpanded, setIsSearchExpanded] = useState(false);
const [hoveredTagUid, setHoveredTagUid] = useState<string | null>(null);
const [isTagModalOpen, setIsTagModalOpen] = useState<boolean>(false);
const [selectedTag, setSelectedTag] = useState<Tag | null>(null);
@ -127,16 +128,52 @@ const Tags: React.FC = () => {
<div className="w-full px-2 sm:px-4 lg:px-6 pt-4 pb-8">
<div className="w-full">
{/* Tags Header */}
<div className="flex items-center mb-8">
<div className="flex items-center justify-between mb-8">
<h2 className="text-2xl font-light">
{t('tags.title', 'Tags')}
</h2>
<button
type="button"
onClick={() => setIsSearchExpanded(!isSearchExpanded)}
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
isSearchExpanded
? 'bg-blue-50/70 dark:bg-blue-900/20'
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
}`}
aria-expanded={isSearchExpanded}
aria-label={
isSearchExpanded
? t(
'common.hideSearch',
'Collapse search panel'
)
: t('common.showSearch', 'Show search input')
}
title={
isSearchExpanded
? t('common.hideSearch', 'Hide search')
: t('common.search', 'Search tags')
}
>
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
<span className="sr-only">
{isSearchExpanded
? t('common.hideSearch', 'Hide search')
: t('common.search', 'Search tags')}
</span>
</button>
</div>
{/* Search Bar with Icon */}
<div className="mb-4">
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2">
<MagnifyingGlassIcon className="h-5 w-5 text-gray-500 dark:text-gray-400 mr-2" />
{/* Search input section, collapsible */}
<div
className={`transition-all duration-300 ease-in-out ${
isSearchExpanded
? 'max-h-24 opacity-100 mb-4'
: 'max-h-0 opacity-0 mb-0'
} overflow-hidden`}
>
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
<input
type="text"
placeholder={t(

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,182 @@
import React, { useRef, useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import {
PencilSquareIcon,
EyeIcon,
PencilIcon,
} from '@heroicons/react/24/outline';
import MarkdownRenderer from '../../Shared/MarkdownRenderer';
interface TaskContentSectionProps {
content: string;
onUpdate: (newContent: string) => Promise<void>;
}
const TaskContentSection: React.FC<TaskContentSectionProps> = ({
content,
onUpdate,
}) => {
const { t } = useTranslation();
const [isEditing, setIsEditing] = useState(false);
const [editedContent, setEditedContent] = useState(content);
const [contentTab, setContentTab] = useState<'edit' | 'preview'>('edit');
const contentTextareaRef = useRef<HTMLTextAreaElement>(null);
useEffect(() => {
setEditedContent(content);
}, [content]);
useEffect(() => {
if (isEditing && contentTextareaRef.current) {
contentTextareaRef.current.focus();
}
}, [isEditing]);
const handleStartEdit = () => {
setIsEditing(true);
};
const handleSave = async () => {
if (editedContent !== content) {
await onUpdate(editedContent);
}
setIsEditing(false);
};
const handleCancel = () => {
setEditedContent(content);
setIsEditing(false);
};
const handleKeyDown = (e: React.KeyboardEvent) => {
if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {
handleSave();
} else if (e.key === 'Escape') {
handleCancel();
}
};
return (
<div>
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
{t('task.content', 'Content')}
</h4>
{isEditing ? (
<div className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-blue-500 dark:border-blue-400 p-6">
<div className="relative">
{/* Floating toggle buttons */}
<div className="absolute top-2 right-2 z-10 flex space-x-1">
<button
type="button"
onClick={() => setContentTab('edit')}
className={`p-1.5 rounded-md transition-colors ${
contentTab === 'edit'
? 'bg-blue-600 text-white'
: 'bg-gray-200 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-700'
}`}
title={t('common.edit', 'Edit')}
>
<PencilIcon className="h-3 w-3" />
</button>
<button
type="button"
onClick={() => setContentTab('preview')}
className={`p-1.5 rounded-md transition-colors ${
contentTab === 'preview'
? 'bg-blue-600 text-white'
: 'bg-gray-200 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-700'
}`}
title={t('common.preview', 'Preview')}
>
<EyeIcon className="h-3 w-3" />
</button>
</div>
{contentTab === 'edit' ? (
<textarea
ref={contentTextareaRef}
value={editedContent}
onChange={(e) =>
setEditedContent(e.target.value)
}
onKeyDown={handleKeyDown}
className="w-full min-h-[200px] bg-transparent border-none focus:ring-0 focus:outline-none text-gray-900 dark:text-gray-100 resize-y font-normal pr-20"
placeholder={t(
'task.contentPlaceholder',
'Add content here... (Markdown supported)'
)}
/>
) : (
<div className="w-full min-h-[200px] bg-gray-50 dark:bg-gray-800 rounded p-3 pr-20 overflow-y-auto">
{editedContent ? (
<MarkdownRenderer
content={editedContent}
className="prose dark:prose-invert max-w-none"
/>
) : (
<p className="text-gray-500 dark:text-gray-400 italic">
{t(
'task.noContentPreview',
'No content to preview. Switch to Edit mode to add content.'
)}
</p>
)}
</div>
)}
</div>
<div className="flex items-center justify-between mt-4 pt-4 border-t border-gray-200 dark:border-gray-700">
<span className="text-xs text-gray-500 dark:text-gray-400">
{t(
'task.contentEditHint',
'Press Cmd/Ctrl+Enter to save, Esc to cancel'
)}
</span>
<div className="flex space-x-2">
<button
onClick={handleSave}
className="px-4 py-2 text-sm bg-green-600 dark:bg-green-500 text-white rounded hover:bg-green-700 dark:hover:bg-green-600 transition-colors"
>
{t('common.save', 'Save')}
</button>
<button
onClick={handleCancel}
className="px-4 py-2 text-sm bg-gray-200 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded hover:bg-gray-300 dark:hover:bg-gray-700 transition-colors"
>
{t('common.cancel', 'Cancel')}
</button>
</div>
</div>
</div>
) : content ? (
<div
onClick={handleStartEdit}
className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 p-6 cursor-pointer transition-colors"
title={t(
'task.clickToEditContent',
'Click to edit content'
)}
>
<MarkdownRenderer
content={content}
className="prose dark:prose-invert max-w-none"
/>
</div>
) : (
<div
onClick={handleStartEdit}
className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 p-6 cursor-pointer transition-colors"
title={t('task.clickToAddContent', 'Click to add content')}
>
<div className="flex flex-col items-center justify-center py-8 text-gray-500 dark:text-gray-400">
<PencilSquareIcon className="h-12 w-12 mb-3 opacity-50" />
<span className="text-sm text-center">
{t('task.noNotes', 'No content added yet')}
</span>
</div>
</div>
)}
</div>
);
};
export default TaskContentSection;

View file

@ -0,0 +1,180 @@
import React, { useRef, useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { CheckIcon, XMarkIcon } from '@heroicons/react/24/outline';
import TaskPriorityIcon from '../TaskPriorityIcon';
import { Task } from '../../../entities/Task';
interface TaskDetailsHeaderProps {
task: Task;
onToggleCompletion: () => void;
onTitleUpdate: (newTitle: string) => Promise<void>;
onEdit: () => void;
onDelete: () => void;
}
const TaskDetailsHeader: React.FC<TaskDetailsHeaderProps> = ({
task,
onToggleCompletion,
onTitleUpdate,
onEdit,
onDelete,
}) => {
const { t } = useTranslation();
const [isEditingTitle, setIsEditingTitle] = useState(false);
const [editedTitle, setEditedTitle] = useState(task.name);
const [actionsMenuOpen, setActionsMenuOpen] = useState(false);
const titleInputRef = useRef<HTMLInputElement>(null);
const actionsMenuRef = useRef<HTMLDivElement>(null);
useEffect(() => {
setEditedTitle(task.name);
}, [task.name]);
useEffect(() => {
if (isEditingTitle && titleInputRef.current) {
titleInputRef.current.focus();
titleInputRef.current.select();
}
}, [isEditingTitle]);
useEffect(() => {
const handleClickOutside = (e: MouseEvent) => {
if (
actionsMenuOpen &&
actionsMenuRef.current &&
!actionsMenuRef.current.contains(e.target as Node)
) {
setActionsMenuOpen(false);
}
};
if (actionsMenuOpen) {
document.addEventListener('mousedown', handleClickOutside);
return () =>
document.removeEventListener('mousedown', handleClickOutside);
}
}, [actionsMenuOpen]);
const handleStartTitleEdit = () => {
setIsEditingTitle(true);
};
const handleSaveTitle = async () => {
if (editedTitle.trim() && editedTitle !== task.name) {
await onTitleUpdate(editedTitle.trim());
}
setIsEditingTitle(false);
};
const handleCancelTitleEdit = () => {
setEditedTitle(task.name);
setIsEditingTitle(false);
};
const handleTitleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
handleSaveTitle();
} else if (e.key === 'Escape') {
handleCancelTitleEdit();
}
};
return (
<div className="flex items-center justify-between mb-6">
<div className="flex items-center space-x-3">
<TaskPriorityIcon
priority={task.priority}
status={task.status}
onToggleCompletion={onToggleCompletion}
/>
<div className="flex flex-col flex-1">
{isEditingTitle ? (
<div className="flex items-center space-x-2">
<input
ref={titleInputRef}
type="text"
value={editedTitle}
onChange={(e) => setEditedTitle(e.target.value)}
onKeyDown={handleTitleKeyDown}
onBlur={handleSaveTitle}
className="text-2xl font-normal text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-800 border-2 border-blue-500 dark:border-blue-400 rounded px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 w-full"
placeholder={t(
'task.titlePlaceholder',
'Enter task title'
)}
/>
<button
onClick={handleSaveTitle}
className="p-1.5 text-green-600 dark:text-green-400 hover:text-green-700 dark:hover:text-green-300 rounded-full transition-colors duration-200"
title={t('common.save', 'Save')}
>
<CheckIcon className="h-5 w-5" />
</button>
<button
onClick={handleCancelTitleEdit}
className="p-1.5 text-gray-600 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 rounded-full transition-colors duration-200"
title={t('common.cancel', 'Cancel')}
>
<XMarkIcon className="h-5 w-5" />
</button>
</div>
) : (
<h2
onClick={handleStartTitleEdit}
className="text-2xl font-normal text-gray-900 dark:text-gray-100 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded px-2 py-1 -mx-2 transition-colors"
title={t(
'task.clickToEditTitle',
'Click to edit title'
)}
>
{task.name}
</h2>
)}
</div>
</div>
<div className="relative" ref={actionsMenuRef}>
<button
className="px-2 py-1 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 rounded transition-colors duration-200 text-base"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
setActionsMenuOpen(!actionsMenuOpen);
}}
aria-haspopup="true"
aria-expanded={actionsMenuOpen}
aria-label={t('common.moreActions', 'More actions')}
>
...
</button>
{actionsMenuOpen && (
<div className="absolute right-0 mt-2 w-40 rounded-lg shadow-lg bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 z-20">
<button
className="w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-t-lg"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
setActionsMenuOpen(false);
onEdit();
}}
>
{t('common.edit', 'Edit')}
</button>
<button
className="w-full text-left px-3 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-b-lg"
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
setActionsMenuOpen(false);
onDelete();
}}
>
{t('common.delete', 'Delete')}
</button>
</div>
)}
</div>
</div>
);
};
export default TaskDetailsHeader;

View file

@ -0,0 +1,75 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
import { Task, PriorityType } from '../../../entities/Task';
interface TaskPrioritySectionProps {
task: Task;
onUpdate: (priority: PriorityType) => Promise<void>;
}
const TaskPrioritySection: React.FC<TaskPrioritySectionProps> = ({
task,
onUpdate,
}) => {
const { t } = useTranslation();
const handlePriorityClick = async (priority: PriorityType) => {
await onUpdate(priority);
};
return (
<div className="min-w-0">
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
{t('task.priority', 'Priority')}
</h4>
<div className="grid grid-cols-2 xl:grid-cols-4 gap-2">
<button
type="button"
onClick={() => handlePriorityClick(null)}
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
task.priority === null || task.priority === undefined
? 'bg-gray-300 dark:bg-gray-600 text-gray-900 dark:text-gray-100'
: 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-gray-600'
}`}
>
{t('priority.none', 'None')}
</button>
<button
type="button"
onClick={() => handlePriorityClick('low')}
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
task.priority === 'low' || task.priority === 0
? 'bg-blue-500 dark:bg-blue-600 text-white'
: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 hover:bg-blue-200 dark:hover:bg-blue-900/50'
}`}
>
{t('priority.low', 'Low')}
</button>
<button
type="button"
onClick={() => handlePriorityClick('medium')}
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
task.priority === 'medium' || task.priority === 1
? 'bg-yellow-500 dark:bg-yellow-600 text-white'
: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-700 dark:text-yellow-300 hover:bg-yellow-200 dark:hover:bg-yellow-900/50'
}`}
>
{t('priority.medium', 'Medium')}
</button>
<button
type="button"
onClick={() => handlePriorityClick('high')}
className={`w-full min-w-0 px-3 py-2 text-sm font-medium rounded transition-colors whitespace-nowrap ${
task.priority === 'high' || task.priority === 2
? 'bg-red-500 dark:bg-red-600 text-white'
: 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 hover:bg-red-200 dark:hover:bg-red-900/50'
}`}
>
{t('priority.high', 'High')}
</button>
</div>
</div>
);
};
export default TaskPrioritySection;

View file

@ -0,0 +1,169 @@
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 ProjectDropdown from '../../Shared/ProjectDropdown';
import { Project } from '../../../entities/Project';
import { Task } from '../../../entities/Task';
interface TaskProjectSectionProps {
task: Task;
projects: Project[];
onProjectSelect: (project: Project) => Promise<void>;
onProjectClear: () => Promise<void>;
onProjectCreate: (name: string) => Promise<void>;
getProjectLink: (project: Project) => string;
}
const TaskProjectSection: React.FC<TaskProjectSectionProps> = ({
task,
projects,
onProjectSelect,
onProjectClear,
onProjectCreate,
getProjectLink,
}) => {
const { t } = useTranslation();
const [projectDropdownOpen, setProjectDropdownOpen] = useState(false);
const [projectName, setProjectName] = useState('');
const [filteredProjects, setFilteredProjects] = useState<Project[]>([]);
const [isCreatingProject, setIsCreatingProject] = useState(false);
const projectDropdownRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const handleClickOutside = (e: MouseEvent) => {
if (
projectDropdownOpen &&
projectDropdownRef.current &&
!projectDropdownRef.current.contains(e.target as Node)
) {
setProjectDropdownOpen(false);
setProjectName('');
}
};
if (projectDropdownOpen) {
document.addEventListener('mousedown', handleClickOutside);
return () =>
document.removeEventListener('mousedown', handleClickOutside);
}
}, [projectDropdownOpen]);
const handleProjectSearch = (query: string) => {
setProjectName(query);
const filtered = projects.filter((p) =>
p.name.toLowerCase().includes(query.toLowerCase())
);
setFilteredProjects(filtered);
};
const handleProjectSelection = async (project: Project) => {
await onProjectSelect(project);
setProjectDropdownOpen(false);
setProjectName('');
};
const handleClearProject = async () => {
await onProjectClear();
setProjectDropdownOpen(false);
setProjectName('');
};
const handleCreateProjectInline = async (name: string) => {
setIsCreatingProject(true);
try {
await onProjectCreate(name);
setProjectDropdownOpen(false);
setProjectName('');
} finally {
setIsCreatingProject(false);
}
};
const handleShowAllProjects = () => {
setFilteredProjects(projects);
};
return (
<div ref={projectDropdownRef}>
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
{t('task.project', 'Project')}
</h4>
<div className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 transition-colors">
{projectDropdownOpen ? (
<ProjectDropdown
projectName={projectName}
onProjectSearch={handleProjectSearch}
dropdownOpen={projectDropdownOpen}
filteredProjects={filteredProjects}
onProjectSelection={handleProjectSelection}
onCreateProject={handleCreateProjectInline}
isCreatingProject={isCreatingProject}
onShowAllProjects={handleShowAllProjects}
allProjects={projects}
selectedProject={null}
onClearProject={handleClearProject}
/>
) : task.Project ? (
<div
onClick={() => setProjectDropdownOpen(true)}
className="bg-gray-50 dark:bg-gray-900 rounded-lg shadow-sm relative cursor-pointer hover:opacity-90 transition-opacity"
>
<div
className="flex items-center justify-center overflow-hidden rounded-t-lg relative"
style={{ height: '100px' }}
>
{task.Project.image_url ? (
<img
src={task.Project.image_url}
alt={task.Project.name}
className="w-full h-full object-cover"
/>
) : (
<div className="w-full h-full bg-gradient-to-br from-blue-500 to-purple-600 dark:from-blue-600 dark:to-purple-700"></div>
)}
</div>
<div className="p-3">
<div className="flex items-center text-md font-semibold text-gray-900 dark:text-gray-100">
<span className="truncate">
{task.Project.name}
</span>
<Link
to={getProjectLink(task.Project)}
onClick={(e) => e.stopPropagation()}
className="p-1.5 rounded-full text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 flex-shrink-0 ml-auto"
title={t(
'project.viewProject',
'Go to project'
)}
>
<ArrowRightIcon className="h-4 w-4" />
<span className="sr-only">
{t(
'project.viewProject',
'Go to project'
)}
</span>
</Link>
</div>
</div>
</div>
) : (
<div
onClick={() => setProjectDropdownOpen(true)}
className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-dashed border-gray-300 dark:border-gray-700 hover:border-gray-400 dark:hover:border-gray-600 p-6 cursor-pointer transition-colors flex items-center justify-center"
>
<span className="text-sm text-gray-500 dark:text-gray-400 italic">
{t(
'task.noProject',
'No project - Click to assign'
)}
</span>
</div>
)}
</div>
</div>
);
};
export default TaskProjectSection;

View file

@ -0,0 +1,62 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
import { Link } from 'react-router-dom';
import { ArrowPathIcon } from '@heroicons/react/24/outline';
import { Task } from '../../../entities/Task';
interface TaskRecurringInstanceInfoProps {
task: Task;
parentTask: Task | null;
loadingParent: boolean;
}
const TaskRecurringInstanceInfo: React.FC<TaskRecurringInstanceInfoProps> = ({
task,
parentTask,
loadingParent,
}) => {
const { t } = useTranslation();
if (!task.recurring_parent_id) {
return null;
}
return (
<div className="mb-6 p-4 rounded-lg shadow-sm bg-purple-50 dark:bg-purple-900/20">
<div className="flex items-start gap-3">
<ArrowPathIcon className="h-6 w-6 text-purple-600 dark:text-purple-400 flex-shrink-0 mt-0.5" />
<div className="flex-1 min-w-0">
<p className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
{t(
'task.instanceOf',
'This is an instance of a recurring task'
)}
</p>
{loadingParent && (
<div className="flex items-center">
<div className="animate-spin rounded-full h-4 w-4 border-b-2 border-gray-500 mr-2"></div>
<span className="text-sm text-gray-600 dark:text-gray-400">
{t('common.loading', 'Loading parent task...')}
</span>
</div>
)}
{parentTask && (
<p className="text-sm text-gray-600 dark:text-gray-400">
<strong>
{t('task.parentTask', 'Parent Task')}:
</strong>{' '}
<Link
to={`/task/${parentTask.uid}`}
className="text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline font-medium"
>
{parentTask.name}
</Link>
</p>
)}
</div>
</div>
</div>
);
};
export default TaskRecurringInstanceInfo;

View file

@ -0,0 +1,86 @@
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<TaskSummaryAlertsProps> = ({
task,
summaryMessage,
isSummaryDismissed,
isOverdueDismissed,
onDismissSummary,
onDismissOverdue,
}) => {
const { t } = useTranslation();
return (
<>
{/* Summary Alert */}
{!isSummaryDismissed && (
<div className="mb-4 p-4 bg-blue-50 dark:bg-blue-900/20 border-l-4 border-blue-400 rounded-r-lg relative">
<button
onClick={onDismissSummary}
className="absolute top-2 right-2 p-1 text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200 transition-colors"
aria-label={t('common.close', 'Close')}
>
<XMarkIcon className="h-4 w-4" />
</button>
<div className="flex items-center pr-8">
<InformationCircleIcon className="h-5 w-5 text-blue-600 dark:text-blue-300 mr-3 flex-shrink-0" />
<div>
<p className="text-sm font-medium text-blue-900 dark:text-blue-100">
{summaryMessage}
</p>
</div>
</div>
</div>
)}
{/* Overdue Alert */}
{isTaskOverdue(task) && !isOverdueDismissed && (
<div className="mb-6 mt-6 p-4 bg-amber-50 dark:bg-amber-900/20 border-l-4 border-amber-400 rounded-r-lg relative">
<button
onClick={onDismissOverdue}
className="absolute top-2 right-2 p-1 text-amber-600 dark:text-amber-400 hover:text-amber-800 dark:hover:text-amber-200 transition-colors"
aria-label={t('common.close', 'Close')}
>
<XMarkIcon className="h-4 w-4" />
</button>
<div className="flex items-start pr-8">
<ExclamationTriangleIcon className="h-5 w-5 text-amber-600 dark:text-amber-400 mr-3 flex-shrink-0 mt-0.5" />
<div>
<p className="text-sm font-medium text-amber-800 dark:text-amber-200">
{t(
'task.overdueAlert',
"This task was in your plan yesterday and wasn't completed."
)}
</p>
<p className="text-xs text-amber-700 dark:text-amber-300 mt-1">
{t(
'task.overdueYesterday',
'Consider prioritizing this task or breaking it into smaller steps.'
)}
</p>
</div>
</div>
</div>
)}
</>
);
};
export default TaskSummaryAlerts;

View file

@ -0,0 +1,134 @@
import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { TagIcon, ArrowRightIcon } from '@heroicons/react/24/outline';
import TagInput from '../../Tag/TagInput';
import { Task } from '../../../entities/Task';
import { Tag } from '../../../entities/Tag';
interface TaskTagsSectionProps {
task: Task;
availableTags: Tag[];
hasLoadedTags: boolean;
isLoadingTags: boolean;
onUpdate: (tags: string[]) => Promise<void>;
onLoadTags: () => void;
}
const TaskTagsSection: React.FC<TaskTagsSectionProps> = ({
task,
availableTags,
hasLoadedTags,
isLoadingTags,
onUpdate,
onLoadTags,
}) => {
const { t } = useTranslation();
const [isEditing, setIsEditing] = useState(false);
const [editedTags, setEditedTags] = useState<string[]>(
task?.tags?.map((tag: any) => tag.name) || []
);
useEffect(() => {
setEditedTags(task?.tags?.map((tag: any) => tag.name) || []);
}, [task?.tags]);
const handleStartEdit = () => {
setEditedTags(task?.tags?.map((tag: any) => tag.name) || []);
if (!hasLoadedTags && !isLoadingTags) {
onLoadTags();
}
setIsEditing(true);
};
const handleSave = async () => {
const currentTags = task.tags?.map((tag: any) => tag.name) || [];
if (
editedTags.length === currentTags.length &&
editedTags.every((tag, idx) => tag === currentTags[idx])
) {
setIsEditing(false);
return;
}
await onUpdate(editedTags);
setIsEditing(false);
};
const handleCancel = () => {
setEditedTags(task.tags?.map((tag: any) => tag.name) || []);
setIsEditing(false);
};
return (
<div>
<h4 className="text-sm font-semibold text-gray-700 dark:text-gray-300 mb-2">
{t('task.tags', 'Tags')}
</h4>
<div className="rounded-lg shadow-sm bg-white dark:bg-gray-900 border-2 border-gray-50 dark:border-gray-800 hover:border-gray-200 dark:hover:border-gray-700 transition-colors space-y-3">
{isEditing ? (
<div className="space-y-3 p-4">
<TagInput
initialTags={editedTags}
onTagsChange={setEditedTags}
availableTags={availableTags}
onFocus={() => {
if (!hasLoadedTags && !isLoadingTags) {
onLoadTags();
}
}}
/>
<div className="flex justify-end space-x-2">
<button
onClick={handleSave}
className="px-4 py-2 text-sm bg-green-600 dark:bg-green-500 text-white rounded hover:bg-green-700 dark:hover:bg-green-600 transition-colors"
>
{t('common.save', 'Save')}
</button>
<button
onClick={handleCancel}
className="px-4 py-2 text-sm bg-gray-200 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded hover:bg-gray-300 dark:hover:bg-gray-700 transition-colors"
>
{t('common.cancel', 'Cancel')}
</button>
</div>
</div>
) : task.tags && task.tags.length > 0 ? (
<div>
{task.tags.map((tag: any, index: number) => (
<button
key={tag.uid || tag.id || tag.name}
type="button"
onClick={(e) => {
e.stopPropagation();
handleStartEdit();
}}
className={`group flex w-full items-center justify-between px-3 py-2.5 bg-white dark:bg-gray-900 shadow-sm hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors ${
index === 0 ? 'rounded-t-lg' : ''
} ${index === task.tags.length - 1 ? 'rounded-b-lg' : ''}`}
>
<div className="flex items-center space-x-2 min-w-0">
<TagIcon className="h-4 w-4 text-gray-500 dark:text-gray-400" />
<span className="text-sm text-gray-900 dark:text-gray-100 truncate">
{tag.name}
</span>
</div>
<ArrowRightIcon className="h-4 w-4 text-blue-600 dark:text-blue-400 group-hover:text-blue-700 dark:group-hover:text-blue-300 flex-shrink-0" />
</button>
))}
</div>
) : (
<div
onClick={handleStartEdit}
className="p-4 cursor-pointer transition-colors"
>
<span className="text-sm text-gray-500 dark:text-gray-400 italic">
{t('task.noTags', 'No tags')}
</span>
</div>
)}
</div>
</div>
);
};
export default TaskTagsSection;

View file

@ -0,0 +1,7 @@
export { default as TaskDetailsHeader } from './TaskDetailsHeader';
export { default as TaskSummaryAlerts } from './TaskSummaryAlerts';
export { default as TaskContentSection } from './TaskContentSection';
export { default as TaskProjectSection } from './TaskProjectSection';
export { default as TaskTagsSection } from './TaskTagsSection';
export { default as TaskPrioritySection } from './TaskPrioritySection';
export { default as TaskRecurringInstanceInfo } from './TaskRecurringInstanceInfo';

View file

@ -223,13 +223,16 @@ const TaskModal: React.FC<TaskModalProps> = ({
}, [isOpen]);
// Auto-scroll to subtasks section when modal opens with autoFocusSubtasks
// But don't auto-scroll for recurring tasks
useEffect(() => {
if (isOpen && autoFocusSubtasks) {
const isRecurringTask =
task.recurrence_type && task.recurrence_type !== 'none';
if (isOpen && autoFocusSubtasks && !isRecurringTask) {
setTimeout(() => {
scrollToSubtasksSection();
}, 300);
}
}, [isOpen, autoFocusSubtasks]);
}, [isOpen, autoFocusSubtasks, task.recurrence_type]);
// Load tags when modal opens if not already loaded
useEffect(() => {

View file

@ -140,6 +140,8 @@ const TaskTimeline: React.FC<TaskTimelineProps> = ({ taskUid, refreshKey }) => {
}
return t('timeline.events.recurrenceTypeChanged');
}
case 'completion_based_changed':
return t('timeline.events.completionBasedChanged');
case 'name_changed':
return t('timeline.events.nameUpdated');
case 'description_changed':
@ -148,6 +150,8 @@ const TaskTimeline: React.FC<TaskTimelineProps> = ({ taskUid, refreshKey }) => {
return t('timeline.events.noteUpdated');
case 'project_changed':
return t('timeline.events.projectChanged');
case 'project_id_changed':
return t('timeline.events.projectIdChanged');
case 'tags_changed':
return t('timeline.events.tagsUpdated');
case 'archived':

View file

@ -77,25 +77,16 @@ const Tasks: React.FC = () => {
let filteredTasks: Task[];
// Filter by completion status (applies to all views)
if (showCompleted) {
// Show only completed tasks (done=2 or archived=3)
filteredTasks = tasks.filter(
(task: Task) =>
task.status === 'done' ||
task.status === 'archived' ||
task.status === 2 ||
task.status === 3
);
} else {
// Show only non-completed tasks - exclude done(2) and archived(3)
filteredTasks = tasks.filter(
(task: Task) =>
task.status !== 'done' &&
task.status !== 'archived' &&
task.status !== 2 &&
task.status !== 3
);
}
filteredTasks = showCompleted
? tasks // Show everything when completed tasks are toggled on
: tasks.filter(
// Otherwise hide completed/archived items
(task: Task) =>
task.status !== 'done' &&
task.status !== 'archived' &&
task.status !== 2 &&
task.status !== 3
);
// Then filter by search query if provided (skip for upcoming view)
if (taskSearchQuery.trim() && !isUpcomingView) {
@ -477,8 +468,12 @@ const Tasks: React.FC = () => {
};
return (
<div className="w-full px-2 sm:px-4 lg:px-6 pt-4 pb-8">
<div className="w-full max-w-5xl mx-auto">
<div
className={`w-full pt-4 pb-8 ${isUpcomingView ? '' : 'px-2 sm:px-4 lg:px-6'}`}
>
<div
className={`w-full ${isUpcomingView ? '' : 'max-w-5xl mx-auto'}`}
>
{/* Title row with info button and filters dropdown on the right */}
<div
className={`flex items-center justify-between gap-2 min-w-0 ${

View file

@ -27,6 +27,7 @@ const Views: React.FC = () => {
const [views, setViews] = useState<View[]>([]);
const [isLoading, setIsLoading] = useState(true);
const [searchQuery, setSearchQuery] = useState('');
const [isSearchExpanded, setIsSearchExpanded] = useState(false);
const [hoveredViewId, setHoveredViewId] = useState<number | null>(null);
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = useState(false);
const [viewToDelete, setViewToDelete] = useState<View | null>(null);
@ -125,14 +126,50 @@ const Views: React.FC = () => {
<div className="w-full px-2 sm:px-4 lg:px-6 pt-4 pb-8">
<div className="w-full">
{/* Views Header */}
<div className="flex items-center mb-8">
<div className="flex items-center justify-between mb-8">
<h2 className="text-2xl font-light">{t('views.title')}</h2>
<button
type="button"
onClick={() => setIsSearchExpanded(!isSearchExpanded)}
className={`flex items-center transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-inset rounded-lg p-2 ${
isSearchExpanded
? 'bg-blue-50/70 dark:bg-blue-900/20'
: 'bg-gray-100 dark:bg-gray-800 hover:bg-gray-200 dark:hover:bg-gray-700'
}`}
aria-expanded={isSearchExpanded}
aria-label={
isSearchExpanded
? t(
'common.hideSearch',
'Collapse search panel'
)
: t('common.showSearch', 'Show search input')
}
title={
isSearchExpanded
? t('common.hideSearch', 'Hide search')
: t('common.search', 'Search views')
}
>
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-200" />
<span className="sr-only">
{isSearchExpanded
? t('common.hideSearch', 'Hide search')
: t('common.search', 'Search views')}
</span>
</button>
</div>
{/* Search Bar */}
<div className="mb-4">
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm p-2">
<MagnifyingGlassIcon className="h-5 w-5 text-gray-500 dark:text-gray-400 mr-2" />
{/* Search input section, collapsible */}
<div
className={`transition-all duration-300 ease-in-out ${
isSearchExpanded
? 'max-h-24 opacity-100 mb-4'
: 'max-h-0 opacity-0 mb-0'
} overflow-hidden`}
>
<div className="flex items-center bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-md shadow-sm px-4 py-3">
<MagnifyingGlassIcon className="h-5 w-5 text-gray-600 dark:text-gray-400 mr-2" />
<input
type="text"
placeholder={t('views.searchPlaceholder')}

View file

@ -9,7 +9,9 @@ export interface TaskEvent {
| 'due_date_changed'
| 'recurrence_end_date_changed'
| 'recurrence_type_changed'
| 'completion_based_changed'
| 'project_changed'
| 'project_id_changed'
| 'name_changed'
| 'description_changed'
| 'note_changed'

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "تاريخ انتهاء التكرار تم تغييره",
"recurrenceEndDate": "تاريخ انتهاء التكرار",
"recurrence_type_changed": "تم تغيير نوع التكرار",
"recurrence_interval_changed": "تم تغيير فترة التكرار"
"recurrence_interval_changed": "تم تغيير فترة التكرار",
"completionBasedChanged": "تغيير التكرار القائم على الإنجاز",
"projectIdChanged": "مُعين لمشروع",
"recurrenceType": "نوع التكرار",
"recurrenceTypeChanged": "تغيير نوع التكرار"
},
"justNow": "الآن",
"minutesAgo": "{{minutes}} دقيقة مضت",
@ -410,7 +414,8 @@
"monthDay": "يوم من الشهر",
"weekOfMonth": "أسبوع من الشهر",
"recurrenceEndDate": "تاريخ الانتهاء (اختياري)",
"completionBased": "كرر بعد الانتهاء"
"completionBased": "كرر بعد الانتهاء",
"repeatOn": "التكرار في"
},
"projectSearchPlaceholder": "ابحث أو أنشئ مشروعًا...",
"noMatchingProjects": "لا توجد مشاريع مطابقة",
@ -431,7 +436,8 @@
"short": "حاول أن تكون أكثر تحديدًا بشأن ما يجب القيام به",
"noVerb": "ما الإجراء المحدد الذي تحتاج إلى اتخاذه؟ حاول البدء بفعل.",
"vague": "حاول البدء بفعل عمل مثل \"اتصل\"، \"اكتب\"، \"حدد موعدًا\"، أو \"ابحث\""
}
},
"selectAtLeastOneDay": "يرجى اختيار يوم واحد على الأقل"
},
"noteTitle": "عنوان الملاحظة",
"noteContent": "محتوى الملاحظة",
@ -506,7 +512,10 @@
"browseImage": "تصفح الصورة",
"noNotes": "لا توجد ملاحظات لهذا المشروع.",
"deleteProject": "حذف المشروع",
"createSuccess": "تم إنشاء المشروع بنجاح!"
"createSuccess": "تم إنشاء المشروع بنجاح!",
"createdAndAssigned": "تم إنشاء المشروع وتعيينه",
"createError": "فشل في إنشاء المشروع",
"viewProject": "اذهب إلى المشروع"
},
"errors": {
"required": "هذا الحقل مطلوب",
@ -661,7 +670,70 @@
"subtasks": "المهام الفرعية",
"noSubtasks": "لا توجد مهام فرعية بعد",
"recentActivity": "النشاط الأخير",
"noActivityYet": "لا توجد نشاطات بعد"
"noActivityYet": "لا توجد نشاطات بعد",
"thisTask": "هذه المهمة",
"is": "هي",
"and": "و",
"dueOn": "مستحقة",
"inProject": "في المشروع",
"lowPriority": "أولوية منخفضة",
"mediumPriority": "أولوية متوسطة",
"highPriority": "أولوية عالية",
"status": {
"notStarted": "لم تبدأ",
"inProgress": "قيد التنفيذ",
"done": "مكتملة",
"archived": "مؤرشفة",
"unknown": "جارية"
},
"noSubtasksClickToAdd": "لا توجد مهام فرعية بعد، انقر لإضافة",
"project": "المشروع",
"noProject": "لا يوجد مشروع - انقر للتعيين",
"tags": "الوسوم",
"noTags": "لا توجد وسوم",
"priority": "الأولوية",
"dueDate": "تاريخ الاستحقاق",
"recurringSetup": "إعداد متكرر",
"notRecurring": "هذه المهمة ليست متكررة بعد.",
"clickToEditTitle": "انقر لتحرير العنوان",
"clickToEditContent": "انقر لتحرير المحتوى",
"clickToAddContent": "انقر لإضافة محتوى",
"clickToEditSubtasks": "انقر لتحرير المهام الفرعية",
"clickToAddOrEditSubtasks": "انقر لإضافة أو تحرير المهام الفرعية",
"contentPlaceholder": "أضف المحتوى هنا... (يدعم Markdown)",
"contentEditHint": "اضغط Cmd/Ctrl+Enter لحفظ، Esc للإلغاء",
"noContentPreview": "لا يوجد محتوى للمعاينة. انتقل إلى وضع التحرير لإضافة محتوى.",
"deleteConfirmTitle": "حذف المهمة",
"deleteConfirmMessage": "هل أنت متأكد أنك تريد حذف هذه المهمة؟ لا يمكن التراجع عن هذا الإجراء.",
"noMoreIterations": "لا توجد مزيد من التكرارات المجدولة",
"nextOccurrences": "التكرارات القادمة",
"nextOccurrencesAfterThis": "التكرارات القادمة بعد ذلك",
"inDays": "في {{count}} يوم",
"daysAgo": "{{count}} يوم مضى",
"tagsUpdated": "تم تحديث العلامات بنجاح",
"tagsUpdateError": "فشل في تحديث العلامات",
"recurrenceUpdated": "تم تحديث التكرار بنجاح",
"recurrenceUpdateError": "فشل في تحديث التكرار",
"dueDateUpdated": "تم تحديث تاريخ الاستحقاق بنجاح",
"dueDateUpdateError": "فشل في تحديث تاريخ الاستحقاق",
"titleUpdated": "تم تحديث عنوان المهمة بنجاح",
"titleUpdateError": "فشل في تحديث عنوان المهمة",
"contentUpdated": "تم تحديث محتوى المهمة بنجاح",
"contentUpdateError": "فشل في تحديث محتوى المهمة",
"subtasksUpdated": "تم تحديث المهام الفرعية بنجاح",
"subtasksUpdateError": "فشل في تحديث المهام الفرعية",
"projectUpdated": "تم تحديث المشروع بنجاح",
"projectUpdateError": "فشل في تحديث المشروع",
"projectCleared": "تم مسح المشروع بنجاح",
"projectClearError": "فشل في مسح المشروع",
"priorityUpdated": "تم تحديث الأولوية بنجاح",
"priorityUpdateError": "فشل في تحديث الأولوية",
"noDueDate": "لا توجد تاريخ استحقاق",
"instanceOf": "هذه نسخة من مهمة متكررة",
"parentTask": "المهمة الرئيسية",
"includingToday": "بما في ذلك اليوم",
"has": "يمتلك",
"fromProject": "من المشروع"
},
"projects": {
"loading": "جارٍ تحميل المشاريع...",
@ -1062,5 +1134,8 @@
"nonRecurring": "غير متكرر",
"instances": "حالات متكررة"
}
},
"subtasks": {
"placeholder": "أضف مهمة فرعية..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Дата на края на повторението е променена",
"recurrenceEndDate": "Дата на края на повторението",
"recurrence_type_changed": "Типът на повторение е променен",
"recurrence_interval_changed": "Интервалът на повторение е променен"
"recurrence_interval_changed": "Интервалът на повторение е променен",
"completionBasedChanged": "Променена е повторяемостта на базата на завършване",
"projectIdChanged": "Присвоено на проект",
"recurrenceType": "Тип повторяемост",
"recurrenceTypeChanged": "Променен е типът повторяемост"
},
"justNow": "Току-що",
"minutesAgo": "{{minutes}}м. назад",
@ -410,7 +414,8 @@
"monthDay": "Ден от месеца",
"weekOfMonth": "Седмица от месеца",
"recurrenceEndDate": "Краен срок (по избор)",
"completionBased": "Повторете след завършване"
"completionBased": "Повторете след завършване",
"repeatOn": "Повтаряй на"
},
"projectSearchPlaceholder": "Търсене или създаване на проект...",
"noMatchingProjects": "Няма съвпадащи проекти",
@ -431,7 +436,8 @@
"short": "Опитайте да бъдете по-конкретни относно това, което трябва да се направи",
"noVerb": "Какво конкретно действие трябва да предприемете? Опитайте да започнете с глагол.",
"vague": "Опитайте да започнете с глагол за действие като \"Обади се\", \"Напиши\", \"Насрочи\" или \"Изследвай\""
}
},
"selectAtLeastOneDay": "Моля, изберете поне един ден"
},
"noteTitle": "Заглавие на бележка",
"noteContent": "Съдържание на бележка",
@ -506,7 +512,10 @@
"browseImage": "Преглед на изображение",
"noNotes": "Няма бележки за този проект.",
"deleteProject": "Изтрий проекта",
"createSuccess": "Проектът беше създаден успешно!"
"createSuccess": "Проектът беше създаден успешно!",
"createdAndAssigned": "Проектът е създаден и назначен",
"createError": "Неуспешно създаване на проект",
"viewProject": "Отидете на проекта"
},
"errors": {
"required": "Това поле е задължително",
@ -661,7 +670,70 @@
"subtasks": "Подзадачи",
"noSubtasks": "Все още няма подзадачи",
"recentActivity": "Наскоро извършена дейност",
"noActivityYet": "Все още няма активност"
"noActivityYet": "Все още няма активност",
"thisTask": "Тази задача",
"is": "е",
"and": "и",
"dueOn": "срок",
"inProject": "от проект",
"lowPriority": "ниска приоритетност",
"mediumPriority": "средна приоритетност",
"highPriority": "висока приоритетност",
"inDays": "в {{count}} дни",
"daysAgo": "{{count}} дни назад",
"tagsUpdated": "Таговете са актуализирани успешно",
"tagsUpdateError": "Неуспешно актуализиране на таговете",
"recurrenceUpdated": "Повторяемостта е актуализирана успешно",
"recurrenceUpdateError": "Неуспешно актуализиране на повторяемостта",
"dueDateUpdated": "Срокът е актуализиран успешно",
"dueDateUpdateError": "Неуспешно актуализиране на срока",
"titleUpdated": "Заглавието на задачата е актуализирано успешно",
"titleUpdateError": "Неуспешно актуализиране на заглавието на задачата",
"contentUpdated": "Съдържанието на задачата е актуализирано успешно",
"contentUpdateError": "Неуспешно актуализиране на съдържанието на задачата",
"subtasksUpdated": "Подзадачите са актуализирани успешно",
"subtasksUpdateError": "Неуспешно актуализиране на подзадачите",
"projectUpdated": "Проектът е актуализиран успешно",
"projectUpdateError": "Неуспешно актуализиране на проекта",
"projectCleared": "Проектът е изчистен успешно",
"projectClearError": "Неуспешно изчистване на проекта",
"priorityUpdated": "Приоритетът е актуализиран успешно",
"priorityUpdateError": "Неуспешно актуализиране на приоритета",
"status": {
"notStarted": "не е започнато",
"inProgress": "в процес на изпълнение",
"done": "завършено",
"archived": "архивирано",
"unknown": "в ход"
},
"noSubtasksClickToAdd": "Все още няма подзадачи, кликнете, за да добавите",
"project": "Проект",
"noProject": "Няма проект - Кликнете, за да назначите",
"tags": "Тагове",
"noTags": "Няма тагове",
"priority": "Приоритет",
"dueDate": "Срок",
"recurringSetup": "Настройка на повтарящи се",
"notRecurring": "Тази задача все още не е повтаряща се.",
"clickToEditTitle": "Кликнете, за да редактирате заглавието",
"clickToEditContent": "Кликнете, за да редактирате съдържанието",
"clickToAddContent": "Кликнете, за да добавите съдържание",
"clickToEditSubtasks": "Кликнете, за да редактирате подзадачите",
"clickToAddOrEditSubtasks": "Кликнете, за да добавите или редактирате подзадачите",
"contentPlaceholder": "Добавете съдържание тук... (поддържа Markdown)",
"contentEditHint": "Натиснете Cmd/Ctrl+Enter, за да запазите, Esc, за да отмените",
"noContentPreview": "Няма съдържание за преглед. Превключете в режим Редактиране, за да добавите съдържание.",
"deleteConfirmTitle": "Изтриване на задача",
"deleteConfirmMessage": "Сигурни ли сте, че искате да изтриете тази задача? Това действие не може да бъде отменено.",
"noMoreIterations": "Няма повече планирани итерации",
"nextOccurrences": "Следващи случаи",
"nextOccurrencesAfterThis": "Следващи случаи след това",
"noDueDate": "Няма крайна дата",
"instanceOf": "Това е инстанция на повтаряща се задача",
"parentTask": "Родителска задача",
"includingToday": "включително днес",
"has": "има",
"fromProject": "от проекта"
},
"projects": {
"loading": "Зареждане на проекти...",
@ -1062,5 +1134,8 @@
"nonRecurring": "неповтарящи се",
"instances": "повтарящи се инстанции"
}
},
"subtasks": {
"placeholder": "Добавете подзадача..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Ændret slutdato for gentagelse",
"recurrenceEndDate": "Slutdato for gentagelse",
"recurrence_type_changed": "Ændret gentagelsestype",
"recurrence_interval_changed": "Ændret gentagelsesinterval"
"recurrence_interval_changed": "Ændret gentagelsesinterval",
"completionBasedChanged": "Ændret baseret på fuldførelse",
"projectIdChanged": "Tildelt et projekt",
"recurrenceType": "Gentagelsestype",
"recurrenceTypeChanged": "Gentagelsestype ændret"
},
"justNow": "Lige nu",
"minutesAgo": "{{minutes}}m siden",
@ -410,7 +414,8 @@
"monthDay": "Dag i måneden",
"weekOfMonth": "Uge i måneden",
"recurrenceEndDate": "Slutdato (valgfri)",
"completionBased": "Gentag efter fuldførelse"
"completionBased": "Gentag efter fuldførelse",
"repeatOn": "Gentag på"
},
"projectSearchPlaceholder": "Søg eller opret et projekt...",
"noMatchingProjects": "Ingen matchende projekter",
@ -431,7 +436,8 @@
"short": "Prøv at være mere specifik om, hvad der skal gøres",
"noVerb": "Hvilken specifik handling skal du tage? Prøv at starte med et verbum.",
"vague": "Prøv at starte med et handlingsverb som \"Ring\", \"Skriv\", \"Planlæg\" eller \"Undersøg\""
}
},
"selectAtLeastOneDay": "Vælg venligst mindst én dag"
},
"noteTitle": "Notetitel",
"noteContent": "Noteindhold",
@ -506,7 +512,10 @@
"browseImage": "Gennemse Billede",
"noNotes": "Ingen noter til dette projekt.",
"deleteProject": "Slet Projekt",
"createSuccess": "Projekt oprettet med succes!"
"createSuccess": "Projekt oprettet med succes!",
"createdAndAssigned": "Projekt oprettet og tildelt",
"createError": "Fejl ved oprettelse af projekt",
"viewProject": "Gå til projekt"
},
"errors": {
"required": "Dette felt er påkrævet",
@ -661,7 +670,70 @@
"subtasks": "Underopgaver",
"noSubtasks": "Ingen underopgaver endnu",
"recentActivity": "Seneste aktivitet",
"noActivityYet": "Ingen aktivitet endnu"
"noActivityYet": "Ingen aktivitet endnu",
"thisTask": "Denne opgave",
"is": "er",
"and": "og",
"dueOn": "forfald",
"inProject": "fra projekt",
"lowPriority": "lav prioritet",
"mediumPriority": "medium prioritet",
"highPriority": "høj prioritet",
"inDays": "om {{count}} dage",
"daysAgo": "{{count}} dage siden",
"tagsUpdated": "Tags opdateret med succes",
"tagsUpdateError": "Kunne ikke opdatere tags",
"recurrenceUpdated": "Gentagelse opdateret med succes",
"recurrenceUpdateError": "Kunne ikke opdatere gentagelse",
"dueDateUpdated": "Forfaldsdato opdateret med succes",
"dueDateUpdateError": "Kunne ikke opdatere forfaldsdato",
"titleUpdated": "Opgavetitlen blev opdateret med succes",
"titleUpdateError": "Fejl ved opdatering af opgavetitel",
"contentUpdated": "Opgaveindholdet blev opdateret med succes",
"contentUpdateError": "Fejl ved opdatering af opgaveindhold",
"subtasksUpdated": "Underopgaver opdateret med succes",
"subtasksUpdateError": "Fejl ved opdatering af underopgaver",
"projectUpdated": "Projektet blev opdateret med succes",
"projectUpdateError": "Fejl ved opdatering af projekt",
"projectCleared": "Projektet blev ryddet med succes",
"projectClearError": "Fejl ved rydning af projekt",
"priorityUpdated": "Prioritet opdateret med succes",
"priorityUpdateError": "Fejl ved opdatering af prioritet",
"status": {
"notStarted": "ikke startet",
"inProgress": "i gang",
"done": "fuldført",
"archived": "arkiveret",
"unknown": "gående"
},
"noSubtasksClickToAdd": "Ingen underopgaver endnu, klik for at tilføje",
"project": "Projekt",
"noProject": "Ingen projekt - Klik for at tildele",
"tags": "Tags",
"noTags": "Ingen tags",
"priority": "Prioritet",
"dueDate": "Forfaldsdato",
"recurringSetup": "Gentagen opsætning",
"notRecurring": "Denne opgave er ikke gentagende endnu.",
"clickToEditTitle": "Klik for at redigere titel",
"clickToEditContent": "Klik for at redigere indhold",
"clickToAddContent": "Klik for at tilføje indhold",
"clickToEditSubtasks": "Klik for at redigere underopgaver",
"clickToAddOrEditSubtasks": "Klik for at tilføje eller redigere underopgaver",
"contentPlaceholder": "Tilføj indhold her... (Markdown understøttet)",
"contentEditHint": "Tryk på Cmd/Ctrl+Enter for at gemme, Esc for at annullere",
"noContentPreview": "Ingen indhold at forhåndsvise. Skift til redigeringstilstand for at tilføje indhold.",
"deleteConfirmTitle": "Slet Opgave",
"deleteConfirmMessage": "Er du sikker på, at du vil slette denne opgave? Denne handling kan ikke fortrydes.",
"noMoreIterations": "Ingen flere iterationer planlagt",
"nextOccurrences": "Næste Forekomster",
"nextOccurrencesAfterThis": "Næste Forekomster Efter Dette",
"noDueDate": "Ingen forfaldsdato",
"instanceOf": "Dette er en instans af en tilbagevendende opgave",
"parentTask": "Overordnet opgave",
"includingToday": "inklusive i dag",
"has": "har",
"fromProject": "fra projektet"
},
"projects": {
"loading": "Indlæser projekter...",
@ -1062,5 +1134,8 @@
"nonRecurring": "ikke-gentagende",
"instances": "gentagende instanser"
}
},
"subtasks": {
"placeholder": "Tilføj en underopgave..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Das Enddatum der Wiederholung wurde geändert",
"recurrenceEndDate": "Enddatum der Wiederholung",
"recurrence_type_changed": "Wiederholungsart geändert",
"recurrence_interval_changed": "Wiederholungsintervall geändert"
"recurrence_interval_changed": "Wiederholungsintervall geändert",
"completionBasedChanged": "Änderung der auf Abschluss basierenden Wiederholung",
"projectIdChanged": "Einem Projekt zugewiesen",
"recurrenceType": "Wiederholungstyp",
"recurrenceTypeChanged": "Wiederholungstyp geändert"
},
"justNow": "Gerade eben",
"minutesAgo": "{{minutes}}m her",
@ -181,7 +185,8 @@
"status": "Status",
"priority": "Priorität",
"dueDate": "Fälligkeitsdatum",
"note": "Notiz"
"note": "Notiz",
"repeatOn": "Wiederholen am"
},
"recurrenceSettings": "Wiederholungseinstellungen",
"completionBasedHelp": "Falls aktiviert, wird die nächste Aufgabe basierend auf dem Abschlussdatum statt dem Fälligkeitsdatum erstellt",
@ -203,7 +208,8 @@
"short": "Versuchen Sie, genauer zu beschreiben, was getan werden muss",
"noVerb": "Welche spezifische Aktion müssen Sie durchführen? Versuchen Sie, mit einem Verb zu beginnen.",
"vague": "Versuchen Sie, mit einem Aktionsverb wie \"Anrufen\", \"Schreiben\", \"Planen\" oder \"Forschen\" zu beginnen"
}
},
"selectAtLeastOneDay": "Bitte wählen Sie mindestens einen Tag aus"
},
"noteTitle": "Notiz-Titel",
"noteContent": "Notiz-Inhalt",
@ -383,7 +389,10 @@
"name": "Projektname",
"noNotes": "Keine Notizen für dieses Projekt.",
"deleteProject": "Projekt löschen",
"createSuccess": "Projekt erfolgreich erstellt!"
"createSuccess": "Projekt erfolgreich erstellt!",
"createdAndAssigned": "Projekt erstellt und zugewiesen",
"createError": "Projekt konnte nicht erstellt werden",
"viewProject": "Zum Projekt gehen"
},
"profile": {
"title": "Profil-Einstellungen",
@ -595,7 +604,70 @@
"subtasks": "Unteraufgaben",
"noSubtasks": "Noch keine Unteraufgaben",
"recentActivity": "Aktuelle Aktivitäten",
"noActivityYet": "Noch keine Aktivität"
"noActivityYet": "Noch keine Aktivität",
"thisTask": "Diese Aufgabe",
"is": "ist",
"and": "und",
"dueOn": "fällig",
"inProject": "aus dem Projekt",
"lowPriority": "niedrige Priorität",
"mediumPriority": "mittlere Priorität",
"highPriority": "hohe Priorität",
"inDays": "in {{count}} Tagen",
"daysAgo": "{{count}} Tage her",
"tagsUpdated": "Tags erfolgreich aktualisiert",
"tagsUpdateError": "Fehler beim Aktualisieren der Tags",
"recurrenceUpdated": "Wiederholung erfolgreich aktualisiert",
"recurrenceUpdateError": "Fehler beim Aktualisieren der Wiederholung",
"dueDateUpdated": "Fälligkeitsdatum erfolgreich aktualisiert",
"dueDateUpdateError": "Fehler beim Aktualisieren des Fälligkeitsdatums",
"titleUpdated": "Aufgabentitel erfolgreich aktualisiert",
"titleUpdateError": "Fehler beim Aktualisieren des Aufgabentitels",
"contentUpdated": "Aufgabeninhalt erfolgreich aktualisiert",
"contentUpdateError": "Fehler beim Aktualisieren des Aufgabeninhalts",
"subtasksUpdated": "Unteraufgaben erfolgreich aktualisiert",
"subtasksUpdateError": "Fehler beim Aktualisieren der Unteraufgaben",
"projectUpdated": "Projekt erfolgreich aktualisiert",
"projectUpdateError": "Fehler beim Aktualisieren des Projekts",
"projectCleared": "Projekt erfolgreich gelöscht",
"projectClearError": "Fehler beim Löschen des Projekts",
"priorityUpdated": "Priorität erfolgreich aktualisiert",
"priorityUpdateError": "Fehler beim Aktualisieren der Priorität",
"status": {
"notStarted": "nicht gestartet",
"inProgress": "in Bearbeitung",
"done": "abgeschlossen",
"archived": "archiviert",
"unknown": "laufend"
},
"noSubtasksClickToAdd": "Noch keine Unteraufgaben, klicken Sie zum Hinzufügen",
"project": "Projekt",
"noProject": "Kein Projekt - Klicken Sie, um zuzuweisen",
"tags": "Tags",
"noTags": "Keine Tags",
"priority": "Priorität",
"dueDate": "Fälligkeitsdatum",
"recurringSetup": "Wiederkehrende Einrichtung",
"notRecurring": "Diese Aufgabe ist noch nicht wiederkehrend.",
"clickToEditTitle": "Klicken Sie, um den Titel zu bearbeiten",
"clickToEditContent": "Klicken Sie, um den Inhalt zu bearbeiten",
"clickToAddContent": "Klicken Sie, um Inhalt hinzuzufügen",
"clickToEditSubtasks": "Klicken Sie, um Unteraufgaben zu bearbeiten",
"clickToAddOrEditSubtasks": "Klicken Sie, um Unteraufgaben hinzuzufügen oder zu bearbeiten",
"contentPlaceholder": "Inhalt hier hinzufügen... (Markdown unterstützt)",
"contentEditHint": "Drücken Sie Cmd/Ctrl+Enter, um zu speichern, Esc, um abzubrechen",
"noContentPreview": "Kein Inhalt zur Vorschau. Wechseln Sie in den Bearbeitungsmodus, um Inhalte hinzuzufügen.",
"deleteConfirmTitle": "Aufgabe löschen",
"deleteConfirmMessage": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"noMoreIterations": "Keine weiteren Iterationen geplant",
"nextOccurrences": "Nächste Vorkommen",
"nextOccurrencesAfterThis": "Nächste Vorkommen nach diesem",
"noDueDate": "Kein Fälligkeitsdatum",
"instanceOf": "Dies ist eine Instanz einer wiederkehrenden Aufgabe",
"parentTask": "Übergeordnete Aufgabe",
"includingToday": "einschließlich heute",
"has": "hat",
"fromProject": "vom Projekt"
},
"calendar": {
"month": "Monat",
@ -1071,5 +1143,8 @@
"nonRecurring": "nicht-wiederkehrend",
"instances": "wiederkehrende Instanzen"
}
},
"subtasks": {
"placeholder": "Fügen Sie eine Unteraufgabe hinzu..."
}
}

View file

@ -359,7 +359,11 @@
"recurrenceEndDateChanged": "Η ημερομηνία λήξης επανάληψης άλλαξε",
"recurrenceEndDate": "Η ημερομηνία λήξης επανάληψης",
"recurrence_type_changed": "Ο τύπος επανάληψης άλλαξε",
"recurrence_interval_changed": "Το διάστημα επανάληψης άλλαξε"
"recurrence_interval_changed": "Το διάστημα επανάληψης άλλαξε",
"completionBasedChanged": "Η επανάληψη με βάση την ολοκλήρωση άλλαξε",
"projectIdChanged": "Ανατέθηκε σε έργο",
"recurrenceType": "Τύπος επανάληψης",
"recurrenceTypeChanged": "Ο τύπος επανάληψης άλλαξε"
},
"justNow": "Μόλις τώρα",
"minutesAgo": "{{minutes}} λεπτά πριν",
@ -539,7 +543,8 @@
"monthDay": "Ημέρα του μήνα",
"weekOfMonth": "Εβδομάδα του μήνα",
"recurrenceEndDate": "Ημερομηνία λήξης (προαιρετικό)",
"completionBased": "Επανάληψη μετά την ολοκλήρωση"
"completionBased": "Επανάληψη μετά την ολοκλήρωση",
"repeatOn": "Επανάληψη στις"
},
"recurrenceSettings": "Ρυθμίσεις Επανάληψης",
"completionBasedHelp": "Αν είναι ενεργοποιημένο, η επόμενη εργασία θα δημιουργηθεί με βάση την ημερομηνία ολοκλήρωσης αντί της ημερομηνίας λήξης",
@ -556,7 +561,8 @@
"short": "Προσπαθήστε να είστε πιο συγκεκριμένοι σχετικά με το τι πρέπει να γίνει",
"noVerb": "Ποια συγκεκριμένη ενέργεια πρέπει να κάνετε; Δοκιμάστε να ξεκινήσετε με ένα ρήμα.",
"vague": "Δοκιμάστε να ξεκινήσετε με ένα ρήμα δράσης όπως \"Καλέστε\", \"Γράψτε\", \"Προγραμματίστε\", ή \"Έρευνα\""
}
},
"selectAtLeastOneDay": "Παρακαλώ επιλέξτε τουλάχιστον μία ημέρα"
},
"projectDescriptionPlaceholder": "Εισάγετε περιγραφή έργου"
},
@ -622,7 +628,70 @@
"subtasks": "Υποεργασίες",
"noSubtasks": "Δεν υπάρχουν υποεργασίες ακόμα",
"recentActivity": "Πρόσφατη Δραστηριότητα",
"noActivityYet": "Δεν υπάρχει καμία δραστηριότητα ακόμα"
"noActivityYet": "Δεν υπάρχει καμία δραστηριότητα ακόμα",
"thisTask": "Αυτή η εργασία",
"is": "είναι",
"and": "και",
"dueOn": "προθεσμία",
"inProject": "από έργο",
"lowPriority": "χαμηλή προτεραιότητα",
"mediumPriority": "μεσαία προτεραιότητα",
"highPriority": "υψηλή προτεραιότητα",
"inDays": "σε {{count}} ημέρες",
"daysAgo": "{{count}} ημέρες πριν",
"tagsUpdated": "Οι ετικέτες ενημερώθηκαν επιτυχώς",
"tagsUpdateError": "Αποτυχία ενημέρωσης ετικετών",
"recurrenceUpdated": "Η επανάληψη ενημερώθηκε επιτυχώς",
"recurrenceUpdateError": "Αποτυχία ενημέρωσης επανάληψης",
"dueDateUpdated": "Η προθεσμία ενημερώθηκε επιτυχώς",
"dueDateUpdateError": "Αποτυχία ενημέρωσης προθεσμίας",
"titleUpdated": "Ο τίτλος της εργασίας ενημερώθηκε επιτυχώς",
"titleUpdateError": "Αποτυχία ενημέρωσης του τίτλου της εργασίας",
"contentUpdated": "Το περιεχόμενο της εργασίας ενημερώθηκε επιτυχώς",
"contentUpdateError": "Αποτυχία ενημέρωσης του περιεχομένου της εργασίας",
"subtasksUpdated": "Οι υποεργασίες ενημερώθηκαν επιτυχώς",
"subtasksUpdateError": "Αποτυχία ενημέρωσης των υποεργασιών",
"projectUpdated": "Το έργο ενημερώθηκε επιτυχώς",
"projectUpdateError": "Αποτυχία ενημέρωσης του έργου",
"projectCleared": "Το έργο καθαρίστηκε επιτυχώς",
"projectClearError": "Αποτυχία καθαρισμού του έργου",
"priorityUpdated": "Η προτεραιότητα ενημερώθηκε επιτυχώς",
"priorityUpdateError": "Αποτυχία ενημέρωσης της προτεραιότητας",
"status": {
"notStarted": "δεν έχει ξεκινήσει",
"inProgress": "σε εξέλιξη",
"done": "ολοκληρώθηκε",
"archived": "αρχειοθετημένο",
"unknown": "σε εξέλιξη"
},
"noSubtasksClickToAdd": "Δεν υπάρχουν υποκαθήκοντα ακόμη, κάντε κλικ για να προσθέσετε",
"project": "Έργο",
"noProject": "Δεν υπάρχει έργο - Κάντε κλικ για να αναθέσετε",
"tags": "Ετικέτες",
"noTags": "Δεν υπάρχουν ετικέτες",
"priority": "Προτεραιότητα",
"dueDate": "Ημερομηνία λήξης",
"recurringSetup": "Ρύθμιση επανάληψης",
"notRecurring": "Αυτή η εργασία δεν είναι επαναλαμβανόμενη ακόμη.",
"clickToEditTitle": "Κάντε κλικ για να επεξεργαστείτε τον τίτλο",
"clickToEditContent": "Κάντε κλικ για να επεξεργαστείτε το περιεχόμενο",
"clickToAddContent": "Κάντε κλικ για να προσθέσετε περιεχόμενο",
"clickToEditSubtasks": "Κάντε κλικ για να επεξεργαστείτε τα υποκαθήκοντα",
"clickToAddOrEditSubtasks": "Κάντε κλικ για να προσθέσετε ή να επεξεργαστείτε υποκαθήκοντα",
"contentPlaceholder": "Προσθέστε περιεχόμενο εδώ... (υποστηρίζεται Markdown)",
"contentEditHint": "Πατήστε Cmd/Ctrl+Enter για αποθήκευση, Esc για ακύρωση",
"noContentPreview": "Δεν υπάρχει περιεχόμενο για προεπισκόπηση. Μεταβείτε σε λειτουργία Επεξεργασίας για να προσθέσετε περιεχόμενο.",
"deleteConfirmTitle": "Διαγραφή Εργασίας",
"deleteConfirmMessage": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την εργασία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"noMoreIterations": "Δεν υπάρχουν άλλες προγραμματισμένες επαναλήψεις",
"nextOccurrences": "Επόμενες Επαναλήψεις",
"nextOccurrencesAfterThis": "Επόμενες Επαναλήψεις Μετά από Αυτή",
"noDueDate": "Χωρίς προθεσμία",
"instanceOf": "Αυτή είναι μια περίπτωση επαναλαμβανόμενης εργασίας",
"parentTask": "Γονική Εργασία",
"includingToday": "συμπεριλαμβανομένης της σημερινής ημέρας",
"has": "έχει",
"fromProject": "από το έργο"
},
"dateFormats": {
"long": "EEEE, d MMMM yyyy",
@ -781,7 +850,10 @@
"noNotes": "Δεν υπάρχουν σημειώσεις για αυτό το έργο.",
"deleteProject": "Διαγραφή Έργου",
"showCompleted": "Εμφάνιση Ολοκληρωμένων",
"createSuccess": "Το έργο δημιουργήθηκε με επιτυχία!"
"createSuccess": "Το έργο δημιουργήθηκε με επιτυχία!",
"createdAndAssigned": "Το έργο δημιουργήθηκε και ανατέθηκε",
"createError": "Αποτυχία δημιουργίας έργου",
"viewProject": "Μετάβαση στο έργο"
},
"pomodoro": {
"play": "Αναπαραγωγή",
@ -1066,5 +1138,8 @@
"nonRecurring": "μη επαναλαμβανόμενο",
"instances": "επαναλαμβανόμενες περιπτώσεις"
}
},
"subtasks": {
"placeholder": "Προσθέστε μια υποεργασία..."
}
}

View file

@ -145,10 +145,12 @@
"recurrenceEndDateChanged": "Recurrence end date changed",
"recurrence_type_changed": "Recurrence type changed",
"recurrence_interval_changed": "Recurrence interval changed",
"completionBasedChanged": "Completion-based recurrence changed",
"nameUpdated": "Name updated",
"descriptionUpdated": "Description updated",
"noteUpdated": "Note updated",
"projectChanged": "Project changed",
"projectIdChanged": "Assigned to a project",
"tagsUpdated": "Tags updated",
"taskArchived": "Task archived",
"todayFlagChanged": "Today Flag Changed",
@ -412,8 +414,10 @@
"monthDay": "Day of month",
"weekOfMonth": "Week of month",
"recurrenceEndDate": "End date (optional)",
"completionBased": "Repeat after completion"
"completionBased": "Repeat after completion",
"repeatOn": "Repeat on"
},
"selectAtLeastOneDay": "Please select at least one day",
"projectSearchPlaceholder": "Search or create a project...",
"noMatchingProjects": "No matching projects",
"creatingProject": "Creating...",
@ -508,7 +512,10 @@
"browseImage": "Browse Image",
"noNotes": "No notes for this project.",
"deleteProject": "Delete Project",
"createSuccess": "Project created successfully!"
"createSuccess": "Project created successfully!",
"createdAndAssigned": "Project created and assigned",
"createError": "Failed to create project",
"viewProject": "Go to project"
},
"errors": {
"required": "This field is required",
@ -662,8 +669,74 @@
"noNotes": "No content added yet",
"subtasks": "Subtasks",
"noSubtasks": "No subtasks yet",
"noSubtasksClickToAdd": "No subtasks yet, click to add",
"recentActivity": "Recent Activity",
"noActivityYet": "No activity yet"
"noActivityYet": "No activity yet",
"project": "Project",
"noProject": "No project - Click to assign",
"tags": "Tags",
"noTags": "No tags",
"priority": "Priority",
"dueDate": "Due Date",
"noDueDate": "No due date",
"recurringSetup": "Recurring Setup",
"notRecurring": "This task is not recurring yet.",
"instanceOf": "This is an instance of a recurring task",
"parentTask": "Parent Task",
"clickToEditTitle": "Click to edit title",
"clickToEditContent": "Click to edit content",
"clickToAddContent": "Click to add content",
"clickToEditSubtasks": "Click to edit subtasks",
"clickToAddOrEditSubtasks": "Click to add or edit subtasks",
"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.",
"deleteConfirmTitle": "Delete Task",
"deleteConfirmMessage": "Are you sure you want to delete this task? This action cannot be undone.",
"noMoreIterations": "No more iterations scheduled",
"nextOccurrences": "Next Occurrences",
"nextOccurrencesAfterThis": "Next Occurrences After This",
"includingToday": "including today",
"thisTask": "This task",
"is": "is",
"has": "has",
"and": "and",
"dueOn": "due",
"inProject": "from the project",
"fromProject": "from the project",
"lowPriority": "low priority",
"mediumPriority": "medium priority",
"highPriority": "high priority",
"inDays": "in {{count}} days",
"daysAgo": "{{count}} days ago",
"tagsUpdated": "Tags updated successfully",
"tagsUpdateError": "Failed to update tags",
"recurrenceUpdated": "Recurrence updated successfully",
"recurrenceUpdateError": "Failed to update recurrence",
"dueDateUpdated": "Due date updated successfully",
"dueDateUpdateError": "Failed to update due date",
"titleUpdated": "Task title updated successfully",
"titleUpdateError": "Failed to update task title",
"contentUpdated": "Task content updated successfully",
"contentUpdateError": "Failed to update task content",
"subtasksUpdated": "Subtasks updated successfully",
"subtasksUpdateError": "Failed to update subtasks",
"projectUpdated": "Project updated successfully",
"projectUpdateError": "Failed to update project",
"projectCleared": "Project cleared successfully",
"projectClearError": "Failed to clear project",
"priorityUpdated": "Priority updated successfully",
"priorityUpdateError": "Failed to update priority",
"status": {
"notStarted": "not started",
"inProgress": "in progress",
"done": "completed",
"archived": "archived",
"unknown": "ongoing"
}
},
"subtasks": {
"placeholder": "Add a subtask..."
},
"projects": {
"loading": "Loading projects...",

View file

@ -359,7 +359,11 @@
"recurrenceEndDateChanged": "Fecha de finalización de la recurrencia cambiada",
"recurrenceEndDate": "Fecha de finalización de la recurrencia",
"recurrence_type_changed": "Tipo de recurrencia cambiado",
"recurrence_interval_changed": "Intervalo de recurrencia cambiado"
"recurrence_interval_changed": "Intervalo de recurrencia cambiado",
"completionBasedChanged": "Recurrencia basada en la finalización cambiada",
"projectIdChanged": "Asignado a un proyecto",
"recurrenceType": "Tipo de recurrencia",
"recurrenceTypeChanged": "Tipo de recurrencia cambiado"
},
"justNow": "Justo ahora",
"minutesAgo": "{{minutes}}m hace",
@ -507,7 +511,8 @@
"monthDay": "Día del mes",
"weekOfMonth": "Semana del mes",
"recurrenceEndDate": "Fecha de fin (opcional)",
"completionBased": "Repetir después de completar"
"completionBased": "Repetir después de completar",
"repeatOn": "Repetir en"
},
"projectSearchPlaceholder": "Buscar o crear un proyecto...",
"noMatchingProjects": "No hay proyectos coincidentes",
@ -528,7 +533,8 @@
"short": "Intenta ser más específico sobre lo que necesita hacerse",
"noVerb": "¿Qué acción específica necesitas tomar? Intenta comenzar con un verbo.",
"vague": "Intenta comenzar con un verbo de acción como \"Llamar\", \"Escribir\", \"Programar\", o \"Investigar\""
}
},
"selectAtLeastOneDay": "Por favor, selecciona al menos un día"
},
"projectDescriptionPlaceholder": "Ingrese la descripción del proyecto"
},
@ -579,7 +585,10 @@
"noNotes": "No hay notas para este proyecto.",
"deleteProject": "Eliminar Proyecto",
"showCompleted": "Mostrar Completados",
"createSuccess": "¡Proyecto creado exitosamente!"
"createSuccess": "¡Proyecto creado exitosamente!",
"createdAndAssigned": "Proyecto creado y asignado",
"createError": "Error al crear el proyecto",
"viewProject": "Ir al proyecto"
},
"task": {
"labels": {
@ -623,7 +632,70 @@
"subtasks": "Subtareas",
"noSubtasks": "No hay subtareas aún",
"recentActivity": "Actividad Reciente",
"noActivityYet": "No hay actividad aún"
"noActivityYet": "No hay actividad aún",
"thisTask": "Esta tarea",
"is": "es",
"and": "y",
"dueOn": "vencida",
"inProject": "del proyecto",
"lowPriority": "baja prioridad",
"mediumPriority": "prioridad media",
"highPriority": "alta prioridad",
"inDays": "en {{count}} días",
"daysAgo": "{{count}} días atrás",
"tagsUpdated": "Etiquetas actualizadas con éxito",
"tagsUpdateError": "Error al actualizar las etiquetas",
"recurrenceUpdated": "Recurrencia actualizada con éxito",
"recurrenceUpdateError": "Error al actualizar la recurrencia",
"dueDateUpdated": "Fecha de vencimiento actualizada con éxito",
"dueDateUpdateError": "Error al actualizar la fecha de vencimiento",
"titleUpdated": "Título de la tarea actualizado con éxito",
"titleUpdateError": "Error al actualizar el título de la tarea",
"contentUpdated": "Contenido de la tarea actualizado con éxito",
"contentUpdateError": "Error al actualizar el contenido de la tarea",
"subtasksUpdated": "Subtareas actualizadas con éxito",
"subtasksUpdateError": "Error al actualizar las subtareas",
"projectUpdated": "Proyecto actualizado con éxito",
"projectUpdateError": "Error al actualizar el proyecto",
"projectCleared": "Proyecto limpiado con éxito",
"projectClearError": "Error al limpiar el proyecto",
"priorityUpdated": "Prioridad actualizada con éxito",
"priorityUpdateError": "Error al actualizar la prioridad",
"status": {
"notStarted": "no iniciado",
"inProgress": "en progreso",
"done": "completado",
"archived": "archivado",
"unknown": "en curso"
},
"noSubtasksClickToAdd": "No hay subtareas aún, haz clic para agregar",
"project": "Proyecto",
"noProject": "Sin proyecto - Haz clic para asignar",
"tags": "Etiquetas",
"noTags": "Sin etiquetas",
"priority": "Prioridad",
"dueDate": "Fecha de vencimiento",
"recurringSetup": "Configuración recurrente",
"notRecurring": "Esta tarea aún no es recurrente.",
"clickToEditTitle": "Haz clic para editar el título",
"clickToEditContent": "Haz clic para editar el contenido",
"clickToAddContent": "Haz clic para agregar contenido",
"clickToEditSubtasks": "Haz clic para editar subtareas",
"clickToAddOrEditSubtasks": "Haz clic para agregar o editar subtareas",
"contentPlaceholder": "Agrega contenido aquí... (Markdown soportado)",
"contentEditHint": "Presiona Cmd/Ctrl+Enter para guardar, Esc para cancelar",
"noContentPreview": "No hay contenido para previsualizar. Cambia a modo de edición para agregar contenido.",
"deleteConfirmTitle": "Eliminar Tarea",
"deleteConfirmMessage": "¿Estás seguro de que deseas eliminar esta tarea? Esta acción no se puede deshacer.",
"noMoreIterations": "No hay más iteraciones programadas",
"nextOccurrences": "Próximas Ocurrencias",
"nextOccurrencesAfterThis": "Próximas Ocurrencias Después de Esto",
"noDueDate": "Sin fecha de vencimiento",
"instanceOf": "Esta es una instancia de una tarea recurrente",
"parentTask": "Tarea principal",
"includingToday": "incluyendo hoy",
"has": "tiene",
"fromProject": "del proyecto"
},
"dateIndicators": {
"today": "HOY",
@ -1063,5 +1135,8 @@
"nonRecurring": "no recurrente",
"instances": "instancias recurrentes"
}
},
"subtasks": {
"placeholder": "Agregar una subtarea..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Toistuvuuden päättymispäivämäärä on muuttunut",
"recurrenceEndDate": "Toistuvuuden päättymispäivämäärä",
"recurrence_type_changed": "Toistotyypin muutos",
"recurrence_interval_changed": "Toistovälin muutos"
"recurrence_interval_changed": "Toistovälin muutos",
"completionBasedChanged": "Suoritusperusteinen toistuvuus muuttunut",
"projectIdChanged": "Määrätty projektiin",
"recurrenceType": "Toistuvuustyyppi",
"recurrenceTypeChanged": "Toistuvuustyyppi muuttunut"
},
"justNow": "Juuri nyt",
"minutesAgo": "{{minutes}}m sitten",
@ -410,7 +414,8 @@
"monthDay": "Kuukauden päivä",
"weekOfMonth": "Kuukauden viikko",
"recurrenceEndDate": "Loppupäivämäärä (valinnainen)",
"completionBased": "Toista valmistumisen jälkeen"
"completionBased": "Toista valmistumisen jälkeen",
"repeatOn": "Toista"
},
"projectSearchPlaceholder": "Etsi tai luo projekti...",
"noMatchingProjects": "Ei vastaavia projekteja",
@ -431,7 +436,8 @@
"short": "Yritä olla tarkempi siitä, mitä on tehtävä",
"noVerb": "Mitä erityistä toimintoa sinun tarvitsee tehdä? Yritä aloittaa verbillä.",
"vague": "Yritä aloittaa toimintaverbillä kuten \"Soita\", \"Kirjoita\", \"Aikatauluta\" tai \"Tutki\""
}
},
"selectAtLeastOneDay": "Valitse vähintään yksi päivä"
},
"noteTitle": "Muistion Otsikko",
"noteContent": "Muistion Sisältö",
@ -506,7 +512,10 @@
"browseImage": "Selaa kuvaa",
"noNotes": "Ei muistiinpanoja tälle projektille.",
"deleteProject": "Poista projekti",
"createSuccess": "Projekti luotiin onnistuneesti!"
"createSuccess": "Projekti luotiin onnistuneesti!",
"createdAndAssigned": "Projekti luotu ja osoitettu",
"createError": "Projektin luominen epäonnistui",
"viewProject": "Siirry projektiin"
},
"errors": {
"required": "Tämä kenttä on pakollinen",
@ -661,7 +670,70 @@
"subtasks": "Ala-tehtävät",
"noSubtasks": "Ei vielä ala-tehtäviä",
"recentActivity": "Viimeaikainen toiminta",
"noActivityYet": "Ei vielä toimintaa"
"noActivityYet": "Ei vielä toimintaa",
"thisTask": "Tämä tehtävä",
"is": "on",
"and": "ja",
"dueOn": "eräpäivä",
"inProject": "projektista",
"lowPriority": "matala prioriteetti",
"mediumPriority": "keskitasoinen prioriteetti",
"highPriority": "korkea prioriteetti",
"inDays": "{{count}} päivän kuluttua",
"daysAgo": "{{count}} päivää sitten",
"tagsUpdated": "Tunnisteet päivitetty onnistuneesti",
"tagsUpdateError": "Tunnisteiden päivittäminen epäonnistui",
"recurrenceUpdated": "Toistuvuus päivitetty onnistuneesti",
"recurrenceUpdateError": "Toistuvuuden päivittäminen epäonnistui",
"dueDateUpdated": "Eräpäivä päivitetty onnistuneesti",
"dueDateUpdateError": "Eräpäivän päivittäminen epäonnistui",
"titleUpdated": "Tehtävän otsikko päivitetty onnistuneesti",
"titleUpdateError": "Tehtävän otsikon päivittäminen epäonnistui",
"contentUpdated": "Tehtävän sisältö päivitetty onnistuneesti",
"contentUpdateError": "Tehtävän sisällön päivittäminen epäonnistui",
"subtasksUpdated": "Ala-tehtävät päivitetty onnistuneesti",
"subtasksUpdateError": "Ala-tehtävien päivittäminen epäonnistui",
"projectUpdated": "Projekti päivitetty onnistuneesti",
"projectUpdateError": "Projektin päivittäminen epäonnistui",
"projectCleared": "Projekti tyhjennetty onnistuneesti",
"projectClearError": "Projektin tyhjentäminen epäonnistui",
"priorityUpdated": "Prioriteetti päivitetty onnistuneesti",
"priorityUpdateError": "Prioriteetin päivittäminen epäonnistui",
"status": {
"notStarted": "ei aloitettu",
"inProgress": "käynnissä",
"done": "valmis",
"archived": "arkistoitu",
"unknown": "käynnissä"
},
"noSubtasksClickToAdd": "Ei alitehtäviä vielä, napsauta lisätäksesi",
"project": "Projekti",
"noProject": "Ei projektia - Napsauta osoittaaksesi",
"tags": "Tunnisteet",
"noTags": "Ei tunnisteita",
"priority": "Prioriteetti",
"dueDate": "Eräpäivä",
"recurringSetup": "Toistuva asetukset",
"notRecurring": "Tämä tehtävä ei ole vielä toistuva.",
"clickToEditTitle": "Napsauta muokataksesi otsikkoa",
"clickToEditContent": "Napsauta muokataksesi sisältöä",
"clickToAddContent": "Napsauta lisätäksesi sisältöä",
"clickToEditSubtasks": "Napsauta muokataksesi alitehtäviä",
"clickToAddOrEditSubtasks": "Napsauta lisätäksesi tai muokataksesi alitehtäviä",
"contentPlaceholder": "Lisää sisältöä tänne... (Markdown tuettu)",
"contentEditHint": "Paina Cmd/Ctrl+Enter tallentaaksesi, Esc peruuttaaksesi",
"noContentPreview": "Ei esikatseltavaa sisältöä. Vaihda Muokkaustilaan lisätäksesi sisältöä.",
"deleteConfirmTitle": "Poista tehtävä",
"deleteConfirmMessage": "Oletko varma, että haluat poistaa tämän tehtävän? Tätä toimintoa ei voi peruuttaa.",
"noMoreIterations": "Ei enää aikataulutettuja iteraatioita",
"nextOccurrences": "Seuraavat esiintymät",
"nextOccurrencesAfterThis": "Seuraavat esiintymät tämän jälkeen",
"noDueDate": "Ei määräaikaa",
"instanceOf": "Tämä on toistuvan tehtävän instanssi",
"parentTask": "Ylätason tehtävä",
"includingToday": "mukana tänään",
"has": "on",
"fromProject": "projektista"
},
"projects": {
"loading": "Ladataan projekteja...",
@ -1062,5 +1134,8 @@
"nonRecurring": "ei-toistuva",
"instances": "toistuvat instanssit"
}
},
"subtasks": {
"placeholder": "Lisää alitehtävä..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Date de fin de récurrence modifiée",
"recurrenceEndDate": "Date de fin de récurrence",
"recurrence_type_changed": "Type de récurrence changé",
"recurrence_interval_changed": "Intervalle de récurrence changé"
"recurrence_interval_changed": "Intervalle de récurrence changé",
"completionBasedChanged": "Récurrence basée sur l'achèvement modifiée",
"projectIdChanged": "Assigné à un projet",
"recurrenceType": "Type de récurrence",
"recurrenceTypeChanged": "Type de récurrence modifié"
},
"justNow": "À l'instant",
"minutesAgo": "{{minutes}}m auparavant",
@ -410,7 +414,8 @@
"monthDay": "Jour du mois",
"weekOfMonth": "Semaine du mois",
"recurrenceEndDate": "Date de fin (optionnel)",
"completionBased": "Répéter après achèvement"
"completionBased": "Répéter après achèvement",
"repeatOn": "Répéter le"
},
"projectSearchPlaceholder": "Rechercher ou créer un projet...",
"noMatchingProjects": "Aucun projet correspondant",
@ -431,7 +436,8 @@
"short": "Essayez d'être plus spécifique sur ce qui doit être fait",
"noVerb": "Quelle action spécifique devez-vous entreprendre ? Essayez de commencer par un verbe.",
"vague": "Essayez de commencer par un verbe d'action comme \"Appeler\", \"Écrire\", \"Planifier\" ou \"Rechercher\""
}
},
"selectAtLeastOneDay": "Veuillez sélectionner au moins un jour"
},
"noteTitle": "Titre de la note",
"noteContent": "Contenu de la note",
@ -506,7 +512,10 @@
"browseImage": "Parcourir l'image",
"noNotes": "Aucune note pour ce projet.",
"deleteProject": "Supprimer le projet",
"createSuccess": "Projet créé avec succès !"
"createSuccess": "Projet créé avec succès !",
"createdAndAssigned": "Projet créé et attribué",
"createError": "Échec de la création du projet",
"viewProject": "Aller au projet"
},
"errors": {
"required": "Ce champ est requis",
@ -661,7 +670,70 @@
"subtasks": "Sous-tâches",
"noSubtasks": "Aucune sous-tâche pour le moment",
"recentActivity": "Activité récente",
"noActivityYet": "Aucune activité pour le moment"
"noActivityYet": "Aucune activité pour le moment",
"thisTask": "Cette tâche",
"is": "est",
"and": "et",
"dueOn": "due",
"inProject": "du projet",
"lowPriority": "priorité basse",
"mediumPriority": "priorité moyenne",
"highPriority": "priorité élevée",
"inDays": "dans {{count}} jours",
"daysAgo": "{{count}} jours auparavant",
"tagsUpdated": "Étiquettes mises à jour avec succès",
"tagsUpdateError": "Échec de la mise à jour des étiquettes",
"recurrenceUpdated": "Récurrence mise à jour avec succès",
"recurrenceUpdateError": "Échec de la mise à jour de la récurrence",
"dueDateUpdated": "Date d'échéance mise à jour avec succès",
"dueDateUpdateError": "Échec de la mise à jour de la date d'échéance",
"titleUpdated": "Titre de la tâche mis à jour avec succès",
"titleUpdateError": "Échec de la mise à jour du titre de la tâche",
"contentUpdated": "Contenu de la tâche mis à jour avec succès",
"contentUpdateError": "Échec de la mise à jour du contenu de la tâche",
"subtasksUpdated": "Sous-tâches mises à jour avec succès",
"subtasksUpdateError": "Échec de la mise à jour des sous-tâches",
"projectUpdated": "Projet mis à jour avec succès",
"projectUpdateError": "Échec de la mise à jour du projet",
"projectCleared": "Projet effacé avec succès",
"projectClearError": "Échec de l'effacement du projet",
"priorityUpdated": "Priorité mise à jour avec succès",
"priorityUpdateError": "Échec de la mise à jour de la priorité",
"status": {
"notStarted": "non commencé",
"inProgress": "en cours",
"done": "terminé",
"archived": "archivé",
"unknown": "en cours"
},
"noSubtasksClickToAdd": "Pas encore de sous-tâches, cliquez pour ajouter",
"project": "Projet",
"noProject": "Pas de projet - Cliquez pour attribuer",
"tags": "Étiquettes",
"noTags": "Pas d'étiquettes",
"priority": "Priorité",
"dueDate": "Date d'échéance",
"recurringSetup": "Configuration récurrente",
"notRecurring": "Cette tâche n'est pas encore récurrente.",
"clickToEditTitle": "Cliquez pour modifier le titre",
"clickToEditContent": "Cliquez pour modifier le contenu",
"clickToAddContent": "Cliquez pour ajouter du contenu",
"clickToEditSubtasks": "Cliquez pour modifier les sous-tâches",
"clickToAddOrEditSubtasks": "Cliquez pour ajouter ou modifier des sous-tâches",
"contentPlaceholder": "Ajoutez du contenu ici... (Markdown supporté)",
"contentEditHint": "Appuyez sur Cmd/Ctrl+Entrée pour enregistrer, Échap pour annuler",
"noContentPreview": "Aucun contenu à prévisualiser. Passez en mode Édition pour ajouter du contenu.",
"deleteConfirmTitle": "Supprimer la tâche",
"deleteConfirmMessage": "Êtes-vous sûr de vouloir supprimer cette tâche ? Cette action ne peut pas être annulée.",
"noMoreIterations": "Aucune autre itération prévue",
"nextOccurrences": "Prochaines occurrences",
"nextOccurrencesAfterThis": "Prochaines occurrences après cela",
"noDueDate": "Pas de date d'échéance",
"instanceOf": "Ceci est une instance d'une tâche récurrente",
"parentTask": "Tâche parente",
"includingToday": "y compris aujourd'hui",
"has": "a",
"fromProject": "du projet"
},
"projects": {
"loading": "Chargement des projets...",
@ -1062,5 +1134,8 @@
"nonRecurring": "non récurrent",
"instances": "instances récurrentes"
}
},
"subtasks": {
"placeholder": "Ajouter une sous-tâche..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Tanggal akhir pengulangan telah diubah",
"recurrenceEndDate": "Tanggal akhir pengulangan",
"recurrence_type_changed": "Tipe pengulangan berubah",
"recurrence_interval_changed": "Interval pengulangan berubah"
"recurrence_interval_changed": "Interval pengulangan berubah",
"completionBasedChanged": "Perulangan berbasis penyelesaian diubah",
"projectIdChanged": "Ditugaskan ke proyek",
"recurrenceType": "Jenis perulangan",
"recurrenceTypeChanged": "Jenis perulangan diubah"
},
"justNow": "Baru saja",
"minutesAgo": "{{minutes}}m yang lalu",
@ -410,7 +414,8 @@
"monthDay": "Hari dalam bulan",
"weekOfMonth": "Minggu dalam bulan",
"recurrenceEndDate": "Tanggal akhir (opsional)",
"completionBased": "Ulangi setelah penyelesaian"
"completionBased": "Ulangi setelah penyelesaian",
"repeatOn": "Ulangi pada"
},
"projectSearchPlaceholder": "Cari atau buat proyek...",
"noMatchingProjects": "Tidak ada proyek yang cocok",
@ -431,7 +436,8 @@
"short": "Cobalah untuk lebih spesifik tentang apa yang perlu dilakukan",
"noVerb": "Tindakan spesifik apa yang perlu Anda ambil? Cobalah mulai dengan kata kerja.",
"vague": "Cobalah mulai dengan kata kerja aksi seperti \"Hubungi\", \"Tulis\", \"Jadwalkan\", atau \"Teliti\""
}
},
"selectAtLeastOneDay": "Silakan pilih setidaknya satu hari"
},
"noteTitle": "Judul Catatan",
"noteContent": "Konten Catatan",
@ -506,7 +512,10 @@
"browseImage": "Telusuri Gambar",
"noNotes": "Tidak ada catatan untuk proyek ini.",
"deleteProject": "Hapus Proyek",
"createSuccess": "Proyek berhasil dibuat!"
"createSuccess": "Proyek berhasil dibuat!",
"createdAndAssigned": "Proyek dibuat dan ditugaskan",
"createError": "Gagal membuat proyek",
"viewProject": "Pergi ke proyek"
},
"errors": {
"required": "Kolom ini diperlukan",
@ -661,7 +670,70 @@
"subtasks": "Subtugas",
"noSubtasks": "Belum ada subtugas",
"recentActivity": "Aktivitas Terbaru",
"noActivityYet": "Belum ada aktivitas"
"noActivityYet": "Belum ada aktivitas",
"thisTask": "Tugas ini",
"is": "adalah",
"and": "dan",
"dueOn": "jatuh tempo",
"inProject": "dari proyek",
"lowPriority": "prioritas rendah",
"mediumPriority": "prioritas sedang",
"highPriority": "prioritas tinggi",
"inDays": "dalam {{count}} hari",
"daysAgo": "{{count}} hari yang lalu",
"tagsUpdated": "Tag berhasil diperbarui",
"tagsUpdateError": "Gagal memperbarui tag",
"recurrenceUpdated": "Perulangan berhasil diperbarui",
"recurrenceUpdateError": "Gagal memperbarui perulangan",
"dueDateUpdated": "Tanggal jatuh tempo berhasil diperbarui",
"dueDateUpdateError": "Gagal memperbarui tanggal jatuh tempo",
"titleUpdated": "Judul tugas berhasil diperbarui",
"titleUpdateError": "Gagal memperbarui judul tugas",
"contentUpdated": "Konten tugas berhasil diperbarui",
"contentUpdateError": "Gagal memperbarui konten tugas",
"subtasksUpdated": "Subtugas berhasil diperbarui",
"subtasksUpdateError": "Gagal memperbarui subtugas",
"projectUpdated": "Proyek berhasil diperbarui",
"projectUpdateError": "Gagal memperbarui proyek",
"projectCleared": "Proyek berhasil dibersihkan",
"projectClearError": "Gagal membersihkan proyek",
"priorityUpdated": "Prioritas berhasil diperbarui",
"priorityUpdateError": "Gagal memperbarui prioritas",
"status": {
"notStarted": "belum dimulai",
"inProgress": "sedang berlangsung",
"done": "selesai",
"archived": "diarsipkan",
"unknown": "berlangsung"
},
"noSubtasksClickToAdd": "Belum ada subtugas, klik untuk menambah",
"project": "Proyek",
"noProject": "Tidak ada proyek - Klik untuk menugaskan",
"tags": "Tag",
"noTags": "Tidak ada tag",
"priority": "Prioritas",
"dueDate": "Tanggal Jatuh Tempo",
"recurringSetup": "Pengaturan Berulang",
"notRecurring": "Tugas ini belum berulang.",
"clickToEditTitle": "Klik untuk mengedit judul",
"clickToEditContent": "Klik untuk mengedit konten",
"clickToAddContent": "Klik untuk menambah konten",
"clickToEditSubtasks": "Klik untuk mengedit subtugas",
"clickToAddOrEditSubtasks": "Klik untuk menambah atau mengedit subtugas",
"contentPlaceholder": "Tambahkan konten di sini... (Markdown didukung)",
"contentEditHint": "Tekan Cmd/Ctrl+Enter untuk menyimpan, Esc untuk membatalkan",
"noContentPreview": "Tidak ada konten untuk ditampilkan. Beralih ke mode Edit untuk menambahkan konten.",
"deleteConfirmTitle": "Hapus Tugas",
"deleteConfirmMessage": "Apakah Anda yakin ingin menghapus tugas ini? Tindakan ini tidak dapat dibatalkan.",
"noMoreIterations": "Tidak ada iterasi lain yang dijadwalkan",
"nextOccurrences": "Kejadian Berikutnya",
"nextOccurrencesAfterThis": "Kejadian Berikutnya Setelah Ini",
"noDueDate": "Tidak ada tanggal jatuh tempo",
"instanceOf": "Ini adalah instance dari tugas berulang",
"parentTask": "Tugas Induk",
"includingToday": "termasuk hari ini",
"has": "memiliki",
"fromProject": "dari proyek"
},
"projects": {
"loading": "Memuat proyek...",
@ -1062,5 +1134,8 @@
"nonRecurring": "tidak berulang",
"instances": "instansi berulang"
}
},
"subtasks": {
"placeholder": "Tambahkan subtugas..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Data di fine ricorrenza cambiata",
"recurrenceEndDate": "Data di fine ricorrenza",
"recurrence_type_changed": "Tipo di ricorrenza cambiato",
"recurrence_interval_changed": "Intervallo di ricorrenza cambiato"
"recurrence_interval_changed": "Intervallo di ricorrenza cambiato",
"completionBasedChanged": "Ricorrenza basata sul completamento modificata",
"projectIdChanged": "Assegnato a un progetto",
"recurrenceType": "Tipo di ricorrenza",
"recurrenceTypeChanged": "Tipo di ricorrenza modificato"
},
"justNow": "Proprio adesso",
"minutesAgo": "{{minutes}}m fa",
@ -410,7 +414,8 @@
"monthDay": "Giorno del mese",
"weekOfMonth": "Settimana del mese",
"recurrenceEndDate": "Data di fine (opzionale)",
"completionBased": "Ripeti dopo il completamento"
"completionBased": "Ripeti dopo il completamento",
"repeatOn": "Ripeti il"
},
"projectSearchPlaceholder": "Cerca o crea un progetto...",
"noMatchingProjects": "Nessun progetto corrispondente",
@ -431,7 +436,8 @@
"short": "Prova a essere più specifico su cosa deve essere fatto",
"noVerb": "Quale azione specifica devi intraprendere? Prova a iniziare con un verbo.",
"vague": "Prova a iniziare con un verbo d'azione come \"Chiamare\", \"Scrivere\", \"Programmare\", o \"Ricercare\""
}
},
"selectAtLeastOneDay": "Seleziona almeno un giorno"
},
"noteTitle": "Titolo Nota",
"noteContent": "Contenuto Nota",
@ -506,7 +512,10 @@
"browseImage": "Sfoglia Immagine",
"noNotes": "Nessuna nota per questo progetto.",
"deleteProject": "Elimina Progetto",
"createSuccess": "Progetto creato con successo!"
"createSuccess": "Progetto creato con successo!",
"createdAndAssigned": "Progetto creato e assegnato",
"createError": "Impossibile creare il progetto",
"viewProject": "Vai al progetto"
},
"errors": {
"required": "Questo campo è obbligatorio",
@ -661,7 +670,70 @@
"subtasks": "Sottocompiti",
"noSubtasks": "Nessun sottocompito ancora",
"recentActivity": "Attività recente",
"noActivityYet": "Nessuna attività ancora"
"noActivityYet": "Nessuna attività ancora",
"thisTask": "Questo compito",
"is": "è",
"and": "e",
"dueOn": "scade",
"inProject": "dal progetto",
"lowPriority": "bassa priorità",
"mediumPriority": "priorità media",
"highPriority": "alta priorità",
"inDays": "in {{count}} giorni",
"daysAgo": "{{count}} giorni fa",
"tagsUpdated": "Tag aggiornati con successo",
"tagsUpdateError": "Aggiornamento dei tag non riuscito",
"recurrenceUpdated": "Ricorrenza aggiornata con successo",
"recurrenceUpdateError": "Aggiornamento della ricorrenza non riuscito",
"dueDateUpdated": "Data di scadenza aggiornata con successo",
"dueDateUpdateError": "Aggiornamento della data di scadenza non riuscito",
"titleUpdated": "Titolo del compito aggiornato con successo",
"titleUpdateError": "Impossibile aggiornare il titolo del compito",
"contentUpdated": "Contenuto del compito aggiornato con successo",
"contentUpdateError": "Impossibile aggiornare il contenuto del compito",
"subtasksUpdated": "Sottocompiti aggiornati con successo",
"subtasksUpdateError": "Impossibile aggiornare i sottocompiti",
"projectUpdated": "Progetto aggiornato con successo",
"projectUpdateError": "Impossibile aggiornare il progetto",
"projectCleared": "Progetto cancellato con successo",
"projectClearError": "Impossibile cancellare il progetto",
"priorityUpdated": "Priorità aggiornata con successo",
"priorityUpdateError": "Impossibile aggiornare la priorità",
"status": {
"notStarted": "non iniziato",
"inProgress": "in corso",
"done": "completato",
"archived": "archiviato",
"unknown": "in corso"
},
"noSubtasksClickToAdd": "Nessuna sottocompito ancora, clicca per aggiungere",
"project": "Progetto",
"noProject": "Nessun progetto - Clicca per assegnare",
"tags": "Tag",
"noTags": "Nessun tag",
"priority": "Priorità",
"dueDate": "Data di scadenza",
"recurringSetup": "Impostazione ricorrente",
"notRecurring": "Questo compito non è ancora ricorrente.",
"clickToEditTitle": "Clicca per modificare il titolo",
"clickToEditContent": "Clicca per modificare il contenuto",
"clickToAddContent": "Clicca per aggiungere contenuto",
"clickToEditSubtasks": "Clicca per modificare i sottocompiti",
"clickToAddOrEditSubtasks": "Clicca per aggiungere o modificare i sottocompiti",
"contentPlaceholder": "Aggiungi contenuto qui... (Markdown supportato)",
"contentEditHint": "Premi Cmd/Ctrl+Invio per salvare, Esc per annullare",
"noContentPreview": "Nessun contenuto da visualizzare in anteprima. Passa alla modalità Modifica per aggiungere contenuto.",
"deleteConfirmTitle": "Elimina Attività",
"deleteConfirmMessage": "Sei sicuro di voler eliminare questa attività? Questa azione non può essere annullata.",
"noMoreIterations": "Nessuna iterazione programmata",
"nextOccurrences": "Prossime Occorrenze",
"nextOccurrencesAfterThis": "Prossime Occorrenze Dopo Questa",
"noDueDate": "Nessuna data di scadenza",
"instanceOf": "Questa è un'istanza di un'attività ricorrente",
"parentTask": "Attività principale",
"includingToday": "incluso oggi",
"has": "ha",
"fromProject": "dal progetto"
},
"projects": {
"loading": "Caricamento progetti...",
@ -1062,5 +1134,8 @@
"nonRecurring": "non ricorrente",
"instances": "istanze ricorrenti"
}
},
"subtasks": {
"placeholder": "Aggiungi un sottocompito..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "繰り返し終了日が変更されました",
"recurrenceEndDate": "繰り返し終了日",
"recurrence_type_changed": "繰り返しタイプが変更されました",
"recurrence_interval_changed": "繰り返し間隔が変更されました"
"recurrence_interval_changed": "繰り返し間隔が変更されました",
"completionBasedChanged": "完了ベースの繰り返しが変更されました",
"projectIdChanged": "プロジェクトに割り当てられました",
"recurrenceType": "繰り返しの種類",
"recurrenceTypeChanged": "繰り返しの種類が変更されました"
},
"justNow": "たった今",
"minutesAgo": "{{minutes}}分前",
@ -396,7 +400,8 @@
"status": "ステータス",
"priority": "優先度",
"dueDate": "期限日",
"note": "ノート"
"note": "ノート",
"repeatOn": "繰り返し"
},
"recurrenceSettings": "繰り返し設定",
"completionBasedHelp": "チェックすると、次のタスクは期限日ではなく完了日に基づいて作成されます",
@ -418,7 +423,8 @@
"short": "何をする必要があるのか具体的に記述してみてください",
"noVerb": "具体的な行動は何ですか? 動詞で始めてみてください。",
"vague": "\"電話する\"、\"書く\"、\"予定する\"、\"調査する\"などの動詞で始めてみてください"
}
},
"selectAtLeastOneDay": "少なくとも1日を選択してください"
},
"areaName": "エリア名",
"areaDescription": "エリアの説明",
@ -683,7 +689,10 @@
"name": "プロジェクト名",
"noNotes": "このプロジェクトにはノートがありません。",
"deleteProject": "プロジェクトを削除",
"createSuccess": "プロジェクトが正常に作成されました!"
"createSuccess": "プロジェクトが正常に作成されました!",
"createdAndAssigned": "プロジェクトが作成され、割り当てられました",
"createError": "プロジェクトの作成に失敗しました",
"viewProject": "プロジェクトに移動"
},
"task": {
"suggestions": {
@ -727,7 +736,70 @@
"subtasks": "サブタスク",
"noSubtasks": "まだサブタスクはありません",
"recentActivity": "最近の活動",
"noActivityYet": "まだアクティビティはありません"
"noActivityYet": "まだアクティビティはありません",
"thisTask": "このタスク",
"is": "は",
"and": "と",
"dueOn": "期限",
"inProject": "プロジェクトから",
"lowPriority": "低優先度",
"mediumPriority": "中優先度",
"highPriority": "高優先度",
"inDays": "{{count}}日以内",
"daysAgo": "{{count}}日前",
"tagsUpdated": "タグが正常に更新されました",
"tagsUpdateError": "タグの更新に失敗しました",
"recurrenceUpdated": "繰り返しが正常に更新されました",
"recurrenceUpdateError": "繰り返しの更新に失敗しました",
"dueDateUpdated": "期限が正常に更新されました",
"dueDateUpdateError": "期限の更新に失敗しました",
"titleUpdated": "タスクのタイトルが正常に更新されました",
"titleUpdateError": "タスクのタイトルの更新に失敗しました",
"contentUpdated": "タスクの内容が正常に更新されました",
"contentUpdateError": "タスクの内容の更新に失敗しました",
"subtasksUpdated": "サブタスクが正常に更新されました",
"subtasksUpdateError": "サブタスクの更新に失敗しました",
"projectUpdated": "プロジェクトが正常に更新されました",
"projectUpdateError": "プロジェクトの更新に失敗しました",
"projectCleared": "プロジェクトが正常にクリアされました",
"projectClearError": "プロジェクトのクリアに失敗しました",
"priorityUpdated": "優先度が正常に更新されました",
"priorityUpdateError": "優先度の更新に失敗しました",
"status": {
"notStarted": "未開始",
"inProgress": "進行中",
"done": "完了",
"archived": "アーカイブ済み",
"unknown": "進行中"
},
"noSubtasksClickToAdd": "まだサブタスクはありません。クリックして追加",
"project": "プロジェクト",
"noProject": "プロジェクトがありません - 割り当てるにはクリック",
"tags": "タグ",
"noTags": "タグがありません",
"priority": "優先度",
"dueDate": "期限日",
"recurringSetup": "繰り返し設定",
"notRecurring": "このタスクはまだ繰り返しではありません。",
"clickToEditTitle": "タイトルを編集するにはクリック",
"clickToEditContent": "内容を編集するにはクリック",
"clickToAddContent": "内容を追加するにはクリック",
"clickToEditSubtasks": "サブタスクを編集するにはクリック",
"clickToAddOrEditSubtasks": "サブタスクを追加または編集するにはクリック",
"contentPlaceholder": "ここに内容を追加... (Markdown対応)",
"contentEditHint": "Cmd/Ctrl+Enterを押して保存、Escを押してキャンセル",
"noContentPreview": "プレビューするコンテンツがありません。コンテンツを追加するには編集モードに切り替えてください。",
"deleteConfirmTitle": "タスクの削除",
"deleteConfirmMessage": "本当にこのタスクを削除してもよろしいですか?この操作は元に戻せません。",
"noMoreIterations": "スケジュールされた繰り返しはありません",
"nextOccurrences": "次の発生",
"nextOccurrencesAfterThis": "これ以降の次の発生",
"noDueDate": "期限なし",
"instanceOf": "これは定期的なタスクのインスタンスです",
"parentTask": "親タスク",
"includingToday": "今日を含む",
"has": "持っている",
"fromProject": "プロジェクトから"
},
"calendar": {
"month": "月",
@ -1062,5 +1134,8 @@
"nonRecurring": "非定期的",
"instances": "定期的なインスタンス"
}
},
"subtasks": {
"placeholder": "サブタスクを追加..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "반복 종료 날짜가 변경되었습니다",
"recurrenceEndDate": "반복 종료 날짜",
"recurrence_type_changed": "반복 유형이 변경되었습니다",
"recurrence_interval_changed": "반복 간격이 변경되었습니다"
"recurrence_interval_changed": "반복 간격이 변경되었습니다",
"completionBasedChanged": "완료 기반 반복 변경됨",
"projectIdChanged": "프로젝트에 할당됨",
"recurrenceType": "반복 유형",
"recurrenceTypeChanged": "반복 유형 변경됨"
},
"justNow": "방금",
"minutesAgo": "{{minutes}}분 전",
@ -410,7 +414,8 @@
"monthDay": "월의 일",
"weekOfMonth": "월의 주",
"recurrenceEndDate": "종료일 (선택 사항)",
"completionBased": "완료 후 반복"
"completionBased": "완료 후 반복",
"repeatOn": "반복"
},
"projectSearchPlaceholder": "프로젝트 검색 또는 생성...",
"noMatchingProjects": "일치하는 프로젝트가 없습니다",
@ -431,7 +436,8 @@
"short": "해야 할 일을 더 구체적으로 작성해보세요",
"noVerb": "어떤 특정 행동을 취해야 하나요? 동사로 시작해보세요.",
"vague": "\"전화하기\", \"작성하기\", \"일정 잡기\", 또는 \"조사하기\"와 같은 행동 동사로 시작해보세요"
}
},
"selectAtLeastOneDay": "하루 이상 선택해 주세요"
},
"noteTitle": "노트 제목",
"noteContent": "노트 내용",
@ -506,7 +512,10 @@
"browseImage": "이미지 찾아보기",
"noNotes": "이 프로젝트에 대한 메모가 없습니다.",
"deleteProject": "프로젝트 삭제",
"createSuccess": "프로젝트가 성공적으로 생성되었습니다!"
"createSuccess": "프로젝트가 성공적으로 생성되었습니다!",
"createdAndAssigned": "프로젝트가 생성되고 할당되었습니다",
"createError": "프로젝트 생성에 실패했습니다",
"viewProject": "프로젝트로 이동"
},
"errors": {
"required": "이 필드는 필수입니다",
@ -661,7 +670,70 @@
"subtasks": "하위 작업",
"noSubtasks": "아직 하위 작업이 없습니다",
"recentActivity": "최근 활동",
"noActivityYet": "아직 활동이 없습니다"
"noActivityYet": "아직 활동이 없습니다",
"thisTask": "이 작업",
"is": "는",
"and": "그리고",
"dueOn": "기한",
"inProject": "프로젝트에서",
"lowPriority": "낮은 우선순위",
"mediumPriority": "중간 우선순위",
"highPriority": "높은 우선순위",
"inDays": "{{count}}일 내",
"daysAgo": "{{count}}일 전",
"tagsUpdated": "태그가 성공적으로 업데이트되었습니다",
"tagsUpdateError": "태그 업데이트에 실패했습니다",
"recurrenceUpdated": "반복이 성공적으로 업데이트되었습니다",
"recurrenceUpdateError": "반복 업데이트에 실패했습니다",
"dueDateUpdated": "기한이 성공적으로 업데이트되었습니다",
"dueDateUpdateError": "기한 업데이트에 실패했습니다",
"titleUpdated": "작업 제목이 성공적으로 업데이트되었습니다",
"titleUpdateError": "작업 제목 업데이트에 실패했습니다",
"contentUpdated": "작업 내용이 성공적으로 업데이트되었습니다",
"contentUpdateError": "작업 내용 업데이트에 실패했습니다",
"subtasksUpdated": "하위 작업이 성공적으로 업데이트되었습니다",
"subtasksUpdateError": "하위 작업 업데이트에 실패했습니다",
"projectUpdated": "프로젝트가 성공적으로 업데이트되었습니다",
"projectUpdateError": "프로젝트 업데이트에 실패했습니다",
"projectCleared": "프로젝트가 성공적으로 삭제되었습니다",
"projectClearError": "프로젝트 삭제에 실패했습니다",
"priorityUpdated": "우선 순위가 성공적으로 업데이트되었습니다",
"priorityUpdateError": "우선 순위 업데이트에 실패했습니다",
"status": {
"notStarted": "시작되지 않음",
"inProgress": "진행 중",
"done": "완료됨",
"archived": "보관됨",
"unknown": "진행 중"
},
"noSubtasksClickToAdd": "아직 하위 작업이 없습니다. 클릭하여 추가하세요",
"project": "프로젝트",
"noProject": "프로젝트가 없습니다 - 클릭하여 할당하세요",
"tags": "태그",
"noTags": "태그가 없습니다",
"priority": "우선순위",
"dueDate": "마감일",
"noDueDate": "마감일이 없습니다",
"recurringSetup": "반복 설정",
"notRecurring": "이 작업은 아직 반복되지 않습니다.",
"clickToEditTitle": "클릭하여 제목 편집",
"clickToEditContent": "클릭하여 내용 편집",
"clickToAddContent": "클릭하여 내용 추가",
"clickToEditSubtasks": "클릭하여 하위 작업 편집",
"clickToAddOrEditSubtasks": "클릭하여 하위 작업 추가 또는 편집",
"contentPlaceholder": "여기에 내용을 추가하세요... (Markdown 지원)",
"contentEditHint": "Cmd/Ctrl+Enter를 눌러 저장하고, Esc를 눌러 취소하세요",
"noContentPreview": "미리보기할 내용이 없습니다. 내용을 추가하려면 편집 모드로 전환하세요.",
"deleteConfirmTitle": "작업 삭제",
"deleteConfirmMessage": "이 작업을 삭제하시겠습니까? 이 작업은 실행 취소할 수 없습니다.",
"noMoreIterations": "더 이상 예약된 반복이 없습니다",
"nextOccurrences": "다음 발생",
"nextOccurrencesAfterThis": "이후의 다음 발생",
"instanceOf": "이것은 반복 작업의 인스턴스입니다",
"parentTask": "상위 작업",
"includingToday": "오늘 포함",
"has": "있음",
"fromProject": "프로젝트에서"
},
"projects": {
"loading": "프로젝트 로딩 중...",
@ -1062,5 +1134,8 @@
"nonRecurring": "비반복",
"instances": "반복 인스턴스"
}
},
"subtasks": {
"placeholder": "하위 작업 추가..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Einddatum van herhaling gewijzigd",
"recurrenceEndDate": "Einddatum van herhaling",
"recurrence_type_changed": "Herhalings type gewijzigd",
"recurrence_interval_changed": "Herhalingsinterval gewijzigd"
"recurrence_interval_changed": "Herhalingsinterval gewijzigd",
"completionBasedChanged": "Voltooiingsgebaseerde herhaling gewijzigd",
"projectIdChanged": "Toegewezen aan een project",
"recurrenceType": "Herhalings type",
"recurrenceTypeChanged": "Herhalings type gewijzigd"
},
"justNow": "Net nu",
"minutesAgo": "{{minutes}}m geleden",
@ -410,7 +414,8 @@
"monthDay": "Dag van de maand",
"weekOfMonth": "Week van de maand",
"recurrenceEndDate": "Einddatum (optioneel)",
"completionBased": "Herhaal na voltooiing"
"completionBased": "Herhaal na voltooiing",
"repeatOn": "Herhaal op"
},
"projectSearchPlaceholder": "Zoek of maak een project...",
"noMatchingProjects": "Geen overeenkomende projecten",
@ -431,7 +436,8 @@
"short": "Probeer specifieker te zijn over wat er gedaan moet worden",
"noVerb": "Welke specifieke actie moet je ondernemen? Probeer te beginnen met een werkwoord.",
"vague": "Probeer te beginnen met een actie werkwoord zoals \"Bel\", \"Schrijf\", \"Plan\" of \"Onderzoek\""
}
},
"selectAtLeastOneDay": "Selecteer alstublieft minimaal één dag"
},
"noteTitle": "Notitietitel",
"noteContent": "Notitie-inhoud",
@ -506,7 +512,10 @@
"browseImage": "Afbeelding Bladeren",
"noNotes": "Geen notities voor dit project.",
"deleteProject": "Project Verwijderen",
"createSuccess": "Project succesvol aangemaakt!"
"createSuccess": "Project succesvol aangemaakt!",
"createdAndAssigned": "Project aangemaakt en toegewezen",
"createError": "Mislukt om project aan te maken",
"viewProject": "Ga naar project"
},
"errors": {
"required": "Dit veld is verplicht",
@ -661,7 +670,70 @@
"subtasks": "Subtaken",
"noSubtasks": "Nog geen subtaken",
"recentActivity": "Recente Activiteit",
"noActivityYet": "Nog geen activiteit"
"noActivityYet": "Nog geen activiteit",
"thisTask": "Deze taak",
"is": "is",
"and": "en",
"dueOn": "vervaldatum",
"inProject": "van project",
"lowPriority": "lage prioriteit",
"mediumPriority": "gemiddelde prioriteit",
"highPriority": "hoge prioriteit",
"inDays": "in {{count}} dagen",
"daysAgo": "{{count}} dagen geleden",
"tagsUpdated": "Tags succesvol bijgewerkt",
"tagsUpdateError": "Bijwerken van tags is mislukt",
"recurrenceUpdated": "Herhaling succesvol bijgewerkt",
"recurrenceUpdateError": "Bijwerken van herhaling is mislukt",
"dueDateUpdated": "Vervaldatum succesvol bijgewerkt",
"dueDateUpdateError": "Bijwerken van vervaldatum is mislukt",
"titleUpdated": "Taak titel succesvol bijgewerkt",
"titleUpdateError": "Het bijwerken van de taak titel is mislukt",
"contentUpdated": "Taak inhoud succesvol bijgewerkt",
"contentUpdateError": "Het bijwerken van de taak inhoud is mislukt",
"subtasksUpdated": "Subtaken succesvol bijgewerkt",
"subtasksUpdateError": "Het bijwerken van subtaken is mislukt",
"projectUpdated": "Project succesvol bijgewerkt",
"projectUpdateError": "Het bijwerken van het project is mislukt",
"projectCleared": "Project succesvol gewist",
"projectClearError": "Het wissen van het project is mislukt",
"priorityUpdated": "Prioriteit succesvol bijgewerkt",
"priorityUpdateError": "Het bijwerken van de prioriteit is mislukt",
"status": {
"notStarted": "niet gestart",
"inProgress": "bezig",
"done": "voltooid",
"archived": "gearchiveerd",
"unknown": "lopende"
},
"noSubtasksClickToAdd": "Nog geen subtaken, klik om toe te voegen",
"project": "Project",
"noProject": "Geen project - Klik om toe te wijzen",
"tags": "Tags",
"noTags": "Geen tags",
"priority": "Prioriteit",
"dueDate": "Vervaldatum",
"noDueDate": "Geen vervaldatum",
"recurringSetup": "Terugkerende instellingen",
"notRecurring": "Deze taak is nog niet terugkerend.",
"clickToEditTitle": "Klik om titel te bewerken",
"clickToEditContent": "Klik om inhoud te bewerken",
"clickToAddContent": "Klik om inhoud toe te voegen",
"clickToEditSubtasks": "Klik om subtaken te bewerken",
"clickToAddOrEditSubtasks": "Klik om subtaken toe te voegen of te bewerken",
"contentPlaceholder": "Voeg hier inhoud toe... (Markdown ondersteund)",
"contentEditHint": "Druk op Cmd/Ctrl+Enter om op te slaan, Esc om te annuleren",
"noContentPreview": "Geen inhoud om te bekijken. Schakel over naar de bewerkingsmodus om inhoud toe te voegen.",
"deleteConfirmTitle": "Taak Verwijderen",
"deleteConfirmMessage": "Weet je zeker dat je deze taak wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"noMoreIterations": "Geen verdere iteraties gepland",
"nextOccurrences": "Volgende Voorvallen",
"nextOccurrencesAfterThis": "Volgende Voorvallen Na Dit",
"instanceOf": "Dit is een instantie van een terugkerende taak",
"parentTask": "Bovenliggende Taak",
"includingToday": "inclusief vandaag",
"has": "heeft",
"fromProject": "van het project"
},
"projects": {
"loading": "Projecten laden...",
@ -1062,5 +1134,8 @@
"nonRecurring": "niet-herhalend",
"instances": "herhalende instanties"
}
},
"subtasks": {
"placeholder": "Voeg een subtaak toe..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Endringsdato for gjentakelse endret",
"recurrenceEndDate": "Endringsdato for gjentakelse",
"recurrence_type_changed": "Gjentakelsestype endret",
"recurrence_interval_changed": "Gjentakelsesintervall endret"
"recurrence_interval_changed": "Gjentakelsesintervall endret",
"completionBasedChanged": "Fullføring-basert gjentakelse endret",
"projectIdChanged": "Tildelt et prosjekt",
"recurrenceType": "Gjentakelsestype",
"recurrenceTypeChanged": "Gjentakelsestype endret"
},
"justNow": "Akkurat nå",
"minutesAgo": "{{minutes}}m siden",
@ -410,7 +414,8 @@
"monthDay": "Dag i måneden",
"weekOfMonth": "Uke i måneden",
"recurrenceEndDate": "Sluttdato (valgfritt)",
"completionBased": "Gjenta etter fullføring"
"completionBased": "Gjenta etter fullføring",
"repeatOn": "Gjenta på"
},
"projectSearchPlaceholder": "Søk eller opprett et prosjekt...",
"noMatchingProjects": "Ingen matchende prosjekter",
@ -431,7 +436,8 @@
"short": "Prøv å være mer spesifikk om hva som må gjøres",
"noVerb": "Hvilken spesifikk handling må du ta? Prøv å starte med et verb.",
"vague": "Prøv å starte med et handlingsverb som \"Ring\", \"Skriv\", \"Planlegg\" eller \"Undersøk\""
}
},
"selectAtLeastOneDay": "Vennligst velg minst én dag"
},
"noteTitle": "Notattittel",
"noteContent": "Notatinnhold",
@ -506,7 +512,10 @@
"browseImage": "Bla gjennom bilde",
"noNotes": "Ingen notater for dette prosjektet.",
"deleteProject": "Slett prosjekt",
"createSuccess": "Prosjekt opprettet med suksess!"
"createSuccess": "Prosjekt opprettet med suksess!",
"createdAndAssigned": "Prosjekt opprettet og tildelt",
"createError": "Kunne ikke opprette prosjekt",
"viewProject": "Gå til prosjekt"
},
"errors": {
"required": "Dette feltet er påkrevd",
@ -661,7 +670,70 @@
"subtasks": "Undertasker",
"noSubtasks": "Ingen undertasker ennå",
"recentActivity": "Nylig aktivitet",
"noActivityYet": "Ingen aktivitet ennå"
"noActivityYet": "Ingen aktivitet ennå",
"project": "Prosjekt",
"tags": "Merker",
"priority": "Prioritet",
"dueDate": "Forfallsdato",
"recurringSetup": "Gjentakende oppsett",
"thisTask": "Denne oppgaven",
"is": "er",
"and": "og",
"dueOn": "forfalt",
"inProject": "fra prosjekt",
"lowPriority": "lav prioritet",
"mediumPriority": "moderat prioritet",
"highPriority": "høy prioritet",
"inDays": "om {{count}} dager",
"daysAgo": "{{count}} dager siden",
"tagsUpdated": "Merker oppdatert med suksess",
"tagsUpdateError": "Kunne ikke oppdatere tagger",
"recurrenceUpdated": "Gjentakelse oppdatert",
"recurrenceUpdateError": "Kunne ikke oppdatere gjentakelse",
"dueDateUpdated": "Forfallsdato oppdatert",
"dueDateUpdateError": "Kunne ikke oppdatere forfallsdato",
"titleUpdated": "Oppgave tittel oppdatert",
"titleUpdateError": "Kunne ikke oppdatere oppgave tittel",
"contentUpdated": "Oppgaveinnhold oppdatert",
"contentUpdateError": "Kunne ikke oppdatere oppgaveinnhold",
"subtasksUpdated": "Undertasker oppdatert",
"subtasksUpdateError": "Kunne ikke oppdatere undertasker",
"projectUpdated": "Prosjekt oppdatert",
"projectUpdateError": "Kunne ikke oppdatere prosjekt",
"projectCleared": "Prosjektet er ryddet",
"projectClearError": "Kunne ikke rydde prosjekt",
"priorityUpdated": "Prioritet oppdatert",
"priorityUpdateError": "Kunne ikke oppdatere prioritet",
"status": {
"notStarted": "ikke startet",
"inProgress": "pågår",
"done": "fullført",
"archived": "arkivert",
"unknown": "pågående"
},
"noSubtasksClickToAdd": "Ingen deloppgaver ennå, klikk for å legge til",
"noProject": "Ingen prosjekt - Klikk for å tildele",
"noTags": "Ingen etiketter",
"noDueDate": "Ingen forfallsdato",
"notRecurring": "Denne oppgaven er ikke gjentakende ennå.",
"clickToEditTitle": "Klikk for å redigere tittel",
"clickToEditContent": "Klikk for å redigere innhold",
"clickToAddContent": "Klikk for å legge til innhold",
"clickToEditSubtasks": "Klikk for å redigere deloppgaver",
"clickToAddOrEditSubtasks": "Klikk for å legge til eller redigere deloppgaver",
"contentPlaceholder": "Legg til innhold her... (Markdown støttet)",
"contentEditHint": "Trykk Cmd/Ctrl+Enter for å lagre, Esc for å avbryte",
"noContentPreview": "Ingen innhold å forhåndsvise. Bytt til Rediger modus for å legge til innhold.",
"deleteConfirmTitle": "Slett oppgave",
"deleteConfirmMessage": "Er du sikker på at du vil slette denne oppgaven? Denne handlingen kan ikke angres.",
"noMoreIterations": "Ingen flere iterasjoner planlagt",
"nextOccurrences": "Neste forekomster",
"nextOccurrencesAfterThis": "Neste forekomster etter dette",
"instanceOf": "Dette er en instans av en gjentakende oppgave",
"parentTask": "Foreldrepågave",
"includingToday": "inkludert i dag",
"has": "har",
"fromProject": "fra prosjektet"
},
"projects": {
"loading": "Laster prosjekter...",
@ -1062,5 +1134,8 @@
"nonRecurring": "ikke-gjentakende",
"instances": "gjentakende instanser"
}
},
"subtasks": {
"placeholder": "Legg til en underoppgave..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Data zakończenia powtarzania została zmieniona",
"recurrenceEndDate": "Data zakończenia powtarzania",
"recurrence_type_changed": "Typ powtarzania zmieniony",
"recurrence_interval_changed": "Interwał powtarzania zmieniony"
"recurrence_interval_changed": "Interwał powtarzania zmieniony",
"completionBasedChanged": "Zmiana opartej na ukończeniu powtarzalności",
"projectIdChanged": "Przypisano do projektu",
"recurrenceType": "Typ powtarzalności",
"recurrenceTypeChanged": "Zmiana typu powtarzalności"
},
"justNow": "Właśnie teraz",
"minutesAgo": "{{minutes}}m temu",
@ -410,7 +414,8 @@
"monthDay": "Dzień miesiąca",
"weekOfMonth": "Tydzień miesiąca",
"recurrenceEndDate": "Data zakończenia (opcjonalnie)",
"completionBased": "Powtórz po zakończeniu"
"completionBased": "Powtórz po zakończeniu",
"repeatOn": "Powtarzaj w"
},
"projectSearchPlaceholder": "Szukaj lub utwórz projekt...",
"noMatchingProjects": "Brak pasujących projektów",
@ -431,7 +436,8 @@
"short": "Spróbuj być bardziej konkretny w tym, co należy zrobić",
"noVerb": "Jaką konkretną czynność musisz wykonać? Spróbuj zacząć od czasownika.",
"vague": "Spróbuj zacząć od czasownika akcji, takiego jak \"Zadzwoń\", \"Napisz\", \"Zaplanuj\" lub \"Zbadaj\""
}
},
"selectAtLeastOneDay": "Proszę wybrać przynajmniej jeden dzień"
},
"noteTitle": "Tytuł notatki",
"noteContent": "Treść notatki",
@ -506,7 +512,10 @@
"browseImage": "Przeglądaj obraz",
"noNotes": "Brak notatek dla tego projektu.",
"deleteProject": "Usuń projekt",
"createSuccess": "Projekt został pomyślnie utworzony!"
"createSuccess": "Projekt został pomyślnie utworzony!",
"createdAndAssigned": "Projekt utworzony i przypisany",
"createError": "Nie udało się utworzyć projektu",
"viewProject": "Przejdź do projektu"
},
"errors": {
"required": "To pole jest wymagane",
@ -661,7 +670,70 @@
"subtasks": "Podzadania",
"noSubtasks": "Brak podzadań",
"recentActivity": "Ostatnia aktywność",
"noActivityYet": "Brak aktywności jeszcze"
"noActivityYet": "Brak aktywności jeszcze",
"project": "Projekt",
"noProject": "Brak projektu - Kliknij, aby przypisać",
"tags": "Tagi",
"noTags": "Brak tagów",
"priority": "Priorytet",
"dueDate": "Termin",
"recurringSetup": "Ustawienia powtarzalności",
"notRecurring": "To zadanie jeszcze nie jest powtarzalne.",
"clickToEditTitle": "Kliknij, aby edytować tytuł",
"clickToEditContent": "Kliknij, aby edytować treść",
"clickToAddContent": "Kliknij, aby dodać treść",
"clickToEditSubtasks": "Kliknij, aby edytować podzadania",
"clickToAddOrEditSubtasks": "Kliknij, aby dodać lub edytować podzadania",
"contentPlaceholder": "Dodaj treść tutaj... (obsługuje Markdown)",
"contentEditHint": "Naciśnij Cmd/Ctrl+Enter, aby zapisać, Esc, aby anulować",
"noContentPreview": "Brak treści do podglądu. Przełącz się na tryb edycji, aby dodać treść.",
"deleteConfirmTitle": "Usuń zadanie",
"deleteConfirmMessage": "Czy na pewno chcesz usunąć to zadanie? Ta akcja nie może być cofnięta.",
"noMoreIterations": "Brak zaplanowanych iteracji",
"nextOccurrences": "Następne wystąpienia",
"nextOccurrencesAfterThis": "Następne wystąpienia po tym",
"thisTask": "To zadanie",
"is": "jest",
"and": "i",
"dueOn": "należy",
"inProject": "z projektu",
"lowPriority": "niski priorytet",
"mediumPriority": "średni priorytet",
"highPriority": "wysoki priorytet",
"inDays": "za {{count}} dni",
"daysAgo": "{{count}} dni temu",
"tagsUpdated": "Tagi zaktualizowane pomyślnie",
"tagsUpdateError": "Nie udało się zaktualizować tagów",
"recurrenceUpdated": "Powtarzalność zaktualizowana pomyślnie",
"recurrenceUpdateError": "Nie udało się zaktualizować powtarzalności",
"dueDateUpdated": "Termin zaktualizowany pomyślnie",
"dueDateUpdateError": "Nie udało się zaktualizować daty wykonania",
"titleUpdated": "Tytuł zadania zaktualizowany pomyślnie",
"titleUpdateError": "Nie udało się zaktualizować tytułu zadania",
"contentUpdated": "Treść zadania zaktualizowana pomyślnie",
"contentUpdateError": "Nie udało się zaktualizować treści zadania",
"subtasksUpdated": "Podzadania zaktualizowane pomyślnie",
"subtasksUpdateError": "Nie udało się zaktualizować podzadań",
"projectUpdated": "Projekt zaktualizowany pomyślnie",
"projectUpdateError": "Nie udało się zaktualizować projektu",
"projectCleared": "Projekt usunięty pomyślnie",
"projectClearError": "Nie udało się usunąć projektu",
"priorityUpdated": "Priorytet zaktualizowany pomyślnie",
"priorityUpdateError": "Nie udało się zaktualizować priorytetu",
"status": {
"notStarted": "nie rozpoczęto",
"inProgress": "w trakcie",
"done": "ukończone",
"archived": "zarchiwizowane",
"unknown": "w toku"
},
"noSubtasksClickToAdd": "Brak podzadań, kliknij, aby dodać",
"noDueDate": "Brak daty wykonania",
"instanceOf": "To jest instancja zadania cyklicznego",
"parentTask": "Zadanie nadrzędne",
"includingToday": "w tym dzisiaj",
"has": "ma",
"fromProject": "z projektu"
},
"projects": {
"loading": "Ładowanie projektów...",
@ -1062,5 +1134,8 @@
"nonRecurring": "niepowtarzające się",
"instances": "powtarzające się instancje"
}
},
"subtasks": {
"placeholder": "Dodaj podzadanie..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Data de término da recorrência alterada",
"recurrenceEndDate": "Data de término da recorrência",
"recurrence_type_changed": "Tipo de recorrência alterado",
"recurrence_interval_changed": "Intervalo de recorrência alterado"
"recurrence_interval_changed": "Intervalo de recorrência alterado",
"completionBasedChanged": "Recorrência baseada em conclusão alterada",
"projectIdChanged": "Atribuído a um projeto",
"recurrenceType": "Tipo de recorrência",
"recurrenceTypeChanged": "Tipo de recorrência alterado"
},
"justNow": "Agora mesmo",
"minutesAgo": "{{minutes}}m atrás",
@ -410,7 +414,8 @@
"monthDay": "Dia do mês",
"weekOfMonth": "Semana do mês",
"recurrenceEndDate": "Data de término (opcional)",
"completionBased": "Repetir após conclusão"
"completionBased": "Repetir após conclusão",
"repeatOn": "Repetir em"
},
"projectSearchPlaceholder": "Pesquisar ou criar um projeto...",
"noMatchingProjects": "Nenhum projeto correspondente",
@ -431,7 +436,8 @@
"short": "Tente ser mais específico sobre o que precisa ser feito",
"noVerb": "Qual ação específica você precisa realizar? Tente começar com um verbo.",
"vague": "Tente começar com um verbo de ação como \"Ligar\", \"Escrever\", \"Agendar\" ou \"Pesquisar\""
}
},
"selectAtLeastOneDay": "Por favor, selecione pelo menos um dia"
},
"noteTitle": "Título da Nota",
"noteContent": "Conteúdo da Nota",
@ -506,7 +512,10 @@
"browseImage": "Procurar Imagem",
"noNotes": "Nenhuma nota para este projeto.",
"deleteProject": "Excluir Projeto",
"createSuccess": "Projeto criado com sucesso!"
"createSuccess": "Projeto criado com sucesso!",
"createdAndAssigned": "Projeto criado e atribuído",
"createError": "Falha ao criar projeto",
"viewProject": "Ir para o projeto"
},
"errors": {
"required": "Este campo é obrigatório",
@ -661,7 +670,70 @@
"subtasks": "Subtarefas",
"noSubtasks": "Nenhuma subtarefa ainda",
"recentActivity": "Atividade Recente",
"noActivityYet": "Nenhuma atividade ainda"
"noActivityYet": "Nenhuma atividade ainda",
"project": "Projeto",
"noProject": "Nenhum projeto - Clique para atribuir",
"tags": "Tags",
"noTags": "Sem tags",
"priority": "Prioridade",
"dueDate": "Data de Vencimento",
"recurringSetup": "Configuração Recorrente",
"notRecurring": "Esta tarefa ainda não é recorrente.",
"clickToEditTitle": "Clique para editar o título",
"clickToEditContent": "Clique para editar o conteúdo",
"clickToAddContent": "Clique para adicionar conteúdo",
"clickToEditSubtasks": "Clique para editar subtarefas",
"clickToAddOrEditSubtasks": "Clique para adicionar ou editar subtarefas",
"contentPlaceholder": "Adicione conteúdo aqui... (Markdown suportado)",
"contentEditHint": "Pressione Cmd/Ctrl+Enter para salvar, Esc para cancelar",
"noContentPreview": "Nenhum conteúdo para visualizar. Mude para o modo Editar para adicionar conteúdo.",
"deleteConfirmTitle": "Excluir Tarefa",
"deleteConfirmMessage": "Você tem certeza de que deseja excluir esta tarefa? Esta ação não pode ser desfeita.",
"noMoreIterations": "Nenhuma iteração agendada",
"nextOccurrences": "Próximas Ocorrências",
"nextOccurrencesAfterThis": "Próximas Ocorrências Após Esta",
"thisTask": "Esta tarefa",
"is": "é",
"and": "e",
"dueOn": "vencido",
"inProject": "do projeto",
"lowPriority": "baixa prioridade",
"mediumPriority": "prioridade média",
"highPriority": "alta prioridade",
"inDays": "em {{count}} dias",
"daysAgo": "{{count}} dias atrás",
"tagsUpdated": "Tags atualizadas com sucesso",
"tagsUpdateError": "Falha ao atualizar tags",
"recurrenceUpdated": "Recorrência atualizada com sucesso",
"recurrenceUpdateError": "Falha ao atualizar a recorrência",
"dueDateUpdated": "Data de vencimento atualizada com sucesso",
"dueDateUpdateError": "Falha ao atualizar a data de vencimento",
"titleUpdated": "Título da tarefa atualizado com sucesso",
"titleUpdateError": "Falha ao atualizar o título da tarefa",
"contentUpdated": "Conteúdo da tarefa atualizado com sucesso",
"contentUpdateError": "Falha ao atualizar o conteúdo da tarefa",
"subtasksUpdated": "Subtarefas atualizadas com sucesso",
"subtasksUpdateError": "Falha ao atualizar as subtarefas",
"projectUpdated": "Projeto atualizado com sucesso",
"projectUpdateError": "Falha ao atualizar o projeto",
"projectCleared": "Projeto limpo com sucesso",
"projectClearError": "Falha ao limpar o projeto",
"priorityUpdated": "Prioridade atualizada com sucesso",
"priorityUpdateError": "Falha ao atualizar a prioridade",
"status": {
"notStarted": "não iniciado",
"inProgress": "em progresso",
"done": "completo",
"archived": "arquivado",
"unknown": "em andamento"
},
"noSubtasksClickToAdd": "Nenhuma subtarefa ainda, clique para adicionar",
"noDueDate": "Sem data de vencimento",
"instanceOf": "Esta é uma instância de uma tarefa recorrente",
"parentTask": "Tarefa Pai",
"includingToday": "incluindo hoje",
"has": "tem",
"fromProject": "do projeto"
},
"projects": {
"loading": "Carregando projetos...",
@ -1062,5 +1134,8 @@
"nonRecurring": "não recorrente",
"instances": "instâncias recorrentes"
}
},
"subtasks": {
"placeholder": "Adicionar uma subtarefa..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Data de încheiere a recurenței a fost modificată",
"recurrenceEndDate": "Data de încheiere a recurenței",
"recurrence_type_changed": "Tipul de recurență s-a schimbat",
"recurrence_interval_changed": "Intervalul de recurență s-a schimbat"
"recurrence_interval_changed": "Intervalul de recurență s-a schimbat",
"completionBasedChanged": "Recurrence bazată pe finalizare modificată",
"projectIdChanged": "Atribuit unui proiect",
"recurrenceType": "Tip de recurență",
"recurrenceTypeChanged": "Tip de recurență modificat"
},
"justNow": "Chiar acum",
"minutesAgo": "{{minutes}}m în urmă",
@ -410,7 +414,8 @@
"monthDay": "Ziua lunii",
"weekOfMonth": "Săptămâna lunii",
"recurrenceEndDate": "Data de sfârșit (opțional)",
"completionBased": "Repetare după finalizare"
"completionBased": "Repetare după finalizare",
"repeatOn": "Repetă pe"
},
"projectSearchPlaceholder": "Caută sau creează un proiect...",
"noMatchingProjects": "Niciun proiect corespunzător",
@ -431,7 +436,8 @@
"short": "Încercați să fiți mai specifici cu privire la ceea ce trebuie făcut",
"noVerb": "Ce acțiune specifică trebuie să întreprinzi? Încercați să începeți cu un verb.",
"vague": "Încercați să începeți cu un verb de acțiune, cum ar fi \"Sună\", \"Scrie\", \"Programează\" sau \"Cercetează\""
}
},
"selectAtLeastOneDay": "Te rugăm să selectezi cel puțin o zi"
},
"noteTitle": "Titlul notei",
"noteContent": "Conținutul notei",
@ -506,7 +512,10 @@
"browseImage": "Răsfoiți Imaginea",
"noNotes": "Nu există note pentru acest proiect.",
"deleteProject": "Șterge Proiectul",
"createSuccess": "Proiect creat cu succes!"
"createSuccess": "Proiect creat cu succes!",
"createdAndAssigned": "Proiect creat și atribuit",
"createError": "Crearea proiectului a eșuat",
"viewProject": "Accesează proiectul"
},
"errors": {
"required": "Acest câmp este obligatoriu",
@ -661,7 +670,70 @@
"subtasks": "Subsarci",
"noSubtasks": "Nu există subsarci încă",
"recentActivity": "Activitate recentă",
"noActivityYet": "Nicio activitate încă"
"noActivityYet": "Nicio activitate încă",
"project": "Proiect",
"noProject": "Niciun proiect - Fă clic pentru a atribui",
"tags": "Etichete",
"noTags": "Niciună etichetă",
"priority": "Prioritate",
"dueDate": "Data limită",
"recurringSetup": "Configurare recurentă",
"notRecurring": "Această sarcină nu este încă recurentă.",
"clickToEditTitle": "Fă clic pentru a edita titlul",
"clickToEditContent": "Fă clic pentru a edita conținutul",
"clickToAddContent": "Fă clic pentru a adăuga conținut",
"clickToEditSubtasks": "Fă clic pentru a edita subtasks",
"clickToAddOrEditSubtasks": "Fă clic pentru a adăuga sau edita subtasks",
"contentPlaceholder": "Adăugați conținut aici... (Markdown acceptat)",
"contentEditHint": "Apăsați Cmd/Ctrl+Enter pentru a salva, Esc pentru a anula",
"noContentPreview": "Nu există conținut de previzualizat. Schimbați în modul Editare pentru a adăuga conținut.",
"deleteConfirmTitle": "Ștergeți Sarcina",
"deleteConfirmMessage": "Sunteți sigur că doriți să ștergeți această sarcină? Această acțiune nu poate fi anulată.",
"noMoreIterations": "Nu mai sunt programate iterații",
"nextOccurrences": "Următoarele Apariții",
"nextOccurrencesAfterThis": "Următoarele Apariții După Aceasta",
"thisTask": "Această sarcină",
"is": "este",
"and": "și",
"dueOn": "scadent",
"inProject": "din proiect",
"lowPriority": "prioritate scăzută",
"mediumPriority": "prioritate medie",
"highPriority": "prioritate ridicată",
"inDays": "în {{count}} zile",
"daysAgo": "{{count}} zile în urmă",
"tagsUpdated": "Etichetele au fost actualizate cu succes",
"tagsUpdateError": "Actualizarea etichetelor a eșuat",
"recurrenceUpdated": "Recurența actualizată cu succes",
"recurrenceUpdateError": "Eșec la actualizarea recurenței",
"dueDateUpdated": "Data limită actualizată cu succes",
"dueDateUpdateError": "Eșec la actualizarea datei limită",
"titleUpdated": "Titlul sarcinii actualizat cu succes",
"titleUpdateError": "Eșec la actualizarea titlului sarcinii",
"contentUpdated": "Conținutul sarcinii actualizat cu succes",
"contentUpdateError": "Eșec la actualizarea conținutului sarcinii",
"subtasksUpdated": "Subtask-urile actualizate cu succes",
"subtasksUpdateError": "Eșec la actualizarea subtask-urilor",
"projectUpdated": "Proiectul actualizat cu succes",
"projectUpdateError": "Eșec la actualizarea proiectului",
"projectCleared": "Proiectul șters cu succes",
"projectClearError": "Eșec la ștergerea proiectului",
"priorityUpdated": "Prioritatea actualizată cu succes",
"priorityUpdateError": "Eșec la actualizarea priorității",
"status": {
"notStarted": "neînceput",
"inProgress": "în desfășurare",
"done": "finalizat",
"archived": "archivat",
"unknown": "în desfășurare"
},
"noSubtasksClickToAdd": "Nu există subtasks încă, dă click pentru a adăuga",
"noDueDate": "Fără dată limită",
"instanceOf": "Aceasta este o instanță a unei sarcini recurente",
"parentTask": "Sarcina Părinte",
"includingToday": "inclusiv astăzi",
"has": "are",
"fromProject": "din proiect"
},
"projects": {
"loading": "Se încarcă proiectele...",
@ -1062,5 +1134,8 @@
"nonRecurring": "non-recurent",
"instances": "instanțe recurente"
}
},
"subtasks": {
"placeholder": "Adaugă o subtask..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Дата окончания повторения изменена",
"recurrenceEndDate": "Дата окончания повторения",
"recurrence_type_changed": "Тип повторения изменен",
"recurrence_interval_changed": "Интервал повторения изменен"
"recurrence_interval_changed": "Интервал повторения изменен",
"completionBasedChanged": "Изменено основанное на завершении повторение",
"projectIdChanged": "Назначено проекту",
"recurrenceType": "Тип повторения",
"recurrenceTypeChanged": "Тип повторения изменен"
},
"justNow": "Только что",
"minutesAgo": "{{minutes}}м назад",
@ -410,7 +414,8 @@
"monthDay": "День месяца",
"weekOfMonth": "Неделя месяца",
"recurrenceEndDate": "Дата окончания (необязательно)",
"completionBased": "Повторять после завершения"
"completionBased": "Повторять после завершения",
"repeatOn": "Повторять в"
},
"projectSearchPlaceholder": "Поиск или создание проекта...",
"noMatchingProjects": "Нет подходящих проектов",
@ -431,7 +436,8 @@
"short": "Попробуйте быть более конкретными относительно того, что нужно сделать",
"noVerb": "Какое конкретное действие вам нужно предпринять? Попробуйте начать с глагола.",
"vague": "Попробуйте начать с глагола действия, например, \"Позвонить\", \"Написать\", \"Запланировать\" или \"Исследовать\""
}
},
"selectAtLeastOneDay": "Пожалуйста, выберите хотя бы один день"
},
"noteTitle": "Название заметки",
"noteContent": "Содержание заметки",
@ -506,7 +512,10 @@
"browseImage": "Выбрать изображение",
"noNotes": "Нет заметок для этого проекта.",
"deleteProject": "Удалить проект",
"createSuccess": "Проект успешно создан!"
"createSuccess": "Проект успешно создан!",
"createdAndAssigned": "Проект создан и назначен",
"createError": "Не удалось создать проект",
"viewProject": "Перейти к проекту"
},
"errors": {
"required": "Это поле обязательно для заполнения",
@ -661,7 +670,70 @@
"subtasks": "Подзадачи",
"noSubtasks": "Подзадач пока нет",
"recentActivity": "Недавняя активность",
"noActivityYet": "Пока нет активности"
"noActivityYet": "Пока нет активности",
"noSubtasksClickToAdd": "Нет подзадач, нажмите, чтобы добавить",
"project": "Проект",
"noProject": "Нет проекта - Нажмите, чтобы назначить",
"tags": "Теги",
"noTags": "Нет тегов",
"priority": "Приоритет",
"dueDate": "Срок выполнения",
"recurringSetup": "Настройка повторения",
"notRecurring": "Эта задача пока не является повторяющейся.",
"clickToEditTitle": "Нажмите, чтобы редактировать заголовок",
"clickToEditContent": "Нажмите, чтобы редактировать содержимое",
"clickToAddContent": "Нажмите, чтобы добавить контент",
"clickToEditSubtasks": "Нажмите, чтобы редактировать подзадачи",
"clickToAddOrEditSubtasks": "Нажмите, чтобы добавить или редактировать подзадачи",
"contentPlaceholder": "Добавьте контент здесь... (поддерживается Markdown)",
"contentEditHint": "Нажмите Cmd/Ctrl+Enter, чтобы сохранить, Esc, чтобы отменить",
"noContentPreview": "Нет контента для предварительного просмотра. Переключитесь в режим редактирования, чтобы добавить контент.",
"deleteConfirmTitle": "Удалить задачу",
"deleteConfirmMessage": "Вы уверены, что хотите удалить эту задачу? Это действие нельзя отменить.",
"noMoreIterations": "Больше итераций не запланировано",
"nextOccurrences": "Следующие события",
"nextOccurrencesAfterThis": "Следующие события после этого",
"thisTask": "Эта задача",
"is": "является",
"and": "и",
"dueOn": "срок",
"inProject": "из проекта",
"lowPriority": "низкий приоритет",
"mediumPriority": "средний приоритет",
"highPriority": "высокий приоритет",
"inDays": "через {{count}} дней",
"daysAgo": "{{count}} дней назад",
"tagsUpdated": "Теги успешно обновлены",
"tagsUpdateError": "Не удалось обновить теги",
"recurrenceUpdated": "Повторение успешно обновлено",
"recurrenceUpdateError": "Не удалось обновить повторение",
"dueDateUpdated": "Срок выполнения успешно обновлен",
"dueDateUpdateError": "Не удалось обновить срок выполнения",
"titleUpdated": "Название задачи успешно обновлено",
"titleUpdateError": "Не удалось обновить название задачи",
"contentUpdated": "Содержимое задачи успешно обновлено",
"contentUpdateError": "Не удалось обновить содержимое задачи",
"subtasksUpdated": "Подзадачи успешно обновлены",
"subtasksUpdateError": "Не удалось обновить подзадачи",
"projectUpdated": "Проект успешно обновлен",
"projectUpdateError": "Не удалось обновить проект",
"projectCleared": "Проект успешно очищен",
"projectClearError": "Не удалось очистить проект",
"priorityUpdated": "Приоритет успешно обновлен",
"priorityUpdateError": "Не удалось обновить приоритет",
"status": {
"notStarted": "не начато",
"inProgress": "в процессе",
"done": "завершено",
"archived": "архивировано",
"unknown": "в процессе"
},
"noDueDate": "Нет срока выполнения",
"instanceOf": "Это экземпляр повторяющейся задачи",
"parentTask": "Родительская задача",
"includingToday": "включая сегодня",
"has": "имеет",
"fromProject": "из проекта"
},
"projects": {
"loading": "Загрузка проектов...",
@ -1062,5 +1134,8 @@
"nonRecurring": "неповторяющийся",
"instances": "повторяющиеся экземпляры"
}
},
"subtasks": {
"placeholder": "Добавить подзадачу..."
}
}

View file

@ -156,7 +156,11 @@
"recurrenceEndDateChanged": "Datum konca ponavljanja se je spremenil",
"recurrenceEndDate": "Datum konca ponavljanja",
"recurrence_type_changed": "Vrsta ponavljanja se je spremenila",
"recurrence_interval_changed": "Interval ponavljanja se je spremenil"
"recurrence_interval_changed": "Interval ponavljanja se je spremenil",
"completionBasedChanged": "Sprememba ponavljanja na podlagi dokončanja",
"projectIdChanged": "Dodeljeno projektu",
"recurrenceType": "Vrsta ponavljanja",
"recurrenceTypeChanged": "Vrsta ponavljanja spremenjena"
}
},
"profile": {
@ -410,7 +414,8 @@
"monthDay": "Dan v mesecu",
"weekOfMonth": "Teden v mesecu",
"recurrenceEndDate": "Datum konca (neobvezno)",
"completionBased": "Ponovi po zaključku"
"completionBased": "Ponovi po zaključku",
"repeatOn": "Ponovi na"
},
"projectSearchPlaceholder": "Išči ali ustvari projekt...",
"noMatchingProjects": "Brez ustreznih projektov",
@ -431,7 +436,8 @@
"short": "Poskusite biti bolj specifični glede tega, kaj je treba narediti",
"noVerb": "Katero specifično dejanje morate izvesti? Poskusite začeti z glagolom.",
"vague": "Poskusite začeti z glagolom akcije, kot so \"Pokliči\", \"Napiši\", \"Načrtuj\" ali \"Raziskuj\""
}
},
"selectAtLeastOneDay": "Prosimo, izberite vsaj en dan"
},
"noteTitle": "Naslov opombe",
"noteContent": "Vsebina opombe",
@ -506,7 +512,10 @@
"browseImage": "Prebrskaj sliko",
"noNotes": "Ni opomb za ta projekt.",
"deleteProject": "Izbriši projekt",
"createSuccess": "Projekt uspešno ustvarjen!"
"createSuccess": "Projekt uspešno ustvarjen!",
"createdAndAssigned": "Projekt ustvarjen in dodeljen",
"createError": "Ustvarjanje projekta ni uspelo",
"viewProject": "Pojdi na projekt"
},
"errors": {
"required": "To polje je obvezno",
@ -661,7 +670,70 @@
"subtasks": "Podnaloge",
"noSubtasks": "Še ni podnalog",
"recentActivity": "Nedavna dejavnost",
"noActivityYet": "Še ni dejavnosti"
"noActivityYet": "Še ni dejavnosti",
"noSubtasksClickToAdd": "Še ni podnalog, kliknite za dodajanje",
"project": "Projekt",
"noProject": "Brez projekta - Kliknite za dodelitev",
"tags": "Oznake",
"noTags": "Brez oznak",
"priority": "Prioriteta",
"dueDate": "Rok",
"recurringSetup": "Nastavitev ponavljanja",
"notRecurring": "Ta naloga še ni ponavljajoča.",
"clickToEditTitle": "Kliknite za urejanje naslova",
"clickToEditContent": "Kliknite za urejanje vsebine",
"clickToAddContent": "Kliknite za dodajanje vsebine",
"clickToEditSubtasks": "Kliknite za urejanje podnalog",
"clickToAddOrEditSubtasks": "Kliknite za dodajanje ali urejanje podnalog",
"contentPlaceholder": "Dodajte vsebino tukaj... (podpora za Markdown)",
"contentEditHint": "Pritisnite Cmd/Ctrl+Enter za shranjevanje, Esc za preklic",
"noContentPreview": "Brez vsebine za predogled. Preklopite v način urejanja za dodajanje vsebine.",
"deleteConfirmTitle": "Izbriši nalogo",
"deleteConfirmMessage": "Ali ste prepričani, da želite izbrisati to nalogo? Te akcije ni mogoče razveljaviti.",
"noMoreIterations": "Ni več načrtovanih ponovitev",
"nextOccurrences": "Naslednji dogodki",
"nextOccurrencesAfterThis": "Naslednji dogodki po tem",
"thisTask": "Ta naloga",
"is": "je",
"and": "in",
"dueOn": "rok",
"inProject": "iz projekta",
"lowPriority": "nizka prioriteta",
"mediumPriority": "srednja prioriteta",
"highPriority": "visoka prioriteta",
"inDays": "v {{count}} dneh",
"daysAgo": "{{count}} dni nazaj",
"tagsUpdated": "Oznake so bile uspešno posodobljene",
"tagsUpdateError": "Posodobitev oznak je bila neuspešna",
"recurrenceUpdated": "Ponovitev je bila uspešno posodobljena",
"recurrenceUpdateError": "Posodobitev ponovitve je bila neuspešna",
"dueDateUpdated": "Rok je bil uspešno posodobljen",
"dueDateUpdateError": "Posodobitev roka je bila neuspešna",
"titleUpdated": "Naslov naloge je bil uspešno posodobljen",
"titleUpdateError": "Posodobitev naslova naloge je bila neuspešna",
"contentUpdated": "Vsebina naloge je bila uspešno posodobljena",
"contentUpdateError": "Posodobitev vsebine naloge je bila neuspešna",
"subtasksUpdated": "Podnaloge so bile uspešno posodobljene",
"subtasksUpdateError": "Posodobitev podnalog je bila neuspešna",
"projectUpdated": "Projekt je bil uspešno posodobljen",
"projectUpdateError": "Posodobitev projekta je bila neuspešna",
"projectCleared": "Projekt je bil uspešno očiščen",
"projectClearError": "Čiščenje projekta je bilo neuspešno",
"priorityUpdated": "Prioriteta je bila uspešno posodobljena",
"priorityUpdateError": "Posodobitev prioritete je bila neuspešna",
"status": {
"notStarted": "ni začeto",
"inProgress": "v teku",
"done": "zaključeno",
"archived": "arhivirano",
"unknown": "poteka"
},
"noDueDate": "Brez roka",
"instanceOf": "To je instanca ponavljajoče se naloge",
"parentTask": "Nadrejena naloga",
"includingToday": "vključno s danes",
"has": "ima",
"fromProject": "iz projekta"
},
"projects": {
"loading": "Nalagam projekte...",
@ -1062,5 +1134,8 @@
"nonRecurring": "neponavljajoče se",
"instances": "ponavljajoče se instance"
}
},
"subtasks": {
"placeholder": "Dodaj podnalogo..."
}
}

View file

@ -156,7 +156,11 @@
"recurrenceEndDateChanged": "Återkommande slutdatum ändrat",
"recurrenceEndDate": "Återkommande slutdatum",
"recurrence_type_changed": "Återkommande typ ändrad",
"recurrence_interval_changed": "Återkommande intervall ändrat"
"recurrence_interval_changed": "Återkommande intervall ändrat",
"completionBasedChanged": "Ändrad återkommande baserat på slutförande",
"projectIdChanged": "Tilldelad ett projekt",
"recurrenceType": "Typ av återkommande",
"recurrenceTypeChanged": "Typ av återkommande ändrad"
}
},
"profile": {
@ -410,7 +414,8 @@
"monthDay": "Dag i månaden",
"weekOfMonth": "Vecka i månaden",
"recurrenceEndDate": "Slutdatum (valfritt)",
"completionBased": "Upprepa efter slutförd"
"completionBased": "Upprepa efter slutförd",
"repeatOn": "Upprepa på"
},
"projectSearchPlaceholder": "Sök eller skapa ett projekt...",
"noMatchingProjects": "Inga matchande projekt",
@ -431,7 +436,8 @@
"short": "Försök att vara mer specifik om vad som behöver göras",
"noVerb": "Vilken specifik åtgärd behöver du vidta? Försök att börja med ett verb.",
"vague": "Försök att börja med ett handlingsverb som \"Ring\", \"Skriv\", \"Boka\" eller \"Forska\""
}
},
"selectAtLeastOneDay": "Vänligen välj minst en dag"
},
"noteTitle": "Anteckningsitel",
"noteContent": "Anteckningsinnehåll",
@ -506,7 +512,10 @@
"browseImage": "Bläddra efter bild",
"noNotes": "Inga anteckningar för detta projekt.",
"deleteProject": "Ta bort projekt",
"createSuccess": "Projekt skapat!"
"createSuccess": "Projekt skapat!",
"createdAndAssigned": "Projekt skapat och tilldelat",
"createError": "Misslyckades med att skapa projekt",
"viewProject": "Gå till projekt"
},
"errors": {
"required": "Detta fält är obligatoriskt",
@ -661,7 +670,70 @@
"subtasks": "Deluppgifter",
"noSubtasks": "Inga deluppgifter än",
"recentActivity": "Senaste aktivitet",
"noActivityYet": "Ingen aktivitet än"
"noActivityYet": "Ingen aktivitet än",
"noSubtasksClickToAdd": "Inga deluppgifter ännu, klicka för att lägga till",
"project": "Projekt",
"noProject": "Inget projekt - Klicka för att tilldela",
"tags": "Taggar",
"noTags": "Inga taggar",
"priority": "Prioritet",
"dueDate": "Förfallodatum",
"recurringSetup": "Återkommande inställning",
"notRecurring": "Denna uppgift är inte återkommande ännu.",
"clickToEditTitle": "Klicka för att redigera titel",
"clickToEditContent": "Klicka för att redigera innehåll",
"clickToAddContent": "Klicka för att lägga till innehåll",
"clickToEditSubtasks": "Klicka för att redigera deluppgifter",
"clickToAddOrEditSubtasks": "Klicka för att lägga till eller redigera deluppgifter",
"contentPlaceholder": "Lägg till innehåll här... (Markdown stöds)",
"contentEditHint": "Tryck Cmd/Ctrl+Enter för att spara, Esc för att avbryta",
"noContentPreview": "Inga innehåll att förhandsgranska. Väx till redigeringsläge för att lägga till innehåll.",
"deleteConfirmTitle": "Ta bort uppgift",
"deleteConfirmMessage": "Är du säker på att du vill ta bort denna uppgift? Denna åtgärd kan inte ångras.",
"noMoreIterations": "Inga fler iterationer schemalagda",
"nextOccurrences": "Nästa förekomster",
"nextOccurrencesAfterThis": "Nästa förekomster efter detta",
"thisTask": "Denna uppgift",
"is": "är",
"and": "och",
"dueOn": "förfall",
"inProject": "från projekt",
"lowPriority": "låg prioritet",
"mediumPriority": "medelhög prioritet",
"highPriority": "hög prioritet",
"inDays": "om {{count}} dagar",
"daysAgo": "{{count}} dagar sedan",
"tagsUpdated": "Taggar uppdaterade framgångsrikt",
"tagsUpdateError": "Misslyckades med att uppdatera taggar",
"recurrenceUpdated": "Återkommande uppdaterad framgångsrikt",
"recurrenceUpdateError": "Misslyckades med att uppdatera återkommande",
"dueDateUpdated": "Förfallodatum uppdaterat framgångsrikt",
"dueDateUpdateError": "Misslyckades med att uppdatera förfallodatum",
"titleUpdated": "Uppgiftens titel uppdaterad framgångsrikt",
"titleUpdateError": "Misslyckades med att uppdatera uppgiftens titel",
"contentUpdated": "Uppgiftens innehåll uppdaterat framgångsrikt",
"contentUpdateError": "Misslyckades med att uppdatera uppgiftens innehåll",
"subtasksUpdated": "Underrubriker uppdaterade framgångsrikt",
"subtasksUpdateError": "Misslyckades med att uppdatera underrubriker",
"projectUpdated": "Projekt uppdaterat framgångsrikt",
"projectUpdateError": "Misslyckades med att uppdatera projekt",
"projectCleared": "Projekt rensat framgångsrikt",
"projectClearError": "Misslyckades med att rensa projekt",
"priorityUpdated": "Prioritet uppdaterad framgångsrikt",
"priorityUpdateError": "Misslyckades med att uppdatera prioritet",
"status": {
"notStarted": "inte påbörjad",
"inProgress": "pågående",
"done": "avslutad",
"archived": "arkiverad",
"unknown": "pågår"
},
"noDueDate": "Ingen förfallodatum",
"instanceOf": "Detta är en instans av en återkommande uppgift",
"parentTask": "Överordnad uppgift",
"includingToday": "inklusive idag",
"has": "har",
"fromProject": "från projektet"
},
"projects": {
"loading": "Laddar projekt...",
@ -1062,5 +1134,8 @@
"nonRecurring": "icke-återkommande",
"instances": "återkommande instanser"
}
},
"subtasks": {
"placeholder": "Lägg till en deluppgift..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Tekrar son tarihi değiştirildi",
"recurrenceEndDate": "Tekrar son tarihi",
"recurrence_type_changed": "Tekrar türü değişti",
"recurrence_interval_changed": "Tekrar aralığı değişti"
"recurrence_interval_changed": "Tekrar aralığı değişti",
"completionBasedChanged": "Tamamlamaya dayalı tekrar değiştirildi",
"projectIdChanged": "Bir projeye atandı",
"recurrenceType": "Tekrar türü",
"recurrenceTypeChanged": "Tekrar türü değiştirildi"
},
"justNow": "Şu anda",
"minutesAgo": "{{minutes}}d önce",
@ -410,7 +414,8 @@
"monthDay": "Ayın Günü",
"weekOfMonth": "Ayın Haftası",
"recurrenceEndDate": "Bitiş tarihi (isteğe bağlı)",
"completionBased": "Tamamlandıktan sonra tekrar et"
"completionBased": "Tamamlandıktan sonra tekrar et",
"repeatOn": "Şu tarihlerde tekrar et"
},
"projectSearchPlaceholder": "Proje ara veya oluştur...",
"noMatchingProjects": "Eşleşen proje yok",
@ -431,7 +436,8 @@
"short": "Ne yapılması gerektiği konusunda daha spesifik olmaya çalışın",
"noVerb": "Hangi spesifik eylemi gerçekleştirmeniz gerekiyor? Bir fiille başlamayı deneyin.",
"vague": "\"Ara\", \"Yaz\", \"Planla\" veya \"Araştır\" gibi bir eylem fiili ile başlamayı deneyin"
}
},
"selectAtLeastOneDay": "Lütfen en az bir gün seçin"
},
"noteTitle": "Not Başlığı",
"noteContent": "Not İçeriği",
@ -506,7 +512,10 @@
"browseImage": "Görseli Gözat",
"noNotes": "Bu proje için not yok.",
"deleteProject": "Projeyi Sil",
"createSuccess": "Proje başarıyla oluşturuldu!"
"createSuccess": "Proje başarıyla oluşturuldu!",
"createdAndAssigned": "Proje oluşturuldu ve atandı",
"createError": "Proje oluşturulamadı",
"viewProject": "Projeye git"
},
"errors": {
"required": "Bu alan gereklidir",
@ -661,7 +670,70 @@
"subtasks": "Alt görevler",
"noSubtasks": "Henüz alt görev yok",
"recentActivity": "Son Aktivite",
"noActivityYet": "Henüz hiçbir etkinlik yok"
"noActivityYet": "Henüz hiçbir etkinlik yok",
"noSubtasksClickToAdd": "Henüz alt görev yok, eklemek için tıklayın",
"project": "Proje",
"noProject": "Proje yok - Atamak için tıklayın",
"tags": "Etiketler",
"noTags": "Etiket yok",
"priority": "Öncelik",
"dueDate": "Son Tarih",
"recurringSetup": "Tekrarlayan Ayar",
"notRecurring": "Bu görev henüz tekrarlanmıyor.",
"clickToEditTitle": "Başlığı düzenlemek için tıklayın",
"clickToEditContent": "İçeriği düzenlemek için tıklayın",
"clickToAddContent": "İçerik eklemek için tıklayın",
"clickToEditSubtasks": "Alt görevleri düzenlemek için tıklayın",
"clickToAddOrEditSubtasks": "Alt görev eklemek veya düzenlemek için tıklayın",
"contentPlaceholder": "İçeriği buraya ekleyin... (Markdown destekleniyor)",
"contentEditHint": "Kaydetmek için Cmd/Ctrl+Enter'a, iptal etmek için Esc tuşuna basın",
"noContentPreview": "Önizlemek için içerik yok. İçerik eklemek için Düzenleme moduna geçin.",
"deleteConfirmTitle": "Görevi Sil",
"deleteConfirmMessage": "Bu görevi silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
"noMoreIterations": "Daha fazla yineleme planlanmadı",
"nextOccurrences": "Sonraki Oluşumlar",
"nextOccurrencesAfterThis": "Bundan Sonraki Oluşumlar",
"thisTask": "Bu görev",
"is": "dır",
"and": "ve",
"dueOn": "vadesi",
"inProject": "projeden",
"lowPriority": "düşük öncelik",
"mediumPriority": "orta öncelik",
"highPriority": "yüksek öncelik",
"inDays": "{{count}} gün içinde",
"daysAgo": "{{count}} gün önce",
"tagsUpdated": "Etiketler başarıyla güncellendi",
"tagsUpdateError": "Etiketleri güncelleme başarısız oldu",
"recurrenceUpdated": "Tekrar sıklığı başarıyla güncellendi",
"recurrenceUpdateError": "Tekrar sıklığını güncelleme başarısız oldu",
"dueDateUpdated": "Son tarih başarıyla güncellendi",
"dueDateUpdateError": "Son tarihi güncelleme başarısız oldu",
"titleUpdated": "Görev başlığı başarıyla güncellendi",
"titleUpdateError": "Görev başlığını güncelleme başarısız oldu",
"contentUpdated": "Görev içeriği başarıyla güncellendi",
"contentUpdateError": "Görev içeriğini güncelleme başarısız oldu",
"subtasksUpdated": "Alt görevler başarıyla güncellendi",
"subtasksUpdateError": "Alt görevleri güncelleme başarısız oldu",
"projectUpdated": "Proje başarıyla güncellendi",
"projectUpdateError": "Projeyi güncelleme başarısız oldu",
"projectCleared": "Proje başarıyla temizlendi",
"projectClearError": "Projeyi temizleme başarısız oldu",
"priorityUpdated": "Öncelik başarıyla güncellendi",
"priorityUpdateError": "Önceliği güncelleme başarısız oldu",
"status": {
"notStarted": "başlamadı",
"inProgress": "devam ediyor",
"done": "tamamlandı",
"archived": "arşivlendi",
"unknown": "süreçte"
},
"noDueDate": "Son tarih yok",
"instanceOf": "Bu, tekrarlayan bir görevin bir örneğidir",
"parentTask": "Üst Görev",
"includingToday": "bugün dahil",
"has": "var",
"fromProject": "projeden"
},
"projects": {
"loading": "Projeler yükleniyor...",
@ -1062,5 +1134,8 @@
"nonRecurring": "tekrarlamayan",
"instances": "tekrarlayan örnekler"
}
},
"subtasks": {
"placeholder": "Bir alt görev ekle..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Дата закінчення повторення змінена",
"recurrenceEndDate": "Дата закінчення повторення",
"recurrence_type_changed": "Тип повторення змінено",
"recurrence_interval_changed": "Інтервал повторення змінено"
"recurrence_interval_changed": "Інтервал повторення змінено",
"completionBasedChanged": "Зміни в повторенні на основі завершення",
"projectIdChanged": "Призначено проекту",
"recurrenceType": "Тип повторення",
"recurrenceTypeChanged": "Тип повторення змінено"
},
"justNow": "Щойно",
"minutesAgo": "{{minutes}}м тому",
@ -225,7 +229,8 @@
"status": "Статус",
"priority": "Пріоритет",
"dueDate": "Термін виконання",
"note": "Примітка"
"note": "Примітка",
"repeatOn": "Повторювати в"
},
"recurrenceSettings": "Налаштування повторення",
"completionBasedHelp": "Якщо відмічено, наступне завдання буде створене на основі дати завершення замість дати виконання",
@ -247,7 +252,8 @@
"short": "Спробуйте бути більш конкретними щодо того, що потрібно зробити",
"noVerb": "Які конкретні дії ви повинні виконати? Спробуйте почати з дієслова.",
"vague": "Спробуйте почати з дієслова, наприклад \"Зателефонувати\", \"Написати\", \"Запланувати\", або \"Дослідити\""
}
},
"selectAtLeastOneDay": "Будь ласка, виберіть принаймні один день"
},
"title": "Назва",
"description": "Опис",
@ -435,7 +441,10 @@
"name": "Назва проекту",
"noNotes": "Немає приміток для цього проекту.",
"deleteProject": "Видалити проект",
"createSuccess": "Проект успішно створено!"
"createSuccess": "Проект успішно створено!",
"createdAndAssigned": "Проект створено та призначено",
"createError": "Не вдалося створити проект",
"viewProject": "Перейти до проекту"
},
"profile": {
"title": "Налаштування Профілю",
@ -637,7 +646,70 @@
"subtasks": "Підзавдання",
"noSubtasks": "Ще немає підзавдань",
"recentActivity": "Остання активність",
"noActivityYet": "Ще немає активності"
"noActivityYet": "Ще немає активності",
"noSubtasksClickToAdd": "Немає підзадач, натисніть, щоб додати",
"project": "Проект",
"noProject": "Немає проекту - натисніть, щоб призначити",
"tags": "Теги",
"noTags": "Немає тегів",
"priority": "Пріоритет",
"dueDate": "Термін виконання",
"recurringSetup": "Налаштування повторення",
"notRecurring": "Ця задача ще не є повторюваною.",
"clickToEditTitle": "Натисніть, щоб редагувати заголовок",
"clickToEditContent": "Натисніть, щоб редагувати вміст",
"clickToAddContent": "Натисніть, щоб додати вміст",
"clickToEditSubtasks": "Натисніть, щоб редагувати підзадачі",
"clickToAddOrEditSubtasks": "Натисніть, щоб додати або редагувати підзадачі",
"contentPlaceholder": "Додайте вміст тут... (підтримується Markdown)",
"contentEditHint": "Натисніть Cmd/Ctrl+Enter, щоб зберегти, Esc, щоб скасувати",
"noContentPreview": "Немає вмісту для попереднього перегляду. Перейдіть в режим редагування, щоб додати вміст.",
"deleteConfirmTitle": "Видалити задачу",
"deleteConfirmMessage": "Ви впевнені, що хочете видалити цю задачу? Цю дію не можна скасувати.",
"noMoreIterations": "Більше ітерацій не заплановано",
"nextOccurrences": "Наступні випадки",
"nextOccurrencesAfterThis": "Наступні випадки після цього",
"thisTask": "Ця задача",
"is": "є",
"and": "і",
"dueOn": "термін",
"inProject": "з проєкту",
"lowPriority": "низький пріоритет",
"mediumPriority": "середній пріоритет",
"highPriority": "високий пріоритет",
"inDays": "через {{count}} дні",
"daysAgo": "{{count}} днів тому",
"tagsUpdated": "Теги успішно оновлено",
"tagsUpdateError": "Не вдалося оновити теги",
"recurrenceUpdated": "Повторення успішно оновлено",
"recurrenceUpdateError": "Не вдалося оновити повторення",
"dueDateUpdated": "Термін виконання успішно оновлено",
"dueDateUpdateError": "Не вдалося оновити термін виконання",
"titleUpdated": "Назву завдання успішно оновлено",
"titleUpdateError": "Не вдалося оновити назву завдання",
"contentUpdated": "Зміст завдання успішно оновлено",
"contentUpdateError": "Не вдалося оновити зміст завдання",
"subtasksUpdated": "Підзавдання успішно оновлено",
"subtasksUpdateError": "Не вдалося оновити підзавдання",
"projectUpdated": "Проект успішно оновлено",
"projectUpdateError": "Не вдалося оновити проект",
"projectCleared": "Проект успішно очищено",
"projectClearError": "Не вдалося очистити проект",
"priorityUpdated": "Пріоритет успішно оновлено",
"priorityUpdateError": "Не вдалося оновити пріоритет",
"status": {
"notStarted": "не розпочато",
"inProgress": "в процесі",
"done": "завершено",
"archived": "архівовано",
"unknown": "триває"
},
"noDueDate": "Без терміну виконання",
"instanceOf": "Це екземпляр повторювального завдання",
"parentTask": "Батьківське завдання",
"includingToday": "включаючи сьогодні",
"has": "має",
"fromProject": "з проєкту"
},
"calendar": {
"month": "Місяць",
@ -1062,5 +1134,8 @@
"nonRecurring": "неповторювані",
"instances": "повторювані екземпляри"
}
},
"subtasks": {
"placeholder": "Додати підзадачу..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "Ngày kết thúc chu kỳ đã thay đổi",
"recurrenceEndDate": "Ngày kết thúc chu kỳ",
"recurrence_type_changed": "Loại tái diễn đã thay đổi",
"recurrence_interval_changed": "Khoảng thời gian tái diễn đã thay đổi"
"recurrence_interval_changed": "Khoảng thời gian tái diễn đã thay đổi",
"completionBasedChanged": "Thay đổi tần suất dựa trên hoàn thành",
"projectIdChanged": "Được gán cho một dự án",
"recurrenceType": "Loại tần suất",
"recurrenceTypeChanged": "Thay đổi loại tần suất"
},
"justNow": "Vừa xong",
"minutesAgo": "{{minutes}} phút trước",
@ -410,7 +414,8 @@
"monthDay": "Ngày trong tháng",
"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"
"completionBased": "Lặp lại sau khi hoàn thành",
"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",
@ -431,7 +436,8 @@
"short": "Hãy cố gắng cụ thể hơn về những gì cần làm",
"noVerb": "Bạn cần thực hiện hành động cụ thể nào? Hãy thử bắt đầu bằng một động từ.",
"vague": "Hãy thử bắt đầu bằng một động từ hành động như \"Gọi\", \"Viết\", \"Lên lịch\", hoặc \"Nghiên cứu\""
}
},
"selectAtLeastOneDay": "Vui lòng chọn ít nhất một ngày"
},
"noteTitle": "Tiêu đề ghi chú",
"noteContent": "Nội dung ghi chú",
@ -506,7 +512,10 @@
"browseImage": "Duyệt Hình Ảnh",
"noNotes": "Không có ghi chú cho dự án này.",
"deleteProject": "Xóa Dự Án",
"createSuccess": "Dự án đã được tạo thành công!"
"createSuccess": "Dự án đã được tạo thành công!",
"createdAndAssigned": "Dự án đã được tạo và gán",
"createError": "Tạo dự án không thành công",
"viewProject": "Đi đến dự án"
},
"errors": {
"required": "Trường này là bắt buộc",
@ -661,7 +670,70 @@
"subtasks": "Công việc con",
"noSubtasks": "Chưa có công việc con nào",
"recentActivity": "Hoạt động gần đây",
"noActivityYet": "Chưa có hoạt động nào"
"noActivityYet": "Chưa có hoạt động nào",
"noSubtasksClickToAdd": "Chưa có công việc con, nhấp để thêm",
"project": "Dự án",
"noProject": "Không có dự án - Nhấp để gán",
"tags": "Thẻ",
"noTags": "Không có thẻ",
"priority": "Độ ưu tiên",
"dueDate": "Ngày hết hạ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 đề",
"clickToEditContent": "Nhấp để chỉnh sửa nội dung",
"clickToAddContent": "Nhấp để thêm nội dung",
"clickToEditSubtasks": "Nhấp để chỉnh sửa các công việc con",
"clickToAddOrEditSubtasks": "Nhấp để thêm hoặc chỉnh sửa các công việc con",
"contentPlaceholder": "Thêm nội dung ở đây... (hỗ trợ Markdown)",
"contentEditHint": "Nhấn Cmd/Ctrl+Enter để lưu, Esc để hủy",
"noContentPreview": "Không có nội dung để xem trước. Chuyển sang chế độ Chỉnh sửa để thêm nội dung.",
"deleteConfirmTitle": "Xóa Công việc",
"deleteConfirmMessage": "Bạn có chắc chắn muốn xóa công việc này không? Hành động này không thể hoàn tác.",
"noMoreIterations": "Không còn lần lặp nào được lên lịch",
"nextOccurrences": "Các lần xuất hiện tiếp theo",
"nextOccurrencesAfterThis": "Các lần xuất hiện tiếp theo sau cái này",
"thisTask": "Công việc này",
"is": "là",
"and": "và",
"dueOn": "hạn",
"inProject": "từ dự án",
"lowPriority": "ưu tiên thấp",
"mediumPriority": "ưu tiên trung bình",
"highPriority": "ưu tiên cao",
"inDays": "trong {{count}} ngày",
"daysAgo": "{{count}} ngày trước",
"tagsUpdated": "Cập nhật thẻ thành công",
"tagsUpdateError": "Cập nhật thẻ thất bại",
"recurrenceUpdated": "Cập nhật chu kỳ thành công",
"recurrenceUpdateError": "Cập nhật chu kỳ thất bại",
"dueDateUpdated": "Cập nhật ngày đến hạn thành công",
"dueDateUpdateError": "Cập nhật ngày đến hạn thất bại",
"titleUpdated": "Cập nhật tiêu đề nhiệm vụ thành công",
"titleUpdateError": "Cập nhật tiêu đề nhiệm vụ thất bại",
"contentUpdated": "Cập nhật nội dung nhiệm vụ thành công",
"contentUpdateError": "Cập nhật nội dung nhiệm vụ thất bại",
"subtasksUpdated": "Cập nhật nhiệm vụ con thành công",
"subtasksUpdateError": "Cập nhật nhiệm vụ con thất bại",
"projectUpdated": "Cập nhật dự án thành công",
"projectUpdateError": "Cập nhật dự án thất bại",
"projectCleared": "Dự án đã được xóa thành công",
"projectClearError": "Xóa dự án thất bại",
"priorityUpdated": "Cập nhật độ ưu tiên thành công",
"priorityUpdateError": "Cập nhật độ ưu tiên thất bại",
"status": {
"notStarted": "chưa bắt đầu",
"inProgress": "đang tiến hành",
"done": "đã hoàn thành",
"archived": "đã lưu trữ",
"unknown": "đang diễn ra"
},
"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ỳ",
"parentTask": "Nhiệm vụ Cha",
"includingToday": "bao gồm hôm nay",
"has": "có",
"fromProject": "từ dự án"
},
"projects": {
"loading": "Đang tải dự án...",
@ -1062,5 +1134,8 @@
"nonRecurring": "không lặp lại",
"instances": "các phiên bản lặp lại"
}
},
"subtasks": {
"placeholder": "Thêm một công việc phụ..."
}
}

View file

@ -149,7 +149,11 @@
"recurrenceEndDateChanged": "重复结束日期已更改",
"recurrenceEndDate": "重复结束日期",
"recurrence_type_changed": "重复类型已更改",
"recurrence_interval_changed": "重复间隔已更改"
"recurrence_interval_changed": "重复间隔已更改",
"completionBasedChanged": "基于完成的重复已更改",
"projectIdChanged": "已分配到项目",
"recurrenceType": "重复类型",
"recurrenceTypeChanged": "重复类型已更改"
},
"justNow": "刚刚",
"minutesAgo": "{{minutes}}分钟前",
@ -410,7 +414,8 @@
"monthDay": "每月的天",
"weekOfMonth": "每月的周",
"recurrenceEndDate": "结束日期(可选)",
"completionBased": "完成后重复"
"completionBased": "完成后重复",
"repeatOn": "重复于"
},
"projectSearchPlaceholder": "搜索或创建项目...",
"noMatchingProjects": "没有匹配的项目",
@ -431,7 +436,8 @@
"short": "尽量更具体地说明需要做什么",
"noVerb": "你需要采取什么具体行动?尝试以动词开头。",
"vague": "尝试以动作动词开头,例如 \"打电话\"、\"写\"、\"安排\" 或 \"研究\""
}
},
"selectAtLeastOneDay": "请至少选择一天"
},
"noteTitle": "笔记标题",
"noteContent": "笔记内容",
@ -506,7 +512,10 @@
"browseImage": "浏览图片",
"noNotes": "此项目没有备注。",
"deleteProject": "删除项目",
"createSuccess": "项目创建成功!"
"createSuccess": "项目创建成功!",
"createdAndAssigned": "项目已创建并分配",
"createError": "创建项目失败",
"viewProject": "前往项目"
},
"errors": {
"required": "此字段为必填项",
@ -661,7 +670,70 @@
"subtasks": "子任务",
"noSubtasks": "尚无子任务",
"recentActivity": "最近活动",
"noActivityYet": "尚无活动"
"noActivityYet": "尚无活动",
"noSubtasksClickToAdd": "尚无子任务,点击添加",
"project": "项目",
"noProject": "没有项目 - 点击分配",
"tags": "标签",
"noTags": "没有标签",
"priority": "优先级",
"dueDate": "截止日期",
"recurringSetup": "重复设置",
"notRecurring": "此任务尚未重复。",
"clickToEditTitle": "点击编辑标题",
"clickToEditContent": "点击编辑内容",
"clickToAddContent": "点击添加内容",
"clickToEditSubtasks": "点击编辑子任务",
"clickToAddOrEditSubtasks": "点击添加或编辑子任务",
"contentPlaceholder": "在这里添加内容...支持Markdown",
"contentEditHint": "按 Cmd/Ctrl+Enter 保存,按 Esc 取消",
"noContentPreview": "没有内容可预览。切换到编辑模式以添加内容。",
"deleteConfirmTitle": "删除任务",
"deleteConfirmMessage": "您确定要删除此任务吗?此操作无法撤销。",
"noMoreIterations": "没有更多计划的迭代",
"nextOccurrences": "下一个发生",
"nextOccurrencesAfterThis": "此后的下一个发生",
"thisTask": "此任务",
"is": "是",
"and": "和",
"dueOn": "到期",
"inProject": "来自项目",
"lowPriority": "低优先级",
"mediumPriority": "中优先级",
"highPriority": "高优先级",
"inDays": "在 {{count}} 天内",
"daysAgo": "{{count}} 天前",
"tagsUpdated": "标签更新成功",
"tagsUpdateError": "更新标签失败",
"recurrenceUpdated": "重复更新成功",
"recurrenceUpdateError": "更新重复失败",
"dueDateUpdated": "截止日期更新成功",
"dueDateUpdateError": "更新截止日期失败",
"titleUpdated": "任务标题更新成功",
"titleUpdateError": "更新任务标题失败",
"contentUpdated": "任务内容更新成功",
"contentUpdateError": "更新任务内容失败",
"subtasksUpdated": "子任务更新成功",
"subtasksUpdateError": "更新子任务失败",
"projectUpdated": "项目更新成功",
"projectUpdateError": "更新项目失败",
"projectCleared": "项目清除成功",
"projectClearError": "清除项目失败",
"priorityUpdated": "优先级更新成功",
"priorityUpdateError": "更新优先级失败",
"status": {
"notStarted": "未开始",
"inProgress": "进行中",
"done": "已完成",
"archived": "已归档",
"unknown": "进行中"
},
"noDueDate": "没有截止日期",
"instanceOf": "这是一个重复任务的实例",
"parentTask": "父任务",
"includingToday": "包括今天",
"has": "有",
"fromProject": "来自项目"
},
"projects": {
"loading": "加载项目中...",
@ -1062,5 +1134,8 @@
"nonRecurring": "非循环",
"instances": "循环实例"
}
},
"subtasks": {
"placeholder": "添加子任务..."
}
}