Compare commits

..

4 Commits

Author SHA1 Message Date
Henry
902a539d73 fix: temp ignore eslint errors on build 2025-12-13 21:56:27 +00:00
Henry
7fef9be638 chore: update lockfile 2025-12-13 21:31:17 +00:00
Henry
c7473062aa chore: remove old due date filters 2025-12-13 21:30:15 +00:00
Henry
920e9b18a2 fix: enable sessions for API keys 2025-12-13 21:15:54 +00:00
88 changed files with 1542 additions and 7289 deletions

View File

@@ -34,8 +34,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
# Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer
@@ -76,42 +74,6 @@ jobs:
type=semver,pattern={{major}}
type=raw,value=latest,enable={{is_default_branch}}
# Extract version from git tag or ref
# Uses git describe to get latest tag + commit hash in SemVer format: 1.2.3+abc1234
- name: Extract version
id: version
run: |
if [[ "${{ github.ref_type }}" == "tag" ]]; then
VERSION="${{ github.ref_name }}"
# Remove 'v' prefix if present
VERSION="${VERSION#v}"
else
# Use git describe and simplify: v1.2.3-5-gabc1234 -> 1.2.3+abc1234
GIT_DESCRIBE=$(git describe --tags --always --long 2>/dev/null || echo "")
if [[ -n "$GIT_DESCRIBE" ]]; then
# Match pattern: v1.2.3-5-gabc1234 (tag-commits-gcommit)
if [[ "$GIT_DESCRIBE" =~ ^v?([0-9]+\.[0-9]+\.[0-9]+)-[0-9]+-g([a-f0-9]+)$ ]]; then
# Format as tag+commit (SemVer build metadata)
TAG_VERSION="${BASH_REMATCH[1]}"
COMMIT_HASH="${BASH_REMATCH[2]}"
VERSION="${TAG_VERSION}+${COMMIT_HASH:0:7}"
elif [[ "$GIT_DESCRIBE" =~ ^v?([0-9]+\.[0-9]+\.[0-9]+)$ ]]; then
# Exactly on a tag
VERSION="${BASH_REMATCH[1]}"
else
# Fallback: just commit hash
COMMIT_SHA="${{ github.sha }}"
VERSION="${COMMIT_SHA:0:7}"
fi
else
# No tags exist, use commit hash
COMMIT_SHA="${{ github.sha }}"
VERSION="${COMMIT_SHA:0:7}"
fi
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Version: $VERSION"
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
@@ -124,8 +86,6 @@ jobs:
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
APP_VERSION=${{ steps.version.outputs.version }}
cache-from: type=gha
cache-to: type=gha,mode=max

1
.gitignore vendored
View File

@@ -34,7 +34,6 @@ yarn-error.log*
.env
.env*.local
# vercel
.vercel

315
AGENTS.md
View File

@@ -1,315 +0,0 @@
# AGENTS.md
## Project Overview
Kan is an open-source project management tool (Trello alternative) built with:
- **Frontend**: Next.js, React, TypeScript, Tailwind CSS
- **Backend**: tRPC, Node.js
- **Database**: PostgreSQL with Drizzle ORM
- **Monorepo**: pnpm workspaces with Turbo
- **Auth**: Better Auth
- **Internationalization**: Lingui
## Setup Commands
- Install deps: `pnpm install`
- Start dev server: `pnpm dev`
- Create migrations: `cd packages/db && pnpm drizzle-kit generate --name "AddFieldToTable"`
- Run database migrations: `pnpm db:migrate`
- Run linter: `pnpm lint`
- Run type check: `pnpm typecheck`
- Format code: `pnpm format:fix`
- Extract i18n strings: `pnpm lingui:extract`
## Project Structure
- `apps/web/` - Next.js web application
- `packages/api/` - tRPC API routers
- `packages/db/` - Database schema, migrations, and repositories
- `packages/auth/` - Authentication package
- `packages/shared/` - Shared utilities
- `packages/email/` - Email templates and sending
- `packages/stripe/` - Stripe integration
- `tooling/` - Shared tooling configs (ESLint, Prettier, TypeScript)
## Code Style
### TypeScript
- Use TypeScript strictly - avoid `any` types
- Prefer explicit types over inference when it improves clarity
- Use `as const` for literal types when appropriate
- Follow existing patterns for type definitions
### Naming Conventions
- **Files**: kebab-case for files (e.g., `card-repo.ts`)
- **Components**: PascalCase for React components
- **Functions**: camelCase for functions
- **Constants**: UPPER_SNAKE_CASE for constants
- **Types/Interfaces**: PascalCase
### Database Layer (`packages/db/`)
- **Schema**: Define schemas in `src/schema/` using Drizzle ORM
- **Migrations**: Create migrations with `cd packages/db && pnpm drizzle-kit generate --name "MigrationName"`, then run with `pnpm db:migrate`
- **Repositories**: Put database queries in `src/repository/` files
- **Soft Deletes**: Use `deletedAt` timestamp for soft deletion (not hard deletes)
- **Index Management**: Cards have `index` fields that must be maintained sequentially per list
- **Activity Logging**: Use `card_activity` table to track all card changes
### API Layer (`packages/api/`)
- **Routers**: Create tRPC routers in `src/routers/`
- **Procedures**: Use `protectedProcedure` for authenticated endpoints, `publicProcedure` for public
- **Validation**: Use Zod schemas for input validation
- **Error Handling**: Use `TRPCError` with appropriate error codes
- **OpenAPI**: Add OpenAPI metadata for all endpoints
- **Authorization**: Always check workspace membership with `assertUserInWorkspace`
### Frontend (`apps/web/`)
- **Components**: React components in `src/components/`
- **Views**: Page-level components in `src/views/`
- **Hooks**: Custom hooks in `src/hooks/`
- **i18n**: Use `t` template literal for translations (Lingui)
- **Styling**: Use Tailwind CSS classes
- **State Management**: Use tRPC React Query hooks for server state
- **Modals**: Use `useModal` hook for modal management
- **Popups**: Use `usePopup` hook for toast notifications
## Key Concepts
### Cards
- Cards are the main entity in Kan
- Cards belong to Lists, which belong to Boards
- Cards have: title, description, labels, members, checklists, comments, attachments, due dates
- Cards use soft deletion (`deletedAt` field)
- Cards have an `index` field that must be maintained sequentially per list
- All card changes are tracked in `card_activity` table
### Activity Tracking
- Every significant card change creates an activity record
- Activity types include: created, updated (various fields), etc.
- Activities are displayed in card activity feeds
### Workspaces & Boards
- Users belong to Workspaces
- Boards belong to Workspaces
- Workspace members have different permission levels
- Boards can be public or private
### Soft Deletion Pattern
- Entities use `deletedAt` timestamp for soft deletion
- Queries filter with `isNull(table.deletedAt)` to exclude deleted items
## File Locations Reference
### Database
- Schema: `packages/db/src/schema/*.ts`
- Repositories: `packages/db/src/repository/*.repo.ts`
- Migrations: `packages/db/migrations/`
### API
- Routers: `packages/api/src/routers/*.ts`
- Utils: `packages/api/src/utils/`
- Types: `packages/api/src/types/`
### Frontend
- Components: `apps/web/src/components/`
- Views: `apps/web/src/views/`
- Pages: `apps/web/src/pages/`
- Hooks: `apps/web/src/hooks/`
- Utils: `apps/web/src/utils/`
- Locales: `apps/web/src/locales/`
## Database Patterns
- **Soft Deletes**: Always filter with `isNull(table.deletedAt)` in queries
- **Public IDs**: Use 12-character public IDs (`publicId`) for all user-facing entities
- **Internal IDs**: Never expose internal database IDs (e.g., `id`, `cardId`, `listId`) in API responses or URLs - always use `publicId` externally
- **Transactions**: Use database transactions for multi-step operations
- **Index Management**: When deleting/moving cards, maintain sequential indices
- **Activity Tracking**: Create activity records for all significant changes
## API Patterns
- **Input Validation**: Always validate inputs with Zod
- **Error Messages**: Provide clear, user-friendly error messages
- **Optimistic Updates**: Use tRPC's `onMutate` for optimistic UI updates
- **Cache Invalidation**: Properly invalidate queries after mutations
- **ID Exposure**: Never expose internal database IDs (`id`, `cardId`, `listId`, etc.) in API responses, URLs, or frontend code - always use `publicId` for external communication
## Important Patterns
### Card Index Management
When cards are created, moved, or deleted, their indices must be maintained:
- New cards: Append to end (max index + 1) or insert at position
- Moving cards: Adjust indices of affected cards
- Deleting cards: Decrement indices of cards after deleted one
- Always use transactions for index updates
### Activity Logging
Create activity records for:
- Card creation
- Card updates (title, description, list, etc.)
- Label/member additions/removals
- Comments
- Checklists and items
- Attachments
- Due dates
### Authorization
Always check:
1. User is authenticated
2. User has access to workspace
3. User has permission for the operation
Use `assertUserInWorkspace` helper for workspace checks.
### Error Handling
- Use TRPCError with appropriate codes (UNAUTHORIZED, NOT_FOUND, etc.)
- Provide user-friendly error messages
- Log errors appropriately
- Show popup notifications for user-facing errors
## Common Patterns
### Creating a Card
1. Create card in repository with proper index management
2. Create `card.created` activity
3. Handle label/member relationships if provided
4. Return the created card
### Updating a Card
1. Validate user has workspace access
2. Update card fields
3. Create appropriate activity records
4. Invalidate relevant queries
### Querying Cards
- Always filter by `isNull(cards.deletedAt)` in queries
- Include related data (labels, members, checklists) via Drizzle relations
- Order by `index` for proper card ordering
## Adding a New Feature
1. **Database**: Update schema in `packages/db/src/schema/`
2. **Migration**: Create migration with `cd packages/db && pnpm drizzle-kit generate --name "MigrationName"`, then run with `pnpm db:migrate`
3. **Repository**: Add repository functions in `packages/db/src/repository/`
4. **API**: Add tRPC router procedures in `packages/api/src/routers/`
5. **Frontend**: Add UI components in `apps/web/src/`
6. **i18n**: Add translations for new strings
## Database Changes
- Always create migrations (never modify existing migrations)
- Create migrations with: `cd packages/db && pnpm drizzle-kit generate --name "MigrationName"`
- Run migrations with: `pnpm db:migrate`
- Update schema files in `packages/db/src/schema/`
- Test migrations on development database first
- Update TypeScript types after schema changes
- Consider index management for card operations
## API Endpoints
- Use tRPC procedures (not REST)
- Add OpenAPI metadata for documentation
- Validate inputs with Zod
- Check workspace permissions
- Create activity records for significant changes
## Frontend Components
- Use Tailwind for styling
- Follow existing component patterns
- Use tRPC hooks for data fetching
- Implement optimistic updates where appropriate
- Add proper loading and error states
## Testing Instructions
- Test database operations in transactions that rollback
- Test authorization checks
- Test index management when moving/deleting cards
- Test activity logging
- Test UI interactions
- Run `pnpm lint` and `pnpm typecheck` before committing
## Performance Considerations
- Use database indexes appropriately
- Batch operations when possible
- Avoid N+1 queries
- Use transactions for related operations
- Implement optimistic updates in UI
## Security
- Always check workspace membership before operations
- Validate all inputs
- Never expose internal database IDs (`id`, `cardId`, `listId`, etc.) in API responses, URLs, or frontend code - always use `publicId` externally
- Sanitize user input
## Internationalization
- All user-facing strings must use `t` template literal
- Add translations to locale files in `apps/web/src/locales/`
- Run `pnpm lingui:extract` to update translation files
- Update locale files for all languages
## Dependencies
- Use workspace dependencies (`workspace:*`) for internal packages
- Keep dependencies up to date
- Use catalog for shared dependency versions
## When Implementing Features
### Adding New Card Fields
1. Update schema in `packages/db/src/schema/cards.ts`
2. Create migration
3. Update repository functions
4. Add API endpoints
5. Update frontend components
6. Add activity tracking if needed
### Adding New Activity Types
1. Add to `activityTypes` array in schema
2. Create migration to update enum
3. Use in activity creation code
4. Update activity display components if needed
## Git & Commits
- Use conventional commits: `feat:`, `fix:`, `refactor:`, `docs:`, etc.
- Keep commits focused on single changes
- Reference issue numbers when applicable
## PR Instructions
- Title format: `feat: description` or `fix: description`
- Always run `pnpm lint` and `pnpm typecheck` before committing
- Provide clear description of changes
- Include screenshots for UI changes
- Keep PRs focused on a single feature/fix

View File

@@ -138,45 +138,44 @@ pnpm dev
## Environment Variables 🔐
| Variable | Description | Required | Example |
| ----------------------------------------- | --------------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------- |
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
| `EMAIL_FROM` | Sender email address | For Email | `"Kan <hello@mail.kan.bn>"` |
| `SMTP_HOST` | SMTP server hostname | For Email | `smtp.resend.com` |
| `SMTP_PORT` | SMTP server port | For Email | `465` |
| `SMTP_USER` | SMTP username/email | No | `resend` |
| `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` |
| `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` |
| `SMTP_REJECT_UNAUTHORIZED` | Reject invalid certificates (defaults to true if not set) | For Email | `false` |
| `NEXT_PUBLIC_DISABLE_EMAIL` | To disable all email features | For Email | `true` |
| `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` |
| `BETTER_AUTH_ALLOWED_DOMAINS` | Comma-separated list of allowed domains for OIDC logins | For OIDC/Social login | `example.com,subsidiary.com` |
| `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string |
| `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` |
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | For Google login | `xxx.apps.googleusercontent.com` |
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | For Google login | `xxx` |
| `DISCORD_CLIENT_ID` | Discord OAuth client ID | For Discord login | `xxx` |
| `DISCORD_CLIENT_SECRET` | Discord OAuth client secret | For Discord login | `xxx` |
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | For GitHub login | `xxx` |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | For GitHub login | `xxx` |
| `OIDC_CLIENT_ID` | Generic OIDC client ID | For OIDC login | `xxx` |
| `OIDC_CLIENT_SECRET` | Generic OIDC client secret | For OIDC login | `xxx` |
| `OIDC_DISCOVERY_URL` | OIDC discovery URL | For OIDC login | `https://auth.example.com/.well-known/openid-configuration` |
| `TRELLO_APP_API_KEY` | Trello app API key | For Trello import | `xxx` |
| `TRELLO_APP_API_SECRET` | Trello app API secret | For Trello import | `xxx` |
| `S3_REGION` | S3 storage region | For file uploads | `WEUR` |
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
| Variable | Description | Required | Example |
| ----------------------------------------- | --------------------------------------------------------- | ------------------------ | ----------------------------------------------------------- |
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
| `EMAIL_FROM` | Sender email address | For Email | `"Kan <hello@mail.kan.bn>"` |
| `SMTP_HOST` | SMTP server hostname | For Email | `smtp.resend.com` |
| `SMTP_PORT` | SMTP server port | For Email | `465` |
| `SMTP_USER` | SMTP username/email | No | `resend` |
| `SMTP_PASSWORD` | SMTP password/token | No | `re_xxxx` |
| `SMTP_SECURE` | Use secure SMTP connection (defaults to true if not set) | For Email | `true` |
| `SMTP_REJECT_UNAUTHORIZED` | Reject invalid certificates (defaults to true if not set) | For Email | `false` |
| `NEXT_PUBLIC_DISABLE_EMAIL` | To disable all email features | For Email | `true` |
| `NEXT_PUBLIC_BASE_URL` | Base URL of your installation | Yes | `http://localhost:3000` |
| `BETTER_AUTH_ALLOWED_DOMAINS` | Comma-separated list of allowed domains for OIDC logins | For OIDC/Social login | `example.com,subsidiary.com` |
| `BETTER_AUTH_SECRET` | Auth encryption secret | Yes | Random 32+ char string |
| `BETTER_AUTH_TRUSTED_ORIGINS` | Allowed callback origins | No | `http://localhost:3000,http://localhost:3001` |
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | For Google login | `xxx.apps.googleusercontent.com` |
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | For Google login | `xxx` |
| `DISCORD_CLIENT_ID` | Discord OAuth client ID | For Discord login | `xxx` |
| `DISCORD_CLIENT_SECRET` | Discord OAuth client secret | For Discord login | `xxx` |
| `GITHUB_CLIENT_ID` | GitHub OAuth client ID | For GitHub login | `xxx` |
| `GITHUB_CLIENT_SECRET` | GitHub OAuth client secret | For GitHub login | `xxx` |
| `OIDC_CLIENT_ID` | Generic OIDC client ID | For OIDC login | `xxx` |
| `OIDC_CLIENT_SECRET` | Generic OIDC client secret | For OIDC login | `xxx` |
| `OIDC_DISCOVERY_URL` | OIDC discovery URL | For OIDC login | `https://auth.example.com/.well-known/openid-configuration` |
| `TRELLO_APP_API_KEY` | Trello app API key | For Trello import | `xxx` |
| `TRELLO_APP_API_SECRET` | Trello app API secret | For Trello import | `xxx` |
| `S3_REGION` | S3 storage region | For file uploads | `WEUR` |
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads (optional with IRSA) | `xxx` |
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads (optional with IRSA) | `xxx` |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
| `NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME` | S3 bucket name for attachments | For file uploads | `attachments` |
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | Allow email & password login | For authentication | `true` |
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | Disable sign up | For authentication | `false` |
| `NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY` | Hide “Powered by kan.bn” on public boards (self-host) | For white labelling | `true` |
| `KAN_ADMIN_API_KEY` | Admin API key for stats and admin endpoints | For admin/monitoring | `your-secret-admin-key` |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |
| `NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME` | S3 bucket name for attachments | For file uploads | `attachments` |
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | Allow email & password login | For authentication | `true` |
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | Disable sign up | For authentication | `false` |
| `NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY` | Hide “Powered by kan.bn” on public boards (self-host) | For white labelling | `true` |
See `.env.example` for a complete list of supported environment variables.

View File

@@ -37,11 +37,9 @@ RUN turbo prune --scope=${PROJECT} --scope=@kan/db --docker
# 3. Build the project
FROM base AS builder
ARG PROJECT
ARG APP_VERSION
# Environment to skip .env validation on build
ENV CI=true
ENV NEXT_PUBLIC_APP_VERSION=${APP_VERSION}
WORKDIR /app

View File

@@ -27,7 +27,6 @@ checksums:
Add%20details.../singular: 2f42547fd5d199f173aa7a88c8a9b19a
Add%20label/singular: 0be732d46df263265935fda342097a08
Add%20member/singular: 11979625770516ca287e929381778e02
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
added%20a%20label%20to%20the%20card/singular: 04c5e4ee9b7b7e77ef089d2ac473d235
@@ -123,7 +122,6 @@ checksums:
Continue%20with%20/singular: 8ed03cf7c5e60a6edf3470a4558ff058
Continue%20with%20%7B0%7D/singular: 2eaf6e1da91e208f7c5fb6bf862fe8a6
Control%20who%20can%20view%20and%20edit%20your%20boards./singular: 2a7e0bec29bac26280de707e2fe8bce5
Convert%20to%20link/singular: 66210d2889031426c07f0b2c6c4c09d7
Core%20features/singular: da95932e7a1465a5d21aa3b855a46dc2
Create%20%7B0%7D/singular: d37c29be6ccc0eb6062237f8508c3178
Create%20another/singular: 2de8a82a416eb78c0462aa36278edc9a
@@ -184,17 +182,14 @@ checksums:
Due%20next%20week/singular: 2f8fac5719df18d25a466ee913dc6487
Due%20today/singular: a14cb9dd0003485894d328bb803c80e5
Due%20tomorrow/singular: 0b6c8ad7aba0873b7e212d5f1949ca97
Edit/singular: eee7f39ff90b18852afc1671f21fbaa9
Edit%20board%20URL/singular: d8276dfc0189f371ec7d80a2047c07aa
Edit%20comment/singular: 7e4b46525fcb6b47b71798e31c46e374
Edit%20label/singular: 0309e0be1512b1e0b0ceb87c69a53d03
Edit%20workspace%20URL/singular: bbae5f2f8a442947d33099979bbbe899
Edit%20YouTube%20Video/singular: 4899d9e990d291eb6e71ee40a8ee314b
Editing/singular: 3449a7988cd69207b7c6929af1f4abf1
email/singular: f31eb214738e037d58e26149797739df
Email/singular: e7f34943a0c2fb849db1839ff6ef5cb5
Enhancement/singular: 785fe23c0eef0a5b60b5b2a88151de31
Enter%20a%20custom%20title/singular: f002074db0bd51d4f28d2736e140370a
Enter%20your%20current%20password/singular: bfceabde4c0b6f2cb439015b76549651
Enter%20your%20current%20password%20and%20choose%20a%20new%20secure%20password./singular: 9bb88155b18e98ea799c0e939d16af64
Enter%20your%20email%20address/singular: 9bc008365ebe3e404e241c8ca876f56e
@@ -224,7 +219,6 @@ checksums:
Failed%20to%20accept%20invitation.%20Please%20try%20again%20later%2C%20or%20contact%20customer%20support./singular: e4505a9df3a81e93a8a8b103c6e3ebc4
Failed%20to%20copy%20invite%20link/singular: 635884d5ed8d6ee20b85a003939b4ae7
Failed%20to%20create%20board/singular: a746e2afe881c3bf0a8e82a931ca3495
Failed%20to%20fetch%20video%20information/singular: 1e3fd610e8ed3e6c4c66e6ce88fc8b7a
Failed%20to%20login%20with%20%7B0%7D.%20Please%20try%20again./singular: 669a4b4247a73f53fb9b8b16e42d166f
Failed%20to%20upload%20attachment.%20Please%20try%20again./singular: f8a50d1c8491404f73d3cf701e11f297
FAQ/singular: 47e0ee2eb40b4e7e732e05e2233fc71c
@@ -320,8 +314,6 @@ checksums:
List/singular: 94f13e7ef909a4de9db7abaa1f9f0b61
List%20name/singular: e925e2e6ccaf0eb4064a888aaea8d3c2
Lists/singular: 9f4a73afc8de321175d71935134ef066
Load%20more%20activities/singular: f32d40a739ffaa700051c4c7d70055cf
Loading.../singular: 82b4ea7ed1439094d7c4be13aaba9a66
Login%20%7C%20kan.bn/singular: 42a6c8dcd73e0d46e652646dc86871eb
Logout/singular: 07948fdf20705e04a7bf68ab197512bf
Long-term/singular: 51cb6f0b112250c5a091ca5f0866904b
@@ -396,7 +388,6 @@ checksums:
Please%20enter%20a%20valid%20email%20address/singular: 8de4bc8832b11b380bc4cbcedc16e48b
Please%20enter%20a%20valid%20name/singular: f2d741f1b5cae722e35cb5206786f932
Please%20enter%20a%20valid%20password/singular: 4b32c17e19b79bcbf0bb092c06ba310f
Please%20enter%20a%20valid%20YouTube%20URL/singular: c16c69c3b742b1e19148378d50adf37f
Please%20select%20a%20file%20to%20upload./singular: de315bf594047f8ef9307a7fa9285844
Please%20try%20again%20later%2C%20or%20contact%20customer%20support./singular: 21ffcf0b00e7cd7b64f7454a95762e1d
Please%20try%20again%20later./singular: 325dea6dd0348a27a6818db2c1340c98
@@ -418,7 +409,6 @@ checksums:
Remote/singular: dc3e4280dfe5c455b38ba6c8884999cf
Remove/singular: dba2fe5fe9f83f8078c687f28cba4b52
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%20label%20%3C0%3E%7B0%7D%3C%2F0%3E/singular: 7e0936b15831e65754588b8512f62fcb
@@ -502,7 +492,6 @@ checksums:
This%20workspace%20URL%20has%20already%20been%20taken/singular: b455329e2a71da677acab91d3a00bad6
This%20workspace%20URL%20is%20reserved/singular: 7e47c892b93d4334c1606010c06e875e
This%20workspace%20username%20has%20already%20been%20taken/singular: b7eadb89c615874f416d9658d0428c4c
Title/singular: 344e64395eaff6822a57d18623853e1a
To%20Do/singular: d60813ea824f373462471e092d136eed
Toggle%20menu/singular: 29dea3e0b6238874f8c7a27619df8e36
Track%20all%20card%20changes%20with%20detailed%20activity%20history./singular: 0d3bac559c71ec4b8734f9f212320de5
@@ -513,7 +502,6 @@ checksums:
Trusted%20by%20fast-moving%20teams%3C0%2F%3Earound%20the%20world/singular: b065575df380536df9541a91ca9b37bf
Unable%20to%20add%20checklist%20item/singular: 4c4c3eaaf10b348b39ae97eb5dc455df
Unable%20to%20add%20comment/singular: 49bb435880817434698f31a6069564d6
Unable%20to%20add%20label/singular: b09fda6420ea1dc10dbea0b1dc373f29
Unable%20to%20create%20card/singular: 90112ea12ec6fa42097a6e022ae048a4
Unable%20to%20create%20checklist/singular: 94eed122e42e0951cd08b9ec62f5eeb6
Unable%20to%20create%20list/singular: 7fbbf8314f8d08a4123c7daef09fed05
@@ -525,7 +513,6 @@ checksums:
Unable%20to%20delete%20checklist%20item/singular: a74144593b625e4d8d7ecf734462c60d
Unable%20to%20delete%20comment/singular: 550198b2c87f06726a843c79c1026ed9
Unable%20to%20remove%20member/singular: 39025a0c53818438829603d213baef06
Unable%20to%20reorder%20checklist%20item/singular: dcc238c72b85daf74ebd46adcd914473
Unable%20to%20send%20feedback/singular: 656c93265d7e2bef1245b17d85f85ae5
Unable%20to%20update%20board%20URL/singular: 080746884059142358b58d9a44ff7d93
Unable%20to%20update%20board%20visibility/singular: a76a21d561b8943e9276e027a1e3f70d
@@ -624,4 +611,3 @@ checksums:
Your%20workspace%20has%20been%20deleted./singular: e7a3efcfc7dd18cb3e917acb67498292
Your%20workspace%20name%20has%20been%20updated./singular: a87ea3b0d71e6dc5dd525d77114a9322
Your%20workspace%20slug%20has%20been%20updated./singular: c808949b9b2b4a9aba2472f5d1050167
YouTube%20URL/singular: 0b48896061a1124501fdaba026804148

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,4 +1,3 @@
import type { Range as TiptapRange } from "@tiptap/core";
import type { Editor as TiptapEditor } from "@tiptap/react";
import type {
SuggestionKeyDownProps,
@@ -45,7 +44,6 @@ import { Markdown } from "tiptap-markdown";
import { getAvatarUrl } from "~/utils/helpers";
import Avatar from "./Avatar";
import { YouTubeNode } from "./YouTubeEmbed/YouTubeNode";
declare module "@tiptap/core" {
interface Commands<ReturnType> {
@@ -58,7 +56,7 @@ declare module "@tiptap/core" {
export interface SlashCommandItem {
title: string;
icon?: React.ReactNode;
command?: (props: { editor: TiptapEditor; range: TiptapRange }) => void;
command?: (props: { editor: TiptapEditor; range: Range }) => void;
disabled?: boolean;
}
@@ -433,14 +431,12 @@ export default function Editor({
onBlur,
readOnly = false,
workspaceMembers,
enableYouTubeEmbed = true,
}: {
content: string | null;
onChange?: (value: string) => void;
onBlur?: () => void;
readOnly?: boolean;
workspaceMembers: WorkspaceMember[];
enableYouTubeEmbed?: boolean;
}) {
const containerRef = useRef<HTMLDivElement>(null);
@@ -488,17 +484,10 @@ export default function Editor({
}),
);
const q = query.toLowerCase();
return all.filter(
(u) =>
u.label &&
typeof u.label === "string" &&
u.label.toLowerCase().includes(q),
);
return all.filter((u) => u.label.toLowerCase().includes(q));
},
command: ({ editor, range, props }) => {
const id = props.id ?? "";
const label = props.label ?? "";
const mentionHTML = `<span data-type="mention" data-id="${id}" data-label="${label}">@${label}</span>&nbsp;`;
command: ({ editor, range, props }: any) => {
const mentionHTML = `<span data-type="mention" data-id="${props.id}" data-label="${props.label}">@${props.label}</span>&nbsp;`;
editor
.chain()
@@ -514,7 +503,6 @@ export default function Editor({
return `${options.suggestion.char}${node.attrs.label ?? node.attrs.id}`;
},
}),
...(enableYouTubeEmbed ? [YouTubeNode] : []),
],
content,
onUpdate: ({ editor }) => onChange?.(editor.getHTML()),
@@ -571,9 +559,6 @@ export default function Editor({
text-decoration: none;
font-weight: 500;
}
.tiptap [data-youtube] {
margin: 1rem 0;
}
`}</style>
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
<EditorContent

View File

@@ -46,8 +46,7 @@ const Button: React.FC<{
onMouseEnter={handleMouseEnter}
onClick={handleClick}
className={twMerge(
"group flex h-[34px] items-center rounded-md p-1.5 text-sm font-normal leading-6 hover:bg-light-200 hover:text-light-1000 dark:hover:bg-dark-200 dark:hover:text-dark-1000",
isCollapsed ? "md:justify-center" : "justify-between",
"group flex h-[34px] items-center justify-between rounded-md p-1.5 text-sm font-normal leading-6 hover:bg-light-200 hover:text-light-1000 dark:hover:bg-dark-200 dark:hover:text-dark-1000",
current
? "bg-light-200 text-light-1000 dark:bg-dark-200 dark:text-dark-1000"
: "text-neutral-600 dark:bg-dark-100 dark:text-dark-900",

View File

@@ -9,7 +9,6 @@ import { twMerge } from "tailwind-merge";
import { authClient } from "@kan/auth/client";
import { env } from "~/env";
import { useIsMobile } from "~/hooks/useMediaQuery";
import { useKeyboardShortcuts } from "~/providers/keyboard-shortcuts";
import { useModal } from "~/providers/modal";
@@ -226,25 +225,6 @@ export default function UserMenu({
</button>
</Menu.Item>
</div>
{env.NEXT_PUBLIC_APP_VERSION && (
<div className="light-border-600 border-t-[1px] p-1 dark:border-dark-600">
<Menu.Item>
<Link
href={
env.NEXT_PUBLIC_APP_VERSION.includes("+")
? `https://github.com/kanbn/kan/commit/${env.NEXT_PUBLIC_APP_VERSION.split("+")[1]}`
: `https://github.com/kanbn/kan/releases/tag/v${env.NEXT_PUBLIC_APP_VERSION}`
}
target="_blank"
rel="noreferrer"
onClick={handleLinkClick}
className="flex w-full items-center justify-center rounded-[5px] px-3 py-2 text-center text-xs text-light-900 hover:bg-light-200 dark:text-dark-900 dark:hover:bg-dark-400"
>
Version: {env.NEXT_PUBLIC_APP_VERSION}
</Link>
</Menu.Item>
</div>
)}
</div>
</Menu.Items>
</Transition>

View File

@@ -1,189 +0,0 @@
import { t } from "@lingui/core/macro";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { HiXMark } from "react-icons/hi2";
import Button from "~/components/Button";
import Input from "~/components/Input";
import { useModal } from "~/providers/modal";
import { fetchYouTubeMetadata, isYouTubeUrl } from "./utils";
interface EditYouTubeFormInput {
url: string;
title: string;
}
interface EditYouTubeModalState {
url: string;
title: string;
onSave: (url: string, title: string) => void;
}
export function EditYouTubeModal() {
const { closeModal, getModalState } = useModal();
const [isValidating, setIsValidating] = useState(false);
const [urlError, setUrlError] = useState<string | null>(null);
// Get initial values and callback from modal state
const modalState = getModalState("EDIT_YOUTUBE") as
| EditYouTubeModalState
| undefined;
const initialUrl = modalState?.url ?? "";
const initialTitle = modalState?.title ?? "";
const onSave = modalState?.onSave;
const { register, handleSubmit, watch, reset } =
useForm<EditYouTubeFormInput>({
defaultValues: {
url: initialUrl,
title: initialTitle,
},
});
// Reset form when modal state changes (when modal opens with new values)
useEffect(() => {
if (modalState) {
reset({
url: modalState.url,
title: modalState.title,
});
}
}, [modalState, reset]);
const currentUrl = watch("url");
const onSubmit = async (values: EditYouTubeFormInput) => {
// Validate URL
if (!isYouTubeUrl(values.url)) {
setUrlError(t`Please enter a valid YouTube URL`);
return;
}
setUrlError(null);
setIsValidating(true);
try {
// If title is empty and URL changed, fetch new title
let finalTitle = values.title;
if (!finalTitle.trim() && values.url !== initialUrl) {
const metadata = await fetchYouTubeMetadata(values.url);
finalTitle = metadata?.title ?? "YouTube Video";
} else if (!finalTitle.trim()) {
// Keep existing title if no new title provided and URL unchanged
finalTitle = initialTitle || "YouTube Video";
}
if (onSave) {
onSave(values.url, finalTitle);
}
closeModal();
} catch (error) {
console.error(error);
setUrlError(t`Failed to fetch video information`);
} finally {
setIsValidating(false);
}
};
// Auto-focus on title input (more useful for editing)
useEffect(() => {
const titleElement: HTMLElement | null =
document.querySelector<HTMLElement>("#youtube-title");
if (titleElement) titleElement.focus();
}, []);
// Validate URL on change
useEffect(() => {
if (currentUrl && !isYouTubeUrl(currentUrl)) {
setUrlError(t`Please enter a valid YouTube URL`);
} else {
setUrlError(null);
}
}, [currentUrl]);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div className="px-5 pt-5">
<div className="flex w-full items-center justify-between pb-4 text-neutral-900 dark:text-dark-1000">
<h2 className="text-sm font-medium">{t`Edit YouTube Video`}</h2>
<button
type="button"
className="rounded p-1 hover:bg-light-300 focus:outline-none dark:hover:bg-dark-300"
onClick={(e) => {
e.preventDefault();
closeModal();
}}
>
<HiXMark size={18} className="text-light-900 dark:text-dark-900" />
</button>
</div>
<div className="space-y-4">
<div>
<label
htmlFor="youtube-title"
className="mb-2 block text-xs font-medium text-light-900 dark:text-dark-900"
>
{t`Title`}
</label>
<Input
id="youtube-title"
placeholder={t`Enter a custom title`}
{...register("title")}
onKeyDown={async (e) => {
if (e.key === "Enter") {
e.preventDefault();
await handleSubmit(onSubmit)();
}
}}
/>
</div>
<div>
<label
htmlFor="youtube-url"
className="mb-2 block text-xs font-medium text-light-900 dark:text-dark-900"
>
{t`YouTube URL`}
</label>
<Input
id="youtube-url"
placeholder={t`https://www.youtube.com/watch?v=...`}
{...register("url", { required: true })}
onKeyDown={async (e) => {
if (e.key === "Enter") {
e.preventDefault();
await handleSubmit(onSubmit)();
}
}}
/>
{urlError && (
<p className="mt-1 text-xs text-red-600 dark:text-red-400">
{urlError}
</p>
)}
</div>
</div>
</div>
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<div className="space-x-2">
<Button
type="button"
variant="secondary"
onClick={() => closeModal()}
>
{t`Cancel`}
</Button>
<Button
type="submit"
isLoading={isValidating}
disabled={!watch("url") || !!urlError}
>
{t`Save`}
</Button>
</div>
</div>
</form>
);
}

