Compare commits
38 Commits
fix/file-u
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cdf44afc5b | |||
| 8f5bf806e1 | |||
| 0f57279c77 | |||
| ed5b8d1644 | |||
| 994bf5c7e0 | |||
| 61123f708d | |||
| 5a8a478386 | |||
|
|
02b367fcaa | ||
|
|
f9aaebc4b5 | ||
|
|
56af094c50 | ||
|
|
e9ebd06eaa | ||
|
|
b4e9dd3811 | ||
|
|
d6aa82e070 | ||
|
|
4291d7bc8c | ||
|
|
5c72968d44 | ||
|
|
5b586f4871 | ||
|
|
fee82e5e73 | ||
|
|
03a043784a | ||
|
|
395dbfae04 | ||
|
|
9ec4bedd9a | ||
|
|
ca694595c7 | ||
|
|
0500d5171d | ||
|
|
a15e193f66 | ||
|
|
019ecbc364 | ||
|
|
82b2b4a8e1 | ||
|
|
c1adb2d4dd | ||
|
|
25ed4e39b3 | ||
|
|
a994c061ac | ||
|
|
6e1d821b35 | ||
|
|
120504ab58 | ||
|
|
ebb19584a2 | ||
|
|
410f4c481e | ||
|
|
9d7a82d381 | ||
|
|
f369ebeaa8 | ||
|
|
0fbe198fa2 | ||
|
|
81b67df9e3 | ||
|
|
4f3b49716d | ||
|
|
1347cc562c |
@@ -60,3 +60,7 @@ pnpm-debug.log
|
|||||||
|
|
||||||
# Cloud compose (separate deployment)
|
# Cloud compose (separate deployment)
|
||||||
cloud/
|
cloud/
|
||||||
|
|
||||||
|
# Local temporary caches
|
||||||
|
.pnpm-store
|
||||||
|
v8-compile-cache-0
|
||||||
|
|||||||
3
.github/ISSUE_TEMPLATE/feature_request.md
vendored
3
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -7,6 +7,9 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Wait for a maintainer to approve this issue before opening a PR. We'll signal approval with a comment or label. Feature PRs without an approved issue will be closed.
|
||||||
|
|
||||||
## ✨ Feature Request
|
## ✨ Feature Request
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
|||||||
24
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
24
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
## Description
|
||||||
|
|
||||||
|
<!-- What does this PR do? Why? -->
|
||||||
|
|
||||||
|
## Type of change
|
||||||
|
|
||||||
|
- [ ] Bug fix
|
||||||
|
- [ ] Feature (requires an approved issue — see below)
|
||||||
|
- [ ] Refactor / chore
|
||||||
|
- [ ] Documentation
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] I have linked the related issue below
|
||||||
|
- [ ] My code follows the existing style and conventions
|
||||||
|
- [ ] I have tested my changes locally
|
||||||
|
- [ ] I have included screenshots for any UI changes
|
||||||
|
|
||||||
|
## Linked issue
|
||||||
|
|
||||||
|
Closes #<!-- issue number -->
|
||||||
|
|
||||||
|
> **Feature PRs without a linked, approved issue will be closed without review.**
|
||||||
|
> Open or comment on a [feature request](https://github.com/kanbn/kan/issues/new?template=feature_request.md) first and wait for maintainer approval before building.
|
||||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -4,6 +4,9 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.pnp
|
.pnp
|
||||||
.pnp.js
|
.pnp.js
|
||||||
|
.pnpm/
|
||||||
|
.pnpm-store/
|
||||||
|
v8-compile-cache-0/
|
||||||
|
|
||||||
# testing
|
# testing
|
||||||
coverage
|
coverage
|
||||||
@@ -55,4 +58,7 @@ i18n.cache
|
|||||||
# pgdata
|
# pgdata
|
||||||
/apps/web/pgdata
|
/apps/web/pgdata
|
||||||
|
|
||||||
.claude
|
# local scripts
|
||||||
|
scripts/
|
||||||
|
|
||||||
|
.claude
|
||||||
|
|||||||
@@ -1,52 +1,54 @@
|
|||||||
# Contributing to Kan
|
# Contributing to Kan
|
||||||
|
|
||||||
Thank you for your interest in contributing to Kan! This document provides guidelines and instructions for contributing to the project.
|
Thank you for your interest in contributing to Kan!
|
||||||
|
|
||||||
## Getting Started
|
## Before you start
|
||||||
|
|
||||||
|
**Open an issue before writing code for a new feature.**
|
||||||
|
|
||||||
|
Feature PRs opened without a prior approved issue will be closed without review - not because the idea is bad, but because we can't review code for features we haven't aligned on yet. This protects your time as much as ours.
|
||||||
|
|
||||||
|
The process is:
|
||||||
|
|
||||||
|
1. Open a [feature request](https://github.com/kanbn/kan/issues/new?template=feature_request.md) and describe what you want to build
|
||||||
|
2. Wait for a maintainer to respond and signal approval (we aim to respond within a few days)
|
||||||
|
3. Once approved, open a PR that links the issue
|
||||||
|
|
||||||
|
Bug fixes and documentation improvements don't need prior approval - just open a PR.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
1. Fork the repository
|
1. Fork the repository
|
||||||
2. Clone your fork: `git clone https://github.com/YOUR-USERNAME/kan.git`
|
2. Clone your fork: `git clone https://github.com/YOUR-USERNAME/kan.git`
|
||||||
3. Create a new branch: `git checkout -b feat/your-feature-name`
|
3. Create a branch: `git checkout -b feat/your-feature-name` or `fix/your-fix-name`
|
||||||
4. Install dependencies: `pnpm install`
|
4. Install dependencies: `pnpm install`
|
||||||
5. Copy `.env.example` to `.env` and configure your environment variables
|
5. Copy `.env.example` to `.env` and configure your environment variables
|
||||||
6. Make your changes
|
6. Make your changes
|
||||||
7. Commit your changes: `git commit -m "feat: description of changes"`
|
7. Commit using [conventional commits](https://www.conventionalcommits.org/): `git commit -m "feat: description"`
|
||||||
8. Push to your fork: `git push origin feat/your-feature-name`
|
8. Push and open a Pull Request
|
||||||
9. Open a Pull Request
|
|
||||||
|
|
||||||
## Development Guidelines
|
## Pull request expectations
|
||||||
|
|
||||||
### Code Style
|
- Link the related issue (required for features)
|
||||||
|
- Write a clear description of what changed and why
|
||||||
|
- Include screenshots for any UI changes
|
||||||
|
- Keep PRs focused - one feature or fix per PR
|
||||||
|
- All CI checks must pass before review
|
||||||
|
|
||||||
- Follow the existing code style
|
## Code style
|
||||||
- Use meaningful variable and function names
|
|
||||||
- Add comments for complex logic
|
- Follow the existing patterns in the codebase
|
||||||
|
- Use meaningful names - avoid comments that just restate what the code does
|
||||||
- Keep functions focused and concise
|
- Keep functions focused and concise
|
||||||
|
|
||||||
### Commits
|
## Need help?
|
||||||
|
|
||||||
- Use clear and descriptive commit messages
|
- Join our [Discord server](https://discord.gg/e6ejRb6CmT)
|
||||||
- Reference issue numbers when applicable
|
- Check existing issues and PRs before opening new ones
|
||||||
- Keep commits focused on single changes
|
|
||||||
|
|
||||||
### Pull Requests
|
|
||||||
|
|
||||||
- Provide a clear description of the changes
|
|
||||||
- Include screenshots for UI changes
|
|
||||||
- Keep PRs focused on a single feature/fix
|
|
||||||
|
|
||||||
## Need Help?
|
|
||||||
|
|
||||||
- Join our [Discord server](https://discord.gg/e6ejRb6CmT) for questions
|
|
||||||
- Check existing issues and pull requests
|
|
||||||
- Email [henry@kan.bn](mailto:henry@kan.bn) for major concerns
|
- Email [henry@kan.bn](mailto:henry@kan.bn) for major concerns
|
||||||
|
|
||||||
## Code of Conduct
|
|
||||||
|
|
||||||
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.
|
|
||||||
|
|
||||||
We aim to foster an inclusive and welcoming community. Harassment and abusive behavior will not be tolerated.
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
By contributing to Kan, you agree that your contributions will be licensed under the AGPLv3 License.
|
By contributing to Kan, you agree that your contributions will be licensed under the AGPLv3 License.
|
||||||
|
|||||||
449
README.md
449
README.md
@@ -1,242 +1,315 @@
|
|||||||

|
# Kan
|
||||||
|
|
||||||
<div align="center">
|
Kan 是一个开源的看板式项目管理工具,可作为 Trello 的自托管替代方案。它支持工作区、看板、列表、卡片、标签、成员、评论、检查清单和活动记录。
|
||||||
<h3 align="center">Kan</h3>
|
|
||||||
<p>The open-source project management alternative to Trello.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p align="center">
|
Kan 使用 AGPLv3 协议发布。
|
||||||
<a href="https://kan.bn/kan/roadmap">Roadmap</a>
|
|
||||||
·
|
|
||||||
<a href="https://kan.bn">Website</a>
|
|
||||||
·
|
|
||||||
<a href="https://docs.kan.bn">Docs</a>
|
|
||||||
·
|
|
||||||
<a href="https://discord.gg/e6ejRb6CmT">Discord</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div align="center">
|
- [项目主页](https://kan.bn)
|
||||||
<a href="https://github.com/kanbn/kan/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/badge/license-AGPLv3-purple"></a>
|
- [在线文档](https://docs.kan.bn)
|
||||||
</div>
|
- [路线图](https://kan.bn/kan/roadmap)
|
||||||
|
- [Discord 社区](https://discord.gg/e6ejRb6CmT)
|
||||||
|
|
||||||
## Features 💫
|

|
||||||
|
|
||||||
- 👁️ **Board Visibility**: Control who can view and edit your boards
|
## 功能
|
||||||
- 🤝 **Workspace Members**: Invite members and collaborate with your team
|
|
||||||
- 🚀 **Trello Imports**: Easily import your Trello boards
|
|
||||||
- 🔍 **Labels & Filters**: Organise and find cards quickly
|
|
||||||
- 💬 **Comments**: Discuss and collaborate with your team
|
|
||||||
- 📝 **Activity Log**: Track all card changes with detailed activity history
|
|
||||||
- 🎨 **Templates** : Save time with reusable custom board templates
|
|
||||||
- ⚡️ **Integrations (coming soon)** : Connect your favourite tools
|
|
||||||
|
|
||||||
See our [roadmap](https://kan.bn/kan/roadmap) for upcoming features.
|
- 看板可见性控制
|
||||||
|
- 工作区成员和协作
|
||||||
|
- Trello 看板导入
|
||||||
|
- 卡片标签和筛选
|
||||||
|
- 评论、活动记录和检查清单
|
||||||
|
- 可复用的看板模板
|
||||||
|
- 卡片截止日期、成员和附件
|
||||||
|
- 内置 REST API 和 MCP 服务
|
||||||
|
|
||||||
## Screenshot 👁️
|
## 使用 Docker Compose 自托管
|
||||||
|
|
||||||
<img width="1507" alt="hero-dark" src="https://github.com/user-attachments/assets/8490104a-cd5d-49de-afc2-152fd8a93119" />
|
### 环境要求
|
||||||
|
|
||||||
## Made With 🛠️
|
- Docker Engine
|
||||||
|
- Docker Compose v2
|
||||||
|
|
||||||
- [Next.js](https://nextjs.org/?ref=kan.bn)
|
### 启动
|
||||||
- [tRPC](https://trpc.io/?ref=kan.bn)
|
|
||||||
- [Better Auth](https://better-auth.com/?ref=kan.bn)
|
|
||||||
- [Tailwind CSS](https://tailwindcss.com/?ref=kan.bn)
|
|
||||||
- [Drizzle ORM](https://orm.drizzle.team/?ref=kan.bn)
|
|
||||||
- [React Email](https://react.email/?ref=kan.bn)
|
|
||||||
|
|
||||||
## Self Hosting 🐳
|
在仓库根目录执行:
|
||||||
|
|
||||||
### One-click Deployments
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
The easiest way to deploy Kan is through Railway. We've partnered with Railway to maintain an official template that supports the development of the project.
|
编辑 `.env`,至少设置以下变量:
|
||||||
|
|
||||||
<a href="https://railway.com/deploy/kan?referralCode=bZPsr2&utm_medium=integration&utm_source=template&utm_campaign=generic">
|
```dotenv
|
||||||
<img src="https://railway.app/button.svg" alt="Deploy on Railway" height="40" />
|
NEXT_PUBLIC_BASE_URL=http://localhost:3000
|
||||||
</a>
|
POSTGRES_PASSWORD=请填写数据库密码
|
||||||
|
POSTGRES_URL=postgresql://kan:请填写数据库密码@postgres:5432/kan_db
|
||||||
|
BETTER_AUTH_SECRET=请填写一个随机的 32 位以上密钥
|
||||||
|
```
|
||||||
|
|
||||||
### Docker Compose
|
构建本地镜像并启动:
|
||||||
|
|
||||||
Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database and automatically run migrations.
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
1. Create a `.env` file with your environment variables (see [Environment Variables](#environment-variables-) section below)
|
仓库自带的 `docker-compose.yml` 使用本地镜像标签:
|
||||||
|
|
||||||
2. Use the provided `docker-compose.yml` file or create your own with the following configuration:
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
migrate:
|
migrate:
|
||||||
image: ghcr.io/kanbn/kan-migrate:latest
|
image: kan-migrate:local
|
||||||
container_name: kan-migrate
|
build:
|
||||||
networks:
|
context: .
|
||||||
- kan-network
|
dockerfile: ./apps/web/Dockerfile
|
||||||
environment:
|
target: migrate
|
||||||
- POSTGRES_URL=${POSTGRES_URL}
|
|
||||||
depends_on:
|
|
||||||
postgres:
|
|
||||||
condition: service_healthy
|
|
||||||
restart: "no"
|
|
||||||
|
|
||||||
web:
|
web:
|
||||||
image: ghcr.io/kanbn/kan:latest
|
image: kan:local
|
||||||
container_name: kan-web
|
build:
|
||||||
ports:
|
context: .
|
||||||
- "${WEB_PORT:-3000}:3000"
|
dockerfile: ./apps/web/Dockerfile
|
||||||
networks:
|
target: web
|
||||||
- kan-network
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
environment:
|
|
||||||
- NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL}
|
|
||||||
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
|
|
||||||
- POSTGRES_URL=${POSTGRES_URL}
|
|
||||||
- NEXT_PUBLIC_ALLOW_CREDENTIALS=true
|
|
||||||
depends_on:
|
|
||||||
migrate:
|
|
||||||
condition: service_completed_successfully
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
postgres:
|
|
||||||
image: postgres:15
|
|
||||||
container_name: kan-db
|
|
||||||
environment:
|
|
||||||
- POSTGRES_DB=kan_db
|
|
||||||
- POSTGRES_USER=kan
|
|
||||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
|
||||||
ports:
|
|
||||||
- 5432:5432
|
|
||||||
volumes:
|
|
||||||
- kan_postgres_data:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U kan -d kan_db"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 10
|
|
||||||
restart: unless-stopped
|
|
||||||
networks:
|
|
||||||
- kan-network
|
|
||||||
|
|
||||||
networks:
|
|
||||||
kan-network:
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
kan_postgres_data:
|
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Start the containers in detached mode:
|
不会拉取远端 Web 镜像。数据库迁移会在 Web 服务启动前自动执行。启动完成后访问 <http://localhost:3000>。如修改端口,请同步修改 `WEB_PORT` 和 `NEXT_PUBLIC_BASE_URL`。
|
||||||
|
|
||||||
|
### 常用命令
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d
|
# 查看状态
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
|
# 查看 Web 日志
|
||||||
|
docker compose logs -f web
|
||||||
|
|
||||||
|
# 查看迁移日志
|
||||||
|
docker compose logs -f migrate
|
||||||
|
|
||||||
|
# 停止服务
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# 停止服务并删除数据库卷(会删除本地数据)
|
||||||
|
docker compose down -v
|
||||||
```
|
```
|
||||||
|
|
||||||
The `migrate` service will automatically run database migrations before the web service starts. The application will be available at http://localhost:3000 (or the port specified in `WEB_PORT`).
|
检查 API 健康状态:
|
||||||
|
|
||||||
**Managing containers:**
|
```bash
|
||||||
|
curl http://localhost:3000/api/v1/health
|
||||||
|
```
|
||||||
|
|
||||||
- To stop the containers: `docker compose down`
|
预期返回:
|
||||||
- To view logs: `docker compose logs -f`
|
|
||||||
- To view logs for a specific service: `docker compose logs -f web` or `docker compose logs -f migrate`
|
|
||||||
- To restart the containers: `docker compose restart`
|
|
||||||
- To rebuild after code changes: `docker compose up -d --build`
|
|
||||||
|
|
||||||
For the complete Docker Compose configuration with all optional features, see [docker-compose.yml](./docker-compose.yml) in the repository.
|
```json
|
||||||
|
{ "status": "ok", "database": "ok", "storage": "not_configured" }
|
||||||
|
```
|
||||||
|
|
||||||
## Local Development 🧑💻
|
默认文件存储状态为 `not_configured`。如需上传头像和附件,请按照 `.env.example` 配置 S3 兼容存储。
|
||||||
|
|
||||||
1. Clone the repository (or fork)
|
## 本地开发
|
||||||
|
|
||||||
|
项目是 pnpm monorepo,需要 Node.js 20.18.1 或更高版本,以及 pnpm 9.14.2。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/kanbn/kan.git
|
git clone https://github.com/kanbn/kan.git
|
||||||
```
|
cd kan
|
||||||
|
|
||||||
2. Install dependencies
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm install
|
pnpm install
|
||||||
```
|
cp .env.example .env
|
||||||
|
|
||||||
3. Copy `.env.example` to `.env` and configure your environment variables
|
|
||||||
4. Migrate database
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm db:migrate
|
pnpm db:migrate
|
||||||
```
|
|
||||||
|
|
||||||
5. Start the development server
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
## Environment Variables 🔐
|
开发服务器默认地址为 <http://localhost:3000>。常用检查命令:
|
||||||
|
|
||||||
| Variable | Description | Required | Example |
|
```bash
|
||||||
| ----------------------------------------- | --------------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------- |
|
pnpm typecheck
|
||||||
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
|
pnpm lint
|
||||||
| `REDIS_URL` | Redis connection URL | For rate limiting (optional) | `redis://localhost:6379` or `redis://redis:6379` (Docker) |
|
pnpm format
|
||||||
| `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` |
|
|
||||||
| `NEXT_API_BODY_SIZE_LIMIT` | Maximum API request body size (defaults to 1mb) | No | `50mb` |
|
|
||||||
| `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` |
|
|
||||||
| `S3_AVATAR_UPLOAD_LIMIT` | Maximum avatar file size in bytes | For file uploads | `2097152` (2MB) |
|
|
||||||
| `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_USE_VIRTUAL_HOSTED_URLS` | Use virtual-hosted style URLs (bucket.domain.com) | For file uploads (optional) | `true` |
|
|
||||||
| `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` |
|
|
||||||
| `LOG_LEVEL` | Log verbosity level (debug, info, warn, error) | No (defaults to debug in dev, info in prod) | `info` |
|
|
||||||
|
|
||||||
See `.env.example` for a complete list of supported environment variables.
|
## 环境变量
|
||||||
|
|
||||||
## Contributing 🤝
|
完整变量列表见 [`.env.example`](.env.example)。
|
||||||
|
|
||||||
We welcome contributions! Please read our [contribution guidelines](CONTRIBUTING.md) before submitting a pull request.
|
| 变量 | 用途 | 示例 |
|
||||||
|
| ------------------------------- | ---------------------------------- | -------------------------------------------- |
|
||||||
|
| `NEXT_PUBLIC_BASE_URL` | 当前 Kan 实例的访问地址 | `http://localhost:3000` |
|
||||||
|
| `POSTGRES_URL` | PostgreSQL 连接地址 | `postgresql://kan:密码@postgres:5432/kan_db` |
|
||||||
|
| `POSTGRES_PASSWORD` | Compose 创建 PostgreSQL 使用的密码 | `change-me` |
|
||||||
|
| `BETTER_AUTH_SECRET` | 登录会话加密密钥 | 随机 32 位以上字符串 |
|
||||||
|
| `WEB_PORT` | 宿主机映射端口 | `3000` |
|
||||||
|
| `REDIS_URL` | 可选的限流 Redis 地址 | `redis://redis:6379` |
|
||||||
|
| `NEXT_PUBLIC_ALLOW_CREDENTIALS` | 是否允许账号密码登录 | `true` |
|
||||||
|
| `NEXT_PUBLIC_DISABLE_SIGN_UP` | 是否关闭注册 | `false` |
|
||||||
|
| `KAN_ADMIN_API_KEY` | 管理和监控接口密钥 | 自定义密钥 |
|
||||||
|
|
||||||
## Contributors 👥
|
## MCP 服务
|
||||||
|
|
||||||
<a href="https://github.com/kanbn/kan/graphs/contributors">
|
Kan 仓库内置了基于 Model Context Protocol 的 MCP 服务。连接后,Claude Desktop、Cursor、VS Code、Codex 等 MCP 客户端可以通过自然语言读取和管理 Kan 数据。
|
||||||
<img src="https://contrib.rocks/image?repo=kanbn/kan" />
|
|
||||||
</a>
|
|
||||||
|
|
||||||
## Sponsors ❤️
|
### 先看这里
|
||||||
|
|
||||||
[<img height="100" alt="image" src="https://github.com/user-attachments/assets/e331c71f-ac86-46a6-bceb-ce276de094b0" />](https://www.testmuai.com)
|
MCP 源码位于 `packages/mcp`,目前是仓库内的工作区包,并未发布为 npm 公共包。因此以下命令不能使用:
|
||||||
|
|
||||||
Proudly sponsored by [TestMu AI (formerly LambdaTest)](https://www.testmuai.com) - an AI-native testing cloud platform built for modern engineering teams. Covering everything from autonomous test creation and fast execution to testing AI agents like chatbots and voice assistants. If you're serious about testing, go check them out.
|
```bash
|
||||||
|
npx -y @kan/mcp
|
||||||
|
bunx kan-mcp
|
||||||
|
```
|
||||||
|
|
||||||
## License 📝
|
请从当前仓库构建 MCP 服务,再让客户端启动生成的文件。
|
||||||
|
|
||||||
Kan is licensed under the [AGPLv3 license](LICENSE).
|
### 获取 API 密钥
|
||||||
|
|
||||||
## Contact 📧
|
1. 登录 Kan。
|
||||||
|
2. 打开设置中的 API 密钥页面,地址通常为 `/settings/api`。
|
||||||
|
3. 创建一个 API 密钥并立即保存。密钥只会完整显示一次。
|
||||||
|
|
||||||
For support or to get in touch, please email [henry@kan.bn](mailto:henry@kan.bn) or join our [Discord server](https://discord.gg/e6ejRb6CmT).
|
MCP 使用用户 API 密钥,不是 `KAN_ADMIN_API_KEY`。请求会以 Bearer Token 方式访问 `${KAN_BASE_URL}/api/v1`。
|
||||||
|
|
||||||
|
### 构建
|
||||||
|
|
||||||
|
在仓库根目录执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
pnpm --filter @kan/mcp build
|
||||||
|
```
|
||||||
|
|
||||||
|
构建产物为 `packages/mcp/dist/index.js`。MCP 服务使用 stdio 通信,应由 MCP 客户端启动,不需要单独暴露 HTTP 端口。
|
||||||
|
|
||||||
|
### 环境变量
|
||||||
|
|
||||||
|
| 变量 | 说明 |
|
||||||
|
| --------------- | ---------------------------------- |
|
||||||
|
| `KAN_BASE_URL` | Kan 实例根地址,不要追加 `/api/v1` |
|
||||||
|
| `KAN_API_TOKEN` | Kan 设置中创建的用户 API 密钥 |
|
||||||
|
|
||||||
|
本地 Kan 使用 Docker Compose 时:
|
||||||
|
|
||||||
|
```text
|
||||||
|
KAN_BASE_URL=http://localhost:3000
|
||||||
|
KAN_API_TOKEN=kan_你的_api_key
|
||||||
|
```
|
||||||
|
|
||||||
|
### Claude Desktop 和 Cursor
|
||||||
|
|
||||||
|
Claude Desktop 使用 `claude_desktop_config.json`,Cursor 使用项目内的 `.cursor/mcp.json`。将 `args` 中的路径替换为本机仓库的绝对路径:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"kan": {
|
||||||
|
"command": "node",
|
||||||
|
"args": ["/绝对路径/kan/packages/mcp/dist/index.js"],
|
||||||
|
"env": {
|
||||||
|
"KAN_BASE_URL": "http://localhost:3000",
|
||||||
|
"KAN_API_TOKEN": "kan_你的_api_key"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Windows 路径示例:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"kan": {
|
||||||
|
"command": "node",
|
||||||
|
"args": ["C:\\workspace\\kan\\packages\\mcp\\dist\\index.js"],
|
||||||
|
"env": {
|
||||||
|
"KAN_BASE_URL": "http://localhost:3000",
|
||||||
|
"KAN_API_TOKEN": "kan_你的_api_key"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
VS Code 的 `mcp.json` 使用 `servers` 作为顶层键,并增加 `type`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"servers": {
|
||||||
|
"kan": {
|
||||||
|
"type": "stdio",
|
||||||
|
"command": "node",
|
||||||
|
"args": ["/绝对路径/kan/packages/mcp/dist/index.js"],
|
||||||
|
"env": {
|
||||||
|
"KAN_BASE_URL": "http://localhost:3000",
|
||||||
|
"KAN_API_TOKEN": "kan_你的_api_key"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Codex
|
||||||
|
|
||||||
|
Codex 可通过命令添加 stdio MCP 服务。将脚本路径替换为本机绝对路径:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
codex mcp add kan \
|
||||||
|
--env KAN_BASE_URL=http://localhost:3000 \
|
||||||
|
--env KAN_API_TOKEN=kan_你的_api_key \
|
||||||
|
-- node /绝对路径/kan/packages/mcp/dist/index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
Windows PowerShell:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
codex mcp add kan `
|
||||||
|
--env KAN_BASE_URL=http://localhost:3000 `
|
||||||
|
--env KAN_API_TOKEN=kan_你的_api_key `
|
||||||
|
-- node C:\workspace\kan\packages\mcp\dist\index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
使用 `codex mcp get kan` 检查配置。
|
||||||
|
|
||||||
|
### 手动启动和排错
|
||||||
|
|
||||||
|
Linux 或 macOS:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
KAN_BASE_URL=http://localhost:3000 \
|
||||||
|
KAN_API_TOKEN=kan_你的_api_key \
|
||||||
|
node packages/mcp/dist/index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
PowerShell:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$env:KAN_BASE_URL = "http://localhost:3000"
|
||||||
|
$env:KAN_API_TOKEN = "kan_你的_api_key"
|
||||||
|
node .\packages\mcp\dist\index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
如果出现 `Connection closed`,检查以下内容:
|
||||||
|
|
||||||
|
1. 已执行 `pnpm --filter @kan/mcp build`。
|
||||||
|
2. `args` 指向真实存在的 `packages/mcp/dist/index.js`。
|
||||||
|
3. `KAN_BASE_URL` 只填写实例根地址。
|
||||||
|
4. `KAN_API_TOKEN` 是 Kan 用户 API 密钥。
|
||||||
|
5. `http://localhost:3000/api/v1/health` 返回数据库正常。
|
||||||
|
|
||||||
|
### 工具范围
|
||||||
|
|
||||||
|
当前 MCP 服务提供 46 个工具,覆盖工作区、看板、列表、卡片、评论、标签、检查清单和成员管理。连接后可以直接提出以下请求:
|
||||||
|
|
||||||
|
- 列出我的工作区。
|
||||||
|
- 查看研发工作区中的所有看板。
|
||||||
|
- 创建一个包含待办、进行中、已完成列表的新看板。
|
||||||
|
- 将登录问题卡片移动到进行中列表。
|
||||||
|
- 给版本发布卡片添加检查清单和评论。
|
||||||
|
|
||||||
|
## 技术栈
|
||||||
|
|
||||||
|
Next.js、React、tRPC、Better Auth、Tailwind CSS、Drizzle ORM、PostgreSQL 和 Model Context Protocol SDK。
|
||||||
|
|
||||||
|
## 参与贡献
|
||||||
|
|
||||||
|
欢迎提交 Issue 和 Pull Request。提交代码前请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md),并运行类型检查、Lint 和格式检查。
|
||||||
|
|
||||||
|
## 许可证与联系
|
||||||
|
|
||||||
|
项目使用 [AGPLv3](LICENSE) 协议。如需支持,请发送邮件至 [henry@kan.bn](mailto:henry@kan.bn),或加入 [Discord 社区](https://discord.gg/e6ejRb6CmT)。
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"version": "1.10",
|
"version": "1.10",
|
||||||
"locale": {
|
"locale": {
|
||||||
"source": "en",
|
"source": "en",
|
||||||
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR"]
|
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR", "zh-CN"]
|
||||||
},
|
},
|
||||||
"buckets": {
|
"buckets": {
|
||||||
"json": {
|
"json": {
|
||||||
|
|||||||
@@ -384,6 +384,9 @@ checksums:
|
|||||||
i0ZMQl/message: f739058266a2cb6a3d7cca14de09c69a
|
i0ZMQl/message: f739058266a2cb6a3d7cca14de09c69a
|
||||||
i0ZMQl/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
i0ZMQl/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
||||||
i0ZMQl/translation: f739058266a2cb6a3d7cca14de09c69a
|
i0ZMQl/translation: f739058266a2cb6a3d7cca14de09c69a
|
||||||
|
wE3hGS/message: 1b3bccc465ad34111956b1c705c52031
|
||||||
|
wE3hGS/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
wE3hGS/translation: 1b3bccc465ad34111956b1c705c52031
|
||||||
wewm3j/message: 985c0177744ec56d8dac84f66ec284ca
|
wewm3j/message: 985c0177744ec56d8dac84f66ec284ca
|
||||||
wewm3j/origin/0/0: bcd95e286f12800a3e7ee0a71feb3ca5
|
wewm3j/origin/0/0: bcd95e286f12800a3e7ee0a71feb3ca5
|
||||||
wewm3j/translation: 985c0177744ec56d8dac84f66ec284ca
|
wewm3j/translation: 985c0177744ec56d8dac84f66ec284ca
|
||||||
@@ -536,19 +539,20 @@ checksums:
|
|||||||
dEgA5A/origin/1/0: a50c4fbde8da6e0a77c4e0aef0b44dea
|
dEgA5A/origin/1/0: a50c4fbde8da6e0a77c4e0aef0b44dea
|
||||||
dEgA5A/origin/2/0: 97bd206a05414e2a571020d64e166093
|
dEgA5A/origin/2/0: 97bd206a05414e2a571020d64e166093
|
||||||
dEgA5A/origin/3/0: 522726bb62051656dc0d165185d6b451
|
dEgA5A/origin/3/0: 522726bb62051656dc0d165185d6b451
|
||||||
dEgA5A/origin/4/0: b2059fa4b8b99cc10440da26475b234c
|
dEgA5A/origin/4/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
dEgA5A/origin/5/0: 2a382c1cdf010f01a8e95c3e05f6df53
|
dEgA5A/origin/5/0: b2059fa4b8b99cc10440da26475b234c
|
||||||
dEgA5A/origin/6/0: d55f532bb5ae247e3a018978be0da463
|
dEgA5A/origin/6/0: 2a382c1cdf010f01a8e95c3e05f6df53
|
||||||
dEgA5A/origin/7/0: 4b4f55c033add8db69178563832227c6
|
dEgA5A/origin/7/0: d55f532bb5ae247e3a018978be0da463
|
||||||
dEgA5A/origin/8/0: 68450df287fb46ea629e818732c1291a
|
dEgA5A/origin/8/0: 4b4f55c033add8db69178563832227c6
|
||||||
dEgA5A/origin/9/0: 15ea2dfd5eae4e05b226b1320103476e
|
dEgA5A/origin/9/0: 68450df287fb46ea629e818732c1291a
|
||||||
dEgA5A/origin/10/0: 03c00909b41be01231cd3e843c8ee44e
|
dEgA5A/origin/10/0: 15ea2dfd5eae4e05b226b1320103476e
|
||||||
dEgA5A/origin/11/0: 0627e0040ca4939c9a57349e98c51797
|
dEgA5A/origin/11/0: 03c00909b41be01231cd3e843c8ee44e
|
||||||
dEgA5A/origin/12/0: 15792234f408027822ee71ccddde6f9b
|
dEgA5A/origin/12/0: 0627e0040ca4939c9a57349e98c51797
|
||||||
dEgA5A/origin/13/0: 5c60161e173f5eae9276d8e4c70b4ebb
|
dEgA5A/origin/13/0: 15792234f408027822ee71ccddde6f9b
|
||||||
dEgA5A/origin/14/0: a1fde3fcce608870830f168f027727ff
|
dEgA5A/origin/14/0: 5c60161e173f5eae9276d8e4c70b4ebb
|
||||||
dEgA5A/origin/15/0: 83911e3eacbad4583e2b1647a784d154
|
dEgA5A/origin/15/0: a1fde3fcce608870830f168f027727ff
|
||||||
dEgA5A/origin/16/0: dbad0c8d7863cb41f5495264f82e7081
|
dEgA5A/origin/16/0: 83911e3eacbad4583e2b1647a784d154
|
||||||
|
dEgA5A/origin/17/0: dbad0c8d7863cb41f5495264f82e7081
|
||||||
dEgA5A/translation: 2e2a849c2223911717de8caa2c71bade
|
dEgA5A/translation: 2e2a849c2223911717de8caa2c71bade
|
||||||
kryGs%2B/message: bba0beaced7ea954ceb980f2b022ffee
|
kryGs%2B/message: bba0beaced7ea954ceb980f2b022ffee
|
||||||
kryGs%2B/origin/0/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
|
kryGs%2B/origin/0/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
|
||||||
@@ -560,6 +564,9 @@ checksums:
|
|||||||
9trBXW/message: 0035c67fb6f70992effb263b0b30e6d4
|
9trBXW/message: 0035c67fb6f70992effb263b0b30e6d4
|
||||||
9trBXW/origin/0/0: 1b05beba6bdd908015fa8e798717f024
|
9trBXW/origin/0/0: 1b05beba6bdd908015fa8e798717f024
|
||||||
9trBXW/translation: 0035c67fb6f70992effb263b0b30e6d4
|
9trBXW/translation: 0035c67fb6f70992effb263b0b30e6d4
|
||||||
|
AgE2vR/message: a295a7050379531f9f56ada01c32e8e1
|
||||||
|
AgE2vR/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
AgE2vR/translation: a295a7050379531f9f56ada01c32e8e1
|
||||||
fEY2vP/message: 91509e2f92b0b3b11330b6983139fdbf
|
fEY2vP/message: 91509e2f92b0b3b11330b6983139fdbf
|
||||||
fEY2vP/origin/0/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
|
fEY2vP/origin/0/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
|
||||||
fEY2vP/origin/1/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
|
fEY2vP/origin/1/0: 15fd9c05fc09ccbbb54aadc4aa5e5501
|
||||||
@@ -932,6 +939,9 @@ checksums:
|
|||||||
f8fH8W/message: 991b75727b6784c1a063a7462b76186d
|
f8fH8W/message: 991b75727b6784c1a063a7462b76186d
|
||||||
f8fH8W/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
|
f8fH8W/origin/0/0: eb63312c63f6c8d2a5b6520c89012123
|
||||||
f8fH8W/translation: 991b75727b6784c1a063a7462b76186d
|
f8fH8W/translation: 991b75727b6784c1a063a7462b76186d
|
||||||
|
Uf%2B1DF/message: e5b4d2df65d6676318682404de4e38d3
|
||||||
|
Uf%2B1DF/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
Uf%2B1DF/translation: e5b4d2df65d6676318682404de4e38d3
|
||||||
Odv3J6/message: f3cc49ba2dc3f9c33917f8a749d68bf5
|
Odv3J6/message: f3cc49ba2dc3f9c33917f8a749d68bf5
|
||||||
Odv3J6/origin/0/0: 9d4260644f1a12f41d6b72574eeb111c
|
Odv3J6/origin/0/0: 9d4260644f1a12f41d6b72574eeb111c
|
||||||
Odv3J6/translation: f3cc49ba2dc3f9c33917f8a749d68bf5
|
Odv3J6/translation: f3cc49ba2dc3f9c33917f8a749d68bf5
|
||||||
@@ -1675,12 +1685,21 @@ checksums:
|
|||||||
vneRvS/message: e228107df80015377112d41f4f155cb3
|
vneRvS/message: e228107df80015377112d41f4f155cb3
|
||||||
vneRvS/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
|
vneRvS/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
|
||||||
vneRvS/translation: e228107df80015377112d41f4f155cb3
|
vneRvS/translation: e228107df80015377112d41f4f155cb3
|
||||||
|
sZ%2FWDz/message: 4ae9f1cf0c53ebe8852574353d83d252
|
||||||
|
sZ%2FWDz/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
sZ%2FWDz/translation: 4ae9f1cf0c53ebe8852574353d83d252
|
||||||
|
VvCMyU/message: a70262481fb1e9e3ff2506b5c3efa03d
|
||||||
|
VvCMyU/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
VvCMyU/translation: a70262481fb1e9e3ff2506b5c3efa03d
|
||||||
51UCsN/message: ce14fde5e972c2b5276c25ddded817c4
|
51UCsN/message: ce14fde5e972c2b5276c25ddded817c4
|
||||||
51UCsN/origin/0/0: 0eeeb7e68164ff118040918f1ef00a7a
|
51UCsN/origin/0/0: 0eeeb7e68164ff118040918f1ef00a7a
|
||||||
51UCsN/translation: ce14fde5e972c2b5276c25ddded817c4
|
51UCsN/translation: ce14fde5e972c2b5276c25ddded817c4
|
||||||
J4%2BOTA/message: 6ad27e803483208b5313660b7b5791d3
|
J4%2BOTA/message: 6ad27e803483208b5313660b7b5791d3
|
||||||
J4%2BOTA/origin/0/0: fd0e66cef8d46e96bcf3143a12f9b6db
|
J4%2BOTA/origin/0/0: fd0e66cef8d46e96bcf3143a12f9b6db
|
||||||
J4%2BOTA/translation: 6ad27e803483208b5313660b7b5791d3
|
J4%2BOTA/translation: 6ad27e803483208b5313660b7b5791d3
|
||||||
|
S3wq2O/message: 9268b9b2e31373e5ac2e29c19d08e1ef
|
||||||
|
S3wq2O/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
||||||
|
S3wq2O/translation: 9268b9b2e31373e5ac2e29c19d08e1ef
|
||||||
BOqTi5/message: 11edf0427766c26db541d46379dc3c16
|
BOqTi5/message: 11edf0427766c26db541d46379dc3c16
|
||||||
BOqTi5/placeholders/0/0: 9db68a4b386b9fa1fd1d5797c32be100
|
BOqTi5/placeholders/0/0: 9db68a4b386b9fa1fd1d5797c32be100
|
||||||
BOqTi5/placeholders/1/0: b837a9e8bd06b58be95699b3ee663f43
|
BOqTi5/placeholders/1/0: b837a9e8bd06b58be95699b3ee663f43
|
||||||
@@ -2216,6 +2235,9 @@ checksums:
|
|||||||
zYRVNp/message: 8b36455dd5b43e56d2ab06e522c3bacc
|
zYRVNp/message: 8b36455dd5b43e56d2ab06e522c3bacc
|
||||||
zYRVNp/origin/0/0: 97bd206a05414e2a571020d64e166093
|
zYRVNp/origin/0/0: 97bd206a05414e2a571020d64e166093
|
||||||
zYRVNp/translation: 8b36455dd5b43e56d2ab06e522c3bacc
|
zYRVNp/translation: 8b36455dd5b43e56d2ab06e522c3bacc
|
||||||
|
NM2hyD/message: dfd9e9abdca731ba9ca3fcff645b575e
|
||||||
|
NM2hyD/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
NM2hyD/translation: dfd9e9abdca731ba9ca3fcff645b575e
|
||||||
wgNoIs/message: eedc7cdb02de467c15dc418a066a77f2
|
wgNoIs/message: eedc7cdb02de467c15dc418a066a77f2
|
||||||
wgNoIs/origin/0/0: 3c57a918258af4b44c187f58d203345f
|
wgNoIs/origin/0/0: 3c57a918258af4b44c187f58d203345f
|
||||||
wgNoIs/origin/1/0: 3c57a918258af4b44c187f58d203345f
|
wgNoIs/origin/1/0: 3c57a918258af4b44c187f58d203345f
|
||||||
@@ -2373,6 +2395,9 @@ checksums:
|
|||||||
uAQUqI/message: 4e1fcce15854d824919b4a582c697c90
|
uAQUqI/message: 4e1fcce15854d824919b4a582c697c90
|
||||||
uAQUqI/origin/0/0: dc1a240d2d0cccb102c67ca311d4e457
|
uAQUqI/origin/0/0: dc1a240d2d0cccb102c67ca311d4e457
|
||||||
uAQUqI/translation: 4e1fcce15854d824919b4a582c697c90
|
uAQUqI/translation: 4e1fcce15854d824919b4a582c697c90
|
||||||
|
hQRttt/message: 7c91ef5f747eea9f77a9c4f23e19fb2e
|
||||||
|
hQRttt/origin/0/0: b1f4eb6768222ea825703105f6014486
|
||||||
|
hQRttt/translation: 7c91ef5f747eea9f77a9c4f23e19fb2e
|
||||||
WYDptz/message: 05f2b4abfc36def17756a6969983cf86
|
WYDptz/message: 05f2b4abfc36def17756a6969983cf86
|
||||||
WYDptz/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
|
WYDptz/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
|
||||||
WYDptz/translation: 05f2b4abfc36def17756a6969983cf86
|
WYDptz/translation: 05f2b4abfc36def17756a6969983cf86
|
||||||
@@ -2459,6 +2484,10 @@ checksums:
|
|||||||
NcFrgC/message: bd15a7b3d8b4bce18cd42682ea1ec164
|
NcFrgC/message: bd15a7b3d8b4bce18cd42682ea1ec164
|
||||||
NcFrgC/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
NcFrgC/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
||||||
NcFrgC/translation: bd15a7b3d8b4bce18cd42682ea1ec164
|
NcFrgC/translation: bd15a7b3d8b4bce18cd42682ea1ec164
|
||||||
|
ZWk38w/message: 0a6b07963240d329f206e280282e36da
|
||||||
|
ZWk38w/placeholders/0/0: 9622afa3aca4038b79417d808a505c87
|
||||||
|
ZWk38w/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
ZWk38w/translation: 0a6b07963240d329f206e280282e36da
|
||||||
C6gv54/message: 1573c77059bc92df17e661befda8d9b7
|
C6gv54/message: 1573c77059bc92df17e661befda8d9b7
|
||||||
C6gv54/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
C6gv54/origin/0/0: 0ad2af981579a62b084b3d41462c5546
|
||||||
C6gv54/translation: 1573c77059bc92df17e661befda8d9b7
|
C6gv54/translation: 1573c77059bc92df17e661befda8d9b7
|
||||||
@@ -2644,6 +2673,9 @@ checksums:
|
|||||||
Oo4E6p/origin/0/0: 97bd206a05414e2a571020d64e166093
|
Oo4E6p/origin/0/0: 97bd206a05414e2a571020d64e166093
|
||||||
Oo4E6p/origin/1/0: 1b05beba6bdd908015fa8e798717f024
|
Oo4E6p/origin/1/0: 1b05beba6bdd908015fa8e798717f024
|
||||||
Oo4E6p/translation: af985cf72c47df76e2f2139a427d9948
|
Oo4E6p/translation: af985cf72c47df76e2f2139a427d9948
|
||||||
|
d196%2F6/message: 64c37452b5ff985b44f1347ce0ef659f
|
||||||
|
d196%2F6/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
d196%2F6/translation: 64c37452b5ff985b44f1347ce0ef659f
|
||||||
K7k9u3/message: 1cf9d227042f6a65adba38cb7296830d
|
K7k9u3/message: 1cf9d227042f6a65adba38cb7296830d
|
||||||
K7k9u3/origin/0/0: fd0e66cef8d46e96bcf3143a12f9b6db
|
K7k9u3/origin/0/0: fd0e66cef8d46e96bcf3143a12f9b6db
|
||||||
K7k9u3/translation: 1cf9d227042f6a65adba38cb7296830d
|
K7k9u3/translation: 1cf9d227042f6a65adba38cb7296830d
|
||||||
@@ -3030,6 +3062,9 @@ checksums:
|
|||||||
vAj6xG/message: a6152a41b2d8f64d5a657e5b8bc808a9
|
vAj6xG/message: a6152a41b2d8f64d5a657e5b8bc808a9
|
||||||
vAj6xG/origin/0/0: 4980d8e27a628e7cd9a70b839d844083
|
vAj6xG/origin/0/0: 4980d8e27a628e7cd9a70b839d844083
|
||||||
vAj6xG/translation: a6152a41b2d8f64d5a657e5b8bc808a9
|
vAj6xG/translation: a6152a41b2d8f64d5a657e5b8bc808a9
|
||||||
|
tUL16u/message: 9064ca54e8a3ad28c03a173bc7b01184
|
||||||
|
tUL16u/origin/0/0: f8e87f3fc3dc63bc7961601feb860fa8
|
||||||
|
tUL16u/translation: 9064ca54e8a3ad28c03a173bc7b01184
|
||||||
h2FKMV/message: 11d928b1993d95d54a95f85f8ae5016d
|
h2FKMV/message: 11d928b1993d95d54a95f85f8ae5016d
|
||||||
h2FKMV/origin/0/0: 6812b79a8fdc3527586b523d4c137340
|
h2FKMV/origin/0/0: 6812b79a8fdc3527586b523d4c137340
|
||||||
h2FKMV/origin/1/0: 85d0a3237fa9329fba3f0278a2cd7284
|
h2FKMV/origin/1/0: 85d0a3237fa9329fba3f0278a2cd7284
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { formatter } from "@lingui/format-json";
|
|||||||
|
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR"],
|
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR", "zh-CN"],
|
||||||
sourceLocale: "en",
|
sourceLocale: "en",
|
||||||
catalogs: [
|
catalogs: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,13 +27,13 @@
|
|||||||
"@kan/api": "workspace:*",
|
"@kan/api": "workspace:*",
|
||||||
"@kan/auth": "workspace:*",
|
"@kan/auth": "workspace:*",
|
||||||
"@kan/db": "workspace:^",
|
"@kan/db": "workspace:^",
|
||||||
|
"@kan/email": "workspace:^",
|
||||||
"@kan/logger": "workspace:^",
|
"@kan/logger": "workspace:^",
|
||||||
"@kan/shared": "workspace:^",
|
"@kan/shared": "workspace:^",
|
||||||
"@lingui/babel-preset-react": "^2.9.2",
|
"@lingui/babel-preset-react": "^2.9.2",
|
||||||
"@lingui/conf": "^5.3.2",
|
"@lingui/conf": "^5.3.2",
|
||||||
"@lingui/macro": "^5.3.2",
|
"@lingui/macro": "^5.3.2",
|
||||||
"@lingui/react": "^5.3.2",
|
"@lingui/react": "^5.3.2",
|
||||||
"@novu/api": "^3.11.0",
|
|
||||||
"@t3-oss/env-nextjs": "^0.11.1",
|
"@t3-oss/env-nextjs": "^0.11.1",
|
||||||
"@tailwindcss/typography": "^0.5.16",
|
"@tailwindcss/typography": "^0.5.16",
|
||||||
"@tanstack/react-query": "catalog:",
|
"@tanstack/react-query": "catalog:",
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { t } from "@lingui/core/macro";
|
|||||||
import Link from "@tiptap/extension-link";
|
import Link from "@tiptap/extension-link";
|
||||||
import Mention from "@tiptap/extension-mention";
|
import Mention from "@tiptap/extension-mention";
|
||||||
import Placeholder from "@tiptap/extension-placeholder";
|
import Placeholder from "@tiptap/extension-placeholder";
|
||||||
|
import Typography from "@tiptap/extension-typography";
|
||||||
import {
|
import {
|
||||||
BubbleMenu,
|
BubbleMenu,
|
||||||
EditorContent,
|
EditorContent,
|
||||||
@@ -17,7 +18,6 @@ import {
|
|||||||
ReactRenderer,
|
ReactRenderer,
|
||||||
useEditor,
|
useEditor,
|
||||||
} from "@tiptap/react";
|
} from "@tiptap/react";
|
||||||
import Typography from "@tiptap/extension-typography";
|
|
||||||
import StarterKit from "@tiptap/starter-kit";
|
import StarterKit from "@tiptap/starter-kit";
|
||||||
import Suggestion from "@tiptap/suggestion";
|
import Suggestion from "@tiptap/suggestion";
|
||||||
import {
|
import {
|
||||||
@@ -180,13 +180,13 @@ const RenderSuggestions = () => {
|
|||||||
|
|
||||||
if (!props.clientRect) return;
|
if (!props.clientRect) return;
|
||||||
|
|
||||||
popup[0]?.setProps({
|
popup?.[0]?.setProps({
|
||||||
getReferenceClientRect: props.clientRect,
|
getReferenceClientRect: props.clientRect,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
onKeyDown(props: SuggestionKeyDownProps): boolean {
|
onKeyDown(props: SuggestionKeyDownProps): boolean {
|
||||||
if (props.event.key === "Escape") {
|
if (props.event.key === "Escape") {
|
||||||
popup[0]?.hide();
|
popup?.[0]?.hide();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +199,7 @@ const RenderSuggestions = () => {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
onExit() {
|
onExit() {
|
||||||
popup[0]?.destroy();
|
popup?.[0]?.destroy();
|
||||||
reactRenderer.destroy();
|
reactRenderer.destroy();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -308,11 +308,11 @@ const renderMentionSuggestions = () => {
|
|||||||
onUpdate(props: any) {
|
onUpdate(props: any) {
|
||||||
reactRenderer.updateProps(props);
|
reactRenderer.updateProps(props);
|
||||||
if (!props.clientRect) return;
|
if (!props.clientRect) return;
|
||||||
popup[0]?.setProps({ getReferenceClientRect: props.clientRect });
|
popup?.[0]?.setProps({ getReferenceClientRect: props.clientRect });
|
||||||
},
|
},
|
||||||
onKeyDown(props: SuggestionKeyDownProps) {
|
onKeyDown(props: SuggestionKeyDownProps) {
|
||||||
if (props.event.key === "Escape") {
|
if (props.event.key === "Escape") {
|
||||||
popup[0]?.hide();
|
popup?.[0]?.hide();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
@@ -324,7 +324,7 @@ const renderMentionSuggestions = () => {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
onExit() {
|
onExit() {
|
||||||
popup[0]?.destroy();
|
popup?.[0]?.destroy();
|
||||||
reactRenderer.destroy();
|
reactRenderer.destroy();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -440,6 +440,7 @@ export default function Editor({
|
|||||||
content,
|
content,
|
||||||
onChange,
|
onChange,
|
||||||
onBlur,
|
onBlur,
|
||||||
|
onSubmit,
|
||||||
readOnly = false,
|
readOnly = false,
|
||||||
workspaceMembers,
|
workspaceMembers,
|
||||||
enableYouTubeEmbed = true,
|
enableYouTubeEmbed = true,
|
||||||
@@ -449,6 +450,7 @@ export default function Editor({
|
|||||||
content: string | null;
|
content: string | null;
|
||||||
onChange?: (value: string) => void;
|
onChange?: (value: string) => void;
|
||||||
onBlur?: () => void;
|
onBlur?: () => void;
|
||||||
|
onSubmit?: () => void;
|
||||||
readOnly?: boolean;
|
readOnly?: boolean;
|
||||||
workspaceMembers: WorkspaceMember[];
|
workspaceMembers: WorkspaceMember[];
|
||||||
enableYouTubeEmbed?: boolean;
|
enableYouTubeEmbed?: boolean;
|
||||||
@@ -457,6 +459,21 @@ export default function Editor({
|
|||||||
}) {
|
}) {
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
// useEditor is created once (empty deps below), so keep the latest callbacks
|
||||||
|
// in refs to avoid the editor capturing stale closures on re-render.
|
||||||
|
const onChangeRef = useRef(onChange);
|
||||||
|
const onBlurRef = useRef(onBlur);
|
||||||
|
const onSubmitRef = useRef(onSubmit);
|
||||||
|
useEffect(() => {
|
||||||
|
onChangeRef.current = onChange;
|
||||||
|
}, [onChange]);
|
||||||
|
useEffect(() => {
|
||||||
|
onBlurRef.current = onBlur;
|
||||||
|
}, [onBlur]);
|
||||||
|
useEffect(() => {
|
||||||
|
onSubmitRef.current = onSubmit;
|
||||||
|
}, [onSubmit]);
|
||||||
|
|
||||||
const editor = useEditor(
|
const editor = useEditor(
|
||||||
{
|
{
|
||||||
extensions: [
|
extensions: [
|
||||||
@@ -478,8 +495,8 @@ export default function Editor({
|
|||||||
Placeholder.configure({
|
Placeholder.configure({
|
||||||
placeholder: readOnly
|
placeholder: readOnly
|
||||||
? ""
|
? ""
|
||||||
: placeholder ??
|
: (placeholder ??
|
||||||
t`Add description... (type '/' to open commands or '@' to mention)`,
|
t`Add description... (type '/' to open commands or '@' to mention)`),
|
||||||
}),
|
}),
|
||||||
SlashCommands.configure({
|
SlashCommands.configure({
|
||||||
commandItems: getCommandItems(disableHeadings),
|
commandItems: getCommandItems(disableHeadings),
|
||||||
@@ -497,24 +514,26 @@ export default function Editor({
|
|||||||
suggestion: {
|
suggestion: {
|
||||||
char: "@",
|
char: "@",
|
||||||
items: ({ query }: { query: string }) => {
|
items: ({ query }: { query: string }) => {
|
||||||
const withEmail = workspaceMembers.filter((member) => member.email);
|
const withEmail = workspaceMembers.filter(
|
||||||
|
(member) => member.email,
|
||||||
|
);
|
||||||
|
|
||||||
const mapped = withEmail.map((member: WorkspaceMember) => ({
|
const mapped = withEmail.map((member: WorkspaceMember) => ({
|
||||||
id: member.publicId,
|
id: member.publicId,
|
||||||
label: member?.user?.name?.trim() || member.email || "",
|
label: member?.user?.name?.trim() || member.email || "",
|
||||||
image: member?.user?.image ?? null,
|
image: member?.user?.image ?? null,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const all: MentionItem[] = mapped.filter(
|
const all: MentionItem[] = mapped.filter(
|
||||||
(item) => item.label && item.label.length > 0,
|
(item) => item.label && item.label.length > 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
const q = query.toLowerCase().trim();
|
const q = query.toLowerCase().trim();
|
||||||
|
|
||||||
if (q === "") {
|
if (q === "") {
|
||||||
return all;
|
return all;
|
||||||
}
|
}
|
||||||
|
|
||||||
const filtered = all.filter((u) =>
|
const filtered = all.filter((u) =>
|
||||||
u.label.toLowerCase().includes(q),
|
u.label.toLowerCase().includes(q),
|
||||||
);
|
);
|
||||||
@@ -540,20 +559,20 @@ export default function Editor({
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
Typography.configure({
|
Typography.configure({
|
||||||
openDoubleQuote: false,
|
openDoubleQuote: false,
|
||||||
closeDoubleQuote: false,
|
closeDoubleQuote: false,
|
||||||
openSingleQuote: false,
|
openSingleQuote: false,
|
||||||
closeSingleQuote: false,
|
closeSingleQuote: false,
|
||||||
oneHalf: false,
|
oneHalf: false,
|
||||||
oneQuarter: false,
|
oneQuarter: false,
|
||||||
threeQuarters: false,
|
threeQuarters: false,
|
||||||
superscriptTwo: false,
|
superscriptTwo: false,
|
||||||
superscriptThree: false,
|
superscriptThree: false,
|
||||||
}),
|
}),
|
||||||
...(enableYouTubeEmbed ? [YouTubeNode] : []),
|
...(enableYouTubeEmbed ? [YouTubeNode] : []),
|
||||||
],
|
],
|
||||||
content,
|
content,
|
||||||
onUpdate: ({ editor }) => onChange?.(editor.getHTML()),
|
onUpdate: ({ editor }) => onChangeRef.current?.(editor.getHTML()),
|
||||||
onBlur: ({ event }) => {
|
onBlur: ({ event }) => {
|
||||||
if (
|
if (
|
||||||
document
|
document
|
||||||
@@ -563,13 +582,20 @@ export default function Editor({
|
|||||||
return;
|
return;
|
||||||
// Only trigger onBlur if the click was outside both the editor and menu
|
// Only trigger onBlur if the click was outside both the editor and menu
|
||||||
if (!containerRef.current?.contains(event.relatedTarget as Node)) {
|
if (!containerRef.current?.contains(event.relatedTarget as Node)) {
|
||||||
onBlur?.();
|
onBlurRef.current?.();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
editorProps: {
|
editorProps: {
|
||||||
attributes: {
|
attributes: {
|
||||||
class: "outline-none focus:outline-none focus-visible:ring-0",
|
class: "outline-none focus:outline-none focus-visible:ring-0",
|
||||||
},
|
},
|
||||||
|
handleKeyDown: (_view, event) => {
|
||||||
|
if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
|
||||||
|
onSubmitRef.current?.();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
editable: !readOnly,
|
editable: !readOnly,
|
||||||
injectCSS: false,
|
injectCSS: false,
|
||||||
@@ -587,6 +613,16 @@ export default function Editor({
|
|||||||
}
|
}
|
||||||
}, [content, editor]);
|
}, [content, editor]);
|
||||||
|
|
||||||
|
// useEditor captures `readOnly` once at creation time (empty deps above), so
|
||||||
|
// explicitly sync `editable` when the prop changes. Without this the editor
|
||||||
|
// gets stuck read-only when `readOnly` flips from true to false after mount
|
||||||
|
// (e.g. card permissions resolving slower than the card data on first load).
|
||||||
|
useEffect(() => {
|
||||||
|
if (!editor) return;
|
||||||
|
if (editor.isEditable === !readOnly) return;
|
||||||
|
editor.setEditable(!readOnly);
|
||||||
|
}, [editor, readOnly]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={containerRef}>
|
<div ref={containerRef}>
|
||||||
<style jsx global>{`
|
<style jsx global>{`
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Button } from "@headlessui/react";
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
import { useTheme } from "next-themes";
|
import { useTheme } from "next-themes";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import { HiBolt } from "react-icons/hi2";
|
import { HiBolt } from "react-icons/hi2";
|
||||||
import {
|
import {
|
||||||
TbLayoutSidebarLeftCollapse,
|
TbLayoutSidebarLeftCollapse,
|
||||||
@@ -28,6 +28,7 @@ import ButtonComponent from "~/components/Button";
|
|||||||
import ReactiveButton from "~/components/ReactiveButton";
|
import ReactiveButton from "~/components/ReactiveButton";
|
||||||
import UserMenu from "~/components/UserMenu";
|
import UserMenu from "~/components/UserMenu";
|
||||||
import WorkspaceMenu from "~/components/WorkspaceMenu";
|
import WorkspaceMenu from "~/components/WorkspaceMenu";
|
||||||
|
import { useLinguiContext } from "~/providers/lingui";
|
||||||
import { useWorkspace } from "~/providers/workspace";
|
import { useWorkspace } from "~/providers/workspace";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
|
|
||||||
@@ -50,6 +51,7 @@ export default function SideNavigation({
|
|||||||
}: SideNavigationProps) {
|
}: SideNavigationProps) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
|
const { locale } = useLinguiContext();
|
||||||
const [isCollapsed, setIsCollapsed] = useState(false);
|
const [isCollapsed, setIsCollapsed] = useState(false);
|
||||||
const [isInitialised, setIsInitialised] = useState(false);
|
const [isInitialised, setIsInitialised] = useState(false);
|
||||||
|
|
||||||
@@ -92,56 +94,59 @@ export default function SideNavigation({
|
|||||||
href: string;
|
href: string;
|
||||||
icon: object;
|
icon: object;
|
||||||
keyboardShortcut: KeyboardShortcut;
|
keyboardShortcut: KeyboardShortcut;
|
||||||
}[] = [
|
}[] = useMemo(
|
||||||
{
|
() => [
|
||||||
name: t`Boards`,
|
{
|
||||||
href: "/boards",
|
name: t`Boards`,
|
||||||
icon: isDarkMode ? boardsIconDark : boardsIconLight,
|
href: "/boards",
|
||||||
keyboardShortcut: {
|
icon: isDarkMode ? boardsIconDark : boardsIconLight,
|
||||||
type: "SEQUENCE",
|
keyboardShortcut: {
|
||||||
strokes: [{ key: "G" }, { key: "B" }],
|
type: "SEQUENCE",
|
||||||
action: () => router.push("/boards"),
|
strokes: [{ key: "G" }, { key: "B" }],
|
||||||
group: "NAVIGATION",
|
action: () => router.push("/boards"),
|
||||||
description: t`Go to boards`,
|
group: "NAVIGATION",
|
||||||
|
description: t`Go to boards`,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
{
|
name: t`Templates`,
|
||||||
name: t`Templates`,
|
href: "/templates",
|
||||||
href: "/templates",
|
icon: isDarkMode ? templatesIconDark : templatesIconLight,
|
||||||
icon: isDarkMode ? templatesIconDark : templatesIconLight,
|
keyboardShortcut: {
|
||||||
keyboardShortcut: {
|
type: "SEQUENCE",
|
||||||
type: "SEQUENCE",
|
strokes: [{ key: "G" }, { key: "T" }],
|
||||||
strokes: [{ key: "G" }, { key: "T" }],
|
action: () => router.push("/templates"),
|
||||||
action: () => router.push("/templates"),
|
group: "NAVIGATION",
|
||||||
group: "NAVIGATION",
|
description: t`Go to templates`,
|
||||||
description: t`Go to templates`,
|
},
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
{
|
name: t`Members`,
|
||||||
name: t`Members`,
|
href: "/members",
|
||||||
href: "/members",
|
icon: isDarkMode ? membersIconDark : membersIconLight,
|
||||||
icon: isDarkMode ? membersIconDark : membersIconLight,
|
keyboardShortcut: {
|
||||||
keyboardShortcut: {
|
type: "SEQUENCE",
|
||||||
type: "SEQUENCE",
|
strokes: [{ key: "G" }, { key: "M" }],
|
||||||
strokes: [{ key: "G" }, { key: "M" }],
|
action: () => router.push("/members"),
|
||||||
action: () => router.push("/members"),
|
group: "NAVIGATION",
|
||||||
group: "NAVIGATION",
|
description: t`Go to members`,
|
||||||
description: t`Go to members`,
|
},
|
||||||
},
|
},
|
||||||
},
|
{
|
||||||
{
|
name: t`Settings`,
|
||||||
name: t`Settings`,
|
href: "/settings",
|
||||||
href: "/settings",
|
icon: isDarkMode ? settingsIconDark : settingsIconLight,
|
||||||
icon: isDarkMode ? settingsIconDark : settingsIconLight,
|
keyboardShortcut: {
|
||||||
keyboardShortcut: {
|
type: "SEQUENCE",
|
||||||
type: "SEQUENCE",
|
strokes: [{ key: "G" }, { key: "S" }],
|
||||||
strokes: [{ key: "G" }, { key: "S" }],
|
action: () => router.push("/settings"),
|
||||||
action: () => router.push("/settings"),
|
group: "NAVIGATION",
|
||||||
group: "NAVIGATION",
|
description: t`Go to settings`,
|
||||||
description: t`Go to settings`,
|
},
|
||||||
},
|
},
|
||||||
},
|
],
|
||||||
];
|
[isDarkMode, locale, router],
|
||||||
|
);
|
||||||
|
|
||||||
const toggleCollapse = () => {
|
const toggleCollapse = () => {
|
||||||
setIsCollapsed(!isCollapsed);
|
setIsCollapsed(!isCollapsed);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
import type { Root } from "react-dom/client";
|
import type { Root } from "react-dom/client";
|
||||||
import type { Placement } from "tippy.js";
|
import type { Placement, Instance as TippyInstance } from "tippy.js";
|
||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef } from "react";
|
||||||
import { createRoot } from "react-dom/client";
|
import { createRoot } from "react-dom/client";
|
||||||
import tippy from "tippy.js";
|
import tippy from "tippy.js";
|
||||||
@@ -20,16 +20,16 @@ export function Tooltip({
|
|||||||
}: TooltipProps) {
|
}: TooltipProps) {
|
||||||
const triggerRef = useRef<HTMLDivElement>(null);
|
const triggerRef = useRef<HTMLDivElement>(null);
|
||||||
const rootRef = useRef<Root | null>(null);
|
const rootRef = useRef<Root | null>(null);
|
||||||
|
const tippyRef = useRef<TippyInstance | null>(null);
|
||||||
|
const contentRef = useRef(content);
|
||||||
|
contentRef.current = content;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!triggerRef.current) return;
|
if (!triggerRef.current) return;
|
||||||
|
|
||||||
if (!content) return;
|
|
||||||
|
|
||||||
const container = document.createElement("div");
|
const container = document.createElement("div");
|
||||||
const root = createRoot(container);
|
const root = createRoot(container);
|
||||||
rootRef.current = root;
|
rootRef.current = root;
|
||||||
root.render(content);
|
|
||||||
|
|
||||||
const instance = tippy(triggerRef.current, {
|
const instance = tippy(triggerRef.current, {
|
||||||
content: container,
|
content: container,
|
||||||
@@ -39,12 +39,33 @@ export function Tooltip({
|
|||||||
theme: "tooltip",
|
theme: "tooltip",
|
||||||
touch: false,
|
touch: false,
|
||||||
});
|
});
|
||||||
|
tippyRef.current = instance;
|
||||||
|
|
||||||
|
if (contentRef.current) {
|
||||||
|
root.render(contentRef.current);
|
||||||
|
} else {
|
||||||
|
instance.disable();
|
||||||
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
instance.destroy();
|
instance.destroy();
|
||||||
rootRef.current?.unmount();
|
tippyRef.current = null;
|
||||||
|
root.unmount();
|
||||||
|
rootRef.current = null;
|
||||||
};
|
};
|
||||||
}, [content, placement, delay]);
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [placement, delay]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!content) {
|
||||||
|
tippyRef.current?.disable();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (tippyRef.current) {
|
||||||
|
tippyRef.current.enable();
|
||||||
|
rootRef.current?.render(content);
|
||||||
|
}
|
||||||
|
}, [content]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={triggerRef} className="inline-flex">
|
<div ref={triggerRef} className="inline-flex">
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import { useRouter } from "next/navigation";
|
|||||||
import { Button, Menu, Transition } from "@headlessui/react";
|
import { Button, Menu, Transition } from "@headlessui/react";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
import { Fragment, useState } from "react";
|
import { Fragment, useMemo, useState } from "react";
|
||||||
import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2";
|
import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
import { useKeyboardShortcut } from "~/providers/keyboard-shortcuts";
|
import { useKeyboardShortcut } from "~/providers/keyboard-shortcuts";
|
||||||
|
import { useLinguiContext } from "~/providers/lingui";
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
import { useWorkspace } from "~/providers/workspace";
|
import { useWorkspace } from "~/providers/workspace";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
@@ -20,23 +21,29 @@ export default function WorkspaceMenu({
|
|||||||
}) {
|
}) {
|
||||||
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
|
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
|
||||||
useWorkspace();
|
useWorkspace();
|
||||||
|
const { locale } = useLinguiContext();
|
||||||
const { openModal } = useModal();
|
const { openModal } = useModal();
|
||||||
const { data: hasPartnerSlot } =
|
const { data: hasPartnerSlot } =
|
||||||
api.workspace.hasAvailablePartnerSlot.useQuery();
|
api.workspace.hasAvailablePartnerSlot.useQuery();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
|
|
||||||
const { tooltipContent: commandPaletteShortcutTooltipContent } =
|
const commandPaletteShortcut = useMemo(
|
||||||
useKeyboardShortcut({
|
() => ({
|
||||||
type: "PRESS",
|
type: "PRESS" as const,
|
||||||
stroke: {
|
stroke: {
|
||||||
key: "k",
|
key: "k",
|
||||||
modifiers: ["META"],
|
modifiers: ["META"] as ("META" | "CONTROL" | "ALT" | "SHIFT")[],
|
||||||
},
|
},
|
||||||
action: () => setIsOpen(true),
|
action: () => setIsOpen(true),
|
||||||
description: t`Open command menu`,
|
description: t`Open command menu`,
|
||||||
group: "GENERAL",
|
group: "GENERAL" as const,
|
||||||
});
|
}),
|
||||||
|
[locale],
|
||||||
|
);
|
||||||
|
|
||||||
|
const { tooltipContent: commandPaletteShortcutTooltipContent } =
|
||||||
|
useKeyboardShortcut(commandPaletteShortcut);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -52,8 +52,9 @@ export const env = createEnv({
|
|||||||
VK_CLIENT_SECRET: z.string().optional(),
|
VK_CLIENT_SECRET: z.string().optional(),
|
||||||
LINKEDIN_CLIENT_ID: z.string().optional(),
|
LINKEDIN_CLIENT_ID: z.string().optional(),
|
||||||
LINKEDIN_CLIENT_SECRET: z.string().optional(),
|
LINKEDIN_CLIENT_SECRET: z.string().optional(),
|
||||||
NOVU_API_KEY: z.string().optional(),
|
SUBSCRIBER_API_URL: z.string().url().optional(),
|
||||||
EMAIL_UNSUBSCRIBE_SECRET: z.string().optional(),
|
SUBSCRIBER_API_KEY: z.string().optional(),
|
||||||
|
SUBSCRIBER_ENVIRONMENT_ID: z.string().optional(),
|
||||||
// Generic OIDC Provider
|
// Generic OIDC Provider
|
||||||
OIDC_CLIENT_ID: z.string().optional(),
|
OIDC_CLIENT_ID: z.string().optional(),
|
||||||
OIDC_CLIENT_SECRET: z.string().optional(),
|
OIDC_CLIENT_SECRET: z.string().optional(),
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import type { Locale as DateFnsLocale } from "date-fns";
|
import type { Locale as DateFnsLocale } from "date-fns";
|
||||||
import { useLingui } from "@lingui/react";
|
import { useLingui } from "@lingui/react";
|
||||||
import { de, enGB, es, fr, it, nl, pl, ptBR, ru } from "date-fns/locale";
|
import { de, enGB, es, fr, it, nl, pl, ptBR, ru, zhCN } from "date-fns/locale";
|
||||||
|
|
||||||
import type { Locale } from "~/locales";
|
import type { Locale } from "~/locales";
|
||||||
import { useLinguiContext } from "~/providers/lingui";
|
import { useLinguiContext } from "~/providers/lingui";
|
||||||
@@ -20,6 +20,7 @@ export function useLocalisation() {
|
|||||||
ru,
|
ru,
|
||||||
pl,
|
pl,
|
||||||
ptbr: ptBR,
|
ptbr: ptBR,
|
||||||
|
"zh-CN": zhCN,
|
||||||
};
|
};
|
||||||
|
|
||||||
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useEffect } from "react";
|
import { useCallback, useEffect, useRef } from "react";
|
||||||
|
|
||||||
import { useModal } from "~/providers/modal";
|
import { useModal } from "~/providers/modal";
|
||||||
|
|
||||||
interface UseModalFormStateOptions<T> {
|
interface UseModalFormStateOptions<T> {
|
||||||
@@ -12,25 +13,43 @@ export function useModalFormState<T extends Record<string, any>>({
|
|||||||
initialValues,
|
initialValues,
|
||||||
resetOnClose = false,
|
resetOnClose = false,
|
||||||
}: UseModalFormStateOptions<T>) {
|
}: UseModalFormStateOptions<T>) {
|
||||||
const { modalContentType, isOpen, getModalState, setModalState, clearModalState } = useModal();
|
const {
|
||||||
|
modalContentType,
|
||||||
|
isOpen,
|
||||||
|
getModalState,
|
||||||
|
setModalState,
|
||||||
|
clearModalState,
|
||||||
|
} = useModal();
|
||||||
|
|
||||||
const isCurrentModal = modalContentType === modalType;
|
const isCurrentModal = modalContentType === modalType;
|
||||||
const savedState = getModalState(modalType) as T | undefined;
|
const savedState = getModalState(modalType) as T | undefined;
|
||||||
|
|
||||||
// get current form state (using the saved values if available, otherwise the initial values)
|
// get current form state (using the saved values if available, otherwise the initial values)
|
||||||
const formState = savedState || initialValues;
|
const formState = savedState || initialValues;
|
||||||
|
|
||||||
const saveFormState = (state: Partial<T>) => {
|
// Keep refs so the callbacks below stay stable across re-renders.
|
||||||
if (!isCurrentModal) return;
|
const modalTypeRef = useRef(modalType);
|
||||||
|
const initialValuesRef = useRef(initialValues);
|
||||||
const currentState = getModalState(modalType) || initialValues;
|
const getModalStateRef = useRef(getModalState);
|
||||||
const newState = { ...currentState, ...state };
|
modalTypeRef.current = modalType;
|
||||||
setModalState(modalType, newState);
|
initialValuesRef.current = initialValues;
|
||||||
};
|
getModalStateRef.current = getModalState;
|
||||||
|
|
||||||
const clearFormState = () => {
|
const saveFormState = useCallback(
|
||||||
clearModalState(modalType);
|
(state: Partial<T>) => {
|
||||||
};
|
const type = modalTypeRef.current;
|
||||||
|
const currentState =
|
||||||
|
getModalStateRef.current(type) ?? initialValuesRef.current;
|
||||||
|
const newState = { ...currentState, ...state };
|
||||||
|
setModalState(type, newState);
|
||||||
|
},
|
||||||
|
// setModalState is stable (useCallback with [] deps in ModalProvider)
|
||||||
|
[setModalState],
|
||||||
|
);
|
||||||
|
|
||||||
|
const clearFormState = useCallback(() => {
|
||||||
|
clearModalState(modalTypeRef.current);
|
||||||
|
}, [clearModalState]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (resetOnClose && !isOpen && savedState) {
|
if (resetOnClose && !isOpen && savedState) {
|
||||||
@@ -45,4 +64,4 @@ export function useModalFormState<T extends Record<string, any>>({
|
|||||||
isCurrentModal,
|
isCurrentModal,
|
||||||
hasSavedState: !!savedState,
|
hasSavedState: !!savedState,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} wurde zu deinen Favoriten hinzugefügt."
|
"translation": "{0} wurde zu deinen Favoriten hinzugefügt."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} wurde aus deinen Favoriten entfernt."
|
"translation": "{0} wurde aus deinen Favoriten entfernt."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} nicht gefunden"
|
"translation": "{0} nicht gefunden"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Kommentar hinzufügen... (‚/' für Befehle oder ‚@' zum Erwähnen eingeben)"
|
"translation": "Kommentar hinzufügen... (‚/' für Befehle oder ‚@' zum Erwähnen eingeben)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Beschreibung hinzufügen... (‚/' für Befehle oder ‚@' zum Erwähnen eingeben)"
|
"translation": "Beschreibung hinzufügen... (‚/' für Befehle oder ‚@' zum Erwähnen eingeben)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Zu Favoriten hinzufügen"
|
"translation": "Zu Favoriten hinzufügen"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Zu Favoriten hinzugefügt"
|
"translation": "Zu Favoriten hinzugefügt"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Jährlich"
|
"translation": "Jährlich"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Board archivieren"
|
"translation": "Board archivieren"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Archiviert"
|
"translation": "Archiviert"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Ideal für kleine Teams, die gemeinsam arbeiten und schneller vorankommen möchten."
|
"translation": "Ideal für kleine Teams, die gemeinsam arbeiten und schneller vorankommen möchten."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Board archiviert"
|
"translation": "Board archiviert"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Board verschoben"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Board wiederhergestellt"
|
"translation": "Board wiederhergestellt"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Boards"
|
"translation": "Boards"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Karte erfolgreich dupliziert."
|
"translation": "Karte erfolgreich dupliziert."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "Kartenmitgliederzuweisungen werden beim Verschieben in einen anderen Workspace gelöscht."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Tarif wählen"
|
"translation": "Tarif wählen"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Bestätigen Sie Ihre E-Mail-Einstellungen:"
|
"translation": "Bestätigen Sie Ihre E-Mail-Einstellungen:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Weiter"
|
"translation": "Weiter"
|
||||||
@@ -1873,9 +1889,9 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Neue {0} erstellen"
|
"translation": "Neues {0} erstellen"
|
||||||
},
|
},
|
||||||
"okpxfB": {
|
"okpxfB": {
|
||||||
"message": "Create new key",
|
"message": "Create new key",
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Neue Liste erstellen"
|
"translation": "Neue Liste erstellen"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Workspace erstellen"
|
"translation": "Workspace erstellen"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Board löschen"
|
"translation": "Board löschen"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Vorlage löschen"
|
"translation": "Vorlage löschen"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Design"
|
"translation": "Design"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Ziel-Workspace"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Möchten Sie das Abonnement kündigen?"
|
"translation": "Möchten Sie das Abonnement kündigen?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Board-URL bearbeiten"
|
"translation": "Board-URL bearbeiten"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Legen Sie los, indem Sie eine neue Liste erstellen"
|
"translation": "Legen Sie los, indem Sie eine neue Liste erstellen"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Zu den Boards"
|
"translation": "Zu den Boards"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Zu den Mitgliedern"
|
"translation": "Zu den Mitgliedern"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Zu den Einstellungen"
|
"translation": "Zu den Einstellungen"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Zu Vorlagen gehen"
|
"translation": "Zu Vorlagen gehen"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Gut geeignet für Einsteiger, die nur die wichtigsten Funktionen benötigen."
|
"translation": "Gut geeignet für Einsteiger, die nur die wichtigsten Funktionen benötigen."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importieren"
|
"translation": "Importieren"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Vorlage erstellen"
|
"translation": "Vorlage erstellen"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "Monatliche Abrechnung"
|
"translation": "Monatliche Abrechnung"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Board verschieben"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Board in einen anderen Workspace verschieben"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "In Liste verschieben"
|
"translation": "In Liste verschieben"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "In Workspace verschieben"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Neu"
|
"translation": "Neu"
|
||||||
@@ -4059,7 +4104,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/components/NewBoardForm.tsx", 120]],
|
"origin": [["src/views/boards/components/NewBoardForm.tsx", 120]],
|
||||||
"translation": "Neue {0}"
|
"translation": "Neues {0}"
|
||||||
},
|
},
|
||||||
"TjREUS": {
|
"TjREUS": {
|
||||||
"message": "New API key",
|
"message": "New API key",
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Neue Liste"
|
"translation": "Neue Liste"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Keine Listen"
|
"translation": "Keine Listen"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Es wurden noch keine Listen erstellt"
|
"translation": "Es wurden noch keine Listen erstellt"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Wählen Sie einen Tarif, um loszulegen. Alle kostenpflichtigen Tarife beinhalten eine 14-tägige kostenlose Testphase."
|
"translation": "Wählen Sie einen Tarif, um loszulegen. Alle kostenpflichtigen Tarife beinhalten eine 14-tägige kostenlose Testphase."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Aus Favoriten entfernen"
|
"translation": "Aus Favoriten entfernen"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Aus Favoriten entfernt"
|
"translation": "Aus Favoriten entfernt"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Liste auswählen"
|
"translation": "Liste auswählen"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Workspace auswählen"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Einstellungen"
|
"translation": "Einstellungen"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Abmelden"
|
"translation": "Abmelden"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Solo"
|
"translation": "Solo"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Kostenlose Testversion starten"
|
"translation": "Kostenlose Testversion starten"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Status"
|
"translation": "Status"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Absenden"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Team"
|
"translation": "Team"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Vorlage"
|
"translation": "Vorlage"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Vorlagen"
|
"translation": "Vorlagen"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "Das Board wurde archiviert."
|
"translation": "Das Board wurde archiviert."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "Das Board wurde nach {0} verschoben."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "Das Board wurde wiederhergestellt."
|
"translation": "Das Board wurde wiederhergestellt."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Kommentar konnte nicht hinzugefügt werden"
|
"translation": "Kommentar konnte nicht hinzugefügt werden"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Karte konnte nicht dupliziert werden"
|
"translation": "Karte konnte nicht dupliziert werden"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Board konnte nicht verschoben werden"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Board konnte nicht aktualisiert werden"
|
"translation": "Board konnte nicht aktualisiert werden"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Karte konnte nicht aktualisiert werden"
|
"translation": "Karte konnte nicht aktualisiert werden"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Liste konnte nicht aktualisiert werden"
|
"translation": "Liste konnte nicht aktualisiert werden"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Board wiederherstellen"
|
"translation": "Board wiederherstellen"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Unbegrenzte Mitglieder und ein individueller Workspace-Benutzername für Teams, die wachsen möchten."
|
"translation": "Unbegrenzte Mitglieder und ein individueller Workspace-Benutzername für Teams, die wachsen möchten."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Abmelden"
|
"translation": "Abmelden",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Upgrade"
|
"translation": "Upgrade"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "Wir konnten Ihre Einstellungen nicht aktualisieren. Bitte versuchen Sie es erneut."
|
"translation": "Wir konnten Ihre Einstellungen nicht aktualisieren. Bitte versuchen Sie es erneut.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Sie können selbst hosten, indem Sie den Anweisungen in unserem <0>Repo</0> folgen."
|
"translation": "Sie können selbst hosten, indem Sie den Anweisungen in unserem <0>Repo</0> folgen."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "Sie haben keine anderen Workspaces, in die Sie dieses Board verschieben können."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "Sie haben keine Berechtigung"
|
"translation": "Sie haben keine Berechtigung"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Sie wurden abgemeldet!"
|
"translation": "Sie wurden abgemeldet!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Ihr Avatar"
|
"translation": "Ihr Avatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Ihrem Abmelde-Link fehlt ein Token. Bitte öffnen Sie die neueste E-Mail und versuchen Sie es erneut."
|
"translation": "Ihrem Abmelde-Link fehlt ein Token. Bitte öffnen Sie die neueste E-Mail und versuchen Sie es erneut.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
@@ -7429,4 +7515,4 @@
|
|||||||
"origin": [["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 147]],
|
"origin": [["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 147]],
|
||||||
"translation": "YouTube-URL"
|
"translation": "YouTube-URL"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} se ha añadido a tus favoritos."
|
"translation": "{0} se ha añadido a tus favoritos."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} se ha eliminado de tus favoritos."
|
"translation": "{0} se ha eliminado de tus favoritos."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} no encontrado"
|
"translation": "{0} no encontrado"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Añadir comentario... (escribe '/' para abrir comandos o '@' para mencionar)"
|
"translation": "Añadir comentario... (escribe '/' para abrir comandos o '@' para mencionar)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Añadir descripción... (escribe '/' para abrir comandos o '@' para mencionar)"
|
"translation": "Añadir descripción... (escribe '/' para abrir comandos o '@' para mencionar)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Añadir a favoritos"
|
"translation": "Añadir a favoritos"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Añadido a favoritos"
|
"translation": "Añadido a favoritos"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Anual"
|
"translation": "Anual"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Archivar tablero"
|
"translation": "Archivar tablero"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Archivado"
|
"translation": "Archivado"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Ideal para equipos pequeños que desean colaborar y avanzar más rápido juntos."
|
"translation": "Ideal para equipos pequeños que desean colaborar y avanzar más rápido juntos."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Tablero archivado"
|
"translation": "Tablero archivado"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Tablero movido"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Tablero desarchivado"
|
"translation": "Tablero desarchivado"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Tableros"
|
"translation": "Tableros"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Tarjeta duplicada correctamente."
|
"translation": "Tarjeta duplicada correctamente."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "Las asignaciones de miembros de la tarjeta se borrarán al mover a un espacio de trabajo diferente."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Elige un plan"
|
"translation": "Elige un plan"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Confirma tus preferencias de correo electrónico:"
|
"translation": "Confirma tus preferencias de correo electrónico:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Continuar"
|
"translation": "Continuar"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Crear nuevo {0}"
|
"translation": "Crear nuevo {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Crear nueva lista"
|
"translation": "Crear nueva lista"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Crear espacio de trabajo"
|
"translation": "Crear espacio de trabajo"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Eliminar tablero"
|
"translation": "Eliminar tablero"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Eliminar plantilla"
|
"translation": "Eliminar plantilla"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Diseño"
|
"translation": "Diseño"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Espacio de trabajo de destino"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "¿Quieres cancelar la suscripción?"
|
"translation": "¿Quieres cancelar la suscripción?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Editar URL del tablero"
|
"translation": "Editar URL del tablero"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Comienza creando una nueva lista"
|
"translation": "Comienza creando una nueva lista"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Ir a tableros"
|
"translation": "Ir a tableros"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Ir a miembros"
|
"translation": "Ir a miembros"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Ir a configuración"
|
"translation": "Ir a configuración"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Ir a plantillas"
|
"translation": "Ir a plantillas"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Ideal para personas que comienzan y solo necesitan lo esencial."
|
"translation": "Ideal para personas que comienzan y solo necesitan lo esencial."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importar"
|
"translation": "Importar"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Crear plantilla"
|
"translation": "Crear plantilla"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "facturación mensual"
|
"translation": "facturación mensual"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Mover tablero"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Mover tablero a otro espacio de trabajo"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Mover a lista"
|
"translation": "Mover a lista"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Mover al espacio de trabajo"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Nuevo"
|
"translation": "Nuevo"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Nueva lista"
|
"translation": "Nueva lista"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Sin listas"
|
"translation": "Sin listas"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Aún no se han creado listas"
|
"translation": "Aún no se han creado listas"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Elige un plan para comenzar. Todos los planes de pago incluyen una prueba gratuita de 14 días."
|
"translation": "Elige un plan para comenzar. Todos los planes de pago incluyen una prueba gratuita de 14 días."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Eliminar de favoritos"
|
"translation": "Eliminar de favoritos"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Eliminado de favoritos"
|
"translation": "Eliminado de favoritos"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Seleccionar una lista"
|
"translation": "Seleccionar una lista"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Selecciona un espacio de trabajo"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Configuración"
|
"translation": "Configuración"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Cerrar sesión"
|
"translation": "Cerrar sesión"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Individual"
|
"translation": "Individual"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Iniciar prueba gratuita"
|
"translation": "Iniciar prueba gratuita"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Estado"
|
"translation": "Estado"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Enviar"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Equipo"
|
"translation": "Equipo"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Plantilla"
|
"translation": "Plantilla"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Plantillas"
|
"translation": "Plantillas"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "El tablero ha sido archivado."
|
"translation": "El tablero ha sido archivado."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "El tablero se ha movido a {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "El tablero ha sido desarchivado."
|
"translation": "El tablero ha sido desarchivado."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "No se pudo agregar el comentario"
|
"translation": "No se pudo agregar el comentario"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "No se puede duplicar la tarjeta"
|
"translation": "No se puede duplicar la tarjeta"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "No se pudo mover el tablero"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "No se pudo actualizar el tablero"
|
"translation": "No se pudo actualizar el tablero"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "No se pudo actualizar la tarjeta"
|
"translation": "No se pudo actualizar la tarjeta"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "No se pudo actualizar la lista"
|
"translation": "No se pudo actualizar la lista"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Desarchivar tablero"
|
"translation": "Desarchivar tablero"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Miembros ilimitados y un nombre de usuario personalizado para el espacio de trabajo para equipos listos para escalar."
|
"translation": "Miembros ilimitados y un nombre de usuario personalizado para el espacio de trabajo para equipos listos para escalar."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Cancelar suscripción"
|
"translation": "Cancelar suscripción",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Actualizar"
|
"translation": "Actualizar"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "No pudimos actualizar tus preferencias. Por favor, inténtalo de nuevo."
|
"translation": "No pudimos actualizar tus preferencias. Por favor, inténtalo de nuevo.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Puedes auto-alojar siguiendo las instrucciones en nuestro <0>repositorio</0>."
|
"translation": "Puedes auto-alojar siguiendo las instrucciones en nuestro <0>repositorio</0>."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "No tienes ningún otro espacio de trabajo al que mover este tablero."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "No tienes permiso"
|
"translation": "No tienes permiso"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "¡Te has dado de baja!"
|
"translation": "¡Te has dado de baja!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Tu avatar"
|
"translation": "Tu avatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Tu enlace de cancelación de suscripción no tiene un token. Por favor, abre el último correo electrónico e inténtalo de nuevo."
|
"translation": "Tu enlace de cancelación de suscripción no tiene un token. Por favor, abre el último correo electrónico e inténtalo de nuevo.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} a été ajouté à vos favoris."
|
"translation": "{0} a été ajouté à vos favoris."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} a été retiré de vos favoris."
|
"translation": "{0} a été retiré de vos favoris."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} introuvable"
|
"translation": "{0} introuvable"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Ajouter un commentaire... (tapez « / » pour ouvrir les commandes ou « @ » pour mentionner)"
|
"translation": "Ajouter un commentaire... (tapez « / » pour ouvrir les commandes ou « @ » pour mentionner)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Ajouter une description... (tapez « / » pour ouvrir les commandes ou « @ » pour mentionner)"
|
"translation": "Ajouter une description... (tapez « / » pour ouvrir les commandes ou « @ » pour mentionner)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Ajouter aux favoris"
|
"translation": "Ajouter aux favoris"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Ajouté aux favoris"
|
"translation": "Ajouté aux favoris"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Annuel"
|
"translation": "Annuel"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Archiver le tableau"
|
"translation": "Archiver le tableau"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Archivé"
|
"translation": "Archivé"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Idéal pour les petites équipes qui souhaitent collaborer et avancer plus rapidement ensemble."
|
"translation": "Idéal pour les petites équipes qui souhaitent collaborer et avancer plus rapidement ensemble."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Tableau archivé"
|
"translation": "Tableau archivé"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Tableau déplacé"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Tableau désarchivé"
|
"translation": "Tableau désarchivé"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Tableaux"
|
"translation": "Tableaux"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Carte dupliquée avec succès."
|
"translation": "Carte dupliquée avec succès."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "Les membres affectés aux cartes seront supprimés lors du déplacement vers un autre espace de travail."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Choisir un forfait"
|
"translation": "Choisir un forfait"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Confirmez vos préférences d'e-mail :"
|
"translation": "Confirmez vos préférences d'e-mail :",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Continuer"
|
"translation": "Continuer"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Créer un nouveau {0}"
|
"translation": "Créer un nouveau {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Créer une nouvelle liste"
|
"translation": "Créer une nouvelle liste"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Créer un espace de travail"
|
"translation": "Créer un espace de travail"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Supprimer le tableau"
|
"translation": "Supprimer le tableau"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Supprimer le modèle"
|
"translation": "Supprimer le modèle"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Design"
|
"translation": "Design"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Espace de travail de destination"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Voulez-vous vous désabonner ?"
|
"translation": "Voulez-vous vous désabonner ?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Modifier l'URL du tableau"
|
"translation": "Modifier l'URL du tableau"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Commencez en créant une nouvelle liste"
|
"translation": "Commencez en créant une nouvelle liste"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Aller aux tableaux"
|
"translation": "Aller aux tableaux"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Aller aux membres"
|
"translation": "Aller aux membres"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Aller aux paramètres"
|
"translation": "Aller aux paramètres"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Aller aux modèles"
|
"translation": "Aller aux modèles"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Idéal pour les particuliers qui débutent et qui ont simplement besoin de l'essentiel."
|
"translation": "Idéal pour les particuliers qui débutent et qui ont simplement besoin de l'essentiel."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importer"
|
"translation": "Importer"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Créer un modèle"
|
"translation": "Créer un modèle"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "facturation mensuelle"
|
"translation": "facturation mensuelle"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Déplacer le tableau"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Déplacer le tableau vers un autre espace de travail"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Déplacer vers la liste"
|
"translation": "Déplacer vers la liste"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Déplacer vers l'espace de travail"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Nouveau"
|
"translation": "Nouveau"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Nouvelle liste"
|
"translation": "Nouvelle liste"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Aucune liste"
|
"translation": "Aucune liste"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Aucune liste n'a encore été créée"
|
"translation": "Aucune liste n'a encore été créée"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Choisissez un forfait pour commencer. Tous les forfaits payants incluent un essai gratuit de 14 jours."
|
"translation": "Choisissez un forfait pour commencer. Tous les forfaits payants incluent un essai gratuit de 14 jours."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Retirer des favoris"
|
"translation": "Retirer des favoris"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Retiré des favoris"
|
"translation": "Retiré des favoris"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Sélectionner une liste"
|
"translation": "Sélectionner une liste"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Sélectionnez un espace de travail"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Paramètres"
|
"translation": "Paramètres"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Se déconnecter"
|
"translation": "Se déconnecter"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Solo"
|
"translation": "Solo"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Commencer l'essai gratuit"
|
"translation": "Commencer l'essai gratuit"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Statut"
|
"translation": "Statut"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Soumettre"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Équipe"
|
"translation": "Équipe"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Modèle"
|
"translation": "Modèle"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Modèles"
|
"translation": "Modèles"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "Le tableau a été archivé."
|
"translation": "Le tableau a été archivé."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "Le tableau a été déplacé vers {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "Le tableau a été désarchivé."
|
"translation": "Le tableau a été désarchivé."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Impossible d'ajouter le commentaire"
|
"translation": "Impossible d'ajouter le commentaire"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Impossible de dupliquer la carte"
|
"translation": "Impossible de dupliquer la carte"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Impossible de déplacer le tableau"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Impossible de mettre à jour le tableau"
|
"translation": "Impossible de mettre à jour le tableau"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Impossible de mettre à jour la carte"
|
"translation": "Impossible de mettre à jour la carte"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Impossible de mettre à jour la liste"
|
"translation": "Impossible de mettre à jour la liste"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Désarchiver le tableau"
|
"translation": "Désarchiver le tableau"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Membres illimités et un nom d'utilisateur d'espace de travail personnalisé pour les équipes prêtes à évoluer."
|
"translation": "Membres illimités et un nom d'utilisateur d'espace de travail personnalisé pour les équipes prêtes à évoluer."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Se désabonner"
|
"translation": "Se désabonner",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Mettre à niveau"
|
"translation": "Mettre à niveau"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "Nous n'avons pas pu mettre à jour vos préférences. Veuillez réessayer."
|
"translation": "Nous n'avons pas pu mettre à jour vos préférences. Veuillez réessayer.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Vous pouvez auto-héberger en suivant les instructions de notre <0>dépôt</0>."
|
"translation": "Vous pouvez auto-héberger en suivant les instructions de notre <0>dépôt</0>."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "Vous n'avez aucun autre espace de travail vers lequel déplacer ce tableau."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "Vous n'avez pas la permission"
|
"translation": "Vous n'avez pas la permission"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Vous avez été désabonné !"
|
"translation": "Vous avez été désabonné !",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Votre avatar"
|
"translation": "Votre avatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Votre lien de désinscription ne contient pas de jeton. Veuillez ouvrir le dernier e-mail et réessayer."
|
"translation": "Votre lien de désinscription ne contient pas de jeton. Veuillez ouvrir le dernier e-mail et réessayer.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -7,12 +7,14 @@ export const locales = [
|
|||||||
"nl",
|
"nl",
|
||||||
"ru",
|
"ru",
|
||||||
"pl",
|
"pl",
|
||||||
"ptbr"
|
"ptbr",
|
||||||
|
"zh-CN",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type Locale = (typeof locales)[number];
|
export type Locale = (typeof locales)[number];
|
||||||
|
|
||||||
export const defaultLocale: Locale = "en";
|
// 自托管实例默认使用简体中文,用户仍可在设置中切换其他语言。
|
||||||
|
export const defaultLocale: Locale = "zh-CN";
|
||||||
|
|
||||||
export const localeNames: Record<Locale, string> = {
|
export const localeNames: Record<Locale, string> = {
|
||||||
en: "English",
|
en: "English",
|
||||||
@@ -24,4 +26,5 @@ export const localeNames: Record<Locale, string> = {
|
|||||||
ru: "Русский",
|
ru: "Русский",
|
||||||
pl: "Polski",
|
pl: "Polski",
|
||||||
ptbr: "Português",
|
ptbr: "Português",
|
||||||
|
"zh-CN": "简体中文",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} è stato aggiunto ai tuoi preferiti."
|
"translation": "{0} è stato aggiunto ai tuoi preferiti."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} è stato rimosso dai tuoi preferiti."
|
"translation": "{0} è stato rimosso dai tuoi preferiti."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} non trovato"
|
"translation": "{0} non trovato"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Aggiungi commento... (digita '/' per aprire i comandi o '@' per menzionare)"
|
"translation": "Aggiungi commento... (digita '/' per aprire i comandi o '@' per menzionare)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Aggiungi descrizione... (digita '/' per aprire i comandi o '@' per menzionare)"
|
"translation": "Aggiungi descrizione... (digita '/' per aprire i comandi o '@' per menzionare)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Aggiungi ai preferiti"
|
"translation": "Aggiungi ai preferiti"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Aggiunto ai preferiti"
|
"translation": "Aggiunto ai preferiti"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Annuale"
|
"translation": "Annuale"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Archivia bacheca"
|
"translation": "Archivia bacheca"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Archiviato"
|
"translation": "Archiviato"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Ideale per piccoli team che vogliono collaborare e muoversi più velocemente insieme."
|
"translation": "Ideale per piccoli team che vogliono collaborare e muoversi più velocemente insieme."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Bacheca archiviata"
|
"translation": "Bacheca archiviata"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Bacheca spostata"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Bacheca ripristinata"
|
"translation": "Bacheca ripristinata"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Board"
|
"translation": "Board"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Scheda duplicata con successo."
|
"translation": "Scheda duplicata con successo."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "Le assegnazioni dei membri della scheda verranno cancellate quando si sposta in un'area di lavoro diversa."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Scegli un piano"
|
"translation": "Scegli un piano"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Conferma le tue preferenze email:"
|
"translation": "Conferma le tue preferenze email:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Continua"
|
"translation": "Continua"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Crea nuovo {0}"
|
"translation": "Crea nuovo {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Crea nuova lista"
|
"translation": "Crea nuova lista"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Crea workspace"
|
"translation": "Crea workspace"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Elimina board"
|
"translation": "Elimina board"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Elimina template"
|
"translation": "Elimina template"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Design"
|
"translation": "Design"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Area di lavoro di destinazione"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Vuoi annullare l'iscrizione?"
|
"translation": "Vuoi annullare l'iscrizione?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Modifica URL bacheca"
|
"translation": "Modifica URL bacheca"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Inizia creando una nuova lista"
|
"translation": "Inizia creando una nuova lista"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Vai alle bacheche"
|
"translation": "Vai alle bacheche"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Vai ai membri"
|
"translation": "Vai ai membri"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Vai alle impostazioni"
|
"translation": "Vai alle impostazioni"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Vai ai modelli"
|
"translation": "Vai ai modelli"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Perfetto per chi inizia e ha bisogno solo delle funzionalità essenziali."
|
"translation": "Perfetto per chi inizia e ha bisogno solo delle funzionalità essenziali."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importa"
|
"translation": "Importa"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Crea template"
|
"translation": "Crea template"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "fatturazione mensile"
|
"translation": "fatturazione mensile"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Sposta bacheca"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Sposta la bacheca in un'altra area di lavoro"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Sposta nell'elenco"
|
"translation": "Sposta nell'elenco"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Sposta nell'area di lavoro"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Nuovo"
|
"translation": "Nuovo"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Nuova lista"
|
"translation": "Nuova lista"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Nessuna lista"
|
"translation": "Nessuna lista"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Nessuna lista è stata ancora creata"
|
"translation": "Nessuna lista è stata ancora creata"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Scegli un piano per iniziare. Tutti i piani a pagamento includono una prova gratuita di 14 giorni."
|
"translation": "Scegli un piano per iniziare. Tutti i piani a pagamento includono una prova gratuita di 14 giorni."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Rimuovi dai preferiti"
|
"translation": "Rimuovi dai preferiti"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Rimosso dai preferiti"
|
"translation": "Rimosso dai preferiti"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Seleziona un elenco"
|
"translation": "Seleziona un elenco"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Seleziona un'area di lavoro"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Impostazioni"
|
"translation": "Impostazioni"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Esci"
|
"translation": "Esci"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Solo"
|
"translation": "Solo"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Inizia prova gratuita"
|
"translation": "Inizia prova gratuita"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Stato"
|
"translation": "Stato"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Invia"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Team"
|
"translation": "Team"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Template"
|
"translation": "Template"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Template"
|
"translation": "Template"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "La bacheca è stata archiviata."
|
"translation": "La bacheca è stata archiviata."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "La bacheca è stata spostata in {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "La bacheca è stata ripristinata."
|
"translation": "La bacheca è stata ripristinata."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Impossibile aggiungere il commento"
|
"translation": "Impossibile aggiungere il commento"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Impossibile duplicare la scheda"
|
"translation": "Impossibile duplicare la scheda"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Impossibile spostare la bacheca"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Impossibile aggiornare la board"
|
"translation": "Impossibile aggiornare la board"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Impossibile aggiornare la card"
|
"translation": "Impossibile aggiornare la card"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Impossibile aggiornare la lista"
|
"translation": "Impossibile aggiornare la lista"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Ripristina bacheca"
|
"translation": "Ripristina bacheca"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Membri illimitati e un nome utente workspace personalizzato per i team pronti a crescere."
|
"translation": "Membri illimitati e un nome utente workspace personalizzato per i team pronti a crescere."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Annulla iscrizione"
|
"translation": "Annulla iscrizione",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Aggiorna"
|
"translation": "Aggiorna"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "Non è stato possibile aggiornare le tue preferenze. Riprova."
|
"translation": "Non è stato possibile aggiornare le tue preferenze. Riprova.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Puoi effettuare il self-hosting seguendo le istruzioni nel nostro <0>repo</0>."
|
"translation": "Puoi effettuare il self-hosting seguendo le istruzioni nel nostro <0>repo</0>."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "Non hai altre aree di lavoro in cui spostare questa bacheca."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "Non hai i permessi necessari"
|
"translation": "Non hai i permessi necessari"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Hai annullato l'iscrizione!"
|
"translation": "Hai annullato l'iscrizione!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Il tuo avatar"
|
"translation": "Il tuo avatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Il tuo link di disiscrizione non contiene un token. Apri l'ultima email e riprova."
|
"translation": "Il tuo link di disiscrizione non contiene un token. Apri l'ultima email e riprova.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} is toegevoegd aan je favorieten."
|
"translation": "{0} is toegevoegd aan je favorieten."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} is verwijderd uit je favorieten."
|
"translation": "{0} is verwijderd uit je favorieten."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} niet gevonden"
|
"translation": "{0} niet gevonden"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Voeg opmerking toe... (typ '/' om commando's te openen of '@' om te vermelden)"
|
"translation": "Voeg opmerking toe... (typ '/' om commando's te openen of '@' om te vermelden)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Voeg beschrijving toe... (typ '/' om commando's te openen of '@' om te vermelden)"
|
"translation": "Voeg beschrijving toe... (typ '/' om commando's te openen of '@' om te vermelden)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Toevoegen aan favorieten"
|
"translation": "Toevoegen aan favorieten"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Toegevoegd aan favorieten"
|
"translation": "Toegevoegd aan favorieten"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Jaarlijks"
|
"translation": "Jaarlijks"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Board archiveren"
|
"translation": "Board archiveren"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Gearchiveerd"
|
"translation": "Gearchiveerd"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Het beste voor kleine teams die willen samenwerken en sneller vooruit willen komen."
|
"translation": "Het beste voor kleine teams die willen samenwerken en sneller vooruit willen komen."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Board gearchiveerd"
|
"translation": "Board gearchiveerd"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Bord verplaatst"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Board gedearchiveerd"
|
"translation": "Board gedearchiveerd"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Boards"
|
"translation": "Boards"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Kaart succesvol gedupliceerd."
|
"translation": "Kaart succesvol gedupliceerd."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "Kaartleden worden verwijderd bij het verplaatsen naar een andere werkruimte."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Kies een abonnement"
|
"translation": "Kies een abonnement"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Bevestig je e-mailvoorkeuren:"
|
"translation": "Bevestig je e-mailvoorkeuren:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Doorgaan"
|
"translation": "Doorgaan"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Maak nieuwe {0}"
|
"translation": "Maak nieuwe {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Maak nieuwe lijst"
|
"translation": "Maak nieuwe lijst"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Maak werkruimte"
|
"translation": "Maak werkruimte"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Bord verwijderen"
|
"translation": "Bord verwijderen"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Sjabloon verwijderen"
|
"translation": "Sjabloon verwijderen"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Ontwerp"
|
"translation": "Ontwerp"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Bestemmingswerkruimte"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Wil je je uitschrijven?"
|
"translation": "Wil je je uitschrijven?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Bord-URL bewerken"
|
"translation": "Bord-URL bewerken"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Ga aan de slag door een nieuwe lijst te maken"
|
"translation": "Ga aan de slag door een nieuwe lijst te maken"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Ga naar borden"
|
"translation": "Ga naar borden"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Ga naar leden"
|
"translation": "Ga naar leden"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Ga naar instellingen"
|
"translation": "Ga naar instellingen"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Ga naar sjablonen"
|
"translation": "Ga naar sjablonen"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Geschikt voor individuen die net beginnen en alleen de basisbehoeften hebben."
|
"translation": "Geschikt voor individuen die net beginnen en alleen de basisbehoeften hebben."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importeren"
|
"translation": "Importeren"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Sjabloon maken"
|
"translation": "Sjabloon maken"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "maandelijkse facturering"
|
"translation": "maandelijkse facturering"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Bord verplaatsen"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Bord naar een andere werkruimte verplaatsen"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Verplaats naar lijst"
|
"translation": "Verplaats naar lijst"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Verplaatsen naar werkruimte"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Nieuw"
|
"translation": "Nieuw"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Nieuwe lijst"
|
"translation": "Nieuwe lijst"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Geen lijsten"
|
"translation": "Geen lijsten"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Er zijn nog geen lijsten aangemaakt"
|
"translation": "Er zijn nog geen lijsten aangemaakt"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Kies een abonnement om te beginnen. Alle betaalde abonnementen hebben een gratis proefperiode van 14 dagen."
|
"translation": "Kies een abonnement om te beginnen. Alle betaalde abonnementen hebben een gratis proefperiode van 14 dagen."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Verwijderen uit favorieten"
|
"translation": "Verwijderen uit favorieten"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Verwijderd uit favorieten"
|
"translation": "Verwijderd uit favorieten"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Selecteer een lijst"
|
"translation": "Selecteer een lijst"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Selecteer een werkruimte"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Instellingen"
|
"translation": "Instellingen"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Uitloggen"
|
"translation": "Uitloggen"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Solo"
|
"translation": "Solo"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Start gratis proefperiode"
|
"translation": "Start gratis proefperiode"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Status"
|
"translation": "Status"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Verzenden"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Team"
|
"translation": "Team"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Sjabloon"
|
"translation": "Sjabloon"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Sjablonen"
|
"translation": "Sjablonen"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "Het board is gearchiveerd."
|
"translation": "Het board is gearchiveerd."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "Het bord is verplaatst naar {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "Het board is gedearchiveerd."
|
"translation": "Het board is gedearchiveerd."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Kan opmerking niet toevoegen"
|
"translation": "Kan opmerking niet toevoegen"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Kan kaart niet dupliceren"
|
"translation": "Kan kaart niet dupliceren"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Kan bord niet verplaatsen"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Kan bord niet bijwerken"
|
"translation": "Kan bord niet bijwerken"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Kan kaart niet bijwerken"
|
"translation": "Kan kaart niet bijwerken"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Kan lijst niet bijwerken"
|
"translation": "Kan lijst niet bijwerken"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Board dearchiveren"
|
"translation": "Board dearchiveren"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Onbeperkt aantal leden en een aangepaste werkruimte-URL voor teams die klaar zijn om te groeien."
|
"translation": "Onbeperkt aantal leden en een aangepaste werkruimte-URL voor teams die klaar zijn om te groeien."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Uitschrijven"
|
"translation": "Uitschrijven",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Upgraden"
|
"translation": "Upgraden"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "We konden je voorkeuren niet bijwerken. Probeer het opnieuw."
|
"translation": "We konden je voorkeuren niet bijwerken. Probeer het opnieuw.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Je kunt zelf hosten door de instructies in onze <0>repo</0> te volgen."
|
"translation": "Je kunt zelf hosten door de instructies in onze <0>repo</0> te volgen."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "Je hebt geen andere werkruimtes waar je dit bord naartoe kunt verplaatsen."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "Je hebt geen toestemming"
|
"translation": "Je hebt geen toestemming"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Je bent uitgeschreven!"
|
"translation": "Je bent uitgeschreven!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Jouw avatar"
|
"translation": "Jouw avatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Je afmeldlink mist een token. Open de nieuwste e-mail en probeer het opnieuw."
|
"translation": "Je afmeldlink mist een token. Open de nieuwste e-mail en probeer het opnieuw.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} został dodany do ulubionych."
|
"translation": "{0} został dodany do ulubionych."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} został usunięty z ulubionych."
|
"translation": "{0} został usunięty z ulubionych."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} nie znaleziono"
|
"translation": "{0} nie znaleziono"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Dodaj komentarz... (wpisz '/' aby otworzyć polecenia lub '@', aby wspomnieć)"
|
"translation": "Dodaj komentarz... (wpisz '/' aby otworzyć polecenia lub '@', aby wspomnieć)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Dodaj opis... (wpisz '/' aby otworzyć polecenia lub '@', aby wspomnieć)"
|
"translation": "Dodaj opis... (wpisz '/' aby otworzyć polecenia lub '@', aby wspomnieć)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Dodaj do ulubionych"
|
"translation": "Dodaj do ulubionych"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Dodano do ulubionych"
|
"translation": "Dodano do ulubionych"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Rocznie"
|
"translation": "Rocznie"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Zarchiwizuj tablicę"
|
"translation": "Zarchiwizuj tablicę"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Zarchiwizowana"
|
"translation": "Zarchiwizowana"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Najlepszy dla małych zespołów, które chcą współpracować i działać szybciej razem."
|
"translation": "Najlepszy dla małych zespołów, które chcą współpracować i działać szybciej razem."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Tablica zarchiwizowana"
|
"translation": "Tablica zarchiwizowana"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Tablica przeniesiona"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Tablica przywrócona z archiwum"
|
"translation": "Tablica przywrócona z archiwum"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Tablice"
|
"translation": "Tablice"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Karta została pomyślnie zduplikowana."
|
"translation": "Karta została pomyślnie zduplikowana."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "Przypisania członków do kart zostaną usunięte podczas przenoszenia do innego obszaru roboczego."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Wybierz plan"
|
"translation": "Wybierz plan"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Potwierdź swoje preferencje dotyczące e-maili:"
|
"translation": "Potwierdź swoje preferencje dotyczące e-maili:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Kontynuuj"
|
"translation": "Kontynuuj"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Utwórz nową {0}"
|
"translation": "Utwórz nową {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Utwórz nową listę"
|
"translation": "Utwórz nową listę"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Utwórz workspace"
|
"translation": "Utwórz workspace"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Usuń tablicę"
|
"translation": "Usuń tablicę"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Usuń szablon"
|
"translation": "Usuń szablon"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Design"
|
"translation": "Design"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Docelowy obszar roboczy"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Czy chcesz zrezygnować z subskrypcji?"
|
"translation": "Czy chcesz zrezygnować z subskrypcji?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Edytuj URL tablicy"
|
"translation": "Edytuj URL tablicy"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Rozpocznij, tworząc nową listę"
|
"translation": "Rozpocznij, tworząc nową listę"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Przejdź do tablic"
|
"translation": "Przejdź do tablic"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Przejdź do członków"
|
"translation": "Przejdź do członków"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Przejdź do ustawień"
|
"translation": "Przejdź do ustawień"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Przejdź do szablonów"
|
"translation": "Przejdź do szablonów"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Dobry dla osób zaczynających, które potrzebują tylko podstaw."
|
"translation": "Dobry dla osób zaczynających, które potrzebują tylko podstaw."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importuj"
|
"translation": "Importuj"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Utwórz szablon"
|
"translation": "Utwórz szablon"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "rozliczenie miesięczne"
|
"translation": "rozliczenie miesięczne"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Przenieś tablicę"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Przenieś tablicę do innego obszaru roboczego"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Przenieś do listy"
|
"translation": "Przenieś do listy"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Przenieś do obszaru roboczego"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Nowy"
|
"translation": "Nowy"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Nowa lista"
|
"translation": "Nowa lista"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Brak list"
|
"translation": "Brak list"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Nie utworzono jeszcze żadnych list"
|
"translation": "Nie utworzono jeszcze żadnych list"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Wybierz plan, aby rozpocząć. Wszystkie płatne plany zawierają 14-dniowy bezpłatny okres próbny."
|
"translation": "Wybierz plan, aby rozpocząć. Wszystkie płatne plany zawierają 14-dniowy bezpłatny okres próbny."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Usuń z ulubionych"
|
"translation": "Usuń z ulubionych"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Usunięto z ulubionych"
|
"translation": "Usunięto z ulubionych"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Wybierz listę"
|
"translation": "Wybierz listę"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Wybierz obszar roboczy"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Ustawienia"
|
"translation": "Ustawienia"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Wyloguj się"
|
"translation": "Wyloguj się"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Solo"
|
"translation": "Solo"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Rozpocznij bezpłatny okres próbny"
|
"translation": "Rozpocznij bezpłatny okres próbny"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Status"
|
"translation": "Status"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Prześlij"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Zespół"
|
"translation": "Zespół"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Szablon"
|
"translation": "Szablon"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Szablony"
|
"translation": "Szablony"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "Tablica została zarchiwizowana."
|
"translation": "Tablica została zarchiwizowana."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "Tablica została przeniesiona do {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "Tablica została przywrócona z archiwum."
|
"translation": "Tablica została przywrócona z archiwum."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Nie można dodać komentarza"
|
"translation": "Nie można dodać komentarza"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Nie można zduplikować karty"
|
"translation": "Nie można zduplikować karty"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Nie można przenieść tablicy"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Nie można zaktualizować tablicy"
|
"translation": "Nie można zaktualizować tablicy"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Nie można zaktualizować karty"
|
"translation": "Nie można zaktualizować karty"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Nie można zaktualizować listy"
|
"translation": "Nie można zaktualizować listy"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Przywróć tablicę z archiwum"
|
"translation": "Przywróć tablicę z archiwum"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Nieograniczona liczba członków i niestandardowa nazwa użytkownika przestrzeni roboczej dla zespołów gotowych do rozwoju."
|
"translation": "Nieograniczona liczba członków i niestandardowa nazwa użytkownika przestrzeni roboczej dla zespołów gotowych do rozwoju."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Anuluj subskrypcję"
|
"translation": "Anuluj subskrypcję",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Uaktualnij"
|
"translation": "Uaktualnij"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "Nie udało się zaktualizować Twoich preferencji. Spróbuj ponownie."
|
"translation": "Nie udało się zaktualizować Twoich preferencji. Spróbuj ponownie.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Możesz samodzielnie hostować, postępując zgodnie z instrukcjami w naszym <0>repozytorium</0>."
|
"translation": "Możesz samodzielnie hostować, postępując zgodnie z instrukcjami w naszym <0>repozytorium</0>."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "Nie masz żadnych innych obszarów roboczych, do których można przenieść tę tablicę."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "Nie masz uprawnień"
|
"translation": "Nie masz uprawnień"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Zostałeś wypisany z subskrypcji!"
|
"translation": "Zostałeś wypisany z subskrypcji!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Twój awatar"
|
"translation": "Twój awatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Twój link do wypisania się nie zawiera tokena. Otwórz najnowszy e-mail i spróbuj ponownie."
|
"translation": "Twój link do wypisania się nie zawiera tokena. Otwórz najnowszy e-mail i spróbuj ponownie.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} foi adicionado aos seus favoritos."
|
"translation": "{0} foi adicionado aos seus favoritos."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} foi removido dos seus favoritos."
|
"translation": "{0} foi removido dos seus favoritos."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} não encontrado"
|
"translation": "{0} não encontrado"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Adicionar comentário... (digite '/' para abrir comandos ou '@' para mencionar)"
|
"translation": "Adicionar comentário... (digite '/' para abrir comandos ou '@' para mencionar)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Adicionar descrição... (digite '/' para abrir comandos ou '@' para mencionar)"
|
"translation": "Adicionar descrição... (digite '/' para abrir comandos ou '@' para mencionar)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Adicionar aos favoritos"
|
"translation": "Adicionar aos favoritos"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Adicionado aos favoritos"
|
"translation": "Adicionado aos favoritos"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Anual"
|
"translation": "Anual"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Arquivar quadro"
|
"translation": "Arquivar quadro"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "Arquivado"
|
"translation": "Arquivado"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Ideal para pequenas equipes que desejam colaborar e avançar mais rápido juntas."
|
"translation": "Ideal para pequenas equipes que desejam colaborar e avançar mais rápido juntas."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Quadro arquivado"
|
"translation": "Quadro arquivado"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Quadro movido"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Quadro desarquivado"
|
"translation": "Quadro desarquivado"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Quadros"
|
"translation": "Quadros"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Card duplicado com sucesso."
|
"translation": "Card duplicado com sucesso."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "As atribuições de membros do cartão serão removidas ao mover para um workspace diferente."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Escolha um plano"
|
"translation": "Escolha um plano"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Confirme suas preferências de e-mail:"
|
"translation": "Confirme suas preferências de e-mail:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Continuar"
|
"translation": "Continuar"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Criar novo {0}"
|
"translation": "Criar novo {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Criar nova lista"
|
"translation": "Criar nova lista"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Criar workspace"
|
"translation": "Criar workspace"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Excluir quadro"
|
"translation": "Excluir quadro"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Excluir modelo"
|
"translation": "Excluir modelo"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Design"
|
"translation": "Design"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Workspace de destino"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Você deseja cancelar a assinatura?"
|
"translation": "Você deseja cancelar a assinatura?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Editar URL do quadro"
|
"translation": "Editar URL do quadro"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Comece criando uma nova lista"
|
"translation": "Comece criando uma nova lista"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Ir para quadros"
|
"translation": "Ir para quadros"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Ir para membros"
|
"translation": "Ir para membros"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Ir para configurações"
|
"translation": "Ir para configurações"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Ir para modelos"
|
"translation": "Ir para modelos"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Bom para indivíduos começando que precisam apenas do essencial."
|
"translation": "Bom para indivíduos começando que precisam apenas do essencial."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Importar"
|
"translation": "Importar"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Criar modelo"
|
"translation": "Criar modelo"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "cobrança mensal"
|
"translation": "cobrança mensal"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Mover quadro"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Mover quadro para outro workspace"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Mover para lista"
|
"translation": "Mover para lista"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Mover para workspace"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Novo"
|
"translation": "Novo"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Nova lista"
|
"translation": "Nova lista"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Nenhuma lista"
|
"translation": "Nenhuma lista"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Nenhuma lista foi criada ainda"
|
"translation": "Nenhuma lista foi criada ainda"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Escolha um plano para começar. Todos os planos pagos incluem 14 dias de teste grátis."
|
"translation": "Escolha um plano para começar. Todos os planos pagos incluem 14 dias de teste grátis."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Remover dos favoritos"
|
"translation": "Remover dos favoritos"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Removido dos favoritos"
|
"translation": "Removido dos favoritos"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Selecione uma lista"
|
"translation": "Selecione uma lista"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Selecione um workspace"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Configurações"
|
"translation": "Configurações"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Sair"
|
"translation": "Sair"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Solo"
|
"translation": "Solo"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Iniciar teste gratuito"
|
"translation": "Iniciar teste gratuito"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Status"
|
"translation": "Status"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Enviar"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Equipe"
|
"translation": "Equipe"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Modelo"
|
"translation": "Modelo"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Templates"
|
"translation": "Templates"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "O quadro foi arquivado."
|
"translation": "O quadro foi arquivado."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "O quadro foi movido para {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "O quadro foi desarquivado."
|
"translation": "O quadro foi desarquivado."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Não foi possível adicionar comentário"
|
"translation": "Não foi possível adicionar comentário"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Não foi possível duplicar o cartão"
|
"translation": "Não foi possível duplicar o cartão"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Não foi possível mover o quadro"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Não foi possível atualizar o quadro"
|
"translation": "Não foi possível atualizar o quadro"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Não foi possível atualizar o cartão"
|
"translation": "Não foi possível atualizar o cartão"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Não foi possível atualizar a lista"
|
"translation": "Não foi possível atualizar a lista"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Desarquivar quadro"
|
"translation": "Desarquivar quadro"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Membros ilimitados e um nome de usuário personalizado para equipes prontas para crescer."
|
"translation": "Membros ilimitados e um nome de usuário personalizado para equipes prontas para crescer."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Cancelar inscrição"
|
"translation": "Cancelar inscrição",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Atualizar"
|
"translation": "Atualizar"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "Não foi possível atualizar suas preferências. Tente novamente."
|
"translation": "Não foi possível atualizar suas preferências. Tente novamente.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Você pode fazer self-host seguindo as instruções em nosso <0>repositório</0>."
|
"translation": "Você pode fazer self-host seguindo as instruções em nosso <0>repositório</0>."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "Você não tem outros workspaces para mover este quadro."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "Você não tem permissão"
|
"translation": "Você não tem permissão"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Você cancelou a inscrição!"
|
"translation": "Você cancelou a inscrição!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Seu avatar"
|
"translation": "Seu avatar"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "Seu link de cancelamento de inscrição está sem um token. Por favor, abra o e-mail mais recente e tente novamente."
|
"translation": "Seu link de cancelamento de inscrição está sem um token. Por favor, abra o e-mail mais recente e tente novamente.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
|||||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 53]],
|
"origin": [["src/views/boards/index.tsx", 62]],
|
||||||
"translation": "{0}"
|
"translation": "{0}"
|
||||||
},
|
},
|
||||||
"JArWcF": {
|
"JArWcF": {
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/card/index.tsx", 321]
|
["src/views/card/index.tsx", 321]
|
||||||
],
|
],
|
||||||
"translation": "{0} | {1}"
|
"translation": "{0} | {1}"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 59]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
||||||
"translation": "{0} добавлен в избранное."
|
"translation": "{0} добавлен в избранное."
|
||||||
},
|
},
|
||||||
"bDI6VI": {
|
"bDI6VI": {
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
"0": ["boardName ?? \"Board\""]
|
"0": ["boardName ?? \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 60]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 61]],
|
||||||
"translation": "{0} удалён из избранного."
|
"translation": "{0} удалён из избранного."
|
||||||
},
|
},
|
||||||
"CJukzS": {
|
"CJukzS": {
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||||
},
|
},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 557]],
|
"origin": [["src/views/board/index.tsx", 570]],
|
||||||
"translation": "{0} не найдено"
|
"translation": "{0} не найдено"
|
||||||
},
|
},
|
||||||
"0xWkkH": {
|
"0xWkkH": {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 26],
|
["src/views/boards/index.tsx", 30],
|
||||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||||
["src/views/settings/components/WebhookList.tsx", 106]
|
["src/views/settings/components/WebhookList.tsx", 106]
|
||||||
],
|
],
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/card/components/Comment.tsx", 185],
|
["src/views/card/components/Comment.tsx", 185],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||||
],
|
],
|
||||||
"translation": "Добавить комментарий... (введите '/' для открытия команд или '@' для упоминания)"
|
"translation": "Добавить комментарий... (введите '/' для открытия команд или '@' для упоминания)"
|
||||||
},
|
},
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/Editor.tsx", 482]],
|
"origin": [["src/components/Editor.tsx", 499]],
|
||||||
"translation": "Добавить описание... (введите '/' для открытия команд или '@' для упоминания)"
|
"translation": "Добавить описание... (введите '/' для открытия команд или '@' для упоминания)"
|
||||||
},
|
},
|
||||||
"abUZlY": {
|
"abUZlY": {
|
||||||
@@ -328,7 +328,7 @@
|
|||||||
"message": "Add to favorites",
|
"message": "Add to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 125]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 137]],
|
||||||
"translation": "Добавить в избранное"
|
"translation": "Добавить в избранное"
|
||||||
},
|
},
|
||||||
"cWXW+7": {
|
"cWXW+7": {
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"message": "Added to favorites",
|
"message": "Added to favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 56]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
||||||
"translation": "Добавлено в избранное"
|
"translation": "Добавлено в избранное"
|
||||||
},
|
},
|
||||||
"14Xi3Z": {
|
"14Xi3Z": {
|
||||||
@@ -577,7 +577,7 @@
|
|||||||
"message": "Annual",
|
"message": "Annual",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||||
"translation": "Ежегодно"
|
"translation": "Ежегодно"
|
||||||
},
|
},
|
||||||
"3bqt9U": {
|
"3bqt9U": {
|
||||||
@@ -657,14 +657,14 @@
|
|||||||
"message": "Archive board",
|
"message": "Archive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Архивировать доску"
|
"translation": "Архивировать доску"
|
||||||
},
|
},
|
||||||
"TdfEV7": {
|
"TdfEV7": {
|
||||||
"message": "Archived",
|
"message": "Archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 27]],
|
"origin": [["src/views/boards/index.tsx", 31]],
|
||||||
"translation": "В архиве"
|
"translation": "В архиве"
|
||||||
},
|
},
|
||||||
"lo8xBK": {
|
"lo8xBK": {
|
||||||
@@ -833,7 +833,7 @@
|
|||||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||||
"translation": "Идеально для небольших команд, которые хотят сотрудничать и работать быстрее вместе."
|
"translation": "Идеально для небольших команд, которые хотят сотрудничать и работать быстрее вместе."
|
||||||
},
|
},
|
||||||
"qaS+1/": {
|
"qaS+1/": {
|
||||||
@@ -887,7 +887,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/card/index.tsx", 321],
|
["src/views/card/index.tsx", 321],
|
||||||
["src/views/public/board/index.tsx", 125]
|
["src/views/public/board/index.tsx", 125]
|
||||||
],
|
],
|
||||||
@@ -906,9 +906,16 @@
|
|||||||
"message": "Board archived",
|
"message": "Board archived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Доска архивирована"
|
"translation": "Доска архивирована"
|
||||||
},
|
},
|
||||||
|
"wE3hGS": {
|
||||||
|
"message": "Board moved",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 33]],
|
||||||
|
"translation": "Доска перемещена"
|
||||||
|
},
|
||||||
"wewm3j": {
|
"wewm3j": {
|
||||||
"message": "Board name cannot exceed 100 characters",
|
"message": "Board name cannot exceed 100 characters",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -943,7 +950,7 @@
|
|||||||
"message": "Board unarchived",
|
"message": "Board unarchived",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 46]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 47]],
|
||||||
"translation": "Доска восстановлена из архива"
|
"translation": "Доска восстановлена из архива"
|
||||||
},
|
},
|
||||||
"Xid3K6": {
|
"Xid3K6": {
|
||||||
@@ -999,7 +1006,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 97],
|
["src/components/SideNavigation.tsx", 98],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Доски"
|
"translation": "Доски"
|
||||||
@@ -1281,12 +1288,13 @@
|
|||||||
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
["src/components/YouTubeEmbed/EditYouTubeModal.tsx", 176],
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 267],
|
||||||
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
["src/views/board/components/DeleteBoardConfirmation.tsx", 44],
|
||||||
|
["src/views/board/components/MoveBoardForm.tsx", 99],
|
||||||
["src/views/card/components/Comment.tsx", 195],
|
["src/views/card/components/Comment.tsx", 195],
|
||||||
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
["src/views/card/components/DeleteCardConfirmation.tsx", 86],
|
||||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||||
["src/views/settings/components/Avatar.tsx", 287],
|
["src/views/settings/components/Avatar.tsx", 287],
|
||||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||||
[
|
[
|
||||||
@@ -1324,6 +1332,13 @@
|
|||||||
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
"origin": [["src/views/card/components/Dropdown.tsx", 48]],
|
||||||
"translation": "Карточка успешно продублирована."
|
"translation": "Карточка успешно продублирована."
|
||||||
},
|
},
|
||||||
|
"AgE2vR": {
|
||||||
|
"message": "Card member assignments will be cleared when moving to a different workspace.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 92]],
|
||||||
|
"translation": "При перемещении в другой рабочий пространство назначения участников карточек будут очищены."
|
||||||
|
},
|
||||||
"fEY2vP": {
|
"fEY2vP": {
|
||||||
"message": "Card not found",
|
"message": "Card not found",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -1346,7 +1361,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 308],
|
["src/views/board/index.tsx", 314],
|
||||||
["src/views/card/components/Dropdown.tsx", 74],
|
["src/views/card/components/Dropdown.tsx", 74],
|
||||||
["src/views/public/board/CardModal.tsx", 38]
|
["src/views/public/board/CardModal.tsx", 38]
|
||||||
],
|
],
|
||||||
@@ -1429,7 +1444,7 @@
|
|||||||
"message": "Choose a plan",
|
"message": "Choose a plan",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||||
"translation": "Выберите тариф"
|
"translation": "Выберите тариф"
|
||||||
},
|
},
|
||||||
"5EMoSo": {
|
"5EMoSo": {
|
||||||
@@ -1611,7 +1626,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||||
"translation": "Подтвердите ваши настройки электронной почты:"
|
"translation": "Подтвердите ваши настройки электронной почты:",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"479pdJ": {
|
"479pdJ": {
|
||||||
"message": "Confirm your new password",
|
"message": "Confirm your new password",
|
||||||
@@ -1704,7 +1720,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||||
],
|
],
|
||||||
"translation": "Продолжить"
|
"translation": "Продолжить"
|
||||||
@@ -1873,7 +1889,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/components/BoardsList.tsx", 80],
|
["src/views/boards/components/BoardsList.tsx", 80],
|
||||||
["src/views/boards/index.tsx", 41]
|
["src/views/boards/index.tsx", 45]
|
||||||
],
|
],
|
||||||
"translation": "Создать новый {0}"
|
"translation": "Создать новый {0}"
|
||||||
},
|
},
|
||||||
@@ -1899,8 +1915,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 92],
|
["src/views/board/index.tsx", 99],
|
||||||
["src/views/board/index.tsx", 671]
|
["src/views/board/index.tsx", 684]
|
||||||
],
|
],
|
||||||
"translation": "Создать новый список"
|
"translation": "Создать новый список"
|
||||||
},
|
},
|
||||||
@@ -1924,7 +1940,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/NewWorkspaceForm.tsx", 227],
|
["src/components/NewWorkspaceForm.tsx", 227],
|
||||||
["src/components/WorkspaceMenu.tsx", 171]
|
["src/components/WorkspaceMenu.tsx", 176]
|
||||||
],
|
],
|
||||||
"translation": "Создать рабочее пространство"
|
"translation": "Создать рабочее пространство"
|
||||||
},
|
},
|
||||||
@@ -2118,7 +2134,7 @@
|
|||||||
"message": "Delete board",
|
"message": "Delete board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Удалить доску"
|
"translation": "Удалить доску"
|
||||||
},
|
},
|
||||||
"nabda1": {
|
"nabda1": {
|
||||||
@@ -2149,7 +2165,7 @@
|
|||||||
"message": "Delete template",
|
"message": "Delete template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 148]],
|
||||||
"translation": "Удалить шаблон"
|
"translation": "Удалить шаблон"
|
||||||
},
|
},
|
||||||
"snMaH4": {
|
"snMaH4": {
|
||||||
@@ -2211,6 +2227,13 @@
|
|||||||
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
"origin": [["src/views/boards/components/TemplateBoards.tsx", 45]],
|
||||||
"translation": "Дизайн"
|
"translation": "Дизайн"
|
||||||
},
|
},
|
||||||
|
"Uf+1DF": {
|
||||||
|
"message": "Destination workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 76]],
|
||||||
|
"translation": "Рабочее пространство назначения"
|
||||||
|
},
|
||||||
"Odv3J6": {
|
"Odv3J6": {
|
||||||
"message": "Disconnect GitHub",
|
"message": "Disconnect GitHub",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -2272,7 +2295,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||||
"translation": "Вы хотите отписаться?"
|
"translation": "Вы хотите отписаться?",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"JyXBgS": {
|
"JyXBgS": {
|
||||||
"message": "docs",
|
"message": "docs",
|
||||||
@@ -2416,7 +2440,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/BoardDropdown.tsx", 105],
|
["src/views/board/components/BoardDropdown.tsx", 106],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 116]
|
||||||
],
|
],
|
||||||
"translation": "Изменить URL доски"
|
"translation": "Изменить URL доски"
|
||||||
@@ -2994,8 +3018,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
["src/views/pricing/components/Pricing.tsx", 32],
|
["src/views/pricing/components/Pricing.tsx", 32],
|
||||||
@@ -3103,7 +3127,7 @@
|
|||||||
"message": "Get started by creating a new list",
|
"message": "Get started by creating a new list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 656]],
|
"origin": [["src/views/board/index.tsx", 669]],
|
||||||
"translation": "Начните с создания нового списка"
|
"translation": "Начните с создания нового списка"
|
||||||
},
|
},
|
||||||
"oW13KZ": {
|
"oW13KZ": {
|
||||||
@@ -3180,7 +3204,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 105],
|
["src/components/SideNavigation.tsx", 106],
|
||||||
["src/pages/404.tsx", 44]
|
["src/pages/404.tsx", 44]
|
||||||
],
|
],
|
||||||
"translation": "Перейти к доскам"
|
"translation": "Перейти к доскам"
|
||||||
@@ -3196,28 +3220,28 @@
|
|||||||
"message": "Go to members",
|
"message": "Go to members",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||||
"translation": "Перейти к участникам"
|
"translation": "Перейти к участникам"
|
||||||
},
|
},
|
||||||
"1WuwiM": {
|
"1WuwiM": {
|
||||||
"message": "Go to settings",
|
"message": "Go to settings",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||||
"translation": "Перейти к настройкам"
|
"translation": "Перейти к настройкам"
|
||||||
},
|
},
|
||||||
"csFbe+": {
|
"csFbe+": {
|
||||||
"message": "Go to templates",
|
"message": "Go to templates",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||||
"translation": "Перейти к шаблонам"
|
"translation": "Перейти к шаблонам"
|
||||||
},
|
},
|
||||||
"SUvm1Y": {
|
"SUvm1Y": {
|
||||||
"message": "Good for individuals starting out who just need the essentials.",
|
"message": "Good for individuals starting out who just need the essentials.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||||
"translation": "Подходит для начинающих пользователей, которым нужны только базовые функции."
|
"translation": "Подходит для начинающих пользователей, которым нужны только базовые функции."
|
||||||
},
|
},
|
||||||
"cdyS7J": {
|
"cdyS7J": {
|
||||||
@@ -3360,7 +3384,7 @@
|
|||||||
"message": "Import",
|
"message": "Import",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/boards/index.tsx", 73]],
|
"origin": [["src/views/boards/index.tsx", 82]],
|
||||||
"translation": "Импорт"
|
"translation": "Импорт"
|
||||||
},
|
},
|
||||||
"2MPcep": {
|
"2MPcep": {
|
||||||
@@ -3743,7 +3767,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||||
["src/views/board/index.tsx", 306],
|
["src/views/board/index.tsx", 312],
|
||||||
["src/views/card/components/Dropdown.tsx", 72],
|
["src/views/card/components/Dropdown.tsx", 72],
|
||||||
["src/views/public/board/CardModal.tsx", 36],
|
["src/views/public/board/CardModal.tsx", 36],
|
||||||
["src/views/public/board/index.tsx", 77]
|
["src/views/public/board/index.tsx", 77]
|
||||||
@@ -3843,7 +3867,7 @@
|
|||||||
"message": "Make template",
|
"message": "Make template",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 94]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 95]],
|
||||||
"translation": "Создать шаблон"
|
"translation": "Создать шаблон"
|
||||||
},
|
},
|
||||||
"hB02vO": {
|
"hB02vO": {
|
||||||
@@ -3923,7 +3947,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 121],
|
["src/components/SideNavigation.tsx", 122],
|
||||||
["src/views/board/components/Filters.tsx", 147],
|
["src/views/board/components/Filters.tsx", 147],
|
||||||
["src/views/board/components/NewCardForm.tsx", 386],
|
["src/views/board/components/NewCardForm.tsx", 386],
|
||||||
["src/views/card/index.tsx", 143],
|
["src/views/card/index.tsx", 143],
|
||||||
@@ -3964,7 +3988,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||||
["src/views/pricing/components/Pricing.tsx", 14],
|
["src/views/pricing/components/Pricing.tsx", 14],
|
||||||
["src/views/pricing/index.tsx", 20]
|
["src/views/pricing/index.tsx", 20]
|
||||||
],
|
],
|
||||||
@@ -3977,6 +4001,20 @@
|
|||||||
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
"origin": [["src/views/members/components/InviteMemberForm.tsx", 170]],
|
||||||
"translation": "ежемесячная оплата"
|
"translation": "ежемесячная оплата"
|
||||||
},
|
},
|
||||||
|
"sZ/WDz": {
|
||||||
|
"message": "Move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 107]],
|
||||||
|
"translation": "Переместить доску"
|
||||||
|
},
|
||||||
|
"VvCMyU": {
|
||||||
|
"message": "Move board to another workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 64]],
|
||||||
|
"translation": "Переместить доску в другое рабочее пространство"
|
||||||
|
},
|
||||||
"51UCsN": {
|
"51UCsN": {
|
||||||
"message": "Move to another list",
|
"message": "Move to another list",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -3991,6 +4029,13 @@
|
|||||||
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
"origin": [["src/views/board/components/CardContextMoveListModal.tsx", 70]],
|
||||||
"translation": "Переместить в список"
|
"translation": "Переместить в список"
|
||||||
},
|
},
|
||||||
|
"S3wq2O": {
|
||||||
|
"message": "Move to workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 126]],
|
||||||
|
"translation": "Переместить в рабочее пространство"
|
||||||
|
},
|
||||||
"BOqTi5": {
|
"BOqTi5": {
|
||||||
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
"message": "moved the card from <0>{0}</0> to<1>{1}</1>",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -4047,7 +4092,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/boards/index.tsx", 95],
|
["src/views/boards/index.tsx", 104],
|
||||||
["src/views/home/components/Features.tsx", 73]
|
["src/views/home/components/Features.tsx", 73]
|
||||||
],
|
],
|
||||||
"translation": "Новый"
|
"translation": "Новый"
|
||||||
@@ -4102,7 +4147,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/NewListForm.tsx", 113],
|
["src/views/board/components/NewListForm.tsx", 113],
|
||||||
["src/views/board/index.tsx", 620]
|
["src/views/board/index.tsx", 633]
|
||||||
],
|
],
|
||||||
"translation": "Новый список"
|
"translation": "Новый список"
|
||||||
},
|
},
|
||||||
@@ -4235,14 +4280,14 @@
|
|||||||
"message": "No lists",
|
"message": "No lists",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 652]],
|
"origin": [["src/views/board/index.tsx", 665]],
|
||||||
"translation": "Нет списков"
|
"translation": "Нет списков"
|
||||||
},
|
},
|
||||||
"fvLNDy": {
|
"fvLNDy": {
|
||||||
"message": "No lists have been created yet",
|
"message": "No lists have been created yet",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/index.tsx", 657]],
|
"origin": [["src/views/board/index.tsx", 670]],
|
||||||
"translation": "Списки ещё не созданы"
|
"translation": "Списки ещё не созданы"
|
||||||
},
|
},
|
||||||
"i30J2U": {
|
"i30J2U": {
|
||||||
@@ -4559,7 +4604,7 @@
|
|||||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||||
"translation": "Выберите тариф, чтобы начать. Все платные тарифы включают 14-дневный бесплатный пробный период."
|
"translation": "Выберите тариф, чтобы начать. Все платные тарифы включают 14-дневный бесплатный пробный период."
|
||||||
},
|
},
|
||||||
"GdgCoi": {
|
"GdgCoi": {
|
||||||
@@ -4657,15 +4702,15 @@
|
|||||||
["src/components/DeleteLabelConfirmation.tsx", 26],
|
["src/components/DeleteLabelConfirmation.tsx", 26],
|
||||||
["src/components/FeedbackModal.tsx", 41],
|
["src/components/FeedbackModal.tsx", 41],
|
||||||
["src/components/NewWorkspaceForm.tsx", 110],
|
["src/components/NewWorkspaceForm.tsx", 110],
|
||||||
["src/views/board/components/BoardDropdown.tsx", 68],
|
["src/views/board/components/BoardDropdown.tsx", 69],
|
||||||
["src/views/board/components/NewCardForm.tsx", 193],
|
["src/views/board/components/NewCardForm.tsx", 193],
|
||||||
["src/views/board/components/NewListForm.tsx", 79],
|
["src/views/board/components/NewListForm.tsx", 79],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 61],
|
["src/views/board/components/NewTemplateForm.tsx", 61],
|
||||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||||
["src/views/board/index.tsx", 218],
|
["src/views/board/index.tsx", 224],
|
||||||
["src/views/board/index.tsx", 274],
|
["src/views/board/index.tsx", 280],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||||
@@ -4683,7 +4728,7 @@
|
|||||||
["src/views/card/components/MemberSelector.tsx", 82],
|
["src/views/card/components/MemberSelector.tsx", 82],
|
||||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||||
["src/views/card/index.tsx", 236],
|
["src/views/card/index.tsx", 236],
|
||||||
["src/views/card/index.tsx", 249],
|
["src/views/card/index.tsx", 249],
|
||||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||||
@@ -4723,7 +4768,7 @@
|
|||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||||
["src/views/board/index.tsx", 315],
|
["src/views/board/index.tsx", 321],
|
||||||
["src/views/card/components/Dropdown.tsx", 55],
|
["src/views/card/components/Dropdown.tsx", 55],
|
||||||
["src/views/card/components/Dropdown.tsx", 81],
|
["src/views/card/components/Dropdown.tsx", 81],
|
||||||
["src/views/card/components/Dropdown.tsx", 100],
|
["src/views/card/components/Dropdown.tsx", 100],
|
||||||
@@ -4786,7 +4831,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||||
],
|
],
|
||||||
@@ -4892,7 +4937,7 @@
|
|||||||
"message": "Remove from favorites",
|
"message": "Remove from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 124]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 136]],
|
||||||
"translation": "Удалить из избранного"
|
"translation": "Удалить из избранного"
|
||||||
},
|
},
|
||||||
"99VIgC": {
|
"99VIgC": {
|
||||||
@@ -4946,7 +4991,7 @@
|
|||||||
"message": "Removed from favorites",
|
"message": "Removed from favorites",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 57]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 58]],
|
||||||
"translation": "Удалено из избранного"
|
"translation": "Удалено из избранного"
|
||||||
},
|
},
|
||||||
"YVT40D": {
|
"YVT40D": {
|
||||||
@@ -5193,6 +5238,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Выберите список"
|
"translation": "Выберите список"
|
||||||
},
|
},
|
||||||
|
"NM2hyD": {
|
||||||
|
"message": "Select a workspace",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 84]],
|
||||||
|
"translation": "Выберите рабочее пространство"
|
||||||
|
},
|
||||||
"wgNoIs": {
|
"wgNoIs": {
|
||||||
"message": "Select all",
|
"message": "Select all",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5309,7 +5361,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 102],
|
["src/components/SettingsLayout.tsx", 102],
|
||||||
["src/components/SideNavigation.tsx", 133]
|
["src/components/SideNavigation.tsx", 134]
|
||||||
],
|
],
|
||||||
"translation": "Настройки"
|
"translation": "Настройки"
|
||||||
},
|
},
|
||||||
@@ -5404,7 +5456,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||||
],
|
],
|
||||||
"translation": "Выйти"
|
"translation": "Выйти"
|
||||||
@@ -5498,7 +5550,7 @@
|
|||||||
"message": "Solo",
|
"message": "Solo",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||||
"translation": "Индивидуальный"
|
"translation": "Индивидуальный"
|
||||||
},
|
},
|
||||||
"J9+zIR": {
|
"J9+zIR": {
|
||||||
@@ -5545,9 +5597,9 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 225],
|
["src/components/SideNavigation.tsx", 228],
|
||||||
["src/components/SideNavigation.tsx", 226],
|
["src/components/SideNavigation.tsx", 229],
|
||||||
["src/components/SideNavigation.tsx", 236]
|
["src/components/SideNavigation.tsx", 239]
|
||||||
],
|
],
|
||||||
"translation": "Начать бесплатный пробный период"
|
"translation": "Начать бесплатный пробный период"
|
||||||
},
|
},
|
||||||
@@ -5565,6 +5617,13 @@
|
|||||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||||
"translation": "Статус"
|
"translation": "Статус"
|
||||||
},
|
},
|
||||||
|
"hQRttt": {
|
||||||
|
"message": "Submit",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||||
|
"translation": "Отправить"
|
||||||
|
},
|
||||||
"WYDptz": {
|
"WYDptz": {
|
||||||
"message": "Subscription Required",
|
"message": "Subscription Required",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -5628,7 +5687,7 @@
|
|||||||
"message": "Team",
|
"message": "Team",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||||
"translation": "Команда"
|
"translation": "Команда"
|
||||||
},
|
},
|
||||||
"bff61F": {
|
"bff61F": {
|
||||||
@@ -5658,8 +5717,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/board/index.tsx", 566]
|
["src/views/board/index.tsx", 579]
|
||||||
],
|
],
|
||||||
"translation": "Шаблон"
|
"translation": "Шаблон"
|
||||||
},
|
},
|
||||||
@@ -5696,7 +5755,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SideNavigation.tsx", 109],
|
["src/components/SideNavigation.tsx", 110],
|
||||||
["src/views/home/components/Features.tsx", 115]
|
["src/views/home/components/Features.tsx", 115]
|
||||||
],
|
],
|
||||||
"translation": "Шаблоны"
|
"translation": "Шаблоны"
|
||||||
@@ -5770,14 +5829,23 @@
|
|||||||
"message": "The board has been archived.",
|
"message": "The board has been archived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 48]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
||||||
"translation": "Доска была архивирована."
|
"translation": "Доска была архивирована."
|
||||||
},
|
},
|
||||||
|
"ZWk38w": {
|
||||||
|
"message": "The board has been moved to {0}.",
|
||||||
|
"placeholders": {
|
||||||
|
"0": ["targetWorkspace?.name ?? \"the workspace\""]
|
||||||
|
},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 34]],
|
||||||
|
"translation": "Доска была перемещена в {0}."
|
||||||
|
},
|
||||||
"C6gv54": {
|
"C6gv54": {
|
||||||
"message": "The board has been unarchived.",
|
"message": "The board has been unarchived.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 49]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 50]],
|
||||||
"translation": "Доска была восстановлена из архива."
|
"translation": "Доска была восстановлена из архива."
|
||||||
},
|
},
|
||||||
"nKBUeF": {
|
"nKBUeF": {
|
||||||
@@ -6088,7 +6156,7 @@
|
|||||||
"message": "Unable to add comment",
|
"message": "Unable to add comment",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||||
"translation": "Не удалось добавить комментарий"
|
"translation": "Не удалось добавить комментарий"
|
||||||
},
|
},
|
||||||
"2Q871c": {
|
"2Q871c": {
|
||||||
@@ -6117,7 +6185,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 313],
|
["src/views/board/index.tsx", 319],
|
||||||
["src/views/card/components/Dropdown.tsx", 79],
|
["src/views/card/components/Dropdown.tsx", 79],
|
||||||
["src/views/public/board/CardModal.tsx", 43],
|
["src/views/public/board/CardModal.tsx", 43],
|
||||||
["src/views/public/board/index.tsx", 84]
|
["src/views/public/board/index.tsx", 84]
|
||||||
@@ -6228,6 +6296,13 @@
|
|||||||
],
|
],
|
||||||
"translation": "Невозможно дублировать карточку"
|
"translation": "Невозможно дублировать карточку"
|
||||||
},
|
},
|
||||||
|
"d196/6": {
|
||||||
|
"message": "Unable to move board",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 45]],
|
||||||
|
"translation": "Не удалось переместить доску"
|
||||||
|
},
|
||||||
"K7k9u3": {
|
"K7k9u3": {
|
||||||
"message": "Unable to move card",
|
"message": "Unable to move card",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -6288,7 +6363,7 @@
|
|||||||
"message": "Unable to update board",
|
"message": "Unable to update board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 67]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 68]],
|
||||||
"translation": "Не удалось обновить доску"
|
"translation": "Не удалось обновить доску"
|
||||||
},
|
},
|
||||||
"XpcjLO": {
|
"XpcjLO": {
|
||||||
@@ -6310,7 +6385,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 273],
|
["src/views/board/index.tsx", 279],
|
||||||
["src/views/card/index.tsx", 235]
|
["src/views/card/index.tsx", 235]
|
||||||
],
|
],
|
||||||
"translation": "Не удалось обновить карточку"
|
"translation": "Не удалось обновить карточку"
|
||||||
@@ -6355,7 +6430,7 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/board/index.tsx", 217],
|
["src/views/board/index.tsx", 223],
|
||||||
["src/views/card/components/ListSelector.tsx", 54]
|
["src/views/card/components/ListSelector.tsx", 54]
|
||||||
],
|
],
|
||||||
"translation": "Не удалось обновить список"
|
"translation": "Не удалось обновить список"
|
||||||
@@ -6395,7 +6470,7 @@
|
|||||||
"message": "Unarchive board",
|
"message": "Unarchive board",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/board/components/BoardDropdown.tsx", 114]],
|
"origin": [["src/views/board/components/BoardDropdown.tsx", 115]],
|
||||||
"translation": "Восстановить доску из архива"
|
"translation": "Восстановить доску из архива"
|
||||||
},
|
},
|
||||||
"E8zYtd": {
|
"E8zYtd": {
|
||||||
@@ -6508,7 +6583,7 @@
|
|||||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||||
"translation": "Неограниченное количество участников и персональное имя рабочего пространства для команд, готовых к масштабированию."
|
"translation": "Неограниченное количество участников и персональное имя рабочего пространства для команд, готовых к масштабированию."
|
||||||
},
|
},
|
||||||
"i5yNAO": {
|
"i5yNAO": {
|
||||||
@@ -6533,7 +6608,8 @@
|
|||||||
["src/pages/unsubscribe/index.tsx", 68],
|
["src/pages/unsubscribe/index.tsx", 68],
|
||||||
["src/pages/unsubscribe/index.tsx", 93]
|
["src/pages/unsubscribe/index.tsx", 93]
|
||||||
],
|
],
|
||||||
"translation": "Отписаться"
|
"translation": "Отписаться",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"EkH9pt": {
|
"EkH9pt": {
|
||||||
"message": "Update",
|
"message": "Update",
|
||||||
@@ -6598,7 +6674,7 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/views/members/index.tsx", 295],
|
["src/views/members/index.tsx", 295],
|
||||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||||
],
|
],
|
||||||
"translation": "Обновить"
|
"translation": "Обновить"
|
||||||
},
|
},
|
||||||
@@ -6778,7 +6854,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||||
"translation": "Не удалось обновить ваши настройки. Пожалуйста, попробуйте ещё раз."
|
"translation": "Не удалось обновить ваши настройки. Пожалуйста, попробуйте ещё раз.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"7sdSkl": {
|
"7sdSkl": {
|
||||||
"message": "We sent a link to {magicLinkRecipient}",
|
"message": "We sent a link to {magicLinkRecipient}",
|
||||||
@@ -6931,8 +7008,8 @@
|
|||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [
|
"origin": [
|
||||||
["src/components/SettingsLayout.tsx", 47],
|
["src/components/SettingsLayout.tsx", 47],
|
||||||
["src/views/board/index.tsx", 530],
|
["src/views/board/index.tsx", 543],
|
||||||
["src/views/boards/index.tsx", 48],
|
["src/views/boards/index.tsx", 57],
|
||||||
["src/views/members/index.tsx", 278],
|
["src/views/members/index.tsx", 278],
|
||||||
["src/views/public/board/index.tsx", 125],
|
["src/views/public/board/index.tsx", 125],
|
||||||
["src/views/public/boards/index.tsx", 75]
|
["src/views/public/boards/index.tsx", 75]
|
||||||
@@ -7146,6 +7223,13 @@
|
|||||||
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
"origin": [["src/views/home/components/Faqs.tsx", 127]],
|
||||||
"translation": "Вы можете развернуть сервис самостоятельно, следуя инструкциям в нашем <0>репозитории</0>."
|
"translation": "Вы можете развернуть сервис самостоятельно, следуя инструкциям в нашем <0>репозитории</0>."
|
||||||
},
|
},
|
||||||
|
"tUL16u": {
|
||||||
|
"message": "You don't have any other workspaces to move this board to.",
|
||||||
|
"placeholders": {},
|
||||||
|
"comments": [],
|
||||||
|
"origin": [["src/views/board/components/MoveBoardForm.tsx", 68]],
|
||||||
|
"translation": "У вас нет других рабочих пространств для перемещения этой доски."
|
||||||
|
},
|
||||||
"h2FKMV": {
|
"h2FKMV": {
|
||||||
"message": "You don't have permission",
|
"message": "You don't have permission",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
@@ -7154,11 +7238,11 @@
|
|||||||
["src/views/board/components/List.tsx", 117],
|
["src/views/board/components/List.tsx", 117],
|
||||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||||
["src/views/board/index.tsx", 604],
|
["src/views/board/index.tsx", 617],
|
||||||
["src/views/board/index.tsx", 662],
|
["src/views/board/index.tsx", 675],
|
||||||
["src/views/boards/components/BoardsList.tsx", 71],
|
["src/views/boards/components/BoardsList.tsx", 71],
|
||||||
["src/views/boards/index.tsx", 59],
|
["src/views/boards/index.tsx", 68],
|
||||||
["src/views/boards/index.tsx", 80]
|
["src/views/boards/index.tsx", 89]
|
||||||
],
|
],
|
||||||
"translation": "У вас нет прав доступа"
|
"translation": "У вас нет прав доступа"
|
||||||
},
|
},
|
||||||
@@ -7181,7 +7265,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||||
"translation": "Вы отписались!"
|
"translation": "Вы отписались!",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"R275Pz": {
|
"R275Pz": {
|
||||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||||
@@ -7250,7 +7335,7 @@
|
|||||||
"message": "Your avatar",
|
"message": "Your avatar",
|
||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||||
"translation": "Ваш аватар"
|
"translation": "Ваш аватар"
|
||||||
},
|
},
|
||||||
"evg7+A": {
|
"evg7+A": {
|
||||||
@@ -7360,7 +7445,8 @@
|
|||||||
"placeholders": {},
|
"placeholders": {},
|
||||||
"comments": [],
|
"comments": [],
|
||||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||||
"translation": "В вашей ссылке для отписки отсутствует токен. Пожалуйста, откройте последнее письмо и попробуйте снова."
|
"translation": "В вашей ссылке для отписки отсутствует токен. Пожалуйста, откройте последнее письмо и попробуйте снова.",
|
||||||
|
"obsolete": true
|
||||||
},
|
},
|
||||||
"GRAGsB": {
|
"GRAGsB": {
|
||||||
"message": "Your workspace",
|
"message": "Your workspace",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
13005
apps/web/src/locales/zh-CN/messages.json
Normal file
13005
apps/web/src/locales/zh-CN/messages.json
Normal file
File diff suppressed because it is too large
Load Diff
1
apps/web/src/locales/zh-CN/messages.ts
Normal file
1
apps/web/src/locales/zh-CN/messages.ts
Normal file
File diff suppressed because one or more lines are too long
@@ -82,8 +82,8 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
|
|||||||
)}
|
)}
|
||||||
<script src="/__ENV.js" />
|
<script src="/__ENV.js" />
|
||||||
<main className="font-sans">
|
<main className="font-sans">
|
||||||
<KeyboardShortcutProvider>
|
<LinguiProviderWrapper>
|
||||||
<LinguiProviderWrapper>
|
<KeyboardShortcutProvider>
|
||||||
<FontSizeProvider>
|
<FontSizeProvider>
|
||||||
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
||||||
<ModalProvider>
|
<ModalProvider>
|
||||||
@@ -99,8 +99,8 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
|
|||||||
</ModalProvider>
|
</ModalProvider>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
</FontSizeProvider>
|
</FontSizeProvider>
|
||||||
</LinguiProviderWrapper>
|
</KeyboardShortcutProvider>
|
||||||
</KeyboardShortcutProvider>
|
</LinguiProviderWrapper>
|
||||||
</main>
|
</main>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
import type { NextApiRequest, NextApiResponse } from "next";
|
|
||||||
import { Novu } from "@novu/api";
|
|
||||||
import { jwtVerify } from "jose";
|
|
||||||
import { z } from "zod";
|
|
||||||
|
|
||||||
import { withApiLogging } from "@kan/api/utils/apiLogging";
|
|
||||||
import { withRateLimit } from "@kan/api/utils/rateLimit";
|
|
||||||
|
|
||||||
import { env } from "~/env";
|
|
||||||
|
|
||||||
const requestSchema = z.object({
|
|
||||||
token: z.string().min(1),
|
|
||||||
});
|
|
||||||
|
|
||||||
const tokenPayloadSchema = z.object({
|
|
||||||
subscriberId: z.string(),
|
|
||||||
});
|
|
||||||
|
|
||||||
type ResponseData =
|
|
||||||
| { success: true }
|
|
||||||
| { success: false; error: string; code?: string };
|
|
||||||
|
|
||||||
const textEncoder = new TextEncoder();
|
|
||||||
|
|
||||||
export default withRateLimit(
|
|
||||||
{ points: 100, duration: 60 },
|
|
||||||
withApiLogging(
|
|
||||||
async (req: NextApiRequest, res: NextApiResponse<ResponseData>) => {
|
|
||||||
if (process.env.NEXT_PUBLIC_KAN_ENV !== "cloud") {
|
|
||||||
return res.status(404).json({
|
|
||||||
success: false,
|
|
||||||
error: "Unsubscribe endpoint is not available.",
|
|
||||||
code: "UNAVAILABLE",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req.method !== "POST") {
|
|
||||||
res.setHeader("Allow", "POST");
|
|
||||||
return res.status(405).json({
|
|
||||||
success: false,
|
|
||||||
error: "Method not allowed.",
|
|
||||||
code: "METHOD_NOT_ALLOWED",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const parsedBody = requestSchema.safeParse(req.body);
|
|
||||||
|
|
||||||
if (!parsedBody.success) {
|
|
||||||
return res.status(400).json({
|
|
||||||
success: false,
|
|
||||||
error: "Invalid request payload.",
|
|
||||||
code: "BAD_REQUEST",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!env.EMAIL_UNSUBSCRIBE_SECRET || !env.NOVU_API_KEY) {
|
|
||||||
return res.status(500).json({
|
|
||||||
success: false,
|
|
||||||
error: "Unsubscribe service is not configured.",
|
|
||||||
code: "NOT_CONFIGURED",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let payload: z.infer<typeof tokenPayloadSchema>;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const verified = await jwtVerify(
|
|
||||||
parsedBody.data.token,
|
|
||||||
textEncoder.encode(env.EMAIL_UNSUBSCRIBE_SECRET),
|
|
||||||
{
|
|
||||||
// We intentionally do not use exp/iat claims –
|
|
||||||
// tokens are long-lived and validated only by signature + payload.
|
|
||||||
clockTolerance: "0s",
|
|
||||||
},
|
|
||||||
);
|
|
||||||
payload = tokenPayloadSchema.parse(verified.payload);
|
|
||||||
} catch {
|
|
||||||
return res.status(401).json({
|
|
||||||
success: false,
|
|
||||||
error: "Your unsubscribe link is invalid or has expired.",
|
|
||||||
code: "INVALID_TOKEN",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const novu = new Novu({ secretKey: env.NOVU_API_KEY });
|
|
||||||
|
|
||||||
try {
|
|
||||||
await novu.subscribers.preferences.update(
|
|
||||||
{
|
|
||||||
channels: {
|
|
||||||
email: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
payload.subscriberId,
|
|
||||||
);
|
|
||||||
} catch (error) {
|
|
||||||
return res.status(502).json({
|
|
||||||
success: false,
|
|
||||||
error:
|
|
||||||
"We could not update your email preferences right now. Please try again later.",
|
|
||||||
code: "NOVU_ERROR",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.status(200).json({ success: true });
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
import { useRouter } from "next/router";
|
|
||||||
import { t } from "@lingui/core/macro";
|
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
|
||||||
import { PageHead } from "~/components/PageHead";
|
|
||||||
import PatternedBackground from "~/components/PatternedBackground";
|
|
||||||
|
|
||||||
type UnsubscribeStatus = "idle" | "processing" | "success" | "error";
|
|
||||||
|
|
||||||
export default function UnsubscribePage() {
|
|
||||||
const router = useRouter();
|
|
||||||
const [token, setToken] = useState("");
|
|
||||||
const [status, setStatus] = useState<UnsubscribeStatus>("idle");
|
|
||||||
const [errorMessage, setErrorMessage] = useState<string | null>(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!router.isReady) return;
|
|
||||||
const value = router.query.token;
|
|
||||||
if (typeof value === "string") {
|
|
||||||
setToken(value);
|
|
||||||
} else if (Array.isArray(value)) {
|
|
||||||
setToken(value[0] ?? "");
|
|
||||||
} else {
|
|
||||||
setToken("");
|
|
||||||
}
|
|
||||||
}, [router.isReady, router.query.token]);
|
|
||||||
|
|
||||||
const handleUnsubscribe = async () => {
|
|
||||||
if (!token) {
|
|
||||||
setStatus("error");
|
|
||||||
setErrorMessage(
|
|
||||||
t`Your unsubscribe link is missing a token. Please open the latest email and try again.`,
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus("processing");
|
|
||||||
setErrorMessage(null);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch("/api/unsubscribe", {
|
|
||||||
method: "POST",
|
|
||||||
headers: { "Content-Type": "application/json" },
|
|
||||||
body: JSON.stringify({ token }),
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
const payload = (await response.json().catch(() => null)) as {
|
|
||||||
error?: string;
|
|
||||||
} | null;
|
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
payload?.error ??
|
|
||||||
"We couldn't update your preferences. Please try again.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus("success");
|
|
||||||
} catch (error) {
|
|
||||||
setStatus("error");
|
|
||||||
setErrorMessage(
|
|
||||||
t`We couldn't update your preferences. Please try again.`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const title = t`Unsubscribe`;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<PageHead title={`${title} | kan.bn`} />
|
|
||||||
<div className="relative flex min-h-screen items-center justify-center px-4 py-12 sm:px-6 lg:px-8">
|
|
||||||
<PatternedBackground />
|
|
||||||
<div className="z-10 w-full max-w-md space-y-6">
|
|
||||||
<div>
|
|
||||||
<h1 className="mt-6 text-center text-3xl font-bold tracking-tight text-light-1000 dark:text-dark-1000">
|
|
||||||
{t`Do you want to unsubscribe?`}
|
|
||||||
</h1>
|
|
||||||
<p className="mt-4 text-center text-sm text-light-900 dark:text-dark-800">
|
|
||||||
{t`Confirm your email preferences:`}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex justify-center">
|
|
||||||
<Button
|
|
||||||
onClick={handleUnsubscribe}
|
|
||||||
disabled={status === "success"}
|
|
||||||
isLoading={status === "processing"}
|
|
||||||
variant="primary"
|
|
||||||
size="md"
|
|
||||||
>
|
|
||||||
{t`Unsubscribe`}
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
{status === "success" && (
|
|
||||||
<p className="text-center text-sm text-light-900 dark:text-dark-800">
|
|
||||||
{t`You have been unsubscribed!`}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
{status === "error" && (
|
|
||||||
<p className="mx-auto max-w-[300px] text-center text-sm font-medium text-red-600 dark:text-red-400">
|
|
||||||
{errorMessage}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -20,6 +20,7 @@ import { HiXMark } from "react-icons/hi2";
|
|||||||
|
|
||||||
import { env } from "~/env";
|
import { env } from "~/env";
|
||||||
import { useEventListener } from "~/hooks/useEventListener";
|
import { useEventListener } from "~/hooks/useEventListener";
|
||||||
|
import { useLinguiContext } from "~/providers/lingui";
|
||||||
|
|
||||||
const ModifierKey = {
|
const ModifierKey = {
|
||||||
CONTROL: "CONTROL",
|
CONTROL: "CONTROL",
|
||||||
@@ -160,6 +161,7 @@ export function KeyboardShortcutProvider({
|
|||||||
const sequenceTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
const sequenceTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
||||||
|
|
||||||
const [isLegendOpen, setIsLegendOpen] = useState(false);
|
const [isLegendOpen, setIsLegendOpen] = useState(false);
|
||||||
|
const { locale } = useLinguiContext();
|
||||||
|
|
||||||
const openLegendShortcut: KeyboardShortcut = useMemo(
|
const openLegendShortcut: KeyboardShortcut = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
@@ -172,7 +174,7 @@ export function KeyboardShortcutProvider({
|
|||||||
description: t`Open keyboard shortcuts`,
|
description: t`Open keyboard shortcuts`,
|
||||||
group: ShortcutGroup.GENERAL,
|
group: ShortcutGroup.GENERAL,
|
||||||
}),
|
}),
|
||||||
[setIsLegendOpen],
|
[locale],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleKeyDown = useCallback((event: KeyboardEvent) => {
|
const handleKeyDown = useCallback((event: KeyboardEvent) => {
|
||||||
|
|||||||
@@ -35,10 +35,31 @@ function detectBrowserLocale(availableLocales: readonly string[]): Locale {
|
|||||||
const browserLanguages = navigator.languages || [navigator.language];
|
const browserLanguages = navigator.languages || [navigator.language];
|
||||||
|
|
||||||
for (const browserLang of browserLanguages) {
|
for (const browserLang of browserLanguages) {
|
||||||
const langCode = browserLang.split("-")[0];
|
const normalizedLocale = browserLang.toLowerCase();
|
||||||
|
const exactLocale = availableLocales.find(
|
||||||
|
(availableLocale) => availableLocale.toLowerCase() === normalizedLocale,
|
||||||
|
);
|
||||||
|
|
||||||
if (langCode && availableLocales.includes(langCode.toLowerCase())) {
|
if (exactLocale) {
|
||||||
return langCode.toLowerCase() as Locale;
|
return exactLocale as Locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
const languageCode = normalizedLocale.split("-")[0];
|
||||||
|
|
||||||
|
if (languageCode === "zh" && availableLocales.includes("zh-CN")) {
|
||||||
|
return "zh-CN";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (languageCode === "pt" && availableLocales.includes("ptbr")) {
|
||||||
|
return "ptbr";
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseLocale = availableLocales.find(
|
||||||
|
(availableLocale) => availableLocale.toLowerCase() === languageCode,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (baseLocale) {
|
||||||
|
return baseLocale as Locale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +70,7 @@ export function LinguiProviderWrapper({
|
|||||||
children,
|
children,
|
||||||
initialLocale = defaultLocale,
|
initialLocale = defaultLocale,
|
||||||
}: LinguiProviderProps) {
|
}: LinguiProviderProps) {
|
||||||
const [locale, setLocale] = useState<Locale>(defaultLocale);
|
const [locale, setLocale] = useState<Locale>(initialLocale);
|
||||||
const [isHydrated, setIsHydrated] = useState(false);
|
const [isHydrated, setIsHydrated] = useState(false);
|
||||||
|
|
||||||
initializeI18n();
|
initializeI18n();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { createContext, useContext, useState } from "react";
|
import { createContext, useCallback, useContext, useState } from "react";
|
||||||
|
|
||||||
interface PopupContextType {
|
interface PopupContextType {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
@@ -25,24 +25,27 @@ export const PopupProvider: React.FC<Props> = ({ children }) => {
|
|||||||
const [popupMessage, setPopupMessage] = useState("");
|
const [popupMessage, setPopupMessage] = useState("");
|
||||||
const [popupIcon, setPopupIcon] = useState("");
|
const [popupIcon, setPopupIcon] = useState("");
|
||||||
|
|
||||||
const showPopup = ({
|
const showPopup = useCallback(
|
||||||
header,
|
({
|
||||||
message,
|
header,
|
||||||
icon,
|
message,
|
||||||
}: {
|
icon,
|
||||||
header: string;
|
}: {
|
||||||
message: string;
|
header: string;
|
||||||
icon: string;
|
message: string;
|
||||||
}) => {
|
icon: string;
|
||||||
setIsOpen(true);
|
}) => {
|
||||||
setPopupHeader(header);
|
setIsOpen(true);
|
||||||
setPopupMessage(message);
|
setPopupHeader(header);
|
||||||
setPopupIcon(icon);
|
setPopupMessage(message);
|
||||||
};
|
setPopupIcon(icon);
|
||||||
|
},
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
const hidePopup = () => {
|
const hidePopup = useCallback(() => {
|
||||||
setIsOpen(false);
|
setIsOpen(false);
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PopupContext.Provider
|
<PopupContext.Provider
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { i18n } from "@lingui/core";
|
|||||||
import type { Locale } from "~/locales";
|
import type { Locale } from "~/locales";
|
||||||
import { defaultLocale } from "~/locales";
|
import { defaultLocale } from "~/locales";
|
||||||
import { messages as enMessages } from "~/locales/en/messages";
|
import { messages as enMessages } from "~/locales/en/messages";
|
||||||
|
import { messages as zhCNMessages } from "~/locales/zh-CN/messages";
|
||||||
|
|
||||||
const loadMessages = async (locale: Locale) => {
|
const loadMessages = async (locale: Locale) => {
|
||||||
switch (locale) {
|
switch (locale) {
|
||||||
@@ -24,6 +25,8 @@ const loadMessages = async (locale: Locale) => {
|
|||||||
return (await import("~/locales/pl/messages")).messages;
|
return (await import("~/locales/pl/messages")).messages;
|
||||||
case "ptbr":
|
case "ptbr":
|
||||||
return (await import("~/locales/ptbr/messages")).messages;
|
return (await import("~/locales/ptbr/messages")).messages;
|
||||||
|
case "zh-CN":
|
||||||
|
return (await import("~/locales/zh-CN/messages")).messages;
|
||||||
default:
|
default:
|
||||||
return enMessages;
|
return enMessages;
|
||||||
}
|
}
|
||||||
@@ -32,11 +35,15 @@ const loadMessages = async (locale: Locale) => {
|
|||||||
let isInitialized = false;
|
let isInitialized = false;
|
||||||
const loadedLocales = new Set<string>();
|
const loadedLocales = new Set<string>();
|
||||||
|
|
||||||
export function initializeI18n(locale: Locale = defaultLocale) {
|
export function initializeI18n() {
|
||||||
if (!isInitialized) {
|
if (!isInitialized) {
|
||||||
i18n.load(defaultLocale, enMessages);
|
// 首屏同步加载中英文,避免默认语言激活前出现中英混排。
|
||||||
|
i18n.load("en", enMessages);
|
||||||
|
i18n.load("zh-CN", zhCNMessages);
|
||||||
i18n.activate(defaultLocale);
|
i18n.activate(defaultLocale);
|
||||||
loadedLocales.add(defaultLocale);
|
loadedLocales.add(defaultLocale);
|
||||||
|
loadedLocales.add("en");
|
||||||
|
loadedLocales.add("zh-CN");
|
||||||
isInitialized = true;
|
isInitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useRouter } from "next/router";
|
import { useRouter } from "next/router";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import {
|
import {
|
||||||
|
HiArrowRightOnRectangle,
|
||||||
HiEllipsisHorizontal,
|
HiEllipsisHorizontal,
|
||||||
HiLink,
|
HiLink,
|
||||||
HiOutlineDocumentDuplicate,
|
HiOutlineDocumentDuplicate,
|
||||||
@@ -88,7 +89,7 @@ export default function BoardDropdown({
|
|||||||
const isArchiveActionPending = updateBoard.isPending;
|
const isArchiveActionPending = updateBoard.isPending;
|
||||||
|
|
||||||
const items = [
|
const items = [
|
||||||
...(isTemplate && canCreateBoard
|
...(!isTemplate && canCreateBoard
|
||||||
? [
|
? [
|
||||||
{
|
{
|
||||||
label: t`Make template`,
|
label: t`Make template`,
|
||||||
@@ -119,6 +120,17 @@ export default function BoardDropdown({
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
: []),
|
: []),
|
||||||
|
...(!isTemplate && canEditBoard
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
label: t`Move to workspace`,
|
||||||
|
action: () => openModal("MOVE_BOARD"),
|
||||||
|
icon: (
|
||||||
|
<HiArrowRightOnRectangle className="h-[16px] w-[16px] text-dark-900" />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
{
|
{
|
||||||
label: isFavorite
|
label: isFavorite
|
||||||
? t`Remove from favorites`
|
? t`Remove from favorites`
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import {
|
import {
|
||||||
HiLink,
|
HiLink,
|
||||||
|
HiOutlineArrowRightCircle,
|
||||||
HiOutlineCalendar,
|
HiOutlineCalendar,
|
||||||
HiOutlineDocumentDuplicate,
|
HiOutlineDocumentDuplicate,
|
||||||
HiOutlineTag,
|
HiOutlineTag,
|
||||||
HiOutlineTrash,
|
HiOutlineTrash,
|
||||||
HiOutlineUserGroup,
|
HiOutlineUserGroup,
|
||||||
HiOutlineArrowRightCircle,
|
|
||||||
} from "react-icons/hi2";
|
} from "react-icons/hi2";
|
||||||
|
|
||||||
|
import { useIsomorphicLayoutEffect } from "~/hooks/useIsomorphicLayoutEffect";
|
||||||
|
|
||||||
export type CardContextMenuAction =
|
export type CardContextMenuAction =
|
||||||
| "members"
|
| "members"
|
||||||
| "move"
|
| "move"
|
||||||
@@ -85,6 +87,55 @@ export function CardContextMenu({
|
|||||||
canEdit,
|
canEdit,
|
||||||
}: CardContextMenuProps) {
|
}: CardContextMenuProps) {
|
||||||
const menuRef = useRef<HTMLDivElement>(null);
|
const menuRef = useRef<HTMLDivElement>(null);
|
||||||
|
const [position, setPosition] = useState({ x, y });
|
||||||
|
|
||||||
|
const items = MENU_ITEMS.filter((item) => !item.requiresEdit || canEdit);
|
||||||
|
|
||||||
|
useIsomorphicLayoutEffect(() => {
|
||||||
|
const menu = menuRef.current;
|
||||||
|
if (!menu) return;
|
||||||
|
|
||||||
|
const gutter = 8;
|
||||||
|
const updatePosition = () => {
|
||||||
|
const { width, height } = menu.getBoundingClientRect();
|
||||||
|
const viewportWidth = window.visualViewport?.width ?? window.innerWidth;
|
||||||
|
const viewportHeight =
|
||||||
|
window.visualViewport?.height ?? window.innerHeight;
|
||||||
|
const maxX = Math.max(gutter, viewportWidth - width - gutter);
|
||||||
|
const maxY = Math.max(gutter, viewportHeight - height - gutter);
|
||||||
|
const nextPosition = {
|
||||||
|
x: Math.min(Math.max(x, gutter), maxX),
|
||||||
|
y: Math.min(Math.max(y, gutter), maxY),
|
||||||
|
};
|
||||||
|
|
||||||
|
setPosition((currentPosition) =>
|
||||||
|
currentPosition.x === nextPosition.x &&
|
||||||
|
currentPosition.y === nextPosition.y
|
||||||
|
? currentPosition
|
||||||
|
: nextPosition,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
updatePosition();
|
||||||
|
|
||||||
|
const resizeObserver =
|
||||||
|
typeof ResizeObserver !== "undefined"
|
||||||
|
? new ResizeObserver(updatePosition)
|
||||||
|
: null;
|
||||||
|
resizeObserver?.observe(menu);
|
||||||
|
window.addEventListener("resize", updatePosition);
|
||||||
|
window.addEventListener("scroll", updatePosition, true);
|
||||||
|
window.visualViewport?.addEventListener("resize", updatePosition);
|
||||||
|
window.visualViewport?.addEventListener("scroll", updatePosition);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
resizeObserver?.disconnect();
|
||||||
|
window.removeEventListener("resize", updatePosition);
|
||||||
|
window.removeEventListener("scroll", updatePosition, true);
|
||||||
|
window.visualViewport?.removeEventListener("resize", updatePosition);
|
||||||
|
window.visualViewport?.removeEventListener("scroll", updatePosition);
|
||||||
|
};
|
||||||
|
}, [x, y, canEdit, items.length]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleClickOutside = (e: MouseEvent) => {
|
const handleClickOutside = (e: MouseEvent) => {
|
||||||
@@ -103,13 +154,11 @@ export function CardContextMenu({
|
|||||||
};
|
};
|
||||||
}, [onClose]);
|
}, [onClose]);
|
||||||
|
|
||||||
const items = MENU_ITEMS.filter((item) => !item.requiresEdit || canEdit);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
ref={menuRef}
|
ref={menuRef}
|
||||||
className="fixed z-[200] min-w-[200px] rounded-md border border-light-200 bg-white py-1 shadow-lg dark:border-dark-400 dark:bg-dark-200"
|
className="fixed z-[200] max-h-[calc(100dvh-1rem)] min-w-[min(200px,calc(100vw-1rem))] max-w-[calc(100vw-1rem)] overflow-y-auto overflow-x-hidden rounded-md border border-light-200 bg-white py-1 shadow-lg dark:border-dark-400 dark:bg-dark-200"
|
||||||
style={{ left: x, top: y }}
|
style={{ left: position.x, top: position.y }}
|
||||||
>
|
>
|
||||||
{items.map(({ action, label, icon }) => (
|
{items.map(({ action, label, icon }) => (
|
||||||
<button
|
<button
|
||||||
@@ -119,7 +168,7 @@ export function CardContextMenu({
|
|||||||
onAction(action);
|
onAction(action);
|
||||||
onClose();
|
onClose();
|
||||||
}}
|
}}
|
||||||
className="flex w-full items-center gap-2 px-3 py-2 text-left text-sm text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
|
className="flex w-full items-center gap-2 break-words px-3 py-2 text-left text-sm text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-400"
|
||||||
>
|
>
|
||||||
{icon}
|
{icon}
|
||||||
{label}
|
{label}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export function DeleteBoardConfirmation({
|
|||||||
}) {
|
}) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { closeModal } = useModal();
|
const { closeModal } = useModal();
|
||||||
|
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||||
|
|
||||||
const deleteBoard = api.board.delete.useMutation({
|
const deleteBoard = api.board.delete.useMutation({
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
@@ -33,7 +34,7 @@ export function DeleteBoardConfirmation({
|
|||||||
<div className="p-5">
|
<div className="p-5">
|
||||||
<div className="flex w-full flex-col justify-between pb-4">
|
<div className="flex w-full flex-col justify-between pb-4">
|
||||||
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
|
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
|
||||||
{t`Are you sure you want to delete this ${isTemplate ? "template" : "board"}?`}
|
{t`Are you sure you want to delete this ${boardTypeLabel}?`}
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
||||||
{t`This action can't be undone.`}
|
{t`This action can't be undone.`}
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ export default function List({
|
|||||||
ref={provided.innerRef}
|
ref={provided.innerRef}
|
||||||
{...provided.draggableProps}
|
{...provided.draggableProps}
|
||||||
{...provided.dragHandleProps}
|
{...provided.dragHandleProps}
|
||||||
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100"
|
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] snap-start rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100 md:snap-align-none"
|
||||||
>
|
>
|
||||||
<div className="mb-2 flex justify-between">
|
<div className="mb-2 flex justify-between">
|
||||||
<form
|
<form
|
||||||
@@ -118,7 +118,7 @@ export default function List({
|
|||||||
}
|
}
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
className="mx-1 inline-flex h-fit items-center rounded-md p-1 px-1 text-sm font-semibold text-dark-50 hover:bg-light-400 disabled:opacity-60 disabled:cursor-not-allowed dark:hover:bg-dark-200"
|
className="mx-1 inline-flex h-fit items-center rounded-md p-1 px-1 text-sm font-semibold text-dark-50 hover:bg-light-400 disabled:cursor-not-allowed disabled:opacity-60 dark:hover:bg-dark-200"
|
||||||
onClick={() => openNewCardForm(list.publicId)}
|
onClick={() => openNewCardForm(list.publicId)}
|
||||||
disabled={!canCreateCard}
|
disabled={!canCreateCard}
|
||||||
>
|
>
|
||||||
|
|||||||
113
apps/web/src/views/board/components/MoveBoardForm.tsx
Normal file
113
apps/web/src/views/board/components/MoveBoardForm.tsx
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
import { useRouter } from "next/navigation";
|
||||||
|
import { t } from "@lingui/core/macro";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
import Button from "~/components/Button";
|
||||||
|
import { useModal } from "~/providers/modal";
|
||||||
|
import { usePopup } from "~/providers/popup";
|
||||||
|
import { useWorkspace } from "~/providers/workspace";
|
||||||
|
import { api } from "~/utils/api";
|
||||||
|
|
||||||
|
export function MoveBoardForm({
|
||||||
|
boardPublicId,
|
||||||
|
}: {
|
||||||
|
boardPublicId: string;
|
||||||
|
}) {
|
||||||
|
const router = useRouter();
|
||||||
|
const { closeModal } = useModal();
|
||||||
|
const { showPopup } = usePopup();
|
||||||
|
const { workspace, availableWorkspaces, switchWorkspace } = useWorkspace();
|
||||||
|
const [targetWorkspacePublicId, setTargetWorkspacePublicId] = useState("");
|
||||||
|
|
||||||
|
const otherWorkspaces = availableWorkspaces.filter(
|
||||||
|
(ws) => ws.publicId !== workspace.publicId && ws.role !== "guest",
|
||||||
|
);
|
||||||
|
|
||||||
|
const moveBoard = api.board.move.useMutation({
|
||||||
|
onSuccess: () => {
|
||||||
|
const targetWorkspace = availableWorkspaces.find(
|
||||||
|
(ws) => ws.publicId === targetWorkspacePublicId,
|
||||||
|
);
|
||||||
|
closeModal();
|
||||||
|
showPopup({
|
||||||
|
header: t`Board moved`,
|
||||||
|
message: t`The board has been moved to ${targetWorkspace?.name ?? t`the workspace`}.`,
|
||||||
|
icon: "success",
|
||||||
|
});
|
||||||
|
if (targetWorkspace) {
|
||||||
|
switchWorkspace(targetWorkspace);
|
||||||
|
} else {
|
||||||
|
router.push("/boards");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onError: (error) => {
|
||||||
|
showPopup({
|
||||||
|
header: t`Unable to move board`,
|
||||||
|
message: error.message,
|
||||||
|
icon: "error",
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleMoveBoard = () => {
|
||||||
|
if (!targetWorkspacePublicId) return;
|
||||||
|
moveBoard.mutate({
|
||||||
|
boardPublicId,
|
||||||
|
targetWorkspacePublicId,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="p-5">
|
||||||
|
<div className="flex w-full flex-col justify-between pb-4">
|
||||||
|
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
|
||||||
|
{t`Move board to another workspace`}
|
||||||
|
</h2>
|
||||||
|
{otherWorkspaces.length === 0 ? (
|
||||||
|
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
||||||
|
{t`You don't have any other workspaces to move this board to.`}
|
||||||
|
</p>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<label
|
||||||
|
htmlFor="target-workspace"
|
||||||
|
className="mb-2 text-sm font-medium text-light-900 dark:text-dark-900"
|
||||||
|
>
|
||||||
|
{t`Destination workspace`}
|
||||||
|
</label>
|
||||||
|
<select
|
||||||
|
id="target-workspace"
|
||||||
|
value={targetWorkspacePublicId}
|
||||||
|
onChange={(e) => setTargetWorkspacePublicId(e.target.value)}
|
||||||
|
className="block w-full rounded-md border-0 bg-dark-300 bg-white/5 py-1.5 text-sm shadow-sm ring-1 ring-inset ring-light-600 placeholder:text-dark-800 focus:ring-2 focus:ring-inset focus:ring-light-700 dark:text-dark-1000 dark:ring-dark-700 dark:focus:ring-dark-700 sm:leading-6"
|
||||||
|
>
|
||||||
|
<option value="">{t`Select a workspace`}</option>
|
||||||
|
{otherWorkspaces.map((ws) => (
|
||||||
|
<option key={ws.publicId} value={ws.publicId}>
|
||||||
|
{ws.name}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
<p className="mt-3 text-sm text-light-800 dark:text-dark-800">
|
||||||
|
{t`Card member assignments will be cleared when moving to a different workspace.`}
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="mt-5 flex justify-end space-x-2 sm:mt-6">
|
||||||
|
<Button onClick={() => closeModal()} variant="secondary">
|
||||||
|
{t`Cancel`}
|
||||||
|
</Button>
|
||||||
|
{otherWorkspaces.length > 0 && (
|
||||||
|
<Button
|
||||||
|
onClick={handleMoveBoard}
|
||||||
|
isLoading={moveBoard.isPending}
|
||||||
|
disabled={!targetWorkspacePublicId}
|
||||||
|
>
|
||||||
|
{t`Move board`}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -42,12 +42,13 @@ const VisibilityButton = ({
|
|||||||
}, [visibility]);
|
}, [visibility]);
|
||||||
|
|
||||||
const isPublic = stateVisibility === "public";
|
const isPublic = stateVisibility === "public";
|
||||||
|
const visibilityLabel = isPublic ? t`public` : t`private`;
|
||||||
|
|
||||||
const updateBoardVisibility = api.board.update.useMutation({
|
const updateBoardVisibility = api.board.update.useMutation({
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
showPopup({
|
showPopup({
|
||||||
header: t`Board visibility updated`,
|
header: t`Board visibility updated`,
|
||||||
message: t`The visibility of your board has been set to ${isPublic ? "public" : "private"}.`,
|
message: t`The visibility of your board has been set to ${visibilityLabel}.`,
|
||||||
icon: "success",
|
icon: "success",
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { useRouter } from "next/router";
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { keepPreviousData } from "@tanstack/react-query";
|
import { keepPreviousData } from "@tanstack/react-query";
|
||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import { DragDropContext, Draggable } from "react-beautiful-dnd";
|
import { DragDropContext, Draggable } from "react-beautiful-dnd";
|
||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
import {
|
import {
|
||||||
@@ -49,6 +49,7 @@ import { DeleteBoardConfirmation } from "./components/DeleteBoardConfirmation";
|
|||||||
import { DeleteListConfirmation } from "./components/DeleteListConfirmation";
|
import { DeleteListConfirmation } from "./components/DeleteListConfirmation";
|
||||||
import Filters from "./components/Filters";
|
import Filters from "./components/Filters";
|
||||||
import List from "./components/List";
|
import List from "./components/List";
|
||||||
|
import { MoveBoardForm } from "./components/MoveBoardForm";
|
||||||
import { NewCardForm } from "./components/NewCardForm";
|
import { NewCardForm } from "./components/NewCardForm";
|
||||||
import { NewListForm } from "./components/NewListForm";
|
import { NewListForm } from "./components/NewListForm";
|
||||||
import { NewTemplateForm } from "./components/NewTemplateForm";
|
import { NewTemplateForm } from "./components/NewTemplateForm";
|
||||||
@@ -84,21 +85,26 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
const { canCreateList, canEditList, canEditCard, canEditBoard } =
|
const { canCreateList, canEditList, canEditCard, canEditBoard } =
|
||||||
usePermissions();
|
usePermissions();
|
||||||
|
|
||||||
const { tooltipContent: createListShortcutTooltipContent } =
|
|
||||||
useKeyboardShortcut({
|
|
||||||
type: "PRESS",
|
|
||||||
stroke: { key: "C" },
|
|
||||||
action: () => boardId && canCreateList && openNewListForm(boardId),
|
|
||||||
description: t`Create new list`,
|
|
||||||
group: "ACTIONS",
|
|
||||||
});
|
|
||||||
|
|
||||||
const boardId = params?.boardId
|
const boardId = params?.boardId
|
||||||
? Array.isArray(params.boardId)
|
? Array.isArray(params.boardId)
|
||||||
? params.boardId[0]
|
? params.boardId[0]
|
||||||
: params.boardId
|
: params.boardId
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
|
const createListShortcut = useMemo(
|
||||||
|
() => ({
|
||||||
|
type: "PRESS" as const,
|
||||||
|
stroke: { key: "C" },
|
||||||
|
action: () => boardId && canCreateList && openNewListForm(boardId),
|
||||||
|
description: t`Create new list`,
|
||||||
|
group: "ACTIONS" as const,
|
||||||
|
}),
|
||||||
|
[boardId, canCreateList],
|
||||||
|
);
|
||||||
|
|
||||||
|
const { tooltipContent: createListShortcutTooltipContent } =
|
||||||
|
useKeyboardShortcut(createListShortcut);
|
||||||
|
|
||||||
const updateBoard = api.board.update.useMutation();
|
const updateBoard = api.board.update.useMutation();
|
||||||
|
|
||||||
const { register, handleSubmit, setValue } = useForm<UpdateBoardInput>({
|
const { register, handleSubmit, setValue } = useForm<UpdateBoardInput>({
|
||||||
@@ -460,6 +466,13 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
/>
|
/>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
modalSize="sm"
|
||||||
|
isVisible={isOpen && modalContentType === "MOVE_BOARD"}
|
||||||
|
>
|
||||||
|
<MoveBoardForm boardPublicId={boardId ?? ""} />
|
||||||
|
</Modal>
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
modalSize="sm"
|
modalSize="sm"
|
||||||
isVisible={isOpen && modalContentType === "CREATE_TEMPLATE"}
|
isVisible={isOpen && modalContentType === "CREATE_TEMPLATE"}
|
||||||
@@ -527,7 +540,7 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageHead
|
<PageHead
|
||||||
title={`${boardData?.name ?? (isTemplate ? t`Board` : t`Template`)} | ${workspace.name ?? t`Workspace`}`}
|
title={`${boardData?.name ?? (isTemplate ? t`Template` : t`Board`)} | ${workspace.name ?? t`Workspace`}`}
|
||||||
/>
|
/>
|
||||||
<div className="relative flex h-full flex-col">
|
<div className="relative flex h-full flex-col">
|
||||||
<PatternedBackground />
|
<PatternedBackground />
|
||||||
@@ -554,7 +567,7 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
)}
|
)}
|
||||||
{!boardData && !isLoading && (
|
{!boardData && !isLoading && (
|
||||||
<p className="order-2 block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem] md:order-1">
|
<p className="order-2 block p-0 py-0 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem] md:order-1">
|
||||||
{t`${isTemplate ? "Template" : "Board"} not found`}
|
{isTemplate ? t`Template not found` : t`Board not found`}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
|
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
|
||||||
@@ -634,7 +647,7 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
<div
|
<div
|
||||||
ref={scrollRef}
|
ref={scrollRef}
|
||||||
onMouseDown={onMouseDown}
|
onMouseDown={onMouseDown}
|
||||||
className={`scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] z-0 flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300`}
|
className={`scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] z-0 flex-1 snap-x snap-mandatory scroll-pl-[10px] overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300 md:snap-none`}
|
||||||
>
|
>
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
<div className="ml-[2rem] flex">
|
<div className="ml-[2rem] flex">
|
||||||
@@ -681,11 +694,11 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
>
|
>
|
||||||
{(provided) => (
|
{(provided) => (
|
||||||
<div
|
<div
|
||||||
className="flex"
|
className="flex w-max"
|
||||||
ref={provided.innerRef}
|
ref={provided.innerRef}
|
||||||
{...provided.droppableProps}
|
{...provided.droppableProps}
|
||||||
>
|
>
|
||||||
<div className="min-w-[2rem]" />
|
<div className="min-w-[10px] md:min-w-[2rem]" />
|
||||||
{boardData.lists.map((list, index) => (
|
{boardData.lists.map((list, index) => (
|
||||||
<List
|
<List
|
||||||
index={index}
|
index={index}
|
||||||
@@ -782,7 +795,7 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
</Droppable>
|
</Droppable>
|
||||||
</List>
|
</List>
|
||||||
))}
|
))}
|
||||||
<div className="min-w-[0.75rem]" />
|
<div className="min-w-[calc(100vw-18rem)] md:min-w-[0.75rem]" />
|
||||||
{provided.placeholder}
|
{provided.placeholder}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ export function BoardsList({ isTemplate, archived = false }: { isTemplate?: bool
|
|||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
const { openModal } = useModal();
|
const { openModal } = useModal();
|
||||||
const { canCreateBoard } = usePermissions();
|
const { canCreateBoard } = usePermissions();
|
||||||
|
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||||
|
const boardLabel = isTemplate ? t`templates` : t`boards`;
|
||||||
|
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
const updateBoard = api.board.update.useMutation({
|
const updateBoard = api.board.update.useMutation({
|
||||||
@@ -60,10 +62,10 @@ export function BoardsList({ isTemplate, archived = false }: { isTemplate?: bool
|
|||||||
<div className="flex flex-col items-center">
|
<div className="flex flex-col items-center">
|
||||||
<HiOutlineRectangleStack className="h-10 w-10 text-light-800 dark:text-dark-800" />
|
<HiOutlineRectangleStack className="h-10 w-10 text-light-800 dark:text-dark-800" />
|
||||||
<p className="mb-2 mt-4 text-[14px] font-bold text-light-1000 dark:text-dark-950">
|
<p className="mb-2 mt-4 text-[14px] font-bold text-light-1000 dark:text-dark-950">
|
||||||
{archived ? t`No archived boards` : t`No ${isTemplate ? "templates" : "boards"}`}
|
{archived ? t`No archived boards` : t`No ${boardLabel}`}
|
||||||
</p>
|
</p>
|
||||||
<p className="text-[14px] text-light-900 dark:text-dark-900">
|
<p className="text-[14px] text-light-900 dark:text-dark-900">
|
||||||
{archived ? t`Boards you archive will appear here.` : t`Get started by creating a new ${isTemplate ? "template" : "board"}`}
|
{archived ? t`Boards you archive will appear here.` : t`Get started by creating a new ${boardTypeLabel}`}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
@@ -77,7 +79,7 @@ export function BoardsList({ isTemplate, archived = false }: { isTemplate?: bool
|
|||||||
}}
|
}}
|
||||||
disabled={!canCreateBoard}
|
disabled={!canCreateBoard}
|
||||||
>
|
>
|
||||||
{t`Create new ${isTemplate ? "template" : "board"}`}
|
{t`Create new ${boardTypeLabel}`}
|
||||||
</Button>
|
</Button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ interface NewBoardInputWithTemplate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
||||||
|
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||||
const utils = api.useUtils();
|
const utils = api.useUtils();
|
||||||
const { closeModal } = useModal();
|
const { closeModal } = useModal();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -117,7 +118,7 @@ export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
<form onSubmit={handleSubmit(onSubmit)}>
|
<form onSubmit={handleSubmit(onSubmit)}>
|
||||||
<div className="px-5 pt-5">
|
<div className="px-5 pt-5">
|
||||||
<div className="text-neutral-9000 flex w-full items-center justify-between pb-4 dark:text-dark-1000">
|
<div className="text-neutral-9000 flex w-full items-center justify-between pb-4 dark:text-dark-1000">
|
||||||
<h2 className="text-sm font-bold">{t`New ${isTemplate ? "template" : "board"}`}</h2>
|
<h2 className="text-sm font-bold">{t`New ${boardTypeLabel}`}</h2>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="hover:bg-li ght-300 rounded p-1 focus:outline-none dark:hover:bg-dark-300"
|
className="hover:bg-li ght-300 rounded p-1 focus:outline-none dark:hover:bg-dark-300"
|
||||||
@@ -163,7 +164,7 @@ export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
)}
|
)}
|
||||||
<div>
|
<div>
|
||||||
<Button type="submit" isLoading={createBoard.isPending}>
|
<Button type="submit" isLoading={createBoard.isPending}>
|
||||||
{t`Create ${isTemplate ? "template" : "board"}`}
|
{t`Create ${boardTypeLabel}`}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,8 +5,12 @@ import {
|
|||||||
ListboxOptions,
|
ListboxOptions,
|
||||||
} from "@headlessui/react";
|
} from "@headlessui/react";
|
||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
import { HiArrowDownTray, HiChevronDown, HiOutlinePlusSmall } from "react-icons/hi2";
|
import { useMemo, useState } from "react";
|
||||||
import { useState } from "react";
|
import {
|
||||||
|
HiArrowDownTray,
|
||||||
|
HiChevronDown,
|
||||||
|
HiOutlinePlusSmall,
|
||||||
|
} from "react-icons/hi2";
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import FeedbackModal from "~/components/FeedbackModal";
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
@@ -22,35 +26,41 @@ import { BoardsList } from "./components/BoardsList";
|
|||||||
import { ImportBoardsForm } from "./components/ImportBoardsForm";
|
import { ImportBoardsForm } from "./components/ImportBoardsForm";
|
||||||
import { NewBoardForm } from "./components/NewBoardForm";
|
import { NewBoardForm } from "./components/NewBoardForm";
|
||||||
|
|
||||||
const boardsTabs = [
|
|
||||||
{ key: "boards" as const, label: t`Active` },
|
|
||||||
{ key: "archived" as const, label: t`Archived` },
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||||
const { openModal, modalContentType, isOpen } = useModal();
|
const { openModal, modalContentType, isOpen } = useModal();
|
||||||
const { workspace } = useWorkspace();
|
const { workspace } = useWorkspace();
|
||||||
const [activeTab, setActiveTab] = useState<"boards" | "archived">("boards");
|
const [activeTab, setActiveTab] = useState<"boards" | "archived">("boards");
|
||||||
const { canCreateBoard } = usePermissions();
|
const { canCreateBoard } = usePermissions();
|
||||||
|
const boardLabel = isTemplate ? t`Templates` : t`Boards`;
|
||||||
|
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||||
|
const boardsTabs = [
|
||||||
|
{ key: "boards" as const, label: t`Active` },
|
||||||
|
{ key: "archived" as const, label: t`Archived` },
|
||||||
|
];
|
||||||
|
|
||||||
const { tooltipContent: createModalShortcutTooltipContent } =
|
const createBoardShortcut = useMemo(
|
||||||
useKeyboardShortcut({
|
() => ({
|
||||||
type: "PRESS",
|
type: "PRESS" as const,
|
||||||
stroke: { key: "C" },
|
stroke: { key: "C" },
|
||||||
action: () => canCreateBoard && openModal("NEW_BOARD"),
|
action: () => canCreateBoard && openModal("NEW_BOARD"),
|
||||||
description: t`Create new ${isTemplate ? "template" : "board"}`,
|
description: t`Create new ${boardTypeLabel}`,
|
||||||
group: "ACTIONS",
|
group: "ACTIONS" as const,
|
||||||
});
|
}),
|
||||||
|
[boardTypeLabel, canCreateBoard, isTemplate, openModal],
|
||||||
|
);
|
||||||
|
|
||||||
|
const { tooltipContent: createModalShortcutTooltipContent } =
|
||||||
|
useKeyboardShortcut(createBoardShortcut);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageHead
|
<PageHead
|
||||||
title={t`${isTemplate ? "Templates" : "Boards"} | ${workspace.name ?? t`Workspace`}`}
|
title={t`${boardLabel} | ${workspace.name ?? t`Workspace`}`}
|
||||||
/>
|
/>
|
||||||
<div className="m-auto h-full max-w-[1100px] p-8 px-5 md:px-28 md:py-12">
|
<div className="m-auto h-full max-w-[1100px] p-8 px-5 md:px-28 md:py-12">
|
||||||
<div className="relative z-10 mb-8 flex w-full items-center justify-between">
|
<div className="relative z-10 mb-8 flex w-full items-center justify-between">
|
||||||
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
|
||||||
{t`${isTemplate ? "Templates" : "Boards"}`}
|
{boardLabel}
|
||||||
</h1>
|
</h1>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
{!isTemplate && (
|
{!isTemplate && (
|
||||||
@@ -137,7 +147,7 @@ export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
onChange={(tab) => setActiveTab(tab)}
|
onChange={(tab) => setActiveTab(tab)}
|
||||||
>
|
>
|
||||||
<div className="relative mb-4">
|
<div className="relative mb-4">
|
||||||
<ListboxButton className="w-full appearance-none rounded-md border-0 bg-light-50 py-3 pl-3 pr-10 text-left text-sm font-semibold text-light-1000 shadow-sm ring-1 ring-inset ring-light-300 dark:bg-dark-50 dark:text-dark-1000 dark:ring-dark-300 dark:focus:ring-dark-500">
|
<ListboxButton className="w-full appearance-none rounded-md border-0 bg-light-50 py-3 pl-3 pr-10 text-left text-sm font-semibold text-light-1000 shadow-sm ring-1 ring-inset ring-light-300 dark:bg-dark-50 dark:text-dark-1000 dark:ring-dark-300 dark:focus:ring-dark-500">
|
||||||
{boardsTabs.find((tab) => tab.key === activeTab)?.label ??
|
{boardsTabs.find((tab) => tab.key === activeTab)?.label ??
|
||||||
"Select a tab"}
|
"Select a tab"}
|
||||||
<HiChevronDown
|
<HiChevronDown
|
||||||
@@ -151,9 +161,10 @@ export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
key={tab.key}
|
key={tab.key}
|
||||||
value={tab.key}
|
value={tab.key}
|
||||||
className={({ selected }) =>
|
className={({ selected }) =>
|
||||||
`relative cursor-pointer select-none py-2 pl-3 pr-9 ${selected
|
`relative cursor-pointer select-none py-2 pl-3 pr-9 ${
|
||||||
? "font-bold text-light-1000 dark:text-dark-1000"
|
selected
|
||||||
: "font-normal text-light-1000 dark:text-dark-1000"
|
? "font-bold text-light-1000 dark:text-dark-1000"
|
||||||
|
: "font-normal text-light-1000 dark:text-dark-1000"
|
||||||
}`
|
}`
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@@ -175,10 +186,11 @@ export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
|||||||
key={tab.key}
|
key={tab.key}
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => setActiveTab(tab.key)}
|
onClick={() => setActiveTab(tab.key)}
|
||||||
className={`whitespace-nowrap px-1 py-0 mt-2 mb-8 text-sm font-semibold transition-colors focus:outline-none ${activeTab === tab.key
|
className={`mb-8 mt-2 whitespace-nowrap px-1 py-0 text-sm font-semibold transition-colors focus:outline-none ${
|
||||||
? "border-light-1000 text-light-1000 dark:border-dark-1000 dark:text-dark-1000"
|
activeTab === tab.key
|
||||||
: "border-transparent text-light-900 hover:border-light-950 hover:text-light-950 dark:text-dark-900 dark:hover:border-white/20 dark:hover:text-dark-950"
|
? "border-light-1000 text-light-1000 dark:border-dark-1000 dark:text-dark-1000"
|
||||||
}`}
|
: "border-transparent text-light-900 hover:border-light-950 hover:text-light-950 dark:text-dark-900 dark:hover:border-white/20 dark:hover:text-dark-950"
|
||||||
|
}`}
|
||||||
>
|
>
|
||||||
{tab.label}
|
{tab.label}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ import { t } from "@lingui/core/macro";
|
|||||||
import { useForm } from "react-hook-form";
|
import { useForm } from "react-hook-form";
|
||||||
import { HiOutlineArrowUp } from "react-icons/hi2";
|
import { HiOutlineArrowUp } from "react-icons/hi2";
|
||||||
|
|
||||||
import Editor from "~/components/Editor";
|
|
||||||
import type { WorkspaceMember } from "~/components/Editor";
|
import type { WorkspaceMember } from "~/components/Editor";
|
||||||
|
import Editor from "~/components/Editor";
|
||||||
import LoadingSpinner from "~/components/LoadingSpinner";
|
import LoadingSpinner from "~/components/LoadingSpinner";
|
||||||
|
import { Tooltip } from "~/components/Tooltip";
|
||||||
import { usePermissions } from "~/hooks/usePermissions";
|
import { usePermissions } from "~/hooks/usePermissions";
|
||||||
import { usePopup } from "~/providers/popup";
|
import { usePopup } from "~/providers/popup";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
@@ -51,6 +52,21 @@ const NewCommentForm = ({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isMac =
|
||||||
|
typeof navigator !== "undefined" && navigator.userAgent.includes("Mac");
|
||||||
|
|
||||||
|
const submitTooltip = (
|
||||||
|
<div className="flex flex-row items-center gap-2 text-[11px]">
|
||||||
|
{t`Submit`}
|
||||||
|
<span className="inline-flex items-center justify-center rounded border border-light-400 bg-light-200 px-1.5 py-0.5 font-mono text-[8px] font-semibold text-neutral-900 dark:border-dark-400 dark:bg-dark-200 dark:text-dark-950">
|
||||||
|
{isMac ? "⌘" : "Ctrl"}
|
||||||
|
</span>
|
||||||
|
<span className="inline-flex items-center justify-center rounded border border-light-400 bg-light-200 px-1.5 py-0.5 font-mono text-[8px] font-semibold text-neutral-900 dark:border-dark-400 dark:bg-dark-200 dark:text-dark-950">
|
||||||
|
Enter
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
if (!canCreateComment) {
|
if (!canCreateComment) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -63,23 +79,26 @@ const NewCommentForm = ({
|
|||||||
<Editor
|
<Editor
|
||||||
content={watch("comment")}
|
content={watch("comment")}
|
||||||
onChange={(value) => setValue("comment", value)}
|
onChange={(value) => setValue("comment", value)}
|
||||||
|
onSubmit={handleSubmit(onSubmit)}
|
||||||
workspaceMembers={workspaceMembers}
|
workspaceMembers={workspaceMembers}
|
||||||
enableYouTubeEmbed={false}
|
enableYouTubeEmbed={false}
|
||||||
placeholder={t`Add comment... (type '/' to open commands or '@' to mention)`}
|
placeholder={t`Add comment... (type '/' to open commands or '@' to mention)`}
|
||||||
disableHeadings={true}
|
disableHeadings={true}
|
||||||
/>
|
/>
|
||||||
<div className="flex justify-end">
|
<div className="flex justify-end">
|
||||||
<button
|
<Tooltip content={submitTooltip} placement="top">
|
||||||
type="submit"
|
<button
|
||||||
disabled={addCommentMutation.isPending}
|
type="submit"
|
||||||
className="flex h-8 w-8 items-center justify-center rounded-full border border-light-600 bg-light-300 hover:bg-light-400 disabled:opacity-50 dark:border-dark-400 dark:bg-dark-200 dark:hover:bg-dark-400"
|
disabled={addCommentMutation.isPending}
|
||||||
>
|
className="flex h-8 w-8 items-center justify-center rounded-full border border-light-600 bg-light-300 hover:bg-light-400 disabled:opacity-50 dark:border-dark-400 dark:bg-dark-200 dark:hover:bg-dark-400"
|
||||||
{addCommentMutation.isPending ? (
|
>
|
||||||
<LoadingSpinner size="sm" />
|
{addCommentMutation.isPending ? (
|
||||||
) : (
|
<LoadingSpinner size="sm" />
|
||||||
<HiOutlineArrowUp />
|
) : (
|
||||||
)}
|
<HiOutlineArrowUp />
|
||||||
</button>
|
)}
|
||||||
|
</button>
|
||||||
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -48,7 +48,11 @@ export default function SelectPlanView() {
|
|||||||
(searchParams.get("billing") as Billing | null) ?? "annual",
|
(searchParams.get("billing") as Billing | null) ?? "annual",
|
||||||
);
|
);
|
||||||
const returnUrl = searchParams.get("returnUrl") ?? "/boards";
|
const returnUrl = searchParams.get("returnUrl") ?? "/boards";
|
||||||
const workspacePublicId = searchParams.get("workspacePublicId");
|
const workspacePublicId =
|
||||||
|
searchParams.get("workspacePublicId") ??
|
||||||
|
(typeof window !== "undefined"
|
||||||
|
? localStorage.getItem("workspacePublicId")
|
||||||
|
: null);
|
||||||
const { data: workspaces } = api.workspace.all.useQuery();
|
const { data: workspaces } = api.workspace.all.useQuery();
|
||||||
const { data: session } = authClient.useSession();
|
const { data: session } = authClient.useSession();
|
||||||
const { data: user } = api.user.getUser.useQuery(undefined, {
|
const { data: user } = api.user.getUser.useQuery(undefined, {
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ export default function PublicBoardView() {
|
|||||||
<div
|
<div
|
||||||
ref={scrollRef}
|
ref={scrollRef}
|
||||||
onMouseDown={onMouseDown}
|
onMouseDown={onMouseDown}
|
||||||
className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative h-full flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300"
|
className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative h-full flex-1 snap-x snap-mandatory scroll-pl-[10px] overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300 md:snap-none"
|
||||||
>
|
>
|
||||||
{isLoading || !router.isReady ? (
|
{isLoading || !router.isReady ? (
|
||||||
<div className="ml-[2rem] flex">
|
<div className="ml-[2rem] flex">
|
||||||
@@ -188,11 +188,11 @@ export default function PublicBoardView() {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<div className="min-w-[2rem]" />
|
<div className="min-w-[10px] md:min-w-[2rem]" />
|
||||||
{data?.lists.map((list) => (
|
{data?.lists.map((list) => (
|
||||||
<div
|
<div
|
||||||
key={list.publicId}
|
key={list.publicId}
|
||||||
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100"
|
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] snap-start rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100 md:snap-align-none"
|
||||||
>
|
>
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<span className="mb-4 block px-4 pt-1 text-sm font-medium text-neutral-900 dark:text-dark-1000">
|
<span className="mb-4 block px-4 pt-1 text-sm font-medium text-neutral-900 dark:text-dark-1000">
|
||||||
@@ -234,7 +234,7 @@ export default function PublicBoardView() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
<div className="min-w-[0.75rem]" />
|
<div className="min-w-[calc(100vw-18rem)] md:min-w-[0.75rem]" />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -61,9 +61,9 @@ services:
|
|||||||
- SMTP_REJECT_UNAUTHORIZED=${SMTP_REJECT_UNAUTHORIZED}
|
- SMTP_REJECT_UNAUTHORIZED=${SMTP_REJECT_UNAUTHORIZED}
|
||||||
|
|
||||||
# Notifications
|
# Notifications
|
||||||
- NOVU_API_KEY=${NOVU_API_KEY}
|
- SUBSCRIBER_API_URL=${SUBSCRIBER_API_URL}
|
||||||
- DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL}
|
- SUBSCRIBER_API_KEY=${SUBSCRIBER_API_KEY}
|
||||||
- EMAIL_UNSUBSCRIBE_SECRET=${EMAIL_UNSUBSCRIBE_SECRET}
|
- SUBSCRIBER_ENVIRONMENT_ID=${SUBSCRIBER_ENVIRONMENT_ID}
|
||||||
|
|
||||||
# S3 storage
|
# S3 storage
|
||||||
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
migrate:
|
migrate:
|
||||||
image: ghcr.io/kanbn/kan-migrate:latest
|
image: kan-migrate:local
|
||||||
container_name: ${CONTAINER_NAME:-kan-migrate}
|
container_name: ${CONTAINER_NAME:-kan-migrate}
|
||||||
networks:
|
networks:
|
||||||
- kan-network
|
- kan-network
|
||||||
@@ -16,7 +16,7 @@ services:
|
|||||||
restart: "no"
|
restart: "no"
|
||||||
|
|
||||||
web:
|
web:
|
||||||
image: ghcr.io/kanbn/kan:latest
|
image: kan:local
|
||||||
container_name: ${CONTAINER_NAME:-kan-web}
|
container_name: ${CONTAINER_NAME:-kan-web}
|
||||||
ports:
|
ports:
|
||||||
- "${WEB_PORT:-3000}:3000"
|
- "${WEB_PORT:-3000}:3000"
|
||||||
|
|||||||
268
packages/api/src/routers/board-move.test.ts
Normal file
268
packages/api/src/routers/board-move.test.ts
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
import { describe, it, expect, vi, beforeEach } from "vitest";
|
||||||
|
import { TRPCError } from "@trpc/server";
|
||||||
|
|
||||||
|
// Mock all imports used by board.ts before importing the router
|
||||||
|
vi.mock("@kan/db/repository/board.repo", () => ({
|
||||||
|
getBoardForMove: vi.fn(),
|
||||||
|
isBoardSlugAvailable: vi.fn(),
|
||||||
|
moveToWorkspace: vi.fn(),
|
||||||
|
getIdByPublicId: vi.fn(),
|
||||||
|
getByPublicId: vi.fn(),
|
||||||
|
getWithListIdsByPublicId: vi.fn(),
|
||||||
|
getWithLatestListIndexByPublicId: vi.fn(),
|
||||||
|
getWorkspaceAndBoardIdByBoardPublicId: vi.fn(),
|
||||||
|
create: vi.fn(),
|
||||||
|
update: vi.fn(),
|
||||||
|
updatePositions: vi.fn(),
|
||||||
|
archive: vi.fn(),
|
||||||
|
deleteBoard: vi.fn(),
|
||||||
|
getAllByWorkspaceId: vi.fn(),
|
||||||
|
createFavorite: vi.fn(),
|
||||||
|
deleteFavorite: vi.fn(),
|
||||||
|
getFavorite: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/db/repository/workspace.repo", () => ({
|
||||||
|
getByPublicId: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/db/repository/card.repo", () => ({
|
||||||
|
getByPublicId: vi.fn(),
|
||||||
|
create: vi.fn(),
|
||||||
|
update: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/db/repository/cardActivity.repo", () => ({
|
||||||
|
create: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/db/repository/label.repo", () => ({
|
||||||
|
create: vi.fn(),
|
||||||
|
getById: vi.fn(),
|
||||||
|
getByPublicId: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/db/repository/list.repo", () => ({
|
||||||
|
create: vi.fn(),
|
||||||
|
getByPublicId: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("../utils/permissions", () => ({
|
||||||
|
assertCanEdit: vi.fn(),
|
||||||
|
assertCanDelete: vi.fn(),
|
||||||
|
assertPermission: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/shared/utils", () => ({
|
||||||
|
generateSlug: vi.fn((name: string) => name.toLowerCase().replace(/\s+/g, "-")),
|
||||||
|
generateUID: vi.fn(() => "abc123"),
|
||||||
|
generateAvatarUrl: vi.fn(),
|
||||||
|
convertDueDateFiltersToRanges: vi.fn(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock("@kan/shared/constants", () => ({
|
||||||
|
colours: [],
|
||||||
|
}));
|
||||||
|
|
||||||
|
import * as boardRepo from "@kan/db/repository/board.repo";
|
||||||
|
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||||
|
import { assertCanEdit, assertPermission } from "../utils/permissions";
|
||||||
|
|
||||||
|
const mockGetBoardForMove = boardRepo.getBoardForMove as ReturnType<typeof vi.fn>;
|
||||||
|
const mockIsBoardSlugAvailable = boardRepo.isBoardSlugAvailable as ReturnType<typeof vi.fn>;
|
||||||
|
const mockMoveToWorkspace = boardRepo.moveToWorkspace as ReturnType<typeof vi.fn>;
|
||||||
|
const mockWorkspaceGetByPublicId = workspaceRepo.getByPublicId as ReturnType<typeof vi.fn>;
|
||||||
|
const mockAssertCanEdit = assertCanEdit as ReturnType<typeof vi.fn>;
|
||||||
|
const mockAssertPermission = assertPermission as ReturnType<typeof vi.fn>;
|
||||||
|
|
||||||
|
describe("board.move", () => {
|
||||||
|
const mockDb = {} as never;
|
||||||
|
const mockUser = { id: "user-123", name: "Test User", email: "test@example.com" };
|
||||||
|
const mockInput = {
|
||||||
|
boardPublicId: "brd-123456789",
|
||||||
|
targetWorkspacePublicId: "ws-target-789",
|
||||||
|
};
|
||||||
|
const mockBoard = {
|
||||||
|
id: 1,
|
||||||
|
name: "My Board",
|
||||||
|
slug: "my-board",
|
||||||
|
type: "board" as const,
|
||||||
|
isArchived: false,
|
||||||
|
workspaceId: 10,
|
||||||
|
createdBy: "user-123",
|
||||||
|
};
|
||||||
|
const mockTargetWorkspace = { id: 20, publicId: "ws-target-789" };
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.clearAllMocks();
|
||||||
|
mockAssertCanEdit.mockResolvedValue(undefined);
|
||||||
|
mockAssertPermission.mockResolvedValue(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws UNAUTHORIZED when user is not authenticated", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
const ctx = { user: null, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws NOT_FOUND when board does not exist", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(null);
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws BAD_REQUEST for template boards", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce({ ...mockBoard, type: "template" });
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws BAD_REQUEST for archived boards", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce({ ...mockBoard, isArchived: true });
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("checks board:edit permission on source workspace", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockAssertCanEdit.mockRejectedValueOnce(
|
||||||
|
new TRPCError({ code: "FORBIDDEN", message: "No permission" }),
|
||||||
|
);
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
|
||||||
|
expect(mockAssertCanEdit).toHaveBeenCalledWith(
|
||||||
|
mockDb,
|
||||||
|
mockUser.id,
|
||||||
|
mockBoard.workspaceId,
|
||||||
|
"board:edit",
|
||||||
|
mockBoard.createdBy,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws NOT_FOUND when target workspace does not exist", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockWorkspaceGetByPublicId.mockResolvedValueOnce(null);
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws NOT_FOUND when target workspace is soft-deleted", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockWorkspaceGetByPublicId.mockResolvedValueOnce({
|
||||||
|
...mockTargetWorkspace,
|
||||||
|
deletedAt: new Date(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws BAD_REQUEST when target is the same workspace", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockWorkspaceGetByPublicId.mockResolvedValueOnce({
|
||||||
|
id: mockBoard.workspaceId,
|
||||||
|
publicId: "ws-target-789",
|
||||||
|
});
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("checks board:create permission on target workspace", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockWorkspaceGetByPublicId.mockResolvedValueOnce(mockTargetWorkspace);
|
||||||
|
mockAssertPermission.mockRejectedValueOnce(
|
||||||
|
new TRPCError({ code: "FORBIDDEN", message: "No permission" }),
|
||||||
|
);
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
boardRouter.createCaller(ctx).move(mockInput),
|
||||||
|
).rejects.toThrow(TRPCError);
|
||||||
|
|
||||||
|
expect(mockAssertPermission).toHaveBeenCalledWith(
|
||||||
|
mockDb,
|
||||||
|
mockUser.id,
|
||||||
|
mockTargetWorkspace.id,
|
||||||
|
"board:create",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("appends UID suffix when slug conflicts in target workspace", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockWorkspaceGetByPublicId.mockResolvedValueOnce(mockTargetWorkspace);
|
||||||
|
mockIsBoardSlugAvailable.mockResolvedValueOnce(false);
|
||||||
|
mockMoveToWorkspace.mockResolvedValueOnce(undefined);
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
await boardRouter.createCaller(ctx).move(mockInput);
|
||||||
|
|
||||||
|
expect(mockMoveToWorkspace).toHaveBeenCalledWith(
|
||||||
|
mockDb,
|
||||||
|
mockBoard.id,
|
||||||
|
mockTargetWorkspace.id,
|
||||||
|
"my-board-abc123",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("moves board successfully with available slug", async () => {
|
||||||
|
const { boardRouter } = await import("./board");
|
||||||
|
mockGetBoardForMove.mockResolvedValueOnce(mockBoard);
|
||||||
|
mockWorkspaceGetByPublicId.mockResolvedValueOnce(mockTargetWorkspace);
|
||||||
|
mockIsBoardSlugAvailable.mockResolvedValueOnce(true);
|
||||||
|
mockMoveToWorkspace.mockResolvedValueOnce(undefined);
|
||||||
|
|
||||||
|
const ctx = { user: mockUser, db: mockDb } as never;
|
||||||
|
|
||||||
|
const result = await boardRouter.createCaller(ctx).move(mockInput);
|
||||||
|
|
||||||
|
expect(result).toEqual({ success: true });
|
||||||
|
expect(mockMoveToWorkspace).toHaveBeenCalledWith(
|
||||||
|
mockDb,
|
||||||
|
mockBoard.id,
|
||||||
|
mockTargetWorkspace.id,
|
||||||
|
"my-board",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -644,6 +644,119 @@ export const boardRouter = createTRPCRouter({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return { success: true };
|
||||||
|
}),
|
||||||
|
move: protectedProcedure
|
||||||
|
.meta({
|
||||||
|
openapi: {
|
||||||
|
method: "POST",
|
||||||
|
path: "/boards/{boardPublicId}/move",
|
||||||
|
summary: "Move board to another workspace",
|
||||||
|
description:
|
||||||
|
"Moves a board and all its contents to a different workspace",
|
||||||
|
tags: ["Boards"],
|
||||||
|
protect: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.input(
|
||||||
|
z.object({
|
||||||
|
boardPublicId: z.string().min(12),
|
||||||
|
targetWorkspacePublicId: z.string().min(12),
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.output(z.object({ success: z.boolean() }))
|
||||||
|
.mutation(async ({ ctx, input }) => {
|
||||||
|
const userId = ctx.user?.id;
|
||||||
|
|
||||||
|
if (!userId)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `User not authenticated`,
|
||||||
|
code: "UNAUTHORIZED",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get source board
|
||||||
|
const board = await boardRepo.getBoardForMove(
|
||||||
|
ctx.db,
|
||||||
|
input.boardPublicId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!board)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Board with public ID ${input.boardPublicId} not found`,
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
});
|
||||||
|
|
||||||
|
if (board.type === "template")
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Templates cannot be moved between workspaces`,
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
});
|
||||||
|
|
||||||
|
if (board.isArchived)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Archived boards cannot be moved. Unarchive the board first.`,
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check permission to edit board in source workspace
|
||||||
|
await assertCanEdit(
|
||||||
|
ctx.db,
|
||||||
|
userId,
|
||||||
|
board.workspaceId,
|
||||||
|
"board:edit",
|
||||||
|
board.createdBy ?? null,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get target workspace. workspaceRepo.getByPublicId does not yet
|
||||||
|
// filter soft-deleted workspaces (legacy: same is true for several
|
||||||
|
// peer callers); guard at this call site so we never move a board
|
||||||
|
// into a tombstoned workspace. A wider fix to make the repo treat
|
||||||
|
// deleted-as-not-found is a separate concern.
|
||||||
|
const targetWorkspace = await workspaceRepo.getByPublicId(
|
||||||
|
ctx.db,
|
||||||
|
input.targetWorkspacePublicId,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!targetWorkspace || targetWorkspace.deletedAt)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Target workspace not found`,
|
||||||
|
code: "NOT_FOUND",
|
||||||
|
});
|
||||||
|
|
||||||
|
if (targetWorkspace.id === board.workspaceId)
|
||||||
|
throw new TRPCError({
|
||||||
|
message: `Board is already in this workspace`,
|
||||||
|
code: "BAD_REQUEST",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check permission to create boards in target workspace
|
||||||
|
await assertPermission(
|
||||||
|
ctx.db,
|
||||||
|
userId,
|
||||||
|
targetWorkspace.id,
|
||||||
|
"board:create",
|
||||||
|
);
|
||||||
|
|
||||||
|
let slug = board.slug ?? generateSlug(board.name);
|
||||||
|
|
||||||
|
const isSlugAvailable = await boardRepo.isBoardSlugAvailable(
|
||||||
|
ctx.db,
|
||||||
|
slug,
|
||||||
|
targetWorkspace.id,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isSlugAvailable) {
|
||||||
|
slug = `${slug}-${generateUID()}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move the board
|
||||||
|
await boardRepo.moveToWorkspace(
|
||||||
|
ctx.db,
|
||||||
|
board.id,
|
||||||
|
targetWorkspace.id,
|
||||||
|
slug,
|
||||||
|
);
|
||||||
|
|
||||||
return { success: true };
|
return { success: true };
|
||||||
}),
|
}),
|
||||||
checkSlugAvailability: publicProcedure
|
checkSlugAvailability: publicProcedure
|
||||||
|
|||||||
@@ -8,20 +8,24 @@ import * as checklistRepo from "@kan/db/repository/checklist.repo";
|
|||||||
import * as labelRepo from "@kan/db/repository/label.repo";
|
import * as labelRepo from "@kan/db/repository/label.repo";
|
||||||
import * as listRepo from "@kan/db/repository/list.repo";
|
import * as listRepo from "@kan/db/repository/list.repo";
|
||||||
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
|
||||||
|
import { generateAttachmentUrl, generateAvatarUrl } from "@kan/shared/utils";
|
||||||
|
|
||||||
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
|
||||||
import {
|
import {
|
||||||
cardCreateResponseSchema,
|
|
||||||
cardUpdateResponseSchema,
|
|
||||||
cardDetailSchema,
|
|
||||||
commentResponseSchema,
|
|
||||||
commentDeleteResponseSchema,
|
|
||||||
activityItemSchema,
|
activityItemSchema,
|
||||||
|
cardCreateResponseSchema,
|
||||||
|
cardDetailSchema,
|
||||||
|
cardUpdateResponseSchema,
|
||||||
|
commentDeleteResponseSchema,
|
||||||
|
commentResponseSchema,
|
||||||
} from "../schemas";
|
} from "../schemas";
|
||||||
|
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
||||||
import { mergeActivities } from "../utils/activities";
|
import { mergeActivities } from "../utils/activities";
|
||||||
import { sendMentionEmails } from "../utils/notifications";
|
import { sendMentionEmails } from "../utils/notifications";
|
||||||
import { assertCanDelete, assertCanEdit, assertPermission } from "../utils/permissions";
|
import {
|
||||||
import { generateAttachmentUrl, generateAvatarUrl } from "@kan/shared/utils";
|
assertCanDelete,
|
||||||
|
assertCanEdit,
|
||||||
|
assertPermission,
|
||||||
|
} from "../utils/permissions";
|
||||||
import {
|
import {
|
||||||
createCardWebhookPayload,
|
createCardWebhookPayload,
|
||||||
sendWebhooksForWorkspace,
|
sendWebhooksForWorkspace,
|
||||||
@@ -246,7 +250,12 @@ export const cardRouter = createTRPCRouter({
|
|||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
});
|
});
|
||||||
|
|
||||||
await assertPermission(ctx.db, userId, card.workspaceId, "comment:create");
|
await assertPermission(
|
||||||
|
ctx.db,
|
||||||
|
userId,
|
||||||
|
card.workspaceId,
|
||||||
|
"comment:create",
|
||||||
|
);
|
||||||
|
|
||||||
const newComment = await cardCommentRepo.create(ctx.db, {
|
const newComment = await cardCommentRepo.create(ctx.db, {
|
||||||
comment: input.comment,
|
comment: input.comment,
|
||||||
@@ -324,7 +333,7 @@ export const cardRouter = createTRPCRouter({
|
|||||||
input.commentPublicId,
|
input.commentPublicId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!existingComment)
|
if (!existingComment || existingComment.cardId !== card.id)
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
message: `Comment with public ID ${input.commentPublicId} not found`,
|
message: `Comment with public ID ${input.commentPublicId} not found`,
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
@@ -412,7 +421,7 @@ export const cardRouter = createTRPCRouter({
|
|||||||
input.commentPublicId,
|
input.commentPublicId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!existingComment)
|
if (!existingComment || existingComment.cardId !== card.id)
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
message: `Comment with public ID ${input.commentPublicId} not found`,
|
message: `Comment with public ID ${input.commentPublicId} not found`,
|
||||||
code: "NOT_FOUND",
|
code: "NOT_FOUND",
|
||||||
@@ -901,10 +910,7 @@ export const cardRouter = createTRPCRouter({
|
|||||||
| undefined;
|
| undefined;
|
||||||
|
|
||||||
if (input.listPublicId) {
|
if (input.listPublicId) {
|
||||||
newList = await listRepo.getByPublicId(
|
newList = await listRepo.getByPublicId(ctx.db, input.listPublicId);
|
||||||
ctx.db,
|
|
||||||
input.listPublicId,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!newList)
|
if (!newList)
|
||||||
throw new TRPCError({
|
throw new TRPCError({
|
||||||
@@ -1048,12 +1054,14 @@ export const cardRouter = createTRPCRouter({
|
|||||||
) {
|
) {
|
||||||
webhookChanges.dueDate = { from: previousDueDate, to: input.dueDate };
|
webhookChanges.dueDate = { from: previousDueDate, to: input.dueDate };
|
||||||
}
|
}
|
||||||
const movedToNewList = Boolean(newListId && existingCard.listId !== newListId);
|
const movedToNewList = Boolean(
|
||||||
|
newListId && existingCard.listId !== newListId,
|
||||||
|
);
|
||||||
const currentWebhookListPublicId = movedToNewList
|
const currentWebhookListPublicId = movedToNewList
|
||||||
? input.listPublicId!
|
? input.listPublicId!
|
||||||
: existingCard.list.publicId;
|
: existingCard.list.publicId;
|
||||||
const currentWebhookListName = movedToNewList
|
const currentWebhookListName = movedToNewList
|
||||||
? newList?.name ?? card.listName
|
? (newList?.name ?? card.listName)
|
||||||
: existingCard.list.name;
|
: existingCard.list.name;
|
||||||
|
|
||||||
if (movedToNewList) {
|
if (movedToNewList) {
|
||||||
@@ -1291,7 +1299,10 @@ export const cardRouter = createTRPCRouter({
|
|||||||
|
|
||||||
if (input.copyLabels && sourceCard.labels?.length) {
|
if (input.copyLabels && sourceCard.labels?.length) {
|
||||||
const labelPublicIds = sourceCard.labels.map((l) => l.publicId);
|
const labelPublicIds = sourceCard.labels.map((l) => l.publicId);
|
||||||
const labels = await labelRepo.getAllByPublicIds(ctx.db, labelPublicIds);
|
const labels = await labelRepo.getAllByPublicIds(
|
||||||
|
ctx.db,
|
||||||
|
labelPublicIds,
|
||||||
|
);
|
||||||
if (labels.length) {
|
if (labels.length) {
|
||||||
const labelsInsert = labels.map((label) => ({
|
const labelsInsert = labels.map((label) => ({
|
||||||
cardId: newCard.id,
|
cardId: newCard.id,
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
import { describe, it, expect, vi, beforeEach } from "vitest";
|
import { env } from "next-runtime-env";
|
||||||
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import * as memberRepo from "@kan/db/repository/member.repo";
|
||||||
|
|
||||||
|
import { createDatabaseHooks } from "./hooks";
|
||||||
|
|
||||||
vi.mock("next-runtime-env", () => ({
|
vi.mock("next-runtime-env", () => ({
|
||||||
env: vi.fn(),
|
env: vi.fn(),
|
||||||
@@ -15,11 +20,11 @@ vi.mock("@kan/db/repository/user.repo", () => ({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
vi.mock("@kan/email", () => ({
|
vi.mock("@kan/email", () => ({
|
||||||
notificationClient: null,
|
createSubscriber: vi.fn(),
|
||||||
|
triggerSubscriberWorkflow: vi.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
vi.mock("@kan/shared", () => ({
|
vi.mock("@kan/shared", () => ({
|
||||||
createEmailUnsubscribeLink: vi.fn(),
|
|
||||||
createS3Client: vi.fn(),
|
createS3Client: vi.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -27,17 +32,10 @@ vi.mock("@aws-sdk/client-s3", () => ({
|
|||||||
PutObjectCommand: vi.fn(),
|
PutObjectCommand: vi.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
vi.mock("@novu/api/models/components", () => ({
|
|
||||||
ChatOrPushProviderEnum: { Discord: "discord" },
|
|
||||||
}));
|
|
||||||
|
|
||||||
import { env } from "next-runtime-env";
|
|
||||||
import * as memberRepo from "@kan/db/repository/member.repo";
|
|
||||||
import { createDatabaseHooks } from "./hooks";
|
|
||||||
|
|
||||||
const mockEnv = env as ReturnType<typeof vi.fn>;
|
const mockEnv = env as ReturnType<typeof vi.fn>;
|
||||||
const mockGetByEmailAndStatus =
|
const mockGetByEmailAndStatus = memberRepo.getByEmailAndStatus as ReturnType<
|
||||||
memberRepo.getByEmailAndStatus as ReturnType<typeof vi.fn>;
|
typeof vi.fn
|
||||||
|
>;
|
||||||
|
|
||||||
const db = {} as Parameters<typeof createDatabaseHooks>[0];
|
const db = {} as Parameters<typeof createDatabaseHooks>[0];
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,18 @@
|
|||||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||||
import { ChatOrPushProviderEnum } from "@novu/api/models/components";
|
|
||||||
import { createAuthMiddleware } from "better-auth/api";
|
import { createAuthMiddleware } from "better-auth/api";
|
||||||
import { env } from "next-runtime-env";
|
import { env } from "next-runtime-env";
|
||||||
|
|
||||||
import type { dbClient } from "@kan/db/client";
|
import type { dbClient } from "@kan/db/client";
|
||||||
import * as memberRepo from "@kan/db/repository/member.repo";
|
import * as memberRepo from "@kan/db/repository/member.repo";
|
||||||
import * as userRepo from "@kan/db/repository/user.repo";
|
import * as userRepo from "@kan/db/repository/user.repo";
|
||||||
import { notificationClient } from "@kan/email";
|
import { createSubscriber, triggerSubscriberWorkflow } from "@kan/email";
|
||||||
import { createLogger } from "@kan/logger";
|
import { createLogger } from "@kan/logger";
|
||||||
import { createEmailUnsubscribeLink, createS3Client } from "@kan/shared";
|
import { createS3Client } from "@kan/shared";
|
||||||
|
|
||||||
const log = createLogger("auth");
|
|
||||||
|
|
||||||
import { downloadImage } from "./utils";
|
import { downloadImage } from "./utils";
|
||||||
|
|
||||||
|
const log = createLogger("auth");
|
||||||
|
|
||||||
type BetterAuthUser = {
|
type BetterAuthUser = {
|
||||||
id: string;
|
id: string;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
@@ -94,53 +93,49 @@ export function createDatabaseHooks(db: dbClient) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notificationClient) {
|
const [firstName, ...rest] = (user.name || "")
|
||||||
try {
|
.split(" ")
|
||||||
const [firstName, ...rest] = (user.name || "")
|
.filter(Boolean);
|
||||||
.split(" ")
|
const lastName = rest.length ? rest.join(" ") : undefined;
|
||||||
.filter(Boolean);
|
|
||||||
const lastName = rest.length ? rest.join(" ") : undefined;
|
|
||||||
const avatarUrl = avatarKey
|
|
||||||
? `${env("NEXT_PUBLIC_STORAGE_URL")}/${env("NEXT_PUBLIC_AVATAR_BUCKET_NAME")}/${avatarKey}`
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
const unsubscribeUrl = await createEmailUnsubscribeLink(user.id);
|
try {
|
||||||
|
const avatarUrl = avatarKey
|
||||||
|
? `${env("NEXT_PUBLIC_STORAGE_URL")}/${env("NEXT_PUBLIC_AVATAR_BUCKET_NAME")}/${avatarKey}`
|
||||||
|
: undefined;
|
||||||
|
|
||||||
log.info({ workflowId: "user-signup", userId: user.id, email: user.email }, "Triggering Novu workflow");
|
await createSubscriber({
|
||||||
await notificationClient.trigger({
|
publicId: user.id,
|
||||||
to: {
|
email: user.email,
|
||||||
subscriberId: user.id,
|
externalId: user.id,
|
||||||
firstName: firstName,
|
firstName,
|
||||||
lastName: lastName,
|
lastName,
|
||||||
email: user.email,
|
name: user.name,
|
||||||
avatar: avatarUrl,
|
attributes: {
|
||||||
data: {
|
avatarUrl,
|
||||||
emailVerified: user.emailVerified,
|
emailVerified: user.emailVerified,
|
||||||
stripeCustomerId: user.stripeCustomerId,
|
stripeCustomerId: user.stripeCustomerId,
|
||||||
createdAt: user.createdAt,
|
createdAt: user.createdAt,
|
||||||
updatedAt: user.updatedAt,
|
updatedAt: user.updatedAt,
|
||||||
},
|
},
|
||||||
},
|
});
|
||||||
payload: {
|
} catch (error) {
|
||||||
emailUnsubscribeUrl: unsubscribeUrl,
|
log.error({ err: error }, "Error creating subscriber");
|
||||||
},
|
}
|
||||||
workflowId: "user-signup",
|
|
||||||
});
|
|
||||||
log.info({ workflowId: "user-signup", userId: user.id }, "Novu workflow triggered");
|
|
||||||
|
|
||||||
await notificationClient.subscribers.credentials.update(
|
try {
|
||||||
{
|
log.info(
|
||||||
providerId: ChatOrPushProviderEnum.Discord,
|
{ workflowId: "user-signup", userId: user.id, email: user.email },
|
||||||
credentials: {
|
"Triggering user-signup workflow",
|
||||||
webhookUrl: env("DISCORD_WEBHOOK_URL"),
|
);
|
||||||
},
|
await triggerSubscriberWorkflow("user-signup", {
|
||||||
integrationIdentifier: "discord",
|
publicId: user.id,
|
||||||
},
|
});
|
||||||
user.id,
|
log.info(
|
||||||
);
|
{ workflowId: "user-signup", userId: user.id },
|
||||||
} catch (error) {
|
"user-signup workflow triggered",
|
||||||
log.error({ err: error }, "Error adding user to notification client");
|
);
|
||||||
}
|
} catch (error) {
|
||||||
|
log.error({ err: error }, "Error triggering user-signup workflow");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ import type Stripe from "stripe";
|
|||||||
|
|
||||||
import type { dbClient } from "@kan/db/client";
|
import type { dbClient } from "@kan/db/client";
|
||||||
import * as userRepo from "@kan/db/repository/user.repo";
|
import * as userRepo from "@kan/db/repository/user.repo";
|
||||||
import { notificationClient } from "@kan/email";
|
import { triggerSubscriberWorkflow } from "@kan/email";
|
||||||
import { createLogger } from "@kan/logger";
|
import { createLogger } from "@kan/logger";
|
||||||
import { createEmailUnsubscribeLink } from "@kan/shared";
|
|
||||||
|
|
||||||
const log = createLogger("auth");
|
const log = createLogger("auth");
|
||||||
|
|
||||||
@@ -24,30 +23,22 @@ export async function triggerWorkflow(
|
|||||||
cancellationDetails?: Stripe.Subscription.CancellationDetails | null,
|
cancellationDetails?: Stripe.Subscription.CancellationDetails | null,
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
if (!subscription.stripeCustomerId || !notificationClient) return;
|
if (!subscription.stripeCustomerId) return;
|
||||||
|
|
||||||
const user = await userRepo.getByStripeCustomerId(
|
const user = await userRepo.getByStripeCustomerId(
|
||||||
db,
|
db,
|
||||||
subscription.stripeCustomerId,
|
subscription.stripeCustomerId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!user || !notificationClient) return;
|
if (!user) return;
|
||||||
|
|
||||||
const unsubscribeUrl = await createEmailUnsubscribeLink(user.id);
|
log.info({ workflowId, userId: user.id }, "Triggering workflow");
|
||||||
|
await triggerSubscriberWorkflow(
|
||||||
log.info({ workflowId, userId: user.id }, "Triggering Novu workflow");
|
|
||||||
await notificationClient.trigger({
|
|
||||||
to: {
|
|
||||||
subscriberId: user.id,
|
|
||||||
},
|
|
||||||
payload: {
|
|
||||||
...subscription,
|
|
||||||
cancellationDetails,
|
|
||||||
emailUnsubscribeUrl: unsubscribeUrl,
|
|
||||||
},
|
|
||||||
workflowId,
|
workflowId,
|
||||||
});
|
{ publicId: user.id },
|
||||||
log.info({ workflowId, userId: user.id }, "Novu workflow triggered");
|
{ ...subscription, cancellationDetails },
|
||||||
|
);
|
||||||
|
log.info({ workflowId, userId: user.id }, "Workflow triggered");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.error({ err: error, workflowId }, "Error triggering workflow");
|
log.error({ err: error, workflowId }, "Error triggering workflow");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -724,6 +724,30 @@ export const getWorkspaceAndBoardIdByBoardPublicId = async (
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the board fields needed by the move mutation:
|
||||||
|
* identity, naming, type guards, and workspace ownership.
|
||||||
|
* Soft-deleted boards are excluded — moving a tombstoned board has
|
||||||
|
* no defensible semantics.
|
||||||
|
*/
|
||||||
|
export const getBoardForMove = async (
|
||||||
|
db: dbClient,
|
||||||
|
boardPublicId: string,
|
||||||
|
) => {
|
||||||
|
return db.query.boards.findFirst({
|
||||||
|
columns: {
|
||||||
|
id: true,
|
||||||
|
name: true,
|
||||||
|
slug: true,
|
||||||
|
type: true,
|
||||||
|
isArchived: true,
|
||||||
|
workspaceId: true,
|
||||||
|
createdBy: true,
|
||||||
|
},
|
||||||
|
where: and(eq(boards.publicId, boardPublicId), isNull(boards.deletedAt)),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const isBoardSlugAvailable = async (
|
export const isBoardSlugAvailable = async (
|
||||||
db: dbClient,
|
db: dbClient,
|
||||||
boardSlug: string,
|
boardSlug: string,
|
||||||
@@ -969,6 +993,61 @@ export const createFromSnapshot = async (
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const moveToWorkspace = async (
|
||||||
|
db: dbClient,
|
||||||
|
boardId: number,
|
||||||
|
targetWorkspaceId: number,
|
||||||
|
newSlug?: string,
|
||||||
|
) => {
|
||||||
|
return db.transaction(async (tx) => {
|
||||||
|
// Update the board's workspace (and slug if provided)
|
||||||
|
const [updatedBoard] = await tx
|
||||||
|
.update(boards)
|
||||||
|
.set({
|
||||||
|
workspaceId: targetWorkspaceId,
|
||||||
|
...(newSlug && { slug: newSlug }),
|
||||||
|
updatedAt: new Date(),
|
||||||
|
})
|
||||||
|
.where(eq(boards.id, boardId))
|
||||||
|
.returning({
|
||||||
|
publicId: boards.publicId,
|
||||||
|
name: boards.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!updatedBoard) throw new Error("Failed to move board");
|
||||||
|
|
||||||
|
// Get every card ID ever belonging to this board, including
|
||||||
|
// soft-deleted cards under soft-deleted lists. Member assignments
|
||||||
|
// point at workspace-scoped members that no longer exist after
|
||||||
|
// the move; if we leave assignments on soft-deleted cards, a later
|
||||||
|
// restore would resurrect rogue references to the old workspace.
|
||||||
|
const boardLists = await tx
|
||||||
|
.select({ id: lists.id })
|
||||||
|
.from(lists)
|
||||||
|
.where(eq(lists.boardId, boardId));
|
||||||
|
|
||||||
|
if (boardLists.length > 0) {
|
||||||
|
const listIds = boardLists.map((l) => l.id);
|
||||||
|
|
||||||
|
const boardCards = await tx
|
||||||
|
.select({ id: cards.id })
|
||||||
|
.from(cards)
|
||||||
|
.where(inArray(cards.listId, listIds));
|
||||||
|
|
||||||
|
if (boardCards.length > 0) {
|
||||||
|
const cardIds = boardCards.map((c) => c.id);
|
||||||
|
|
||||||
|
// Clear all card member assignments (they reference workspace-scoped members)
|
||||||
|
await tx
|
||||||
|
.delete(cardToWorkspaceMembers)
|
||||||
|
.where(inArray(cardToWorkspaceMembers.cardId, cardIds));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return updatedBoard;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const addUserFavorite = async (
|
export const addUserFavorite = async (
|
||||||
db: dbClient,
|
db: dbClient,
|
||||||
userId: string,
|
userId: string,
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ export const getByPublicId = (db: dbClient, publicId: string) => {
|
|||||||
publicId: true,
|
publicId: true,
|
||||||
comment: true,
|
comment: true,
|
||||||
createdBy: true,
|
createdBy: true,
|
||||||
|
cardId: true,
|
||||||
},
|
},
|
||||||
where: eq(comments.publicId, publicId),
|
where: eq(comments.publicId, publicId),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ export const getByPublicId = (db: dbClient, workspacePublicId: string) => {
|
|||||||
name: true,
|
name: true,
|
||||||
plan: true,
|
plan: true,
|
||||||
slug: true,
|
slug: true,
|
||||||
|
deletedAt: true,
|
||||||
createdBy: true,
|
createdBy: true,
|
||||||
},
|
},
|
||||||
where: eq(workspaces.publicId, workspacePublicId),
|
where: eq(workspaces.publicId, workspacePublicId),
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kan/logger": "workspace:^",
|
"@kan/logger": "workspace:^",
|
||||||
"@novu/api": "^3.11.0",
|
|
||||||
"@react-email/components": "^1.0.1",
|
"@react-email/components": "^1.0.1",
|
||||||
"nodemailer": "^7.0.3",
|
"nodemailer": "^7.0.3",
|
||||||
"react-email": "^5.0.6"
|
"react-email": "^5.0.6"
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
export const name = "email";
|
export const name = "email";
|
||||||
|
|
||||||
export { sendEmail } from "./sendEmail";
|
export { sendEmail } from "./sendEmail";
|
||||||
export { notificationClient } from "./notificationClient";
|
export {
|
||||||
|
createSubscriber,
|
||||||
|
updateSubscriberPreferences,
|
||||||
|
triggerSubscriberWorkflow,
|
||||||
|
} from "./subscriberClient";
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
import { Novu } from "@novu/api";
|
|
||||||
|
|
||||||
export const notificationClient =
|
|
||||||
process.env.NEXT_PUBLIC_KAN_ENV === "cloud" && process.env.NOVU_API_KEY
|
|
||||||
? new Novu({ secretKey: process.env.NOVU_API_KEY })
|
|
||||||
: null;
|
|
||||||
115
packages/email/src/subscriberClient.ts
Normal file
115
packages/email/src/subscriberClient.ts
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
import { createLogger } from "@kan/logger";
|
||||||
|
|
||||||
|
const log = createLogger("subscriberClient");
|
||||||
|
|
||||||
|
export const subscriberClient =
|
||||||
|
process.env.NEXT_PUBLIC_KAN_ENV === "cloud" &&
|
||||||
|
process.env.SUBSCRIBER_API_URL &&
|
||||||
|
process.env.SUBSCRIBER_API_KEY &&
|
||||||
|
process.env.SUBSCRIBER_ENVIRONMENT_ID
|
||||||
|
? {
|
||||||
|
apiUrl: process.env.SUBSCRIBER_API_URL,
|
||||||
|
apiKey: process.env.SUBSCRIBER_API_KEY,
|
||||||
|
environmentId: process.env.SUBSCRIBER_ENVIRONMENT_ID,
|
||||||
|
}
|
||||||
|
: null;
|
||||||
|
|
||||||
|
async function subscriberRequest(
|
||||||
|
method: string,
|
||||||
|
path: string,
|
||||||
|
body: unknown,
|
||||||
|
errorMessage: string,
|
||||||
|
) {
|
||||||
|
if (!subscriberClient) return;
|
||||||
|
|
||||||
|
const url = `${subscriberClient.apiUrl}${path}`;
|
||||||
|
|
||||||
|
log.debug({ method, url, body }, "subscriber.dev request");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method,
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"X-API-Key": subscriberClient.apiKey,
|
||||||
|
},
|
||||||
|
body: JSON.stringify(body),
|
||||||
|
});
|
||||||
|
|
||||||
|
const responseBody = await response.text().catch(() => undefined);
|
||||||
|
|
||||||
|
log.debug(
|
||||||
|
{ method, url, status: response.status, body: responseBody },
|
||||||
|
"subscriber.dev response",
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
log.error(
|
||||||
|
{ status: response.status, body: responseBody },
|
||||||
|
errorMessage,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
log.error({ err: error }, errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CreateSubscriberInput {
|
||||||
|
publicId: string;
|
||||||
|
email: string;
|
||||||
|
externalId: string;
|
||||||
|
firstName?: string;
|
||||||
|
lastName?: string;
|
||||||
|
name?: string;
|
||||||
|
attributes?: Record<string, unknown>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createSubscriber(input: CreateSubscriberInput) {
|
||||||
|
if (!subscriberClient) return;
|
||||||
|
|
||||||
|
await subscriberRequest(
|
||||||
|
"POST",
|
||||||
|
`/environments/${subscriberClient.environmentId}/subscribers`,
|
||||||
|
input,
|
||||||
|
"Failed to create subscriber.dev subscriber",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface UpdateSubscriberPreferencesInput {
|
||||||
|
email: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateSubscriberPreferences(
|
||||||
|
subscriberId: string,
|
||||||
|
input: UpdateSubscriberPreferencesInput,
|
||||||
|
) {
|
||||||
|
if (!subscriberClient) return;
|
||||||
|
|
||||||
|
await subscriberRequest(
|
||||||
|
"PATCH",
|
||||||
|
`/environments/${subscriberClient.environmentId}/subscribers/${subscriberId}/preferences`,
|
||||||
|
input,
|
||||||
|
"Failed to update subscriber preferences",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TriggerWorkflowSubscriberInput {
|
||||||
|
publicId?: string;
|
||||||
|
externalId?: string;
|
||||||
|
email?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function triggerSubscriberWorkflow(
|
||||||
|
key: string,
|
||||||
|
subscriber: TriggerWorkflowSubscriberInput,
|
||||||
|
payload?: Record<string, unknown>,
|
||||||
|
) {
|
||||||
|
if (!subscriberClient) return;
|
||||||
|
|
||||||
|
await subscriberRequest(
|
||||||
|
"POST",
|
||||||
|
`/environments/${subscriberClient.environmentId}/workflows/trigger`,
|
||||||
|
{ key, subscriber, payload },
|
||||||
|
"Failed to trigger subscriber.dev workflow",
|
||||||
|
);
|
||||||
|
}
|
||||||
29
packages/mcp/package.json
Normal file
29
packages/mcp/package.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name": "@kan/mcp",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "MCP server for Kan — control workspaces, boards, lists, and cards via AI",
|
||||||
|
"type": "module",
|
||||||
|
"bin": {
|
||||||
|
"kan-mcp": "./dist/index.js"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"dist",
|
||||||
|
"README.md"
|
||||||
|
],
|
||||||
|
"publishConfig": {
|
||||||
|
"access": "public"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc --noEmit false --declaration false --emitDeclarationOnly false --outDir dist",
|
||||||
|
"clean": "git clean -xdf .cache .turbo dist node_modules",
|
||||||
|
"typecheck": "tsc --noEmit"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@modelcontextprotocol/sdk": "^1.11.0",
|
||||||
|
"zod": "catalog:"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@kan/tsconfig": "workspace:*",
|
||||||
|
"typescript": "catalog:"
|
||||||
|
}
|
||||||
|
}
|
||||||
64
packages/mcp/src/client.ts
Normal file
64
packages/mcp/src/client.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
export interface KanConfig {
|
||||||
|
baseUrl: string;
|
||||||
|
apiToken: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getConfig(): KanConfig {
|
||||||
|
const baseUrl = process.env["KAN_BASE_URL"];
|
||||||
|
const apiToken = process.env["KAN_API_TOKEN"];
|
||||||
|
|
||||||
|
if (!baseUrl) {
|
||||||
|
throw new Error("KAN_BASE_URL environment variable is required");
|
||||||
|
}
|
||||||
|
if (!apiToken) {
|
||||||
|
throw new Error("KAN_API_TOKEN environment variable is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
baseUrl: baseUrl.replace(/\/$/, ""),
|
||||||
|
apiToken,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export class KanApiError extends Error {
|
||||||
|
constructor(
|
||||||
|
public readonly status: number,
|
||||||
|
public readonly statusText: string,
|
||||||
|
public readonly body: unknown,
|
||||||
|
) {
|
||||||
|
super(`Kan API error ${status} ${statusText}: ${JSON.stringify(body)}`);
|
||||||
|
this.name = "KanApiError";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function kanRequest<T>(
|
||||||
|
method: string,
|
||||||
|
path: string,
|
||||||
|
body?: unknown,
|
||||||
|
): Promise<T> {
|
||||||
|
const config = getConfig();
|
||||||
|
const url = `${config.baseUrl}/api/v1${path}`;
|
||||||
|
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method,
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${config.apiToken}`,
|
||||||
|
},
|
||||||
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
||||||
|
});
|
||||||
|
|
||||||
|
let data: unknown;
|
||||||
|
const contentType = res.headers.get("content-type") ?? "";
|
||||||
|
if (contentType.includes("application/json")) {
|
||||||
|
data = await res.json();
|
||||||
|
} else {
|
||||||
|
data = await res.text();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
throw new KanApiError(res.status, res.statusText, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data as T;
|
||||||
|
}
|
||||||
27
packages/mcp/src/index.ts
Normal file
27
packages/mcp/src/index.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
||||||
|
|
||||||
|
import { registerWorkspaceTools } from "./tools/workspace.js";
|
||||||
|
import { registerBoardTools } from "./tools/board.js";
|
||||||
|
import { registerListTools } from "./tools/list.js";
|
||||||
|
import { registerCardTools } from "./tools/card.js";
|
||||||
|
import { registerChecklistTools } from "./tools/checklist.js";
|
||||||
|
import { registerLabelTools } from "./tools/label.js";
|
||||||
|
import { registerMemberTools } from "./tools/member.js";
|
||||||
|
|
||||||
|
const server = new McpServer({
|
||||||
|
name: "kan",
|
||||||
|
version: "0.1.0",
|
||||||
|
});
|
||||||
|
|
||||||
|
registerWorkspaceTools(server);
|
||||||
|
registerBoardTools(server);
|
||||||
|
registerListTools(server);
|
||||||
|
registerCardTools(server);
|
||||||
|
registerChecklistTools(server);
|
||||||
|
registerLabelTools(server);
|
||||||
|
registerMemberTools(server);
|
||||||
|
|
||||||
|
const transport = new StdioServerTransport();
|
||||||
|
await server.connect(transport);
|
||||||
158
packages/mcp/src/tools/board.ts
Normal file
158
packages/mcp/src/tools/board.ts
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
export function registerBoardTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"list_boards",
|
||||||
|
"List all boards in a workspace. Requires the workspace publicId — use find_workspace_by_name first if you only know the workspace name.",
|
||||||
|
{ workspacePublicId: z.string().min(12).describe("The workspace's 12-character public ID (not the name). Get it from list_workspaces or find_workspace_by_name first.") },
|
||||||
|
async ({ workspacePublicId }) => {
|
||||||
|
const data = await kanRequest("GET", `/workspaces/${workspacePublicId}/boards`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"find_board_by_name",
|
||||||
|
"Find a board by workspace name and board name (both case-insensitive). Resolves workspace name → publicId, then board name → publicId automatically. Use this when you only know names.",
|
||||||
|
{
|
||||||
|
workspaceName: z.string().describe("The workspace name (e.g. 'UC Roleplay')"),
|
||||||
|
boardName: z.string().describe("The board name (e.g. 'Mechanics Rework')"),
|
||||||
|
},
|
||||||
|
async ({ workspaceName, boardName }) => {
|
||||||
|
const workspaces = await kanRequest<{ publicId: string; name: string }[]>("GET", "/workspaces");
|
||||||
|
const workspace = workspaces.find(
|
||||||
|
(w) => w.name.toLowerCase() === workspaceName.toLowerCase(),
|
||||||
|
);
|
||||||
|
if (!workspace) {
|
||||||
|
const names = workspaces.map((w) => w.name).join(", ");
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `No workspace found with name "${workspaceName}". Available: ${names}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
const boards = await kanRequest<{ publicId: string; name: string }[]>(
|
||||||
|
"GET",
|
||||||
|
`/workspaces/${workspace.publicId}/boards`,
|
||||||
|
);
|
||||||
|
const board = boards.find(
|
||||||
|
(b) => b.name.toLowerCase() === boardName.toLowerCase(),
|
||||||
|
);
|
||||||
|
if (!board) {
|
||||||
|
const names = boards.map((b) => b.name).join(", ");
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `No board found with name "${boardName}" in workspace "${workspaceName}". Available boards: ${names}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(board, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_board",
|
||||||
|
"Get a board by its public ID, including its lists and cards",
|
||||||
|
{
|
||||||
|
boardPublicId: z.string().describe("The board's public ID"),
|
||||||
|
labelPublicId: z.string().optional().describe("Filter cards by label public ID"),
|
||||||
|
memberPublicId: z.string().optional().describe("Filter cards by member public ID"),
|
||||||
|
},
|
||||||
|
async ({ boardPublicId, labelPublicId, memberPublicId }) => {
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
if (labelPublicId) params.set("labelPublicId", labelPublicId);
|
||||||
|
if (memberPublicId) params.set("memberPublicId", memberPublicId);
|
||||||
|
const qs = params.toString() ? `?${params}` : "";
|
||||||
|
const data = await kanRequest("GET", `/boards/${boardPublicId}${qs}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_board_by_slug",
|
||||||
|
"Get a board by workspace slug and board slug",
|
||||||
|
{
|
||||||
|
workspaceSlug: z.string().describe("The workspace slug"),
|
||||||
|
boardSlug: z.string().describe("The board slug"),
|
||||||
|
},
|
||||||
|
async ({ workspaceSlug, boardSlug }) => {
|
||||||
|
const data = await kanRequest("GET", `/workspaces/${workspaceSlug}/boards/${boardSlug}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"create_board",
|
||||||
|
"Create a new board in a workspace, optionally with initial lists and labels",
|
||||||
|
{
|
||||||
|
workspacePublicId: z.string().describe("The workspace's public ID"),
|
||||||
|
name: z.string().describe("Board name"),
|
||||||
|
lists: z
|
||||||
|
.array(z.string().min(1))
|
||||||
|
.default([])
|
||||||
|
.describe("Initial list names, for example [\"Backlog\", \"In Progress\", \"Done\"]"),
|
||||||
|
labels: z
|
||||||
|
.array(z.string().min(1))
|
||||||
|
.default([])
|
||||||
|
.describe("Initial label names, for example [\"Bug\", \"Feature\"]"),
|
||||||
|
type: z
|
||||||
|
.enum(["regular", "template"])
|
||||||
|
.optional()
|
||||||
|
.describe("Board type (defaults to regular)"),
|
||||||
|
sourceBoardPublicId: z
|
||||||
|
.string()
|
||||||
|
.min(12)
|
||||||
|
.optional()
|
||||||
|
.describe("Source board public ID when cloning an existing board"),
|
||||||
|
},
|
||||||
|
async ({ workspacePublicId, name, lists, labels, type, sourceBoardPublicId }) => {
|
||||||
|
const data = await kanRequest("POST", `/workspaces/${workspacePublicId}/boards`, {
|
||||||
|
name,
|
||||||
|
lists,
|
||||||
|
labels,
|
||||||
|
type,
|
||||||
|
sourceBoardPublicId,
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_board",
|
||||||
|
"Update a board's name, slug, visibility, or favorite status",
|
||||||
|
{
|
||||||
|
boardPublicId: z.string().describe("The board's public ID"),
|
||||||
|
name: z.string().optional().describe("New board name"),
|
||||||
|
slug: z.string().optional().describe("New board slug"),
|
||||||
|
visibility: z.enum(["public", "private"]).optional().describe("New visibility"),
|
||||||
|
isFavorite: z.boolean().optional().describe("Whether the board is favorited"),
|
||||||
|
},
|
||||||
|
async ({ boardPublicId, name, slug, visibility, isFavorite }) => {
|
||||||
|
const data = await kanRequest("PUT", `/boards/${boardPublicId}`, {
|
||||||
|
name,
|
||||||
|
slug,
|
||||||
|
visibility,
|
||||||
|
isFavorite,
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_board",
|
||||||
|
"Delete a board (soft delete)",
|
||||||
|
{ boardPublicId: z.string().describe("The board's public ID") },
|
||||||
|
async ({ boardPublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/boards/${boardPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
192
packages/mcp/src/tools/card.ts
Normal file
192
packages/mcp/src/tools/card.ts
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
export function registerCardTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"create_card",
|
||||||
|
"Create a new card in a list",
|
||||||
|
{
|
||||||
|
listPublicId: z.string().describe("The list's public ID"),
|
||||||
|
title: z.string().describe("Card title"),
|
||||||
|
description: z.string().optional().describe("Card description (markdown supported)"),
|
||||||
|
dueDate: z.string().optional().describe("Due date in ISO 8601 format"),
|
||||||
|
labelPublicIds: z
|
||||||
|
.array(z.string())
|
||||||
|
.optional()
|
||||||
|
.describe("Public IDs of labels to attach"),
|
||||||
|
memberPublicIds: z
|
||||||
|
.array(z.string())
|
||||||
|
.optional()
|
||||||
|
.describe("Public IDs of workspace members to assign"),
|
||||||
|
position: z
|
||||||
|
.enum(["start", "end"])
|
||||||
|
.optional()
|
||||||
|
.describe("Where to insert the card in the list (default: end)"),
|
||||||
|
},
|
||||||
|
async ({ listPublicId, title, description, dueDate, labelPublicIds, memberPublicIds, position }) => {
|
||||||
|
const data = await kanRequest("POST", "/cards", {
|
||||||
|
listPublicId,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
dueDate,
|
||||||
|
labelPublicIds: labelPublicIds ?? [],
|
||||||
|
memberPublicIds: memberPublicIds ?? [],
|
||||||
|
position: position ?? "end",
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_card",
|
||||||
|
"Get full details of a card including comments, checklists, labels and members",
|
||||||
|
{ cardPublicId: z.string().describe("The card's public ID") },
|
||||||
|
async ({ cardPublicId }) => {
|
||||||
|
const data = await kanRequest("GET", `/cards/${cardPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_card",
|
||||||
|
"Update a card's title, description, due date, or move it to another list",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
title: z.string().optional().describe("New card title"),
|
||||||
|
description: z.string().optional().describe("New description"),
|
||||||
|
dueDate: z.string().nullable().optional().describe("Due date in ISO 8601, or null to clear"),
|
||||||
|
listPublicId: z.string().optional().describe("Move card to this list (public ID)"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, title, description, dueDate, listPublicId }) => {
|
||||||
|
const data = await kanRequest("PUT", `/cards/${cardPublicId}`, {
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
dueDate,
|
||||||
|
listPublicId,
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_card",
|
||||||
|
"Delete a card (soft delete)",
|
||||||
|
{ cardPublicId: z.string().describe("The card's public ID") },
|
||||||
|
async ({ cardPublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/cards/${cardPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"duplicate_card",
|
||||||
|
"Duplicate a card to the same or a different list",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID to duplicate"),
|
||||||
|
targetListPublicId: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.describe("Target list public ID (defaults to same list)"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, targetListPublicId }) => {
|
||||||
|
const data = await kanRequest("POST", `/cards/${cardPublicId}/duplicate`, {
|
||||||
|
targetListPublicId,
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_card_activities",
|
||||||
|
"Get the activity history of a card",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
cursor: z.string().optional().describe("Pagination cursor from a previous response"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, cursor }) => {
|
||||||
|
const params = cursor ? `?cursor=${encodeURIComponent(cursor)}` : "";
|
||||||
|
const data = await kanRequest("GET", `/cards/${cardPublicId}/activities${params}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"add_card_comment",
|
||||||
|
"Add a comment to a card",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
content: z.string().describe("Comment text"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, content }) => {
|
||||||
|
const data = await kanRequest("POST", `/cards/${cardPublicId}/comments`, { comment: content });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_card_comment",
|
||||||
|
"Update the text of an existing comment",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
commentPublicId: z.string().describe("The comment's public ID"),
|
||||||
|
content: z.string().describe("New comment text"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, commentPublicId, content }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"PUT",
|
||||||
|
`/cards/${cardPublicId}/comments/${commentPublicId}`,
|
||||||
|
{ comment: content },
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_card_comment",
|
||||||
|
"Delete a comment from a card",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
commentPublicId: z.string().describe("The comment's public ID"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, commentPublicId }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"DELETE",
|
||||||
|
`/cards/${cardPublicId}/comments/${commentPublicId}`,
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"toggle_card_label",
|
||||||
|
"Add or remove a label on a card (toggles if already present)",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
labelPublicId: z.string().describe("The label's public ID"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, labelPublicId }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"PUT",
|
||||||
|
`/cards/${cardPublicId}/labels/${labelPublicId}`,
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"toggle_card_member",
|
||||||
|
"Add or remove a member assignment on a card (toggles if already assigned)",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
workspaceMemberPublicId: z.string().describe("The workspace member's public ID"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, workspaceMemberPublicId }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"PUT",
|
||||||
|
`/cards/${cardPublicId}/members/${workspaceMemberPublicId}`,
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
83
packages/mcp/src/tools/checklist.ts
Normal file
83
packages/mcp/src/tools/checklist.ts
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
export function registerChecklistTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"create_checklist",
|
||||||
|
"Add a checklist to a card",
|
||||||
|
{
|
||||||
|
cardPublicId: z.string().describe("The card's public ID"),
|
||||||
|
name: z.string().describe("Checklist name"),
|
||||||
|
},
|
||||||
|
async ({ cardPublicId, name }) => {
|
||||||
|
const data = await kanRequest("POST", `/cards/${cardPublicId}/checklists`, { name });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_checklist",
|
||||||
|
"Rename a checklist",
|
||||||
|
{
|
||||||
|
checklistPublicId: z.string().describe("The checklist's public ID"),
|
||||||
|
name: z.string().describe("New checklist name"),
|
||||||
|
},
|
||||||
|
async ({ checklistPublicId, name }) => {
|
||||||
|
const data = await kanRequest("PUT", `/checklists/${checklistPublicId}`, { name });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_checklist",
|
||||||
|
"Delete a checklist and all its items",
|
||||||
|
{ checklistPublicId: z.string().describe("The checklist's public ID") },
|
||||||
|
async ({ checklistPublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/checklists/${checklistPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"create_checklist_item",
|
||||||
|
"Add an item to a checklist",
|
||||||
|
{
|
||||||
|
checklistPublicId: z.string().describe("The checklist's public ID"),
|
||||||
|
title: z.string().describe("Item title"),
|
||||||
|
},
|
||||||
|
async ({ checklistPublicId, title }) => {
|
||||||
|
const data = await kanRequest("POST", `/checklists/${checklistPublicId}/items`, { title });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_checklist_item",
|
||||||
|
"Update a checklist item's title, completion status, or position",
|
||||||
|
{
|
||||||
|
checklistItemPublicId: z.string().describe("The checklist item's public ID"),
|
||||||
|
title: z.string().optional().describe("New item title"),
|
||||||
|
isCompleted: z.boolean().optional().describe("Mark item as completed or not"),
|
||||||
|
index: z.number().int().optional().describe("New position index"),
|
||||||
|
},
|
||||||
|
async ({ checklistItemPublicId, title, isCompleted, index }) => {
|
||||||
|
const data = await kanRequest("PATCH", `/checklists/items/${checklistItemPublicId}`, {
|
||||||
|
title,
|
||||||
|
completed: isCompleted,
|
||||||
|
index,
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_checklist_item",
|
||||||
|
"Delete a checklist item",
|
||||||
|
{ checklistItemPublicId: z.string().describe("The checklist item's public ID") },
|
||||||
|
async ({ checklistItemPublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/checklists/items/${checklistItemPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
101
packages/mcp/src/tools/label.ts
Normal file
101
packages/mcp/src/tools/label.ts
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
// Preset colour palette supported by the Kan UI.
|
||||||
|
// Mirrors packages/shared/src/constants/colours.ts. Keep in sync.
|
||||||
|
const COLOUR_PRESETS = {
|
||||||
|
Teal: "#0d9488",
|
||||||
|
Green: "#65a30d",
|
||||||
|
Blue: "#0284c7",
|
||||||
|
Purple: "#4f46e5",
|
||||||
|
Yellow: "#ca8a04",
|
||||||
|
Orange: "#ea580c",
|
||||||
|
Red: "#dc2626",
|
||||||
|
Pink: "#db2777",
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
const colourNames = Object.keys(COLOUR_PRESETS) as [
|
||||||
|
keyof typeof COLOUR_PRESETS,
|
||||||
|
...(keyof typeof COLOUR_PRESETS)[],
|
||||||
|
];
|
||||||
|
const colourNameSchema = z.enum(colourNames);
|
||||||
|
const presetDescription = `One of the preset colour names: ${colourNames.join(", ")}`;
|
||||||
|
|
||||||
|
function resolveColourCode(
|
||||||
|
colour: keyof typeof COLOUR_PRESETS | undefined,
|
||||||
|
colourCode: string | undefined,
|
||||||
|
): string | undefined {
|
||||||
|
if (colourCode) return colourCode;
|
||||||
|
if (colour) return COLOUR_PRESETS[colour];
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function registerLabelTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"get_label",
|
||||||
|
"Get a label by its public ID",
|
||||||
|
{ labelPublicId: z.string().describe("The label's public ID") },
|
||||||
|
async ({ labelPublicId }) => {
|
||||||
|
const data = await kanRequest("GET", `/labels/${labelPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"create_label",
|
||||||
|
`Create a label for a board. Pick a colour by preset name (${colourNames.join(", ")}) or pass an explicit 7-char hex via colourCode. Defaults to Teal.`,
|
||||||
|
{
|
||||||
|
boardPublicId: z.string().describe("The board's public ID"),
|
||||||
|
name: z.string().describe("Label name"),
|
||||||
|
colour: colourNameSchema.optional().describe(presetDescription),
|
||||||
|
colourCode: z
|
||||||
|
.string()
|
||||||
|
.regex(/^#[0-9a-fA-F]{6}$/)
|
||||||
|
.optional()
|
||||||
|
.describe("Explicit 7-char hex colour (e.g. #0d9488). Overrides `colour` if both are set."),
|
||||||
|
},
|
||||||
|
async ({ boardPublicId, name, colour, colourCode }) => {
|
||||||
|
const resolved = resolveColourCode(colour, colourCode) ?? COLOUR_PRESETS.Teal;
|
||||||
|
const data = await kanRequest("POST", "/labels", {
|
||||||
|
boardPublicId,
|
||||||
|
name,
|
||||||
|
colourCode: resolved,
|
||||||
|
});
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_label",
|
||||||
|
"Update a label's name or colour. Pick a colour by preset name or pass an explicit 7-char hex.",
|
||||||
|
{
|
||||||
|
labelPublicId: z.string().describe("The label's public ID"),
|
||||||
|
name: z.string().optional().describe("New label name"),
|
||||||
|
colour: colourNameSchema.optional().describe(presetDescription),
|
||||||
|
colourCode: z
|
||||||
|
.string()
|
||||||
|
.regex(/^#[0-9a-fA-F]{6}$/)
|
||||||
|
.optional()
|
||||||
|
.describe("Explicit 7-char hex colour. Overrides `colour` if both are set."),
|
||||||
|
},
|
||||||
|
async ({ labelPublicId, name, colour, colourCode }) => {
|
||||||
|
const resolved = resolveColourCode(colour, colourCode);
|
||||||
|
const body: Record<string, unknown> = {};
|
||||||
|
if (name !== undefined) body.name = name;
|
||||||
|
if (resolved !== undefined) body.colourCode = resolved;
|
||||||
|
const data = await kanRequest("PUT", `/labels/${labelPublicId}`, body);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_label",
|
||||||
|
"Delete a label",
|
||||||
|
{ labelPublicId: z.string().describe("The label's public ID") },
|
||||||
|
async ({ labelPublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/labels/${labelPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
42
packages/mcp/src/tools/list.ts
Normal file
42
packages/mcp/src/tools/list.ts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
export function registerListTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"create_list",
|
||||||
|
"Create a new list inside a board",
|
||||||
|
{
|
||||||
|
boardPublicId: z.string().describe("The board's public ID"),
|
||||||
|
name: z.string().describe("List name"),
|
||||||
|
},
|
||||||
|
async ({ boardPublicId, name }) => {
|
||||||
|
const data = await kanRequest("POST", "/lists", { boardPublicId, name });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_list",
|
||||||
|
"Update a list's name or position",
|
||||||
|
{
|
||||||
|
listPublicId: z.string().describe("The list's public ID"),
|
||||||
|
name: z.string().optional().describe("New list name"),
|
||||||
|
index: z.number().int().optional().describe("New position index"),
|
||||||
|
},
|
||||||
|
async ({ listPublicId, name, index }) => {
|
||||||
|
const data = await kanRequest("PUT", `/lists/${listPublicId}`, { name, index });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_list",
|
||||||
|
"Delete a list and all its cards",
|
||||||
|
{ listPublicId: z.string().describe("The list's public ID") },
|
||||||
|
async ({ listPublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/lists/${listPublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
90
packages/mcp/src/tools/member.ts
Normal file
90
packages/mcp/src/tools/member.ts
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
export function registerMemberTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"invite_member",
|
||||||
|
"Invite a user to a workspace by email",
|
||||||
|
{
|
||||||
|
workspacePublicId: z.string().describe("The workspace's public ID"),
|
||||||
|
email: z.string().email().describe("Email address to invite"),
|
||||||
|
role: z
|
||||||
|
.enum(["admin", "member", "guest"])
|
||||||
|
.optional()
|
||||||
|
.describe("Role to assign (default: member)"),
|
||||||
|
},
|
||||||
|
async ({ workspacePublicId, email, role }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"POST",
|
||||||
|
`/workspaces/${workspacePublicId}/members/invite`,
|
||||||
|
{ email, role },
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"remove_member",
|
||||||
|
"Remove a member from a workspace",
|
||||||
|
{
|
||||||
|
workspacePublicId: z.string().describe("The workspace's public ID"),
|
||||||
|
memberPublicId: z.string().describe("The workspace member's public ID"),
|
||||||
|
},
|
||||||
|
async ({ workspacePublicId, memberPublicId }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"DELETE",
|
||||||
|
`/workspaces/${workspacePublicId}/members/${memberPublicId}`,
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_member_role",
|
||||||
|
"Change the role of a workspace member",
|
||||||
|
{
|
||||||
|
workspacePublicId: z.string().describe("The workspace's public ID"),
|
||||||
|
memberPublicId: z.string().describe("The workspace member's public ID"),
|
||||||
|
role: z.enum(["admin", "member", "guest"]).describe("New role"),
|
||||||
|
},
|
||||||
|
async ({ workspacePublicId, memberPublicId, role }) => {
|
||||||
|
const data = await kanRequest(
|
||||||
|
"PUT",
|
||||||
|
`/workspaces/${workspacePublicId}/members/${memberPublicId}/role`,
|
||||||
|
{ role },
|
||||||
|
);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_workspace_invite_link",
|
||||||
|
"Get the active invite link for a workspace",
|
||||||
|
{ workspacePublicId: z.string().describe("The workspace's public ID") },
|
||||||
|
async ({ workspacePublicId }) => {
|
||||||
|
const data = await kanRequest("GET", `/workspaces/${workspacePublicId}/invite`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"create_workspace_invite_link",
|
||||||
|
"Create a new invite link for a workspace (7-day expiry)",
|
||||||
|
{ workspacePublicId: z.string().describe("The workspace's public ID") },
|
||||||
|
async ({ workspacePublicId }) => {
|
||||||
|
const data = await kanRequest("POST", `/workspaces/${workspacePublicId}/invites`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"deactivate_workspace_invite_links",
|
||||||
|
"Deactivate all active invite links for a workspace",
|
||||||
|
{ workspacePublicId: z.string().describe("The workspace's public ID") },
|
||||||
|
async ({ workspacePublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/workspaces/${workspacePublicId}/invites`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
121
packages/mcp/src/tools/workspace.ts
Normal file
121
packages/mcp/src/tools/workspace.ts
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
||||||
|
import { z } from "zod";
|
||||||
|
import { kanRequest } from "../client.js";
|
||||||
|
|
||||||
|
export function registerWorkspaceTools(server: McpServer): void {
|
||||||
|
server.tool(
|
||||||
|
"list_workspaces",
|
||||||
|
"List all workspaces the authenticated user belongs to. Call this first to resolve a workspace name to its publicId before calling any other workspace-scoped tool.",
|
||||||
|
{},
|
||||||
|
async () => {
|
||||||
|
const data = await kanRequest("GET", "/workspaces");
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"find_workspace_by_name",
|
||||||
|
"Find a workspace by its name (case-insensitive). Returns the matching workspace including its publicId. Use this whenever you only know the workspace name and need its publicId.",
|
||||||
|
{ name: z.string().describe("Workspace name to search for") },
|
||||||
|
async ({ name }) => {
|
||||||
|
const workspaces = await kanRequest<{ publicId: string; name: string }[]>("GET", "/workspaces");
|
||||||
|
const match = workspaces.find(
|
||||||
|
(w) => w.name.toLowerCase() === name.toLowerCase(),
|
||||||
|
);
|
||||||
|
if (!match) {
|
||||||
|
const names = workspaces.map((w) => w.name).join(", ");
|
||||||
|
return {
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: "text",
|
||||||
|
text: `No workspace found with name "${name}". Available workspaces: ${names}`,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(match, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_workspace",
|
||||||
|
"Get a workspace by its public ID, including its members",
|
||||||
|
{ workspacePublicId: z.string().describe("The workspace's public ID") },
|
||||||
|
async ({ workspacePublicId }) => {
|
||||||
|
const data = await kanRequest("GET", `/workspaces/${workspacePublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"get_workspace_by_slug",
|
||||||
|
"Get a workspace by its slug, including its boards",
|
||||||
|
{ workspaceSlug: z.string().describe("The workspace slug") },
|
||||||
|
async ({ workspaceSlug }) => {
|
||||||
|
const data = await kanRequest("GET", `/workspaces/${workspaceSlug}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"create_workspace",
|
||||||
|
"Create a new workspace",
|
||||||
|
{
|
||||||
|
name: z.string().describe("Workspace name"),
|
||||||
|
slug: z.string().optional().describe("URL-friendly slug (auto-generated if omitted)"),
|
||||||
|
},
|
||||||
|
async ({ name, slug }) => {
|
||||||
|
const data = await kanRequest("POST", "/workspaces", { name, slug });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"update_workspace",
|
||||||
|
"Update a workspace's name or slug",
|
||||||
|
{
|
||||||
|
workspacePublicId: z.string().describe("The workspace's public ID"),
|
||||||
|
name: z.string().optional().describe("New workspace name"),
|
||||||
|
slug: z.string().optional().describe("New workspace slug"),
|
||||||
|
},
|
||||||
|
async ({ workspacePublicId, name, slug }) => {
|
||||||
|
const data = await kanRequest("PUT", `/workspaces/${workspacePublicId}`, { name, slug });
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"delete_workspace",
|
||||||
|
"Permanently delete a workspace",
|
||||||
|
{ workspacePublicId: z.string().describe("The workspace's public ID") },
|
||||||
|
async ({ workspacePublicId }) => {
|
||||||
|
const data = await kanRequest("DELETE", `/workspaces/${workspacePublicId}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"search_workspace",
|
||||||
|
"Search for boards and cards by title within a workspace",
|
||||||
|
{
|
||||||
|
workspacePublicId: z.string().describe("The workspace's public ID"),
|
||||||
|
query: z.string().describe("Search query string"),
|
||||||
|
},
|
||||||
|
async ({ workspacePublicId, query }) => {
|
||||||
|
const params = new URLSearchParams({ query });
|
||||||
|
const data = await kanRequest("GET", `/workspaces/${workspacePublicId}/search?${params}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
server.tool(
|
||||||
|
"check_workspace_slug_availability",
|
||||||
|
"Check whether a workspace slug is available",
|
||||||
|
{ slug: z.string().describe("Slug to check") },
|
||||||
|
async ({ slug }) => {
|
||||||
|
const params = new URLSearchParams({ slug });
|
||||||
|
const data = await kanRequest("GET", `/workspaces/check-slug-availability?${params}`);
|
||||||
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
14
packages/mcp/tsconfig.json
Normal file
14
packages/mcp/tsconfig.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "@kan/tsconfig/base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "dist",
|
||||||
|
"noEmit": false,
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"target": "ES2022",
|
||||||
|
"declaration": false,
|
||||||
|
"tsBuildInfoFile": ".cache/tsbuildinfo.json"
|
||||||
|
},
|
||||||
|
"include": ["src"],
|
||||||
|
"exclude": ["node_modules", "dist"]
|
||||||
|
}
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import { SignJWT } from "jose";
|
|
||||||
import { env } from "next-runtime-env";
|
|
||||||
|
|
||||||
const encoder = new TextEncoder();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a long‑lived unsubscribe link for a given user/subscriber.
|
|
||||||
*
|
|
||||||
* `${NEXT_PUBLIC_BASE_URL}/unsubscribe?token=<jwt>`
|
|
||||||
*
|
|
||||||
* The JWT payload only contains the subscriberId. There is no expiry
|
|
||||||
* on purpose – unsubscribe links should remain valid indefinitely.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export async function createEmailUnsubscribeLink(
|
|
||||||
userId: string,
|
|
||||||
): Promise<string | null> {
|
|
||||||
const baseUrl = env("NEXT_PUBLIC_BASE_URL");
|
|
||||||
const secret = process.env.EMAIL_UNSUBSCRIBE_SECRET;
|
|
||||||
|
|
||||||
if (!baseUrl || !secret) {
|
|
||||||
// Environment not configured for unsubscribe links.
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const token = await new SignJWT({ subscriberId: userId })
|
|
||||||
.setProtectedHeader({ alg: "HS256" })
|
|
||||||
// No expiration on purpose; unsubscribe links are long‑lived.
|
|
||||||
.sign(encoder.encode(secret));
|
|
||||||
|
|
||||||
return `${baseUrl}/unsubscribe?token=${encodeURIComponent(token)}`;
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,6 @@ export * from "./generateUID";
|
|||||||
export * from "./generateSlug";
|
export * from "./generateSlug";
|
||||||
export * from "./generateWorkspacePrefix";
|
export * from "./generateWorkspacePrefix";
|
||||||
export * from "./subscriptions";
|
export * from "./subscriptions";
|
||||||
export * from "./email";
|
|
||||||
export * from "./dueDateFilters";
|
export * from "./dueDateFilters";
|
||||||
export * from "./s3";
|
export * from "./s3";
|
||||||
export * from "./mentions";
|
export * from "./mentions";
|
||||||
|
|||||||
450
pnpm-lock.yaml
generated
450
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
46
turbo.json
46
turbo.json
@@ -3,28 +3,49 @@
|
|||||||
"ui": "tui",
|
"ui": "tui",
|
||||||
"tasks": {
|
"tasks": {
|
||||||
"topo": {
|
"topo": {
|
||||||
"dependsOn": ["^topo"]
|
"dependsOn": [
|
||||||
|
"^topo"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"dependsOn": ["^build"],
|
"dependsOn": [
|
||||||
"outputs": [".cache/tsbuildinfo.json", "dist/**"]
|
"^build"
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
".cache/tsbuildinfo.json",
|
||||||
|
"dist/**"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"dev": {
|
"dev": {
|
||||||
"dependsOn": ["^dev"],
|
"dependsOn": [
|
||||||
|
"^dev"
|
||||||
|
],
|
||||||
"cache": false,
|
"cache": false,
|
||||||
"persistent": false
|
"persistent": false
|
||||||
},
|
},
|
||||||
"format": {
|
"format": {
|
||||||
"outputs": [".cache/.prettiercache"],
|
"outputs": [
|
||||||
|
".cache/.prettiercache"
|
||||||
|
],
|
||||||
"outputLogs": "new-only"
|
"outputLogs": "new-only"
|
||||||
},
|
},
|
||||||
"lint": {
|
"lint": {
|
||||||
"dependsOn": ["^topo", "^build"],
|
"dependsOn": [
|
||||||
"outputs": [".cache/.eslintcache"]
|
"^topo",
|
||||||
|
"^build"
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
".cache/.eslintcache"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"typecheck": {
|
"typecheck": {
|
||||||
"dependsOn": ["^topo", "^build"],
|
"dependsOn": [
|
||||||
"outputs": [".cache/tsbuildinfo.json"]
|
"^topo",
|
||||||
|
"^build"
|
||||||
|
],
|
||||||
|
"outputs": [
|
||||||
|
".cache/tsbuildinfo.json"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"clean": {
|
"clean": {
|
||||||
"cache": false
|
"cache": false
|
||||||
@@ -102,7 +123,6 @@
|
|||||||
"NEXT_PUBLIC_KAN_ENV",
|
"NEXT_PUBLIC_KAN_ENV",
|
||||||
"NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY",
|
"NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY",
|
||||||
"STRIPE_SECRET_KEY",
|
"STRIPE_SECRET_KEY",
|
||||||
"DISCORD_WEBHOOK_URL",
|
|
||||||
"STRIPE_WEBHOOK_SECRET",
|
"STRIPE_WEBHOOK_SECRET",
|
||||||
"STRIPE_WEBHOOK_SECRET_LEGACY",
|
"STRIPE_WEBHOOK_SECRET_LEGACY",
|
||||||
"STRIPE_PRO_PLAN_MONTHLY_PRICE_ID",
|
"STRIPE_PRO_PLAN_MONTHLY_PRICE_ID",
|
||||||
@@ -127,12 +147,12 @@
|
|||||||
"PORT",
|
"PORT",
|
||||||
"BETTER_AUTH_SECRET",
|
"BETTER_AUTH_SECRET",
|
||||||
"BETTER_AUTH_TRUSTED_ORIGINS",
|
"BETTER_AUTH_TRUSTED_ORIGINS",
|
||||||
"NOVU_API_KEY",
|
|
||||||
"EMAIL_UNSUBSCRIBE_SECRET",
|
|
||||||
"REDIS_URL",
|
"REDIS_URL",
|
||||||
"LOG_LEVEL",
|
"LOG_LEVEL",
|
||||||
"AXIOM_TOKEN",
|
"AXIOM_TOKEN",
|
||||||
"AXIOM_DATASET"
|
"AXIOM_DATASET",
|
||||||
|
"KAN_BASE_URL",
|
||||||
|
"KAN_API_TOKEN"
|
||||||
],
|
],
|
||||||
"globalPassThroughEnv": [
|
"globalPassThroughEnv": [
|
||||||
"NODE_ENV",
|
"NODE_ENV",
|
||||||
|
|||||||
Reference in New Issue
Block a user