Compare commits
15 Commits
fix/update
...
fix/multip
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
175999c88c | ||
|
|
24e283e22c | ||
|
|
07db7409cb | ||
|
|
346ddc16be | ||
|
|
f9eee53ed0 | ||
|
|
1ab4e24c96 | ||
|
|
34165b390f | ||
|
|
ef0d53db8f | ||
|
|
78b9de869f | ||
|
|
81c03b51e2 | ||
|
|
0d3d9a358f | ||
|
|
2269d23c94 | ||
|
|
e437d075e3 | ||
|
|
b422907b53 | ||
|
|
672dfe6540 |
12
README.md
12
README.md
@@ -47,7 +47,17 @@ See our [roadmap](https://kan.bn/kan/roadmap) for upcoming features.
|
||||
|
||||
## Self Hosting 🐳
|
||||
|
||||
The easiest way to self-host Kan is with Docker Compose. This will set up everything for you including your postgres database.
|
||||
### One-click Deployments
|
||||
|
||||
The easiest way to deploy Kan is through Railway. We've partnered with Railway to maintain an official template that supports the development of the project.
|
||||
|
||||
<a href="https://railway.com/deploy/kan?referralCode=bZPsr2&utm_medium=integration&utm_source=template&utm_campaign=generic">
|
||||
<img src="https://railway.app/button.svg" alt="Deploy on Railway" height="40" />
|
||||
</a>
|
||||
|
||||
### Docker Compose
|
||||
|
||||
Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database.
|
||||
|
||||
1. Create a new file called `docker-compose.yml` and paste the following configuration:
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ checksums:
|
||||
"%2C%20or%20see%20our/singular": e8a8f2a078fcaea03481710dcaccce5d
|
||||
"%7B0%7D/singular": 18782768c8a0b3c2078747b34fbbcd24
|
||||
"%7B0%7D%20%7C%20%7B1%7D/singular": 4628f9c6ec13c2dc2984a6ab80e19f8b
|
||||
"%7B0%7D%20has%20been%20added%20to%20your%20favorites./singular": 0f752180183c80703b3f9f39dc97195f
|
||||
"%7B0%7D%20has%20been%20removed%20from%20your%20favorites./singular": 26e4b4997ad8a711d0b3e46337799454
|
||||
"%7B0%7D%20labels/singular": 785f92bedf786ff3e285adfc07c69d18
|
||||
"%7B0%7D%20not%20found/singular": a2665fc66f128fee1a80ffec61c9f1a1
|
||||
"%7BboardCount%2C%20plural%2C%20one%20%7BImport%20board%20(1)%7D%20other%20%7BImport%20boards%20(%7BboardCount%7D)%7D%7D/singular": 72358c550bd1a99fcb6e8952f0f947ef
|
||||
@@ -27,6 +29,7 @@ checksums:
|
||||
Add%20details.../singular: 2f42547fd5d199f173aa7a88c8a9b19a
|
||||
Add%20label/singular: 0be732d46df263265935fda342097a08
|
||||
Add%20member/singular: 11979625770516ca287e929381778e02
|
||||
Add%20to%20favorites/singular: 532155acb0a46f2b6c37e15afb3ad21e
|
||||
added%20%7B0%7D%20labels%3A%20%3C0%3E%7BlabelList%7D%3C%2F0%3E/singular: 42b0488d570626dc887c58ff669c953c
|
||||
added%20a%20checklist/singular: 44304f4a5ef3a46378eea243b5d2df79
|
||||
added%20a%20checklist%20item/singular: 20bc0330dba5a9ec978e04bec174365a
|
||||
@@ -35,6 +38,7 @@ checksums:
|
||||
added%20checklist%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: fb6a852c50c1629f47c6f155fc93fdee
|
||||
added%20checklist%20item%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: bdd202da20b1fffbec21792c5453f90c
|
||||
added%20label%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: b32be052b3d57de0c9120fa7f9fc86ee
|
||||
Added%20to%20favorites/singular: 848046ec65d15913112b466c544722eb
|
||||
Adding%20a%20new%20member%20will%20cost%20an%20additional%20%7Bprice%7D%20(%7BbillingType%7D)%20per%20seat./singular: 12e88573028306110fbc15ef1e714892
|
||||
Adjust%20the%20square%20crop%20to%20fit%20your%20avatar./singular: a4df26bbce6f14c6962fac1324db00a8
|
||||
Admin/singular: 90eb20f1400db82ab874744e47836dc6
|
||||
@@ -106,7 +110,6 @@ checksums:
|
||||
Can%20edit%20member%20roles%20and%20permissions/singular: c364e8e8866111a471f4081db0730049
|
||||
Can%20edit%20workspace/singular: 9768f990844e215c06910fed250da23a
|
||||
Can%20invite%20members/singular: e02e562bcb7f46008d9595e485951413
|
||||
can%20manage%20workspace%20settings/singular: 78bfe1746f961f37b1cde85e5a0e9a13
|
||||
Can%20manage%20workspace%20settings/singular: 27eb18d3be5b3d813996b7d5071e0317
|
||||
Can%20remove%20members/singular: 97a452b0fb4b661eaca7e5b3d5b49dcd
|
||||
Can%20view%20boards/singular: 14977bbbb566f72fc74e17d99bad09bb
|
||||
@@ -462,10 +465,12 @@ checksums:
|
||||
Recruitment/singular: 78084ee4954aa22efe9ad7463d2a0c72
|
||||
Remote/singular: dc3e4280dfe5c455b38ba6c8884999cf
|
||||
Remove/singular: dba2fe5fe9f83f8078c687f28cba4b52
|
||||
Remove%20from%20favorites/singular: 74d9cc2d2f3c7a7dc42a7e62c8ee06d5
|
||||
Remove%20member/singular: 1d77c2ca3768e486fd1fb5df30cb60d9
|
||||
removed%20%7B0%7D%20labels%3A%20%3C0%3E%7BlabelList%7D%3C%2F0%3E/singular: 612fcfd4aca6818fc870f81d9687d63f
|
||||
removed%20a%20label%20from%20the%20card/singular: f83ec18850a2a8a3f8242a740a04df06
|
||||
removed%20a%20member%20from%20the%20card/singular: 0bd7561bb79358fde3d595c3e60a315a
|
||||
Removed%20from%20favorites/singular: 540609ab686ed67b1cfd7649467b8bc1
|
||||
removed%20label%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 7e0936b15831e65754588b8512f62fcb
|
||||
removed%20the%20due%20date/singular: 000c084844718540fcad542dd8caf8b4
|
||||
renamed%20a%20checklist/singular: 4d208de1857740e63469007c5b8b491a
|
||||
@@ -581,6 +586,7 @@ checksums:
|
||||
Unable%20to%20reorder%20checklist%20item/singular: dcc238c72b85daf74ebd46adcd914473
|
||||
Unable%20to%20reset%20permissions/singular: fb09d88ff4eb32afb852d733bafd515b
|
||||
Unable%20to%20send%20feedback/singular: 656c93265d7e2bef1245b17d85f85ae5
|
||||
Unable%20to%20update%20board/singular: 62899897d7bffcb1df3af77d460f0881
|
||||
Unable%20to%20update%20board%20URL/singular: 080746884059142358b58d9a44ff7d93
|
||||
Unable%20to%20update%20board%20visibility/singular: a76a21d561b8943e9276e027a1e3f70d
|
||||
Unable%20to%20update%20card/singular: eca6002e57af8ec97324eae64e3b5731
|
||||
|
||||
@@ -53,7 +53,6 @@ const config = {
|
||||
{
|
||||
protocol: 'https',
|
||||
hostname: 'cdn.discordapp.com',
|
||||
pathname: '/avatars/**',
|
||||
},
|
||||
];
|
||||
|
||||
@@ -95,12 +94,6 @@ const config = {
|
||||
swcPlugins: [["@lingui/swc-plugin", {}]],
|
||||
},
|
||||
|
||||
api: {
|
||||
bodyParser: {
|
||||
sizeLimit: env("NEXT_API_BODY_SIZE_LIMIT") || '1mb',
|
||||
},
|
||||
},
|
||||
|
||||
async rewrites() {
|
||||
return [
|
||||
{
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.802.0",
|
||||
"@aws-sdk/lib-storage": "^3.802.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.812.0",
|
||||
"@headlessui/react": "^2.2.0",
|
||||
"@hookform/resolvers": "^3.3.4",
|
||||
@@ -38,6 +39,7 @@
|
||||
"@tiptap/extension-link": "^2.22.2",
|
||||
"@tiptap/extension-mention": "^3.0.9",
|
||||
"@tiptap/extension-placeholder": "^2.14.0",
|
||||
"@tiptap/extension-typography": "^3.18.0",
|
||||
"@tiptap/pm": "^2.14.0",
|
||||
"@tiptap/react": "^2.14.0",
|
||||
"@tiptap/starter-kit": "^2.14.0",
|
||||
|
||||
@@ -361,8 +361,8 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
<form onSubmit={handleSubmit(onSubmit)}>
|
||||
{!isCredentialsEnabled && socialProviders?.length === 0 && (
|
||||
{!(isCredentialsEnabled || isMagicLinkAvailable) &&
|
||||
socialProviders?.length === 0 && (
|
||||
<div className="flex w-full items-center gap-4">
|
||||
<div className="h-[1px] w-1/3 bg-light-600 dark:bg-dark-600" />
|
||||
<span className="text-center text-sm text-light-900 dark:text-dark-900">
|
||||
@@ -371,65 +371,62 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
<div className="h-[1px] w-1/3 bg-light-600 dark:bg-dark-600" />
|
||||
</div>
|
||||
)}
|
||||
{!isCredentialsEnabled && socialProviders?.length !== 0 && (
|
||||
<div className="mb-[1.5rem] flex w-full items-center gap-4">
|
||||
<div className="h-[1px] w-full bg-light-600 dark:bg-dark-600" />
|
||||
<span className="text-sm text-light-900 dark:text-dark-900">
|
||||
{t`or`}
|
||||
</span>
|
||||
<div className="h-[1px] w-full bg-light-600 dark:bg-dark-600" />
|
||||
</div>
|
||||
)}
|
||||
<div className="space-y-2">
|
||||
{isSignUp && isCredentialsEnabled && (
|
||||
<div>
|
||||
<Input
|
||||
{...register("name", { required: true })}
|
||||
placeholder={t`Enter your name`}
|
||||
/>
|
||||
{errors.name && (
|
||||
<p className="mt-2 text-xs text-red-400">
|
||||
{t`Please enter a valid name`}
|
||||
</p>
|
||||
)}
|
||||
{(isCredentialsEnabled || isMagicLinkAvailable) && (
|
||||
<form onSubmit={handleSubmit(onSubmit)}>
|
||||
{socialProviders?.length !== 0 && (
|
||||
<div className="mb-[1.5rem] flex w-full items-center gap-4">
|
||||
<div className="h-[1px] w-full bg-light-600 dark:bg-dark-600" />
|
||||
<span className="text-sm text-light-900 dark:text-dark-900">
|
||||
{t`or`}
|
||||
</span>
|
||||
<div className="h-[1px] w-full bg-light-600 dark:bg-dark-600" />
|
||||
</div>
|
||||
)}
|
||||
{(isCredentialsEnabled || isMagicLinkAvailable) && (
|
||||
<>
|
||||
<div className="space-y-2">
|
||||
{isSignUp && isCredentialsEnabled && (
|
||||
<div>
|
||||
<Input
|
||||
{...register("email", { required: true })}
|
||||
placeholder={t`Enter your email address`}
|
||||
{...register("name", { required: true })}
|
||||
placeholder={t`Enter your name`}
|
||||
/>
|
||||
{errors.email && (
|
||||
{errors.name && (
|
||||
<p className="mt-2 text-xs text-red-400">
|
||||
{t`Please enter a valid email address`}
|
||||
{t`Please enter a valid name`}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{isCredentialsEnabled && (
|
||||
<div>
|
||||
<Input
|
||||
type="password"
|
||||
{...register("password", { required: true })}
|
||||
placeholder={t`Enter your password`}
|
||||
/>
|
||||
{errors.password && (
|
||||
<p className="mt-2 text-xs text-red-400">
|
||||
{errors.password.message ??
|
||||
t`Please enter a valid password`}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<div>
|
||||
<Input
|
||||
{...register("email", { required: true })}
|
||||
placeholder={t`Enter your email address`}
|
||||
/>
|
||||
{errors.email && (
|
||||
<p className="mt-2 text-xs text-red-400">
|
||||
{t`Please enter a valid email address`}
|
||||
</p>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
{loginError && (
|
||||
<p className="mt-2 text-xs text-red-400">{loginError}</p>
|
||||
)}
|
||||
</div>
|
||||
{(isCredentialsEnabled || isMagicLinkAvailable) && (
|
||||
</div>
|
||||
|
||||
{isCredentialsEnabled && (
|
||||
<div>
|
||||
<Input
|
||||
type="password"
|
||||
{...register("password", { required: true })}
|
||||
placeholder={t`Enter your password`}
|
||||
/>
|
||||
{errors.password && (
|
||||
<p className="mt-2 text-xs text-red-400">
|
||||
{errors.password.message ??
|
||||
t`Please enter a valid password`}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{loginError && (
|
||||
<p className="mt-2 text-xs text-red-400">{loginError}</p>
|
||||
)}
|
||||
</div>
|
||||
<div className="mt-[1.5rem] flex items-center gap-4">
|
||||
<Button
|
||||
isLoading={isLoginWithEmailPending}
|
||||
@@ -441,8 +438,11 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
|
||||
{isMagicLinkMode ? t`magic link` : t`email`}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</form>
|
||||
</form>
|
||||
)}
|
||||
{!(isCredentialsEnabled || isMagicLinkAvailable) && loginError && (
|
||||
<p className="mt-2 text-xs text-red-400">{loginError}</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ const Avatar = ({
|
||||
icon?: React.ReactNode;
|
||||
isLoading?: boolean;
|
||||
}) => {
|
||||
const initials = name
|
||||
const initials = name?.trim()
|
||||
? getInitialsFromName(name)
|
||||
: inferInitialsFromEmail(email);
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import { authClient } from "@kan/auth/client";
|
||||
import { useClickOutside } from "~/hooks/useClickOutside";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { useWorkspace, WorkspaceProvider } from "~/providers/workspace";
|
||||
import { api } from "~/utils/api";
|
||||
import SideNavigation from "./SideNavigation";
|
||||
|
||||
interface DashboardProps {
|
||||
@@ -44,6 +45,12 @@ export default function Dashboard({
|
||||
const { availableWorkspaces, hasLoaded } = useWorkspace();
|
||||
|
||||
const { data: session, isPending: sessionLoading } = authClient.useSession();
|
||||
const { data: user, isLoading: userLoading } = api.user.getUser.useQuery(
|
||||
undefined,
|
||||
{
|
||||
enabled: !!session?.user,
|
||||
},
|
||||
);
|
||||
|
||||
const [isSideNavOpen, setIsSideNavOpen] = useState(false);
|
||||
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
|
||||
@@ -155,8 +162,12 @@ export default function Dashboard({
|
||||
className={`fixed top-12 z-40 h-[calc(100dvh-3rem)] w-[calc(100vw-1.5rem)] transform transition-transform duration-300 ease-in-out md:relative md:top-0 md:h-full md:w-auto md:translate-x-0 ${isSideNavOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"} `}
|
||||
>
|
||||
<SideNavigation
|
||||
user={{ displayName: session?.user.name, email: session?.user.email, image: session?.user.image }}
|
||||
isLoading={sessionLoading}
|
||||
user={{
|
||||
displayName: user?.name ?? session?.user.name,
|
||||
email: user?.email ?? session?.user.email ?? "",
|
||||
image: user?.image ?? undefined,
|
||||
}}
|
||||
isLoading={sessionLoading || userLoading}
|
||||
onCloseSideNav={closeSideNav}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -30,7 +30,7 @@ export default function Dropdown({
|
||||
leaveFrom="transform opacity-100 scale-100"
|
||||
leaveTo="transform opacity-0 scale-95"
|
||||
>
|
||||
<Menu.Items className="absolute right-0 z-50 mt-2 w-56 origin-top-right rounded-md border border-light-200 bg-light-50 p-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-400 dark:bg-dark-300">
|
||||
<Menu.Items className="absolute right-0 z-[100] isolate mt-2 w-56 origin-top-right rounded-md border border-light-200 bg-white p-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-400 dark:bg-dark-300">
|
||||
<div className="flex flex-col">
|
||||
{items.map((item) => (
|
||||
<Menu.Item key={item.label} disabled={item.disabled}>
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
ReactRenderer,
|
||||
useEditor,
|
||||
} from "@tiptap/react";
|
||||
import Typography from "@tiptap/extension-typography";
|
||||
import StarterKit from "@tiptap/starter-kit";
|
||||
import Suggestion from "@tiptap/suggestion";
|
||||
import {
|
||||
@@ -514,6 +515,17 @@ export default function Editor({
|
||||
return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`;
|
||||
},
|
||||
}),
|
||||
Typography.configure({
|
||||
openDoubleQuote: false,
|
||||
closeDoubleQuote: false,
|
||||
openSingleQuote: false,
|
||||
closeSingleQuote: false,
|
||||
oneHalf: false,
|
||||
oneQuarter: false,
|
||||
threeQuarters: false,
|
||||
superscriptTwo: false,
|
||||
superscriptThree: false,
|
||||
}),
|
||||
...(enableYouTubeEmbed ? [YouTubeNode] : []),
|
||||
],
|
||||
content,
|
||||
|
||||
@@ -55,9 +55,10 @@ export default function SideNavigation({
|
||||
const [isInitialised, setIsInitialised] = useState(false);
|
||||
const { openModal } = useModal();
|
||||
|
||||
const { data: workspaceData } = api.workspace.byId.useQuery({
|
||||
workspacePublicId: workspace.publicId,
|
||||
});
|
||||
const { data: workspaceData } = api.workspace.byId.useQuery(
|
||||
{ workspacePublicId: workspace.publicId },
|
||||
{ enabled: !!workspace.publicId && workspace.publicId.length >= 12 },
|
||||
);
|
||||
|
||||
const subscriptions = workspaceData?.subscriptions as
|
||||
| Subscription[]
|
||||
|
||||
@@ -7,7 +7,7 @@ import tippy from "tippy.js";
|
||||
|
||||
interface TooltipProps {
|
||||
children: ReactNode;
|
||||
content: ReactNode;
|
||||
content?: ReactNode;
|
||||
placement?: Placement;
|
||||
delay?: number | [number, number];
|
||||
}
|
||||
@@ -24,6 +24,8 @@ export function Tooltip({
|
||||
useEffect(() => {
|
||||
if (!triggerRef.current) return;
|
||||
|
||||
if (!content) return;
|
||||
|
||||
const container = document.createElement("div");
|
||||
const root = createRoot(container);
|
||||
rootRef.current = root;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { Permission } from "@kan/shared";
|
||||
import { useContext } from "react";
|
||||
|
||||
import { useWorkspace } from "~/providers/workspace";
|
||||
import { WorkspaceContext } from "~/providers/workspace";
|
||||
import { api } from "~/utils/api";
|
||||
|
||||
interface UsePermissionsResult {
|
||||
@@ -30,7 +31,40 @@ interface UsePermissionsResult {
|
||||
}
|
||||
|
||||
export function usePermissions(): UsePermissionsResult {
|
||||
const { workspace } = useWorkspace();
|
||||
// Check if WorkspaceProvider is available (for public board views, it may not be)
|
||||
const workspaceContext = useContext(WorkspaceContext);
|
||||
|
||||
// If WorkspaceProvider is not available, return safe defaults
|
||||
if (!workspaceContext) {
|
||||
const emptyPermissions: UsePermissionsResult = {
|
||||
permissions: [],
|
||||
role: null,
|
||||
isLoading: false,
|
||||
hasPermission: () => false,
|
||||
canViewCard: false,
|
||||
canCreateCard: false,
|
||||
canEditCard: false,
|
||||
canDeleteCard: false,
|
||||
canCreateList: false,
|
||||
canEditList: false,
|
||||
canDeleteList: false,
|
||||
canCreateBoard: false,
|
||||
canEditBoard: false,
|
||||
canDeleteBoard: false,
|
||||
canViewComment: false,
|
||||
canCreateComment: false,
|
||||
canEditComment: false,
|
||||
canDeleteComment: false,
|
||||
canInviteMember: false,
|
||||
canEditMember: false,
|
||||
canRemoveMember: false,
|
||||
canViewWorkspace: false,
|
||||
canEditWorkspace: false,
|
||||
};
|
||||
return emptyPermissions;
|
||||
}
|
||||
|
||||
const { workspace } = workspaceContext;
|
||||
|
||||
const { data, isLoading } = api.permission.getMyPermissions.useQuery(
|
||||
{ workspacePublicId: workspace.publicId },
|
||||
|
||||
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} wurde zu Ihren Favoriten hinzugefügt."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} wurde aus Ihren Favoriten entfernt."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Label hinzufügen"
|
||||
msgid "Add member"
|
||||
msgstr "Mitglied hinzufügen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Zu Favoriten hinzufügen"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "{0} Labels hinzugefügt: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "hat eine Checkliste hinzugefügt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "hat ein Checklistenelement hinzugefügt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "hat ein Label zur Karte hinzugefügt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "hat ein Mitglied zur Karte hinzugefügt"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "hat Checkliste <0>{0}</0> hinzugefügt"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "hat Checklistenelement <0>{0}</0> hinzugefügt"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "hat Label <0>{0}</0> hinzugefügt"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Zu Favoriten hinzugefügt"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Das Hinzufügen eines neuen Mitglieds kostet zusätzlich {price} ({billingType}) pro Platz."
|
||||
@@ -282,8 +300,8 @@ msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "hat <0>{0}</0> der Karte zugewiesen"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Passwort ändern"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Ändern Sie Ihre Spracheinstellungen."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "hat den Fälligkeitstermin auf <0>{formattedDate}</0> geändert"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Abgeschlossen"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Vollständige Kontrolle und Eigentum:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "hat ein Checklistenelement abgeschlossen"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "hat Checklistenelement <0>{0}</0> abgeschlossen"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Liste erstellen"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Neue(n) {0} erstellen"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Neues Label erstellen"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Neue Liste erstellen"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Vorlage erstellen"
|
||||
msgid "Create workspace"
|
||||
msgstr "Arbeitsbereich erstellen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "hat die Karte erstellt"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Löschen"
|
||||
msgid "Delete account"
|
||||
msgstr "Konto löschen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Board löschen"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Kommentar löschen"
|
||||
msgid "Delete list"
|
||||
msgstr "Liste löschen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Vorlage löschen"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Vorlage löschen"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Workspace löschen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "hat eine Checkliste gelöscht"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "hat ein Checklistenelement gelöscht"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "hat Checkliste <0>{0}</0> gelöscht"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "hat Checklistenelement <0>{0}</0> gelöscht"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Morgen fällig"
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Board-URL bearbeiten"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Loslegen"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Beginnen Sie, indem Sie eine(n) neue(n) {0} erstellen"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Beginne mit dem Erstellen einer neuen Liste"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Listenname"
|
||||
msgid "Lists"
|
||||
msgstr "Listen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Weitere Aktivitäten laden"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Weitere Aktivitäten laden"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Berechtigungen werden geladen..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Wird geladen..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Niedrige Priorität"
|
||||
msgid "magic link"
|
||||
msgstr "Magic Link"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Als Vorlage speichern"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "hat ein Checklistenelement als unvollständig markiert"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "hat Checklistenelement <0>{0}</0> als unvollständig markiert"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "hat Checklistenelement <0>{0}</0> als unvollständig markiert"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Mittlere Priorität"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Mitglied"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "monatliche Abrechnung"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "hat die Karte von <0>{0}</0> nach <1>{1}</1> verschoben"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "hat die Karte in eine andere Liste verschoben"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Nächste Schritte"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Keine {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "Für diesen Anhang ist keine Download-URL verfügbar."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Keine Tastaturkürzel registriert."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Keine Listen"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Es wurden noch keine Listen erstellt"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "Remote"
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Aus Favoriten entfernen"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Mitglied entfernen"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "{0} Labels entfernt: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "hat ein Label von der Karte entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "hat ein Mitglied von der Karte entfernt"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Aus Favoriten entfernt"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "hat Label <0>{0}</0> entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "hat den Fälligkeitstermin entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "hat eine Checkliste umbenannt"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "hat Checkliste <0>{0}</0> umbenannt"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "hat Checklistenelement in <0>{0}</0> umbenannt"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Selbst hosten"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Selbst hosten mit Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "hat sich selbst die Karte zugewiesen"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Senior"
|
||||
msgid "Set due date"
|
||||
msgstr "Fälligkeitsdatum festlegen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "hat den Fälligkeitstermin festgelegt"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "Berechtigungen können nicht zurückgesetzt werden"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Feedback konnte nicht gesendet werden"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Tafel konnte nicht aktualisiert werden"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Board-URL kann nicht aktualisiert werden"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "Berechtigungen können nicht aktualisiert werden"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Rolle kann nicht aktualisiert werden"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "hat <0>{0}</0> von der Karte entfernt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "hat sich selbst von der Karte entfernt"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Aktualisieren"
|
||||
msgid "Update label"
|
||||
msgstr "Label aktualisieren"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "hat ein Checklistenelement aktualisiert"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "hat die Beschreibung aktualisiert"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "hat den Fälligkeitstermin aktualisiert"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "hat den Titel aktualisiert"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "hat den Titel in <0>{0}</0> geändert"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "Warum ein open source Trello entwickeln?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Arbeitsbereich"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Sie können selbst hosten, indem sie den anweisungen in unserem <0>repo<
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} has been added to your favorites."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} has been removed from your favorites."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -147,39 +157,43 @@ msgstr "Add label"
|
||||
msgid "Add member"
|
||||
msgstr "Add member"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Add to favorites"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "added {0} labels: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "added a checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "added a checklist item"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "added a label to the card"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "added a member to the card"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "added checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "added checklist item <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "added label <0>{0}</0>"
|
||||
|
||||
@@ -187,6 +201,10 @@ msgstr "added label <0>{0}</0>"
|
||||
#~ msgid "added label <0>{label}</0>"
|
||||
#~ msgstr "added label <0>{label}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Added to favorites"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
@@ -314,8 +332,8 @@ msgstr "Are you sure you want to delete your account?"
|
||||
#~ msgid "around the world"
|
||||
#~ msgstr "around the world"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "assigned <0>{0}</0> to the card"
|
||||
|
||||
@@ -623,8 +641,8 @@ msgstr "Change Password"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Change your language preferences."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "changed the due date to <0>{formattedDate}</0>"
|
||||
|
||||
@@ -712,12 +730,12 @@ msgstr "Complete"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Complete control and ownership:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "completed a checklist item"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "completed checklist item <0>{0}</0>"
|
||||
|
||||
@@ -828,7 +846,7 @@ msgid "Create list"
|
||||
msgstr "Create list"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Create new {0}"
|
||||
@@ -847,7 +865,7 @@ msgid "Create new label"
|
||||
msgstr "Create new label"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Create new list"
|
||||
|
||||
@@ -864,7 +882,7 @@ msgstr "Create template"
|
||||
msgid "Create workspace"
|
||||
msgstr "Create workspace"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "created the card"
|
||||
|
||||
@@ -946,7 +964,7 @@ msgstr "Delete"
|
||||
msgid "Delete account"
|
||||
msgstr "Delete account"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Delete board"
|
||||
|
||||
@@ -962,7 +980,7 @@ msgstr "Delete comment"
|
||||
msgid "Delete list"
|
||||
msgstr "Delete list"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Delete template"
|
||||
|
||||
@@ -972,21 +990,21 @@ msgstr "Delete template"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Delete workspace"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "deleted a checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "deleted a checklist item"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "deleted checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "deleted checklist item <0>{0}</0>"
|
||||
|
||||
@@ -1082,7 +1100,7 @@ msgstr "Due tomorrow"
|
||||
msgid "Edit"
|
||||
msgstr "Edit"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Edit board URL"
|
||||
@@ -1378,7 +1396,7 @@ msgid "Get Started"
|
||||
msgstr "Get Started"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Get started by creating a new {0}"
|
||||
|
||||
@@ -1386,7 +1404,7 @@ msgstr "Get started by creating a new {0}"
|
||||
#~ msgid "Get started by creating a new board"
|
||||
#~ msgstr "Get started by creating a new board"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Get started by creating a new list"
|
||||
|
||||
@@ -1704,7 +1722,7 @@ msgstr "List name"
|
||||
msgid "Lists"
|
||||
msgstr "Lists"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Load more activities"
|
||||
|
||||
@@ -1712,7 +1730,7 @@ msgstr "Load more activities"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Loading permissions..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Loading..."
|
||||
|
||||
@@ -1740,16 +1758,16 @@ msgstr "Low Priority"
|
||||
msgid "magic link"
|
||||
msgstr "magic link"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Make template"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "marked a checklist item as incomplete"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "marked checklist item <0>{0}</0> as incomplete"
|
||||
|
||||
@@ -1757,6 +1775,8 @@ msgstr "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Medium Priority"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Member"
|
||||
@@ -1785,7 +1805,7 @@ msgstr "monthly billing"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
|
||||
@@ -1793,7 +1813,7 @@ msgstr "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
#~ msgid "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
#~ msgstr "moved the card from <0>{fromList}</0> to<1>{toList}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "moved the card to another list"
|
||||
|
||||
@@ -1887,7 +1907,7 @@ msgid "Next Steps"
|
||||
msgstr "Next Steps"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "No {0}"
|
||||
|
||||
@@ -1919,11 +1939,11 @@ msgstr "No download URL available for this attachment."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "No keyboard shortcuts registered."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "No lists"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "No lists have been created yet"
|
||||
|
||||
@@ -2098,6 +2118,7 @@ msgstr "Please select a file to upload."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2225,25 +2246,33 @@ msgstr "Remote"
|
||||
msgid "Remove"
|
||||
msgstr "Remove"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Remove from favorites"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Remove member"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "removed {0} labels: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "removed a label from the card"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "removed a member from the card"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Removed from favorites"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "removed label <0>{0}</0>"
|
||||
|
||||
@@ -2251,22 +2280,22 @@ msgstr "removed label <0>{0}</0>"
|
||||
#~ msgid "removed label <0>{label}</0>"
|
||||
#~ msgstr "removed label <0>{label}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "removed the due date"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "renamed a checklist"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "renamed checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "renamed checklist item to <0>{0}</0>"
|
||||
|
||||
@@ -2356,7 +2385,7 @@ msgstr "Self Host"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Self host with Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "self-assigned the card"
|
||||
|
||||
@@ -2380,7 +2409,7 @@ msgstr "Senior"
|
||||
msgid "Set due date"
|
||||
msgstr "Set due date"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "set the due date"
|
||||
|
||||
@@ -2760,6 +2789,10 @@ msgstr "Unable to reset permissions"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Unable to send feedback"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Unable to update board"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Unable to update board URL"
|
||||
@@ -2811,8 +2844,8 @@ msgstr "Unable to update permissions"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Unable to update role"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "unassigned <0>{0}</0> from the card"
|
||||
|
||||
@@ -2820,7 +2853,7 @@ msgstr "unassigned <0>{0}</0> from the card"
|
||||
#~ msgid "unassigned <0>{memberName}</0> from the card"
|
||||
#~ msgstr "unassigned <0>{memberName}</0> from the card"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "unassigned themselves from the card"
|
||||
|
||||
@@ -2879,24 +2912,24 @@ msgstr "Update"
|
||||
msgid "Update label"
|
||||
msgstr "Update label"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "updated a checklist item"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "updated the description"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "updated the due date"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "updated the title"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "updated the title to <0>{0}</0>"
|
||||
|
||||
@@ -3041,7 +3074,7 @@ msgstr "Why make an open source Trello?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Workspace"
|
||||
|
||||
@@ -3150,8 +3183,8 @@ msgstr "You can self-host by following the instructions in our <0>repo</0>."
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} se ha añadido a tus favoritos."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} se ha eliminado de tus favoritos."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Añadir etiqueta"
|
||||
msgid "Add member"
|
||||
msgstr "Añadir miembro"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Añadir a favoritos"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "añadió {0} etiquetas: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "añadió una lista de verificación"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "añadió un elemento a la lista de verificación"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "añadió una etiqueta a la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "añadió un miembro a la tarjeta"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "añadió la lista de verificación <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "añadió el elemento <0>{0}</0> a la lista de verificación"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "añadió la etiqueta <0>{0}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Añadido a favoritos"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Añadir un nuevo miembro costará {price} adicionales ({billingType}) por asiento."
|
||||
@@ -282,8 +300,8 @@ msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "asignó <0>{0}</0> a la tarjeta"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Cambiar contraseña"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Cambia tus preferencias de idioma."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "cambió la fecha de vencimiento a <0>{formattedDate}</0>"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Completado"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Control y propiedad completos:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "completó un elemento de la lista de verificación"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "completó el elemento <0>{0}</0> de la lista de verificación"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Crear lista"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Crear nuevo {0}"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Crear nueva etiqueta"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Crear nueva lista"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Crear plantilla"
|
||||
msgid "Create workspace"
|
||||
msgstr "Crear espacio de trabajo"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "creó la tarjeta"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Eliminar"
|
||||
msgid "Delete account"
|
||||
msgstr "Eliminar cuenta"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Eliminar tablero"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Eliminar comentario"
|
||||
msgid "Delete list"
|
||||
msgstr "Eliminar lista"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Eliminar plantilla"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Eliminar plantilla"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Eliminar espacio de trabajo"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "eliminó una lista de verificación"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "eliminó un elemento de la lista de verificación"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "eliminó la lista de verificación <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "eliminó el elemento <0>{0}</0> de la lista de verificación"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Vence mañana"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Editar URL del tablero"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Comenzar"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Comienza creando un nuevo {0}"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Comienza creando una nueva lista"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Nombre de la lista"
|
||||
msgid "Lists"
|
||||
msgstr "Listas"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Cargar más actividades"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Cargar más actividades"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Cargando permisos..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Cargando..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Prioridad baja"
|
||||
msgid "magic link"
|
||||
msgstr "enlace mágico"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Crear plantilla"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "marcó un elemento de la lista de verificación como incompleto"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "marcó el elemento <0>{0}</0> de la lista de verificación como incompleto"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "marcó el elemento <0>{0}</0> de la lista de verificación como incomple
|
||||
msgid "Medium Priority"
|
||||
msgstr "Prioridad media"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Miembro"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "facturación mensual"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "movió la tarjeta de <0>{0}</0> a<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "movió la tarjeta a otra lista"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Próximos pasos"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Sin {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "No hay URL de descarga disponible para este archivo adjunto."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "No hay atajos de teclado registrados."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Sin listas"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Aún no se han creado listas"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Por favor selecciona un archivo para subir."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "Remoto"
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Eliminar de favoritos"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Eliminar miembro"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "eliminó {0} etiquetas: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "eliminó una etiqueta de la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "eliminó un miembro de la tarjeta"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Eliminado de favoritos"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "eliminó la etiqueta <0>{0}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "eliminó la fecha de vencimiento"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "renombró una lista de verificación"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "renombró la lista de verificación <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "renombró el elemento de la lista de verificación a <0>{0}</0>"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Autoalojamiento"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Autoalojamiento con Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "se autoasignó la tarjeta"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Senior"
|
||||
msgid "Set due date"
|
||||
msgstr "Establecer fecha de vencimiento"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "estableció la fecha de vencimiento"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "No se pueden restablecer los permisos"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "No se pudieron enviar los comentarios"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "No se pudo actualizar el tablero"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "No se puede actualizar la URL del tablero"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "No se pueden actualizar los permisos"
|
||||
msgid "Unable to update role"
|
||||
msgstr "No se puede actualizar el rol"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "desasignó <0>{0}</0> de la tarjeta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "se desasignó de la tarjeta"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Actualizar"
|
||||
msgid "Update label"
|
||||
msgstr "Actualizar etiqueta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "actualizó un elemento de la lista de verificación"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "actualizó la descripción"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "actualizó la fecha de vencimiento"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "actualizó el título"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "actualizó el título a <0>{0}</0>"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "¿Por qué crear un Trello de código abierto?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Espacio de trabajo"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Puedes autoalojar siguiendo las instrucciones en nuestro <0>repositorio<
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} a été ajouté à vos favoris."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} a été retiré de vos favoris."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Ajouter une étiquette"
|
||||
msgid "Add member"
|
||||
msgstr "Ajouter un membre"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Ajouter aux favoris"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "a ajouté {0} étiquettes : <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "a ajouté une checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "a ajouté un élément à la checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "a ajouté une étiquette à la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "a ajouté un membre à la carte"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "a ajouté la checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "a ajouté l'élément <0>{0}</0> à la checklist"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "a ajouté l'étiquette <0>{0}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Ajouté aux favoris"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "L'ajout d'un nouveau membre coûtera {price} supplémentaires ({billingType}) par siège."
|
||||
@@ -282,8 +300,8 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "a assigné <0>{0}</0> à la carte"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Modifier le mot de passe"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Modifiez vos préférences linguistiques."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "a modifié la date d'échéance pour <0>{formattedDate}</0>"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Terminé"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Contrôle et propriété complets :"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "a terminé un élément de la checklist"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "a terminé l'élément <0>{0}</0> de la checklist"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Créer une liste"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Créer un nouveau {0}"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Créer une nouvelle étiquette"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Créer une nouvelle liste"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Créer un modèle"
|
||||
msgid "Create workspace"
|
||||
msgstr "Créer un espace de travail"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "a créé la carte"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Supprimer"
|
||||
msgid "Delete account"
|
||||
msgstr "Supprimer le compte"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Supprimer le tableau"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Supprimer le commentaire"
|
||||
msgid "Delete list"
|
||||
msgstr "Supprimer la liste"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Supprimer le modèle"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Supprimer le modèle"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Supprimer l'espace de travail"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "a supprimé une checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "a supprimé un élément de la checklist"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "a supprimé la checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "a supprimé l'élément <0>{0}</0> de la checklist"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Échéance demain"
|
||||
msgid "Edit"
|
||||
msgstr "Modifier"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Modifier l'URL du tableau"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Commencer"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Commencez par créer un nouveau {0}"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Commencez par créer une nouvelle liste"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Nom de la liste"
|
||||
msgid "Lists"
|
||||
msgstr "Listes"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Charger plus d'activités"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Charger plus d'activités"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Chargement des permissions..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Chargement..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Priorité basse"
|
||||
msgid "magic link"
|
||||
msgstr "lien magique"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Créer un modèle"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "a marqué un élément de la checklist comme incomplet"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "a marqué l'élément <0>{0}</0> de la checklist comme incomplet"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "a marqué l'élément <0>{0}</0> de la checklist comme incomplet"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Priorité moyenne"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Membre"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "facturation mensuelle"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "a déplacé la carte de <0>{0}</0> vers <1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "a déplacé la carte vers une autre liste"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Prochaines étapes"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Aucun {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "Aucune URL de téléchargement disponible pour cette pièce jointe."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Aucun raccourci clavier enregistré."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Aucune liste"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Aucune liste n'a encore été créée"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "À distance"
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Retirer des favoris"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Supprimer le membre"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "a supprimé {0} étiquettes : <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "a supprimé une étiquette de la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "a retiré un membre de la carte"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Retiré des favoris"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "a supprimé l'étiquette <0>{0}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "a supprimé la date d'échéance"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "a renommé une checklist"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "a renommé la checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "a renommé l'élément de la liste de contrôle en <0>{0}</0>"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Auto-hébergement"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Auto-hébergement avec Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "s'est auto-assigné la carte"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Senior"
|
||||
msgid "Set due date"
|
||||
msgstr "Définir la date d'échéance"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "a défini la date d'échéance"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "Impossible de réinitialiser les permissions"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Impossible d'envoyer les commentaires"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Impossible de mettre à jour le tableau"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Impossible de mettre à jour l'URL du tableau"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "Impossible de mettre à jour les permissions"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Impossible de mettre à jour le rôle"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "a désassigné <0>{0}</0> de la carte"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "s'est retiré de la carte"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Mettre à jour"
|
||||
msgid "Update label"
|
||||
msgstr "Mettre à jour l'étiquette"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "a mis à jour un élément de la liste de contrôle"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "a mis à jour la description"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "a mis à jour la date d'échéance"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "a mis à jour le titre"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "a mis à jour le titre en <0>{0}</0>"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "Pourquoi créer un Trello open source ?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Espace de travail"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Vous pouvez auto-héberger en suivant les instructions dans notre <0>dé
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} è stato aggiunto ai tuoi preferiti."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} è stato rimosso dai tuoi preferiti."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Aggiungi etichetta"
|
||||
msgid "Add member"
|
||||
msgstr "Aggiungi membro"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Aggiungi ai preferiti"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "ha aggiunto {0} etichette: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "ha aggiunto una checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "ha aggiunto un elemento alla checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "ha aggiunto un'etichetta alla carta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "ha aggiunto un membro alla carta"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "ha aggiunto la checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "ha aggiunto l'elemento <0>{0}</0> alla checklist"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "ha aggiunto l'etichetta <0>{0}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Aggiunto ai preferiti"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "L'aggiunta di un nuovo membro costerà un supplemento di {price} ({billingType}) per posto."
|
||||
@@ -282,8 +300,8 @@ msgstr "Sei sicuro di voler eliminare questa etichetta?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Sei sicuro di voler eliminare il tuo account?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "ha assegnato <0>{0}</0> alla scheda"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Cambia password"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Modifica le tue preferenze di lingua."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "ha cambiato la data di scadenza a <0>{formattedDate}</0>"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Completato"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Controllo e proprietà completi:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "ha completato un elemento della checklist"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "ha completato l'elemento <0>{0}</0> della checklist"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Crea lista"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Crea nuovo {0}"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Crea nuova etichetta"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Crea nuova lista"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Crea template"
|
||||
msgid "Create workspace"
|
||||
msgstr "Crea spazio di lavoro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "ha creato la carta"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Elimina"
|
||||
msgid "Delete account"
|
||||
msgstr "Elimina account"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Elimina bacheca"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Elimina commento"
|
||||
msgid "Delete list"
|
||||
msgstr "Elimina lista"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Elimina template"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Elimina template"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Elimina spazio di lavoro"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "ha eliminato una checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "ha eliminato un elemento della checklist"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "ha eliminato la checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "ha eliminato l'elemento <0>{0}</0> della checklist"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Scade domani"
|
||||
msgid "Edit"
|
||||
msgstr "Modifica"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Modifica URL della bacheca"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Inizia ora"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Inizia creando un nuovo {0}"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Inizia creando una nuova lista"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Nome lista"
|
||||
msgid "Lists"
|
||||
msgstr "Liste"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Carica altre attività"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Carica altre attività"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Caricamento permessi..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Caricamento in corso..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Bassa priorità"
|
||||
msgid "magic link"
|
||||
msgstr "link magico"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Crea template"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "ha segnato un elemento della checklist come incompleto"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "ha segnato l'elemento <0>{0}</0> della checklist come incompleto"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "ha segnato l'elemento <0>{0}</0> della checklist come incompleto"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Media priorità"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Membro"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "fatturazione mensile"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "ha spostato la scheda da <0>{0}</0> a<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "ha spostato la scheda in un'altra lista"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Prossimi passi"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Nessun {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "Nessun URL di download disponibile per questo allegato."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Nessuna scorciatoia da tastiera registrata."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Nessuna lista"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Nessuna lista è stata ancora creata"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Seleziona un file da caricare."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "Remoto"
|
||||
msgid "Remove"
|
||||
msgstr "Rimuovi"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Rimuovi dai preferiti"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Rimuovi membro"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "ha rimosso {0} etichette: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "ha rimosso un'etichetta dalla scheda"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "ha rimosso un membro dalla scheda"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Rimosso dai preferiti"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "ha rimosso l'etichetta <0>{0}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "ha rimosso la data di scadenza"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "ha rinominato una checklist"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "ha rinominato la checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "ha rinominato l'elemento della checklist in <0>{0}</0>"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Self Host"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Self host con Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "si è auto-assegnato la scheda"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Senior"
|
||||
msgid "Set due date"
|
||||
msgstr "Imposta data di scadenza"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "ha impostato la data di scadenza"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "Impossibile ripristinare i permessi"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Impossibile inviare feedback"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Impossibile aggiornare la bacheca"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Impossibile aggiornare l'URL della bacheca"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "Impossibile aggiornare i permessi"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Impossibile aggiornare il ruolo"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "ha rimosso l'assegnazione di <0>{0}</0> dalla scheda"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "si è rimosso dall'assegnazione della scheda"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Aggiorna"
|
||||
msgid "Update label"
|
||||
msgstr "Aggiorna etichetta"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "ha aggiornato un elemento della checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "ha aggiornato la descrizione"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "ha aggiornato la data di scadenza"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "ha aggiornato il titolo"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "ha aggiornato il titolo in <0>{0}</0>"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "Perché creare un Trello open source?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Spazio di lavoro"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Puoi effettuare il self-hosting seguendo le istruzioni nel nostro <0>rep
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} is toegevoegd aan je favorieten."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} is verwijderd uit je favorieten."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Label toevoegen"
|
||||
msgid "Add member"
|
||||
msgstr "Lid toevoegen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Toevoegen aan favorieten"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "{0} labels toegevoegd: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "heeft een checklist toegevoegd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "heeft een checklistitem toegevoegd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "heeft een label aan de kaart toegevoegd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "heeft een lid aan de kaart toegevoegd"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "heeft checklist <0>{0}</0> toegevoegd"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "heeft checklistitem <0>{0}</0> toegevoegd"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "heeft label <0>{0}</0> toegevoegd"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Toegevoegd aan favorieten"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Het toevoegen van een nieuw lid kost een extra {price} ({billingType}) per plaats."
|
||||
@@ -282,8 +300,8 @@ msgstr "Weet je zeker dat je dit label wilt verwijderen?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Weet je zeker dat je je account wilt verwijderen?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "heeft <0>{0}</0> aan de kaart toegewezen"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Wachtwoord wijzigen"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Wijzig je taalvoorkeuren."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "heeft de vervaldatum gewijzigd naar <0>{formattedDate}</0>"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Voltooid"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Volledige controle en eigendom:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "heeft een checklistitem voltooid"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "heeft checklistitem <0>{0}</0> voltooid"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Lijst maken"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Nieuwe {0} maken"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Maak nieuw label"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Maak nieuwe lijst"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Sjabloon maken"
|
||||
msgid "Create workspace"
|
||||
msgstr "Werkruimte maken"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "heeft de kaart aangemaakt"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Verwijderen"
|
||||
msgid "Delete account"
|
||||
msgstr "Account verwijderen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Board verwijderen"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Reactie verwijderen"
|
||||
msgid "Delete list"
|
||||
msgstr "Lijst verwijderen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Sjabloon verwijderen"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Sjabloon verwijderen"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Werkruimte verwijderen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "heeft een checklist verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "heeft een checklistitem verwijderd"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "heeft checklist <0>{0}</0> verwijderd"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "heeft checklistitem <0>{0}</0> verwijderd"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Vervalt morgen"
|
||||
msgid "Edit"
|
||||
msgstr "Bewerken"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Board URL bewerken"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Aan de slag"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Begin door een nieuwe {0} te maken"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Begin door een nieuwe lijst te maken"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Lijstnaam"
|
||||
msgid "Lists"
|
||||
msgstr "Lijsten"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Meer activiteiten laden"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Meer activiteiten laden"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Rechten laden..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Laden..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Lage prioriteit"
|
||||
msgid "magic link"
|
||||
msgstr "magische link"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Sjabloon maken"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "heeft een checklistitem als onvoltooid gemarkeerd"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "heeft checklistitem <0>{0}</0> als onvoltooid gemarkeerd"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "heeft checklistitem <0>{0}</0> als onvoltooid gemarkeerd"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Gemiddelde prioriteit"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Lid"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "maandelijkse facturering"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "heeft de kaart verplaatst van <0>{0}</0> naar<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "heeft de kaart naar een andere lijst verplaatst"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Volgende stappen"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Geen {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "Geen download-URL beschikbaar voor deze bijlage."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Geen sneltoetsen geregistreerd."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Geen lijsten"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Er zijn nog geen lijsten aangemaakt"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Selecteer een bestand om te uploaden."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "Op afstand"
|
||||
msgid "Remove"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Verwijderen uit favorieten"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Lid verwijderen"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "{0} labels verwijderd: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "heeft een label van de kaart verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "heeft een lid van de kaart verwijderd"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Verwijderd uit favorieten"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "heeft label <0>{0}</0> verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "heeft de vervaldatum verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "heeft een checklist hernoemd"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "heeft checklist <0>{0}</0> hernoemd"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "checklistitem hernoemd naar <0>{0}</0>"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Zelf hosten"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Zelf hosten met Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "heeft de kaart aan zichzelf toegewezen"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Senior"
|
||||
msgid "Set due date"
|
||||
msgstr "Vervaldatum instellen"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "heeft de vervaldatum ingesteld"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "Kan machtigingen niet resetten"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Feedback kon niet worden verzonden"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Kan bord niet bijwerken"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Kan board URL niet bijwerken"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "Kan machtigingen niet bijwerken"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Kan rol niet bijwerken"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "<0>{0}</0> van de kaart verwijderd"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "zichzelf van de kaart verwijderd"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Bijwerken"
|
||||
msgid "Update label"
|
||||
msgstr "Label bijwerken"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "een checklistitem bijgewerkt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "beschrijving bijgewerkt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "heeft de vervaldatum bijgewerkt"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "titel bijgewerkt"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "titel bijgewerkt naar <0>{0}</0>"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "Waarom een open source Trello maken?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Werkruimte"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Je kunt zelf hosten door de instructies in onze <0>repo</0> te volgen."
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -40,6 +40,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} zostało dodane do ulubionych."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} zostało usunięte z ulubionych."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -136,42 +146,50 @@ msgstr "Dodaj etykietę"
|
||||
msgid "Add member"
|
||||
msgstr "Dodaj członka"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Dodaj do ulubionych"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "dodano {0} etykiety: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "dodał listę kontrolną"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "dodał(a) element listy kontrolnej"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "dodał(a) etykietę do karty"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "dodał(a) członka do karty"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "dodał(a) listę kontrolną <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "dodał(a) element listy kontrolnej <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "dodał(a) etykietę <0>{0}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Dodano do ulubionych"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Dodanie nowego członka będzie kosztować dodatkowe {price} ({billingType}) za miejsce."
|
||||
@@ -287,8 +305,8 @@ msgstr "Czy na pewno chcesz usunąć tę etykietę?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Czy na pewno chcesz usunąć swoje konto?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "przypisano <0>{0}</0> do karty"
|
||||
|
||||
@@ -567,8 +585,8 @@ msgstr "Zmień hasło"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Zmień swoje preferencje językowe."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "zmieniono termin na <0>{formattedDate}</0>"
|
||||
|
||||
@@ -656,12 +674,12 @@ msgstr "Zakończ"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Pełna kontrola i własność:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "ukończono element listy kontrolnej"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "ukończono element listy kontrolnej <0>{0}</0>"
|
||||
|
||||
@@ -760,7 +778,7 @@ msgid "Create list"
|
||||
msgstr "Utwórz listę"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Utwórz nowy {0}"
|
||||
@@ -775,7 +793,7 @@ msgid "Create new label"
|
||||
msgstr "Utwórz nową etykietę"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Utwórz nową listę"
|
||||
|
||||
@@ -788,7 +806,7 @@ msgstr "Utwórz szablon"
|
||||
msgid "Create workspace"
|
||||
msgstr "Utwórz przestrzeń roboczą"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "utworzył(a) kartę"
|
||||
|
||||
@@ -862,7 +880,7 @@ msgstr "Usuń"
|
||||
msgid "Delete account"
|
||||
msgstr "Usuń konto"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Usuń tablicę"
|
||||
|
||||
@@ -878,7 +896,7 @@ msgstr "Usuń komentarz"
|
||||
msgid "Delete list"
|
||||
msgstr "Usuń listę"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Usuń szablon"
|
||||
|
||||
@@ -888,21 +906,21 @@ msgstr "Usuń szablon"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Usuń przestrzeń roboczą"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "usunięto listę kontrolną"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "usunięto element listy kontrolnej"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "usunięto listę kontrolną <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "usunięto element listy kontrolnej <0>{0}</0>"
|
||||
|
||||
@@ -998,7 +1016,7 @@ msgstr "Termin na jutro"
|
||||
msgid "Edit"
|
||||
msgstr "Edytuj"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Edytuj URL tablicy"
|
||||
@@ -1286,11 +1304,11 @@ msgid "Get Started"
|
||||
msgstr "Rozpocznij"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Rozpocznij, tworząc nowy {0}"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Rozpocznij, tworząc nową listę"
|
||||
|
||||
@@ -1600,7 +1618,7 @@ msgstr "Nazwa listy"
|
||||
msgid "Lists"
|
||||
msgstr "Listy"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Załaduj więcej aktywności"
|
||||
|
||||
@@ -1608,7 +1626,7 @@ msgstr "Załaduj więcej aktywności"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Ładowanie uprawnień..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Ładowanie..."
|
||||
|
||||
@@ -1636,16 +1654,16 @@ msgstr "Niski priorytet"
|
||||
msgid "magic link"
|
||||
msgstr "magiczny link"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Utwórz szablon"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "oznaczył element listy kontrolnej jako nieukończony"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "oznaczył element listy kontrolnej <0>{0}</0> jako nieukończony"
|
||||
|
||||
@@ -1653,6 +1671,8 @@ msgstr "oznaczył element listy kontrolnej <0>{0}</0> jako nieukończony"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Średni priorytet"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Członek"
|
||||
@@ -1681,11 +1701,11 @@ msgstr "rozliczenie miesięczne"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "przeniesiono kartę z <0>{0}</0> do<1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "przeniesiono kartę do innej listy"
|
||||
|
||||
@@ -1767,7 +1787,7 @@ msgid "Next Steps"
|
||||
msgstr "Następne kroki"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Brak {0}"
|
||||
|
||||
@@ -1795,11 +1815,11 @@ msgstr "Brak dostępnego URL do pobrania tego załącznika."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Brak zarejestrowanych skrótów klawiaturowych."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Brak list"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Nie utworzono jeszcze żadnych list"
|
||||
|
||||
@@ -1974,6 +1994,7 @@ msgstr "Proszę wybrać plik do przesłania."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2101,44 +2122,52 @@ msgstr "Zdalne"
|
||||
msgid "Remove"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Usuń z ulubionych"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Usuń członka"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "usunięto {0} etykiety: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "usunął etykietę z karty"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "usunął członka z karty"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Usunięto z ulubionych"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "usunięto etykietę <0>{0}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "usunięto termin"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "zmieniono nazwę listy kontrolnej"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "zmieniono nazwę listy kontrolnej <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "zmieniono nazwę elementu listy kontrolnej na <0>{0}</0>"
|
||||
|
||||
@@ -2224,7 +2253,7 @@ msgstr "Hostuj samodzielnie"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Hostuj samodzielnie z Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "przypisał(a) sobie kartę"
|
||||
|
||||
@@ -2244,7 +2273,7 @@ msgstr "Starszy"
|
||||
msgid "Set due date"
|
||||
msgstr "Ustaw termin"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "ustawiono termin"
|
||||
|
||||
@@ -2608,6 +2637,10 @@ msgstr "Nie można zresetować uprawnień"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Nie można wysłać opinii"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Nie można zaktualizować tablicy"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Nie można zaktualizować adresu URL tablicy"
|
||||
@@ -2659,12 +2692,12 @@ msgstr "Nie można zaktualizować uprawnień"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Nie można zaktualizować roli"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "usunięto przypisanie <0>{0}</0> z karty"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "usunęli swoje przypisanie z karty"
|
||||
|
||||
@@ -2723,24 +2756,24 @@ msgstr "Aktualizuj"
|
||||
msgid "Update label"
|
||||
msgstr "Zaktualizuj etykietę"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "zaktualizowano element listy kontrolnej"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "zaktualizowano opis"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "zaktualizowano termin"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "zaktualizowano tytuł"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "zaktualizowano tytuł na <0>{0}</0>"
|
||||
|
||||
@@ -2865,7 +2898,7 @@ msgstr "Dlaczego próbujecie stworzyć Trello w wersji otwartoźródłowej?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Obszar roboczy"
|
||||
|
||||
@@ -2970,8 +3003,8 @@ msgstr "Możesz hostować samodzielnie, postępując zgodnie z instrukcjami w na
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} foi adicionado aos seus favoritos."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} foi removido dos seus favoritos."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Adicionar etiqueta"
|
||||
msgid "Add member"
|
||||
msgstr "Adicionar membro"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Adicionar aos favoritos"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "adicionou {0} etiquetas: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "adicionou uma lista de verificação"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "adicionou um item da lista de verificação"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "adicionou uma etiqueta ao cartão"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "adicionou um membro ao cartão"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "adicionou a lista de verificação <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "adicionou o item da lista de verificação <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "adicionou a etiqueta <0>{0}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Adicionado aos favoritos"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Adicionar um novo membro custará {price} ({billingType}) adicionais por assento."
|
||||
@@ -282,8 +300,8 @@ msgstr "Tem certeza de que deseja excluir esta etiqueta?"
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Tem certeza de que deseja excluir sua conta?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "atribuiu <0>{0}</0> ao card"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Alterar senha"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Altere suas preferências de idioma."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "alterou a data de vencimento para <0>{formattedDate}</0>"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Concluir"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Controle e propriedade completos:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "concluiu um item da lista de verificação"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "concluiu o item da lista de verificação <0>{0}</0>"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Criar lista"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Criar novo {0}"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Criar nova etiqueta"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Criar nova lista"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Criar modelo"
|
||||
msgid "Create workspace"
|
||||
msgstr "Criar workspace"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "criou o cartão"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Excluir"
|
||||
msgid "Delete account"
|
||||
msgstr "Excluir conta"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Excluir quadro"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Excluir comentário"
|
||||
msgid "Delete list"
|
||||
msgstr "Excluir lista"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Excluir modelo"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Excluir modelo"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Excluir workspace"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "excluiu uma checklist"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "excluiu um item da checklist"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "excluiu a checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "excluiu o item da checklist <0>{0}</0>"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Vence amanhã"
|
||||
msgid "Edit"
|
||||
msgstr "Editar"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Editar URL do quadro"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Começar"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Comece criando um novo {0}"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Comece criando uma nova lista"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Nome da lista"
|
||||
msgid "Lists"
|
||||
msgstr "Listas"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Carregar mais atividades"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Carregar mais atividades"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Carregando permissões..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Carregando..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Prioridade baixa"
|
||||
msgid "magic link"
|
||||
msgstr "link mágico"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Criar modelo"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "marcou um item da checklist como incompleto"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "marcou o item da checklist <0>{0}</0> como incompleto"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "marcou o item da checklist <0>{0}</0> como incompleto"
|
||||
msgid "Medium Priority"
|
||||
msgstr "Prioridade média"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Membro"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "cobrança mensal"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "moveu o card de <0>{0}</0> para <1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "moveu o card para outra lista"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Próximos passos"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Nenhum {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "Nenhuma URL de download disponível para este anexo."
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Nenhum atalho de teclado registrado."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Nenhuma lista"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Nenhuma lista foi criada ainda"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Por favor, selecione um arquivo para fazer upload."
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "Remoto"
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Remover dos favoritos"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Remover membro"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "removeu {0} etiquetas: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "removeu uma etiqueta do cartão"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "removeu um membro do cartão"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Removido dos favoritos"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "removeu a etiqueta <0>{0}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "removeu a data de vencimento"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "renomeou uma lista de verificação"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "renomeou a checklist <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "renomeou o item da checklist para <0>{0}</0>"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Auto-hospedagem"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Auto-hospede com Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "atribuiu o cartão a si mesmo"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Sênior"
|
||||
msgid "Set due date"
|
||||
msgstr "Definir data de vencimento"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "definiu a data de vencimento"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "Não foi possível redefinir as permissões"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Não foi possível enviar feedback"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Não foi possível atualizar o quadro"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Não foi possível atualizar URL do quadro"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "Não foi possível atualizar as permissões"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Não foi possível atualizar a função"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "removeu a atribuição de <0>{0}</0> do cartão"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "removeu a própria atribuição do cartão"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Atualizar"
|
||||
msgid "Update label"
|
||||
msgstr "Atualizar rótulo"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "atualizou um item da lista de verificação"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "atualizou a descrição"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "atualizou a data de vencimento"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "atualizou o título"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "atualizou o título para <0>{0}</0>"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "Por que criar um Trello de código aberto?"
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Workspace"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Você pode fazer self-host seguindo as instruções em nosso <0>reposit
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -35,6 +35,16 @@ msgstr "{0}"
|
||||
msgid "{0} | {1}"
|
||||
msgstr "{0} | {1}"
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:54
|
||||
msgid "{0} has been added to your favorites."
|
||||
msgstr "{0} добавлено в избранное."
|
||||
|
||||
#. placeholder {0}: boardName ?? "Board"
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
msgid "{0} has been removed from your favorites."
|
||||
msgstr "{0} удалено из избранного."
|
||||
|
||||
#. placeholder {0}: labelPublicIds.length
|
||||
#: src/views/board/components/NewCardForm.tsx:453
|
||||
msgid "{0} labels"
|
||||
@@ -131,42 +141,50 @@ msgstr "Добавить метку"
|
||||
msgid "Add member"
|
||||
msgstr "Добавить участника"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:93
|
||||
msgid "Add to favorites"
|
||||
msgstr "Добавить в избранное"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:78
|
||||
#: src/views/card/components/ActivityList.tsx:89
|
||||
msgid "added {0} labels: <0>{labelList}</0>"
|
||||
msgstr "добавил {0} метки: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:108
|
||||
#: src/views/card/components/ActivityList.tsx:119
|
||||
msgid "added a checklist"
|
||||
msgstr "добавил(а) чек-лист"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
#: src/views/card/components/ActivityList.tsx:122
|
||||
msgid "added a checklist item"
|
||||
msgstr "добавил(а) элемент чек-листа"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:104
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
msgid "added a label to the card"
|
||||
msgstr "добавил(а) метку к карточке"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:106
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
msgid "added a member to the card"
|
||||
msgstr "добавил(а) участника к карточке"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:182
|
||||
#: src/views/card/components/ActivityList.tsx:193
|
||||
msgid "added checklist <0>{0}</0>"
|
||||
msgstr "добавлен контрольный список <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:206
|
||||
#: src/views/card/components/ActivityList.tsx:217
|
||||
msgid "added checklist item <0>{0}</0>"
|
||||
msgstr "добавлен элемент контрольного списка <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:166
|
||||
#: src/views/card/components/ActivityList.tsx:177
|
||||
msgid "added label <0>{0}</0>"
|
||||
msgstr "добавлена метка <0>{0}</0>"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:51
|
||||
msgid "Added to favorites"
|
||||
msgstr "Добавлено в избранное"
|
||||
|
||||
#: src/views/members/components/InviteMemberForm.tsx:327
|
||||
msgid "Adding a new member will cost an additional {price} ({billingType}) per seat."
|
||||
msgstr "Добавление нового участника будет стоить дополнительно {price} ({billingType}) за место."
|
||||
@@ -282,8 +300,8 @@ msgstr "Вы уверены, что хотите удалить эту метк
|
||||
msgid "Are you sure you want to delete your account?"
|
||||
msgstr "Вы уверены, что хотите удалить свой аккаунт?"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:146
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
msgid "assigned <0>{0}</0> to the card"
|
||||
msgstr "назначено <0>{0}</0> к карточке"
|
||||
|
||||
@@ -562,8 +580,8 @@ msgstr "Изменить пароль"
|
||||
msgid "Change your language preferences."
|
||||
msgstr "Измените настройки языка."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:256
|
||||
#: src/views/card/components/ActivityList.tsx:270
|
||||
#: src/views/card/components/ActivityList.tsx:267
|
||||
#: src/views/card/components/ActivityList.tsx:281
|
||||
msgid "changed the due date to <0>{formattedDate}</0>"
|
||||
msgstr "изменил(а) дату выполнения на <0>{formattedDate}</0>"
|
||||
|
||||
@@ -651,12 +669,12 @@ msgstr "Завершить"
|
||||
msgid "Complete control and ownership:"
|
||||
msgstr "Полный контроль и владение:"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
#: src/views/card/components/ActivityList.tsx:124
|
||||
msgid "completed a checklist item"
|
||||
msgstr "завершил элемент контрольного списка"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:223
|
||||
#: src/views/card/components/ActivityList.tsx:234
|
||||
msgid "completed checklist item <0>{0}</0>"
|
||||
msgstr "завершил элемент контрольного списка <0>{0}</0>"
|
||||
|
||||
@@ -755,7 +773,7 @@ msgid "Create list"
|
||||
msgstr "Создать список"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:58
|
||||
#: src/views/boards/components/BoardsList.tsx:79
|
||||
#: src/views/boards/index.tsx:28
|
||||
msgid "Create new {0}"
|
||||
msgstr "Создать новый {0}"
|
||||
@@ -770,7 +788,7 @@ msgid "Create new label"
|
||||
msgstr "Создать новую метку"
|
||||
|
||||
#: src/views/board/index.tsx:74
|
||||
#: src/views/board/index.tsx:537
|
||||
#: src/views/board/index.tsx:539
|
||||
msgid "Create new list"
|
||||
msgstr "Создать новый список"
|
||||
|
||||
@@ -783,7 +801,7 @@ msgstr "Создать шаблон"
|
||||
msgid "Create workspace"
|
||||
msgstr "Создать рабочее пространство"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:100
|
||||
#: src/views/card/components/ActivityList.tsx:111
|
||||
msgid "created the card"
|
||||
msgstr "создал(а) карточку"
|
||||
|
||||
@@ -857,7 +875,7 @@ msgstr "Удалить"
|
||||
msgid "Delete account"
|
||||
msgstr "Удалить аккаунт"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete board"
|
||||
msgstr "Удалить доску"
|
||||
|
||||
@@ -873,7 +891,7 @@ msgstr "Удалить комментарий"
|
||||
msgid "Delete list"
|
||||
msgstr "Удалить список"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:55
|
||||
#: src/views/board/components/BoardDropdown.tsx:104
|
||||
msgid "Delete template"
|
||||
msgstr "Удалить шаблон"
|
||||
|
||||
@@ -883,21 +901,21 @@ msgstr "Удалить шаблон"
|
||||
msgid "Delete workspace"
|
||||
msgstr "Удалить рабочее пространство"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:110
|
||||
#: src/views/card/components/ActivityList.tsx:121
|
||||
msgid "deleted a checklist"
|
||||
msgstr "удалил контрольный список"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:115
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
msgid "deleted a checklist item"
|
||||
msgstr "удалил элемент контрольного списка"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:198
|
||||
#: src/views/card/components/ActivityList.tsx:209
|
||||
msgid "deleted checklist <0>{0}</0>"
|
||||
msgstr "удалил контрольный список <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(fromTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:241
|
||||
#: src/views/card/components/ActivityList.tsx:252
|
||||
msgid "deleted checklist item <0>{0}</0>"
|
||||
msgstr "удалил элемент контрольного списка <0>{0}</0>"
|
||||
|
||||
@@ -993,7 +1011,7 @@ msgstr "Срок завтра"
|
||||
msgid "Edit"
|
||||
msgstr "Редактировать"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:44
|
||||
#: src/views/board/components/BoardDropdown.tsx:84
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
|
||||
msgid "Edit board URL"
|
||||
msgstr "Изменить URL доски"
|
||||
@@ -1281,11 +1299,11 @@ msgid "Get Started"
|
||||
msgstr "Начать"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "template" : "board"
|
||||
#: src/views/boards/components/BoardsList.tsx:44
|
||||
#: src/views/boards/components/BoardsList.tsx:65
|
||||
msgid "Get started by creating a new {0}"
|
||||
msgstr "Начните с создания нового {0}"
|
||||
|
||||
#: src/views/board/index.tsx:522
|
||||
#: src/views/board/index.tsx:524
|
||||
msgid "Get started by creating a new list"
|
||||
msgstr "Начните с создания нового списка"
|
||||
|
||||
@@ -1595,7 +1613,7 @@ msgstr "Название списка"
|
||||
msgid "Lists"
|
||||
msgstr "Списки"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Load more activities"
|
||||
msgstr "Загрузить больше действий"
|
||||
|
||||
@@ -1603,7 +1621,7 @@ msgstr "Загрузить больше действий"
|
||||
msgid "Loading permissions..."
|
||||
msgstr "Загрузка разрешений..."
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:533
|
||||
#: src/views/card/components/ActivityList.tsx:545
|
||||
msgid "Loading..."
|
||||
msgstr "Загрузка..."
|
||||
|
||||
@@ -1631,16 +1649,16 @@ msgstr "Низкий приоритет"
|
||||
msgid "magic link"
|
||||
msgstr "магическая ссылка"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:34
|
||||
#: src/views/board/components/BoardDropdown.tsx:73
|
||||
msgid "Make template"
|
||||
msgstr "Создать шаблон"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
#: src/views/card/components/ActivityList.tsx:125
|
||||
msgid "marked a checklist item as incomplete"
|
||||
msgstr "отметил элемент контрольного списка как незавершённый"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:232
|
||||
#: src/views/card/components/ActivityList.tsx:243
|
||||
msgid "marked checklist item <0>{0}</0> as incomplete"
|
||||
msgstr "отметил элемент контрольного списка <0>{0}</0> как незавершённый"
|
||||
|
||||
@@ -1648,6 +1666,8 @@ msgstr "отметил элемент контрольного списка <0>{
|
||||
msgid "Medium Priority"
|
||||
msgstr "Средний приоритет"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:44
|
||||
#: src/views/card/components/ActivityList.tsx:75
|
||||
#: src/views/members/index.tsx:201
|
||||
msgid "Member"
|
||||
msgstr "Участник"
|
||||
@@ -1676,11 +1696,11 @@ msgstr "ежемесячная оплата"
|
||||
|
||||
#. placeholder {0}: truncate(fromList)
|
||||
#. placeholder {1}: truncate(toList)
|
||||
#: src/views/card/components/ActivityList.tsx:134
|
||||
#: src/views/card/components/ActivityList.tsx:145
|
||||
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
|
||||
msgstr "переместил карточку из <0>{0}</0> в <1>{1}</1>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
#: src/views/card/components/ActivityList.tsx:114
|
||||
msgid "moved the card to another list"
|
||||
msgstr "переместил карточку в другой список"
|
||||
|
||||
@@ -1762,7 +1782,7 @@ msgid "Next Steps"
|
||||
msgstr "Следующие шаги"
|
||||
|
||||
#. placeholder {0}: isTemplate ? "templates" : "boards"
|
||||
#: src/views/boards/components/BoardsList.tsx:41
|
||||
#: src/views/boards/components/BoardsList.tsx:62
|
||||
msgid "No {0}"
|
||||
msgstr "Нет {0}"
|
||||
|
||||
@@ -1790,11 +1810,11 @@ msgstr "URL для загрузки этого вложения недоступ
|
||||
msgid "No keyboard shortcuts registered."
|
||||
msgstr "Горячие клавиши не зарегистрированы."
|
||||
|
||||
#: src/views/board/index.tsx:518
|
||||
#: src/views/board/index.tsx:520
|
||||
msgid "No lists"
|
||||
msgstr "Нет списков"
|
||||
|
||||
#: src/views/board/index.tsx:523
|
||||
#: src/views/board/index.tsx:525
|
||||
msgid "No lists have been created yet"
|
||||
msgstr "Списки ещё не созданы"
|
||||
|
||||
@@ -1969,6 +1989,7 @@ msgstr "Пожалуйста, выберите файл для загрузки.
|
||||
#: src/components/DeleteLabelConfirmation.tsx:26
|
||||
#: src/components/FeedbackModal.tsx:41
|
||||
#: src/components/NewWorkspaceForm.tsx:158
|
||||
#: src/views/board/components/BoardDropdown.tsx:63
|
||||
#: src/views/board/components/NewCardForm.tsx:184
|
||||
#: src/views/board/components/NewListForm.tsx:79
|
||||
#: src/views/board/components/NewTemplateForm.tsx:61
|
||||
@@ -2096,44 +2117,52 @@ msgstr "Удалённый"
|
||||
msgid "Remove"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:92
|
||||
msgid "Remove from favorites"
|
||||
msgstr "Удалить из избранного"
|
||||
|
||||
#: src/views/members/index.tsx:232
|
||||
msgid "Remove member"
|
||||
msgstr "Удалить участника"
|
||||
|
||||
#. placeholder {0}: mergedLabels.length
|
||||
#: src/views/card/components/ActivityList.tsx:92
|
||||
#: src/views/card/components/ActivityList.tsx:103
|
||||
msgid "removed {0} labels: <0>{labelList}</0>"
|
||||
msgstr "удалил {0} метки: <0>{labelList}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:105
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
msgid "removed a label from the card"
|
||||
msgstr "удалил метку с карточки"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:107
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
msgid "removed a member from the card"
|
||||
msgstr "удалил участника из карточки"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:52
|
||||
msgid "Removed from favorites"
|
||||
msgstr "Удалено из избранного"
|
||||
|
||||
#. placeholder {0}: truncate(label)
|
||||
#: src/views/card/components/ActivityList.tsx:174
|
||||
#: src/views/card/components/ActivityList.tsx:185
|
||||
msgid "removed label <0>{0}</0>"
|
||||
msgstr "удалил метку <0>{0}</0>"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:118
|
||||
#: src/views/card/components/ActivityList.tsx:277
|
||||
#: src/views/card/components/ActivityList.tsx:129
|
||||
#: src/views/card/components/ActivityList.tsx:288
|
||||
msgid "removed the due date"
|
||||
msgstr "удалил(а) дату выполнения"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:109
|
||||
#: src/views/card/components/ActivityList.tsx:120
|
||||
msgid "renamed a checklist"
|
||||
msgstr "переименовал контрольный список"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:190
|
||||
#: src/views/card/components/ActivityList.tsx:201
|
||||
msgid "renamed checklist <0>{0}</0>"
|
||||
msgstr "переименовал контрольный список <0>{0}</0>"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:214
|
||||
#: src/views/card/components/ActivityList.tsx:225
|
||||
msgid "renamed checklist item to <0>{0}</0>"
|
||||
msgstr "переименовал элемент контрольного списка в <0>{0}</0>"
|
||||
|
||||
@@ -2219,7 +2248,7 @@ msgstr "Самостоятельный хостинг"
|
||||
msgid "Self host with Github"
|
||||
msgstr "Самостоятельный хостинг с Github"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:143
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
msgid "self-assigned the card"
|
||||
msgstr "самостоятельно назначил карточку"
|
||||
|
||||
@@ -2239,7 +2268,7 @@ msgstr "Старший"
|
||||
msgid "Set due date"
|
||||
msgstr "Установить дату выполнения"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:116
|
||||
#: src/views/card/components/ActivityList.tsx:127
|
||||
msgid "set the due date"
|
||||
msgstr "установил(а) дату выполнения"
|
||||
|
||||
@@ -2603,6 +2632,10 @@ msgstr "Не удалось сбросить разрешения"
|
||||
msgid "Unable to send feedback"
|
||||
msgstr "Не удалось отправить отзыв"
|
||||
|
||||
#: src/views/board/components/BoardDropdown.tsx:62
|
||||
msgid "Unable to update board"
|
||||
msgstr "Не удалось обновить доску"
|
||||
|
||||
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
|
||||
msgid "Unable to update board URL"
|
||||
msgstr "Не удалось обновить URL доски"
|
||||
@@ -2654,12 +2687,12 @@ msgstr "Не удалось обновить разрешения"
|
||||
msgid "Unable to update role"
|
||||
msgstr "Не удалось обновить роль"
|
||||
|
||||
#. placeholder {0}: truncate(memberName)
|
||||
#: src/views/card/components/ActivityList.tsx:157
|
||||
#. placeholder {0}: truncate(displayName)
|
||||
#: src/views/card/components/ActivityList.tsx:168
|
||||
msgid "unassigned <0>{0}</0> from the card"
|
||||
msgstr "удалил(а) <0>{0}</0> из карточки"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:154
|
||||
#: src/views/card/components/ActivityList.tsx:165
|
||||
msgid "unassigned themselves from the card"
|
||||
msgstr "удалил(а) себя из карточки"
|
||||
|
||||
@@ -2718,24 +2751,24 @@ msgstr "Обновить"
|
||||
msgid "Update label"
|
||||
msgstr "Обновить метку"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
#: src/views/card/components/ActivityList.tsx:123
|
||||
msgid "updated a checklist item"
|
||||
msgstr "обновлен элемент контрольного списка"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:102
|
||||
#: src/views/card/components/ActivityList.tsx:113
|
||||
msgid "updated the description"
|
||||
msgstr "обновлено описание"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:117
|
||||
#: src/views/card/components/ActivityList.tsx:128
|
||||
msgid "updated the due date"
|
||||
msgstr "обновил(а) дату выполнения"
|
||||
|
||||
#: src/views/card/components/ActivityList.tsx:101
|
||||
#: src/views/card/components/ActivityList.tsx:112
|
||||
msgid "updated the title"
|
||||
msgstr "обновлен заголовок"
|
||||
|
||||
#. placeholder {0}: truncate(toTitle)
|
||||
#: src/views/card/components/ActivityList.tsx:126
|
||||
#: src/views/card/components/ActivityList.tsx:137
|
||||
msgid "updated the title to <0>{0}</0>"
|
||||
msgstr "обновлен заголовок на <0>{0}</0>"
|
||||
|
||||
@@ -2860,7 +2893,7 @@ msgstr "Зачем создавать Trello с открытым исходны
|
||||
#: src/views/boards/index.tsx:35
|
||||
#: src/views/members/index.tsx:257
|
||||
#: src/views/public/board/index.tsx:120
|
||||
#: src/views/public/boards/index.tsx:66
|
||||
#: src/views/public/boards/index.tsx:65
|
||||
msgid "Workspace"
|
||||
msgstr "Рабочее пространство"
|
||||
|
||||
@@ -2965,8 +2998,8 @@ msgstr "Вы можете развернуть собственный хости
|
||||
#: src/views/board/components/UpdateBoardSlugButton.tsx:31
|
||||
#: src/views/board/components/VisibilityButton.tsx:72
|
||||
#: src/views/board/index.tsx:472
|
||||
#: src/views/board/index.tsx:528
|
||||
#: src/views/boards/components/BoardsList.tsx:49
|
||||
#: src/views/board/index.tsx:530
|
||||
#: src/views/boards/components/BoardsList.tsx:70
|
||||
#: src/views/boards/index.tsx:46
|
||||
#: src/views/boards/index.tsx:67
|
||||
msgid "You don't have permission"
|
||||
|
||||
File diff suppressed because one or more lines are too long
131
apps/web/src/pages/api/upload/attachment.ts
Normal file
131
apps/web/src/pages/api/upload/attachment.ts
Normal file
@@ -0,0 +1,131 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { Upload } from "@aws-sdk/lib-storage";
|
||||
|
||||
import { createNextApiContext } from "@kan/api/trpc";
|
||||
import * as cardRepo from "@kan/db/repository/card.repo";
|
||||
import * as cardActivityRepo from "@kan/db/repository/cardActivity.repo";
|
||||
import * as cardAttachmentRepo from "@kan/db/repository/cardAttachment.repo";
|
||||
import { generateUID } from "@kan/shared/utils";
|
||||
|
||||
import { env } from "~/env";
|
||||
import { withRateLimit } from "@kan/api/utils/rateLimit";
|
||||
import { createS3Client } from "@kan/shared/utils";
|
||||
import { assertPermission } from "@kan/api/utils/permissions";
|
||||
|
||||
const MAX_SIZE_BYTES = 50 * 1024 * 1024; // 50MB
|
||||
|
||||
export const config = {
|
||||
api: {
|
||||
bodyParser: false,
|
||||
},
|
||||
};
|
||||
|
||||
export default withRateLimit(
|
||||
{ points: 100, duration: 60 },
|
||||
async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({ error: "Method not allowed" });
|
||||
}
|
||||
|
||||
try {
|
||||
const { user, db } = await createNextApiContext(req);
|
||||
|
||||
if (!user) {
|
||||
return res.status(401).json({ error: "Unauthorized" });
|
||||
}
|
||||
|
||||
const bucket = env.NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME;
|
||||
if (!bucket) {
|
||||
return res.status(500).json({ error: "Attachments bucket not configured" });
|
||||
}
|
||||
|
||||
const cardPublicId = req.query.cardPublicId;
|
||||
if (typeof cardPublicId !== "string" || cardPublicId.length < 12) {
|
||||
return res.status(400).json({ error: "Invalid cardPublicId" });
|
||||
}
|
||||
|
||||
const contentType = req.headers["content-type"];
|
||||
const contentLengthHeader = req.headers["content-length"];
|
||||
const contentLength = contentLengthHeader
|
||||
? Number.parseInt(contentLengthHeader, 10)
|
||||
: NaN;
|
||||
|
||||
if (typeof contentType !== "string") {
|
||||
return res.status(400).json({ error: "Missing content type" });
|
||||
}
|
||||
|
||||
if (!Number.isFinite(contentLength) || contentLength <= 0) {
|
||||
return res.status(400).json({ error: "Missing or invalid content length" });
|
||||
}
|
||||
|
||||
if (contentLength > MAX_SIZE_BYTES) {
|
||||
return res.status(400).json({ error: "File too large" });
|
||||
}
|
||||
|
||||
const originalFilenameHeader =
|
||||
(req.headers["x-original-filename"] as string | undefined) ?? "file";
|
||||
|
||||
const sanitizedFilename = originalFilenameHeader
|
||||
.replace(/[^a-zA-Z0-9._-]/g, "_")
|
||||
.substring(0, 200);
|
||||
|
||||
// Get card and check permissions
|
||||
const card = await cardRepo.getWorkspaceAndCardIdByCardPublicId(
|
||||
db,
|
||||
cardPublicId,
|
||||
);
|
||||
|
||||
if (!card) {
|
||||
return res.status(404).json({ error: "Card not found" });
|
||||
}
|
||||
|
||||
// Check if user has permission to edit the card
|
||||
try {
|
||||
await assertPermission(db, user.id, card.workspaceId, "card:edit");
|
||||
} catch {
|
||||
return res.status(403).json({ error: "Permission denied" });
|
||||
}
|
||||
|
||||
const s3Key = `${card.workspaceId}/${cardPublicId}/${generateUID()}-${sanitizedFilename}`;
|
||||
|
||||
const client = createS3Client();
|
||||
|
||||
const upload = new Upload({
|
||||
client,
|
||||
params: {
|
||||
Bucket: bucket,
|
||||
Key: s3Key,
|
||||
Body: req,
|
||||
ContentType: contentType,
|
||||
ContentLength: contentLength,
|
||||
},
|
||||
leavePartsOnError: false,
|
||||
});
|
||||
|
||||
await upload.done();
|
||||
|
||||
// Create attachment record and log activity
|
||||
const attachment = await cardAttachmentRepo.create(db, {
|
||||
cardId: card.id,
|
||||
filename: sanitizedFilename,
|
||||
originalFilename: originalFilenameHeader,
|
||||
contentType,
|
||||
size: contentLength,
|
||||
s3Key,
|
||||
createdBy: user.id,
|
||||
});
|
||||
|
||||
await cardActivityRepo.create(db, {
|
||||
type: "card.updated.attachment.added",
|
||||
cardId: card.id,
|
||||
createdBy: user.id,
|
||||
});
|
||||
|
||||
return res.status(200).json({ attachment });
|
||||
} catch (error) {
|
||||
console.error("Attachment upload failed", error);
|
||||
return res.status(500).json({ error: "Internal server error" });
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
101
apps/web/src/pages/api/upload/avatar.ts
Normal file
101
apps/web/src/pages/api/upload/avatar.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||
|
||||
import { createNextApiContext } from "@kan/api/trpc";
|
||||
import * as userRepo from "@kan/db/repository/user.repo";
|
||||
|
||||
import { env } from "~/env";
|
||||
import { withRateLimit } from "@kan/api/utils/rateLimit";
|
||||
import { createS3Client } from "@kan/shared/utils";
|
||||
|
||||
const MAX_SIZE_BYTES = 2 * 1024 * 1024; // 2MB
|
||||
const allowedContentTypes = ["image/jpeg", "image/png", "image/webp"];
|
||||
|
||||
export const config = {
|
||||
api: {
|
||||
bodyParser: false,
|
||||
},
|
||||
};
|
||||
|
||||
export default withRateLimit(
|
||||
{ points: 100, duration: 60 },
|
||||
async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({ error: "Method not allowed" });
|
||||
}
|
||||
|
||||
try {
|
||||
const { user, db } = await createNextApiContext(req);
|
||||
|
||||
if (!user) {
|
||||
return res.status(401).json({ error: "Unauthorized" });
|
||||
}
|
||||
|
||||
const bucket = env.NEXT_PUBLIC_AVATAR_BUCKET_NAME;
|
||||
if (!bucket) {
|
||||
return res.status(500).json({ error: "Avatar bucket not configured" });
|
||||
}
|
||||
|
||||
const contentType = req.headers["content-type"];
|
||||
const contentLengthHeader = req.headers["content-length"];
|
||||
const contentLength = contentLengthHeader
|
||||
? Number.parseInt(contentLengthHeader, 10)
|
||||
: NaN;
|
||||
|
||||
if (typeof contentType !== "string") {
|
||||
return res.status(400).json({ error: "Missing content type" });
|
||||
}
|
||||
|
||||
if (!allowedContentTypes.includes(contentType)) {
|
||||
return res.status(400).json({ error: "Invalid content type" });
|
||||
}
|
||||
|
||||
if (!Number.isFinite(contentLength) || contentLength <= 0) {
|
||||
return res.status(400).json({ error: "Missing or invalid content length" });
|
||||
}
|
||||
|
||||
if (contentLength > MAX_SIZE_BYTES) {
|
||||
return res.status(400).json({ error: "File too large" });
|
||||
}
|
||||
|
||||
const originalFilenameHeader =
|
||||
(req.headers["x-original-filename"] as string | undefined) ?? "file";
|
||||
|
||||
const sanitizedFilename = originalFilenameHeader
|
||||
.replace(/[^a-zA-Z0-9._-]/g, "_")
|
||||
.substring(0, 200);
|
||||
|
||||
const s3Key = `${user.id}/${sanitizedFilename}`;
|
||||
|
||||
const client = createS3Client();
|
||||
|
||||
// Upload the file to S3
|
||||
await client.send(
|
||||
new PutObjectCommand({
|
||||
Bucket: bucket,
|
||||
Key: s3Key,
|
||||
Body: req,
|
||||
ContentType: contentType,
|
||||
ContentLength: contentLength,
|
||||
}),
|
||||
);
|
||||
|
||||
// Update user image in database
|
||||
const updatedUser = await userRepo.update(db, user.id, {
|
||||
image: s3Key,
|
||||
});
|
||||
|
||||
return res.status(200).json({
|
||||
key: s3Key,
|
||||
filename: sanitizedFilename,
|
||||
contentType,
|
||||
size: contentLength,
|
||||
user: updatedUser,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Avatar upload failed", error);
|
||||
return res.status(500).json({ error: "Internal server error" });
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
|
||||
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
||||
import { env as nextRuntimeEnv } from "next-runtime-env";
|
||||
|
||||
import { createNextApiContext } from "@kan/api/trpc";
|
||||
|
||||
import { env } from "~/env";
|
||||
import { withRateLimit } from "@kan/api/utils/rateLimit";
|
||||
|
||||
const allowedContentTypes = ["image/jpeg", "image/png"];
|
||||
|
||||
export default withRateLimit(
|
||||
{ points: 100, duration: 60 },
|
||||
async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({ error: "Method not allowed" });
|
||||
}
|
||||
|
||||
try {
|
||||
const { user } = await createNextApiContext(req);
|
||||
|
||||
if (!user) {
|
||||
return res.status(401).json({ error: "Unauthorized" });
|
||||
}
|
||||
|
||||
const { filename, contentType } = req.body as {
|
||||
filename: string;
|
||||
contentType: string;
|
||||
};
|
||||
|
||||
// Specific to avatar uploads for now
|
||||
const filenameRegex = /^[a-f0-9\-]+\/[a-zA-Z0-9_\-]+(\.jpg|\.jpeg|\.png)$/;
|
||||
|
||||
if (!filenameRegex.test(filename)) {
|
||||
return res.status(400).json({ error: "Invalid filename" });
|
||||
}
|
||||
|
||||
if (
|
||||
typeof contentType !== "string" ||
|
||||
!allowedContentTypes.includes(contentType)
|
||||
) {
|
||||
return res.status(400).json({ error: "Invalid content type" });
|
||||
}
|
||||
|
||||
const credentials =
|
||||
env.S3_ACCESS_KEY_ID && env.S3_SECRET_ACCESS_KEY
|
||||
? {
|
||||
accessKeyId: env.S3_ACCESS_KEY_ID,
|
||||
secretAccessKey: env.S3_SECRET_ACCESS_KEY,
|
||||
}
|
||||
: undefined;
|
||||
|
||||
const client = new S3Client({
|
||||
region: env.S3_REGION ?? "",
|
||||
endpoint: env.S3_ENDPOINT ?? "",
|
||||
forcePathStyle: env.S3_FORCE_PATH_STYLE === "true",
|
||||
credentials,
|
||||
});
|
||||
|
||||
const signedUrl = await getSignedUrl(
|
||||
client,
|
||||
new PutObjectCommand({
|
||||
Bucket: nextRuntimeEnv("NEXT_PUBLIC_AVATAR_BUCKET_NAME") ?? "",
|
||||
Key: filename,
|
||||
ACL: "public-read",
|
||||
}),
|
||||
);
|
||||
|
||||
return res.status(200).json({ url: signedUrl, key: filename });
|
||||
} catch (error) {
|
||||
return res.status(500).json({ error: (error as Error).message });
|
||||
}
|
||||
},
|
||||
);
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { ReactNode } from "react";
|
||||
import React from "react";
|
||||
import {
|
||||
Dialog,
|
||||
DialogBackdrop,
|
||||
@@ -464,19 +465,37 @@ function FormattedShortcut({ shortcut }: { shortcut: KeyboardShortcut }) {
|
||||
? stroke.modifiers.map(stringifyModifier)
|
||||
: [];
|
||||
|
||||
modifierStrings.forEach((mod) => {
|
||||
parts.push(<kbd className={kbdClassName}>{mod}</kbd>);
|
||||
modifierStrings.forEach((mod, index) => {
|
||||
parts.push(
|
||||
<kbd key={`mod-${index}-${mod}`} className={kbdClassName}>
|
||||
{mod}
|
||||
</kbd>,
|
||||
);
|
||||
});
|
||||
|
||||
parts.push(<kbd className={kbdClassName}>{stroke.key.toUpperCase()}</kbd>);
|
||||
parts.push(
|
||||
<kbd key={`key-${stroke.key}`} className={kbdClassName}>
|
||||
{stroke.key.toUpperCase()}
|
||||
</kbd>,
|
||||
);
|
||||
|
||||
return parts;
|
||||
};
|
||||
|
||||
if (shortcut.type === "SEQUENCE") {
|
||||
const parts: ReactNode[] = [];
|
||||
shortcut.strokes.forEach((stroke) => {
|
||||
parts.push(...formatStroke(stroke));
|
||||
shortcut.strokes.forEach((stroke, strokeIndex) => {
|
||||
const strokeParts = formatStroke(stroke);
|
||||
// Add stroke index to keys to ensure uniqueness across multiple strokes
|
||||
const keyedParts = strokeParts.map((part, partIndex) => {
|
||||
if (React.isValidElement(part)) {
|
||||
return React.cloneElement(part, {
|
||||
key: `stroke-${strokeIndex}-${part.key || partIndex}`,
|
||||
});
|
||||
}
|
||||
return part;
|
||||
});
|
||||
parts.push(...keyedParts);
|
||||
});
|
||||
return <span className="flex items-center gap-1 text-[11px]">{parts}</span>;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ const initialWorkspace: Workspace = {
|
||||
|
||||
const initialAvailableWorkspaces: Workspace[] = [];
|
||||
|
||||
const WorkspaceContext = createContext<WorkspaceContextProps | undefined>(
|
||||
export const WorkspaceContext = createContext<WorkspaceContextProps | undefined>(
|
||||
undefined,
|
||||
);
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ export async function invalidateCard(
|
||||
utils: ReturnType<typeof api.useUtils>,
|
||||
cardPublicId: string,
|
||||
) {
|
||||
if (!cardPublicId || cardPublicId.length < 12) return;
|
||||
|
||||
await Promise.all([
|
||||
utils.card.byId.invalidate({ cardPublicId }),
|
||||
utils.card.getActivities.invalidate({ cardPublicId }),
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import { env } from "next-runtime-env";
|
||||
|
||||
export const formatToArray = (
|
||||
value: string | string[] | undefined,
|
||||
): string[] => {
|
||||
@@ -52,14 +50,5 @@ export const getAvatarUrl = (imageOrKey: string | null) => {
|
||||
return imageOrKey;
|
||||
}
|
||||
|
||||
const bucket = env("NEXT_PUBLIC_AVATAR_BUCKET_NAME");
|
||||
const useVirtualHostedUrls = env("NEXT_PUBLIC_USE_VIRTUAL_HOSTED_URLS");
|
||||
const storageDomain = env("NEXT_PUBLIC_STORAGE_DOMAIN");
|
||||
|
||||
if (useVirtualHostedUrls === "true" && storageDomain) {
|
||||
return `https://${bucket}.${storageDomain}/${imageOrKey}`;
|
||||
}
|
||||
|
||||
const storageUrl = env("NEXT_PUBLIC_STORAGE_URL");
|
||||
return `${storageUrl}/${bucket}/${imageOrKey}`;
|
||||
return "";
|
||||
};
|
||||
|
||||
@@ -1,24 +1,40 @@
|
||||
import Link from "next/link";
|
||||
import { Fragment } from "react";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { env } from "next-runtime-env";
|
||||
import { HiLink } from "react-icons/hi";
|
||||
|
||||
import { Tooltip } from "~/components/Tooltip";
|
||||
import { usePopup } from "~/providers/popup";
|
||||
|
||||
const displayBaseUrl =
|
||||
env("NEXT_PUBLIC_KAN_ENV") === "cloud"
|
||||
? "kan.bn"
|
||||
: env("NEXT_PUBLIC_BASE_URL");
|
||||
|
||||
const linkBaseUrl = env("NEXT_PUBLIC_BASE_URL");
|
||||
|
||||
const pathSeparator = (
|
||||
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600" />
|
||||
);
|
||||
|
||||
const UpdateBoardSlugButton = ({
|
||||
handleOnClick,
|
||||
workspaceSlug,
|
||||
boardSlug,
|
||||
boardPublicId,
|
||||
visibility,
|
||||
isLoading,
|
||||
canEdit,
|
||||
}: {
|
||||
handleOnClick: () => void;
|
||||
workspaceSlug: string;
|
||||
boardSlug: string;
|
||||
boardPublicId: string;
|
||||
visibility: "public" | "private";
|
||||
isLoading: boolean;
|
||||
canEdit: boolean;
|
||||
}) => {
|
||||
if (!isLoading && (!workspaceSlug || !boardSlug)) return <></>;
|
||||
const { showPopup } = usePopup();
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
@@ -26,44 +42,55 @@ const UpdateBoardSlugButton = ({
|
||||
);
|
||||
}
|
||||
|
||||
if (!workspaceSlug || !boardSlug || !boardPublicId) return <></>;
|
||||
|
||||
const isPublic = visibility === "public";
|
||||
const boardUrl = isPublic
|
||||
? `${linkBaseUrl}/${workspaceSlug}/${boardSlug}`
|
||||
: `${linkBaseUrl}/boards/${boardPublicId}`;
|
||||
|
||||
const pathSegments = isPublic
|
||||
? [displayBaseUrl, workspaceSlug, boardSlug]
|
||||
: [displayBaseUrl, "boards", boardPublicId];
|
||||
|
||||
return (
|
||||
<Tooltip
|
||||
content={!canEdit && !isLoading ? t`You don't have permission` : undefined}
|
||||
content={!canEdit ? t`You don't have permission` : undefined}
|
||||
>
|
||||
<button
|
||||
onClick={canEdit ? handleOnClick : undefined}
|
||||
disabled={!canEdit || isLoading}
|
||||
className="hidden cursor-pointer items-center gap-2 rounded-full border-[1px] bg-light-50 p-1 pl-4 pr-1 text-sm text-light-950 hover:bg-light-100 disabled:cursor-not-allowed disabled:opacity-60 dark:border-dark-600 dark:bg-dark-50 dark:text-dark-900 dark:hover:bg-dark-100 xl:flex"
|
||||
>
|
||||
<div className="flex items-center">
|
||||
<span>
|
||||
{env("NEXT_PUBLIC_KAN_ENV") === "cloud"
|
||||
? "kan.bn"
|
||||
: env("NEXT_PUBLIC_BASE_URL")}
|
||||
</span>
|
||||
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600"></div>
|
||||
<span>{workspaceSlug}</span>
|
||||
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600"></div>
|
||||
<span>{boardSlug}</span>
|
||||
</div>
|
||||
<Link
|
||||
href={`${env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/${boardSlug}`}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
if (!canEdit) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}}
|
||||
className="flex h-7 w-7 items-center justify-center rounded-full hover:bg-light-200 dark:hover:bg-dark-200"
|
||||
>
|
||||
<HiLink className="h-[13px] w-[13px]" />
|
||||
</Link>
|
||||
</button>
|
||||
<div className="flex items-center">
|
||||
{pathSegments.map((segment, i) => (
|
||||
<Fragment key={i}>
|
||||
{i > 0 && pathSeparator}
|
||||
<span>{segment}</span>
|
||||
</Fragment>
|
||||
))}
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
navigator.clipboard.writeText(boardUrl).then(
|
||||
() =>
|
||||
showPopup({
|
||||
header: t`Link copied`,
|
||||
icon: "success",
|
||||
message: t`Board URL copied to clipboard`,
|
||||
}),
|
||||
).catch(() => undefined);
|
||||
}}
|
||||
className="flex h-7 w-7 items-center justify-center rounded-full hover:bg-light-200 dark:hover:bg-dark-200"
|
||||
aria-label={t`Copy board link`}
|
||||
>
|
||||
<HiLink className="h-[13px] w-[13px]" />
|
||||
</button>
|
||||
</button>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
export default UpdateBoardSlugButton;
|
||||
|
||||
@@ -156,7 +156,7 @@ export function UpdateBoardSlugForm({
|
||||
<div className="flex items-center gap-2">
|
||||
<Button
|
||||
variant="secondary"
|
||||
href="/settings?tab=workspace"
|
||||
href="/settings/workspace"
|
||||
onClick={closeModal}
|
||||
>
|
||||
{t`Edit workspace URL`}
|
||||
|
||||
@@ -443,6 +443,8 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
isLoading={isLoading}
|
||||
workspaceSlug={workspace.slug ?? ""}
|
||||
boardSlug={boardData?.slug ?? ""}
|
||||
boardPublicId={boardId ?? ""}
|
||||
visibility={boardData?.visibility ?? "private"}
|
||||
canEdit={canEditBoard}
|
||||
/>
|
||||
<VisibilityButton
|
||||
|
||||
@@ -36,12 +36,21 @@ const truncate = (value: string | null, maxLength = 50) => {
|
||||
return value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;
|
||||
};
|
||||
|
||||
const getUserDisplayName = (
|
||||
user: { name?: string | null; email?: string | null } | null | undefined,
|
||||
): string => {
|
||||
if (user?.name?.trim()) return user.name;
|
||||
if (user?.email) return user.email;
|
||||
return t`Member`;
|
||||
};
|
||||
|
||||
const getActivityText = ({
|
||||
type,
|
||||
toTitle,
|
||||
fromList,
|
||||
toList,
|
||||
memberName,
|
||||
memberEmail,
|
||||
isSelf,
|
||||
label,
|
||||
fromTitle,
|
||||
@@ -54,6 +63,7 @@ const getActivityText = ({
|
||||
fromList: string | null;
|
||||
toList: string | null;
|
||||
memberName: string | null;
|
||||
memberEmail: string | null;
|
||||
isSelf: boolean;
|
||||
label: string | null;
|
||||
fromTitle?: string | null;
|
||||
@@ -62,6 +72,7 @@ const getActivityText = ({
|
||||
dateLocale: DateFnsLocale;
|
||||
mergedLabels?: string[];
|
||||
}) => {
|
||||
const displayName = memberName ?? memberEmail ?? t`Member`;
|
||||
const TextHighlight = ({ children }: { children: React.ReactNode }) => (
|
||||
<span className="font-medium text-light-1000 dark:text-dark-1000">
|
||||
{children}
|
||||
@@ -139,23 +150,23 @@ const getActivityText = ({
|
||||
);
|
||||
}
|
||||
|
||||
if (type === "card.updated.member.added" && memberName) {
|
||||
if (type === "card.updated.member.added" && displayName) {
|
||||
if (isSelf) return <Trans>self-assigned the card</Trans>;
|
||||
|
||||
return (
|
||||
<Trans>
|
||||
assigned <TextHighlight>{truncate(memberName)}</TextHighlight> to the
|
||||
assigned <TextHighlight>{truncate(displayName)}</TextHighlight> to the
|
||||
card
|
||||
</Trans>
|
||||
);
|
||||
}
|
||||
|
||||
if (type === "card.updated.member.removed" && memberName) {
|
||||
if (type === "card.updated.member.removed" && displayName) {
|
||||
if (isSelf) return <Trans>unassigned themselves from the card</Trans>;
|
||||
|
||||
return (
|
||||
<Trans>
|
||||
unassigned <TextHighlight>{truncate(memberName)}</TextHighlight> from
|
||||
unassigned <TextHighlight>{truncate(displayName)}</TextHighlight> from
|
||||
the card
|
||||
</Trans>
|
||||
);
|
||||
@@ -352,7 +363,7 @@ const ActivityList = ({
|
||||
limit: ACTIVITIES_PAGE_SIZE,
|
||||
},
|
||||
{
|
||||
enabled: !!cardPublicId,
|
||||
enabled: !!cardPublicId && cardPublicId.length >= 12,
|
||||
},
|
||||
);
|
||||
|
||||
@@ -455,6 +466,7 @@ const ActivityList = ({
|
||||
fromList: activity.fromList?.name ?? null,
|
||||
toList: activity.toList?.name ?? null,
|
||||
memberName: activity.member?.user?.name ?? null,
|
||||
memberEmail: activity.member?.user?.email ?? null,
|
||||
isSelf: activity.member?.user?.id === sessionData?.user.id,
|
||||
label: activity.label?.name ?? null,
|
||||
fromTitle: activity.fromTitle ?? null,
|
||||
@@ -508,7 +520,7 @@ const ActivityList = ({
|
||||
)}
|
||||
</div>
|
||||
<p className="text-sm">
|
||||
<span className="font-medium dark:text-dark-1000">{`${activity.user?.name} `}</span>
|
||||
<span className="font-medium dark:text-dark-1000">{`${getUserDisplayName(activity.user)} `}</span>
|
||||
<span className="space-x-1 text-light-900 dark:text-dark-800">
|
||||
{activityText}
|
||||
</span>
|
||||
|
||||
@@ -7,6 +7,7 @@ import { twMerge } from "tailwind-merge";
|
||||
import Button from "~/components/Button";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { usePopup } from "~/providers/popup";
|
||||
import { env } from "next-runtime-env";
|
||||
import { api } from "~/utils/api";
|
||||
import { invalidateCard } from "~/utils/cardInvalidation";
|
||||
|
||||
@@ -18,62 +19,33 @@ export function AttachmentUpload({ cardPublicId }: { cardPublicId: string }) {
|
||||
const [isDragging, setIsDragging] = useState(false);
|
||||
const inputRef = useRef<HTMLInputElement | null>(null);
|
||||
|
||||
const generateUploadUrl = api.attachment.generateUploadUrl.useMutation();
|
||||
const confirmAttachment = api.attachment.confirm.useMutation({
|
||||
onSuccess: async () => {
|
||||
const uploadFile = async (file: File) => {
|
||||
setUploading(true);
|
||||
|
||||
try {
|
||||
const baseUrl = env("NEXT_PUBLIC_BASE_URL") ?? "";
|
||||
const response = await fetch(
|
||||
`${baseUrl}/api/upload/attachment?cardPublicId=${encodeURIComponent(cardPublicId)}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": file.type,
|
||||
"x-original-filename": file.name,
|
||||
},
|
||||
body: file,
|
||||
},
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error("Upload failed");
|
||||
}
|
||||
|
||||
await invalidateCard(utils, cardPublicId);
|
||||
showPopup({
|
||||
header: t`Attachment uploaded`,
|
||||
message: t`Your file has been uploaded successfully.`,
|
||||
icon: "success",
|
||||
});
|
||||
},
|
||||
onError: () => {
|
||||
showPopup({
|
||||
header: t`Upload failed`,
|
||||
message: t`Failed to upload attachment. Please try again.`,
|
||||
icon: "error",
|
||||
});
|
||||
},
|
||||
onSettled: () => {
|
||||
setUploading(false);
|
||||
},
|
||||
});
|
||||
|
||||
const uploadFile = async (file: File) => {
|
||||
setUploading(true);
|
||||
|
||||
try {
|
||||
// Generate presigned URL
|
||||
const { url, key } = await generateUploadUrl.mutateAsync({
|
||||
cardPublicId,
|
||||
filename: file.name,
|
||||
contentType: file.type,
|
||||
size: file.size,
|
||||
});
|
||||
|
||||
// Upload file to S3
|
||||
const uploadResponse = await fetch(url, {
|
||||
method: "PUT",
|
||||
body: file,
|
||||
headers: {
|
||||
"Content-Type": file.type,
|
||||
},
|
||||
});
|
||||
|
||||
if (!uploadResponse.ok) {
|
||||
throw new Error("Upload failed");
|
||||
}
|
||||
|
||||
// Confirm attachment in database
|
||||
await confirmAttachment.mutateAsync({
|
||||
cardPublicId,
|
||||
s3Key: key,
|
||||
filename: file.name,
|
||||
originalFilename: file.name,
|
||||
contentType: file.type,
|
||||
size: file.size,
|
||||
});
|
||||
} catch {
|
||||
showPopup({
|
||||
header: t`Upload failed`,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { t } from "@lingui/core/macro";
|
||||
import {
|
||||
HiEllipsisHorizontal,
|
||||
HiLink,
|
||||
HiOutlineCheckCircle,
|
||||
HiOutlineTrash,
|
||||
} from "react-icons/hi2";
|
||||
@@ -10,18 +11,54 @@ import { authClient } from "@kan/auth/client";
|
||||
import Dropdown from "~/components/Dropdown";
|
||||
import { usePermissions } from "~/hooks/usePermissions";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { usePopup } from "~/providers/popup";
|
||||
|
||||
export default function CardDropdown({
|
||||
cardPublicId,
|
||||
isTemplate,
|
||||
boardPublicId,
|
||||
cardCreatedBy,
|
||||
}: {
|
||||
cardPublicId: string;
|
||||
isTemplate?: boolean;
|
||||
boardPublicId?: string;
|
||||
cardCreatedBy?: string | null;
|
||||
}) {
|
||||
const { openModal } = useModal();
|
||||
const { showPopup } = usePopup();
|
||||
const { canEditCard, canDeleteCard } = usePermissions();
|
||||
const { data: session } = authClient.useSession();
|
||||
const isCreator = cardCreatedBy && session?.user.id === cardCreatedBy;
|
||||
|
||||
const handleCopyCardLink = async () => {
|
||||
const path =
|
||||
isTemplate && boardPublicId
|
||||
? `/templates/${boardPublicId}/cards/${cardPublicId}`
|
||||
: `/cards/${cardPublicId}`;
|
||||
const url = `${window.location.origin}${path}`;
|
||||
try {
|
||||
await navigator.clipboard.writeText(url);
|
||||
showPopup({
|
||||
header: t`Link copied`,
|
||||
icon: "success",
|
||||
message: t`Card URL copied to clipboard`,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
showPopup({
|
||||
header: t`Unable to copy link`,
|
||||
icon: "error",
|
||||
message: t`Please try again.`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const items = [
|
||||
{
|
||||
label: t`Copy card link`,
|
||||
action: handleCopyCardLink,
|
||||
icon: <HiLink className="h-[16px] w-[16px] text-dark-900" />,
|
||||
},
|
||||
...(canEditCard
|
||||
? [
|
||||
{
|
||||
|
||||
@@ -5,6 +5,8 @@ import { useEffect, useState } from "react";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { IoChevronForwardSharp } from "react-icons/io5";
|
||||
|
||||
import { authClient } from "@kan/auth/client";
|
||||
|
||||
import Avatar from "~/components/Avatar";
|
||||
import Editor from "~/components/Editor";
|
||||
import FeedbackModal from "~/components/FeedbackModal";
|
||||
@@ -14,8 +16,6 @@ import Modal from "~/components/modal";
|
||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||
import { PageHead } from "~/components/PageHead";
|
||||
import { EditYouTubeModal } from "~/components/YouTubeEmbed/EditYouTubeModal";
|
||||
import { authClient } from "@kan/auth/client";
|
||||
|
||||
import { usePermissions } from "~/hooks/usePermissions";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { usePopup } from "~/providers/popup";
|
||||
@@ -53,9 +53,10 @@ export function CardRightPanel({ isTemplate }: { isTemplate?: boolean }) {
|
||||
? router.query.cardId[0]
|
||||
: router.query.cardId;
|
||||
|
||||
const { data: card } = api.card.byId.useQuery({
|
||||
cardPublicId: cardId ?? "",
|
||||
});
|
||||
const { data: card } = api.card.byId.useQuery(
|
||||
{ cardPublicId: cardId ?? "" },
|
||||
{ enabled: !!cardId && cardId.length >= 12 },
|
||||
);
|
||||
|
||||
const isCreator = card?.createdBy && session?.user.id === card.createdBy;
|
||||
const canEdit = canEditCard || isCreator;
|
||||
@@ -184,9 +185,10 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
? router.query.cardId[0]
|
||||
: router.query.cardId;
|
||||
|
||||
const { data: card, isLoading } = api.card.byId.useQuery({
|
||||
cardPublicId: cardId ?? "",
|
||||
});
|
||||
const { data: card, isLoading } = api.card.byId.useQuery(
|
||||
{ cardPublicId: cardId ?? "" },
|
||||
{ enabled: !!cardId && cardId.length >= 12 },
|
||||
);
|
||||
|
||||
const isCreator = card?.createdBy && session?.user.id === card.createdBy;
|
||||
const canEdit = canEditCard || isCreator;
|
||||
@@ -315,7 +317,12 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
</Link>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<Dropdown cardCreatedBy={card?.createdBy} />
|
||||
<Dropdown
|
||||
cardPublicId={cardId}
|
||||
isTemplate={isTemplate}
|
||||
boardPublicId={boardId}
|
||||
cardCreatedBy={card?.createdBy}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
@@ -372,8 +379,14 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
<div className="mt-2">
|
||||
<Editor
|
||||
content={card.description}
|
||||
onChange={canEdit ? (e) => setValue("description", e) : undefined}
|
||||
onBlur={canEdit ? () => handleSubmit(onSubmit)() : undefined}
|
||||
onChange={
|
||||
canEdit
|
||||
? (e) => setValue("description", e)
|
||||
: undefined
|
||||
}
|
||||
onBlur={
|
||||
canEdit ? () => handleSubmit(onSubmit)() : undefined
|
||||
}
|
||||
workspaceMembers={board?.workspace.members ?? []}
|
||||
readOnly={!canEdit}
|
||||
/>
|
||||
|
||||
@@ -37,7 +37,7 @@ export default function MembersPage() {
|
||||
|
||||
const { data, isLoading } = api.workspace.byId.useQuery(
|
||||
{ workspacePublicId: workspace.publicId },
|
||||
// { enabled: workspace?.publicId ? true : false },
|
||||
{ enabled: !!workspace.publicId && workspace.publicId.length >= 12 },
|
||||
);
|
||||
|
||||
const { data: session } = authClient.useSession();
|
||||
@@ -48,9 +48,11 @@ export default function MembersPage() {
|
||||
|
||||
const updateRoleMutation = api.member.updateRole.useMutation({
|
||||
onSuccess: async () => {
|
||||
await utils.workspace.byId.invalidate({
|
||||
workspacePublicId: workspace.publicId,
|
||||
});
|
||||
if (workspace.publicId && workspace.publicId.length >= 12) {
|
||||
await utils.workspace.byId.invalidate({
|
||||
workspacePublicId: workspace.publicId,
|
||||
});
|
||||
}
|
||||
|
||||
showPopup({
|
||||
header: t`Role updated`,
|
||||
@@ -124,7 +126,6 @@ export default function MembersPage() {
|
||||
name={memberName ?? ""}
|
||||
email={memberEmail ?? ""}
|
||||
imageUrl={memberImage ? getAvatarUrl(memberImage) : undefined}
|
||||
icon={showPendingIcon ? "?" : undefined}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
@@ -212,7 +213,7 @@ export default function MembersPage() {
|
||||
</div>
|
||||
<div
|
||||
className={twMerge(
|
||||
"relative z-50",
|
||||
"relative",
|
||||
(workspace.role !== "admin" || showSkeleton) && "hidden",
|
||||
)}
|
||||
>
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import { useRouter } from "next/router";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { HiXMark } from "react-icons/hi2";
|
||||
import { HiLink, HiXMark } from "react-icons/hi2";
|
||||
|
||||
import Badge from "~/components/Badge";
|
||||
import Editor from "~/components/Editor";
|
||||
import LabelIcon from "~/components/LabelIcon";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { usePopup } from "~/providers/popup";
|
||||
import { api } from "~/utils/api";
|
||||
import ActivityList from "~/views/card/components/ActivityList";
|
||||
import { AttachmentThumbnails } from "~/views/card/components/AttachmentThumbnails";
|
||||
@@ -23,16 +24,35 @@ export function CardModal({
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const { closeModal, isOpen } = useModal();
|
||||
const { showPopup } = usePopup();
|
||||
const [showFade, setShowFade] = useState(false);
|
||||
const [showTopFade, setShowTopFade] = useState(false);
|
||||
const scrollRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const handleCopyCardLink = async () => {
|
||||
try {
|
||||
await navigator.clipboard.writeText(window.location.href);
|
||||
showPopup({
|
||||
header: t`Link copied`,
|
||||
icon: "success",
|
||||
message: t`Card URL copied to clipboard`,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
showPopup({
|
||||
header: t`Unable to copy link`,
|
||||
icon: "error",
|
||||
message: t`Please try again.`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const { data, isLoading } = api.card.byId.useQuery(
|
||||
{
|
||||
cardPublicId: cardPublicId ?? "",
|
||||
},
|
||||
{
|
||||
enabled: isOpen && !!cardPublicId,
|
||||
enabled: isOpen && !!cardPublicId && cardPublicId.length >= 12,
|
||||
},
|
||||
);
|
||||
|
||||
@@ -65,33 +85,44 @@ export function CardModal({
|
||||
<div className="h-full p-8">
|
||||
<div className="mb-6">
|
||||
<div className="flex w-full items-center justify-between">
|
||||
<button
|
||||
className="absolute right-[2rem] top-[2rem] rounded p-1 hover:bg-light-300 focus:outline-none dark:hover:bg-dark-300"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
closeModal();
|
||||
<div className="absolute right-[2rem] top-[2rem] flex items-center gap-1">
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleCopyCardLink}
|
||||
className="rounded p-1.5 transition-all hover:bg-light-200 focus:outline-none dark:hover:bg-dark-100"
|
||||
aria-label="Copy card link"
|
||||
>
|
||||
<HiLink className="h-4 w-4 text-light-900 dark:text-dark-900" />
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
className="rounded p-1.5 transition-all hover:bg-light-200 focus:outline-none dark:hover:bg-dark-100"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
closeModal();
|
||||
|
||||
setTimeout(() => {
|
||||
void router.replace(
|
||||
{
|
||||
pathname: router.pathname,
|
||||
query: {
|
||||
...router.query,
|
||||
workspaceSlug,
|
||||
boardSlug: [boardSlug],
|
||||
setTimeout(() => {
|
||||
void router.replace(
|
||||
{
|
||||
pathname: router.pathname,
|
||||
query: {
|
||||
...router.query,
|
||||
workspaceSlug: workspaceSlug ?? "",
|
||||
boardSlug: [boardSlug ?? ""],
|
||||
},
|
||||
},
|
||||
},
|
||||
undefined,
|
||||
{ shallow: true },
|
||||
);
|
||||
}, 400);
|
||||
}}
|
||||
>
|
||||
<HiXMark
|
||||
size={18}
|
||||
className="dark:text-dark-9000 text-light-900"
|
||||
/>
|
||||
</button>
|
||||
undefined,
|
||||
{ shallow: true },
|
||||
);
|
||||
}, 400);
|
||||
}}
|
||||
>
|
||||
<HiXMark
|
||||
size={18}
|
||||
className="text-light-900 dark:text-dark-900"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
{isLoading ? (
|
||||
<div className="flex space-x-2">
|
||||
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
|
||||
|
||||
@@ -30,7 +30,7 @@ export default function PublicBoardView() {
|
||||
const { showPopup } = usePopup();
|
||||
const [isRouteLoaded, setIsRouteLoaded] = useState(false);
|
||||
const { openModal } = useModal();
|
||||
|
||||
|
||||
const { ref: scrollRef, onMouseDown } = useDragToScroll({
|
||||
enabled: true,
|
||||
direction: "horizontal",
|
||||
@@ -70,30 +70,35 @@ export default function PublicBoardView() {
|
||||
},
|
||||
);
|
||||
|
||||
const CopyBoardLink = () => {
|
||||
return (
|
||||
<button
|
||||
onClick={async () => {
|
||||
try {
|
||||
await navigator.clipboard.writeText(window.location.href);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
|
||||
showPopup({
|
||||
header: t`Link copied`,
|
||||
icon: "success",
|
||||
message: t`Board URL copied to clipboard`,
|
||||
});
|
||||
}}
|
||||
className="rounded p-1.5 transition-all hover:bg-light-200 dark:hover:bg-dark-100"
|
||||
aria-label={`Copy board URL`}
|
||||
>
|
||||
<HiLink className={`h-4 w-4 text-light-900 dark:text-dark-900`} />
|
||||
</button>
|
||||
);
|
||||
const handleCopyBoardLink = async () => {
|
||||
try {
|
||||
await navigator.clipboard.writeText(window.location.href);
|
||||
showPopup({
|
||||
header: t`Link copied`,
|
||||
icon: "success",
|
||||
message: t`Board URL copied to clipboard`,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
showPopup({
|
||||
header: t`Unable to copy link`,
|
||||
icon: "error",
|
||||
message: t`Please try again.`,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const CopyBoardLink = () => (
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleCopyBoardLink}
|
||||
className="rounded p-1.5 transition-all hover:bg-light-200 focus:outline-none dark:hover:bg-dark-100"
|
||||
aria-label="Copy board URL"
|
||||
>
|
||||
<HiLink className="h-4 w-4 text-light-900 dark:text-dark-900" />
|
||||
</button>
|
||||
);
|
||||
|
||||
const pathWithoutQuery = router.asPath.split("?")[0];
|
||||
const splitPath = pathWithoutQuery?.split("/") ?? [];
|
||||
const cardPublicId = splitPath.length > 3 ? splitPath[3] : null;
|
||||
|
||||
@@ -28,9 +28,11 @@ export default function PermissionsSettings() {
|
||||
});
|
||||
|
||||
// Refresh any relevant workspace data
|
||||
await utils.workspace.byId.invalidate({
|
||||
workspacePublicId: workspace.publicId,
|
||||
});
|
||||
if (workspace.publicId && workspace.publicId.length >= 12) {
|
||||
await utils.workspace.byId.invalidate({
|
||||
workspacePublicId: workspace.publicId,
|
||||
});
|
||||
}
|
||||
},
|
||||
onError: () => {
|
||||
showPopup({
|
||||
|
||||
@@ -31,9 +31,10 @@ export default function WorkspaceSettings() {
|
||||
const { data } = api.user.getUser.useQuery();
|
||||
const [hasOpenedUpgradeModal, setHasOpenedUpgradeModal] = useState(false);
|
||||
|
||||
const { data: workspaceData } = api.workspace.byId.useQuery({
|
||||
workspacePublicId: workspace.publicId,
|
||||
});
|
||||
const { data: workspaceData } = api.workspace.byId.useQuery(
|
||||
{ workspacePublicId: workspace.publicId },
|
||||
{ enabled: !!workspace.publicId && workspace.publicId.length >= 12 },
|
||||
);
|
||||
|
||||
const subscriptions = workspaceData?.subscriptions as
|
||||
| Subscription[]
|
||||
|
||||
@@ -58,28 +58,6 @@ export default function Avatar({
|
||||
const [crop, setCrop] = useState<PercentCrop>();
|
||||
const imgRef = useRef<HTMLImageElement | null>(null);
|
||||
|
||||
const updateUser = api.user.update.useMutation({
|
||||
onSuccess: async () => {
|
||||
showPopup({
|
||||
header: t`Profile image updated`,
|
||||
message: t`Your profile image has been updated.`,
|
||||
icon: "success",
|
||||
});
|
||||
try {
|
||||
await utils.user.getUser.refetch();
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
throw e;
|
||||
}
|
||||
},
|
||||
onError: () => {
|
||||
showPopup({
|
||||
header: t`Error updating profile image`,
|
||||
message: t`Please try again later, or contact customer support.`,
|
||||
icon: "error",
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const avatarUrl = userImage ? getAvatarUrl(userImage) : undefined;
|
||||
|
||||
@@ -187,29 +165,32 @@ export default function Avatar({
|
||||
const originalExt = selectedFile.name.split(".").pop() ?? "jpg";
|
||||
const fileName = `${userId}/avatar-${generateUID()}.${originalExt}`;
|
||||
|
||||
const baseUrl = env("NEXT_PUBLIC_BASE_URL") ?? "";
|
||||
const response = await fetch(
|
||||
env("NEXT_PUBLIC_BASE_URL") + "/api/upload/image",
|
||||
`${baseUrl}/api/upload/avatar`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"Content-Type": blob.type,
|
||||
"x-original-filename": fileName,
|
||||
},
|
||||
body: JSON.stringify({ filename: fileName, contentType: blob.type }),
|
||||
body: blob,
|
||||
},
|
||||
);
|
||||
|
||||
if (!response.ok) throw new Error("Failed to get pre-signed URL");
|
||||
if (!response.ok) {
|
||||
throw new Error("Failed to upload profile image");
|
||||
}
|
||||
|
||||
const { url } = (await response.json()) as { url: string };
|
||||
|
||||
const uploadResponse = await fetch(url, {
|
||||
method: "PUT",
|
||||
body: blob,
|
||||
// User image is updated in the backend, refresh user data
|
||||
await utils.user.getUser.refetch();
|
||||
|
||||
showPopup({
|
||||
header: t`Profile image updated`,
|
||||
message: t`Your profile image has been updated.`,
|
||||
icon: "success",
|
||||
});
|
||||
|
||||
if (!uploadResponse.ok) throw new Error("Failed to upload profile image");
|
||||
|
||||
updateUser.mutate({ image: fileName });
|
||||
|
||||
setCropDialogOpen(false);
|
||||
resetCropState();
|
||||
} catch (error) {
|
||||
@@ -227,7 +208,7 @@ export default function Avatar({
|
||||
resetCropState,
|
||||
selectedFile,
|
||||
showPopup,
|
||||
updateUser,
|
||||
utils.user.getUser,
|
||||
userId,
|
||||
]);
|
||||
|
||||
|
||||
@@ -22,9 +22,11 @@ export default function UpdateWorkspaceEmailVisibilityForm({
|
||||
|
||||
const updateWorkspace = api.workspace.update.useMutation({
|
||||
onSuccess: () => {
|
||||
void utils.workspace.byId.invalidate({
|
||||
workspacePublicId,
|
||||
});
|
||||
if (workspacePublicId && workspacePublicId.length >= 12) {
|
||||
void utils.workspace.byId.invalidate({
|
||||
workspacePublicId,
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
"./utils/rateLimit": {
|
||||
"types": "./dist/utils/rateLimit.d.ts",
|
||||
"default": "./src/utils/rateLimit.ts"
|
||||
},
|
||||
"./utils/permissions": {
|
||||
"types": "./dist/utils/permissions.d.ts",
|
||||
"default": "./src/utils/permissions.ts"
|
||||
}
|
||||
},
|
||||
"license": "GPL-3.0",
|
||||
@@ -39,8 +43,6 @@
|
||||
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.802.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.812.0",
|
||||
"@kan/auth": "workspace:*",
|
||||
"@kan/db": "workspace:*",
|
||||
"@kan/email": "workspace:^",
|
||||
|
||||
@@ -9,7 +9,7 @@ import { generateUID } from "@kan/shared/utils";
|
||||
|
||||
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
||||
import { assertPermission } from "../utils/permissions";
|
||||
import { deleteObject, generateUploadUrl } from "../utils/s3";
|
||||
import { deleteObject, generateUploadUrl } from "@kan/shared/utils";
|
||||
|
||||
export const attachmentRouter = createTRPCRouter({
|
||||
generateUploadUrl: protectedProcedure
|
||||
|
||||
@@ -10,6 +10,7 @@ import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||
import { colours } from "@kan/shared/constants";
|
||||
import {
|
||||
convertDueDateFiltersToRanges,
|
||||
generateAvatarUrl,
|
||||
generateSlug,
|
||||
generateUID,
|
||||
} from "@kan/shared/utils";
|
||||
@@ -142,7 +143,40 @@ export const boardRouter = createTRPCRouter({
|
||||
},
|
||||
);
|
||||
|
||||
return result;
|
||||
if (!result) {
|
||||
throw new TRPCError({
|
||||
message: `Board with public ID ${input.boardPublicId} not found`,
|
||||
code: "NOT_FOUND",
|
||||
});
|
||||
}
|
||||
|
||||
// Generate presigned URLs for workspace member avatars
|
||||
const workspaceWithAvatarUrls = result.workspace
|
||||
? {
|
||||
...result.workspace,
|
||||
members: await Promise.all(
|
||||
result.workspace.members.map(async (member) => {
|
||||
if (!member.user?.image) {
|
||||
return member;
|
||||
}
|
||||
|
||||
const avatarUrl = await generateAvatarUrl(member.user.image);
|
||||
return {
|
||||
...member,
|
||||
user: {
|
||||
...member.user,
|
||||
image: avatarUrl,
|
||||
},
|
||||
};
|
||||
}),
|
||||
),
|
||||
}
|
||||
: result.workspace;
|
||||
|
||||
return {
|
||||
...result,
|
||||
workspace: workspaceWithAvatarUrls,
|
||||
};
|
||||
}),
|
||||
bySlug: publicProcedure
|
||||
.meta({
|
||||
|
||||
@@ -11,7 +11,7 @@ import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
||||
import { mergeActivities } from "../utils/activities";
|
||||
import { assertCanDelete, assertCanEdit, assertPermission } from "../utils/permissions";
|
||||
import { generateDownloadUrl } from "../utils/s3";
|
||||
import { generateAttachmentUrl, generateAvatarUrl } from "@kan/shared/utils";
|
||||
|
||||
export const cardRouter = createTRPCRouter({
|
||||
create: protectedProcedure
|
||||
@@ -631,45 +631,54 @@ export const cardRouter = createTRPCRouter({
|
||||
});
|
||||
|
||||
// Generate URLs for all attachments
|
||||
const bucket = process.env.NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME;
|
||||
if (result.attachments && Array.isArray(result.attachments)) {
|
||||
const attachments = result.attachments as {
|
||||
publicId: string;
|
||||
contentType: string;
|
||||
s3Key: string;
|
||||
originalFilename: string | null;
|
||||
size?: number | null;
|
||||
}[];
|
||||
const attachmentsWithUrls = await Promise.all(
|
||||
result.attachments.map(async (attachment) => {
|
||||
const url = await generateAttachmentUrl(attachment.s3Key);
|
||||
return {
|
||||
publicId: attachment.publicId,
|
||||
contentType: attachment.contentType,
|
||||
s3Key: attachment.s3Key,
|
||||
originalFilename: attachment.originalFilename,
|
||||
size: attachment.size,
|
||||
url,
|
||||
};
|
||||
}),
|
||||
);
|
||||
|
||||
const attachmentsWithUrls = await Promise.all(
|
||||
attachments.map(async (attachment) => {
|
||||
const base = {
|
||||
publicId: attachment.publicId,
|
||||
contentType: attachment.contentType,
|
||||
s3Key: attachment.s3Key,
|
||||
originalFilename: attachment.originalFilename,
|
||||
size: attachment.size,
|
||||
};
|
||||
if (!bucket || !attachment.s3Key) {
|
||||
return { ...base, url: null };
|
||||
}
|
||||
try {
|
||||
const url = await generateDownloadUrl(
|
||||
bucket,
|
||||
attachment.s3Key,
|
||||
86400, // 24 hours expiration
|
||||
);
|
||||
return { ...base, url };
|
||||
} catch {
|
||||
// If URL generation fails, return attachment with url: null
|
||||
return { ...base, url: null };
|
||||
}
|
||||
}),
|
||||
);
|
||||
return { ...result, attachments: attachmentsWithUrls };
|
||||
}
|
||||
// Generate presigned URLs for workspace member avatars
|
||||
const workspaceWithAvatarUrls = result.list.board.workspace
|
||||
? {
|
||||
...result.list.board.workspace,
|
||||
members: await Promise.all(
|
||||
result.list.board.workspace.members.map(async (member) => {
|
||||
if (!member.user?.image) {
|
||||
return member;
|
||||
}
|
||||
|
||||
return { ...result, attachments: [] };
|
||||
const avatarUrl = await generateAvatarUrl(member.user.image);
|
||||
return {
|
||||
...member,
|
||||
user: {
|
||||
...member.user,
|
||||
image: avatarUrl,
|
||||
},
|
||||
};
|
||||
}),
|
||||
),
|
||||
}
|
||||
: result.list.board.workspace;
|
||||
|
||||
return {
|
||||
...result,
|
||||
attachments: attachmentsWithUrls,
|
||||
list: {
|
||||
...result.list,
|
||||
board: {
|
||||
...result.list.board,
|
||||
workspace: workspaceWithAvatarUrls,
|
||||
},
|
||||
},
|
||||
};
|
||||
}),
|
||||
getActivities: publicProcedure
|
||||
.meta({
|
||||
@@ -738,7 +747,39 @@ export const cardRouter = createTRPCRouter({
|
||||
},
|
||||
);
|
||||
|
||||
const mergedActivities = mergeActivities(result.activities);
|
||||
// Generate presigned URLs for user avatars in activities
|
||||
const activitiesWithAvatarUrls = await Promise.all(
|
||||
result.activities.map(async (activity) => {
|
||||
const updatedActivity = { ...activity };
|
||||
|
||||
// Generate presigned URL for activity user avatar
|
||||
if (activity.user?.image) {
|
||||
const userAvatarUrl = await generateAvatarUrl(activity.user.image);
|
||||
updatedActivity.user = {
|
||||
...activity.user,
|
||||
image: userAvatarUrl,
|
||||
};
|
||||
}
|
||||
|
||||
// Generate presigned URL for member user avatar (if exists)
|
||||
if (activity.member?.user?.image) {
|
||||
const memberAvatarUrl = await generateAvatarUrl(
|
||||
activity.member.user.image,
|
||||
);
|
||||
updatedActivity.member = {
|
||||
...activity.member,
|
||||
user: {
|
||||
...activity.member.user,
|
||||
image: memberAvatarUrl,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return updatedActivity;
|
||||
}),
|
||||
);
|
||||
|
||||
const mergedActivities = mergeActivities(activitiesWithAvatarUrls);
|
||||
|
||||
return {
|
||||
activities: mergedActivities,
|
||||
|
||||
@@ -24,7 +24,7 @@ import {
|
||||
createTRPCRouter,
|
||||
publicProcedure,
|
||||
} from "../trpc";
|
||||
import { createS3Client } from "../utils/s3";
|
||||
import { createS3Client } from "@kan/shared/utils";
|
||||
|
||||
const checkDatabaseConnection = async (db: dbClient) => {
|
||||
try {
|
||||
|
||||
@@ -4,6 +4,7 @@ import { z } from "zod";
|
||||
import * as userRepo from "@kan/db/repository/user.repo";
|
||||
|
||||
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
||||
import { generateAvatarUrl } from "@kan/shared/utils";
|
||||
|
||||
export const userRouter = createTRPCRouter({
|
||||
getUser: protectedProcedure
|
||||
@@ -55,8 +56,12 @@ export const userRouter = createTRPCRouter({
|
||||
|
||||
const apiKey = result.apiKeys[0];
|
||||
|
||||
// Generate presigned URL for avatar
|
||||
const imageUrl = await generateAvatarUrl(result.image);
|
||||
|
||||
return {
|
||||
...result,
|
||||
image: imageUrl,
|
||||
apiKey: apiKey ?? null,
|
||||
};
|
||||
}),
|
||||
@@ -102,6 +107,12 @@ export const userRouter = createTRPCRouter({
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
// Generate presigned URL for avatar
|
||||
const imageUrl = await generateAvatarUrl(result.image);
|
||||
|
||||
return {
|
||||
...result,
|
||||
image: imageUrl,
|
||||
};
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -8,6 +8,7 @@ import { generateUID } from "@kan/shared/utils";
|
||||
|
||||
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
||||
import { assertPermission } from "../utils/permissions";
|
||||
import { generateAvatarUrl } from "@kan/shared/utils";
|
||||
|
||||
export const workspaceRouter = createTRPCRouter({
|
||||
all: protectedProcedure
|
||||
@@ -86,9 +87,27 @@ export const workspaceRouter = createTRPCRouter({
|
||||
const shouldShowEmails =
|
||||
isAdmin || result.showEmailsToMembers === true;
|
||||
|
||||
// Generate presigned URLs for member avatars
|
||||
const membersWithAvatarUrls = await Promise.all(
|
||||
result.members.map(async (member) => {
|
||||
if (!member.user?.image) {
|
||||
return member;
|
||||
}
|
||||
|
||||
const avatarUrl = await generateAvatarUrl(member.user.image);
|
||||
return {
|
||||
...member,
|
||||
user: {
|
||||
...member.user,
|
||||
image: avatarUrl,
|
||||
},
|
||||
};
|
||||
}),
|
||||
);
|
||||
|
||||
// If emails should be hidden, filter them out
|
||||
if (!shouldShowEmails) {
|
||||
const sanitizedMembers = result.members.map((member) => {
|
||||
const sanitizedMembers = membersWithAvatarUrls.map((member) => {
|
||||
// If user doesn't have a display name, use anonymous identifier
|
||||
const displayName =
|
||||
member.user?.name?.trim() ?? `anonymous_${member.publicId}`;
|
||||
@@ -120,7 +139,10 @@ export const workspaceRouter = createTRPCRouter({
|
||||
} as Awaited<ReturnType<typeof workspaceRepo.getByPublicIdWithMembers>>;
|
||||
}
|
||||
|
||||
return result;
|
||||
return {
|
||||
...result,
|
||||
members: membersWithAvatarUrls,
|
||||
};
|
||||
}),
|
||||
bySlug: publicProcedure
|
||||
.meta({
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
|
||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||
import { ChatOrPushProviderEnum } from "@novu/api/models/components";
|
||||
import { createAuthMiddleware } from "better-auth/api";
|
||||
import { env } from "next-runtime-env";
|
||||
@@ -7,7 +7,7 @@ import type { dbClient } from "@kan/db/client";
|
||||
import * as memberRepo from "@kan/db/repository/member.repo";
|
||||
import * as userRepo from "@kan/db/repository/user.repo";
|
||||
import { notificationClient } from "@kan/email";
|
||||
import { createEmailUnsubscribeLink } from "@kan/shared";
|
||||
import { createEmailUnsubscribeLink, createS3Client } from "@kan/shared";
|
||||
|
||||
import { downloadImage } from "./utils";
|
||||
|
||||
@@ -61,20 +61,7 @@ export function createDatabaseHooks(db: dbClient) {
|
||||
!user.image.includes(storageDomain)
|
||||
) {
|
||||
try {
|
||||
const credentials =
|
||||
env("S3_ACCESS_KEY_ID") && env("S3_SECRET_ACCESS_KEY")
|
||||
? {
|
||||
accessKeyId: env("S3_ACCESS_KEY_ID")!,
|
||||
secretAccessKey: env("S3_SECRET_ACCESS_KEY")!,
|
||||
}
|
||||
: undefined;
|
||||
|
||||
const client = new S3Client({
|
||||
region: env("S3_REGION") ?? "",
|
||||
endpoint: env("S3_ENDPOINT") ?? "",
|
||||
forcePathStyle: env("S3_FORCE_PATH_STYLE") === "true",
|
||||
credentials,
|
||||
});
|
||||
const client = createS3Client();
|
||||
|
||||
const allowedFileExtensions = ["jpg", "jpeg", "png", "webp"];
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
ALTER TABLE "workspace" ADD COLUMN "showEmailsToMembers" boolean NOT NULL DEFAULT true;
|
||||
ALTER TABLE "workspace" ADD COLUMN IF NOT EXISTS "showEmailsToMembers" boolean NOT NULL DEFAULT true;
|
||||
|
||||
@@ -32,7 +32,6 @@ CREATE TABLE IF NOT EXISTS "workspace_roles" (
|
||||
--> statement-breakpoint
|
||||
ALTER TABLE "workspace_roles" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint
|
||||
ALTER TABLE "workspace_members" ADD COLUMN "roleId" bigint;--> statement-breakpoint
|
||||
ALTER TABLE "workspace" ADD COLUMN "showEmailsToMembers" boolean DEFAULT true NOT NULL;--> statement-breakpoint
|
||||
DO $$ BEGIN
|
||||
ALTER TABLE "workspace_role_permissions" ADD CONSTRAINT "workspace_role_permissions_workspaceRoleId_workspace_roles_id_fk" FOREIGN KEY ("workspaceRoleId") REFERENCES "public"."workspace_roles"("id") ON DELETE cascade ON UPDATE no action;
|
||||
EXCEPTION
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
},
|
||||
"prettier": "@kan/prettier-config",
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.802.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.812.0",
|
||||
"date-fns": "^4.1.0",
|
||||
"jose": "^6.1.2",
|
||||
"nanoid": "^5.0.9",
|
||||
|
||||
@@ -3,3 +3,4 @@ export * from "./generateSlug";
|
||||
export * from "./subscriptions";
|
||||
export * from "./email";
|
||||
export * from "./dueDateFilters";
|
||||
export * from "./s3";
|
||||
|
||||
@@ -5,6 +5,7 @@ import {
|
||||
S3Client,
|
||||
} from "@aws-sdk/client-s3";
|
||||
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
||||
import { env } from "next-runtime-env";
|
||||
|
||||
export function createS3Client() {
|
||||
const credentials =
|
||||
@@ -67,3 +68,60 @@ export async function deleteObject(bucket: string, key: string) {
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate presigned URL for an avatar image
|
||||
* Returns the URL as-is if it's already a full URL (external provider)
|
||||
* Returns presigned URL if it's an S3 key
|
||||
* Returns null if image key is missing, bucket is not configured, or URL generation fails
|
||||
*/
|
||||
export async function generateAvatarUrl(
|
||||
imageKey: string | null | undefined,
|
||||
expiresIn = 86400, // 24 hours
|
||||
): Promise<string | null> {
|
||||
if (!imageKey) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (imageKey.startsWith("http://") || imageKey.startsWith("https://")) {
|
||||
return imageKey;
|
||||
}
|
||||
|
||||
const bucket = env("NEXT_PUBLIC_AVATAR_BUCKET_NAME");
|
||||
if (!bucket) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return await generateDownloadUrl(bucket, imageKey, expiresIn);
|
||||
} catch {
|
||||
// If URL generation fails, return null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate presigned URL for an attachment
|
||||
* Returns null if attachment key is missing, bucket is not configured, or URL generation fails
|
||||
*/
|
||||
export async function generateAttachmentUrl(
|
||||
attachmentKey: string | null | undefined,
|
||||
expiresIn = 86400, // 24 hours
|
||||
): Promise<string | null> {
|
||||
if (!attachmentKey) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const bucket = env("NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME");
|
||||
if (!bucket) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return await generateDownloadUrl(bucket, attachmentKey, expiresIn);
|
||||
} catch {
|
||||
// If URL generation fails, return null
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
326
pnpm-lock.yaml
generated
326
pnpm-lock.yaml
generated
@@ -82,6 +82,9 @@ importers:
|
||||
'@aws-sdk/client-s3':
|
||||
specifier: ^3.802.0
|
||||
version: 3.879.0
|
||||
'@aws-sdk/lib-storage':
|
||||
specifier: ^3.802.0
|
||||
version: 3.985.0(@aws-sdk/client-s3@3.879.0)
|
||||
'@aws-sdk/s3-request-presigner':
|
||||
specifier: ^3.812.0
|
||||
version: 3.879.0
|
||||
@@ -136,6 +139,9 @@ importers:
|
||||
'@tiptap/extension-placeholder':
|
||||
specifier: ^2.14.0
|
||||
version: 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)
|
||||
'@tiptap/extension-typography':
|
||||
specifier: ^3.18.0
|
||||
version: 3.18.0(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))
|
||||
'@tiptap/pm':
|
||||
specifier: ^2.14.0
|
||||
version: 2.26.1
|
||||
@@ -293,12 +299,9 @@ importers:
|
||||
|
||||
packages/api:
|
||||
dependencies:
|
||||
'@aws-sdk/client-s3':
|
||||
'@aws-sdk/lib-storage':
|
||||
specifier: ^3.802.0
|
||||
version: 3.879.0
|
||||
'@aws-sdk/s3-request-presigner':
|
||||
specifier: ^3.812.0
|
||||
version: 3.879.0
|
||||
version: 3.985.0(@aws-sdk/client-s3@3.879.0)
|
||||
'@kan/auth':
|
||||
specifier: workspace:*
|
||||
version: link:../auth
|
||||
@@ -483,6 +486,12 @@ importers:
|
||||
|
||||
packages/shared:
|
||||
dependencies:
|
||||
'@aws-sdk/client-s3':
|
||||
specifier: ^3.802.0
|
||||
version: 3.879.0
|
||||
'@aws-sdk/s3-request-presigner':
|
||||
specifier: ^3.812.0
|
||||
version: 3.879.0
|
||||
date-fns:
|
||||
specifier: ^4.1.0
|
||||
version: 4.1.0
|
||||
@@ -734,6 +743,12 @@ packages:
|
||||
resolution: {integrity: sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@aws-sdk/lib-storage@3.985.0':
|
||||
resolution: {integrity: sha512-EnqXf2E+5+7e5zuz8mPl+3Dk/DI0ObSL8s7Tsf6H8FL/p2BJw2LhgtxPnFZUmpanpoMO0hC9/qjXNd+aGPV0/w==}
|
||||
engines: {node: '>=20.0.0'}
|
||||
peerDependencies:
|
||||
'@aws-sdk/client-s3': ^3.985.0
|
||||
|
||||
'@aws-sdk/middleware-bucket-endpoint@3.873.0':
|
||||
resolution: {integrity: sha512-b4bvr0QdADeTUs+lPc9Z48kXzbKHXQKgTvxx/jXDgSW9tv4KmYPO1gIj6Z9dcrBkRWQuUtSW3Tu2S5n6pe+zeg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3300,6 +3315,10 @@ packages:
|
||||
resolution: {integrity: sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/abort-controller@4.2.8':
|
||||
resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/chunked-blob-reader-native@4.0.0':
|
||||
resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3312,6 +3331,10 @@ packages:
|
||||
resolution: {integrity: sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/core@3.22.1':
|
||||
resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/core@3.9.0':
|
||||
resolution: {integrity: sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3344,6 +3367,10 @@ packages:
|
||||
resolution: {integrity: sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/fetch-http-handler@5.3.9':
|
||||
resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/hash-blob-browser@4.0.5':
|
||||
resolution: {integrity: sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3368,6 +3395,10 @@ packages:
|
||||
resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/is-array-buffer@4.2.0':
|
||||
resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/md5-js@4.0.5':
|
||||
resolution: {integrity: sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3380,6 +3411,10 @@ packages:
|
||||
resolution: {integrity: sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/middleware-endpoint@4.4.13':
|
||||
resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/middleware-retry@4.1.20':
|
||||
resolution: {integrity: sha512-T3maNEm3Masae99eFdx1Q7PIqBBEVOvRd5hralqKZNeIivnoGNx5OFtI3DiZ5gCjUkl0mNondlzSXeVxkinh7Q==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3388,34 +3423,66 @@ packages:
|
||||
resolution: {integrity: sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/middleware-serde@4.2.9':
|
||||
resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/middleware-stack@4.0.5':
|
||||
resolution: {integrity: sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/middleware-stack@4.2.8':
|
||||
resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/node-config-provider@4.1.4':
|
||||
resolution: {integrity: sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/node-config-provider@4.3.8':
|
||||
resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/node-http-handler@4.1.1':
|
||||
resolution: {integrity: sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/node-http-handler@4.4.9':
|
||||
resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/property-provider@4.0.5':
|
||||
resolution: {integrity: sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/property-provider@4.2.8':
|
||||
resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/protocol-http@5.1.3':
|
||||
resolution: {integrity: sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/protocol-http@5.3.8':
|
||||
resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/querystring-builder@4.0.5':
|
||||
resolution: {integrity: sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/querystring-builder@4.2.8':
|
||||
resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/querystring-parser@4.0.5':
|
||||
resolution: {integrity: sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/querystring-parser@4.2.8':
|
||||
resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/service-error-classification@4.0.7':
|
||||
resolution: {integrity: sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3424,14 +3491,26 @@ packages:
|
||||
resolution: {integrity: sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/shared-ini-file-loader@4.4.3':
|
||||
resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/signature-v4@5.1.3':
|
||||
resolution: {integrity: sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/smithy-client@4.11.2':
|
||||
resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/smithy-client@4.5.0':
|
||||
resolution: {integrity: sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/types@4.12.0':
|
||||
resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/types@4.3.2':
|
||||
resolution: {integrity: sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3440,14 +3519,26 @@ packages:
|
||||
resolution: {integrity: sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/url-parser@4.2.8':
|
||||
resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-base64@4.0.0':
|
||||
resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-base64@4.3.0':
|
||||
resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-body-length-browser@4.0.0':
|
||||
resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-body-length-browser@4.2.0':
|
||||
resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-body-length-node@4.0.0':
|
||||
resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3460,6 +3551,10 @@ packages:
|
||||
resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-buffer-from@4.2.0':
|
||||
resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-config-provider@4.0.0':
|
||||
resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3480,10 +3575,18 @@ packages:
|
||||
resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-hex-encoding@4.2.0':
|
||||
resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-middleware@4.0.5':
|
||||
resolution: {integrity: sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-middleware@4.2.8':
|
||||
resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-retry@4.0.7':
|
||||
resolution: {integrity: sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
@@ -3492,10 +3595,18 @@ packages:
|
||||
resolution: {integrity: sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-stream@4.5.11':
|
||||
resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-uri-escape@4.0.0':
|
||||
resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-uri-escape@4.2.0':
|
||||
resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-utf8@2.3.0':
|
||||
resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
@@ -3504,10 +3615,18 @@ packages:
|
||||
resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-utf8@4.2.0':
|
||||
resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/util-waiter@4.0.7':
|
||||
resolution: {integrity: sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@smithy/uuid@1.1.0':
|
||||
resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@socket.io/component-emitter@3.1.2':
|
||||
resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==}
|
||||
|
||||
@@ -3779,6 +3898,11 @@ packages:
|
||||
peerDependencies:
|
||||
'@tiptap/core': ^2.7.0
|
||||
|
||||
'@tiptap/extension-typography@3.18.0':
|
||||
resolution: {integrity: sha512-zTNGJjhJG3lObUhhTbDC1IOyi1DCiCd6i11xsnJDPy5BODYc7t7ZP6VMOWU0LIuMsK9kX02dXoNU7OarJgLpCg==}
|
||||
peerDependencies:
|
||||
'@tiptap/core': ^3.18.0
|
||||
|
||||
'@tiptap/pm@2.26.1':
|
||||
resolution: {integrity: sha512-8aF+mY/vSHbGFqyG663ds84b+vca5Lge3tHdTMTKazxCnhXR9dn2oQJMnZ78YZvdRbkPkMJJHti9h3K7u2UQvw==}
|
||||
|
||||
@@ -4478,6 +4602,9 @@ packages:
|
||||
buffer-from@1.1.2:
|
||||
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
||||
|
||||
buffer@5.6.0:
|
||||
resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==}
|
||||
|
||||
buffer@5.7.1:
|
||||
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
|
||||
|
||||
@@ -7752,6 +7879,9 @@ packages:
|
||||
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
stream-browserify@3.0.0:
|
||||
resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
|
||||
|
||||
string-width@4.2.3:
|
||||
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -8894,6 +9024,17 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- aws-crt
|
||||
|
||||
'@aws-sdk/lib-storage@3.985.0(@aws-sdk/client-s3@3.879.0)':
|
||||
dependencies:
|
||||
'@aws-sdk/client-s3': 3.879.0
|
||||
'@smithy/abort-controller': 4.2.8
|
||||
'@smithy/middleware-endpoint': 4.4.13
|
||||
'@smithy/smithy-client': 4.11.2
|
||||
buffer: 5.6.0
|
||||
events: 3.3.0
|
||||
stream-browserify: 3.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@aws-sdk/middleware-bucket-endpoint@3.873.0':
|
||||
dependencies:
|
||||
'@aws-sdk/types': 3.862.0
|
||||
@@ -11328,6 +11469,11 @@ snapshots:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/abort-controller@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/chunked-blob-reader-native@4.0.0':
|
||||
dependencies:
|
||||
'@smithy/util-base64': 4.0.0
|
||||
@@ -11345,6 +11491,19 @@ snapshots:
|
||||
'@smithy/util-middleware': 4.0.5
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/core@3.22.1':
|
||||
dependencies:
|
||||
'@smithy/middleware-serde': 4.2.9
|
||||
'@smithy/protocol-http': 5.3.8
|
||||
'@smithy/types': 4.12.0
|
||||
'@smithy/util-base64': 4.3.0
|
||||
'@smithy/util-body-length-browser': 4.2.0
|
||||
'@smithy/util-middleware': 4.2.8
|
||||
'@smithy/util-stream': 4.5.11
|
||||
'@smithy/util-utf8': 4.2.0
|
||||
'@smithy/uuid': 1.1.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/core@3.9.0':
|
||||
dependencies:
|
||||
'@smithy/middleware-serde': 4.0.9
|
||||
@@ -11405,6 +11564,14 @@ snapshots:
|
||||
'@smithy/util-base64': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/fetch-http-handler@5.3.9':
|
||||
dependencies:
|
||||
'@smithy/protocol-http': 5.3.8
|
||||
'@smithy/querystring-builder': 4.2.8
|
||||
'@smithy/types': 4.12.0
|
||||
'@smithy/util-base64': 4.3.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/hash-blob-browser@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/chunked-blob-reader': 5.0.0
|
||||
@@ -11438,6 +11605,10 @@ snapshots:
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/is-array-buffer@4.2.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/md5-js@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
@@ -11461,6 +11632,17 @@ snapshots:
|
||||
'@smithy/util-middleware': 4.0.5
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/middleware-endpoint@4.4.13':
|
||||
dependencies:
|
||||
'@smithy/core': 3.22.1
|
||||
'@smithy/middleware-serde': 4.2.9
|
||||
'@smithy/node-config-provider': 4.3.8
|
||||
'@smithy/shared-ini-file-loader': 4.4.3
|
||||
'@smithy/types': 4.12.0
|
||||
'@smithy/url-parser': 4.2.8
|
||||
'@smithy/util-middleware': 4.2.8
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/middleware-retry@4.1.20':
|
||||
dependencies:
|
||||
'@smithy/node-config-provider': 4.1.4
|
||||
@@ -11480,11 +11662,22 @@ snapshots:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/middleware-serde@4.2.9':
|
||||
dependencies:
|
||||
'@smithy/protocol-http': 5.3.8
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/middleware-stack@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/middleware-stack@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/node-config-provider@4.1.4':
|
||||
dependencies:
|
||||
'@smithy/property-provider': 4.0.5
|
||||
@@ -11492,6 +11685,13 @@ snapshots:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/node-config-provider@4.3.8':
|
||||
dependencies:
|
||||
'@smithy/property-provider': 4.2.8
|
||||
'@smithy/shared-ini-file-loader': 4.4.3
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/node-http-handler@4.1.1':
|
||||
dependencies:
|
||||
'@smithy/abort-controller': 4.0.5
|
||||
@@ -11500,27 +11700,56 @@ snapshots:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/node-http-handler@4.4.9':
|
||||
dependencies:
|
||||
'@smithy/abort-controller': 4.2.8
|
||||
'@smithy/protocol-http': 5.3.8
|
||||
'@smithy/querystring-builder': 4.2.8
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/property-provider@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/property-provider@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/protocol-http@5.1.3':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/protocol-http@5.3.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/querystring-builder@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
'@smithy/util-uri-escape': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/querystring-builder@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
'@smithy/util-uri-escape': 4.2.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/querystring-parser@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/querystring-parser@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/service-error-classification@4.0.7':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
@@ -11530,6 +11759,11 @@ snapshots:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/shared-ini-file-loader@4.4.3':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/signature-v4@5.1.3':
|
||||
dependencies:
|
||||
'@smithy/is-array-buffer': 4.0.0
|
||||
@@ -11541,6 +11775,16 @@ snapshots:
|
||||
'@smithy/util-utf8': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/smithy-client@4.11.2':
|
||||
dependencies:
|
||||
'@smithy/core': 3.22.1
|
||||
'@smithy/middleware-endpoint': 4.4.13
|
||||
'@smithy/middleware-stack': 4.2.8
|
||||
'@smithy/protocol-http': 5.3.8
|
||||
'@smithy/types': 4.12.0
|
||||
'@smithy/util-stream': 4.5.11
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/smithy-client@4.5.0':
|
||||
dependencies:
|
||||
'@smithy/core': 3.9.0
|
||||
@@ -11551,6 +11795,10 @@ snapshots:
|
||||
'@smithy/util-stream': 4.2.4
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/types@4.12.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/types@4.3.2':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
@@ -11561,16 +11809,32 @@ snapshots:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/url-parser@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/querystring-parser': 4.2.8
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-base64@4.0.0':
|
||||
dependencies:
|
||||
'@smithy/util-buffer-from': 4.0.0
|
||||
'@smithy/util-utf8': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-base64@4.3.0':
|
||||
dependencies:
|
||||
'@smithy/util-buffer-from': 4.2.0
|
||||
'@smithy/util-utf8': 4.2.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-body-length-browser@4.0.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-body-length-browser@4.2.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-body-length-node@4.0.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
@@ -11585,6 +11849,11 @@ snapshots:
|
||||
'@smithy/is-array-buffer': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-buffer-from@4.2.0':
|
||||
dependencies:
|
||||
'@smithy/is-array-buffer': 4.2.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-config-provider@4.0.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
@@ -11617,11 +11886,20 @@ snapshots:
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-hex-encoding@4.2.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-middleware@4.0.5':
|
||||
dependencies:
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-middleware@4.2.8':
|
||||
dependencies:
|
||||
'@smithy/types': 4.12.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-retry@4.0.7':
|
||||
dependencies:
|
||||
'@smithy/service-error-classification': 4.0.7
|
||||
@@ -11639,10 +11917,25 @@ snapshots:
|
||||
'@smithy/util-utf8': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-stream@4.5.11':
|
||||
dependencies:
|
||||
'@smithy/fetch-http-handler': 5.3.9
|
||||
'@smithy/node-http-handler': 4.4.9
|
||||
'@smithy/types': 4.12.0
|
||||
'@smithy/util-base64': 4.3.0
|
||||
'@smithy/util-buffer-from': 4.2.0
|
||||
'@smithy/util-hex-encoding': 4.2.0
|
||||
'@smithy/util-utf8': 4.2.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-uri-escape@4.0.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-uri-escape@4.2.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-utf8@2.3.0':
|
||||
dependencies:
|
||||
'@smithy/util-buffer-from': 2.2.0
|
||||
@@ -11653,12 +11946,21 @@ snapshots:
|
||||
'@smithy/util-buffer-from': 4.0.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-utf8@4.2.0':
|
||||
dependencies:
|
||||
'@smithy/util-buffer-from': 4.2.0
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/util-waiter@4.0.7':
|
||||
dependencies:
|
||||
'@smithy/abort-controller': 4.0.5
|
||||
'@smithy/types': 4.3.2
|
||||
tslib: 2.8.1
|
||||
|
||||
'@smithy/uuid@1.1.0':
|
||||
dependencies:
|
||||
tslib: 2.8.1
|
||||
|
||||
'@socket.io/component-emitter@3.1.2': {}
|
||||
|
||||
'@standard-schema/spec@1.0.0': {}
|
||||
@@ -11919,6 +12221,10 @@ snapshots:
|
||||
dependencies:
|
||||
'@tiptap/core': 2.26.1(@tiptap/pm@2.26.1)
|
||||
|
||||
'@tiptap/extension-typography@3.18.0(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))':
|
||||
dependencies:
|
||||
'@tiptap/core': 2.26.1(@tiptap/pm@2.26.1)
|
||||
|
||||
'@tiptap/pm@2.26.1':
|
||||
dependencies:
|
||||
prosemirror-changeset: 2.3.1
|
||||
@@ -12778,6 +13084,11 @@ snapshots:
|
||||
|
||||
buffer-from@1.1.2: {}
|
||||
|
||||
buffer@5.6.0:
|
||||
dependencies:
|
||||
base64-js: 1.5.1
|
||||
ieee754: 1.2.1
|
||||
|
||||
buffer@5.7.1:
|
||||
dependencies:
|
||||
base64-js: 1.5.1
|
||||
@@ -16898,6 +17209,11 @@ snapshots:
|
||||
es-errors: 1.3.0
|
||||
internal-slot: 1.1.0
|
||||
|
||||
stream-browserify@3.0.0:
|
||||
dependencies:
|
||||
inherits: 2.0.4
|
||||
readable-stream: 3.6.2
|
||||
|
||||
string-width@4.2.3:
|
||||
dependencies:
|
||||
emoji-regex: 8.0.0
|
||||
|
||||
Reference in New Issue
Block a user