View File

@@ -1,53 +0,0 @@
import YouTubeDropdown from "./YouTubeDropdown";
interface YouTubeCardProps {
videoId: string;
url: string;
title: string;
showEmbed?: boolean;
onConvertToLink: () => void;
onDelete: () => void;
onUpdate: (url: string, title: string) => void;
}
const YouTubeCard = ({
videoId,
url,
title,
showEmbed = true,
onConvertToLink,
onDelete,
onUpdate,
}: YouTubeCardProps) => {
return (
<div className="w-full max-w-md rounded-lg border border-light-300 bg-light-50 dark:border-dark-300 dark:bg-dark-50">
<div className="flex items-center justify-between gap-6 p-0 px-6">
<h3 className="truncate text-sm font-medium">{title}</h3>
<div className="mt-3">
<YouTubeDropdown
url={url}
title={title}
onConvertToLink={onConvertToLink}
onDelete={onDelete}
onUpdate={onUpdate}
/>
</div>
</div>
{showEmbed && videoId && (
<div className="p-6 pt-1">
<iframe
src={`https://www.youtube.com/embed/${videoId}?rel=0`}
title={title}
className="aspect-video w-full rounded-lg"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerPolicy="strict-origin-when-cross-origin"
allowFullScreen
/>
</div>
)}
</div>
);
};
export default YouTubeCard;

View File

@@ -1,63 +0,0 @@
import { t } from "@lingui/core/macro";
import {
HiEllipsisHorizontal,
HiLink,
HiPencil,
HiTrash,
} from "react-icons/hi2";
import { useModal } from "~/providers/modal";
import Dropdown from "../Dropdown";
interface YouTubeDropdownProps {
url: string;
title: string;
onConvertToLink: () => void;
onDelete: () => void;
onUpdate: (url: string, title: string) => void;
}
const YouTubeDropdown = ({
url,
title,
onConvertToLink,
onDelete,
onUpdate,
}: YouTubeDropdownProps) => {
const { openModal, setModalState } = useModal();
const handleEdit = () => {
setModalState("EDIT_YOUTUBE", {
url,
title,
onSave: onUpdate,
});
openModal("EDIT_YOUTUBE");
};
return (
<Dropdown
items={[
{
label: t`Edit`,
action: handleEdit,
icon: <HiPencil className="h-4 w-4 text-dark-900" />,
},
{
label: t`Convert to link`,
action: onConvertToLink,
icon: <HiLink className="h-4 w-4 text-dark-900" />,
},
{
label: t`Delete`,
action: onDelete,
icon: <HiTrash className="h-4 w-4 text-dark-900" />,
},
]}
>
<HiEllipsisHorizontal className="h-5 w-5 text-dark-900" />
</Dropdown>
);
};
export default YouTubeDropdown;

View File

@@ -1,196 +0,0 @@
import { mergeAttributes, Node } from "@tiptap/core";
import { Plugin, PluginKey } from "@tiptap/pm/state";
import { ReactNodeViewRenderer } from "@tiptap/react";
import { extractVideoId, fetchYouTubeMetadata, isYouTubeUrl } from "./utils";
import YouTubeNodeView from "./YouTubeNodeView";
export interface YouTubeOptions {
inline: boolean;
HTMLAttributes: Record<string, undefined>;
}
declare module "@tiptap/core" {
interface Commands<ReturnType> {
youTube: {
setYouTubeEmbed: (options: {
videoId: string;
url: string;
title: string;
thumbnailUrl?: string;
showEmbed?: boolean;
}) => ReturnType;
};
}
}
export const YouTubeNode = Node.create<YouTubeOptions>({
name: "youtube",
group: "block",
atom: true,
addOptions() {
return {
inline: false,
HTMLAttributes: {},
};
},
addAttributes() {
return {
videoId: {
default: null,
parseHTML: (element) => element.getAttribute("data-video-id"),
renderHTML: (attributes) => {
if (!attributes.videoId) return {};
return { "data-video-id": attributes.videoId as string };
},
},
url: {
default: null,
parseHTML: (element) => element.getAttribute("data-url"),
renderHTML: (attributes) => {
if (!attributes.url) return {};
return { "data-url": attributes.url as string };
},
},
title: {
default: "YouTube Video",
parseHTML: (element) => element.getAttribute("data-title"),
renderHTML: (attributes) => {
return { "data-title": attributes.title as string };
},
},
thumbnailUrl: {
default: null,
parseHTML: (element) => element.getAttribute("data-thumbnail"),
renderHTML: (attributes) => {
if (!attributes.thumbnailUrl) return {};
return { "data-thumbnail": attributes.thumbnailUrl as string };
},
},
showEmbed: {
default: true,
parseHTML: (element) => element.getAttribute("data-show-embed"),
renderHTML: (attributes) => {
return { "data-show-embed": attributes.showEmbed as string };
},
},
};
},
parseHTML() {
return [
{
tag: "div[data-youtube]",
},
];
},
renderHTML({ HTMLAttributes }) {
return [
"div",
mergeAttributes(
{ "data-youtube": "" },
this.options.HTMLAttributes,
HTMLAttributes,
),
];
},
addNodeView() {
return ReactNodeViewRenderer(YouTubeNodeView);
},
addProseMirrorPlugins() {
const nodeType = this.type;
return [
new Plugin({
key: new PluginKey("youtubePaste"),
props: {
handlePaste: (view, event) => {
const text = event.clipboardData?.getData("text/plain");
if (!text) return false;
// Check if the pasted text is a YouTube URL
const youtubeRegex =
/(https?:\/\/)?(www\.)?(youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/embed\/)([\w-]+)/;
const match = youtubeRegex.exec(text);
if (!match || !isYouTubeUrl(text)) return false;
const videoId = extractVideoId(text);
if (!videoId) return false;
const { state, dispatch } = view;
const { tr } = state;
const node = nodeType.create({
videoId,
url: text,
title: "Loading...",
showEmbed: true,
});
tr.replaceSelectionWith(node);
dispatch(tr);
// Fetch metadata asynchronously and update the node
void fetchYouTubeMetadata(text).then((metadata) => {
const { state: newState, dispatch: newDispatch } = view;
const { tr: newTr } = newState;
newState.doc.descendants((n, pos) => {
if (
n.type.name === "youtube" &&
n.attrs.videoId === videoId &&
n.attrs.title === "Loading..."
) {
newTr.setNodeMarkup(pos, undefined, {
...n.attrs,
title: metadata?.title ?? "YouTube Video",
thumbnailUrl: metadata?.thumbnail_url ?? null,
});
return false;
}
return true;
});
if (newTr.docChanged) {
newDispatch(newTr);
}
});
return true;
},
},
}),
];
},
// commands for the YouTube embed node
addCommands() {
return {
setYouTubeEmbed:
(options: {
videoId: string;
url: string;
title?: string;
thumbnailUrl?: string;
showEmbed?: boolean;
}) =>
({ editor }) => {
return editor.commands.insertContent({
type: this.name,
attrs: {
videoId: options.videoId,
url: options.url,
title: options.title ?? "YouTube Video",
thumbnailUrl: options.thumbnailUrl,
showEmbed: options.showEmbed ?? true,
},
});
},
};
},
});

View File

@@ -1,82 +0,0 @@
import type { NodeViewProps } from "@tiptap/react";
import { NodeViewWrapper } from "@tiptap/react";
import { extractVideoId } from "./utils";
import YouTubeCard from "./YouTubeCard";
export default function YouTubeNodeView({
node,
editor,
getPos,
deleteNode,
updateAttributes,
}: NodeViewProps) {
const { videoId, title, url, showEmbed } = node.attrs as {
videoId: string;
title: string;
url: string;
showEmbed: boolean;
};
const handleConvertToLink = () => {
const pos = getPos();
if (typeof pos !== "number") return;
const linkContent = {
type: "paragraph",
content: [
{
type: "text",
text: url,
marks: [
{
type: "link",
attrs: {
href: url,
target: "_blank",
},
},
],
},
],
};
editor
.chain()
.focus()
.deleteRange({ from: pos, to: pos + node.nodeSize })
.insertContentAt(pos, linkContent)
.run();
};
const handleDelete = () => {
deleteNode();
};
const handleUpdate = (newUrl: string, newTitle: string) => {
if (newUrl !== url) {
const newVideoId = extractVideoId(newUrl);
updateAttributes({
url: newUrl,
title: newTitle,
videoId: newVideoId,
});
} else {
updateAttributes({ title: newTitle });
}
};
return (
<NodeViewWrapper>
<YouTubeCard
videoId={videoId}
url={url}
title={title}
showEmbed={showEmbed}
onConvertToLink={handleConvertToLink}
onDelete={handleDelete}
onUpdate={handleUpdate}
/>
</NodeViewWrapper>
);
}

View File

@@ -1,61 +0,0 @@
export function extractVideoId(url: string): string | null {
if (!url) return null;
url = url.trim();
// youtube.com/watch?v=VIDEO_ID
const watchMatch = /(?:youtube\.com\/watch\?v=)([a-zA-Z0-9_-]{11})/.exec(url);
if (watchMatch) return watchMatch[1] ?? null;
// youtu.be/VIDEO_ID
const shortMatch = /(?:youtu\.be\/)([a-zA-Z0-9_-]{11})/.exec(url);
if (shortMatch) return shortMatch[1] ?? null;
// youtube.com/embed/VIDEO_ID
const embedMatch = /(?:youtube\.com\/embed\/)([a-zA-Z0-9_-]{11})/.exec(url);
if (embedMatch) return embedMatch[1] ?? null;
return null;
}
/**
* Check if a URL is a valid YouTube link
*/
export function isYouTubeUrl(url: string): boolean {
if (!url) return false;
const videoId = extractVideoId(url);
return videoId !== null;
}
/**
* Fetch YouTube video metadata using oEmbed API
* Returns title, author, thumbnail URL, etc.
* No API key required
*/
export async function fetchYouTubeMetadata(url: string): Promise<{
title: string;
author_name: string;
thumbnail_url: string;
} | null> {
try {
const oembedUrl = `https://www.youtube.com/oembed?url=${encodeURIComponent(url)}&format=json`;
const response = await fetch(oembedUrl);
if (!response.ok) {
return null;
}
const data = (await response.json()) as {
title: string;
author_name: string;
thumbnail_url: string;
};
return {
title: data.title || "YouTube Video",
author_name: data.author_name || "",
thumbnail_url: data.thumbnail_url || "",
};
} catch (error) {
console.error("Failed to fetch YouTube metadata:", error);
return null;
}
}

View File

@@ -14,7 +14,6 @@ export const env = createEnv({
* This way you can ensure the app isn't built with invalid env vars.
*/
server: {
KAN_ADMIN_API_KEY: z.string().optional(),
BETTER_AUTH_SECRET: z.string(),
BETTER_AUTH_TRUSTED_ORIGINS: z
.string()
@@ -95,7 +94,6 @@ export const env = createEnv({
NEXT_PUBLIC_AVATAR_BUCKET_NAME: z.string().optional(),
NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME: z.string().optional(),
NEXT_PUBLIC_STORAGE_DOMAIN: z.string().optional(),
NEXT_PUBLIC_APP_VERSION: z.string().optional(),
NEXT_PUBLIC_ALLOW_CREDENTIALS: z
.string()
.transform((s) => (s === "" ? undefined : s))
@@ -133,7 +131,6 @@ export const env = createEnv({
NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME:
process.env.NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME,
NEXT_PUBLIC_STORAGE_DOMAIN: process.env.NEXT_PUBLIC_STORAGE_DOMAIN,
NEXT_PUBLIC_APP_VERSION: process.env.NEXT_PUBLIC_APP_VERSION,
NEXT_PUBLIC_ALLOW_CREDENTIALS: process.env.NEXT_PUBLIC_ALLOW_CREDENTIALS,
NEXT_PUBLIC_DISABLE_SIGN_UP: process.env.NEXT_PUBLIC_DISABLE_SIGN_UP,
NEXT_PUBLIC_USE_STANDALONE_OUTPUT:

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (bearbeitet)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} Labels"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} nicht gefunden"
@@ -83,7 +83,7 @@ msgstr "Konto gelöscht"
msgid "Actions"
msgstr "Aktionen"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Aktivität"
@@ -100,12 +100,12 @@ msgstr "Aktivitätsprotokolle"
msgid "Add a card"
msgstr "Karte hinzufügen"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Kommentar hinzufügen..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Element hinzufügen..."
@@ -113,57 +113,52 @@ msgstr "Element hinzufügen..."
msgid "Add checklist"
msgstr "Checkliste hinzufügen"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen oder '@' um jemanden zu erwähnen)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Details hinzufügen..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Label hinzufügen"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Mitglied hinzufügen"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "{0} Labels hinzugefügt: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "hat eine Checkliste hinzugefügt"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "hat ein Checklistenelement hinzugefügt"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "hat ein Label zur Karte hinzugefügt"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
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:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "hat Checkliste <0>{0}</0> hinzugefügt"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
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:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "hat Label <0>{0}</0> hinzugefügt"
@@ -254,11 +249,11 @@ msgstr "Sind Sie sicher, dass Sie diese(n) {0} löschen möchten?"
msgid "Are you sure you want to delete this card?"
msgstr "Bist du sicher, dass du diese Karte löschen möchtest?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Sind Sie sicher, dass Sie diese Checkliste löschen möchten?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
@@ -271,7 +266,7 @@ 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:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "hat <0>{0}</0> der Karte zugewiesen"
@@ -279,7 +274,7 @@ msgstr "hat <0>{0}</0> der Karte zugewiesen"
msgid "Assignees"
msgstr "Zugewiesene Personen"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Anhang hochgeladen"
@@ -317,9 +312,9 @@ msgstr "Abrechnungsportal"
msgid "Blog Post"
msgstr "Blogbeitrag"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Board"
@@ -336,7 +331,7 @@ msgstr "Der Name des Boards darf 100 Zeichen nicht überschreiten"
msgid "Board name is required"
msgstr "Boardname ist erforderlich"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Board nicht gefunden"
@@ -352,7 +347,7 @@ msgstr "Board-URL darf nur Buchstaben, Zahlen und Bindestriche enthalten"
msgid "Board URL cannot exceed 60 characters"
msgstr "Board-URL darf 60 Zeichen nicht überschreiten"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "Board-URL in die Zwischenablage kopiert"
@@ -386,12 +381,11 @@ msgid "Bug Report"
msgstr "Fehlerbericht"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -401,12 +395,12 @@ msgstr "Fehlerbericht"
msgid "Cancel"
msgstr "Abbrechen"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Karte"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Karte nicht gefunden"
@@ -425,8 +419,8 @@ msgstr "Passwort ändern"
msgid "Change your language preferences."
msgstr "Ändern Sie Ihre Spracheinstellungen."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "hat den Fälligkeitstermin auf <0>{formattedDate}</0> geändert"
@@ -439,7 +433,7 @@ msgstr "Entdecken Sie einige unserer liebsten Open-Source-Projekte."
msgid "Check your inbox"
msgstr "Überprüfe deinen Posteingang"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Checklistenname"
@@ -500,12 +494,12 @@ msgstr "Abgeschlossen"
msgid "Complete control and ownership:"
msgstr "Vollständige Kontrolle und Eigentum:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "hat ein Checklistenelement abgeschlossen"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "hat Checklistenelement <0>{0}</0> abgeschlossen"
@@ -556,10 +550,6 @@ msgstr "Fortfahren mit {0}"
msgid "Control who can view and edit your boards."
msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "In Link umwandeln"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Kernfunktionen"
@@ -570,7 +560,7 @@ msgid "Create {0}"
msgstr "{0} erstellen"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Weitere erstellen"
@@ -579,11 +569,11 @@ msgstr "Weitere erstellen"
msgid "Create API key"
msgstr "API-Schlüssel erstellen"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Karte erstellen"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Checkliste erstellen"
@@ -609,13 +599,13 @@ msgstr "Neue(n) {0} erstellen"
msgid "Create new key"
msgstr "Neuen Schlüssel erstellen"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Neues Label erstellen"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Neue Liste erstellen"
@@ -628,7 +618,7 @@ msgstr "Vorlage erstellen"
msgid "Create workspace"
msgstr "Arbeitsbereich erstellen"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "hat die Karte erstellt"
@@ -684,11 +674,10 @@ msgstr "Einladungslink deaktivieren"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Löschen"
@@ -706,7 +695,7 @@ msgstr "Board löschen"
msgid "Delete card"
msgstr "Karte löschen"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Kommentar löschen"
@@ -724,21 +713,21 @@ msgstr "Vorlage löschen"
msgid "Delete workspace"
msgstr "Workspace löschen"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "hat eine Checkliste gelöscht"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "hat ein Checklistenelement gelöscht"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "hat Checkliste <0>{0}</0> gelöscht"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "hat Checklistenelement <0>{0}</0> gelöscht"
@@ -804,13 +793,13 @@ msgstr "Du hast noch kein Konto? <0><1>Registrieren</1></0>"
msgid "Done"
msgstr "Erledigt"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Download fehlgeschlagen"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Fälligkeitsdatum"
@@ -830,16 +819,12 @@ msgstr "Heute fällig"
msgid "Due tomorrow"
msgstr "Morgen fällig"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Bearbeiten"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Board-URL bearbeiten"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Kommentar bearbeiten"
@@ -851,10 +836,6 @@ msgstr "Label bearbeiten"
msgid "Edit workspace URL"
msgstr "Workspace-URL bearbeiten"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "YouTube-Video bearbeiten"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Bearbeitung"
@@ -871,10 +852,6 @@ msgstr "E-Mail"
msgid "Enhancement"
msgstr "Verbesserung"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Benutzerdefinierten Titel eingeben"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Geben Sie Ihr aktuelles Passwort ein"
@@ -999,17 +976,13 @@ msgstr "Einladungslink konnte nicht kopiert werden"
msgid "Failed to create board"
msgstr "Board konnte nicht erstellt werden"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Videoinformationen konnten nicht abgerufen werden"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Anmeldung mit {0} fehlgeschlagen. Bitte versuche es erneut."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Fehler beim Hochladen des Anhangs. Bitte versuchen Sie es erneut."
@@ -1116,7 +1089,7 @@ msgstr "Loslegen"
msgid "Get started by creating a new {0}"
msgstr "Beginnen Sie, indem Sie eine(n) neue(n) {0} erstellen"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Beginne mit dem Erstellen einer neuen Liste"
@@ -1199,10 +1172,6 @@ msgstr "Wie kann ich selbst hosten?"
msgid "How is the project funded?"
msgstr "Wie wird das Projekt finanziert?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Ich bestätige, dass alle meine Kontodaten dauerhaft gelöscht werden, und möchte fortfahren."
@@ -1307,7 +1276,7 @@ msgstr "Einladungslinks"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Einladungslinks erfordern ein Team- oder Pro-Abonnement. Bitte upgraden Sie Ihren Workspace."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Mitglied einladen"
@@ -1355,8 +1324,8 @@ msgid "Keyboard Shortcuts"
msgstr "Tastaturkürzel"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Labels"
@@ -1406,11 +1375,11 @@ msgstr "Lizenz"
msgid "Light"
msgstr "Hell"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Link kopiert"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Liste"
@@ -1422,14 +1391,6 @@ msgstr "Listenname"
msgid "Lists"
msgstr "Listen"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Weitere Aktivitäten laden"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Wird geladen..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1458,12 +1419,12 @@ msgstr "Magic Link"
msgid "Make template"
msgstr "Als Vorlage speichern"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
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:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "hat Checklistenelement <0>{0}</0> als unvollständig markiert"
@@ -1473,8 +1434,8 @@ msgstr "Mittlere Priorität"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Mitglieder"
@@ -1495,11 +1456,11 @@ msgstr "monatliche Abrechnung"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "hat die Karte in eine andere Liste verschoben"
@@ -1535,7 +1496,7 @@ msgstr "Neuer API-Schlüssel"
msgid "New card"
msgstr "Neue Karte"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Neue Checkliste"
@@ -1548,7 +1509,7 @@ msgid "New label"
msgstr "Neues Label"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Neue Liste"
@@ -1601,7 +1562,7 @@ msgstr "Keine Kreditkarte erforderlich"
msgid "No dates"
msgstr "Keine Termine"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Für diesen Anhang ist keine Download-URL verfügbar."
@@ -1609,7 +1570,7 @@ 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:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Keine Listen"
@@ -1747,11 +1708,6 @@ msgstr "Bitte gib einen gültigen Namen ein"
msgid "Please enter a valid password"
msgstr "Bitte gib ein gültiges Passwort ein"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Bitte geben Sie eine gültige YouTube-URL ein"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Bitte wähle eine Datei zum Hochladen aus."
@@ -1765,27 +1721,26 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1885,40 +1840,35 @@ msgstr "Entfernen"
msgid "Remove member"
msgstr "Mitglied entfernen"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "{0} Labels entfernt: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "hat ein Label von der Karte entfernt"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "hat ein Mitglied von der Karte entfernt"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "hat Label <0>{0}</0> entfernt"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "hat den Fälligkeitstermin entfernt"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "hat eine Checkliste umbenannt"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "hat Checkliste <0>{0}</0> umbenannt"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "hat Checklistenelement in <0>{0}</0> umbenannt"
@@ -1957,8 +1907,7 @@ msgstr "Rolle"
msgid "Run on your own infrastructure"
msgstr "Auf eigener Infrastruktur betreiben"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Speichern"
@@ -1996,7 +1945,7 @@ msgstr "Selbst hosten"
msgid "Self host with Github"
msgstr "Selbst hosten mit Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "hat sich selbst die Karte zugewiesen"
@@ -2012,11 +1961,11 @@ msgstr "Feedback senden"
msgid "Senior"
msgstr "Senior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Fälligkeitsdatum festlegen"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "hat den Fälligkeitstermin festgelegt"
@@ -2141,8 +2090,8 @@ msgstr "Team-Plan"
msgid "Teams"
msgstr "Teams"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Vorlage"
@@ -2207,8 +2156,8 @@ msgstr "Sie werden keinen Zugriff mehr auf diesen Workspace haben."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
@@ -2216,7 +2165,7 @@ msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Dieser API-Schlüssel wird nur einmal angezeigt. Bitte speichern Sie ihn an einem sicheren Ort."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Dieses Board ist privat oder existiert nicht"
@@ -2248,10 +2197,6 @@ msgstr "Diese Workspace-URL ist reserviert"
msgid "This workspace username has already been taken"
msgstr "Dieser Workspace-Benutzername ist bereits vergeben"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Titel"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2282,27 +2227,27 @@ msgstr "Trello-importe"
msgid "Triaging"
msgstr "Priorisierung"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Von schnell agierenden Teams<0/>weltweit vertraut"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Checklistenelement kann nicht hinzugefügt werden"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Kommentar konnte nicht hinzugefügt werden"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Label konnte nicht hinzugefügt werden"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Karte konnte nicht erstellt werden"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Checkliste kann nicht erstellt werden"
@@ -2319,7 +2264,7 @@ msgstr "Vorlage konnte nicht erstellt werden"
msgid "Unable to create workspace"
msgstr "Workspace konnte nicht erstellt werden"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Anhang kann nicht gelöscht werden"
@@ -2327,15 +2272,15 @@ msgstr "Anhang kann nicht gelöscht werden"
msgid "Unable to delete card"
msgstr "Karte konnte nicht gelöscht werden"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Checkliste kann nicht gelöscht werden"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Checklistenelement kann nicht gelöscht werden"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Kommentar konnte nicht gelöscht werden"
@@ -2343,10 +2288,6 @@ msgstr "Kommentar konnte nicht gelöscht werden"
msgid "Unable to remove member"
msgstr "Mitglied konnte nicht entfernt werden"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Checklisten-Element konnte nicht neu angeordnet werden"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Feedback konnte nicht gesendet werden"
@@ -2359,46 +2300,46 @@ msgstr "Board-URL kann nicht aktualisiert werden"
msgid "Unable to update board visibility"
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Karte konnte nicht aktualisiert werden"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Checkliste kann nicht aktualisiert werden"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Checklistenelement kann nicht aktualisiert werden"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Kommentar konnte nicht aktualisiert werden"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Fälligkeitsdatum konnte nicht aktualisiert werden"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Labels konnten nicht aktualisiert werden"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Liste konnte nicht aktualisiert werden"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Mitglieder konnten nicht aktualisiert werden"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "hat <0>{0}</0> von der Karte entfernt"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "hat sich selbst von der Karte entfernt"
@@ -2457,24 +2398,24 @@ msgstr "Aktualisieren"
msgid "Update label"
msgstr "Label aktualisieren"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "hat ein Checklistenelement aktualisiert"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "hat die Beschreibung aktualisiert"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "hat den Fälligkeitstermin aktualisiert"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "hat den Titel aktualisiert"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "hat den Titel in <0>{0}</0> geändert"
@@ -2488,8 +2429,8 @@ msgstr "Upgrade auf Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade auf Pro ($29/Monat)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Hochladen fehlgeschlagen"
@@ -2542,7 +2483,7 @@ msgstr "Verwalte deine Abrechnung und dein Abonnement."
msgid "View docs"
msgstr "Dokumentation ansehen"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Nur ansehen"
@@ -2550,7 +2491,7 @@ msgstr "Nur ansehen"
msgid "View our roadmap."
msgstr "Sieh dir unsere roadmap an."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Workspace anzeigen"
@@ -2595,10 +2536,10 @@ msgid "Why make an open source Trello?"
msgstr "Warum ein open source Trello entwickeln?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Arbeitsbereich"
@@ -2732,7 +2673,7 @@ msgstr "Deine Boards wurden importiert."
msgid "Your display name has been updated."
msgstr "Dein Anzeigename wurde aktualisiert."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Ihre Datei wurde erfolgreich hochgeladen."
@@ -2771,7 +2712,3 @@ msgstr "Der Name deines Arbeitsbereichs wurde aktualisiert."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Dein Workspace-Slug wurde aktualisiert."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "YouTube-URL"

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (edited)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} labels"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} not found"
@@ -95,7 +95,7 @@ msgstr "Account deleted"
msgid "Actions"
msgstr "Actions"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Activity"
@@ -112,12 +112,12 @@ msgstr "Activity logs"
msgid "Add a card"
msgstr "Add a card"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Add a comment..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Add an item..."
@@ -125,7 +125,7 @@ msgstr "Add an item..."
msgid "Add checklist"
msgstr "Add checklist"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Add description... (type '/' to open commands or '@' to mention)"
@@ -133,53 +133,48 @@ msgstr "Add description... (type '/' to open commands or '@' to mention)"
#~ msgid "Add description... (type '/' to open commands)"
#~ msgstr "Add description... (type '/' to open commands)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Add details..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Add label"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Add member"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "added {0} labels: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "added a checklist"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "added a checklist item"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "added a label to the card"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
msgid "added a member to the card"
msgstr "added a member to the card"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "added checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
msgid "added checklist item <0>{0}</0>"
msgstr "added checklist item <0>{0}</0>"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "added label <0>{0}</0>"
@@ -282,11 +277,11 @@ msgstr "Are you sure you want to delete this {0}?"
msgid "Are you sure you want to delete this card?"
msgstr "Are you sure you want to delete this card?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Are you sure you want to delete this checklist?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Are you sure you want to delete this comment?"
@@ -303,7 +298,7 @@ msgstr "Are you sure you want to delete your account?"
#~ msgstr "around the world"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "assigned <0>{0}</0> to the card"
@@ -315,7 +310,7 @@ msgstr "assigned <0>{0}</0> to the card"
msgid "Assignees"
msgstr "Assignees"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Attachment uploaded"
@@ -357,9 +352,9 @@ msgstr "Billing portal"
msgid "Blog Post"
msgstr "Blog Post"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Board"
@@ -385,7 +380,7 @@ msgstr "Board name cannot exceed 100 characters"
msgid "Board name is required"
msgstr "Board name is required"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Board not found"
@@ -401,7 +396,7 @@ msgstr "Board URL can only contain letters, numbers, and hyphens"
msgid "Board URL cannot exceed 60 characters"
msgstr "Board URL cannot exceed 60 characters"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "Board URL copied to clipboard"
@@ -443,12 +438,11 @@ msgid "Bug Report"
msgstr "Bug Report"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -458,12 +452,12 @@ msgstr "Bug Report"
msgid "Cancel"
msgstr "Cancel"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Card"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Card not found"
@@ -486,8 +480,8 @@ msgstr "Change Password"
msgid "Change your language preferences."
msgstr "Change your language preferences."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "changed the due date to <0>{formattedDate}</0>"
@@ -500,7 +494,7 @@ msgstr "Check out some of our favorite open source projects."
msgid "Check your inbox"
msgstr "Check your inbox"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Checklist name"
@@ -561,12 +555,12 @@ msgstr "Complete"
msgid "Complete control and ownership:"
msgstr "Complete control and ownership:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "completed a checklist item"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "completed checklist item <0>{0}</0>"
@@ -621,10 +615,6 @@ msgstr "Continue with {0}"
msgid "Control who can view and edit your boards."
msgstr "Control who can view and edit your boards."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Convert to link"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Core features"
@@ -635,7 +625,7 @@ msgid "Create {0}"
msgstr "Create {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Create another"
@@ -652,11 +642,11 @@ msgstr "Create API key"
#~ msgid "Create board"
#~ msgstr "Create board"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Create card"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Create checklist"
@@ -686,13 +676,13 @@ msgstr "Create new {0}"
msgid "Create new key"
msgstr "Create new key"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Create new label"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Create new list"
@@ -709,7 +699,7 @@ msgstr "Create template"
msgid "Create workspace"
msgstr "Create workspace"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "created the card"
@@ -773,11 +763,10 @@ msgstr "Deactivate invite link"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Delete"
@@ -795,7 +784,7 @@ msgstr "Delete board"
msgid "Delete card"
msgstr "Delete card"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Delete comment"
@@ -813,21 +802,21 @@ msgstr "Delete template"
msgid "Delete workspace"
msgstr "Delete workspace"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "deleted a checklist"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "deleted a checklist item"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "deleted checklist <0>{0}</0>"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "deleted checklist item <0>{0}</0>"
@@ -893,13 +882,13 @@ msgstr "Don't have an account? <0><1>Sign up</1></0>"
msgid "Done"
msgstr "Done"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Download failed"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Due date"
@@ -919,16 +908,12 @@ msgstr "Due today"
msgid "Due tomorrow"
msgstr "Due tomorrow"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Edit"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Edit board URL"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Edit comment"
@@ -940,10 +925,6 @@ msgstr "Edit label"
msgid "Edit workspace URL"
msgstr "Edit workspace URL"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "Edit YouTube Video"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Editing"
@@ -960,10 +941,6 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Enhancement"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Enter a custom title"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Enter your current password"
@@ -1088,17 +1065,13 @@ msgstr "Failed to copy invite link"
msgid "Failed to create board"
msgstr "Failed to create board"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Failed to fetch video information"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Failed to login with {0}. Please try again."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Failed to upload attachment. Please try again."
@@ -1217,7 +1190,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:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Get started by creating a new list"
@@ -1300,10 +1273,6 @@ msgstr "How do I self-host?"
msgid "How is the project funded?"
msgstr "How is the project funded?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "I acknowledge that all of my account data will be permanently deleted and want to proceed."
@@ -1416,7 +1385,7 @@ msgstr "Invite links"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Invite links require a Team or Pro subscription. Please upgrade your workspace."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Invite member"
@@ -1464,8 +1433,8 @@ msgid "Keyboard Shortcuts"
msgstr "Keyboard Shortcuts"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Labels"
@@ -1515,11 +1484,11 @@ msgstr "License"
msgid "Light"
msgstr "Light"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Link copied"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "List"
@@ -1531,14 +1500,6 @@ msgstr "List name"
msgid "Lists"
msgstr "Lists"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Load more activities"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Loading..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1567,12 +1528,12 @@ msgstr "magic link"
msgid "Make template"
msgstr "Make template"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
msgid "marked a checklist item as incomplete"
msgstr "marked a checklist item as incomplete"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "marked checklist item <0>{0}</0> as incomplete"
@@ -1582,8 +1543,8 @@ msgstr "Medium Priority"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Members"
@@ -1604,7 +1565,7 @@ msgstr "monthly billing"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
msgstr "moved the card from <0>{0}</0> to<1>{1}</1>"
@@ -1612,7 +1573,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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "moved the card to another list"
@@ -1656,7 +1617,7 @@ msgstr "New API key"
msgid "New card"
msgstr "New card"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "New checklist"
@@ -1669,7 +1630,7 @@ msgid "New label"
msgstr "New label"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "New list"
@@ -1730,7 +1691,7 @@ msgstr "No credit card required"
msgid "No dates"
msgstr "No dates"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "No download URL available for this attachment."
@@ -1738,7 +1699,7 @@ msgstr "No download URL available for this attachment."
msgid "No keyboard shortcuts registered."
msgstr "No keyboard shortcuts registered."
#: src/views/board/index.tsx:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "No lists"
@@ -1876,11 +1837,6 @@ msgstr "Please enter a valid name"
msgid "Please enter a valid password"
msgstr "Please enter a valid password"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Please enter a valid YouTube URL"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Please select a file to upload."
@@ -1894,27 +1850,26 @@ msgstr "Please select a file to upload."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2014,21 +1969,16 @@ msgstr "Remove"
msgid "Remove member"
msgstr "Remove member"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "removed {0} labels: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "removed a label from the card"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "removed a member from the card"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "removed label <0>{0}</0>"
@@ -2036,22 +1986,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:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "removed the due date"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "renamed a checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "renamed checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "renamed checklist item to <0>{0}</0>"
@@ -2094,8 +2044,7 @@ msgstr "Role"
msgid "Run on your own infrastructure"
msgstr "Run on your own infrastructure"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Save"
@@ -2133,7 +2082,7 @@ msgstr "Self Host"
msgid "Self host with Github"
msgstr "Self host with Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "self-assigned the card"
@@ -2153,11 +2102,11 @@ msgstr "Send feedback"
msgid "Senior"
msgstr "Senior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Set due date"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "set the due date"
@@ -2290,8 +2239,8 @@ msgstr "Team Plan"
msgid "Teams"
msgstr "Teams"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Template"
@@ -2356,8 +2305,8 @@ msgstr "They won't be able to access this workspace."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "This action can't be undone."
@@ -2365,7 +2314,7 @@ msgstr "This action can't be undone."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "This API key will only be shown once. Please save it in a secure location."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "This board is private or does not exist"
@@ -2397,10 +2346,6 @@ msgstr "This workspace URL is reserved"
msgid "This workspace username has already been taken"
msgstr "This workspace username has already been taken"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Title"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2439,19 +2384,19 @@ msgstr "Triaging"
#~ msgid "Trusted by fast-moving teams"
#~ msgstr "Trusted by fast-moving teams"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Trusted by fast-moving teams<0/>around the world"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Unable to add checklist item"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Unable to add comment"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Unable to add label"
@@ -2459,7 +2404,7 @@ msgstr "Unable to add label"
msgid "Unable to create card"
msgstr "Unable to create card"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Unable to create checklist"
@@ -2476,7 +2421,7 @@ msgstr "Unable to create template"
msgid "Unable to create workspace"
msgstr "Unable to create workspace"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Unable to delete attachment"
@@ -2484,15 +2429,15 @@ msgstr "Unable to delete attachment"
msgid "Unable to delete card"
msgstr "Unable to delete card"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Unable to delete checklist"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Unable to delete checklist item"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Unable to delete comment"
@@ -2500,10 +2445,6 @@ msgstr "Unable to delete comment"
msgid "Unable to remove member"
msgstr "Unable to remove member"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Unable to reorder checklist item"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Unable to send feedback"
@@ -2516,42 +2457,42 @@ msgstr "Unable to update board URL"
msgid "Unable to update board visibility"
msgstr "Unable to update board visibility"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Unable to update card"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Unable to update checklist"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Unable to update checklist item"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Unable to update comment"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Unable to update due date"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Unable to update labels"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Unable to update list"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Unable to update members"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "unassigned <0>{0}</0> from the card"
@@ -2559,7 +2500,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:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "unassigned themselves from the card"
@@ -2618,24 +2559,24 @@ msgstr "Update"
msgid "Update label"
msgstr "Update label"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "updated a checklist item"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "updated the description"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "updated the due date"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "updated the title"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "updated the title to <0>{0}</0>"
@@ -2661,8 +2602,8 @@ msgstr "Upgrade to Pro ($29/month)"
#~ msgid "Upgrade to Team Plan"
#~ msgstr "Upgrade to Team Plan"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Upload failed"
@@ -2715,7 +2656,7 @@ msgstr "View and manage your billing and subscription."
msgid "View docs"
msgstr "View docs"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "View only"
@@ -2723,7 +2664,7 @@ msgstr "View only"
msgid "View our roadmap."
msgstr "View our roadmap."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "View workspace"
@@ -2776,10 +2717,10 @@ msgid "Why make an open source Trello?"
msgstr "Why make an open source Trello?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Workspace"
@@ -2917,7 +2858,7 @@ msgstr "Your boards have been imported."
msgid "Your display name has been updated."
msgstr "Your display name has been updated."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Your file has been uploaded successfully."
@@ -2956,7 +2897,3 @@ msgstr "Your workspace name has been updated."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Your workspace slug has been updated."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "YouTube URL"

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (editado)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} etiquetas"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} no encontrado"
@@ -83,7 +83,7 @@ msgstr "Cuenta eliminada"
msgid "Actions"
msgstr "Acciones"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Actividad"
@@ -100,12 +100,12 @@ msgstr "Registros de actividad"
msgid "Add a card"
msgstr "Añadir una tarjeta"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Añadir un comentario..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Añadir un elemento..."
@@ -113,57 +113,52 @@ msgstr "Añadir un elemento..."
msgid "Add checklist"
msgstr "Añadir lista de verificación"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Añadir descripción... (escribe '/' para abrir comandos o '@' para mencionar)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Añadir detalles..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Añadir etiqueta"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Añadir miembro"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "añadió {0} etiquetas: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "añadió una lista de verificación"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "añadió un elemento a la lista de verificación"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "añadió una etiqueta a la tarjeta"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
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:181
#: src/views/card/components/ActivityList.tsx:146
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:205
#: src/views/card/components/ActivityList.tsx:170
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:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "añadió la etiqueta <0>{0}</0>"
@@ -254,11 +249,11 @@ msgstr "¿Estás seguro de que quieres eliminar este {0}?"
msgid "Are you sure you want to delete this card?"
msgstr "¿Estás seguro de que quieres eliminar esta tarjeta?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "¿Estás seguro de que quieres eliminar esta lista de verificación?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
@@ -271,7 +266,7 @@ 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:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "asignó <0>{0}</0> a la tarjeta"
@@ -279,7 +274,7 @@ msgstr "asignó <0>{0}</0> a la tarjeta"
msgid "Assignees"
msgstr "Asignados"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Archivo adjunto subido"
@@ -317,9 +312,9 @@ msgstr "Portal de facturación"
msgid "Blog Post"
msgstr "Entrada de blog"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Tablero"
@@ -336,7 +331,7 @@ msgstr "El nombre del tablero no puede exceder los 100 caracteres"
msgid "Board name is required"
msgstr "El nombre del tablero es obligatorio"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Tablero no encontrado"
@@ -352,7 +347,7 @@ msgstr "La URL del tablero solo puede contener letras, números y guiones"
msgid "Board URL cannot exceed 60 characters"
msgstr "La URL del tablero no puede exceder los 60 caracteres"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "URL del tablero copiada al portapapeles"
@@ -386,12 +381,11 @@ msgid "Bug Report"
msgstr "Informe de error"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -401,12 +395,12 @@ msgstr "Informe de error"
msgid "Cancel"
msgstr "Cancelar"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Tarjeta"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Tarjeta no encontrada"
@@ -425,8 +419,8 @@ msgstr "Cambiar contraseña"
msgid "Change your language preferences."
msgstr "Cambia tus preferencias de idioma."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "cambió la fecha de vencimiento a <0>{formattedDate}</0>"
@@ -439,7 +433,7 @@ msgstr "Descubre algunos de nuestros proyectos de código abierto favoritos."
msgid "Check your inbox"
msgstr "Revisa tu bandeja de entrada"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Nombre de la lista de verificación"
@@ -500,12 +494,12 @@ msgstr "Completado"
msgid "Complete control and ownership:"
msgstr "Control y propiedad completos:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
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:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "completó el elemento <0>{0}</0> de la lista de verificación"
@@ -556,10 +550,6 @@ msgstr "Continuar con {0}"
msgid "Control who can view and edit your boards."
msgstr "Controla quién puede ver y editar tus tableros."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Convertir en enlace"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Características principales"
@@ -570,7 +560,7 @@ msgid "Create {0}"
msgstr "Crear {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Crear otro"
@@ -579,11 +569,11 @@ msgstr "Crear otro"
msgid "Create API key"
msgstr "Crear clave API"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Crear tarjeta"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Crear lista de verificación"
@@ -609,13 +599,13 @@ msgstr "Crear nuevo {0}"
msgid "Create new key"
msgstr "Crear nueva clave"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Crear nueva etiqueta"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Crear nueva lista"
@@ -628,7 +618,7 @@ msgstr "Crear plantilla"
msgid "Create workspace"
msgstr "Crear espacio de trabajo"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "creó la tarjeta"
@@ -684,11 +674,10 @@ msgstr "Desactivar enlace de invitación"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Eliminar"
@@ -706,7 +695,7 @@ msgstr "Eliminar tablero"
msgid "Delete card"
msgstr "Eliminar tarjeta"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Eliminar comentario"
@@ -724,21 +713,21 @@ msgstr "Eliminar plantilla"
msgid "Delete workspace"
msgstr "Eliminar espacio de trabajo"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "eliminó una lista de verificación"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
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:197
#: src/views/card/components/ActivityList.tsx:162
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:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "eliminó el elemento <0>{0}</0> de la lista de verificación"
@@ -804,13 +793,13 @@ msgstr "¿No tienes una cuenta? <0><1>Regístrate</1></0>"
msgid "Done"
msgstr "Terminado"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Error en la descarga"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Fecha de vencimiento"
@@ -830,16 +819,12 @@ msgstr "Vence hoy"
msgid "Due tomorrow"
msgstr "Vence mañana"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Editar"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Editar URL del tablero"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Editar comentario"
@@ -851,10 +836,6 @@ msgstr "Editar etiqueta"
msgid "Edit workspace URL"
msgstr "Editar URL del espacio de trabajo"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "Editar vídeo de YouTube"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Editando"
@@ -871,10 +852,6 @@ msgstr "Correo electrónico"
msgid "Enhancement"
msgstr "Mejora"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Introduce un título personalizado"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Introduce tu contraseña actual"
@@ -999,17 +976,13 @@ msgstr "No se pudo copiar el enlace de invitación"
msgid "Failed to create board"
msgstr "Error al crear el tablero"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Error al obtener la información del vídeo"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Error al iniciar sesión con {0}. Por favor, inténtalo de nuevo."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Error al subir el archivo adjunto. Por favor, inténtalo de nuevo."
@@ -1116,7 +1089,7 @@ msgstr "Comenzar"
msgid "Get started by creating a new {0}"
msgstr "Comienza creando un nuevo {0}"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Comienza creando una nueva lista"
@@ -1199,10 +1172,6 @@ msgstr "¿Cómo puedo autoalojar?"
msgid "How is the project funded?"
msgstr "¿Cómo se financia el proyecto?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Reconozco que todos los datos de mi cuenta serán eliminados permanentemente y quiero continuar."
@@ -1307,7 +1276,7 @@ msgstr "Enlaces de invitación"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Los enlaces de invitación requieren una suscripción de Equipo o Pro. Por favor, actualiza tu espacio de trabajo."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Invitar miembro"
@@ -1355,8 +1324,8 @@ msgid "Keyboard Shortcuts"
msgstr "Atajos de teclado"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Etiquetas"
@@ -1406,11 +1375,11 @@ msgstr "Licencia"
msgid "Light"
msgstr "Claro"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Enlace copiado"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Lista"
@@ -1422,14 +1391,6 @@ msgstr "Nombre de la lista"
msgid "Lists"
msgstr "Listas"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Cargar más actividades"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Cargando..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Iniciar sesión | kan.bn"
@@ -1458,12 +1419,12 @@ msgstr "enlace mágico"
msgid "Make template"
msgstr "Crear plantilla"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
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:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "marcó el elemento <0>{0}</0> de la lista de verificación como incompleto"
@@ -1473,8 +1434,8 @@ msgstr "Prioridad media"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Miembros"
@@ -1495,11 +1456,11 @@ msgstr "facturación mensual"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "movió la tarjeta a otra lista"
@@ -1535,7 +1496,7 @@ msgstr "Nueva clave API"
msgid "New card"
msgstr "Nueva tarjeta"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Nueva lista de verificación"
@@ -1548,7 +1509,7 @@ msgid "New label"
msgstr "Nueva etiqueta"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Nueva lista"
@@ -1601,7 +1562,7 @@ msgstr "No se requiere tarjeta de crédito"
msgid "No dates"
msgstr "Sin fechas"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "No hay URL de descarga disponible para este archivo adjunto."
@@ -1609,7 +1570,7 @@ 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:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Sin listas"
@@ -1747,11 +1708,6 @@ msgstr "Por favor, introduce un nombre válido"
msgid "Please enter a valid password"
msgstr "Por favor, introduce una contraseña válida"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Introduce una URL de YouTube válida"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Por favor selecciona un archivo para subir."
@@ -1765,27 +1721,26 @@ msgstr "Por favor selecciona un archivo para subir."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1885,40 +1840,35 @@ msgstr "Eliminar"
msgid "Remove member"
msgstr "Eliminar miembro"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "eliminó {0} etiquetas: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "eliminó una etiqueta de la tarjeta"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "eliminó un miembro de la tarjeta"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "eliminó la etiqueta <0>{0}</0>"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "eliminó la fecha de vencimiento"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "renombró una lista de verificación"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
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:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "renombró el elemento de la lista de verificación a <0>{0}</0>"
@@ -1957,8 +1907,7 @@ msgstr "Rol"
msgid "Run on your own infrastructure"
msgstr "Ejecuta en tu propia infraestructura"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Guardar"
@@ -1996,7 +1945,7 @@ msgstr "Autoalojamiento"
msgid "Self host with Github"
msgstr "Autoalojamiento con Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "se autoasignó la tarjeta"
@@ -2012,11 +1961,11 @@ msgstr "Enviar comentarios"
msgid "Senior"
msgstr "Senior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Establecer fecha de vencimiento"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "estableció la fecha de vencimiento"
@@ -2141,8 +2090,8 @@ msgstr "Plan de Equipo"
msgid "Teams"
msgstr "Equipos"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Plantilla"
@@ -2207,8 +2156,8 @@ msgstr "No podrán acceder a este espacio de trabajo."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Esta acción no se puede deshacer."
@@ -2216,7 +2165,7 @@ msgstr "Esta acción no se puede deshacer."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Esta clave API solo se mostrará una vez. Por favor, guárdala en un lugar seguro."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Este tablero es privado o no existe"
@@ -2248,10 +2197,6 @@ msgstr "Esta URL de espacio de trabajo está reservada"
msgid "This workspace username has already been taken"
msgstr "Este nombre de usuario del espacio de trabajo ya ha sido tomado"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Título"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2282,27 +2227,27 @@ msgstr "Importaciones de Trello"
msgid "Triaging"
msgstr "Clasificación"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Equipos ágiles de todo el mundo<0/>confían en nosotros"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "No se puede añadir el elemento a la lista de verificación"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "No se puede añadir el comentario"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "No se puede añadir la etiqueta"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "No se puede crear la tarjeta"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "No se puede crear la lista de verificación"
@@ -2319,7 +2264,7 @@ msgstr "No se puede crear la plantilla"
msgid "Unable to create workspace"
msgstr "No se puede crear el espacio de trabajo"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "No se puede eliminar el archivo adjunto"
@@ -2327,15 +2272,15 @@ msgstr "No se puede eliminar el archivo adjunto"
msgid "Unable to delete card"
msgstr "No se puede eliminar la tarjeta"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "No se puede eliminar la lista de verificación"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "No se puede eliminar el elemento de la lista de verificación"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "No se puede eliminar el comentario"
@@ -2343,10 +2288,6 @@ msgstr "No se puede eliminar el comentario"
msgid "Unable to remove member"
msgstr "No se puede eliminar al miembro"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "No se puede reordenar el elemento de la lista de verificación"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "No se pudieron enviar los comentarios"
@@ -2359,46 +2300,46 @@ msgstr "No se puede actualizar la URL del tablero"
msgid "Unable to update board visibility"
msgstr "No se puede actualizar la visibilidad del tablero"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "No se puede actualizar la tarjeta"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "No se puede actualizar la lista de verificación"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "No se puede actualizar el elemento de la lista de verificación"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "No se puede actualizar el comentario"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "No se puede actualizar la fecha de vencimiento"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "No se pueden actualizar las etiquetas"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "No se puede actualizar la lista"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "No se pueden actualizar los miembros"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "desasignó <0>{0}</0> de la tarjeta"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "se desasignó de la tarjeta"
@@ -2457,24 +2398,24 @@ msgstr "Actualizar"
msgid "Update label"
msgstr "Actualizar etiqueta"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "actualizó un elemento de la lista de verificación"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "actualizó la descripción"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "actualizó la fecha de vencimiento"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "actualizó el título"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "actualizó el título a <0>{0}</0>"
@@ -2488,8 +2429,8 @@ msgstr "Actualizar a Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Actualizar a Pro ($29/mes)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Error al subir"
@@ -2542,7 +2483,7 @@ msgstr "Ver y gestionar tu facturación y suscripción."
msgid "View docs"
msgstr "Ver documentación"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Solo visualización"
@@ -2550,7 +2491,7 @@ msgstr "Solo visualización"
msgid "View our roadmap."
msgstr "Ver nuestra hoja de ruta."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Ver espacio de trabajo"
@@ -2595,10 +2536,10 @@ msgid "Why make an open source Trello?"
msgstr "¿Por qué crear un Trello de código abierto?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Espacio de trabajo"
@@ -2732,7 +2673,7 @@ msgstr "Tus tableros han sido importados."
msgid "Your display name has been updated."
msgstr "Tu nombre de visualización ha sido actualizado."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Tu archivo se ha subido correctamente."
@@ -2771,7 +2712,3 @@ msgstr "El nombre de tu espacio de trabajo ha sido actualizado."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "El slug de tu espacio de trabajo ha sido actualizado."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "URL de YouTube"

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (modifié)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} étiquettes"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} introuvable"
@@ -83,7 +83,7 @@ msgstr "Compte supprimé"
msgid "Actions"
msgstr "Actions"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Activité"
@@ -100,12 +100,12 @@ msgstr "Journaux d'activité"
msgid "Add a card"
msgstr "Ajouter une carte"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Ajouter un commentaire..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Ajouter un élément..."
@@ -113,57 +113,52 @@ msgstr "Ajouter un élément..."
msgid "Add checklist"
msgstr "Ajouter une checklist"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes ou '@' pour mentionner)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Ajouter des détails..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Ajouter une étiquette"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Ajouter un membre"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "a ajouté {0} étiquettes : <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "a ajouté une checklist"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "a ajouté un élément à la checklist"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "a ajouté une étiquette à la carte"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
msgid "added a member to the card"
msgstr "a ajouté un membre à la carte"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "a ajouté la checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
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:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "a ajouté l'étiquette <0>{0}</0>"
@@ -254,11 +249,11 @@ msgstr "Êtes-vous sûr de vouloir supprimer ce {0} ?"
msgid "Are you sure you want to delete this card?"
msgstr "Êtes-vous sûr de vouloir supprimer cette carte ?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Êtes-vous sûr de vouloir supprimer cette checklist ?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
@@ -271,7 +266,7 @@ 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:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "a assigné <0>{0}</0> à la carte"
@@ -279,7 +274,7 @@ msgstr "a assigné <0>{0}</0> à la carte"
msgid "Assignees"
msgstr "Assignés"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Pièce jointe téléversée"
@@ -317,9 +312,9 @@ msgstr "Portail de facturation"
msgid "Blog Post"
msgstr "Article de blog"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Tableau"
@@ -336,7 +331,7 @@ msgstr "Le nom du tableau ne peut pas dépasser 100 caractères"
msgid "Board name is required"
msgstr "Le nom du tableau est requis"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Tableau introuvable"
@@ -352,7 +347,7 @@ msgstr "L'URL du tableau ne peut contenir que des lettres, des chiffres et des t
msgid "Board URL cannot exceed 60 characters"
msgstr "L'URL du tableau ne peut pas dépasser 60 caractères"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "URL du tableau copiée dans le presse-papiers"
@@ -386,12 +381,11 @@ msgid "Bug Report"
msgstr "Rapport de bug"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -401,12 +395,12 @@ msgstr "Rapport de bug"
msgid "Cancel"
msgstr "Annuler"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Carte"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Carte introuvable"
@@ -425,8 +419,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:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "a modifié la date d'échéance pour <0>{formattedDate}</0>"
@@ -439,7 +433,7 @@ msgstr "Découvrez certains de nos projets open source préférés."
msgid "Check your inbox"
msgstr "Vérifiez votre boîte de réception"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Nom de la checklist"
@@ -500,12 +494,12 @@ msgstr "Terminé"
msgid "Complete control and ownership:"
msgstr "Contrôle et propriété complets :"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "a terminé un élément de la checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "a terminé l'élément <0>{0}</0> de la checklist"
@@ -556,10 +550,6 @@ msgstr "Continuer avec {0}"
msgid "Control who can view and edit your boards."
msgstr "Contrôlez qui peut voir et modifier vos tableaux."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Convertir en lien"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Fonctionnalités essentielles"
@@ -570,7 +560,7 @@ msgid "Create {0}"
msgstr "Créer {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Créer un autre"
@@ -579,11 +569,11 @@ msgstr "Créer un autre"
msgid "Create API key"
msgstr "Créer une clé API"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Créer une carte"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Créer une checklist"
@@ -609,13 +599,13 @@ msgstr "Créer un nouveau {0}"
msgid "Create new key"
msgstr "Créer une nouvelle clé"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Créer une nouvelle étiquette"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Créer une nouvelle liste"
@@ -628,7 +618,7 @@ msgstr "Créer un modèle"
msgid "Create workspace"
msgstr "Créer un espace de travail"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "a créé la carte"
@@ -684,11 +674,10 @@ msgstr "Désactiver le lien d'invitation"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Supprimer"
@@ -706,7 +695,7 @@ msgstr "Supprimer le tableau"
msgid "Delete card"
msgstr "Supprimer la carte"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Supprimer le commentaire"
@@ -724,21 +713,21 @@ msgstr "Supprimer le modèle"
msgid "Delete workspace"
msgstr "Supprimer l'espace de travail"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "a supprimé une checklist"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "a supprimé un élément de la checklist"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "a supprimé la checklist <0>{0}</0>"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "a supprimé l'élément <0>{0}</0> de la checklist"
@@ -804,13 +793,13 @@ msgstr "Vous n'avez pas de compte ? <0><1>Inscrivez-vous</1></0>"
msgid "Done"
msgstr "Fait"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Échec du téléchargement"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Date d'échéance"
@@ -830,16 +819,12 @@ msgstr "Échéance aujourd'hui"
msgid "Due tomorrow"
msgstr "Échéance demain"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Modifier"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Modifier l'URL du tableau"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Modifier le commentaire"
@@ -851,10 +836,6 @@ msgstr "Modifier l'étiquette"
msgid "Edit workspace URL"
msgstr "Modifier l'URL de l'espace de travail"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "Modifier la vidéo YouTube"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Édition"
@@ -871,10 +852,6 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Amélioration"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Saisir un titre personnalisé"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Saisissez votre mot de passe actuel"
@@ -999,17 +976,13 @@ msgstr "Échec de la copie du lien d'invitation"
msgid "Failed to create board"
msgstr "Échec de la création du tableau"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Échec de la récupération des informations de la vidéo"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Échec de connexion avec {0}. Veuillez réessayer."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Échec du téléversement de la pièce jointe. Veuillez réessayer."
@@ -1116,7 +1089,7 @@ msgstr "Commencer"
msgid "Get started by creating a new {0}"
msgstr "Commencez par créer un nouveau {0}"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Commencez par créer une nouvelle liste"
@@ -1199,10 +1172,6 @@ msgstr "Comment faire pour auto-héberger ?"
msgid "How is the project funded?"
msgstr "Comment le projet est-il financé ?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Je reconnais que toutes les données de mon compte seront définitivement supprimées et je souhaite continuer."
@@ -1307,7 +1276,7 @@ msgstr "Liens d'invitation"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Les liens d'invitation nécessitent un abonnement Team ou Pro. Veuillez mettre à niveau votre espace de travail."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Inviter un membre"
@@ -1355,8 +1324,8 @@ msgid "Keyboard Shortcuts"
msgstr "Raccourcis clavier"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Étiquettes"
@@ -1406,11 +1375,11 @@ msgstr "Licence"
msgid "Light"
msgstr "Clair"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Lien copié"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Liste"
@@ -1422,14 +1391,6 @@ msgstr "Nom de la liste"
msgid "Lists"
msgstr "Listes"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Charger plus d'activités"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Chargement..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Connexion | kan.bn"
@@ -1458,12 +1419,12 @@ msgstr "lien magique"
msgid "Make template"
msgstr "Créer un modèle"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
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:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "a marqué l'élément <0>{0}</0> de la checklist comme incomplet"
@@ -1473,8 +1434,8 @@ msgstr "Priorité moyenne"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Membres"
@@ -1495,11 +1456,11 @@ msgstr "facturation mensuelle"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "a déplacé la carte vers une autre liste"
@@ -1535,7 +1496,7 @@ msgstr "Nouvelle clé API"
msgid "New card"
msgstr "Nouvelle carte"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Nouvelle checklist"
@@ -1548,7 +1509,7 @@ msgid "New label"
msgstr "Nouvelle étiquette"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Nouvelle liste"
@@ -1601,7 +1562,7 @@ msgstr "Aucune carte de crédit requise"
msgid "No dates"
msgstr "Aucune date"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Aucune URL de téléchargement disponible pour cette pièce jointe."
@@ -1609,7 +1570,7 @@ 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:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Aucune liste"
@@ -1747,11 +1708,6 @@ msgstr "Veuillez saisir un nom valide"
msgid "Please enter a valid password"
msgstr "Veuillez saisir un mot de passe valide"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Veuillez saisir une URL YouTube valide"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Veuillez sélectionner un fichier à télécharger."
@@ -1765,27 +1721,26 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1885,40 +1840,35 @@ msgstr "Supprimer"
msgid "Remove member"
msgstr "Supprimer le membre"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "a supprimé {0} étiquettes : <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "a supprimé une étiquette de la carte"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "a retiré un membre de la carte"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "a supprimé l'étiquette <0>{0}</0>"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "a supprimé la date d'échéance"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "a renommé une checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "a renommé la checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "a renommé l'élément de la liste de contrôle en <0>{0}</0>"
@@ -1957,8 +1907,7 @@ msgstr "Rôle"
msgid "Run on your own infrastructure"
msgstr "Exécutez sur votre propre infrastructure"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Enregistrer"
@@ -1996,7 +1945,7 @@ msgstr "Auto-hébergement"
msgid "Self host with Github"
msgstr "Auto-hébergement avec Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "s'est auto-assigné la carte"
@@ -2012,11 +1961,11 @@ msgstr "Envoyer des commentaires"
msgid "Senior"
msgstr "Senior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Définir la date d'échéance"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "a défini la date d'échéance"
@@ -2141,8 +2090,8 @@ msgstr "Forfait d'équipe"
msgid "Teams"
msgstr "Équipes"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Modèle"
@@ -2207,8 +2156,8 @@ msgstr "Ils ne pourront plus accéder à cet espace de travail."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Cette action ne peut pas être annulée."
@@ -2216,7 +2165,7 @@ msgstr "Cette action ne peut pas être annulée."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Cette clé API ne sera affichée qu'une seule fois. Veuillez la sauvegarder dans un emplacement sécurisé."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Ce tableau est privé ou n'existe pas"
@@ -2248,10 +2197,6 @@ msgstr "Cette URL d'espace de travail est réservée"
msgid "This workspace username has already been taken"
msgstr "Ce nom d'utilisateur d'espace de travail est déjà pris"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Titre"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2282,27 +2227,27 @@ msgstr "Importations Trello"
msgid "Triaging"
msgstr "Triage"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Approuvé par des équipes dynamiques<0/>du monde entier"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Impossible d'ajouter l'élément à la liste de contrôle"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Impossible d'ajouter un commentaire"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Impossible d'ajouter l'étiquette"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Impossible de créer la carte"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Impossible de créer la liste de contrôle"
@@ -2319,7 +2264,7 @@ msgstr "Impossible de créer le modèle"
msgid "Unable to create workspace"
msgstr "Impossible de créer l'espace de travail"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Impossible de supprimer la pièce jointe"
@@ -2327,15 +2272,15 @@ msgstr "Impossible de supprimer la pièce jointe"
msgid "Unable to delete card"
msgstr "Impossible de supprimer la carte"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Impossible de supprimer la liste de contrôle"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Impossible de supprimer l'élément de la liste de contrôle"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Impossible de supprimer le commentaire"
@@ -2343,10 +2288,6 @@ msgstr "Impossible de supprimer le commentaire"
msgid "Unable to remove member"
msgstr "Impossible de supprimer le membre"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Impossible de réorganiser l'élément de la liste de contrôle"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Impossible d'envoyer les commentaires"
@@ -2359,46 +2300,46 @@ msgstr "Impossible de mettre à jour l'URL du tableau"
msgid "Unable to update board visibility"
msgstr "Impossible de mettre à jour la visibilité du tableau"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Impossible de mettre à jour la carte"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Impossible de mettre à jour la liste de contrôle"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Impossible de mettre à jour l'élément de la liste de contrôle"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Impossible de mettre à jour le commentaire"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Impossible de mettre à jour la date d'échéance"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Impossible de mettre à jour les étiquettes"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Impossible de mettre à jour la liste"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Impossible de mettre à jour les membres"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "a désassigné <0>{0}</0> de la carte"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "s'est retiré de la carte"
@@ -2457,24 +2398,24 @@ msgstr "Mettre à jour"
msgid "Update label"
msgstr "Mettre à jour l'étiquette"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "a mis à jour un élément de la liste de contrôle"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "a mis à jour la description"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "a mis à jour la date d'échéance"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "a mis à jour le titre"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "a mis à jour le titre en <0>{0}</0>"
@@ -2488,8 +2429,8 @@ msgstr "Passer à Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Passer à Pro (29 $/mois)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Échec du téléversement"
@@ -2542,7 +2483,7 @@ msgstr "Consultez et gérez votre facturation et votre abonnement."
msgid "View docs"
msgstr "Voir la documentation"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Affichage uniquement"
@@ -2550,7 +2491,7 @@ msgstr "Affichage uniquement"
msgid "View our roadmap."
msgstr "Consultez notre feuille de route."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Voir l'espace de travail"
@@ -2595,10 +2536,10 @@ msgid "Why make an open source Trello?"
msgstr "Pourquoi créer un Trello open source ?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Espace de travail"
@@ -2732,7 +2673,7 @@ msgstr "Vos tableaux ont été importés."
msgid "Your display name has been updated."
msgstr "Votre nom d'affichage a été mis à jour."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Votre fichier a été téléversé avec succès."
@@ -2771,7 +2712,3 @@ msgstr "Le nom de votre espace de travail a été mis à jour."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Le slug de votre espace de travail a été mis à jour."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "URL YouTube"

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (modificato)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} etichette"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} non trovato"
@@ -83,7 +83,7 @@ msgstr "Account eliminato"
msgid "Actions"
msgstr "Azioni"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Attività"
@@ -100,12 +100,12 @@ msgstr "Registri attività"
msgid "Add a card"
msgstr "Aggiungi una carta"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Aggiungi un commento..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Aggiungi un elemento..."
@@ -113,57 +113,52 @@ msgstr "Aggiungi un elemento..."
msgid "Add checklist"
msgstr "Aggiungi checklist"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi o '@' per menzionare)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Aggiungi dettagli..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Aggiungi etichetta"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Aggiungi membro"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "ha aggiunto {0} etichette: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "ha aggiunto una checklist"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "ha aggiunto un elemento alla checklist"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "ha aggiunto un'etichetta alla carta"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
msgid "added a member to the card"
msgstr "ha aggiunto un membro alla carta"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "ha aggiunto la checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
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:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "ha aggiunto l'etichetta <0>{0}</0>"
@@ -254,11 +249,11 @@ msgstr "Sei sicuro di voler eliminare questo {0}?"
msgid "Are you sure you want to delete this card?"
msgstr "Sei sicuro di voler eliminare questa carta?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Sei sicuro di voler eliminare questa checklist?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Sei sicuro di voler eliminare questo commento?"
@@ -271,7 +266,7 @@ 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:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "ha assegnato <0>{0}</0> alla scheda"
@@ -279,7 +274,7 @@ msgstr "ha assegnato <0>{0}</0> alla scheda"
msgid "Assignees"
msgstr "Assegnatari"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Allegato caricato"
@@ -317,9 +312,9 @@ msgstr "Portale di fatturazione"
msgid "Blog Post"
msgstr "Post del blog"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Bacheca"
@@ -336,7 +331,7 @@ msgstr "Il nome della bacheca non può superare i 100 caratteri"
msgid "Board name is required"
msgstr "Il nome della bacheca è obbligatorio"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Bacheca non trovata"
@@ -352,7 +347,7 @@ msgstr "L'URL della bacheca può contenere solo lettere, numeri e trattini"
msgid "Board URL cannot exceed 60 characters"
msgstr "L'URL della bacheca non può superare i 60 caratteri"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "URL della bacheca copiato negli appunti"
@@ -386,12 +381,11 @@ msgid "Bug Report"
msgstr "Segnalazione bug"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -401,12 +395,12 @@ msgstr "Segnalazione bug"
msgid "Cancel"
msgstr "Annulla"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Carta"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Carta non trovata"
@@ -425,8 +419,8 @@ msgstr "Cambia password"
msgid "Change your language preferences."
msgstr "Modifica le tue preferenze di lingua."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "ha cambiato la data di scadenza a <0>{formattedDate}</0>"
@@ -439,7 +433,7 @@ msgstr "Dai un'occhiata ad alcuni dei nostri progetti open source preferiti."
msgid "Check your inbox"
msgstr "Controlla la tua casella di posta"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Nome della checklist"
@@ -500,12 +494,12 @@ msgstr "Completato"
msgid "Complete control and ownership:"
msgstr "Controllo e proprietà completi:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "ha completato un elemento della checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "ha completato l'elemento <0>{0}</0> della checklist"
@@ -556,10 +550,6 @@ msgstr "Continua con {0}"
msgid "Control who can view and edit your boards."
msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Converti in link"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Funzionalità principali"
@@ -570,7 +560,7 @@ msgid "Create {0}"
msgstr "Crea {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Crea un altro"
@@ -579,11 +569,11 @@ msgstr "Crea un altro"
msgid "Create API key"
msgstr "Crea chiave API"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Crea carta"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Crea checklist"
@@ -609,13 +599,13 @@ msgstr "Crea nuovo {0}"
msgid "Create new key"
msgstr "Crea nuova chiave"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Crea nuova etichetta"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Crea nuova lista"
@@ -628,7 +618,7 @@ msgstr "Crea template"
msgid "Create workspace"
msgstr "Crea spazio di lavoro"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "ha creato la carta"
@@ -684,11 +674,10 @@ msgstr "Disattiva link di invito"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Elimina"
@@ -706,7 +695,7 @@ msgstr "Elimina bacheca"
msgid "Delete card"
msgstr "Elimina carta"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Elimina commento"
@@ -724,21 +713,21 @@ msgstr "Elimina template"
msgid "Delete workspace"
msgstr "Elimina spazio di lavoro"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "ha eliminato una checklist"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "ha eliminato un elemento della checklist"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "ha eliminato la checklist <0>{0}</0>"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "ha eliminato l'elemento <0>{0}</0> della checklist"
@@ -804,13 +793,13 @@ msgstr "Non hai un account? <0><1>Registrati</1></0>"
msgid "Done"
msgstr "Fatto"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Download fallito"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Data di scadenza"
@@ -830,16 +819,12 @@ msgstr "Scade oggi"
msgid "Due tomorrow"
msgstr "Scade domani"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Modifica"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Modifica URL della bacheca"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Modifica commento"
@@ -851,10 +836,6 @@ msgstr "Modifica etichetta"
msgid "Edit workspace URL"
msgstr "Modifica URL dell'area di lavoro"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "Modifica video YouTube"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Modifica"
@@ -871,10 +852,6 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Miglioramento"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Inserisci un titolo personalizzato"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Inserisci la tua password attuale"
@@ -999,17 +976,13 @@ msgstr "Impossibile copiare il link di invito"
msgid "Failed to create board"
msgstr "Impossibile creare la bacheca"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Impossibile recuperare le informazioni del video"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Accesso con {0} fallito. Riprova."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Impossibile caricare l'allegato. Riprova."
@@ -1116,7 +1089,7 @@ msgstr "Inizia ora"
msgid "Get started by creating a new {0}"
msgstr "Inizia creando un nuovo {0}"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Inizia creando una nuova lista"
@@ -1199,10 +1172,6 @@ msgstr "Come posso effettuare il self-hosting?"
msgid "How is the project funded?"
msgstr "Come viene finanziato il progetto?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Riconosco che tutti i dati del mio account saranno eliminati permanentemente e voglio procedere."
@@ -1307,7 +1276,7 @@ msgstr "Link di invito"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "I link di invito richiedono un abbonamento Team o Pro. Per favore aggiorna il tuo spazio di lavoro."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Invita membro"
@@ -1355,8 +1324,8 @@ msgid "Keyboard Shortcuts"
msgstr "Scorciatoie da tastiera"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Etichette"
@@ -1406,11 +1375,11 @@ msgstr "Licenza"
msgid "Light"
msgstr "Chiaro"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Link copiato"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Lista"
@@ -1422,14 +1391,6 @@ msgstr "Nome lista"
msgid "Lists"
msgstr "Liste"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Carica altre attività"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Caricamento in corso..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1458,12 +1419,12 @@ msgstr "link magico"
msgid "Make template"
msgstr "Crea template"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
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:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "ha segnato l'elemento <0>{0}</0> della checklist come incompleto"
@@ -1473,8 +1434,8 @@ msgstr "Media priorità"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Membri"
@@ -1495,11 +1456,11 @@ msgstr "fatturazione mensile"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "ha spostato la scheda in un'altra lista"
@@ -1535,7 +1496,7 @@ msgstr "Nuova chiave API"
msgid "New card"
msgstr "Nuova carta"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Nuova checklist"
@@ -1548,7 +1509,7 @@ msgid "New label"
msgstr "Nuova etichetta"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Nuova lista"
@@ -1601,7 +1562,7 @@ msgstr "Nessuna carta di credito richiesta"
msgid "No dates"
msgstr "Nessuna data"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Nessun URL di download disponibile per questo allegato."
@@ -1609,7 +1570,7 @@ 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:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Nessuna lista"
@@ -1747,11 +1708,6 @@ msgstr "Inserisci un nome valido"
msgid "Please enter a valid password"
msgstr "Inserisci una password valida"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Inserisci un URL YouTube valido"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Seleziona un file da caricare."
@@ -1765,27 +1721,26 @@ msgstr "Seleziona un file da caricare."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1885,40 +1840,35 @@ msgstr "Rimuovi"
msgid "Remove member"
msgstr "Rimuovi membro"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "ha rimosso {0} etichette: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "ha rimosso un'etichetta dalla scheda"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "ha rimosso un membro dalla scheda"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "ha rimosso l'etichetta <0>{0}</0>"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "ha rimosso la data di scadenza"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "ha rinominato una checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "ha rinominato la checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "ha rinominato l'elemento della checklist in <0>{0}</0>"
@@ -1957,8 +1907,7 @@ msgstr "Ruolo"
msgid "Run on your own infrastructure"
msgstr "Esegui sulla tua infrastruttura"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Salva"
@@ -1996,7 +1945,7 @@ msgstr "Self Host"
msgid "Self host with Github"
msgstr "Self host con Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "si è auto-assegnato la scheda"
@@ -2012,11 +1961,11 @@ msgstr "Invia feedback"
msgid "Senior"
msgstr "Senior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Imposta data di scadenza"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "ha impostato la data di scadenza"
@@ -2141,8 +2090,8 @@ msgstr "Piano Team"
msgid "Teams"
msgstr "Team"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Template"
@@ -2207,8 +2156,8 @@ msgstr "Non potranno accedere a questo spazio di lavoro."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Questa azione non può essere annullata."
@@ -2216,7 +2165,7 @@ msgstr "Questa azione non può essere annullata."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Questa chiave API verrà mostrata una sola volta. Salvala in un luogo sicuro."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Questa bacheca è privata o non esiste"
@@ -2248,10 +2197,6 @@ msgstr "Questo URL dello spazio di lavoro è riservato"
msgid "This workspace username has already been taken"
msgstr "Questo nome utente dell'area di lavoro è già stato utilizzato"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Titolo"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2282,27 +2227,27 @@ msgstr "Importazioni da Trello"
msgid "Triaging"
msgstr "Smistamento"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Team dinamici di tutto il mondo<0/>si fidano di noi"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Impossibile aggiungere l'elemento della checklist"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Impossibile aggiungere il commento"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Impossibile aggiungere l'etichetta"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Impossibile creare la scheda"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Impossibile creare la checklist"
@@ -2319,7 +2264,7 @@ msgstr "Impossibile creare il template"
msgid "Unable to create workspace"
msgstr "Impossibile creare lo spazio di lavoro"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Impossibile eliminare l'allegato"
@@ -2327,15 +2272,15 @@ msgstr "Impossibile eliminare l'allegato"
msgid "Unable to delete card"
msgstr "Impossibile eliminare la scheda"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Impossibile eliminare la checklist"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Impossibile eliminare l'elemento della checklist"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Impossibile eliminare il commento"
@@ -2343,10 +2288,6 @@ msgstr "Impossibile eliminare il commento"
msgid "Unable to remove member"
msgstr "Impossibile rimuovere il membro"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Impossibile riordinare elemento della checklist"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Impossibile inviare feedback"
@@ -2359,46 +2300,46 @@ msgstr "Impossibile aggiornare l'URL della bacheca"
msgid "Unable to update board visibility"
msgstr "Impossibile aggiornare la visibilità della bacheca"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Impossibile aggiornare la scheda"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Impossibile aggiornare la checklist"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Impossibile aggiornare l'elemento della checklist"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Impossibile aggiornare il commento"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Impossibile aggiornare la data di scadenza"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Impossibile aggiornare le etichette"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Impossibile aggiornare la lista"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Impossibile aggiornare i membri"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
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:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "si è rimosso dall'assegnazione della scheda"
@@ -2457,24 +2398,24 @@ msgstr "Aggiorna"
msgid "Update label"
msgstr "Aggiorna etichetta"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "ha aggiornato un elemento della checklist"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "ha aggiornato la descrizione"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "ha aggiornato la data di scadenza"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "ha aggiornato il titolo"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "ha aggiornato il titolo in <0>{0}</0>"
@@ -2488,8 +2429,8 @@ msgstr "Passa a Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Passa a Pro ($29/mese)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Caricamento fallito"
@@ -2542,7 +2483,7 @@ msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
msgid "View docs"
msgstr "Visualizza documenti"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Solo visualizzazione"
@@ -2550,7 +2491,7 @@ msgstr "Solo visualizzazione"
msgid "View our roadmap."
msgstr "Visualizza la nostra roadmap."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Visualizza spazio di lavoro"
@@ -2595,10 +2536,10 @@ msgid "Why make an open source Trello?"
msgstr "Perché creare un Trello open source?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Spazio di lavoro"
@@ -2732,7 +2673,7 @@ msgstr "Le tue bacheche sono state importate."
msgid "Your display name has been updated."
msgstr "Il tuo nome visualizzato è stato aggiornato."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Il tuo file è stato caricato con successo."
@@ -2771,7 +2712,3 @@ msgstr "Il nome del tuo spazio di lavoro è stato aggiornato."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Lo slug della tua area di lavoro è stato aggiornato."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "URL YouTube"

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (bewerkt)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} labels"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} niet gevonden"
@@ -83,7 +83,7 @@ msgstr "Account verwijderd"
msgid "Actions"
msgstr "Acties"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Activiteit"
@@ -100,12 +100,12 @@ msgstr "Activiteitenlogboeken"
msgid "Add a card"
msgstr "Voeg een kaart toe"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Voeg een reactie toe..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Voeg een item toe..."
@@ -113,57 +113,52 @@ msgstr "Voeg een item toe..."
msgid "Add checklist"
msgstr "Checklist toevoegen"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Beschrijving toevoegen... (typ '/' om commando's te openen of '@' om te vermelden)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Details toevoegen..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Label toevoegen"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Lid toevoegen"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "{0} labels toegevoegd: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "heeft een checklist toegevoegd"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "heeft een checklistitem toegevoegd"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "heeft een label aan de kaart toegevoegd"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
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:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "heeft checklist <0>{0}</0> toegevoegd"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
msgid "added checklist item <0>{0}</0>"
msgstr "heeft checklistitem <0>{0}</0> toegevoegd"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "heeft label <0>{0}</0> toegevoegd"
@@ -254,11 +249,11 @@ msgstr "Weet je zeker dat je deze {0} wilt verwijderen?"
msgid "Are you sure you want to delete this card?"
msgstr "Weet je zeker dat je deze kaart wilt verwijderen?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Weet je zeker dat je deze checklist wilt verwijderen?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
@@ -271,7 +266,7 @@ 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:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "heeft <0>{0}</0> aan de kaart toegewezen"
@@ -279,7 +274,7 @@ msgstr "heeft <0>{0}</0> aan de kaart toegewezen"
msgid "Assignees"
msgstr "Toegewezen personen"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Bijlage geüpload"
@@ -317,9 +312,9 @@ msgstr "Factureringsportaal"
msgid "Blog Post"
msgstr "Blogbericht"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Bord"
@@ -336,7 +331,7 @@ msgstr "Bordnaam mag niet langer zijn dan 100 tekens"
msgid "Board name is required"
msgstr "Bordnaam is verplicht"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Bord niet gevonden"
@@ -352,7 +347,7 @@ msgstr "Board URL kan alleen letters, cijfers en koppeltekens bevatten"
msgid "Board URL cannot exceed 60 characters"
msgstr "Board URL mag niet langer zijn dan 60 tekens"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "Board URL gekopieerd naar klembord"
@@ -386,12 +381,11 @@ msgid "Bug Report"
msgstr "Bugrapport"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -401,12 +395,12 @@ msgstr "Bugrapport"
msgid "Cancel"
msgstr "Annuleren"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Kaart"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Kaart niet gevonden"
@@ -425,8 +419,8 @@ msgstr "Wachtwoord wijzigen"
msgid "Change your language preferences."
msgstr "Wijzig je taalvoorkeuren."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "heeft de vervaldatum gewijzigd naar <0>{formattedDate}</0>"
@@ -439,7 +433,7 @@ msgstr "Bekijk enkele van onze favoriete open source projecten."
msgid "Check your inbox"
msgstr "Controleer je inbox"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Naam checklist"
@@ -500,12 +494,12 @@ msgstr "Voltooid"
msgid "Complete control and ownership:"
msgstr "Volledige controle en eigendom:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "heeft een checklistitem voltooid"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "heeft checklistitem <0>{0}</0> voltooid"
@@ -556,10 +550,6 @@ msgstr "Doorgaan met {0}"
msgid "Control who can view and edit your boards."
msgstr "Bepaal wie je borden kan bekijken en bewerken."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Converteer naar link"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Kernfuncties"
@@ -570,7 +560,7 @@ msgid "Create {0}"
msgstr "{0} maken"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Maak nog een"
@@ -579,11 +569,11 @@ msgstr "Maak nog een"
msgid "Create API key"
msgstr "API-sleutel aanmaken"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Maak kaart"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Checklist maken"
@@ -609,13 +599,13 @@ msgstr "Nieuwe {0} maken"
msgid "Create new key"
msgstr "Nieuwe sleutel aanmaken"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Maak nieuw label"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Maak nieuwe lijst"
@@ -628,7 +618,7 @@ msgstr "Sjabloon maken"
msgid "Create workspace"
msgstr "Werkruimte maken"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "heeft de kaart aangemaakt"
@@ -684,11 +674,10 @@ msgstr "Uitnodigingslink deactiveren"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Verwijderen"
@@ -706,7 +695,7 @@ msgstr "Board verwijderen"
msgid "Delete card"
msgstr "Kaart verwijderen"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Reactie verwijderen"
@@ -724,21 +713,21 @@ msgstr "Sjabloon verwijderen"
msgid "Delete workspace"
msgstr "Werkruimte verwijderen"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "heeft een checklist verwijderd"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "heeft een checklistitem verwijderd"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "heeft checklist <0>{0}</0> verwijderd"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "heeft checklistitem <0>{0}</0> verwijderd"
@@ -804,13 +793,13 @@ msgstr "Heb je geen account? <0><1>Registreer je</1></0>"
msgid "Done"
msgstr "Klaar"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Download mislukt"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Vervaldatum"
@@ -830,16 +819,12 @@ msgstr "Vervalt vandaag"
msgid "Due tomorrow"
msgstr "Vervalt morgen"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Bewerken"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Board URL bewerken"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Reactie bewerken"
@@ -851,10 +836,6 @@ msgstr "Label bewerken"
msgid "Edit workspace URL"
msgstr "Werkruimte-URL bewerken"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "YouTube-video bewerken"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Bewerken"
@@ -871,10 +852,6 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Verbetering"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Voer een aangepaste titel in"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Voer je huidige wachtwoord in"
@@ -999,17 +976,13 @@ msgstr "Kopiëren van uitnodigingslink mislukt"
msgid "Failed to create board"
msgstr "Bord maken mislukt"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Kan video-informatie niet ophalen"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Inloggen met {0} is mislukt. Probeer het opnieuw."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Bijlage uploaden mislukt. Probeer het opnieuw."
@@ -1116,7 +1089,7 @@ msgstr "Aan de slag"
msgid "Get started by creating a new {0}"
msgstr "Begin door een nieuwe {0} te maken"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Begin door een nieuwe lijst te maken"
@@ -1199,10 +1172,6 @@ msgstr "Hoe kan ik zelf hosten?"
msgid "How is the project funded?"
msgstr "Hoe wordt het project gefinancierd?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Ik bevestig dat alle gegevens van mijn account permanent worden verwijderd en wil doorgaan."
@@ -1307,7 +1276,7 @@ msgstr "Uitnodigingslinks"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Uitnodigingslinks vereisen een Team- of Pro-abonnement. Upgrade je werkruimte."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Lid uitnodigen"
@@ -1355,8 +1324,8 @@ msgid "Keyboard Shortcuts"
msgstr "Sneltoetsen"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Labels"
@@ -1406,11 +1375,11 @@ msgstr "Licentie"
msgid "Light"
msgstr "Licht"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Link gekopieerd"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Lijst"
@@ -1422,14 +1391,6 @@ msgstr "Lijstnaam"
msgid "Lists"
msgstr "Lijsten"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Meer activiteiten laden"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Laden..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1458,12 +1419,12 @@ msgstr "magische link"
msgid "Make template"
msgstr "Sjabloon maken"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
msgid "marked a checklist item as incomplete"
msgstr "heeft een checklistitem als onvoltooid gemarkeerd"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "heeft checklistitem <0>{0}</0> als onvoltooid gemarkeerd"
@@ -1473,8 +1434,8 @@ msgstr "Gemiddelde prioriteit"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Leden"
@@ -1495,11 +1456,11 @@ msgstr "maandelijkse facturering"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "heeft de kaart naar een andere lijst verplaatst"
@@ -1535,7 +1496,7 @@ msgstr "Nieuwe API-sleutel"
msgid "New card"
msgstr "Nieuwe kaart"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Nieuwe checklist"
@@ -1548,7 +1509,7 @@ msgid "New label"
msgstr "Nieuw label"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Nieuwe lijst"
@@ -1601,7 +1562,7 @@ msgstr "Geen creditcard vereist"
msgid "No dates"
msgstr "Geen datums"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Geen download-URL beschikbaar voor deze bijlage."
@@ -1609,7 +1570,7 @@ msgstr "Geen download-URL beschikbaar voor deze bijlage."
msgid "No keyboard shortcuts registered."
msgstr "Geen sneltoetsen geregistreerd."
#: src/views/board/index.tsx:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Geen lijsten"
@@ -1747,11 +1708,6 @@ msgstr "Voer een geldige naam in"
msgid "Please enter a valid password"
msgstr "Voer een geldig wachtwoord in"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Voer een geldige YouTube-URL in"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Selecteer een bestand om te uploaden."
@@ -1765,27 +1721,26 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1885,40 +1840,35 @@ msgstr "Verwijderen"
msgid "Remove member"
msgstr "Lid verwijderen"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "{0} labels verwijderd: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "heeft een label van de kaart verwijderd"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "heeft een lid van de kaart verwijderd"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "heeft label <0>{0}</0> verwijderd"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "heeft de vervaldatum verwijderd"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "heeft een checklist hernoemd"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "heeft checklist <0>{0}</0> hernoemd"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "checklistitem hernoemd naar <0>{0}</0>"
@@ -1957,8 +1907,7 @@ msgstr "Rol"
msgid "Run on your own infrastructure"
msgstr "Draai op je eigen infrastructuur"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Opslaan"
@@ -1996,7 +1945,7 @@ msgstr "Zelf hosten"
msgid "Self host with Github"
msgstr "Zelf hosten met Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "heeft de kaart aan zichzelf toegewezen"
@@ -2012,11 +1961,11 @@ msgstr "Feedback versturen"
msgid "Senior"
msgstr "Senior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Vervaldatum instellen"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "heeft de vervaldatum ingesteld"
@@ -2141,8 +2090,8 @@ msgstr "Teamplan"
msgid "Teams"
msgstr "Teams"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Sjabloon"
@@ -2207,8 +2156,8 @@ msgstr "Ze zullen geen toegang meer hebben tot deze werkruimte."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Deze actie kan niet ongedaan worden gemaakt."
@@ -2216,7 +2165,7 @@ msgstr "Deze actie kan niet ongedaan worden gemaakt."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Deze API-sleutel wordt slechts één keer getoond. Bewaar deze op een veilige plaats."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Dit bord is privé of bestaat niet"
@@ -2248,10 +2197,6 @@ msgstr "Deze werkruimte-URL is gereserveerd"
msgid "This workspace username has already been taken"
msgstr "Deze werkruimtegebruikersnaam is al in gebruik"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Titel"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2282,27 +2227,27 @@ msgstr "Trello-imports"
msgid "Triaging"
msgstr "Triage"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Vertrouwd door snelbewegende teams<0/>over de hele wereld"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Kan checklistitem niet toevoegen"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Kan geen reactie toevoegen"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Kan label niet toevoegen"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Kan kaart niet aanmaken"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Kan checklist niet maken"
@@ -2319,7 +2264,7 @@ msgstr "Kan sjabloon niet maken"
msgid "Unable to create workspace"
msgstr "Kan werkruimte niet aanmaken"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Kan bijlage niet verwijderen"
@@ -2327,15 +2272,15 @@ msgstr "Kan bijlage niet verwijderen"
msgid "Unable to delete card"
msgstr "Kan kaart niet verwijderen"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Kan checklist niet verwijderen"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Kan checklistitem niet verwijderen"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Kan opmerking niet verwijderen"
@@ -2343,10 +2288,6 @@ msgstr "Kan opmerking niet verwijderen"
msgid "Unable to remove member"
msgstr "Kan lid niet verwijderen"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Kan checklistitem niet opnieuw ordenen"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Feedback kon niet worden verzonden"
@@ -2359,46 +2300,46 @@ msgstr "Kan board URL niet bijwerken"
msgid "Unable to update board visibility"
msgstr "Kan bordzichtbaarheid niet bijwerken"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Kan kaart niet bijwerken"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Kan checklist niet bijwerken"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Kan checklistitem niet bijwerken"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Kan reactie niet bijwerken"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Kan vervaldatum niet bijwerken"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Kan labels niet bijwerken"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Kan lijst niet bijwerken"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Kan leden niet bijwerken"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "<0>{0}</0> van de kaart verwijderd"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "zichzelf van de kaart verwijderd"
@@ -2457,24 +2398,24 @@ msgstr "Bijwerken"
msgid "Update label"
msgstr "Label bijwerken"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "een checklistitem bijgewerkt"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "beschrijving bijgewerkt"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "heeft de vervaldatum bijgewerkt"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "titel bijgewerkt"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "titel bijgewerkt naar <0>{0}</0>"
@@ -2488,8 +2429,8 @@ msgstr "Upgraden naar Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Upgrade naar Pro ($29/maand)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Uploaden mislukt"
@@ -2542,7 +2483,7 @@ msgstr "Bekijk en beheer je facturering en abonnement."
msgid "View docs"
msgstr "Bekijk documentatie"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Alleen bekijken"
@@ -2550,7 +2491,7 @@ msgstr "Alleen bekijken"
msgid "View our roadmap."
msgstr "Bekijk onze roadmap."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Werkruimte bekijken"
@@ -2595,10 +2536,10 @@ msgid "Why make an open source Trello?"
msgstr "Waarom een open source Trello maken?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Werkruimte"
@@ -2732,7 +2673,7 @@ msgstr "Je borden zijn geïmporteerd."
msgid "Your display name has been updated."
msgstr "Je weergavenaam is bijgewerkt."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Je bestand is succesvol geüpload."
@@ -2771,7 +2712,3 @@ msgstr "De naam van je werkruimte is bijgewerkt."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Je werkruimte-slug is bijgewerkt."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "YouTube-URL"

File diff suppressed because one or more lines are too long

View File

@@ -18,7 +18,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (edytowano)"
@@ -36,17 +36,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} etykiety"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} nie znaleziono"
@@ -88,7 +88,7 @@ msgstr "Konto zostało usunięte"
msgid "Actions"
msgstr "Działania"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Aktywność"
@@ -105,12 +105,12 @@ msgstr "Dzienniki aktywności"
msgid "Add a card"
msgstr "Dodaj kartę"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Dodaj komentarz..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Dodaj element..."
@@ -118,57 +118,52 @@ msgstr "Dodaj element..."
msgid "Add checklist"
msgstr "Dodaj listę kontrolną"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Dodaj opis... (wpisz '/' aby otworzyć polecenia lub '@' aby wspomnieć)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Dodaj szczegóły..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Dodaj etykietę"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Dodaj członka"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "dodano {0} etykiety: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "dodał listę kontrolną"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "dodał(a) element listy kontrolnej"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "dodał(a) etykietę do karty"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
msgid "added a member to the card"
msgstr "dodał(a) członka do karty"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "dodał(a) listę kontrolną <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
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:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "dodał(a) etykietę <0>{0}</0>"
@@ -259,11 +254,11 @@ msgstr "Czy na pewno chcesz usunąć ten {0}?"
msgid "Are you sure you want to delete this card?"
msgstr "Czy na pewno chcesz usunąć tę kartę?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Czy na pewno chcesz usunąć tę listę kontrolną?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Czy na pewno chcesz usunąć ten komentarz?"
@@ -276,7 +271,7 @@ 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:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "przypisano <0>{0}</0> do karty"
@@ -284,7 +279,7 @@ msgstr "przypisano <0>{0}</0> do karty"
msgid "Assignees"
msgstr "Osoby przypisane"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Załącznik został przesłany"
@@ -322,9 +317,9 @@ msgstr "Portal rozliczeniowy"
msgid "Blog Post"
msgstr "Post na blogu"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Tablica"
@@ -341,7 +336,7 @@ msgstr "Nazwa tablicy nie może przekraczać 100 znaków"
msgid "Board name is required"
msgstr "Nazwa tablicy jest wymagana"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Tablica nie została znaleziona"
@@ -357,7 +352,7 @@ msgstr "Adres URL tablicy może zawierać tylko litery, cyfry i myślniki"
msgid "Board URL cannot exceed 60 characters"
msgstr "Adres URL tablicy nie może przekraczać 60 znaków"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "Adres URL tablicy został skopiowany do schowka"
@@ -391,12 +386,11 @@ msgid "Bug Report"
msgstr "Zgłoszenie błędu"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -406,12 +400,12 @@ msgstr "Zgłoszenie błędu"
msgid "Cancel"
msgstr "Anuluj"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Karta"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Nie można było znaleźć karty"
@@ -430,8 +424,8 @@ msgstr "Zmień hasło"
msgid "Change your language preferences."
msgstr "Zmień swoje preferencje językowe."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "zmieniono termin na <0>{formattedDate}</0>"
@@ -444,7 +438,7 @@ msgstr "Sprawdź niektóre z naszych ulubionych projektów otwartoźródłowych.
msgid "Check your inbox"
msgstr "Sprawdź swoją skrzynkę odbiorczą"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Nazwa listy kontrolnej"
@@ -505,12 +499,12 @@ msgstr "Zakończ"
msgid "Complete control and ownership:"
msgstr "Pełna kontrola i własność:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "ukończono element listy kontrolnej"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "ukończono element listy kontrolnej <0>{0}</0>"
@@ -561,10 +555,6 @@ msgstr "Kontynuuj z {0}"
msgid "Control who can view and edit your boards."
msgstr "Kontroluj, kto może przeglądać i edytować twoje tablice."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Konwertuj na link"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Podstawowe funkcje"
@@ -575,7 +565,7 @@ msgid "Create {0}"
msgstr "Utwórz {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Utwórz kolejny"
@@ -584,11 +574,11 @@ msgstr "Utwórz kolejny"
msgid "Create API key"
msgstr "Utwórz klucz API"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Utwórz kartę"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Utwórz listę kontrolną"
@@ -614,13 +604,13 @@ msgstr "Utwórz nowy {0}"
msgid "Create new key"
msgstr "Utwórz nowy klucz"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Utwórz nową etykietę"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Utwórz nową listę"
@@ -633,7 +623,7 @@ msgstr "Utwórz szablon"
msgid "Create workspace"
msgstr "Utwórz przestrzeń roboczą"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "utworzył(a) kartę"
@@ -689,11 +679,10 @@ msgstr "Dezaktywuj link zaproszenia"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Usuń"
@@ -711,7 +700,7 @@ msgstr "Usuń tablicę"
msgid "Delete card"
msgstr "Usuń kartę"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Usuń komentarz"
@@ -729,21 +718,21 @@ msgstr "Usuń szablon"
msgid "Delete workspace"
msgstr "Usuń przestrzeń roboczą"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "usunięto listę kontrolną"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "usunięto element listy kontrolnej"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "usunięto listę kontrolną <0>{0}</0>"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "usunięto element listy kontrolnej <0>{0}</0>"
@@ -809,13 +798,13 @@ msgstr "Nie masz konta? <0><1>Zarejestruj się</1></0>"
msgid "Done"
msgstr "Gotowe"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Pobieranie nie powiodło się"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Termin"
@@ -835,16 +824,12 @@ msgstr "Termin na dziś"
msgid "Due tomorrow"
msgstr "Termin na jutro"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Edytuj"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Edytuj URL tablicy"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Edytuj komentarz"
@@ -856,10 +841,6 @@ msgstr "Edytuj etykietę"
msgid "Edit workspace URL"
msgstr "Edytuj URL przestrzeni roboczej"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "Edytuj wideo YouTube"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Edycja"
@@ -876,10 +857,6 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Ulepszenie"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Wprowadź własny tytuł"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Wprowadź swoje obecne hasło"
@@ -1004,17 +981,13 @@ msgstr "Nie udało się skopiować linku zaproszenia"
msgid "Failed to create board"
msgstr "Nie udało się utworzyć tablicy"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Nie udało się pobrać informacji o wideo"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Nie udało się zalogować za pomocą {0}. Spróbuj ponownie."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Nie udało się przesłać załącznika. Proszę spróbować ponownie."
@@ -1121,7 +1094,7 @@ msgstr "Rozpocznij"
msgid "Get started by creating a new {0}"
msgstr "Rozpocznij, tworząc nowy {0}"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Rozpocznij, tworząc nową listę"
@@ -1204,10 +1177,6 @@ msgstr "Jak samodzielnie hostować?"
msgid "How is the project funded?"
msgstr "Jak projekt jest finansowany?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Potwierdzam, że wszystkie dane mojego konta zostaną trwale usunięte i chcę kontynuować."
@@ -1312,7 +1281,7 @@ msgstr "Linki zaproszeń"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Linki zaproszeń wymagają subskrypcji Team lub Pro. Proszę ulepszyć swoje środowisko pracy."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Zaproś członka"
@@ -1360,8 +1329,8 @@ msgid "Keyboard Shortcuts"
msgstr "Skróty klawiaturowe"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Etykiety"
@@ -1411,11 +1380,11 @@ msgstr "Licencja"
msgid "Light"
msgstr "Jasny"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Link skopiowany"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Lista"
@@ -1427,14 +1396,6 @@ msgstr "Nazwa listy"
msgid "Lists"
msgstr "Listy"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Załaduj więcej aktywności"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Ładowanie..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Zaloguj się | kan.bn"
@@ -1463,12 +1424,12 @@ msgstr "magiczny link"
msgid "Make template"
msgstr "Utwórz szablon"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
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:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "oznaczył element listy kontrolnej <0>{0}</0> jako nieukończony"
@@ -1478,8 +1439,8 @@ msgstr "Średni priorytet"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Członkowie"
@@ -1500,11 +1461,11 @@ msgstr "rozliczenie miesięczne"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "przeniesiono kartę do innej listy"
@@ -1540,7 +1501,7 @@ msgstr "Nowy klucz API"
msgid "New card"
msgstr "Nowa karta"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Nowa lista kontrolna"
@@ -1553,7 +1514,7 @@ msgid "New label"
msgstr "Nowa etykieta"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Nowa lista"
@@ -1606,7 +1567,7 @@ msgstr "Nie wymagana karta kredytowa"
msgid "No dates"
msgstr "Brak terminów"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Brak dostępnego URL do pobrania tego załącznika."
@@ -1614,7 +1575,7 @@ 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:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Brak list"
@@ -1752,11 +1713,6 @@ msgstr "Proszę wprowadzić poprawne imię"
msgid "Please enter a valid password"
msgstr "Proszę wprowadzić poprawne hasło"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Wprowadź poprawny adres URL YouTube"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Proszę wybrać plik do przesłania."
@@ -1770,27 +1726,26 @@ msgstr "Proszę wybrać plik do przesłania."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1890,40 +1845,35 @@ msgstr "Usuń"
msgid "Remove member"
msgstr "Usuń członka"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "usunięto {0} etykiety: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "usunął etykietę z karty"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "usunął członka z karty"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "usunięto etykietę <0>{0}</0>"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "usunięto termin"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "zmieniono nazwę listy kontrolnej"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "zmieniono nazwę listy kontrolnej <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "zmieniono nazwę elementu listy kontrolnej na <0>{0}</0>"
@@ -1962,8 +1912,7 @@ msgstr "Rola"
msgid "Run on your own infrastructure"
msgstr "Uruchom na własnej infrastrukturze"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Zapisz"
@@ -2001,7 +1950,7 @@ msgstr "Hostuj samodzielnie"
msgid "Self host with Github"
msgstr "Hostuj samodzielnie z Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "przypisał(a) sobie kartę"
@@ -2017,11 +1966,11 @@ msgstr "Prześlij opinię"
msgid "Senior"
msgstr "Starszy"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Ustaw termin"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "ustawiono termin"
@@ -2146,8 +2095,8 @@ msgstr "Plan zespołowy"
msgid "Teams"
msgstr "Zespoły"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Szablon"
@@ -2212,8 +2161,8 @@ msgstr "Nie będą mieli dostępu do tego obszaru roboczego."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Tej akcji nie można cofnąć."
@@ -2221,7 +2170,7 @@ msgstr "Tej akcji nie można cofnąć."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Ten klucz API zostanie wyświetlony tylko raz. Proszę zapisać go w bezpiecznym miejscu."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Ta tablica jest prywatna lub nie istnieje"
@@ -2253,10 +2202,6 @@ msgstr "Ten adres URL obszaru roboczego jest zarezerwowany"
msgid "This workspace username has already been taken"
msgstr "Ta nazwa użytkownika obszaru roboczego jest już zajęta"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Tytuł"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2287,27 +2232,27 @@ msgstr "Importy Trello"
msgid "Triaging"
msgstr "Sortowanie"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Zaufany przez dynamiczne zespoły<0/>na całym świecie"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Nie można dodać elementu listy kontrolnej"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Nie można dodać komentarza"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Nie można dodać etykiety"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Nie można utworzyć karty"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Nie można utworzyć listy kontrolnej"
@@ -2324,7 +2269,7 @@ msgstr "Nie można utworzyć szablonu"
msgid "Unable to create workspace"
msgstr "Nie można utworzyć przestrzeni roboczej"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Nie można usunąć załącznika"
@@ -2332,15 +2277,15 @@ msgstr "Nie można usunąć załącznika"
msgid "Unable to delete card"
msgstr "Nie można usunąć karty"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Nie można usunąć listy kontrolnej"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Nie można usunąć elementu listy kontrolnej"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Nie można usunąć komentarza"
@@ -2348,10 +2293,6 @@ msgstr "Nie można usunąć komentarza"
msgid "Unable to remove member"
msgstr "Nie można usunąć członka"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Nie można zmienić kolejności elementu listy kontrolnej"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Nie można wysłać opinii"
@@ -2364,46 +2305,46 @@ msgstr "Nie można zaktualizować adresu URL tablicy"
msgid "Unable to update board visibility"
msgstr "Nie można zaktualizować widoczności tablicy"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Nie można zaktualizować karty"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Nie można zaktualizować listy kontrolnej"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Nie można zaktualizować elementu listy kontrolnej"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Nie można zaktualizować komentarza"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Nie można zaktualizować terminu"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Nie można zaktualizować etykiet"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Nie można zaktualizować listy"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Nie można zaktualizować członków"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "usunięto przypisanie <0>{0}</0> z karty"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "usunęli swoje przypisanie z karty"
@@ -2462,24 +2403,24 @@ msgstr "Aktualizuj"
msgid "Update label"
msgstr "Zaktualizuj etykietę"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "zaktualizowano element listy kontrolnej"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "zaktualizowano opis"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "zaktualizowano termin"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "zaktualizowano tytuł"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "zaktualizowano tytuł na <0>{0}</0>"
@@ -2493,8 +2434,8 @@ msgstr "Ulepsz do planu Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Ulepsz do planu Pro (29 USD/miesiąc)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Przesyłanie nie powiodło się"
@@ -2547,7 +2488,7 @@ msgstr "Zobacz i zarządzaj swoimi płatnościami i subskrypcją."
msgid "View docs"
msgstr "Zobacz dokumentację"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Tylko podgląd"
@@ -2555,7 +2496,7 @@ msgstr "Tylko podgląd"
msgid "View our roadmap."
msgstr "Zobacz nasz plan ulepszeń."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Zobacz obszar roboczy"
@@ -2600,10 +2541,10 @@ msgid "Why make an open source Trello?"
msgstr "Dlaczego próbujecie stworzyć Trello w wersji otwartoźródłowej?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Obszar roboczy"
@@ -2737,7 +2678,7 @@ msgstr "Twoje tablice zostały zaimportowane."
msgid "Your display name has been updated."
msgstr "Twoja nazwa wyświetlana została zaktualizowana."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Twój plik został pomyślnie przesłany."
@@ -2776,7 +2717,3 @@ msgstr "Nazwa twojej przestrzeni roboczej została zaktualizowana."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Slug twojej przestrzeni roboczej został zaktualizowany."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "YouTube URL"

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (editado)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} etiquetas"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} não encontrado"
@@ -95,7 +95,7 @@ msgstr "A conta foi excluída"
msgid "Actions"
msgstr "Ações"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Atividade"
@@ -112,12 +112,12 @@ msgstr "Registros de atividade"
msgid "Add a card"
msgstr "Adicionar um cartão"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Adicionar um comentário..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Adicionar um item..."
@@ -125,7 +125,7 @@ msgstr "Adicionar um item..."
msgid "Add checklist"
msgstr "Adicionar checklist"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Adicionar descrição... (digite '/' para abrir comandos ou '@' para mencionar)"
@@ -133,53 +133,48 @@ msgstr "Adicionar descrição... (digite '/' para abrir comandos ou '@' para men
#~ msgid "Add description... (type '/' to open commands)"
#~ msgstr "Adicionar descrição... (digite '/' para abrir comandos)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Adicionar detalhes..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Adicionar etiqueta"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Adicionar membro"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr ""
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "adicionou uma checklist"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "adicionou um item à checklist"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "adicionou uma etiqueta ao cartão"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
msgid "added a member to the card"
msgstr "adicionou um membro ao cartão"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "adicionou a checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
msgid "added checklist item <0>{0}</0>"
msgstr "adicionou o item <0>{0}</0> à checklist"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "adicionou a etiqueta <0>{0}</0>"
@@ -282,11 +277,11 @@ msgstr "Tem certeza de que deseja excluir este {0}?"
msgid "Are you sure you want to delete this card?"
msgstr "Tem certeza de que deseja excluir este cartão?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Tem certeza de que deseja excluir esta checklist?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Tem certeza de que deseja excluir este comentário?"
@@ -303,7 +298,7 @@ msgstr "Tem certeza de que deseja excluir sua conta?"
#~ msgstr "around the world"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "atribuído <0>{0}</0> ao cartão"
@@ -315,7 +310,7 @@ msgstr "atribuído <0>{0}</0> ao cartão"
msgid "Assignees"
msgstr "Responsáveis"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Anexo enviado"
@@ -357,9 +352,9 @@ msgstr "Portal de faturamento"
msgid "Blog Post"
msgstr "Post de blog"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Quadro"
@@ -385,7 +380,7 @@ msgstr "O nome do quadro não pode exceder 100 caracteres"
msgid "Board name is required"
msgstr "O nome do quadro é obrigatório"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Quadro não encontrado"
@@ -401,7 +396,7 @@ msgstr "A URL do quadro só pode conter letras, números e hífens"
msgid "Board URL cannot exceed 60 characters"
msgstr "A URL do quadro não pode exceder 60 caracteres"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "URL do quadro copiada para a área de transferência"
@@ -443,12 +438,11 @@ msgid "Bug Report"
msgstr "Relatório de bug"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -458,12 +452,12 @@ msgstr "Relatório de bug"
msgid "Cancel"
msgstr "Cancelar"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Cartão"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Cartão não encontrado"
@@ -486,8 +480,8 @@ msgstr "Alterar senha"
msgid "Change your language preferences."
msgstr "Altere suas preferências de idioma."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "alterou a data de vencimento para <0>{formattedDate}</0>"
@@ -500,7 +494,7 @@ msgstr "Confira alguns dos nossos projetos de código aberto favoritos."
msgid "Check your inbox"
msgstr "Verifique sua caixa de entrada"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Nome da checklist"
@@ -561,12 +555,12 @@ msgstr "Concluído"
msgid "Complete control and ownership:"
msgstr "Controle e propriedade completos:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "concluiu um item da checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "concluiu o item <0>{0}</0> da checklist"
@@ -621,10 +615,6 @@ msgstr "Continuar com {0}"
msgid "Control who can view and edit your boards."
msgstr "Controle quem pode ver e editar seus quadros."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr ""
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Recursos principais"
@@ -635,7 +625,7 @@ msgid "Create {0}"
msgstr "Criar {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Criar outro"
@@ -652,11 +642,11 @@ msgstr "Criar chave de API"
#~ msgid "Create board"
#~ msgstr "Create board"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Criar cartão"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Criar checklist"
@@ -686,13 +676,13 @@ msgstr "Criar novo {0}"
msgid "Create new key"
msgstr "Criar nova chave"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Criar nova etiqueta"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Criar nova lista"
@@ -709,7 +699,7 @@ msgstr "Criar template"
msgid "Create workspace"
msgstr "Criar workspace"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "criou o cartão"
@@ -773,11 +763,10 @@ msgstr "Desativar link de convite"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Excluir"
@@ -795,7 +784,7 @@ msgstr "Excluir quadro"
msgid "Delete card"
msgstr "Excluir cartão"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Excluir comentário"
@@ -813,21 +802,21 @@ msgstr "Excluir template"
msgid "Delete workspace"
msgstr "Excluir workspace"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "excluiu uma checklist"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "excluiu um item da checklist"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "excluiu a checklist <0>{0}</0>"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "excluiu o item <0>{0}</0> da checklist"
@@ -893,13 +882,13 @@ msgstr "Não tem uma conta? <0><1>Cadastre-se</1></0>"
msgid "Done"
msgstr "Concluído"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Falha no download"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Data de vencimento"
@@ -919,16 +908,12 @@ msgstr "Vence hoje"
msgid "Due tomorrow"
msgstr "Vence amanhã"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr ""
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Editar URL do quadro"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Editar comentário"
@@ -940,10 +925,6 @@ msgstr "Editar etiqueta"
msgid "Edit workspace URL"
msgstr "Editar URL do workspace"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr ""
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Edição"
@@ -960,10 +941,6 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Melhoria"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr ""
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Digite sua senha atual"
@@ -1088,17 +1065,13 @@ msgstr "Falha ao copiar link de convite"
msgid "Failed to create board"
msgstr "Falha ao criar quadro"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr ""
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Falha ao fazer login com {0}. Tente novamente."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Falha ao enviar o anexo. Tente novamente."
@@ -1217,7 +1190,7 @@ msgstr "Comece criando um novo {0}"
#~ msgid "Get started by creating a new board"
#~ msgstr "Get started by creating a new board"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Comece criando uma nova lista"
@@ -1300,10 +1273,6 @@ msgstr "Como faço auto-hospedagem?"
msgid "How is the project funded?"
msgstr "Como o projeto é financiado?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr ""
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Reconheço que todos os dados da minha conta serão excluídos permanentemente e desejo prosseguir."
@@ -1416,7 +1385,7 @@ msgstr "Links de convite"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Links de convite exigem uma assinatura Team ou Pro. Faça upgrade do seu workspace."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Convidar membro"
@@ -1464,8 +1433,8 @@ msgid "Keyboard Shortcuts"
msgstr "Atalhos de teclado"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Etiquetas"
@@ -1515,11 +1484,11 @@ msgstr "Licença"
msgid "Light"
msgstr "Claro"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Link copiado"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Lista"
@@ -1531,14 +1500,6 @@ msgstr "Nome da lista"
msgid "Lists"
msgstr "Listas"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr ""
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr ""
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
@@ -1567,12 +1528,12 @@ msgstr "link mágico"
msgid "Make template"
msgstr "Transformar em template"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
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:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "marcou o item <0>{0}</0> da checklist como incompleto"
@@ -1582,8 +1543,8 @@ msgstr "Prioridade média"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Membros"
@@ -1604,7 +1565,7 @@ msgstr "cobrança mensal"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
msgid "moved the card from <0>{0}</0> to<1>{1}</1>"
msgstr "moveu o cartão de <0>{0}</0> para <1>{1}</1>"
@@ -1612,7 +1573,7 @@ msgstr "moveu o cartão de <0>{0}</0> para <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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "moveu o cartão para outra lista"
@@ -1656,7 +1617,7 @@ msgstr "Nova chave de API"
msgid "New card"
msgstr "Novo cartão"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Nova checklist"
@@ -1669,7 +1630,7 @@ msgid "New label"
msgstr "Nova etiqueta"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Nova lista"
@@ -1730,7 +1691,7 @@ msgstr "Nenhum cartão de crédito é necessário"
msgid "No dates"
msgstr "Sem datas"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "Nenhuma URL de download disponível para este anexo."
@@ -1738,7 +1699,7 @@ 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:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Nenhuma lista"
@@ -1876,11 +1837,6 @@ msgstr "Digite um nome válido"
msgid "Please enter a valid password"
msgstr "Digite uma senha válida"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr ""
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Selecione um arquivo para enviar."
@@ -1894,27 +1850,26 @@ msgstr "Selecione um arquivo para enviar."
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -2014,21 +1969,16 @@ msgstr "Remover"
msgid "Remove member"
msgstr "Remover membro"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr ""
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "removeu uma etiqueta do cartão"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "removeu um membro do cartão"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "removeu a etiqueta <0>{0}</0>"
@@ -2036,22 +1986,22 @@ msgstr "removeu a etiqueta <0>{0}</0>"
#~ msgid "removed label <0>{label}</0>"
#~ msgstr "removed label <0>{label}</0>"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "removeu a data de vencimento"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "renomeou uma checklist"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "renomeou a checklist <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "renomeou o item da checklist para <0>{0}</0>"
@@ -2094,8 +2044,7 @@ msgstr "Função"
msgid "Run on your own infrastructure"
msgstr "Execute na sua própria infraestrutura"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Salvar"
@@ -2133,7 +2082,7 @@ msgstr "Auto-hospedar"
msgid "Self host with Github"
msgstr "Auto-hospedar com Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "auto-atribuiu o cartão"
@@ -2153,11 +2102,11 @@ msgstr "Enviar feedback"
msgid "Senior"
msgstr "Sênior"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Definir data de vencimento"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "definiu a data de vencimento"
@@ -2290,8 +2239,8 @@ msgstr "Plano Team"
msgid "Teams"
msgstr "Equipes"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Template"
@@ -2356,8 +2305,8 @@ msgstr "Eles não poderão acessar este workspace."
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Essa ação não pode ser desfeita."
@@ -2365,7 +2314,7 @@ msgstr "Essa ação não pode ser desfeita."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Esta chave de API será exibida apenas uma vez. Salve-a em um local seguro."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Este quadro é privado ou não existe"
@@ -2397,10 +2346,6 @@ msgstr "Esta URL de workspace está reservada"
msgid "This workspace username has already been taken"
msgstr "Este nome de usuário do workspace já está em uso"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr ""
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2439,19 +2384,19 @@ msgstr "Triagem"
#~ msgid "Trusted by fast-moving teams"
#~ msgstr "Trusted by fast-moving teams"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Confiado por equipes ágeis<0/>ao redor do mundo"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Não foi possível adicionar o item da checklist"
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Não foi possível adicionar comentário"
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr ""
@@ -2459,7 +2404,7 @@ msgstr ""
msgid "Unable to create card"
msgstr "Não foi possível criar o cartão"
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Não foi possível criar a checklist"
@@ -2476,7 +2421,7 @@ msgstr "Não foi possível criar o template"
msgid "Unable to create workspace"
msgstr "Não foi possível criar o workspace"
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Não foi possível excluir o anexo"
@@ -2484,15 +2429,15 @@ msgstr "Não foi possível excluir o anexo"
msgid "Unable to delete card"
msgstr "Não foi possível excluir o cartão"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Não foi possível excluir a checklist"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Não foi possível excluir o item da checklist"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Não foi possível excluir o comentário"
@@ -2500,10 +2445,6 @@ msgstr "Não foi possível excluir o comentário"
msgid "Unable to remove member"
msgstr "Não foi possível remover o membro"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr ""
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Não foi possível enviar o feedback"
@@ -2516,42 +2457,42 @@ msgstr "Não foi possível atualizar a URL do quadro"
msgid "Unable to update board visibility"
msgstr "Não foi possível atualizar a visibilidade do quadro"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Não foi possível atualizar o cartão"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Não foi possível atualizar a checklist"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Não foi possível atualizar o item da checklist"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Não foi possível atualizar o comentário"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Não foi possível atualizar a data de vencimento"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Não foi possível atualizar as etiquetas"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Não foi possível atualizar a lista"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Não foi possível atualizar os membros"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "removeu a atribuição de <0>{0}</0> do cartão"
@@ -2559,7 +2500,7 @@ msgstr "removeu a atribuição de <0>{0}</0> do cartão"
#~ msgid "unassigned <0>{memberName}</0> from the card"
#~ msgstr "unassigned <0>{memberName}</0> from the card"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "removeu a própria atribuição do cartão"
@@ -2618,24 +2559,24 @@ msgstr "Atualizar"
msgid "Update label"
msgstr "Atualizar etiqueta"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "atualizou um item da checklist"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "atualizou a descrição"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "atualizou a data de vencimento"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "atualizou o título"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "atualizou o título para <0>{0}</0>"
@@ -2661,8 +2602,8 @@ msgstr "Fazer upgrade para Pro (US$29/mês)"
#~ msgid "Upgrade to Team Plan"
#~ msgstr "Upgrade to Team Plan"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Falha no upload"
@@ -2715,7 +2656,7 @@ msgstr "Veja e gerencie seu faturamento e assinatura."
msgid "View docs"
msgstr "Ver documentação"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Somente visualização"
@@ -2723,7 +2664,7 @@ msgstr "Somente visualização"
msgid "View our roadmap."
msgstr "Veja nosso roadmap."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Ver workspace"
@@ -2776,10 +2717,10 @@ msgid "Why make an open source Trello?"
msgstr "Por que criar um Trello open source?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Workspace"
@@ -2917,7 +2858,7 @@ msgstr "Seus quadros foram importados."
msgid "Your display name has been updated."
msgstr "Seu nome de exibição foi atualizado."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Seu arquivo foi enviado com sucesso."
@@ -2956,7 +2897,3 @@ msgstr "O nome do seu workspace foi atualizado."
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "O slug do seu workspace foi atualizado."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr ""

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:124
#: src/views/card/components/Comment.tsx:123
msgid " (edited)"
msgstr " (отредактировано)"
@@ -31,17 +31,17 @@ msgstr "{0}"
#. placeholder {1}: board?.name ?? t`Board`
#. placeholder {1}: workspace.name ?? t`Workspace`
#: src/views/boards/index.tsx:33
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:453
#: src/views/board/components/NewCardForm.tsx:452
msgid "{0} labels"
msgstr "{0} метки"
#. placeholder {0}: isTemplate ? "Template" : "Board"
#: src/views/board/index.tsx:416
#: src/views/board/index.tsx:412
msgid "{0} not found"
msgstr "{0} не найден"
@@ -83,7 +83,7 @@ msgstr "Аккаунт удалён"
msgid "Actions"
msgstr "Действия"
#: src/views/card/index.tsx:387
#: src/views/card/index.tsx:386
#: src/views/public/board/CardModal.tsx:158
msgid "Activity"
msgstr "Активность"
@@ -100,12 +100,12 @@ msgstr "Журналы активности"
msgid "Add a card"
msgstr "Добавить карточку"
#: src/views/card/components/Comment.tsx:147
#: src/views/card/components/NewCommentForm.tsx:55
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/NewCommentForm.tsx:57
msgid "Add a comment..."
msgstr "Добавить комментарий..."
#: src/views/card/components/NewChecklistItemForm.tsx:141
#: src/views/card/components/NewChecklistItemForm.tsx:140
msgid "Add an item..."
msgstr "Добавить элемент..."
@@ -113,57 +113,52 @@ msgstr "Добавить элемент..."
msgid "Add checklist"
msgstr "Добавить чек-лист"
#: src/components/Editor.tsx:455
#: src/components/Editor.tsx:451
msgid "Add description... (type '/' to open commands or '@' to mention)"
msgstr "Добавить описание... (введите '/' для открытия команд или '@' для упоминания)"
#: src/views/card/components/ChecklistItemRow.tsx:200
#: src/views/card/components/ChecklistItemRow.tsx:172
msgid "Add details..."
msgstr "Добавить детали..."
#: src/views/card/components/LabelSelector.tsx:110
#: src/views/card/components/LabelSelector.tsx:115
#: src/views/card/components/LabelSelector.tsx:109
#: src/views/card/components/LabelSelector.tsx:114
msgid "Add label"
msgstr "Добавить метку"
#: src/views/card/components/MemberSelector.tsx:131
#: src/views/card/components/MemberSelector.tsx:130
#: src/views/members/components/InviteMemberForm.tsx:257
msgid "Add member"
msgstr "Добавить участника"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:77
msgid "added {0} labels: <0>{labelList}</0>"
msgstr "добавил {0} метки: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:107
#: src/views/card/components/ActivityList.tsx:66
msgid "added a checklist"
msgstr "добавил(а) чек-лист"
#: src/views/card/components/ActivityList.tsx:110
#: src/views/card/components/ActivityList.tsx:69
msgid "added a checklist item"
msgstr "добавил(а) элемент чек-листа"
#: src/views/card/components/ActivityList.tsx:103
#: src/views/card/components/ActivityList.tsx:62
msgid "added a label to the card"
msgstr "добавил(а) метку к карточке"
#: src/views/card/components/ActivityList.tsx:105
#: src/views/card/components/ActivityList.tsx:64
msgid "added a member to the card"
msgstr "добавил(а) участника к карточке"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:181
#: src/views/card/components/ActivityList.tsx:146
msgid "added checklist <0>{0}</0>"
msgstr "добавлен контрольный список <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:205
#: src/views/card/components/ActivityList.tsx:170
msgid "added checklist item <0>{0}</0>"
msgstr "добавлен элемент контрольного списка <0>{0}</0>"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:165
#: src/views/card/components/ActivityList.tsx:130
msgid "added label <0>{0}</0>"
msgstr "добавлена метка <0>{0}</0>"
@@ -254,11 +249,11 @@ msgstr "Вы уверены, что хотите удалить этот {0}?"
msgid "Are you sure you want to delete this card?"
msgstr "Вы уверены, что хотите удалить эту карточку?"
#: src/views/card/components/DeleteChecklistConfirmation.tsx:56
#: src/views/card/components/DeleteChecklistConfirmation.tsx:55
msgid "Are you sure you want to delete this checklist?"
msgstr "Вы уверены, что хотите удалить этот контрольный список?"
#: src/views/card/components/DeleteCommentConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:65
msgid "Are you sure you want to delete this comment?"
msgstr "Вы уверены, что хотите удалить этот комментарий?"
@@ -271,7 +266,7 @@ msgid "Are you sure you want to delete your account?"
msgstr "Вы уверены, что хотите удалить свой аккаунт?"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:145
#: src/views/card/components/ActivityList.tsx:110
msgid "assigned <0>{0}</0> to the card"
msgstr "назначено <0>{0}</0> к карточке"
@@ -279,7 +274,7 @@ msgstr "назначено <0>{0}</0> к карточке"
msgid "Assignees"
msgstr "Исполнители"
#: src/views/card/components/AttachmentUpload.tsx:26
#: src/views/card/components/AttachmentUpload.tsx:25
msgid "Attachment uploaded"
msgstr "Вложение загружено"
@@ -317,9 +312,9 @@ msgstr "Портал выставления счетов"
msgid "Blog Post"
msgstr "Пост в блоге"
#: src/views/board/index.tsx:390
#: src/views/card/index.tsx:273
#: src/views/public/board/index.tsx:114
#: src/views/board/index.tsx:386
#: src/views/card/index.tsx:272
#: src/views/public/board/index.tsx:113
msgid "Board"
msgstr "Доска"
@@ -336,7 +331,7 @@ msgstr "Название доски не может превышать 100 си
msgid "Board name is required"
msgstr "Название доски обязательно"
#: src/views/public/board/index.tsx:166
#: src/views/public/board/index.tsx:165
msgid "Board not found"
msgstr "Доска не найдена"
@@ -352,7 +347,7 @@ msgstr "URL доски может содержать только буквы, ц
msgid "Board URL cannot exceed 60 characters"
msgstr "URL доски не может превышать 60 символов"
#: src/views/public/board/index.tsx:80
#: src/views/public/board/index.tsx:79
msgid "Board URL copied to clipboard"
msgstr "URL доски скопирован в буфер обмена"
@@ -386,12 +381,11 @@ msgid "Bug Report"
msgstr "Отчет об ошибке"
#: src/components/DeleteLabelConfirmation.tsx:49
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:176
#: src/views/board/components/DeleteBoardConfirmation.tsx:44
#: src/views/card/components/Comment.tsx:159
#: src/views/card/components/Comment.tsx:158
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/DeleteChecklistConfirmation.tsx:64
#: src/views/card/components/DeleteCommentConfirmation.tsx:77
#: src/views/card/components/DeleteChecklistConfirmation.tsx:63
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/settings/components/Avatar.tsx:306
#: src/views/settings/components/ChangePasswordConfirmation.tsx:168
@@ -401,12 +395,12 @@ msgstr "Отчет об ошибке"
msgid "Cancel"
msgstr "Отмена"
#: src/views/card/index.tsx:273
#: src/views/card/index.tsx:272
msgid "Card"
msgstr "Карточка"
#: src/views/card/index.tsx:307
#: src/views/card/index.tsx:343
#: src/views/card/index.tsx:306
#: src/views/card/index.tsx:342
msgid "Card not found"
msgstr "Карточка не найдена"
@@ -425,8 +419,8 @@ msgstr "Изменить пароль"
msgid "Change your language preferences."
msgstr "Измените настройки языка."
#: src/views/card/components/ActivityList.tsx:255
#: src/views/card/components/ActivityList.tsx:269
#: src/views/card/components/ActivityList.tsx:220
#: src/views/card/components/ActivityList.tsx:234
msgid "changed the due date to <0>{formattedDate}</0>"
msgstr "изменил(а) дату выполнения на <0>{formattedDate}</0>"
@@ -439,7 +433,7 @@ msgstr "Ознакомьтесь с некоторыми из наших люб
msgid "Check your inbox"
msgstr "Проверьте ваш почтовый ящик"
#: src/views/card/components/NewChecklistForm.tsx:119
#: src/views/card/components/NewChecklistForm.tsx:118
msgid "Checklist name"
msgstr "Название контрольного списка"
@@ -500,12 +494,12 @@ msgstr "Завершить"
msgid "Complete control and ownership:"
msgstr "Полный контроль и владение:"
#: src/views/card/components/ActivityList.tsx:112
#: src/views/card/components/ActivityList.tsx:71
msgid "completed a checklist item"
msgstr "завершил элемент контрольного списка"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:222
#: src/views/card/components/ActivityList.tsx:187
msgid "completed checklist item <0>{0}</0>"
msgstr "завершил элемент контрольного списка <0>{0}</0>"
@@ -556,10 +550,6 @@ msgstr "Продолжить с {0}"
msgid "Control who can view and edit your boards."
msgstr "Управляйте тем, кто может просматривать и редактировать ваши доски."
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:47
msgid "Convert to link"
msgstr "Преобразовать в ссылку"
#: src/views/pricing/components/FeatureComparisonTable.tsx:38
msgid "Core features"
msgstr "Основные функции"
@@ -570,7 +560,7 @@ msgid "Create {0}"
msgstr "Создать {0}"
#: src/components/LabelForm.tsx:213
#: src/views/board/components/NewCardForm.tsx:517
#: src/views/board/components/NewCardForm.tsx:516
#: src/views/board/components/NewListForm.tsx:141
msgid "Create another"
msgstr "Создать ещё одну"
@@ -579,11 +569,11 @@ msgstr "Создать ещё одну"
msgid "Create API key"
msgstr "Создать API-ключ"
#: src/views/board/components/NewCardForm.tsx:527
#: src/views/board/components/NewCardForm.tsx:526
msgid "Create card"
msgstr "Создать карточку"
#: src/views/card/components/NewChecklistForm.tsx:135
#: src/views/card/components/NewChecklistForm.tsx:134
msgid "Create checklist"
msgstr "Создать чек-лист"
@@ -609,13 +599,13 @@ msgstr "Создать новый {0}"
msgid "Create new key"
msgstr "Создать новый ключ"
#: src/views/board/components/NewCardForm.tsx:415
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:414
#: src/views/card/components/LabelSelector.tsx:97
msgid "Create new label"
msgstr "Создать новую метку"
#: src/views/board/index.tsx:65
#: src/views/board/index.tsx:507
#: src/views/board/index.tsx:503
msgid "Create new list"
msgstr "Создать новый список"
@@ -628,7 +618,7 @@ msgstr "Создать шаблон"
msgid "Create workspace"
msgstr "Создать рабочее пространство"
#: src/views/card/components/ActivityList.tsx:99
#: src/views/card/components/ActivityList.tsx:58
msgid "created the card"
msgstr "создал(а) карточку"
@@ -684,11 +674,10 @@ msgstr "Деактивировать ссылку-приглашение"
#: src/components/DeleteLabelConfirmation.tsx:51
#: src/components/LabelForm.tsx:228
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:52
#: src/views/board/components/DeleteBoardConfirmation.tsx:47
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/views/card/components/DeleteChecklistConfirmation.tsx:67
#: src/views/card/components/DeleteCommentConfirmation.tsx:83
#: src/views/card/components/DeleteChecklistConfirmation.tsx:66
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
msgid "Delete"
msgstr "Удалить"
@@ -706,7 +695,7 @@ msgstr "Удалить доску"
msgid "Delete card"
msgstr "Удалить карточку"
#: src/views/card/components/Comment.tsx:92
#: src/views/card/components/Comment.tsx:91
msgid "Delete comment"
msgstr "Удалить комментарий"
@@ -724,21 +713,21 @@ msgstr "Удалить шаблон"
msgid "Delete workspace"
msgstr "Удалить рабочее пространство"
#: src/views/card/components/ActivityList.tsx:109
#: src/views/card/components/ActivityList.tsx:68
msgid "deleted a checklist"
msgstr "удалил контрольный список"
#: src/views/card/components/ActivityList.tsx:114
#: src/views/card/components/ActivityList.tsx:73
msgid "deleted a checklist item"
msgstr "удалил элемент контрольного списка"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:197
#: src/views/card/components/ActivityList.tsx:162
msgid "deleted checklist <0>{0}</0>"
msgstr "удалил контрольный список <0>{0}</0>"
#. placeholder {0}: truncate(fromTitle)
#: src/views/card/components/ActivityList.tsx:240
#: src/views/card/components/ActivityList.tsx:205
msgid "deleted checklist item <0>{0}</0>"
msgstr "удалил элемент контрольного списка <0>{0}</0>"
@@ -804,13 +793,13 @@ msgstr "Нет аккаунта? <0><1>Зарегистрируйтесь</1></0
msgid "Done"
msgstr "Готово"
#: src/views/card/components/AttachmentThumbnails.tsx:142
#: src/views/card/components/AttachmentThumbnails.tsx:141
msgid "Download failed"
msgstr "Не удалось загрузить"
#: src/views/board/components/Filters.tsx:171
#: src/views/board/components/NewCardForm.tsx:470
#: src/views/card/index.tsx:140
#: src/views/board/components/NewCardForm.tsx:469
#: src/views/card/index.tsx:138
msgid "Due date"
msgstr "Дата выполнения"
@@ -830,16 +819,12 @@ msgstr "Срок сегодня"
msgid "Due tomorrow"
msgstr "Срок завтра"
#: src/components/YouTubeEmbed/YouTubeDropdown.tsx:42
msgid "Edit"
msgstr "Редактировать"
#: src/views/board/components/BoardDropdown.tsx:41
#: src/views/board/components/UpdateBoardSlugForm.tsx:116
msgid "Edit board URL"
msgstr "Изменить URL доски"
#: src/views/card/components/Comment.tsx:83
#: src/views/card/components/Comment.tsx:82
msgid "Edit comment"
msgstr "Редактировать комментарий"
@@ -851,10 +836,6 @@ msgstr "Редактировать метку"
msgid "Edit workspace URL"
msgstr "Редактировать URL рабочей области"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:108
msgid "Edit YouTube Video"
msgstr "Редактировать видео YouTube"
#: src/views/boards/components/TemplateBoards.tsx:32
msgid "Editing"
msgstr "Редактирование"
@@ -871,10 +852,6 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Улучшение"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:131
msgid "Enter a custom title"
msgstr "Введите собственный заголовок"
#: src/views/settings/components/ChangePasswordConfirmation.tsx:122
msgid "Enter your current password"
msgstr "Введите ваш текущий пароль"
@@ -999,17 +976,13 @@ msgstr "Не удалось скопировать ссылку приглаше
msgid "Failed to create board"
msgstr "Не удалось создать доску"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:82
msgid "Failed to fetch video information"
msgstr "Не удалось получить информацию о видео"
#. placeholder {0}: provider.at(0)?.toUpperCase() + provider.slice(1)
#: src/components/AuthForm.tsx:291
msgid "Failed to login with {0}. Please try again."
msgstr "Не удалось войти с {0}. Пожалуйста, попробуйте снова."
#: src/views/card/components/AttachmentUpload.tsx:34
#: src/views/card/components/AttachmentUpload.tsx:80
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
msgid "Failed to upload attachment. Please try again."
msgstr "Не удалось загрузить вложение. Пожалуйста, попробуйте еще раз."
@@ -1116,7 +1089,7 @@ msgstr "Начать"
msgid "Get started by creating a new {0}"
msgstr "Начните с создания нового {0}"
#: src/views/board/index.tsx:499
#: src/views/board/index.tsx:495
msgid "Get started by creating a new list"
msgstr "Начните с создания нового списка"
@@ -1199,10 +1172,6 @@ msgstr "Как разместить самостоятельно?"
msgid "How is the project funded?"
msgstr "Как финансируется проект?"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:151
msgid "https://www.youtube.com/watch?v=..."
msgstr "https://www.youtube.com/watch?v=..."
#: src/views/settings/components/DeleteAccountConfirmation.tsx:82
msgid "I acknowledge that all of my account data will be permanently deleted and want to proceed."
msgstr "Я подтверждаю, что все данные моего аккаунта будут безвозвратно удалены, и хочу продолжить."
@@ -1307,7 +1276,7 @@ msgstr "Ссылки-приглашения"
msgid "Invite links require a Team or Pro subscription. Please upgrade your workspace."
msgstr "Ссылки для приглашений требуют подписки Team или Pro. Пожалуйста, обновите ваше рабочее пространство."
#: src/views/card/components/MemberSelector.tsx:112
#: src/views/card/components/MemberSelector.tsx:111
#: src/views/members/components/InviteMemberForm.tsx:367
msgid "Invite member"
msgstr "Пригласить участника"
@@ -1355,8 +1324,8 @@ msgid "Keyboard Shortcuts"
msgstr "Горячие клавиши"
#: src/views/board/components/Filters.tsx:155
#: src/views/board/components/NewCardForm.tsx:419
#: src/views/card/index.tsx:122
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/card/index.tsx:120
msgid "Labels"
msgstr "Метки"
@@ -1406,11 +1375,11 @@ msgstr "Лицензия"
msgid "Light"
msgstr "Светлый"
#: src/views/public/board/index.tsx:78
#: src/views/public/board/index.tsx:77
msgid "Link copied"
msgstr "Ссылка скопирована"
#: src/views/card/index.tsx:114
#: src/views/card/index.tsx:112
msgid "List"
msgstr "Список"
@@ -1422,14 +1391,6 @@ msgstr "Название списка"
msgid "Lists"
msgstr "Списки"
#: src/views/card/components/ActivityList.tsx:530
msgid "Load more activities"
msgstr "Загрузить больше действий"
#: src/views/card/components/ActivityList.tsx:530
msgid "Loading..."
msgstr "Загрузка..."
#: src/views/auth/login/index.tsx:33
msgid "Login | kan.bn"
msgstr "Вход | kan.bn"
@@ -1458,12 +1419,12 @@ msgstr "магическая ссылка"
msgid "Make template"
msgstr "Создать шаблон"
#: src/views/card/components/ActivityList.tsx:113
#: src/views/card/components/ActivityList.tsx:72
msgid "marked a checklist item as incomplete"
msgstr "отметил элемент контрольного списка как незавершённый"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:231
#: src/views/card/components/ActivityList.tsx:196
msgid "marked checklist item <0>{0}</0> as incomplete"
msgstr "отметил элемент контрольного списка <0>{0}</0> как незавершённый"
@@ -1473,8 +1434,8 @@ msgstr "Средний приоритет"
#: src/components/SideNavigation.tsx:121
#: src/views/board/components/Filters.tsx:147
#: src/views/board/components/NewCardForm.tsx:377
#: src/views/card/index.tsx:131
#: src/views/board/components/NewCardForm.tsx:376
#: src/views/card/index.tsx:129
#: src/views/members/index.tsx:178
msgid "Members"
msgstr "Участники"
@@ -1495,11 +1456,11 @@ msgstr "ежемесячная оплата"
#. placeholder {0}: truncate(fromList)
#. placeholder {1}: truncate(toList)
#: src/views/card/components/ActivityList.tsx:133
#: src/views/card/components/ActivityList.tsx:98
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:102
#: src/views/card/components/ActivityList.tsx:61
msgid "moved the card to another list"
msgstr "переместил карточку в другой список"
@@ -1535,7 +1496,7 @@ msgstr "Новый API-ключ"
msgid "New card"
msgstr "Новая карточка"
#: src/views/card/components/NewChecklistForm.tsx:103
#: src/views/card/components/NewChecklistForm.tsx:102
msgid "New checklist"
msgstr "Новый контрольный список"
@@ -1548,7 +1509,7 @@ msgid "New label"
msgstr "Новая метка"
#: src/views/board/components/NewListForm.tsx:113
#: src/views/board/index.tsx:470
#: src/views/board/index.tsx:466
msgid "New list"
msgstr "Новый список"
@@ -1601,7 +1562,7 @@ msgstr "Кредитная карта не требуется"
msgid "No dates"
msgstr "Нет дат"
#: src/views/card/components/AttachmentThumbnails.tsx:143
#: src/views/card/components/AttachmentThumbnails.tsx:142
msgid "No download URL available for this attachment."
msgstr "URL для загрузки этого вложения недоступен."
@@ -1609,7 +1570,7 @@ msgstr "URL для загрузки этого вложения недоступ
msgid "No keyboard shortcuts registered."
msgstr "Горячие клавиши не зарегистрированы."
#: src/views/board/index.tsx:496
#: src/views/board/index.tsx:492
msgid "No lists"
msgstr "Нет списков"
@@ -1747,11 +1708,6 @@ msgstr "Пожалуйста, введите действительное имя
msgid "Please enter a valid password"
msgstr "Пожалуйста, введите действительный пароль"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:58
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:98
msgid "Please enter a valid YouTube URL"
msgstr "Пожалуйста, введите корректный URL YouTube"
#: src/views/settings/components/Avatar.tsx:92
msgid "Please select a file to upload."
msgstr "Пожалуйста, выберите файл для загрузки."
@@ -1765,27 +1721,26 @@ msgstr "Пожалуйста, выберите файл для загрузки.
#: src/views/board/components/NewTemplateForm.tsx:77
#: src/views/board/components/UpdateBoardSlugForm.tsx:73
#: src/views/board/components/VisibilityButton.tsx:54
#: src/views/board/index.tsx:171
#: src/views/board/index.tsx:227
#: src/views/board/index.tsx:174
#: src/views/board/index.tsx:230
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/card/components/AttachmentThumbnails.tsx:74
#: src/views/card/components/ChecklistItemRow.tsx:69
#: src/views/card/components/ChecklistItemRow.tsx:97
#: src/views/card/components/ChecklistNameInput.tsx:47
#: src/views/card/components/Checklists.tsx:81
#: src/views/card/components/Comment.tsx:65
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/ChecklistItemRow.tsx:60
#: src/views/card/components/ChecklistItemRow.tsx:88
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/DeleteChecklistConfirmation.tsx:38
#: src/views/card/components/DeleteCommentConfirmation.tsx:46
#: src/views/card/components/DueDateSelector.tsx:60
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/NewChecklistForm.tsx:71
#: src/views/card/components/NewChecklistItemForm.tsx:90
#: src/views/card/components/NewCommentForm.tsx:32
#: src/views/card/index.tsx:188
#: src/views/card/index.tsx:201
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/ListSelector.tsx:52
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/index.tsx:187
#: src/views/card/index.tsx:200
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/members/components/InviteMemberForm.tsx:104
#: src/views/members/components/InviteMemberForm.tsx:241
@@ -1885,40 +1840,35 @@ msgstr "Удалить"
msgid "Remove member"
msgstr "Удалить участника"
#. placeholder {0}: mergedLabels.length
#: src/views/card/components/ActivityList.tsx:91
msgid "removed {0} labels: <0>{labelList}</0>"
msgstr "удалил {0} метки: <0>{labelList}</0>"
#: src/views/card/components/ActivityList.tsx:104
#: src/views/card/components/ActivityList.tsx:63
msgid "removed a label from the card"
msgstr "удалил метку с карточки"
#: src/views/card/components/ActivityList.tsx:106
#: src/views/card/components/ActivityList.tsx:65
msgid "removed a member from the card"
msgstr "удалил участника из карточки"
#. placeholder {0}: truncate(label)
#: src/views/card/components/ActivityList.tsx:173
#: src/views/card/components/ActivityList.tsx:138
msgid "removed label <0>{0}</0>"
msgstr "удалил метку <0>{0}</0>"
#: src/views/card/components/ActivityList.tsx:117
#: src/views/card/components/ActivityList.tsx:276
#: src/views/card/components/ActivityList.tsx:76
#: src/views/card/components/ActivityList.tsx:241
msgid "removed the due date"
msgstr "удалил(а) дату выполнения"
#: src/views/card/components/ActivityList.tsx:108
#: src/views/card/components/ActivityList.tsx:67
msgid "renamed a checklist"
msgstr "переименовал контрольный список"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:189
#: src/views/card/components/ActivityList.tsx:154
msgid "renamed checklist <0>{0}</0>"
msgstr "переименовал контрольный список <0>{0}</0>"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:213
#: src/views/card/components/ActivityList.tsx:178
msgid "renamed checklist item to <0>{0}</0>"
msgstr "переименовал элемент контрольного списка в <0>{0}</0>"
@@ -1957,8 +1907,7 @@ msgstr "Роль"
msgid "Run on your own infrastructure"
msgstr "Запустите на своей инфраструктуре"
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:183
#: src/views/card/components/Comment.tsx:166
#: src/views/card/components/Comment.tsx:165
#: src/views/settings/components/Avatar.tsx:309
msgid "Save"
msgstr "Сохранить"
@@ -1996,7 +1945,7 @@ msgstr "Самостоятельный хостинг"
msgid "Self host with Github"
msgstr "Самостоятельный хостинг с Github"
#: src/views/card/components/ActivityList.tsx:142
#: src/views/card/components/ActivityList.tsx:107
msgid "self-assigned the card"
msgstr "самостоятельно назначил карточку"
@@ -2012,11 +1961,11 @@ msgstr "Отправить отзыв"
msgid "Senior"
msgstr "Старший"
#: src/views/card/components/DueDateSelector.tsx:117
#: src/views/card/components/DueDateSelector.tsx:116
msgid "Set due date"
msgstr "Установить дату выполнения"
#: src/views/card/components/ActivityList.tsx:115
#: src/views/card/components/ActivityList.tsx:74
msgid "set the due date"
msgstr "установил(а) дату выполнения"
@@ -2141,8 +2090,8 @@ msgstr "Командный план"
msgid "Teams"
msgstr "Команды"
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:425
#: src/views/board/index.tsx:386
#: src/views/board/index.tsx:421
msgid "Template"
msgstr "Шаблон"
@@ -2207,8 +2156,8 @@ msgstr "Они не смогут получить доступ к этому р
#: src/components/DeleteLabelConfirmation.tsx:44
#: src/views/board/components/DeleteBoardConfirmation.tsx:39
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/views/card/components/DeleteChecklistConfirmation.tsx:59
#: src/views/card/components/DeleteCommentConfirmation.tsx:69
#: src/views/card/components/DeleteChecklistConfirmation.tsx:58
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
msgid "This action can't be undone."
msgstr "Это действие нельзя будет отменить."
@@ -2216,7 +2165,7 @@ msgstr "Это действие нельзя будет отменить."
msgid "This API key will only be shown once. Please save it in a secure location."
msgstr "Этот API-ключ будет показан только один раз. Пожалуйста, сохраните его в безопасном месте."
#: src/views/public/board/index.tsx:169
#: src/views/public/board/index.tsx:168
msgid "This board is private or does not exist"
msgstr "Эта доска является приватной или не существует."
@@ -2248,10 +2197,6 @@ msgstr "Этот URL рабочего пространства зарезерв
msgid "This workspace username has already been taken"
msgstr "Это имя пользователя рабочего пространства уже занято."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:127
msgid "Title"
msgstr "Заголовок"
#: src/views/boards/components/TemplateBoards.tsx:17
#: src/views/boards/components/TemplateBoards.tsx:23
msgid "To Do"
@@ -2282,27 +2227,27 @@ msgstr "Импорт Trello"
msgid "Triaging"
msgstr "Сортировка"
#: src/views/home/components/Logos.tsx:67
#: src/views/home/components/Logos.tsx:73
msgid "Trusted by fast-moving teams<0/>around the world"
msgstr "Доверяют динамичным командам<0/>по всему миру"
#: src/views/card/components/NewChecklistItemForm.tsx:89
#: src/views/card/components/NewChecklistItemForm.tsx:88
msgid "Unable to add checklist item"
msgstr "Не удалось добавить элемент контрольного списка."
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/NewCommentForm.tsx:30
msgid "Unable to add comment"
msgstr "Не удалось добавить комментарий."
#: src/views/card/index.tsx:200
#: src/views/card/index.tsx:199
msgid "Unable to add label"
msgstr "Не удалось добавить метку"
msgstr ""
#: src/views/board/components/NewCardForm.tsx:181
msgid "Unable to create card"
msgstr "Не удалось создать карточку."
#: src/views/card/components/NewChecklistForm.tsx:70
#: src/views/card/components/NewChecklistForm.tsx:69
msgid "Unable to create checklist"
msgstr "Не удалось создать контрольный список."
@@ -2319,7 +2264,7 @@ msgstr "Не удалось создать шаблон"
msgid "Unable to create workspace"
msgstr "Не удалось создать рабочее пространство."
#: src/views/card/components/AttachmentThumbnails.tsx:73
#: src/views/card/components/AttachmentThumbnails.tsx:72
msgid "Unable to delete attachment"
msgstr "Не удалось удалить вложение"
@@ -2327,15 +2272,15 @@ msgstr "Не удалось удалить вложение"
msgid "Unable to delete card"
msgstr "Не удалось удалить карточку."
#: src/views/card/components/DeleteChecklistConfirmation.tsx:37
#: src/views/card/components/DeleteChecklistConfirmation.tsx:36
msgid "Unable to delete checklist"
msgstr "Не удалось удалить контрольный список"
#: src/views/card/components/ChecklistItemRow.tsx:96
#: src/views/card/components/ChecklistItemRow.tsx:87
msgid "Unable to delete checklist item"
msgstr "Не удалось удалить элемент контрольного списка"
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCommentConfirmation.tsx:44
msgid "Unable to delete comment"
msgstr "Не удалось удалить комментарий"
@@ -2343,10 +2288,6 @@ msgstr "Не удалось удалить комментарий"
msgid "Unable to remove member"
msgstr "Не удалось удалить участника"
#: src/views/card/components/Checklists.tsx:80
msgid "Unable to reorder checklist item"
msgstr "Не удалось изменить порядок элемента контрольного списка"
#: src/components/FeedbackModal.tsx:40
msgid "Unable to send feedback"
msgstr "Не удалось отправить отзыв"
@@ -2359,46 +2300,46 @@ msgstr "Не удалось обновить URL доски"
msgid "Unable to update board visibility"
msgstr "Не удалось обновить видимость доски"
#: src/views/board/index.tsx:226
#: src/views/card/index.tsx:187
#: src/views/board/index.tsx:229
#: src/views/card/index.tsx:186
msgid "Unable to update card"
msgstr "Не удалось обновить карточку"
#: src/views/card/components/ChecklistNameInput.tsx:46
#: src/views/card/components/ChecklistNameInput.tsx:45
msgid "Unable to update checklist"
msgstr "Не удалось обновить контрольный список"
#: src/views/card/components/ChecklistItemRow.tsx:68
#: src/views/card/components/ChecklistItemRow.tsx:59
msgid "Unable to update checklist item"
msgstr "Не удалось обновить элемент контрольного списка"
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:63
msgid "Unable to update comment"
msgstr "Не удалось обновить комментарий"
#: src/views/card/components/DueDateSelector.tsx:59
#: src/views/card/components/DueDateSelector.tsx:58
msgid "Unable to update due date"
msgstr "Не удалось обновить дату выполнения"
#: src/views/card/components/LabelSelector.tsx:72
#: src/views/card/components/LabelSelector.tsx:71
msgid "Unable to update labels"
msgstr "Не удалось обновить метки"
#: src/views/board/index.tsx:170
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:173
#: src/views/card/components/ListSelector.tsx:51
msgid "Unable to update list"
msgstr "Не удалось обновить список"
#: src/views/card/components/MemberSelector.tsx:79
#: src/views/card/components/MemberSelector.tsx:78
msgid "Unable to update members"
msgstr "Не удалось обновить участников"
#. placeholder {0}: truncate(memberName)
#: src/views/card/components/ActivityList.tsx:156
#: src/views/card/components/ActivityList.tsx:121
msgid "unassigned <0>{0}</0> from the card"
msgstr "удалил(а) <0>{0}</0> из карточки"
#: src/views/card/components/ActivityList.tsx:153
#: src/views/card/components/ActivityList.tsx:118
msgid "unassigned themselves from the card"
msgstr "удалил(а) себя из карточки"
@@ -2457,24 +2398,24 @@ msgstr "Обновить"
msgid "Update label"
msgstr "Обновить метку"
#: src/views/card/components/ActivityList.tsx:111
#: src/views/card/components/ActivityList.tsx:70
msgid "updated a checklist item"
msgstr "обновлен элемент контрольного списка"
#: src/views/card/components/ActivityList.tsx:101
#: src/views/card/components/ActivityList.tsx:60
msgid "updated the description"
msgstr "обновлено описание"
#: src/views/card/components/ActivityList.tsx:116
#: src/views/card/components/ActivityList.tsx:75
msgid "updated the due date"
msgstr "обновил(а) дату выполнения"
#: src/views/card/components/ActivityList.tsx:100
#: src/views/card/components/ActivityList.tsx:59
msgid "updated the title"
msgstr "обновлен заголовок"
#. placeholder {0}: truncate(toTitle)
#: src/views/card/components/ActivityList.tsx:125
#: src/views/card/components/ActivityList.tsx:90
msgid "updated the title to <0>{0}</0>"
msgstr "обновлен заголовок на <0>{0}</0>"
@@ -2488,8 +2429,8 @@ msgstr "Обновить до Pro"
msgid "Upgrade to Pro ($29/month)"
msgstr "Обновить до Pro ($29/месяц)"
#: src/views/card/components/AttachmentUpload.tsx:33
#: src/views/card/components/AttachmentUpload.tsx:79
#: src/views/card/components/AttachmentUpload.tsx:32
#: src/views/card/components/AttachmentUpload.tsx:78
msgid "Upload failed"
msgstr "Не удалось загрузить"
@@ -2542,7 +2483,7 @@ msgstr "Просмотр и управление вашими счетами и
msgid "View docs"
msgstr "Просмотреть документацию"
#: src/views/public/board/index.tsx:142
#: src/views/public/board/index.tsx:141
msgid "View only"
msgstr "Только просмотр"
@@ -2550,7 +2491,7 @@ msgstr "Только просмотр"
msgid "View our roadmap."
msgstr "Просмотреть нашу дорожную карту."
#: src/views/public/board/index.tsx:172
#: src/views/public/board/index.tsx:171
msgid "View workspace"
msgstr "Просмотреть рабочее пространство"
@@ -2595,10 +2536,10 @@ msgid "Why make an open source Trello?"
msgstr "Зачем создавать Trello с открытым исходным кодом?"
#: src/components/SettingsLayout.tsx:39
#: src/views/board/index.tsx:390
#: src/views/board/index.tsx:386
#: src/views/boards/index.tsx:33
#: src/views/members/index.tsx:173
#: src/views/public/board/index.tsx:114
#: src/views/public/board/index.tsx:113
#: src/views/public/boards/index.tsx:66
msgid "Workspace"
msgstr "Рабочее пространство"
@@ -2732,7 +2673,7 @@ msgstr "Ваши доски были импортированы."
msgid "Your display name has been updated."
msgstr "Ваше отображаемое имя было обновлено."
#: src/views/card/components/AttachmentUpload.tsx:27
#: src/views/card/components/AttachmentUpload.tsx:26
msgid "Your file has been uploaded successfully."
msgstr "Ваш файл успешно загружен."
@@ -2771,7 +2712,3 @@ msgstr "Название вашего рабочего пространства
#: src/views/settings/components/UpdateWorkspaceUrlForm.tsx:61
msgid "Your workspace slug has been updated."
msgstr "Slug вашего рабочего пространства был обновлён."
#: src/components/YouTubeEmbed/EditYouTubeModal.tsx:147
msgid "YouTube URL"
msgstr "YouTube URL"

File diff suppressed because one or more lines are too long

View File

@@ -88,7 +88,6 @@ export default async function handler(
const session = await stripe.checkout.sessions.create({
mode: "subscription",
payment_method_collection: "always",
line_items: [
{
price: process.env.STRIPE_PRO_PLAN_MONTHLY_PRICE_ID,

View File

@@ -1,16 +0,0 @@
import type { api } from "~/utils/api";
/**
* Invalidates all card-related queries for a given card.
* Use this after any mutation that affects card data or activities.
*/
export async function invalidateCard(
utils: ReturnType<typeof api.useUtils>,
cardPublicId: string,
) {
await Promise.all([
utils.card.byId.invalidate({ cardPublicId }),
utils.card.getActivities.invalidate({ cardPublicId }),
]);
}

View File

@@ -335,7 +335,7 @@ export function NewCardForm({
saveFormState({ ...formState, description: value });
}}
workspaceMembers={
boardData?.workspace.members.map(
boardData?.workspace.members?.map(
(member): WorkspaceMember => ({
publicId: member.publicId,
email: member.email,
@@ -349,7 +349,6 @@ export function NewCardForm({
}),
) ?? []
}
enableYouTubeEmbed={false}
/>
</div>
</div>

View File

@@ -24,7 +24,6 @@ import { PageHead } from "~/components/PageHead";
import PatternedBackground from "~/components/PatternedBackground";
import { StrictModeDroppable as Droppable } from "~/components/StrictModeDroppable";
import { Tooltip } from "~/components/Tooltip";
import { EditYouTubeModal } from "~/components/YouTubeEmbed/EditYouTubeModal";
import { useKeyboardShortcut } from "~/providers/keyboard-shortcuts";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
@@ -373,13 +372,6 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
sourceBoardName={boardData?.name ?? ""}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "EDIT_YOUTUBE"}
>
<EditYouTubeModal />
</Modal>
</>
);
};

View File

@@ -2,7 +2,6 @@ import type { Locale as DateFnsLocale } from "date-fns";
import { t } from "@lingui/core/macro";
import { Trans } from "@lingui/react/macro";
import { format, formatDistanceToNow, isSameYear } from "date-fns";
import { useEffect, useRef, useState } from "react";
import {
HiOutlineArrowLeft,
HiOutlineArrowRight,
@@ -16,15 +15,11 @@ import {
HiOutlineUserPlus,
} from "react-icons/hi2";
import type {
GetCardActivitiesOutput,
GetCardByIdOutput,
} from "@kan/api/types";
import type { GetCardByIdOutput } from "@kan/api/types";
import { authClient } from "@kan/auth/client";
import Avatar from "~/components/Avatar";
import { useLocalisation } from "~/hooks/useLocalisation";
import { api } from "~/utils/api";
import Comment from "./Comment";
type ActivityType =
@@ -46,7 +41,6 @@ const getActivityText = ({
fromTitle,
toDueDate,
dateLocale,
mergedLabels,
}: {
type: ActivityType;
toTitle: string | null;
@@ -59,42 +53,7 @@ const getActivityText = ({
fromDueDate?: Date | null;
toDueDate?: Date | null;
dateLocale: DateFnsLocale;
mergedLabels?: string[];
}) => {
const TextHighlight = ({ children }: { children: React.ReactNode }) => (
<span className="font-medium text-light-1000 dark:text-dark-1000">
{children}
</span>
);
if (
type === "card.updated.label.added" &&
mergedLabels &&
mergedLabels.length > 1
) {
const labelList = mergedLabels.join(", ");
return (
<Trans>
added {mergedLabels.length} labels:{" "}
<TextHighlight>{labelList}</TextHighlight>
</Trans>
);
}
if (
type === "card.updated.label.removed" &&
mergedLabels &&
mergedLabels.length > 1
) {
const labelList = mergedLabels.join(", ");
return (
<Trans>
removed {mergedLabels.length} labels:{" "}
<TextHighlight>{labelList}</TextHighlight>
</Trans>
);
}
const ACTIVITY_TYPE_MAP = {
"card.created": t`created the card`,
"card.updated.title": t`updated the title`,
@@ -120,6 +79,12 @@ const getActivityText = ({
if (!(type in ACTIVITY_TYPE_MAP)) return null;
const baseText = ACTIVITY_TYPE_MAP[type as keyof typeof ACTIVITY_TYPE_MAP];
const TextHighlight = ({ children }: { children: React.ReactNode }) => (
<span className="font-medium text-light-1000 dark:text-dark-1000">
{children}
</span>
);
if (type === "card.updated.title" && toTitle) {
return (
<Trans>
@@ -316,151 +281,37 @@ const getActivityIcon = (
return ACTIVITY_ICON_MAP[type] ?? null;
};
const ACTIVITIES_PAGE_SIZE = 20;
const ActivityList = ({
activities,
cardPublicId,
isLoading: cardIsLoading,
isLoading,
isAdmin,
isViewOnly,
}: {
activities: NonNullable<GetCardByIdOutput>["activities"];
cardPublicId: string;
isLoading: boolean;
isAdmin?: boolean;
isViewOnly?: boolean;
}) => {
const { dateLocale, locale } = useLocalisation();
const { data: sessionData } = authClient.useSession();
const utils = api.useUtils();
const [allActivities, setAllActivities] = useState<
GetCardActivitiesOutput["activities"]
>([]);
const [hasMore, setHasMore] = useState(true);
const [isLoadingMore, setIsLoadingMore] = useState(false);
const isFullyExpandedRef = useRef(false);
const lastDataUpdatedAtRef = useRef<number | null>(null);
const {
data: firstPageData,
isFetching: isFetchingFirst,
dataUpdatedAt,
} = api.card.getActivities.useQuery(
{
cardPublicId,
limit: ACTIVITIES_PAGE_SIZE,
},
{
enabled: !!cardPublicId,
},
);
useEffect(() => {
if (firstPageData && dataUpdatedAt !== lastDataUpdatedAtRef.current) {
lastDataUpdatedAtRef.current = dataUpdatedAt;
if (isFullyExpandedRef.current && firstPageData.hasMore) {
setAllActivities(firstPageData.activities);
setHasMore(firstPageData.hasMore);
const fetchAllRemaining = async () => {
let currentActivities = [...firstPageData.activities];
let currentHasMore = firstPageData.hasMore;
while (currentHasMore) {
const lastActivity =
currentActivities[currentActivities.length - 1];
if (!lastActivity) break;
const nextCursor = new Date(lastActivity.createdAt).toISOString();
const nextPage = await utils.card.getActivities.fetch({
cardPublicId,
limit: ACTIVITIES_PAGE_SIZE,
cursor: nextCursor,
});
if (nextPage) {
const existingIds = new Set(
currentActivities.map((a) => a.publicId),
);
const newActivities = nextPage.activities.filter(
(a: { publicId: string }) => !existingIds.has(a.publicId),
);
currentActivities = [...currentActivities, ...newActivities];
currentHasMore = nextPage.hasMore;
} else {
break;
}
}
setAllActivities(currentActivities);
setHasMore(false);
};
fetchAllRemaining();
} else {
setAllActivities(firstPageData.activities);
setHasMore(firstPageData.hasMore);
if (!firstPageData.hasMore) {
isFullyExpandedRef.current = true;
}
}
}
}, [firstPageData, dataUpdatedAt, cardPublicId, utils.card.getActivities]);
const handleLoadMore = async () => {
if (isLoadingMore || !hasMore || allActivities.length === 0) return;
const lastActivity = allActivities[allActivities.length - 1];
if (!lastActivity) return;
setIsLoadingMore(true);
try {
const nextCursor = new Date(lastActivity.createdAt).toISOString();
const nextPage = await utils.card.getActivities.fetch({
cardPublicId,
limit: ACTIVITIES_PAGE_SIZE,
cursor: nextCursor,
});
if (nextPage) {
const existingIds = new Set(allActivities.map((a) => a.publicId));
const newActivities = nextPage.activities.filter(
(a: { publicId: string }) => !existingIds.has(a.publicId),
);
setAllActivities((prev) => [...prev, ...newActivities]);
setHasMore(nextPage.hasMore);
if (!nextPage.hasMore) {
isFullyExpandedRef.current = true;
}
}
} finally {
setIsLoadingMore(false);
}
};
const isFetching = isFetchingFirst || isLoadingMore;
const isLoading =
cardIsLoading || (isFetchingFirst && allActivities.length === 0);
const { data } = authClient.useSession();
const { dateLocale } = useLocalisation();
return (
<div className="flex flex-col space-y-4 pt-4">
{allActivities.map((activity, index) => {
{activities.map((activity, index) => {
const activityText = getActivityText({
type: activity.type,
toTitle: activity.toTitle,
fromList: activity.fromList?.name ?? null,
toList: activity.toList?.name ?? null,
memberName: activity.member?.user?.name ?? null,
isSelf: activity.member?.user?.id === sessionData?.user.id,
isSelf: activity.member?.user?.id === data?.user.id,
label: activity.label?.name ?? null,
fromTitle: activity.fromTitle ?? null,
fromDueDate: activity.fromDueDate ?? null,
toDueDate: activity.toDueDate ?? null,
dateLocale: dateLocale,
mergedLabels: (activity as any).mergedLabels,
});
if (activity.type === "card.updated.comment.added")
@@ -475,7 +326,7 @@ const ActivityList = ({
createdAt={activity.createdAt.toISOString()}
comment={activity.comment?.comment}
isEdited={!!activity.comment?.updatedAt}
isAuthor={activity.comment?.createdBy === sessionData?.user.id}
isAuthor={activity.comment?.createdBy === data?.user.id}
isAdmin={isAdmin ?? false}
isViewOnly={!!isViewOnly}
/>
@@ -500,9 +351,11 @@ const ActivityList = ({
)}
isLoading={isLoading}
/>
{index !== allActivities.length - 1 && (
<div className="absolute bottom-[-14px] left-1/2 top-[30px] w-0.5 -translate-x-1/2 bg-light-600 dark:bg-dark-600" />
)}
{index !== activities.length - 1 &&
activities[index + 1]?.type !==
"card.updated.comment.added" && (
<div className="absolute bottom-[-14px] left-1/2 top-[30px] w-0.5 -translate-x-1/2 bg-light-600 dark:bg-dark-600" />
)}
</div>
<p className="text-sm">
<span className="font-medium dark:text-dark-1000">{`${activity.user?.name} `}</span>
@@ -520,17 +373,6 @@ const ActivityList = ({
</div>
);
})}
{hasMore && (
<div className="flex justify-center pt-4">
<button
onClick={handleLoadMore}
disabled={isFetching}
className="text-sm font-medium text-light-900 hover:text-light-1000 disabled:opacity-50 dark:text-dark-800 dark:hover:text-dark-1000"
>
{isFetching ? t`Loading...` : t`Load more activities`}
</button>
</div>
)}
</div>
);
};

View File

@@ -13,7 +13,6 @@ import {
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface Attachment {
publicId: string;
@@ -82,7 +81,7 @@ export function AttachmentThumbnails({
},
onSettled: async () => {
if (isReadOnly) return;
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -8,7 +8,6 @@ import Button from "~/components/Button";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
export function AttachmentUpload({ cardPublicId }: { cardPublicId: string }) {
const { openModal } = useModal();
@@ -21,7 +20,7 @@ export function AttachmentUpload({ cardPublicId }: { cardPublicId: string }) {
const generateUploadUrl = api.attachment.generateUploadUrl.useMutation();
const confirmAttachment = api.attachment.confirm.useMutation({
onSuccess: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
showPopup({
header: t`Attachment uploaded`,
message: t`Your file has been uploaded successfully.`,

View File

@@ -1,14 +1,11 @@
import type { DraggableProvided } from "react-beautiful-dnd";
import { t } from "@lingui/core/macro";
import { useEffect, useState } from "react";
import ContentEditable from "react-contenteditable";
import { HiXMark } from "react-icons/hi2";
import { RiDraggable } from "react-icons/ri";
import { twMerge } from "tailwind-merge";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface ChecklistItemRowProps {
item: {
@@ -17,19 +14,13 @@ interface ChecklistItemRowProps {
completed: boolean;
};
cardPublicId: string;
onCreateNewItem?: () => void;
viewOnly?: boolean;
dragHandleProps?: DraggableProvided["dragHandleProps"];
isDragging?: boolean;
}
export default function ChecklistItemRow({
item,
cardPublicId,
onCreateNewItem,
viewOnly = false,
dragHandleProps,
isDragging = false,
}: ChecklistItemRowProps) {
const utils = api.useUtils();
const { showPopup } = usePopup();
@@ -71,7 +62,7 @@ export default function ChecklistItemRow({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});
@@ -99,7 +90,7 @@ export default function ChecklistItemRow({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});
@@ -147,23 +138,7 @@ export default function ChecklistItemRow({
};
return (
<div
className={twMerge(
"group relative flex items-start gap-3 rounded-md py-2 pl-4 hover:bg-light-100 dark:hover:bg-dark-100",
isDragging && "opacity-80",
)}
>
{!viewOnly && (
<div
{...dragHandleProps}
className="absolute left-0 top-1/2 flex h-[20px] w-[20px] -translate-x-full -translate-y-1/2 cursor-grab items-center justify-center pr-1 opacity-0 transition-opacity group-hover:opacity-75 hover:opacity-100 active:cursor-grabbing"
>
<RiDraggable className="h-4 w-4 text-light-700 dark:text-dark-700" />
</div>
)}
{viewOnly && <div className="w-[20px] flex-shrink-0" />}
<div className="group relative flex items-start gap-3 rounded-md py-2 pl-4 hover:bg-light-100 dark:hover:bg-dark-100">
<label
className={`relative mt-[2px] inline-flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center`}
>
@@ -189,10 +164,7 @@ export default function ChecklistItemRow({
disabled={viewOnly}
onChange={(e) => setTitle(e.target.value)}
// @ts-expect-error - valid event
onBlur={(e: Event) => {
const innerHTML = (e.target as HTMLElement).innerHTML;
commitTitle(innerHTML);
}}
onBlur={(e: Event) => commitTitle(e.target.innerHTML as string)}
className={twMerge(
"m-0 min-h-[20px] w-full p-0 text-sm leading-[20px] text-light-950 outline-none focus-visible:outline-none dark:text-dark-950",
viewOnly && "cursor-default",
@@ -202,9 +174,7 @@ export default function ChecklistItemRow({
if (viewOnly) return;
if (e.key === "Enter") {
e.preventDefault();
const innerHTML = (e.currentTarget as HTMLElement).innerHTML;
commitTitle(innerHTML);
onCreateNewItem?.();
commitTitle(title);
}
if (e.key === "Escape") {
e.preventDefault();

View File

@@ -4,7 +4,6 @@ import { twMerge } from "tailwind-merge";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
export default function ChecklistNameInput({
checklistPublicId,
@@ -49,7 +48,7 @@ export default function ChecklistNameInput({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -1,13 +1,7 @@
import type { DropResult } from "react-beautiful-dnd";
import { t } from "@lingui/core/macro";
import { DragDropContext, Draggable } from "react-beautiful-dnd";
import { HiPlus, HiXMark } from "react-icons/hi2";
import CircularProgress from "~/components/CircularProgress";
import { StrictModeDroppable as Droppable } from "~/components/StrictModeDroppable";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import ChecklistItemRow from "./ChecklistItemRow";
import ChecklistNameInput from "./ChecklistNameInput";
import NewChecklistItemForm from "./NewChecklistItemForm";
@@ -40,206 +34,109 @@ export default function Checklists({
viewOnly = false,
}: ChecklistsProps) {
const { openModal } = useModal();
const { showPopup } = usePopup();
const utils = api.useUtils();
const reorderItemMutation = api.checklist.updateItem.useMutation({
onMutate: async (vars) => {
await utils.card.byId.cancel({ cardPublicId });
const previous = utils.card.byId.getData({ cardPublicId });
utils.card.byId.setData({ cardPublicId }, (old) => {
if (!old) return old;
const updatedChecklists = old.checklists.map((cl) => {
const itemIndex = cl.items.findIndex(
(item) => item.publicId === vars.checklistItemPublicId,
);
if (itemIndex === -1 || vars.index === undefined) return cl;
const newIndex = vars.index;
const items = Array.from(cl.items);
const [movedItem] = items.splice(itemIndex, 1);
if (!movedItem) return cl;
items.splice(newIndex, 0, movedItem);
return { ...cl, items };
});
return { ...old, checklists: updatedChecklists } as typeof old;
});
return { previous };
},
onError: (_err, _vars, ctx) => {
if (ctx?.previous)
utils.card.byId.setData({ cardPublicId }, ctx.previous);
showPopup({
header: t`Unable to reorder checklist item`,
message: t`Please try again later, or contact customer support.`,
icon: "error",
});
},
onSettled: async () => {
await utils.card.byId.invalidate({ cardPublicId });
},
});
const onDragEnd = (result: DropResult) => {
if (!result.destination) return;
const { source, destination, draggableId } = result;
if (source.droppableId !== destination.droppableId) return;
if (source.index === destination.index) return;
reorderItemMutation.mutate({
checklistItemPublicId: draggableId,
index: destination.index,
});
};
if (checklists.length === 0) return null;
if (!checklists || checklists.length === 0) return null;
return (
<DragDropContext onDragEnd={onDragEnd}>
<div className="border-light-300 pb-4 dark:border-dark-300">
<div>
{checklists.map((checklist) => {
const completedItems = checklist.items.filter(
(item) => item.completed,
);
const progress =
checklist.items.length > 0 && completedItems.length > 0
? (completedItems.length / checklist.items.length) * 100
: 2;
<div className="border-light-300 pb-4 dark:border-dark-300">
<div>
{checklists.map((checklist) => {
const completedItems = checklist.items.filter(
(item) => item.completed,
);
const progress =
checklist.items.length > 0 && completedItems.length > 0
? (completedItems.length / checklist.items.length) * 100
: 2;
return (
<div key={checklist.publicId} className="mb-4">
<div className="mb-2 flex items-center font-medium text-light-1000 dark:text-dark-1000">
<div className="min-w-0 flex-1">
<ChecklistNameInput
checklistPublicId={checklist.publicId}
initialName={checklist.name}
cardPublicId={cardPublicId}
viewOnly={viewOnly}
/>
</div>
{!viewOnly && (
<div className="ml-2 flex flex-shrink-0 items-center gap-2">
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-300">
<CircularProgress
progress={progress}
size="sm"
className="flex-shrink-0"
/>
<span className="text-[11px] text-light-900 dark:text-dark-700">
{completedItems.length}/{checklist.items.length}
</span>
</div>
<div>
<button
className="rounded-md p-1 text-light-900 hover:bg-light-100 dark:text-dark-700 dark:hover:bg-dark-100"
onClick={() =>
openModal("DELETE_CHECKLIST", checklist.publicId)
}
>
<HiXMark size={16} />
</button>
<button
onClick={() =>
setActiveChecklistForm?.(checklist.publicId)
}
className="rounded-md p-1 text-light-900 hover:bg-light-100 dark:text-dark-700 dark:hover:bg-dark-100"
>
<HiPlus size={16} />
</button>
</div>
</div>
)}
{viewOnly && (
<div className="ml-2 flex flex-shrink-0 items-center gap-2">
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-300">
<CircularProgress
progress={progress}
size="sm"
className="flex-shrink-0"
/>
<span className="text-[11px] text-light-900 dark:text-dark-700">
{completedItems.length}/{checklist.items.length}
</span>
</div>
</div>
)}
return (
<div key={checklist.publicId} className="mb-4">
<div className="mb-2 flex items-center font-medium text-light-1000 dark:text-dark-1000">
<div className="min-w-0 flex-1">
<ChecklistNameInput
checklistPublicId={checklist.publicId}
initialName={checklist.name}
cardPublicId={cardPublicId}
viewOnly={viewOnly}
/>
</div>
<Droppable
droppableId={checklist.publicId}
type="CHECKLIST_ITEM"
isDropDisabled={viewOnly}
>
{(provided) => (
<div
ref={provided.innerRef}
{...provided.droppableProps}
className="ml-1"
>
{checklist.items.map((item, index) => (
<Draggable
key={item.publicId}
draggableId={item.publicId}
index={index}
isDragDisabled={viewOnly}
>
{(provided, snapshot) => (
<div
ref={provided.innerRef}
{...provided.draggableProps}
style={{
...provided.draggableProps.style,
opacity: snapshot.isDragging ? 0.8 : 1,
}}
>
<ChecklistItemRow
item={{
publicId: item.publicId,
title: item.title,
completed: item.completed,
}}
cardPublicId={cardPublicId}
onCreateNewItem={() =>
setActiveChecklistForm?.(checklist.publicId)
}
viewOnly={viewOnly}
dragHandleProps={provided.dragHandleProps}
isDragging={snapshot.isDragging}
/>
</div>
)}
</Draggable>
))}
{provided.placeholder}
{!viewOnly && (
<div className="ml-2 flex flex-shrink-0 items-center gap-2">
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-300">
<CircularProgress
progress={progress}
size="sm"
className="flex-shrink-0"
/>
<span className="text-[11px] text-light-900 dark:text-dark-700">
{completedItems.length}/{checklist.items.length}
</span>
</div>
<div>
<button
className="rounded-md p-1 text-light-900 hover:bg-light-100 dark:text-dark-700 dark:hover:bg-dark-100"
onClick={() =>
openModal("DELETE_CHECKLIST", checklist.publicId)
}
>
<HiXMark size={16} />
</button>
<button
onClick={() =>
setActiveChecklistForm?.(checklist.publicId)
}
className="rounded-md p-1 text-light-900 hover:bg-light-100 dark:text-dark-700 dark:hover:bg-dark-100"
>
<HiPlus size={16} />
</button>
</div>
</div>
)}
{viewOnly && (
<div className="ml-2 flex flex-shrink-0 items-center gap-2">
<div className="flex items-center gap-1 rounded-full border-[1px] border-light-300 px-2 py-1 dark:border-dark-300">
<CircularProgress
progress={progress}
size="sm"
className="flex-shrink-0"
/>
<span className="text-[11px] text-light-900 dark:text-dark-700">
{completedItems.length}/{checklist.items.length}
</span>
</div>
)}
</Droppable>
{activeChecklistForm === checklist.publicId && !viewOnly && (
<div className="ml-1">
<NewChecklistItemForm
checklistPublicId={checklist.publicId}
cardPublicId={cardPublicId}
onCancel={() => setActiveChecklistForm?.(null)}
readOnly={viewOnly}
/>
</div>
)}
</div>
);
})}
</div>
<div className="ml-1">
{checklist.items.map((item) => (
<ChecklistItemRow
key={item.publicId}
item={{
publicId: item.publicId,
title: item.title,
completed: item.completed,
}}
cardPublicId={cardPublicId}
viewOnly={viewOnly}
/>
))}
</div>
{activeChecklistForm === checklist.publicId && !viewOnly && (
<div className="ml-1">
<NewChecklistItemForm
checklistPublicId={checklist.publicId}
cardPublicId={cardPublicId}
onCancel={() => setActiveChecklistForm?.(null)}
readOnly={viewOnly}
/>
</div>
)}
</div>
);
})}
</div>
</DragDropContext>
</div>
);
}

View File

@@ -11,7 +11,6 @@ import Dropdown from "~/components/Dropdown";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface FormValues {
comment: string;
@@ -56,7 +55,7 @@ const Comment = ({
const updateCommentMutation = api.card.updateComment.useMutation({
onSuccess: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.refetch();
setIsEditing(false);
},
onError: () => {

View File

@@ -4,7 +4,6 @@ import Button from "~/components/Button";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
export function DeleteChecklistConfirmation({
cardPublicId,
@@ -41,7 +40,7 @@ export function DeleteChecklistConfirmation({
},
onSettled: async () => {
closeModal();
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -4,7 +4,6 @@ import Button from "~/components/Button";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface DeleteCommentConfirmationProps {
cardPublicId: string;
@@ -48,7 +47,7 @@ export function DeleteCommentConfirmation({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate(queryParams);
},
});

View File

@@ -6,7 +6,6 @@ import { HiMiniPlus } from "react-icons/hi2";
import DateSelector from "~/components/DateSelector";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface DueDateSelectorProps {
cardPublicId: string;
@@ -62,7 +61,7 @@ export function DueDateSelector({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
await utils.board.byId.invalidate();
},
});

View File

@@ -6,7 +6,6 @@ import CheckboxDropdown from "~/components/CheckboxDropdown";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface LabelSelectorProps {
cardPublicId: string;
@@ -75,7 +74,7 @@ export default function LabelSelector({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -3,7 +3,6 @@ import { t } from "@lingui/core/macro";
import CheckboxDropdown from "~/components/CheckboxDropdown";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface ListSelectorProps {
cardPublicId: string;
@@ -55,7 +54,7 @@ export default function ListSelector({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -7,7 +7,6 @@ import CheckboxDropdown from "~/components/CheckboxDropdown";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface MemberSelectorProps {
cardPublicId: string;
@@ -82,7 +81,7 @@ export default function MemberSelector({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -10,7 +10,6 @@ import Input from "~/components/Input";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface NewChecklistFormInput {
name: string;
@@ -73,7 +72,7 @@ export function NewChecklistForm({ cardPublicId }: { cardPublicId: string }) {
});
},
onSettled: async (_data, _error, vars) => {
await invalidateCard(utils, vars.cardPublicId);
await utils.card.byId.invalidate({ cardPublicId: vars.cardPublicId });
},
});

View File

@@ -7,7 +7,6 @@ import { generateUID } from "@kan/shared/utils";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface FormValues {
title: string;
@@ -92,7 +91,7 @@ const NewChecklistItemForm = ({
});
},
onSettled: async () => {
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate({ cardPublicId });
},
});

View File

@@ -6,7 +6,6 @@ import { HiOutlineArrowUp } from "react-icons/hi2";
import LoadingSpinner from "~/components/LoadingSpinner";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
interface FormValues {
comment: string;
@@ -35,7 +34,10 @@ const NewCommentForm = ({ cardPublicId }: { cardPublicId: string }) => {
},
onSettled: async () => {
reset();
await invalidateCard(utils, cardPublicId);
await utils.card.byId.invalidate(queryParams);
},
onSuccess: async () => {
await utils.card.byId.refetch();
},
});

View File

@@ -13,12 +13,10 @@ import LabelIcon from "~/components/LabelIcon";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
import { PageHead } from "~/components/PageHead";
import { EditYouTubeModal } from "~/components/YouTubeEmbed/EditYouTubeModal";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { useWorkspace } from "~/providers/workspace";
import { api } from "~/utils/api";
import { invalidateCard } from "~/utils/cardInvalidation";
import { formatMemberDisplayName, getAvatarUrl } from "~/utils/helpers";
import { DeleteLabelConfirmation } from "../../components/DeleteLabelConfirmation";
import ActivityList from "./components/ActivityList";
@@ -180,6 +178,7 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
const board = card?.list.board;
const boardId = board?.publicId;
const activities = card?.activities;
const updateCard = api.card.update.useMutation({
onError: () => {
@@ -190,7 +189,7 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
});
},
onSettled: async () => {
if (cardId) await invalidateCard(utils, cardId);
await utils.card.byId.invalidate({ cardPublicId: cardId });
},
});
@@ -389,6 +388,7 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
<div>
<ActivityList
cardPublicId={cardId}
activities={activities ?? []}
isLoading={!card}
isAdmin={workspace.role === "admin"}
/>
@@ -484,13 +484,6 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
checklistPublicId={entityId}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "EDIT_YOUTUBE"}
>
<EditYouTubeModal />
</Modal>
</>
</div>
</>

View File

@@ -2,6 +2,7 @@ import type { FC, SVGProps } from "react";
import { Trans } from "@lingui/react/macro";
import AirbusLogo from "~/assets/logos/airbus.svg";
import BitwardenLogo from "~/assets/logos/bitwarden.svg";
import CouchbaseLogo from "~/assets/logos/couchbase.svg";
import DeloitteLogo from "~/assets/logos/deloitte.svg";
import FastCompanyLogo from "~/assets/logos/fast_company.svg";
@@ -30,31 +31,36 @@ export default function Logos() {
},
{
id: 3,
component: BitwardenLogo as LogoComponent,
alt: "Bitwarden Logo",
},
{
id: 4,
component: CouchbaseLogo as LogoComponent,
alt: "Couchbase Logo",
},
{
id: 4,
id: 5,
component: LegoLogo as LogoComponent,
alt: "Lego Logo",
},
{
id: 5,
id: 6,
component: AirbusLogo as LogoComponent,
alt: "Airbus Logo",
},
{
id: 6,
id: 7,
component: DeloitteLogo as LogoComponent,
alt: "Deloitte Logo",
},
{
id: 7,
id: 8,
component: WakamLogo as LogoComponent,
alt: "Wakam Logo",
},
{
id: 8,
id: 9,
component: LinkedinLogo as LogoComponent,
alt: "Linked In Logo",
},

View File

@@ -161,6 +161,7 @@ export function CardModal({
{cardPublicId && (
<ActivityList
cardPublicId={cardPublicId}
activities={data?.activities ?? []}
isLoading={isLoading}
isViewOnly={true}
/>

View File

@@ -13,7 +13,6 @@ services:
- .env
restart: unless-stopped
environment:
- KAN_ADMIN_API_KEY=${KAN_ADMIN_API_KEY}
- NEXT_PUBLIC_KAN_ENV=${NEXT_PUBLIC_KAN_ENV}
- NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL}
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}

View File

@@ -18,9 +18,6 @@ services:
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
- POSTGRES_URL=${POSTGRES_URL}
# Admin API key (optional)
- KAN_ADMIN_API_KEY=${KAN_ADMIN_API_KEY}
# SMTP (optional)
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT}

View File

@@ -9,15 +9,5 @@ export const openApiDocument = generateOpenApiDocument(appRouter, {
version: "1.0.0",
baseUrl: `${env("NEXT_PUBLIC_BASE_URL")}/api/v1`,
docsUrl: "docs.kan.bn",
tags: [
"Auth",
"Users",
"Boards",
"Lists",
"Cards",
"Labels",
"Imports",
"Integrations",
"Health",
],
tags: ["Auth", "Users", "Boards", "Lists", "Cards", "Labels", "Imports", "Integrations"],
});

View File

@@ -3,7 +3,6 @@ import { boardRouter } from "./routers/board";
import { cardRouter } from "./routers/card";
import { checklistRouter } from "./routers/checklist";
import { feedbackRouter } from "./routers/feedback";
import { healthRouter } from "./routers/health";
import { importRouter } from "./routers/import";
import { integrationRouter } from "./routers/integration";
import { labelRouter } from "./routers/label";
@@ -19,7 +18,6 @@ export const appRouter = createTRPCRouter({
card: cardRouter,
checklist: checklistRouter,
feedback: feedbackRouter,
health: healthRouter,
label: labelRouter,
list: listRouter,
member: memberRouter,

View File

@@ -9,7 +9,6 @@ import * as listRepo from "@kan/db/repository/list.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
import { mergeActivities } from "../utils/activities";
import { assertUserInWorkspace } from "../utils/auth";
import { generateDownloadUrl } from "../utils/s3";
@@ -27,7 +26,7 @@ export const cardRouter = createTRPCRouter({
})
.input(
z.object({
title: z.string().min(1).max(2000),
title: z.string().min(1),
description: z.string().max(10000),
listPublicId: z.string().min(12),
labelPublicIds: z.array(z.string().min(12)),
@@ -671,81 +670,6 @@ export const cardRouter = createTRPCRouter({
return { ...result, attachments: [] };
}),
getActivities: publicProcedure
.meta({
openapi: {
summary: "Get paginated card activities",
method: "GET",
path: "/cards/{cardPublicId}/activities",
description:
"Retrieves paginated activities for a card with merged frequent changes",
tags: ["Cards"],
},
})
.input(
z.object({
cardPublicId: z.string().min(12),
limit: z.number().min(1).max(100).optional().default(10),
cursor: z.string().datetime().optional(), // ISO datetime string
}),
)
.output(
z.object({
activities: z.array(
z.custom<
NonNullable<
Awaited<
ReturnType<typeof cardActivityRepo.getPaginatedActivities>
>
>["activities"][number]
>(),
),
hasMore: z.boolean(),
nextCursor: z.string().datetime().nullable(),
}),
)
.query(async ({ ctx, input }) => {
const card = await cardRepo.getWorkspaceAndCardIdByCardPublicId(
ctx.db,
input.cardPublicId,
);
if (!card)
throw new TRPCError({
message: `Card with public ID ${input.cardPublicId} not found`,
code: "NOT_FOUND",
});
if (card.workspaceVisibility === "private") {
const userId = ctx.user?.id;
if (!userId)
throw new TRPCError({
message: `User not authenticated`,
code: "UNAUTHORIZED",
});
await assertUserInWorkspace(ctx.db, userId, card.workspaceId);
}
const cursor = input.cursor ? new Date(input.cursor) : undefined;
const result = await cardActivityRepo.getPaginatedActivities(
ctx.db,
card.id,
{
limit: input.limit,
cursor,
},
);
const mergedActivities = mergeActivities(result.activities);
return {
activities: mergedActivities,
hasMore: result.hasMore,
nextCursor: result.nextCursor?.toISOString() ?? null,
};
}),
update: protectedProcedure
.meta({
openapi: {
@@ -760,7 +684,7 @@ export const cardRouter = createTRPCRouter({
.input(
z.object({
cardPublicId: z.string().min(12),
title: z.string().min(1).max(2000).optional(),
title: z.string().min(1).optional(),
description: z.string().optional(),
index: z.number().optional(),
listPublicId: z.string().min(12).optional(),

View File

@@ -269,7 +269,7 @@ export const checklistRouter = createTRPCRouter({
.meta({
openapi: {
summary: "Update a checklist item",
method: "PATCH",
method: "PUT",
path: "/checklists/items/{checklistItemPublicId}",
description: "Updates a checklist item (title/completed)",
tags: ["Cards"],
@@ -281,7 +281,6 @@ export const checklistRouter = createTRPCRouter({
checklistItemPublicId: z.string().length(12),
title: z.string().min(1).max(500).optional(),
completed: z.boolean().optional(),
index: z.number().int().min(0).optional(),
}),
)
.output(checklistItemSchema)
@@ -313,30 +312,17 @@ export const checklistRouter = createTRPCRouter({
const previousTitle = item.title;
let updatedItem;
if (input.title !== undefined || input.completed !== undefined) {
updatedItem = await checklistRepo.updateItemById(ctx.db, {
id: item.id,
title: input.title,
completed: input.completed,
});
}
if (input.index !== undefined) {
updatedItem = await checklistRepo.reorderItem(ctx.db, {
itemId: item.id,
newIndex: input.index,
});
}
if (!updatedItem) {
throw new TRPCError({
message: `Failed to update checklist item`,
code: "INTERNAL_SERVER_ERROR",
});
}
const updated = await checklistRepo.updateItemById(ctx.db, {
id: item.id,
title: input.title,
completed: input.completed,
});
if (!updated)
throw new TRPCError({
message: `Failed to update checklist item`,
code: "INTERNAL_SERVER_ERROR",
});
// Log completion toggle
if (input.completed !== undefined) {
@@ -345,7 +331,7 @@ export const checklistRouter = createTRPCRouter({
? "card.updated.checklist.item.completed"
: "card.updated.checklist.item.uncompleted",
cardId: item.checklist.cardId,
toTitle: updatedItem.title,
toTitle: updated.title,
createdBy: userId,
});
}
@@ -356,13 +342,12 @@ export const checklistRouter = createTRPCRouter({
type: "card.updated.checklist.item.updated",
cardId: item.checklist.cardId,
fromTitle: previousTitle,
toTitle: updatedItem.title,
toTitle: updated.title,
createdBy: userId,
});
}
return updatedItem;
return updated;
}),
deleteItem: protectedProcedure
.meta({

View File

@@ -1,203 +0,0 @@
import { HeadBucketCommand } from "@aws-sdk/client-s3";
import { TRPCError } from "@trpc/server";
import { sql } from "drizzle-orm";
import { env } from "next-runtime-env";
import { z } from "zod";
import type { dbClient } from "@kan/db/client";
import * as boardRepo from "@kan/db/repository/board.repo";
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 * as cardCommentRepo from "@kan/db/repository/cardComment.repo";
import * as checklistRepo from "@kan/db/repository/checklist.repo";
import * as importRepo from "@kan/db/repository/import.repo";
import * as inviteLinkRepo from "@kan/db/repository/inviteLink.repo";
import * as labelRepo from "@kan/db/repository/label.repo";
import * as listRepo from "@kan/db/repository/list.repo";
import * as memberRepo from "@kan/db/repository/member.repo";
import * as userRepo from "@kan/db/repository/user.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
import {
adminProtectedProcedure,
createTRPCRouter,
publicProcedure,
} from "../trpc";
import { createS3Client } from "../utils/s3";
const checkDatabaseConnection = async (db: dbClient) => {
try {
await db.execute(sql`SELECT 1`);
return true;
} catch {
return false;
}
};
const checkS3Connection = async () => {
try {
// Check if S3 is configured
if (
!process.env.S3_ENDPOINT ||
!process.env.S3_ACCESS_KEY_ID ||
!process.env.S3_SECRET_ACCESS_KEY
) {
// S3 is optional, so return true if not configured
return true;
}
const client = createS3Client();
const avatarBucketName = env("NEXT_PUBLIC_AVATAR_BUCKET_NAME");
const attachmentsBucketName = env("NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME");
await client.send(new HeadBucketCommand({ Bucket: avatarBucketName }));
await client.send(new HeadBucketCommand({ Bucket: attachmentsBucketName }));
return true;
} catch (error) {
console.error(error);
return false;
}
};
export const healthRouter = createTRPCRouter({
health: publicProcedure
.meta({
openapi: {
method: "GET",
path: "/health",
summary: "Health check",
description:
"Returns the health status of the application and its dependencies",
tags: ["Health"],
protect: false,
},
})
.input(z.void())
.output(
z.object({
status: z.enum(["ok", "error"]),
database: z.enum(["ok", "error"]).optional(),
storage: z.enum(["ok", "error", "not_configured"]).optional(),
}),
)
.query(async ({ ctx }) => {
const dbHealthy = await checkDatabaseConnection(ctx.db);
const s3Healthy = await checkS3Connection();
const s3Configured = !!(
process.env.S3_ENDPOINT &&
process.env.S3_ACCESS_KEY_ID &&
process.env.S3_SECRET_ACCESS_KEY
);
const database = dbHealthy ? "ok" : "error";
const storage = !s3Configured
? "not_configured"
: s3Healthy
? "ok"
: "error";
// Overall status is "ok" only if database is healthy and (storage is not configured or storage is healthy)
const status = dbHealthy && (!s3Configured || s3Healthy) ? "ok" : "error";
return {
status,
database,
storage,
};
}),
stats: adminProtectedProcedure
.meta({
openapi: {
method: "GET",
path: "/stats",
summary: "Get statistics",
description:
"Returns statistics about the application (workspaces, users, cards, etc.)",
tags: ["Health"],
protect: true,
},
})
.input(z.void())
.output(
z.object({
users: z.number(),
workspaces: z.number(),
boards: z.number(),
lists: z.number(),
cards: z.number(),
cardComments: z.number(),
cardAttachments: z.number(),
cardActivityLogs: z.number(),
labels: z.number(),
checklists: z.number(),
checklistItems: z.number(),
activeMembers: z.number(),
activeInviteLinks: z.number(),
imports: z.number(),
}),
)
.query(async ({ ctx }) => {
try {
// Execute all count queries in parallel
const [
usersCount,
workspacesCount,
boardsCount,
listsCount,
cardsCount,
cardCommentsCount,
checklistItemsCount,
checklistsCount,
labelsCount,
cardAttachmentsCount,
cardActivitiesCount,
activeMembersCount,
activeInviteLinksCount,
importsCount,
cardActivityLogsCount,
] = await Promise.all([
userRepo.getCount(ctx.db),
workspaceRepo.getCount(ctx.db),
boardRepo.getCount(ctx.db),
listRepo.getCount(ctx.db),
cardRepo.getCount(ctx.db),
cardCommentRepo.getCount(ctx.db),
checklistRepo.getCountItems(ctx.db),
checklistRepo.getCount(ctx.db),
labelRepo.getCount(ctx.db),
cardAttachmentRepo.getCount(ctx.db),
cardActivityRepo.getCount(ctx.db),
memberRepo.getActiveCount(ctx.db),
inviteLinkRepo.getActiveCount(ctx.db),
importRepo.getCount(ctx.db),
memberRepo.getActiveCount(ctx.db),
cardActivityRepo.getCount(ctx.db),
]);
return {
users: usersCount,
workspaces: workspacesCount,
boards: boardsCount,
lists: listsCount,
cards: cardsCount,
cardComments: cardCommentsCount,
checklistItems: checklistItemsCount,
checklists: checklistsCount,
labels: labelsCount,
cardAttachments: cardAttachmentsCount,
cardActivities: cardActivitiesCount,
activeMembers: activeMembersCount,
activeInviteLinks: activeInviteLinksCount,
imports: importsCount,
cardActivityLogs: cardActivityLogsCount,
};
} catch (error) {
throw new TRPCError({
message: `Failed to retrieve statistics: ${error instanceof Error ? error.message : "Unknown error"}`,
code: "INTERNAL_SERVER_ERROR",
});
}
}),
});

View File

@@ -52,7 +52,7 @@ interface TrelloCheckItem {
interface TrelloCard {
id: string;
name: string | null;
name: string;
desc: string;
idList: string;
labels: TrelloLabel[];
@@ -290,7 +290,7 @@ export const importRouter = createTRPCRouter({
if (list.cards.length && newListId) {
const cardsInsert = list.cards.map((card, index) => ({
publicId: generateUID(),
title: (card.name?.trim() ?? "Untitled Card").slice(0, 2000),
title: card.name,
description: card.description,
createdBy: userId,
listId: newListId,

View File

@@ -2,7 +2,6 @@ import type { CreateNextContextOptions } from "@trpc/server/adapters/next";
import type { NextApiRequest } from "next";
import type { OpenApiMeta } from "trpc-to-openapi";
import { initTRPC, TRPCError } from "@trpc/server";
import { env } from "next-runtime-env";
import superjson from "superjson";
import { ZodError } from "zod";
@@ -46,7 +45,6 @@ interface CreateContextOptions {
user: User | null | undefined;
db: dbClient;
auth: ReturnType<typeof createAuthWithHeaders>;
headers: Headers;
}
export const createInnerTRPCContext = (opts: CreateContextOptions) => {
@@ -54,7 +52,6 @@ export const createInnerTRPCContext = (opts: CreateContextOptions) => {
user: opts.user,
db: opts.db,
auth: opts.auth,
headers: opts.headers,
};
};
@@ -66,7 +63,7 @@ export const createTRPCContext = async ({ req }: CreateNextContextOptions) => {
const session = await auth.api.getSession();
return createInnerTRPCContext({ db, user: session?.user, auth, headers });
return createInnerTRPCContext({ db, user: session?.user, auth });
};
export const createNextApiContext = async (req: NextApiRequest) => {
@@ -77,7 +74,7 @@ export const createNextApiContext = async (req: NextApiRequest) => {
const session = await auth.api.getSession();
return createInnerTRPCContext({ db, user: session?.user, auth, headers });
return createInnerTRPCContext({ db, user: session?.user, auth });
};
export const createRESTContext = async ({ req }: CreateNextContextOptions) => {
@@ -94,7 +91,7 @@ export const createRESTContext = async ({ req }: CreateNextContextOptions) => {
throw error;
}
return createInnerTRPCContext({ db, user: session?.user, auth, headers });
return createInnerTRPCContext({ db, user: session?.user, auth });
};
const t = initTRPC
@@ -132,28 +129,9 @@ const enforceUserIsAuthed = t.middleware(async ({ ctx, next }) => {
});
});
const enforceUserIsAdmin = t.middleware(async ({ ctx, next }) => {
if (ctx.headers.get("x-admin-api-key") !== env("KAN_ADMIN_API_KEY")) {
throw new TRPCError({ code: "UNAUTHORIZED" });
}
return next({
ctx,
});
});
export const protectedProcedure = t.procedure.use(enforceUserIsAuthed).meta({
openapi: {
method: "GET",
path: "/protected",
},
});
export const adminProtectedProcedure = t.procedure
.use(enforceUserIsAdmin)
.meta({
openapi: {
method: "GET",
path: "/admin/protected",
},
});

View File

@@ -2,7 +2,6 @@ import type { RouterInputs, RouterOutputs } from "../index";
export type GetBoardByIdOutput = RouterOutputs["board"]["byId"];
export type GetCardByIdOutput = RouterOutputs["card"]["byId"];
export type GetCardActivitiesOutput = RouterOutputs["card"]["getActivities"];
export type UpdateBoardInput = RouterInputs["board"]["update"];
export type NewLabelInput = RouterInputs["label"]["create"];
export type NewListInput = RouterInputs["list"]["create"];

View File

@@ -1,109 +0,0 @@
import type { PaginatedActivitiesResult } from "@kan/db/repository/cardActivity.repo";
import type { ActivityType } from "@kan/db/schema";
type ActivityBase = PaginatedActivitiesResult["activities"][number];
interface Activity extends ActivityBase {
mergeCount?: number; // number of activities merged into this one
mergedLabels?: string[]; // list of label names when merging label activities
}
// types that can be merged with simple count
const MERGEABLE_COUNT_TYPES: readonly ActivityType[] = [
"card.updated.description",
];
// types that merge with a list of items
const MERGEABLE_LIST_TYPES: readonly ActivityType[] = [
"card.updated.label.added",
"card.updated.label.removed",
];
const MERGE_TIME_WINDOW_MS = 5 * 60 * 1000; // 5 minutes window for merging activities
export function mergeActivities(activities: Activity[]): Activity[] {
if (activities.length === 0) return [];
const merged: Activity[] = [];
let i = 0;
while (i < activities.length) {
const current = activities[i];
if (!current) {
i++;
continue;
}
const currentType = current.type;
const isCountMergeable = MERGEABLE_COUNT_TYPES.includes(currentType);
const isListMergeable = MERGEABLE_LIST_TYPES.includes(currentType);
const canMerge = (isCountMergeable || isListMergeable) && current.user?.id;
if (!canMerge) {
merged.push(current);
i++;
continue;
}
const group: Activity[] = [current];
let j = i + 1;
while (j < activities.length) {
const next = activities[j];
if (!next) break;
const timeDiff =
new Date(next.createdAt).getTime() -
new Date(current.createdAt).getTime();
if (
next.type === current.type &&
next.user?.id === current.user?.id &&
timeDiff >= 0 && // next is newer or same time
timeDiff <= MERGE_TIME_WINDOW_MS
) {
group.push(next);
j++;
} else {
break;
}
}
if (group.length > 1) {
const oldest = group[0];
const latest = group[group.length - 1];
if (oldest && latest) {
if (isListMergeable) {
const labelNames = group
.map((a) => a.label?.name)
.filter((name): name is string => !!name);
merged.push({
...oldest,
createdAt: oldest.createdAt,
mergeCount: group.length,
mergedLabels: labelNames,
});
} else {
merged.push({
...oldest,
createdAt: oldest.createdAt,
toDescription: latest.toDescription,
fromDescription: oldest.fromDescription,
mergeCount: group.length,
});
}
} else {
merged.push(current);
}
} else {
merged.push(current);
}
i = j;
}
return merged;
}

View File

@@ -339,37 +339,6 @@ export const initAuth = (db: dbClient) => {
discoveryUrl: process.env.OIDC_DISCOVERY_URL,
scopes: ["openid", "email", "profile"],
pkce: true,
mapProfileToUser: (profile: {
name?: string;
display_name?: string;
preferred_username?: string;
given_name?: string;
family_name?: string;
email?: string;
email_verified?: boolean;
sub?: string;
picture?: string;
avatar?: string;
}) => {
console.log("OIDC profile:", profile);
const name =
profile.name ??
profile.display_name ??
profile.preferred_username ??
(profile.given_name && profile.family_name
? `${profile.given_name} ${profile.family_name}`.trim()
: (profile.given_name ?? profile.family_name)) ??
profile.sub ??
"";
return {
email: profile.email,
name: name,
emailVerified: profile.email_verified ?? false,
image: profile.picture ?? profile.avatar ?? null,
};
},
},
],
}),

View File

@@ -1,3 +0,0 @@
ALTER TABLE "card_activity" ALTER COLUMN "fromTitle" SET DATA TYPE text;--> statement-breakpoint
ALTER TABLE "card_activity" ALTER COLUMN "toTitle" SET DATA TYPE text;--> statement-breakpoint
ALTER TABLE "card" ALTER COLUMN "title" SET DATA TYPE text;

File diff suppressed because it is too large Load Diff

View File

@@ -148,13 +148,6 @@
"when": 1764621815672,
"tag": "20251201204335_AddCardDueDates",
"breakpoints": true
},
{
"idx": 21,
"version": "7",
"when": 1767045713686,
"tag": "20251229220153_UpdateCardTitleFromVarcharToText",
"breakpoints": true
}
]
}

View File

@@ -1,7 +1,6 @@
import {
and,
asc,
count,
desc,
eq,
gte,
@@ -30,15 +29,6 @@ import {
} from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(boards)
.where(isNull(boards.deletedAt));
return result[0]?.count ?? 0;
};
export const getAllByWorkspaceId = (
db: dbClient,
workspaceId: number,

View File

@@ -1,14 +1,4 @@
import {
and,
asc,
count,
desc,
eq,
gt,
inArray,
isNull,
sql,
} from "drizzle-orm";
import { and, asc, desc, eq, gt, inArray, isNull, sql } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import {
@@ -25,15 +15,6 @@ import {
} from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(cards)
.where(isNull(cards.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
cardInput: {

View File

@@ -1,16 +1,8 @@
import { and, asc, count, eq, gt, inArray, isNull, or } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import type { ActivityType } from "@kan/db/schema";
import { cardActivities, comments } from "@kan/db/schema";
import { cardActivities } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db.select({ count: count() }).from(cardActivities);
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
activityInput: {
@@ -97,114 +89,3 @@ export const bulkCreate = async (
return results;
};
export const getPaginatedActivities = async (
db: dbClient,
cardId: number,
options?: {
limit?: number;
cursor?: Date; // createdAt cursor for pagination
},
) => {
const limit = options?.limit ?? 20;
const cursor = options?.cursor;
const validComments = await db
.select({ id: comments.id })
.from(comments)
.where(and(eq(comments.cardId, cardId), isNull(comments.deletedAt)));
const validCommentIds = validComments.map((comment) => comment.id);
const activities = await db.query.cardActivities.findMany({
columns: {
publicId: true,
type: true,
createdAt: true,
fromIndex: true,
toIndex: true,
fromTitle: true,
toTitle: true,
fromDescription: true,
toDescription: true,
fromDueDate: true,
toDueDate: true,
},
where: and(
eq(cardActivities.cardId, cardId),
cursor ? gt(cardActivities.createdAt, cursor) : undefined,
or(
isNull(cardActivities.commentId),
inArray(cardActivities.commentId, validCommentIds),
),
),
with: {
fromList: {
columns: {
publicId: true,
name: true,
index: true,
},
},
toList: {
columns: {
publicId: true,
name: true,
index: true,
},
},
label: {
columns: {
publicId: true,
name: true,
},
},
member: {
columns: {
publicId: true,
},
with: {
user: {
columns: {
id: true,
name: true,
email: true,
},
},
},
},
user: {
columns: {
id: true,
name: true,
email: true,
},
},
comment: {
columns: {
publicId: true,
comment: true,
createdBy: true,
updatedAt: true,
deletedAt: true,
},
},
},
orderBy: asc(cardActivities.createdAt), // required for merging and pagination
limit: limit + 1, // fetch one extra to check if there are more
});
const hasMore = activities.length > limit;
const items = activities.slice(0, limit);
const nextCursor = hasMore ? items[items.length - 1]?.createdAt : undefined;
return {
activities: items,
hasMore,
nextCursor,
};
};
export type PaginatedActivitiesResult = Awaited<
ReturnType<typeof getPaginatedActivities>
>;

View File

@@ -1,18 +1,9 @@
import { and, count, eq, isNull } from "drizzle-orm";
import { and, eq, isNull } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { cardAttachments } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(cardAttachments)
.where(isNull(cardAttachments.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
attachmentInput: {

View File

@@ -1,18 +1,9 @@
import { count, eq, isNull } from "drizzle-orm";
import { eq } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { comments } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(comments)
.where(isNull(comments.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
commentInput: {

View File

@@ -1,25 +1,9 @@
import { and, count, desc, eq, isNull, sql } from "drizzle-orm";
import { and, desc, eq, isNull } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { checklistItems, checklists } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(checklists)
.where(isNull(checklists.deletedAt));
return result[0]?.count ?? 0;
};
export const getCountItems = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(checklistItems)
.where(isNull(checklistItems.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
checklistInput: {
@@ -357,88 +341,3 @@ const groupByKey = <T extends Record<string, unknown>>(
}
return grouped;
};
export const reorderItem = async (
db: dbClient,
args: {
itemId: number;
newIndex: number;
},
) => {
return db.transaction(async (tx) => {
const item = await tx.query.checklistItems.findFirst({
columns: {
id: true,
index: true,
checklistId: true,
},
where: and(
eq(checklistItems.id, args.itemId),
isNull(checklistItems.deletedAt),
),
});
if (!item) {
throw new Error(`Checklist item not found for ID ${args.itemId}`);
}
const currentIndex = item.index;
const newIndex = args.newIndex;
if (currentIndex === newIndex) {
const unchanged = await tx.query.checklistItems.findFirst({
columns: {
publicId: true,
title: true,
completed: true,
},
where: and(
eq(checklistItems.id, args.itemId),
isNull(checklistItems.deletedAt),
),
});
if (!unchanged) {
throw new Error(`Checklist item not found for ID ${args.itemId}`);
}
return unchanged;
}
if (currentIndex < newIndex) {
await tx.execute(sql`
UPDATE card_checklist_item
SET index = index - 1
WHERE "checklistId" = ${item.checklistId}
AND index > ${currentIndex}
AND index <= ${newIndex}
AND "deletedAt" IS NULL
`);
} else {
await tx.execute(sql`
UPDATE card_checklist_item
SET index = index + 1
WHERE "checklistId" = ${item.checklistId}
AND index >= ${newIndex}
AND index < ${currentIndex}
AND "deletedAt" IS NULL
`);
}
const [updated] = await tx
.update(checklistItems)
.set({ index: newIndex })
.where(eq(checklistItems.id, args.itemId))
.returning({
publicId: checklistItems.publicId,
title: checklistItems.title,
completed: checklistItems.completed,
});
if (!updated) {
throw new Error(`Failed to update checklist item with ID ${args.itemId}`);
}
return updated;
});
};

View File

@@ -1,15 +1,9 @@
import { count, eq } from "drizzle-orm";
import { eq } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { imports } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db.select({ count: count() }).from(imports);
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
importInput: { source: string; createdBy: string },

View File

@@ -1,18 +1,9 @@
import { and, count, eq } from "drizzle-orm";
import { and, eq, gt } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { workspaceInviteLinks } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getActiveCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(workspaceInviteLinks)
.where(eq(workspaceInviteLinks.status, "active"));
return result[0]?.count ?? 0;
};
export const createInviteLink = async (
db: dbClient,
args: {

View File

@@ -1,18 +1,9 @@
import { and, count, eq, inArray, isNull } from "drizzle-orm";
import { and, eq, inArray, isNull } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { cardsToLabels, labels } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(labels)
.where(isNull(labels.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
labelInput: {

View File

@@ -1,18 +1,9 @@
import { and, count, desc, eq, gt, isNull, sql } from "drizzle-orm";
import { and, desc, eq, gt, isNull, sql } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import { lists } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(lists)
.where(isNull(lists.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
listInput: {

View File

@@ -1,24 +1,10 @@
import { and, count, eq, isNull } from "drizzle-orm";
import { and, eq, isNull } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import type { MemberRole, MemberStatus } from "@kan/db/schema";
import { workspaceMembers } from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getActiveCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(workspaceMembers)
.where(
and(
isNull(workspaceMembers.deletedAt),
eq(workspaceMembers.status, "active"),
),
);
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
memberInput: {

View File

@@ -1,15 +1,9 @@
import { count, desc, eq } from "drizzle-orm";
import { desc, eq } from "drizzle-orm";
import { v4 as uuidv4 } from "uuid";
import type { dbClient } from "@kan/db/client";
import { apikey, users } from "@kan/db/schema";
export const getCount = async (db: dbClient) => {
const result = await db.select({ count: count() }).from(users);
return result[0]?.count ?? 0;
};
export const getById = async (db: dbClient, userId: string) => {
return await db.query.users.findFirst({
columns: {

View File

@@ -1,14 +1,4 @@
import {
and,
count,
desc,
eq,
ilike,
inArray,
isNull,
or,
sql,
} from "drizzle-orm";
import { and, desc, eq, ilike, inArray, isNull, or, sql } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import {
@@ -20,15 +10,6 @@ import {
} from "@kan/db/schema";
import { generateUID } from "@kan/shared/utils";
export const getCount = async (db: dbClient) => {
const result = await db
.select({ count: count() })
.from(workspaces)
.where(isNull(workspaces.deletedAt));
return result[0]?.count ?? 0;
};
export const create = async (
db: dbClient,
workspaceInput: {

View File

@@ -57,7 +57,7 @@ export const activityTypeEnum = pgEnum("card_activity_type", activityTypes);
export const cards = pgTable("card", {
id: bigserial("id", { mode: "number" }).primaryKey(),
publicId: varchar("publicId", { length: 12 }).notNull().unique(),
title: text("title").notNull(),
title: varchar("title", { length: 255 }).notNull(),
description: text("description"),
index: integer("index").notNull(),
createdBy: uuid("createdBy").references(() => users.id, {
@@ -127,8 +127,8 @@ export const cardActivities = pgTable("card_activity", {
workspaceMemberId: bigint("workspaceMemberId", {
mode: "number",
}).references(() => workspaceMembers.id, { onDelete: "set null" }),
fromTitle: text("fromTitle"),
toTitle: text("toTitle"),
fromTitle: varchar("fromTitle", { length: 255 }),
toTitle: varchar("toTitle", { length: 255 }),
fromDescription: text("fromDescription"),
toDescription: text("toDescription"),
createdBy: uuid("createdBy").references(() => users.id, {

View File

@@ -46,7 +46,6 @@
}
},
"globalEnv": [
"KAN_ADMIN_API_KEY",
"POSTGRES_URL",
"TRELLO_APP_API_KEY",
"TRELLO_APP_SECRET",