Compare commits
1 Commits
main
...
feat/comme
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aff1d76010 |
@@ -60,7 +60,3 @@ pnpm-debug.log
|
||||
|
||||
# Cloud compose (separate deployment)
|
||||
cloud/
|
||||
|
||||
# Local temporary caches
|
||||
.pnpm-store
|
||||
v8-compile-cache-0
|
||||
|
||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -4,9 +4,6 @@
|
||||
node_modules
|
||||
.pnp
|
||||
.pnp.js
|
||||
.pnpm/
|
||||
.pnpm-store/
|
||||
v8-compile-cache-0/
|
||||
|
||||
# testing
|
||||
coverage
|
||||
@@ -58,7 +55,4 @@ i18n.cache
|
||||
# pgdata
|
||||
/apps/web/pgdata
|
||||
|
||||
# local scripts
|
||||
scripts/
|
||||
|
||||
.claude
|
||||
.claude
|
||||
490
README.md
490
README.md
@@ -1,315 +1,369 @@
|
||||
# Kan
|
||||

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

|
||||
## 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
|
||||
|
||||
- 看板可见性控制
|
||||
- 工作区成员和协作
|
||||
- Trello 看板导入
|
||||
- 卡片标签和筛选
|
||||
- 评论、活动记录和检查清单
|
||||
- 可复用的看板模板
|
||||
- 卡片截止日期、成员和附件
|
||||
- 内置 REST API 和 MCP 服务
|
||||
See our [roadmap](https://kan.bn/kan/roadmap) for upcoming features.
|
||||
|
||||
## 使用 Docker Compose 自托管
|
||||
## Screenshot 👁️
|
||||
|
||||
### 环境要求
|
||||
<img width="1507" alt="hero-dark" src="https://github.com/user-attachments/assets/8490104a-cd5d-49de-afc2-152fd8a93119" />
|
||||
|
||||
- Docker Engine
|
||||
- Docker Compose v2
|
||||
## Made With 🛠️
|
||||
|
||||
### 启动
|
||||
- [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 🐳
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
### One-click Deployments
|
||||
|
||||
编辑 `.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.
|
||||
|
||||
```dotenv
|
||||
NEXT_PUBLIC_BASE_URL=http://localhost:3000
|
||||
POSTGRES_PASSWORD=请填写数据库密码
|
||||
POSTGRES_URL=postgresql://kan:请填写数据库密码@postgres:5432/kan_db
|
||||
BETTER_AUTH_SECRET=请填写一个随机的 32 位以上密钥
|
||||
```
|
||||
<a href="https://railway.com/deploy/kan?referralCode=bZPsr2&utm_medium=integration&utm_source=template&utm_campaign=generic">
|
||||
<img src="https://railway.app/button.svg" alt="Deploy on Railway" height="40" />
|
||||
</a>
|
||||
|
||||
构建本地镜像并启动:
|
||||
### Docker Compose
|
||||
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database and automatically run migrations.
|
||||
|
||||
仓库自带的 `docker-compose.yml` 使用本地镜像标签:
|
||||
1. Create a `.env` file with your environment variables (see [Environment Variables](#environment-variables-) section below)
|
||||
|
||||
2. Use the provided `docker-compose.yml` file or create your own with the following configuration:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
migrate:
|
||||
image: kan-migrate:local
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./apps/web/Dockerfile
|
||||
target: migrate
|
||||
image: ghcr.io/kanbn/kan-migrate:latest
|
||||
container_name: kan-migrate
|
||||
networks:
|
||||
- kan-network
|
||||
environment:
|
||||
- POSTGRES_URL=${POSTGRES_URL}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
restart: "no"
|
||||
|
||||
web:
|
||||
image: kan:local
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./apps/web/Dockerfile
|
||||
target: web
|
||||
image: ghcr.io/kanbn/kan:latest
|
||||
container_name: kan-web
|
||||
ports:
|
||||
- "${WEB_PORT:-3000}:3000"
|
||||
networks:
|
||||
- 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:
|
||||
```
|
||||
|
||||
不会拉取远端 Web 镜像。数据库迁移会在 Web 服务启动前自动执行。启动完成后访问 <http://localhost:3000>。如修改端口,请同步修改 `WEB_PORT` 和 `NEXT_PUBLIC_BASE_URL`。
|
||||
|
||||
### 常用命令
|
||||
3. Start the containers in detached mode:
|
||||
|
||||
```bash
|
||||
# 查看状态
|
||||
docker compose ps
|
||||
|
||||
# 查看 Web 日志
|
||||
docker compose logs -f web
|
||||
|
||||
# 查看迁移日志
|
||||
docker compose logs -f migrate
|
||||
|
||||
# 停止服务
|
||||
docker compose down
|
||||
|
||||
# 停止服务并删除数据库卷(会删除本地数据)
|
||||
docker compose down -v
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
检查 API 健康状态:
|
||||
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`).
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/api/v1/health
|
||||
```
|
||||
**Managing containers:**
|
||||
|
||||
预期返回:
|
||||
- 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`
|
||||
|
||||
```json
|
||||
{ "status": "ok", "database": "ok", "storage": "not_configured" }
|
||||
```
|
||||
For the complete Docker Compose configuration with all optional features, see [docker-compose.yml](./docker-compose.yml) in the repository.
|
||||
|
||||
默认文件存储状态为 `not_configured`。如需上传头像和附件,请按照 `.env.example` 配置 S3 兼容存储。
|
||||
## Local Development 🧑💻
|
||||
|
||||
## 本地开发
|
||||
|
||||
项目是 pnpm monorepo,需要 Node.js 20.18.1 或更高版本,以及 pnpm 9.14.2。
|
||||
1. Clone the repository (or fork)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/kanbn/kan.git
|
||||
cd kan
|
||||
```
|
||||
|
||||
2. Install dependencies
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
3. Copy `.env.example` to `.env` and configure your environment variables
|
||||
4. Migrate database
|
||||
|
||||
```bash
|
||||
pnpm db:migrate
|
||||
```
|
||||
|
||||
5. Start the development server
|
||||
|
||||
```bash
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
开发服务器默认地址为 <http://localhost:3000>。常用检查命令:
|
||||
## Environment Variables 🔐
|
||||
|
||||
```bash
|
||||
pnpm typecheck
|
||||
pnpm lint
|
||||
pnpm format
|
||||
```
|
||||
| Variable | Description | Required | Example |
|
||||
| ----------------------------------------- | --------------------------------------------------------- | ------------------------------------------- | ----------------------------------------------------------- |
|
||||
| `POSTGRES_URL` | PostgreSQL connection URL | To use external database | `postgres://user:pass@localhost:5432/db` |
|
||||
| `REDIS_URL` | Redis connection URL | For rate limiting (optional) | `redis://localhost:6379` or `redis://redis:6379` (Docker) |
|
||||
| `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.
|
||||
|
||||
完整变量列表见 [`.env.example`](.env.example)。
|
||||
## MCP Server (AI Control) 🤖
|
||||
|
||||
| 变量 | 用途 | 示例 |
|
||||
| ------------------------------- | ---------------------------------- | -------------------------------------------- |
|
||||
| `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` | 管理和监控接口密钥 | 自定义密钥 |
|
||||
Kan ships with a [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that lets any MCP-compatible AI client — GitHub Copilot, Claude Desktop, Cursor, Codex, and others — read and control your Kan instance using natural language.
|
||||
|
||||
## MCP 服务
|
||||
### Prerequisites
|
||||
|
||||
Kan 仓库内置了基于 Model Context Protocol 的 MCP 服务。连接后,Claude Desktop、Cursor、VS Code、Codex 等 MCP 客户端可以通过自然语言读取和管理 Kan 数据。
|
||||
- Node.js 18+
|
||||
- A running Kan instance (self-hosted or cloud)
|
||||
- A Kan API key (Settings → API Keys → Create key)
|
||||
|
||||
### 先看这里
|
||||
### Installation
|
||||
|
||||
MCP 源码位于 `packages/mcp`,目前是仓库内的工作区包,并未发布为 npm 公共包。因此以下命令不能使用:
|
||||
You do **not** need to clone this repository. The recommended way is to use `npx`, which runs the server on-demand and always uses the latest version — no global install required:
|
||||
|
||||
```bash
|
||||
npx -y @kan/mcp
|
||||
bunx kan-mcp
|
||||
```
|
||||
|
||||
请从当前仓库构建 MCP 服务,再让客户端启动生成的文件。
|
||||
|
||||
### 获取 API 密钥
|
||||
|
||||
1. 登录 Kan。
|
||||
2. 打开设置中的 API 密钥页面,地址通常为 `/settings/api`。
|
||||
3. 创建一个 API 密钥并立即保存。密钥只会完整显示一次。
|
||||
|
||||
MCP 使用用户 API 密钥,不是 `KAN_ADMIN_API_KEY`。请求会以 Bearer Token 方式访问 `${KAN_BASE_URL}/api/v1`。
|
||||
|
||||
### 构建
|
||||
|
||||
在仓库根目录执行:
|
||||
Alternatively, install it globally:
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
pnpm --filter @kan/mcp build
|
||||
npm install -g @kan/mcp
|
||||
kan-mcp
|
||||
```
|
||||
|
||||
构建产物为 `packages/mcp/dist/index.js`。MCP 服务使用 stdio 通信,应由 MCP 客户端启动,不需要单独暴露 HTTP 端口。
|
||||
### Configuration
|
||||
|
||||
### 环境变量
|
||||
The server is configured via two environment variables:
|
||||
|
||||
| 变量 | 说明 |
|
||||
| --------------- | ---------------------------------- |
|
||||
| `KAN_BASE_URL` | Kan 实例根地址,不要追加 `/api/v1` |
|
||||
| `KAN_API_TOKEN` | Kan 设置中创建的用户 API 密钥 |
|
||||
| Variable | Description | Example |
|
||||
| --------------- | ----------------------------------- | ------------------------------ |
|
||||
| `KAN_BASE_URL` | Base URL of your Kan instance | `https://your-kan.example.com` |
|
||||
| `KAN_API_TOKEN` | API key from your Kan user settings | `kan_xxxxxxxxxxxx` |
|
||||
|
||||
本地 Kan 使用 Docker Compose 时:
|
||||
#### GitHub Copilot (VS Code)
|
||||
|
||||
```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`:
|
||||
Add the following to your VS Code `mcp.json` (open it via **MCP: Open User MCP Configuration** from the Command Palette):
|
||||
|
||||
```json
|
||||
{
|
||||
"servers": {
|
||||
"kan": {
|
||||
"type": "stdio",
|
||||
"command": "node",
|
||||
"args": ["/绝对路径/kan/packages/mcp/dist/index.js"],
|
||||
"command": "npx",
|
||||
"args": ["-y", "@kan/mcp"],
|
||||
"env": {
|
||||
"KAN_BASE_URL": "http://localhost:3000",
|
||||
"KAN_API_TOKEN": "kan_你的_api_key"
|
||||
"KAN_BASE_URL": "https://your-kan-instance.com",
|
||||
"KAN_API_TOKEN": "kan_your_api_key_here"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Codex
|
||||
Then use Copilot in **Agent mode** to interact with Kan.
|
||||
|
||||
Codex 可通过命令添加 stdio MCP 服务。将脚本路径替换为本机绝对路径:
|
||||
#### Claude Desktop
|
||||
|
||||
```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
|
||||
Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"kan": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "@kan/mcp"],
|
||||
"env": {
|
||||
"KAN_BASE_URL": "https://your-kan-instance.com",
|
||||
"KAN_API_TOKEN": "kan_your_api_key_here"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Windows PowerShell:
|
||||
#### Cursor / Codex / other clients
|
||||
|
||||
```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
|
||||
```
|
||||
Use the same `command` + `args` + `env` pattern above — all MCP stdio clients follow the same format.
|
||||
|
||||
使用 `codex mcp get kan` 检查配置。
|
||||
### Example prompts
|
||||
|
||||
### 手动启动和排错
|
||||
Once connected, you can ask your AI assistant things like:
|
||||
|
||||
Linux 或 macOS:
|
||||
**Browsing**
|
||||
|
||||
```bash
|
||||
KAN_BASE_URL=http://localhost:3000 \
|
||||
KAN_API_TOKEN=kan_你的_api_key \
|
||||
node packages/mcp/dist/index.js
|
||||
```
|
||||
- _"List all my workspaces"_
|
||||
- _"Show me all boards in the Marketing workspace"_
|
||||
- _"What cards are in the Backlog list of the Q3 Planning board?"_
|
||||
- _"Get the full details of card X including comments and checklists"_
|
||||
|
||||
PowerShell:
|
||||
**Managing cards**
|
||||
|
||||
```powershell
|
||||
$env:KAN_BASE_URL = "http://localhost:3000"
|
||||
$env:KAN_API_TOKEN = "kan_你的_api_key"
|
||||
node .\packages\mcp\dist\index.js
|
||||
```
|
||||
- _"Create a card called 'Fix login bug' in the To Do list of the Dev board"_
|
||||
- _"Move the 'API redesign' card to the In Progress list"_
|
||||
- _"Set a due date of next Friday on the 'Write docs' card"_
|
||||
- _"Add a comment to the 'Deploy to prod' card saying the deployment is blocked"_
|
||||
- _"Duplicate the 'Sprint template' card into the new Sprint 4 list"_
|
||||
- _"Mark the 'Setup CI' checklist item as complete"_
|
||||
|
||||
如果出现 `Connection closed`,检查以下内容:
|
||||
**Organisation**
|
||||
|
||||
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` 返回数据库正常。
|
||||
- _"Add the 'urgent' label to all cards assigned to me in the Backend board"_
|
||||
- _"Create a 'Release checklist' checklist on the v2.0 card with items: smoke test, update changelog, tag release"_
|
||||
- _"What tasks are assigned to @alice in the Mechanics Rework board?"_
|
||||
|
||||
### 工具范围
|
||||
**Workspace management**
|
||||
|
||||
当前 MCP 服务提供 46 个工具,覆盖工作区、看板、列表、卡片、评论、标签、检查清单和成员管理。连接后可以直接提出以下请求:
|
||||
- _"Create a new workspace called 'Client Projects'"_
|
||||
- _"Invite bob@example.com to the Marketing workspace as a member"_
|
||||
- _"Create a new board called 'Sprint 5' in the Dev workspace with lists: Backlog, In Progress, Done"_
|
||||
- _"Search for anything related to 'authentication' across the Dev workspace"_
|
||||
|
||||
- 列出我的工作区。
|
||||
- 查看研发工作区中的所有看板。
|
||||
- 创建一个包含待办、进行中、已完成列表的新看板。
|
||||
- 将登录问题卡片移动到进行中列表。
|
||||
- 给版本发布卡片添加检查清单和评论。
|
||||
### Available tools
|
||||
|
||||
## 技术栈
|
||||
The MCP server exposes 46 tools across 7 resource types:
|
||||
|
||||
Next.js、React、tRPC、Better Auth、Tailwind CSS、Drizzle ORM、PostgreSQL 和 Model Context Protocol SDK。
|
||||
| Resource | Tools |
|
||||
| ----------------- | ------------------------------------------------------------------- |
|
||||
| Workspaces | list, find by name, get, create, update, delete, search, check slug |
|
||||
| Boards | list, find by name, get, get by slug, create, update, delete |
|
||||
| Lists | create, update, delete |
|
||||
| Cards | create, get, update, delete, duplicate, get activities |
|
||||
| Card interactions | add/update/delete comment, toggle label, toggle member |
|
||||
| Checklists | create, update, delete, create item, update item, delete item |
|
||||
| Labels | get, create, update, delete |
|
||||
| Members | invite, remove, update role, manage invite links |
|
||||
|
||||
## 参与贡献
|
||||
## Contributing 🤝
|
||||
|
||||
欢迎提交 Issue 和 Pull Request。提交代码前请先阅读 [CONTRIBUTING.md](CONTRIBUTING.md),并运行类型检查、Lint 和格式检查。
|
||||
We welcome contributions! Please read our [contribution guidelines](CONTRIBUTING.md) before submitting a pull request.
|
||||
|
||||
## 许可证与联系
|
||||
## Contributors 👥
|
||||
|
||||
项目使用 [AGPLv3](LICENSE) 协议。如需支持,请发送邮件至 [henry@kan.bn](mailto:henry@kan.bn),或加入 [Discord 社区](https://discord.gg/e6ejRb6CmT)。
|
||||
<a href="https://github.com/kanbn/kan/graphs/contributors">
|
||||
<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)
|
||||
|
||||
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.
|
||||
|
||||
## License 📝
|
||||
|
||||
Kan is licensed under the [AGPLv3 license](LICENSE).
|
||||
|
||||
## Contact 📧
|
||||
|
||||
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).
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"version": "1.10",
|
||||
"locale": {
|
||||
"source": "en",
|
||||
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR", "zh-CN"]
|
||||
"targets": ["fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR"]
|
||||
},
|
||||
"buckets": {
|
||||
"json": {
|
||||
|
||||
@@ -2395,9 +2395,6 @@ checksums:
|
||||
uAQUqI/message: 4e1fcce15854d824919b4a582c697c90
|
||||
uAQUqI/origin/0/0: dc1a240d2d0cccb102c67ca311d4e457
|
||||
uAQUqI/translation: 4e1fcce15854d824919b4a582c697c90
|
||||
hQRttt/message: 7c91ef5f747eea9f77a9c4f23e19fb2e
|
||||
hQRttt/origin/0/0: b1f4eb6768222ea825703105f6014486
|
||||
hQRttt/translation: 7c91ef5f747eea9f77a9c4f23e19fb2e
|
||||
WYDptz/message: 05f2b4abfc36def17756a6969983cf86
|
||||
WYDptz/origin/0/0: 8628ddb6f4ded25c0f17e2cbda8207d3
|
||||
WYDptz/translation: 05f2b4abfc36def17756a6969983cf86
|
||||
|
||||
@@ -3,7 +3,7 @@ import { formatter } from "@lingui/format-json";
|
||||
|
||||
|
||||
export default defineConfig({
|
||||
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR", "zh-CN"],
|
||||
locales: ["en", "fr", "de", "es", "it", "nl", "ru", "pl", "pt-BR"],
|
||||
sourceLocale: "en",
|
||||
catalogs: [
|
||||
{
|
||||
|
||||
@@ -27,13 +27,13 @@
|
||||
"@kan/api": "workspace:*",
|
||||
"@kan/auth": "workspace:*",
|
||||
"@kan/db": "workspace:^",
|
||||
"@kan/email": "workspace:^",
|
||||
"@kan/logger": "workspace:^",
|
||||
"@kan/shared": "workspace:^",
|
||||
"@lingui/babel-preset-react": "^2.9.2",
|
||||
"@lingui/conf": "^5.3.2",
|
||||
"@lingui/macro": "^5.3.2",
|
||||
"@lingui/react": "^5.3.2",
|
||||
"@novu/api": "^3.11.0",
|
||||
"@t3-oss/env-nextjs": "^0.11.1",
|
||||
"@tailwindcss/typography": "^0.5.16",
|
||||
"@tanstack/react-query": "catalog:",
|
||||
|
||||
@@ -180,13 +180,13 @@ const RenderSuggestions = () => {
|
||||
|
||||
if (!props.clientRect) return;
|
||||
|
||||
popup?.[0]?.setProps({
|
||||
popup[0]?.setProps({
|
||||
getReferenceClientRect: props.clientRect,
|
||||
});
|
||||
},
|
||||
onKeyDown(props: SuggestionKeyDownProps): boolean {
|
||||
if (props.event.key === "Escape") {
|
||||
popup?.[0]?.hide();
|
||||
popup[0]?.hide();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ const RenderSuggestions = () => {
|
||||
);
|
||||
},
|
||||
onExit() {
|
||||
popup?.[0]?.destroy();
|
||||
popup[0]?.destroy();
|
||||
reactRenderer.destroy();
|
||||
},
|
||||
};
|
||||
@@ -308,11 +308,11 @@ const renderMentionSuggestions = () => {
|
||||
onUpdate(props: any) {
|
||||
reactRenderer.updateProps(props);
|
||||
if (!props.clientRect) return;
|
||||
popup?.[0]?.setProps({ getReferenceClientRect: props.clientRect });
|
||||
popup[0]?.setProps({ getReferenceClientRect: props.clientRect });
|
||||
},
|
||||
onKeyDown(props: SuggestionKeyDownProps) {
|
||||
if (props.event.key === "Escape") {
|
||||
popup?.[0]?.hide();
|
||||
popup[0]?.hide();
|
||||
return true;
|
||||
}
|
||||
return (
|
||||
@@ -324,7 +324,7 @@ const renderMentionSuggestions = () => {
|
||||
);
|
||||
},
|
||||
onExit() {
|
||||
popup?.[0]?.destroy();
|
||||
popup[0]?.destroy();
|
||||
reactRenderer.destroy();
|
||||
},
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Button } from "@headlessui/react";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { env } from "next-runtime-env";
|
||||
import { useTheme } from "next-themes";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { HiBolt } from "react-icons/hi2";
|
||||
import {
|
||||
TbLayoutSidebarLeftCollapse,
|
||||
@@ -28,7 +28,6 @@ import ButtonComponent from "~/components/Button";
|
||||
import ReactiveButton from "~/components/ReactiveButton";
|
||||
import UserMenu from "~/components/UserMenu";
|
||||
import WorkspaceMenu from "~/components/WorkspaceMenu";
|
||||
import { useLinguiContext } from "~/providers/lingui";
|
||||
import { useWorkspace } from "~/providers/workspace";
|
||||
import { api } from "~/utils/api";
|
||||
|
||||
@@ -51,7 +50,6 @@ export default function SideNavigation({
|
||||
}: SideNavigationProps) {
|
||||
const router = useRouter();
|
||||
const { workspace } = useWorkspace();
|
||||
const { locale } = useLinguiContext();
|
||||
const [isCollapsed, setIsCollapsed] = useState(false);
|
||||
const [isInitialised, setIsInitialised] = useState(false);
|
||||
|
||||
@@ -94,59 +92,56 @@ export default function SideNavigation({
|
||||
href: string;
|
||||
icon: object;
|
||||
keyboardShortcut: KeyboardShortcut;
|
||||
}[] = useMemo(
|
||||
() => [
|
||||
{
|
||||
name: t`Boards`,
|
||||
href: "/boards",
|
||||
icon: isDarkMode ? boardsIconDark : boardsIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "B" }],
|
||||
action: () => router.push("/boards"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to boards`,
|
||||
},
|
||||
}[] = [
|
||||
{
|
||||
name: t`Boards`,
|
||||
href: "/boards",
|
||||
icon: isDarkMode ? boardsIconDark : boardsIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "B" }],
|
||||
action: () => router.push("/boards"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to boards`,
|
||||
},
|
||||
{
|
||||
name: t`Templates`,
|
||||
href: "/templates",
|
||||
icon: isDarkMode ? templatesIconDark : templatesIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "T" }],
|
||||
action: () => router.push("/templates"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to templates`,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: t`Templates`,
|
||||
href: "/templates",
|
||||
icon: isDarkMode ? templatesIconDark : templatesIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "T" }],
|
||||
action: () => router.push("/templates"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to templates`,
|
||||
},
|
||||
{
|
||||
name: t`Members`,
|
||||
href: "/members",
|
||||
icon: isDarkMode ? membersIconDark : membersIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "M" }],
|
||||
action: () => router.push("/members"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to members`,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: t`Members`,
|
||||
href: "/members",
|
||||
icon: isDarkMode ? membersIconDark : membersIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "M" }],
|
||||
action: () => router.push("/members"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to members`,
|
||||
},
|
||||
{
|
||||
name: t`Settings`,
|
||||
href: "/settings",
|
||||
icon: isDarkMode ? settingsIconDark : settingsIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "S" }],
|
||||
action: () => router.push("/settings"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to settings`,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: t`Settings`,
|
||||
href: "/settings",
|
||||
icon: isDarkMode ? settingsIconDark : settingsIconLight,
|
||||
keyboardShortcut: {
|
||||
type: "SEQUENCE",
|
||||
strokes: [{ key: "G" }, { key: "S" }],
|
||||
action: () => router.push("/settings"),
|
||||
group: "NAVIGATION",
|
||||
description: t`Go to settings`,
|
||||
},
|
||||
],
|
||||
[isDarkMode, locale, router],
|
||||
);
|
||||
},
|
||||
];
|
||||
|
||||
const toggleCollapse = () => {
|
||||
setIsCollapsed(!isCollapsed);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ReactNode } from "react";
|
||||
import type { Root } from "react-dom/client";
|
||||
import type { Placement, Instance as TippyInstance } from "tippy.js";
|
||||
import type { Placement } from "tippy.js";
|
||||
import { useEffect, useRef } from "react";
|
||||
import { createRoot } from "react-dom/client";
|
||||
import tippy from "tippy.js";
|
||||
@@ -20,16 +20,16 @@ export function Tooltip({
|
||||
}: TooltipProps) {
|
||||
const triggerRef = useRef<HTMLDivElement>(null);
|
||||
const rootRef = useRef<Root | null>(null);
|
||||
const tippyRef = useRef<TippyInstance | null>(null);
|
||||
const contentRef = useRef(content);
|
||||
contentRef.current = content;
|
||||
|
||||
useEffect(() => {
|
||||
if (!triggerRef.current) return;
|
||||
|
||||
if (!content) return;
|
||||
|
||||
const container = document.createElement("div");
|
||||
const root = createRoot(container);
|
||||
rootRef.current = root;
|
||||
root.render(content);
|
||||
|
||||
const instance = tippy(triggerRef.current, {
|
||||
content: container,
|
||||
@@ -39,33 +39,12 @@ export function Tooltip({
|
||||
theme: "tooltip",
|
||||
touch: false,
|
||||
});
|
||||
tippyRef.current = instance;
|
||||
|
||||
if (contentRef.current) {
|
||||
root.render(contentRef.current);
|
||||
} else {
|
||||
instance.disable();
|
||||
}
|
||||
|
||||
return () => {
|
||||
instance.destroy();
|
||||
tippyRef.current = null;
|
||||
root.unmount();
|
||||
rootRef.current = null;
|
||||
rootRef.current?.unmount();
|
||||
};
|
||||
// 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]);
|
||||
}, [content, placement, delay]);
|
||||
|
||||
return (
|
||||
<div ref={triggerRef} className="inline-flex">
|
||||
|
||||
@@ -2,12 +2,11 @@ import { useRouter } from "next/navigation";
|
||||
import { Button, Menu, Transition } from "@headlessui/react";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { env } from "next-runtime-env";
|
||||
import { Fragment, useMemo, useState } from "react";
|
||||
import { Fragment, useState } from "react";
|
||||
import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
|
||||
import { useKeyboardShortcut } from "~/providers/keyboard-shortcuts";
|
||||
import { useLinguiContext } from "~/providers/lingui";
|
||||
import { useModal } from "~/providers/modal";
|
||||
import { useWorkspace } from "~/providers/workspace";
|
||||
import { api } from "~/utils/api";
|
||||
@@ -21,29 +20,23 @@ export default function WorkspaceMenu({
|
||||
}) {
|
||||
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
|
||||
useWorkspace();
|
||||
const { locale } = useLinguiContext();
|
||||
const { openModal } = useModal();
|
||||
const { data: hasPartnerSlot } =
|
||||
api.workspace.hasAvailablePartnerSlot.useQuery();
|
||||
const router = useRouter();
|
||||
const [isOpen, setIsOpen] = useState(false);
|
||||
|
||||
const commandPaletteShortcut = useMemo(
|
||||
() => ({
|
||||
type: "PRESS" as const,
|
||||
const { tooltipContent: commandPaletteShortcutTooltipContent } =
|
||||
useKeyboardShortcut({
|
||||
type: "PRESS",
|
||||
stroke: {
|
||||
key: "k",
|
||||
modifiers: ["META"] as ("META" | "CONTROL" | "ALT" | "SHIFT")[],
|
||||
modifiers: ["META"],
|
||||
},
|
||||
action: () => setIsOpen(true),
|
||||
description: t`Open command menu`,
|
||||
group: "GENERAL" as const,
|
||||
}),
|
||||
[locale],
|
||||
);
|
||||
|
||||
const { tooltipContent: commandPaletteShortcutTooltipContent } =
|
||||
useKeyboardShortcut(commandPaletteShortcut);
|
||||
group: "GENERAL",
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -52,9 +52,8 @@ export const env = createEnv({
|
||||
VK_CLIENT_SECRET: z.string().optional(),
|
||||
LINKEDIN_CLIENT_ID: z.string().optional(),
|
||||
LINKEDIN_CLIENT_SECRET: z.string().optional(),
|
||||
SUBSCRIBER_API_URL: z.string().url().optional(),
|
||||
SUBSCRIBER_API_KEY: z.string().optional(),
|
||||
SUBSCRIBER_ENVIRONMENT_ID: z.string().optional(),
|
||||
NOVU_API_KEY: z.string().optional(),
|
||||
EMAIL_UNSUBSCRIBE_SECRET: z.string().optional(),
|
||||
// Generic OIDC Provider
|
||||
OIDC_CLIENT_ID: z.string().optional(),
|
||||
OIDC_CLIENT_SECRET: z.string().optional(),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { Locale as DateFnsLocale } from "date-fns";
|
||||
import { useLingui } from "@lingui/react";
|
||||
import { de, enGB, es, fr, it, nl, pl, ptBR, ru, zhCN } from "date-fns/locale";
|
||||
import { de, enGB, es, fr, it, nl, pl, ptBR, ru } from "date-fns/locale";
|
||||
|
||||
import type { Locale } from "~/locales";
|
||||
import { useLinguiContext } from "~/providers/lingui";
|
||||
@@ -20,7 +20,6 @@ export function useLocalisation() {
|
||||
ru,
|
||||
pl,
|
||||
ptbr: ptBR,
|
||||
"zh-CN": zhCN,
|
||||
};
|
||||
|
||||
const currentDateLocale = dateLocaleMap[locale] ?? enGB;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { useCallback, useEffect, useRef } from "react";
|
||||
|
||||
import { useEffect } from "react";
|
||||
import { useModal } from "~/providers/modal";
|
||||
|
||||
interface UseModalFormStateOptions<T> {
|
||||
@@ -13,43 +12,25 @@ export function useModalFormState<T extends Record<string, any>>({
|
||||
initialValues,
|
||||
resetOnClose = false,
|
||||
}: UseModalFormStateOptions<T>) {
|
||||
const {
|
||||
modalContentType,
|
||||
isOpen,
|
||||
getModalState,
|
||||
setModalState,
|
||||
clearModalState,
|
||||
} = useModal();
|
||||
|
||||
const { modalContentType, isOpen, getModalState, setModalState, clearModalState } = useModal();
|
||||
|
||||
const isCurrentModal = modalContentType === modalType;
|
||||
const savedState = getModalState(modalType) as T | undefined;
|
||||
|
||||
|
||||
// get current form state (using the saved values if available, otherwise the initial values)
|
||||
const formState = savedState || initialValues;
|
||||
|
||||
// Keep refs so the callbacks below stay stable across re-renders.
|
||||
const modalTypeRef = useRef(modalType);
|
||||
const initialValuesRef = useRef(initialValues);
|
||||
const getModalStateRef = useRef(getModalState);
|
||||
modalTypeRef.current = modalType;
|
||||
initialValuesRef.current = initialValues;
|
||||
getModalStateRef.current = getModalState;
|
||||
const saveFormState = (state: Partial<T>) => {
|
||||
if (!isCurrentModal) return;
|
||||
|
||||
const currentState = getModalState(modalType) || initialValues;
|
||||
const newState = { ...currentState, ...state };
|
||||
setModalState(modalType, newState);
|
||||
};
|
||||
|
||||
const saveFormState = useCallback(
|
||||
(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]);
|
||||
const clearFormState = () => {
|
||||
clearModalState(modalType);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (resetOnClose && !isOpen && savedState) {
|
||||
@@ -64,4 +45,4 @@ export function useModalFormState<T extends Record<string, any>>({
|
||||
isCurrentModal,
|
||||
hasSavedState: !!savedState,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} nicht gefunden"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"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)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Beschreibung hinzufügen... (‚/' für Befehle oder ‚@' zum Erwähnen eingeben)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Jährlich"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Archiviert"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Ideal für kleine Teams, die gemeinsam arbeiten und schneller vorankommen möchten."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Boards"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Tarif wählen"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Bestätigen Sie Ihre E-Mail-Einstellungen:",
|
||||
"obsolete": true
|
||||
"translation": "Bestätigen Sie Ihre E-Mail-Einstellungen:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Weiter"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Neues {0} erstellen"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Neue Liste erstellen"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Workspace erstellen"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Möchten Sie das Abonnement kündigen?",
|
||||
"obsolete": true
|
||||
"translation": "Möchten Sie das Abonnement kündigen?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Legen Sie los, indem Sie eine neue Liste erstellen"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Zu den Boards"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Zu den Mitgliedern"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Zu den Einstellungen"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Zu Vorlagen gehen"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Gut geeignet für Einsteiger, die nur die wichtigsten Funktionen benötigen."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importieren"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Neu"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Neue Liste"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Keine Listen"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Es wurden noch keine Listen erstellt"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Wählen Sie einen Tarif, um loszulegen. Alle kostenpflichtigen Tarife beinhalten eine 14-tägige kostenlose Testphase."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Einstellungen"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Abmelden"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Solo"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Kostenlose Testversion starten"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Status"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Absenden"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Team"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Vorlage"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Vorlagen"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Kommentar konnte nicht hinzugefügt werden"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Karte konnte nicht aktualisiert werden"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Liste konnte nicht aktualisiert werden"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Unbegrenzte Mitglieder und ein individueller Workspace-Benutzername für Teams, die wachsen möchten."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Abmelden",
|
||||
"obsolete": true
|
||||
"translation": "Abmelden"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Upgrade"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "Wir konnten Ihre Einstellungen nicht aktualisieren. Bitte versuchen Sie es erneut.",
|
||||
"obsolete": true
|
||||
"translation": "Wir konnten Ihre Einstellungen nicht aktualisieren. Bitte versuchen Sie es erneut."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "Sie haben keine Berechtigung"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Sie wurden abgemeldet!",
|
||||
"obsolete": true
|
||||
"translation": "Sie wurden abgemeldet!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Ihr Avatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"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.",
|
||||
"obsolete": true
|
||||
"translation": "Ihrem Abmelde-Link fehlt ein Token. Bitte öffnen Sie die neueste E-Mail und versuchen Sie es erneut."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
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\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} no encontrado"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"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)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Añadir descripción... (escribe '/' para abrir comandos o '@' para mencionar)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Anual"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Archivado"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Ideal para equipos pequeños que desean colaborar y avanzar más rápido juntos."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Tableros"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Elige un plan"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Confirma tus preferencias de correo electrónico:",
|
||||
"obsolete": true
|
||||
"translation": "Confirma tus preferencias de correo electrónico:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Continuar"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Crear nuevo {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Crear nueva lista"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Crear espacio de trabajo"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "¿Quieres cancelar la suscripción?",
|
||||
"obsolete": true
|
||||
"translation": "¿Quieres cancelar la suscripción?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Comienza creando una nueva lista"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Ir a tableros"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Ir a miembros"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Ir a configuración"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Ir a plantillas"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Ideal para personas que comienzan y solo necesitan lo esencial."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importar"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Nuevo"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Nueva lista"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Sin listas"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Aún no se han creado listas"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Elige un plan para comenzar. Todos los planes de pago incluyen una prueba gratuita de 14 días."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Configuración"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Cerrar sesión"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Individual"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Iniciar prueba gratuita"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Estado"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Enviar"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Equipo"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Plantilla"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Plantillas"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "No se pudo agregar el comentario"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "No se pudo actualizar la tarjeta"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "No se pudo actualizar la lista"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Miembros ilimitados y un nombre de usuario personalizado para el espacio de trabajo para equipos listos para escalar."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Cancelar suscripción",
|
||||
"obsolete": true
|
||||
"translation": "Cancelar suscripción"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Actualizar"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "No pudimos actualizar tus preferencias. Por favor, inténtalo de nuevo.",
|
||||
"obsolete": true
|
||||
"translation": "No pudimos actualizar tus preferencias. Por favor, inténtalo de nuevo."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "No tienes permiso"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "¡Te has dado de baja!",
|
||||
"obsolete": true
|
||||
"translation": "¡Te has dado de baja!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Tu avatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"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.",
|
||||
"obsolete": true
|
||||
"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."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} introuvable"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"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)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Ajouter une description... (tapez « / » pour ouvrir les commandes ou « @ » pour mentionner)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Annuel"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Archivé"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Idéal pour les petites équipes qui souhaitent collaborer et avancer plus rapidement ensemble."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Tableaux"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Choisir un forfait"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Confirmez vos préférences d'e-mail :",
|
||||
"obsolete": true
|
||||
"translation": "Confirmez vos préférences d'e-mail :"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Continuer"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Créer un nouveau {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Créer une nouvelle liste"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Créer un espace de travail"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Voulez-vous vous désabonner ?",
|
||||
"obsolete": true
|
||||
"translation": "Voulez-vous vous désabonner ?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Commencez en créant une nouvelle liste"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Aller aux tableaux"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Aller aux membres"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Aller aux paramètres"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Aller aux modèles"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Idéal pour les particuliers qui débutent et qui ont simplement besoin de l'essentiel."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importer"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Nouveau"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Nouvelle liste"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Aucune liste"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Aucune liste n'a encore été créée"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Choisissez un forfait pour commencer. Tous les forfaits payants incluent un essai gratuit de 14 jours."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Paramètres"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Se déconnecter"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Solo"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Commencer l'essai gratuit"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Statut"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Soumettre"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Équipe"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Modèle"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Modèles"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Impossible d'ajouter le commentaire"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Impossible de mettre à jour la carte"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Impossible de mettre à jour la liste"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Membres illimités et un nom d'utilisateur d'espace de travail personnalisé pour les équipes prêtes à évoluer."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Se désabonner",
|
||||
"obsolete": true
|
||||
"translation": "Se désabonner"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Mettre à niveau"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "Nous n'avons pas pu mettre à jour vos préférences. Veuillez réessayer.",
|
||||
"obsolete": true
|
||||
"translation": "Nous n'avons pas pu mettre à jour vos préférences. Veuillez réessayer."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "Vous n'avez pas la permission"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Vous avez été désabonné !",
|
||||
"obsolete": true
|
||||
"translation": "Vous avez été désabonné !"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Votre avatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"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.",
|
||||
"obsolete": true
|
||||
"translation": "Votre lien de désinscription ne contient pas de jeton. Veuillez ouvrir le dernier e-mail et réessayer."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -7,14 +7,12 @@ export const locales = [
|
||||
"nl",
|
||||
"ru",
|
||||
"pl",
|
||||
"ptbr",
|
||||
"zh-CN",
|
||||
"ptbr"
|
||||
] as const;
|
||||
|
||||
export type Locale = (typeof locales)[number];
|
||||
|
||||
// 自托管实例默认使用简体中文,用户仍可在设置中切换其他语言。
|
||||
export const defaultLocale: Locale = "zh-CN";
|
||||
export const defaultLocale: Locale = "en";
|
||||
|
||||
export const localeNames: Record<Locale, string> = {
|
||||
en: "English",
|
||||
@@ -26,5 +24,4 @@ export const localeNames: Record<Locale, string> = {
|
||||
ru: "Русский",
|
||||
pl: "Polski",
|
||||
ptbr: "Português",
|
||||
"zh-CN": "简体中文",
|
||||
};
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} non trovato"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"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)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Aggiungi descrizione... (digita '/' per aprire i comandi o '@' per menzionare)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Annuale"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Archiviato"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Ideale per piccoli team che vogliono collaborare e muoversi più velocemente insieme."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Board"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Scegli un piano"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Conferma le tue preferenze email:",
|
||||
"obsolete": true
|
||||
"translation": "Conferma le tue preferenze email:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Continua"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Crea nuovo {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Crea nuova lista"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Crea workspace"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Vuoi annullare l'iscrizione?",
|
||||
"obsolete": true
|
||||
"translation": "Vuoi annullare l'iscrizione?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Inizia creando una nuova lista"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Vai alle bacheche"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Vai ai membri"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Vai alle impostazioni"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Vai ai modelli"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Perfetto per chi inizia e ha bisogno solo delle funzionalità essenziali."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importa"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Nuovo"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Nuova lista"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Nessuna lista"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Nessuna lista è stata ancora creata"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Scegli un piano per iniziare. Tutti i piani a pagamento includono una prova gratuita di 14 giorni."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Impostazioni"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Esci"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Solo"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Inizia prova gratuita"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Stato"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Invia"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Team"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Template"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Template"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Impossibile aggiungere il commento"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Impossibile aggiornare la card"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Impossibile aggiornare la lista"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Membri illimitati e un nome utente workspace personalizzato per i team pronti a crescere."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Annulla iscrizione",
|
||||
"obsolete": true
|
||||
"translation": "Annulla iscrizione"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Aggiorna"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "Non è stato possibile aggiornare le tue preferenze. Riprova.",
|
||||
"obsolete": true
|
||||
"translation": "Non è stato possibile aggiornare le tue preferenze. Riprova."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "Non hai i permessi necessari"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Hai annullato l'iscrizione!",
|
||||
"obsolete": true
|
||||
"translation": "Hai annullato l'iscrizione!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Il tuo avatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||
"translation": "Il tuo link di disiscrizione non contiene un token. Apri l'ultima email e riprova.",
|
||||
"obsolete": true
|
||||
"translation": "Il tuo link di disiscrizione non contiene un token. Apri l'ultima email e riprova."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} niet gevonden"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"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)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Voeg beschrijving toe... (typ '/' om commando's te openen of '@' om te vermelden)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Jaarlijks"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Gearchiveerd"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Het beste voor kleine teams die willen samenwerken en sneller vooruit willen komen."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Boards"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Kies een abonnement"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Bevestig je e-mailvoorkeuren:",
|
||||
"obsolete": true
|
||||
"translation": "Bevestig je e-mailvoorkeuren:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Doorgaan"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Maak nieuwe {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Maak nieuwe lijst"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Maak werkruimte"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Wil je je uitschrijven?",
|
||||
"obsolete": true
|
||||
"translation": "Wil je je uitschrijven?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Ga aan de slag door een nieuwe lijst te maken"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Ga naar borden"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Ga naar leden"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Ga naar instellingen"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Ga naar sjablonen"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Geschikt voor individuen die net beginnen en alleen de basisbehoeften hebben."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importeren"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Nieuw"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Nieuwe lijst"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Geen lijsten"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Er zijn nog geen lijsten aangemaakt"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Kies een abonnement om te beginnen. Alle betaalde abonnementen hebben een gratis proefperiode van 14 dagen."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Instellingen"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Uitloggen"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Solo"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Start gratis proefperiode"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Status"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Verzenden"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Team"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Sjabloon"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Sjablonen"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Kan opmerking niet toevoegen"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Kan kaart niet bijwerken"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Kan lijst niet bijwerken"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Onbeperkt aantal leden en een aangepaste werkruimte-URL voor teams die klaar zijn om te groeien."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Uitschrijven",
|
||||
"obsolete": true
|
||||
"translation": "Uitschrijven"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Upgraden"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "We konden je voorkeuren niet bijwerken. Probeer het opnieuw.",
|
||||
"obsolete": true
|
||||
"translation": "We konden je voorkeuren niet bijwerken. Probeer het opnieuw."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "Je hebt geen toestemming"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Je bent uitgeschreven!",
|
||||
"obsolete": true
|
||||
"translation": "Je bent uitgeschreven!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Jouw avatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||
"translation": "Je afmeldlink mist een token. Open de nieuwste e-mail en probeer het opnieuw.",
|
||||
"obsolete": true
|
||||
"translation": "Je afmeldlink mist een token. Open de nieuwste e-mail en probeer het opnieuw."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} nie znaleziono"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"translation": "Dodaj komentarz... (wpisz '/' aby otworzyć polecenia lub '@', aby wspomnieć)"
|
||||
},
|
||||
@@ -294,7 +294,7 @@
|
||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Dodaj opis... (wpisz '/' aby otworzyć polecenia lub '@', aby wspomnieć)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Rocznie"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Zarchiwizowana"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Najlepszy dla małych zespołów, które chcą współpracować i działać szybciej razem."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Tablice"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Wybierz plan"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Potwierdź swoje preferencje dotyczące e-maili:",
|
||||
"obsolete": true
|
||||
"translation": "Potwierdź swoje preferencje dotyczące e-maili:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Kontynuuj"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Utwórz nową {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Utwórz nową listę"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Utwórz workspace"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Czy chcesz zrezygnować z subskrypcji?",
|
||||
"obsolete": true
|
||||
"translation": "Czy chcesz zrezygnować z subskrypcji?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Rozpocznij, tworząc nową listę"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Przejdź do tablic"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Przejdź do członków"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Przejdź do ustawień"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Przejdź do szablonów"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Dobry dla osób zaczynających, które potrzebują tylko podstaw."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importuj"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Nowy"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Nowa lista"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Brak list"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Nie utworzono jeszcze żadnych list"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Wybierz plan, aby rozpocząć. Wszystkie płatne plany zawierają 14-dniowy bezpłatny okres próbny."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Ustawienia"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Wyloguj się"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Solo"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Rozpocznij bezpłatny okres próbny"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Status"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Prześlij"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Zespół"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Szablon"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Szablony"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Nie można dodać komentarza"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Nie można zaktualizować karty"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Nie można zaktualizować listy"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Nieograniczona liczba członków i niestandardowa nazwa użytkownika przestrzeni roboczej dla zespołów gotowych do rozwoju."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Anuluj subskrypcję",
|
||||
"obsolete": true
|
||||
"translation": "Anuluj subskrypcję"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Uaktualnij"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "Nie udało się zaktualizować Twoich preferencji. Spróbuj ponownie.",
|
||||
"obsolete": true
|
||||
"translation": "Nie udało się zaktualizować Twoich preferencji. Spróbuj ponownie."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "Nie masz uprawnień"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Zostałeś wypisany z subskrypcji!",
|
||||
"obsolete": true
|
||||
"translation": "Zostałeś wypisany z subskrypcji!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Twój awatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"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.",
|
||||
"obsolete": true
|
||||
"translation": "Twój link do wypisania się nie zawiera tokena. Otwórz najnowszy e-mail i spróbuj ponownie."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} não encontrado"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"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)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Adicionar descrição... (digite '/' para abrir comandos ou '@' para mencionar)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Anual"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "Arquivado"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Ideal para pequenas equipes que desejam colaborar e avançar mais rápido juntas."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Quadros"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Escolha um plano"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Confirme suas preferências de e-mail:",
|
||||
"obsolete": true
|
||||
"translation": "Confirme suas preferências de e-mail:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Continuar"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Criar novo {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Criar nova lista"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Criar workspace"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Você deseja cancelar a assinatura?",
|
||||
"obsolete": true
|
||||
"translation": "Você deseja cancelar a assinatura?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Comece criando uma nova lista"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Ir para quadros"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Ir para membros"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Ir para configurações"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Ir para modelos"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Bom para indivíduos começando que precisam apenas do essencial."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Importar"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Novo"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Nova lista"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Nenhuma lista"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Nenhuma lista foi criada ainda"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Escolha um plano para começar. Todos os planos pagos incluem 14 dias de teste grátis."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Configurações"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Sair"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Solo"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Iniciar teste gratuito"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Status"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Enviar"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Equipe"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Modelo"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Templates"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Não foi possível adicionar comentário"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Não foi possível atualizar o cartão"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Não foi possível atualizar a lista"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Membros ilimitados e um nome de usuário personalizado para equipes prontas para crescer."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Cancelar inscrição",
|
||||
"obsolete": true
|
||||
"translation": "Cancelar inscrição"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Atualizar"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "Não foi possível atualizar suas preferências. Tente novamente.",
|
||||
"obsolete": true
|
||||
"translation": "Não foi possível atualizar suas preferências. Tente novamente."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "Você não tem permissão"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Você cancelou a inscrição!",
|
||||
"obsolete": true
|
||||
"translation": "Você cancelou a inscrição!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Seu avatar"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"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.",
|
||||
"obsolete": true
|
||||
"translation": "Seu link de cancelamento de inscrição está sem um token. Por favor, abra o e-mail mais recente e tente novamente."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -19,7 +19,7 @@
|
||||
"0": ["isTemplate ? \"Templates\" : \"Boards\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 62]],
|
||||
"origin": [["src/views/boards/index.tsx", 53]],
|
||||
"translation": "{0}"
|
||||
},
|
||||
"JArWcF": {
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/card/index.tsx", 321]
|
||||
],
|
||||
"translation": "{0} | {1}"
|
||||
@@ -71,7 +71,7 @@
|
||||
"0": ["isTemplate ? \"Template\" : \"Board\""]
|
||||
},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 570]],
|
||||
"origin": [["src/views/board/index.tsx", 565]],
|
||||
"translation": "{0} не найдено"
|
||||
},
|
||||
"0xWkkH": {
|
||||
@@ -220,7 +220,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 30],
|
||||
["src/views/boards/index.tsx", 26],
|
||||
["src/views/settings/components/NewWebhookModal.tsx", 321],
|
||||
["src/views/settings/components/WebhookList.tsx", 106]
|
||||
],
|
||||
@@ -286,7 +286,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/card/components/Comment.tsx", 185],
|
||||
["src/views/card/components/NewCommentForm.tsx", 85]
|
||||
["src/views/card/components/NewCommentForm.tsx", 68]
|
||||
],
|
||||
"translation": "Добавить комментарий... (введите '/' для открытия команд или '@' для упоминания)"
|
||||
},
|
||||
@@ -294,7 +294,7 @@
|
||||
"message": "Add description... (type '/' to open commands or '@' to mention)",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/Editor.tsx", 499]],
|
||||
"origin": [["src/components/Editor.tsx", 493]],
|
||||
"translation": "Добавить описание... (введите '/' для открытия команд или '@' для упоминания)"
|
||||
},
|
||||
"abUZlY": {
|
||||
@@ -577,7 +577,7 @@
|
||||
"message": "Annual",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 68]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 64]],
|
||||
"translation": "Ежегодно"
|
||||
},
|
||||
"3bqt9U": {
|
||||
@@ -664,7 +664,7 @@
|
||||
"message": "Archived",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 31]],
|
||||
"origin": [["src/views/boards/index.tsx", 27]],
|
||||
"translation": "В архиве"
|
||||
},
|
||||
"lo8xBK": {
|
||||
@@ -833,7 +833,7 @@
|
||||
"message": "Best for small teams who want to collaborate and move faster together.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 91]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 87]],
|
||||
"translation": "Идеально для небольших команд, которые хотят сотрудничать и работать быстрее вместе."
|
||||
},
|
||||
"qaS+1/": {
|
||||
@@ -887,7 +887,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/card/index.tsx", 321],
|
||||
["src/views/public/board/index.tsx", 125]
|
||||
],
|
||||
@@ -1006,7 +1006,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 98],
|
||||
["src/components/SideNavigation.tsx", 97],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 73]
|
||||
],
|
||||
"translation": "Доски"
|
||||
@@ -1294,7 +1294,7 @@
|
||||
["src/views/card/components/DeleteChecklistConfirmation.tsx", 64],
|
||||
["src/views/card/components/DeleteCommentConfirmation.tsx", 77],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 55],
|
||||
["src/views/onboarding/select-plan/index.tsx", 240],
|
||||
["src/views/onboarding/select-plan/index.tsx", 236],
|
||||
["src/views/settings/components/Avatar.tsx", 287],
|
||||
["src/views/settings/components/ChangePasswordConfirmation.tsx", 206],
|
||||
[
|
||||
@@ -1361,7 +1361,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/board/index.tsx", 309],
|
||||
["src/views/card/components/Dropdown.tsx", 74],
|
||||
["src/views/public/board/CardModal.tsx", 38]
|
||||
],
|
||||
@@ -1444,7 +1444,7 @@
|
||||
"message": "Choose a plan",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 153]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 149]],
|
||||
"translation": "Выберите тариф"
|
||||
},
|
||||
"5EMoSo": {
|
||||
@@ -1626,8 +1626,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 81]],
|
||||
"translation": "Подтвердите ваши настройки электронной почты:",
|
||||
"obsolete": true
|
||||
"translation": "Подтвердите ваши настройки электронной почты:"
|
||||
},
|
||||
"479pdJ": {
|
||||
"message": "Confirm your new password",
|
||||
@@ -1720,7 +1719,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 246],
|
||||
["src/views/onboarding/select-plan/index.tsx", 242],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 315]
|
||||
],
|
||||
"translation": "Продолжить"
|
||||
@@ -1889,7 +1888,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/components/BoardsList.tsx", 80],
|
||||
["src/views/boards/index.tsx", 45]
|
||||
["src/views/boards/index.tsx", 41]
|
||||
],
|
||||
"translation": "Создать новый {0}"
|
||||
},
|
||||
@@ -1915,8 +1914,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 99],
|
||||
["src/views/board/index.tsx", 684]
|
||||
["src/views/board/index.tsx", 93],
|
||||
["src/views/board/index.tsx", 679]
|
||||
],
|
||||
"translation": "Создать новый список"
|
||||
},
|
||||
@@ -1940,7 +1939,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/NewWorkspaceForm.tsx", 227],
|
||||
["src/components/WorkspaceMenu.tsx", 176]
|
||||
["src/components/WorkspaceMenu.tsx", 171]
|
||||
],
|
||||
"translation": "Создать рабочее пространство"
|
||||
},
|
||||
@@ -2295,8 +2294,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 78]],
|
||||
"translation": "Вы хотите отписаться?",
|
||||
"obsolete": true
|
||||
"translation": "Вы хотите отписаться?"
|
||||
},
|
||||
"JyXBgS": {
|
||||
"message": "docs",
|
||||
@@ -3018,8 +3016,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 82],
|
||||
["src/views/onboarding/select-plan/index.tsx", 83],
|
||||
["src/views/onboarding/select-plan/index.tsx", 78],
|
||||
["src/views/onboarding/select-plan/index.tsx", 79],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 331],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
["src/views/pricing/components/Pricing.tsx", 32],
|
||||
@@ -3127,7 +3125,7 @@
|
||||
"message": "Get started by creating a new list",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 669]],
|
||||
"origin": [["src/views/board/index.tsx", 664]],
|
||||
"translation": "Начните с создания нового списка"
|
||||
},
|
||||
"oW13KZ": {
|
||||
@@ -3204,7 +3202,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 106],
|
||||
["src/components/SideNavigation.tsx", 105],
|
||||
["src/pages/404.tsx", 44]
|
||||
],
|
||||
"translation": "Перейти к доскам"
|
||||
@@ -3220,28 +3218,28 @@
|
||||
"message": "Go to members",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 130]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 129]],
|
||||
"translation": "Перейти к участникам"
|
||||
},
|
||||
"1WuwiM": {
|
||||
"message": "Go to settings",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 142]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 141]],
|
||||
"translation": "Перейти к настройкам"
|
||||
},
|
||||
"csFbe+": {
|
||||
"message": "Go to templates",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/components/SideNavigation.tsx", 118]],
|
||||
"origin": [["src/components/SideNavigation.tsx", 117]],
|
||||
"translation": "Перейти к шаблонам"
|
||||
},
|
||||
"SUvm1Y": {
|
||||
"message": "Good for individuals starting out who just need the essentials.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 80]],
|
||||
"translation": "Подходит для начинающих пользователей, которым нужны только базовые функции."
|
||||
},
|
||||
"cdyS7J": {
|
||||
@@ -3384,7 +3382,7 @@
|
||||
"message": "Import",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/boards/index.tsx", 82]],
|
||||
"origin": [["src/views/boards/index.tsx", 73]],
|
||||
"translation": "Импорт"
|
||||
},
|
||||
"2MPcep": {
|
||||
@@ -3767,7 +3765,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 80],
|
||||
["src/views/board/index.tsx", 312],
|
||||
["src/views/board/index.tsx", 307],
|
||||
["src/views/card/components/Dropdown.tsx", 72],
|
||||
["src/views/public/board/CardModal.tsx", 36],
|
||||
["src/views/public/board/index.tsx", 77]
|
||||
@@ -3947,7 +3945,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 122],
|
||||
["src/components/SideNavigation.tsx", 121],
|
||||
["src/views/board/components/Filters.tsx", 147],
|
||||
["src/views/board/components/NewCardForm.tsx", 386],
|
||||
["src/views/card/index.tsx", 143],
|
||||
@@ -3988,7 +3986,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 67],
|
||||
["src/views/onboarding/select-plan/index.tsx", 63],
|
||||
["src/views/pricing/components/Pricing.tsx", 14],
|
||||
["src/views/pricing/index.tsx", 20]
|
||||
],
|
||||
@@ -4092,7 +4090,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/boards/index.tsx", 104],
|
||||
["src/views/boards/index.tsx", 95],
|
||||
["src/views/home/components/Features.tsx", 73]
|
||||
],
|
||||
"translation": "Новый"
|
||||
@@ -4147,7 +4145,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/components/NewListForm.tsx", 113],
|
||||
["src/views/board/index.tsx", 633]
|
||||
["src/views/board/index.tsx", 628]
|
||||
],
|
||||
"translation": "Новый список"
|
||||
},
|
||||
@@ -4280,14 +4278,14 @@
|
||||
"message": "No lists",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"origin": [["src/views/board/index.tsx", 660]],
|
||||
"translation": "Нет списков"
|
||||
},
|
||||
"fvLNDy": {
|
||||
"message": "No lists have been created yet",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/board/index.tsx", 670]],
|
||||
"origin": [["src/views/board/index.tsx", 665]],
|
||||
"translation": "Списки ещё не созданы"
|
||||
},
|
||||
"i30J2U": {
|
||||
@@ -4604,7 +4602,7 @@
|
||||
"message": "Pick a plan to get started. All paid plans include a 14-day free trial.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 156]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 152]],
|
||||
"translation": "Выберите тариф, чтобы начать. Все платные тарифы включают 14-дневный бесплатный пробный период."
|
||||
},
|
||||
"GdgCoi": {
|
||||
@@ -4709,8 +4707,8 @@
|
||||
["src/views/board/components/NewTemplateForm.tsx", 77],
|
||||
["src/views/board/components/UpdateBoardSlugForm.tsx", 73],
|
||||
["src/views/board/components/VisibilityButton.tsx", 57],
|
||||
["src/views/board/index.tsx", 224],
|
||||
["src/views/board/index.tsx", 280],
|
||||
["src/views/board/index.tsx", 219],
|
||||
["src/views/board/index.tsx", 275],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 243],
|
||||
["src/views/boards/components/ImportBoardsForm.tsx", 395],
|
||||
["src/views/card/components/AttachmentThumbnails.tsx", 74],
|
||||
@@ -4728,7 +4726,7 @@
|
||||
["src/views/card/components/MemberSelector.tsx", 82],
|
||||
["src/views/card/components/NewChecklistForm.tsx", 71],
|
||||
["src/views/card/components/NewChecklistItemForm.tsx", 90],
|
||||
["src/views/card/components/NewCommentForm.tsx", 38],
|
||||
["src/views/card/components/NewCommentForm.tsx", 37],
|
||||
["src/views/card/index.tsx", 236],
|
||||
["src/views/card/index.tsx", 249],
|
||||
["src/views/members/components/DeleteMemberConfirmation.tsx", 28],
|
||||
@@ -4768,7 +4766,7 @@
|
||||
"origin": [
|
||||
["src/views/board/components/CardContextDuplicateModal.tsx", 76],
|
||||
["src/views/board/components/CardContextMoveListModal.tsx", 42],
|
||||
["src/views/board/index.tsx", 321],
|
||||
["src/views/board/index.tsx", 316],
|
||||
["src/views/card/components/Dropdown.tsx", 55],
|
||||
["src/views/card/components/Dropdown.tsx", 81],
|
||||
["src/views/card/components/Dropdown.tsx", 100],
|
||||
@@ -4831,7 +4829,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 96],
|
||||
["src/views/onboarding/select-plan/index.tsx", 92],
|
||||
["src/views/pricing/components/FeatureComparisonTable.tsx", 333],
|
||||
["src/views/pricing/components/PricingTiers.tsx", 70]
|
||||
],
|
||||
@@ -5361,7 +5359,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 102],
|
||||
["src/components/SideNavigation.tsx", 134]
|
||||
["src/components/SideNavigation.tsx", 133]
|
||||
],
|
||||
"translation": "Настройки"
|
||||
},
|
||||
@@ -5456,7 +5454,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/onboarding/select-plan/index.tsx", 319],
|
||||
["src/views/onboarding/select-plan/index.tsx", 315],
|
||||
["src/views/onboarding/workspace-details/index.tsx", 386]
|
||||
],
|
||||
"translation": "Выйти"
|
||||
@@ -5550,7 +5548,7 @@
|
||||
"message": "Solo",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 81]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 77]],
|
||||
"translation": "Индивидуальный"
|
||||
},
|
||||
"J9+zIR": {
|
||||
@@ -5597,9 +5595,9 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 228],
|
||||
["src/components/SideNavigation.tsx", 229],
|
||||
["src/components/SideNavigation.tsx", 239]
|
||||
["src/components/SideNavigation.tsx", 225],
|
||||
["src/components/SideNavigation.tsx", 226],
|
||||
["src/components/SideNavigation.tsx", 236]
|
||||
],
|
||||
"translation": "Начать бесплатный пробный период"
|
||||
},
|
||||
@@ -5617,13 +5615,6 @@
|
||||
"origin": [["src/views/settings/components/WebhookList.tsx", 232]],
|
||||
"translation": "Статус"
|
||||
},
|
||||
"hQRttt": {
|
||||
"message": "Submit",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 60]],
|
||||
"translation": "Отправить"
|
||||
},
|
||||
"WYDptz": {
|
||||
"message": "Subscription Required",
|
||||
"placeholders": {},
|
||||
@@ -5687,7 +5678,7 @@
|
||||
"message": "Team",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 88]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 84]],
|
||||
"translation": "Команда"
|
||||
},
|
||||
"bff61F": {
|
||||
@@ -5717,8 +5708,8 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/board/index.tsx", 579]
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/board/index.tsx", 574]
|
||||
],
|
||||
"translation": "Шаблон"
|
||||
},
|
||||
@@ -5755,7 +5746,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SideNavigation.tsx", 110],
|
||||
["src/components/SideNavigation.tsx", 109],
|
||||
["src/views/home/components/Features.tsx", 115]
|
||||
],
|
||||
"translation": "Шаблоны"
|
||||
@@ -6156,7 +6147,7 @@
|
||||
"message": "Unable to add comment",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 37]],
|
||||
"origin": [["src/views/card/components/NewCommentForm.tsx", 36]],
|
||||
"translation": "Не удалось добавить комментарий"
|
||||
},
|
||||
"2Q871c": {
|
||||
@@ -6185,7 +6176,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 319],
|
||||
["src/views/board/index.tsx", 314],
|
||||
["src/views/card/components/Dropdown.tsx", 79],
|
||||
["src/views/public/board/CardModal.tsx", 43],
|
||||
["src/views/public/board/index.tsx", 84]
|
||||
@@ -6385,7 +6376,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 279],
|
||||
["src/views/board/index.tsx", 274],
|
||||
["src/views/card/index.tsx", 235]
|
||||
],
|
||||
"translation": "Не удалось обновить карточку"
|
||||
@@ -6430,7 +6421,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/board/index.tsx", 223],
|
||||
["src/views/board/index.tsx", 218],
|
||||
["src/views/card/components/ListSelector.tsx", 54]
|
||||
],
|
||||
"translation": "Не удалось обновить список"
|
||||
@@ -6583,7 +6574,7 @@
|
||||
"message": "Unlimited members and a custom workspace username for teams ready to scale.",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 99]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 95]],
|
||||
"translation": "Неограниченное количество участников и персональное имя рабочего пространства для команд, готовых к масштабированию."
|
||||
},
|
||||
"i5yNAO": {
|
||||
@@ -6608,8 +6599,7 @@
|
||||
["src/pages/unsubscribe/index.tsx", 68],
|
||||
["src/pages/unsubscribe/index.tsx", 93]
|
||||
],
|
||||
"translation": "Отписаться",
|
||||
"obsolete": true
|
||||
"translation": "Отписаться"
|
||||
},
|
||||
"EkH9pt": {
|
||||
"message": "Update",
|
||||
@@ -6674,7 +6664,7 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/views/members/index.tsx", 295],
|
||||
["src/views/onboarding/select-plan/index.tsx", 245]
|
||||
["src/views/onboarding/select-plan/index.tsx", 241]
|
||||
],
|
||||
"translation": "Обновить"
|
||||
},
|
||||
@@ -6854,8 +6844,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 63]],
|
||||
"translation": "Не удалось обновить ваши настройки. Пожалуйста, попробуйте ещё раз.",
|
||||
"obsolete": true
|
||||
"translation": "Не удалось обновить ваши настройки. Пожалуйста, попробуйте ещё раз."
|
||||
},
|
||||
"7sdSkl": {
|
||||
"message": "We sent a link to {magicLinkRecipient}",
|
||||
@@ -7008,8 +6997,8 @@
|
||||
"comments": [],
|
||||
"origin": [
|
||||
["src/components/SettingsLayout.tsx", 47],
|
||||
["src/views/board/index.tsx", 543],
|
||||
["src/views/boards/index.tsx", 57],
|
||||
["src/views/board/index.tsx", 538],
|
||||
["src/views/boards/index.tsx", 48],
|
||||
["src/views/members/index.tsx", 278],
|
||||
["src/views/public/board/index.tsx", 125],
|
||||
["src/views/public/boards/index.tsx", 75]
|
||||
@@ -7238,11 +7227,11 @@
|
||||
["src/views/board/components/List.tsx", 117],
|
||||
["src/views/board/components/UpdateBoardSlugButton.tsx", 58],
|
||||
["src/views/board/components/VisibilityButton.tsx", 72],
|
||||
["src/views/board/index.tsx", 617],
|
||||
["src/views/board/index.tsx", 675],
|
||||
["src/views/board/index.tsx", 612],
|
||||
["src/views/board/index.tsx", 670],
|
||||
["src/views/boards/components/BoardsList.tsx", 71],
|
||||
["src/views/boards/index.tsx", 68],
|
||||
["src/views/boards/index.tsx", 89]
|
||||
["src/views/boards/index.tsx", 59],
|
||||
["src/views/boards/index.tsx", 80]
|
||||
],
|
||||
"translation": "У вас нет прав доступа"
|
||||
},
|
||||
@@ -7265,8 +7254,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 98]],
|
||||
"translation": "Вы отписались!",
|
||||
"obsolete": true
|
||||
"translation": "Вы отписались!"
|
||||
},
|
||||
"R275Pz": {
|
||||
"message": "You have unlimited seats with your Pro Plan. There is no additional charge for new members!",
|
||||
@@ -7335,7 +7323,7 @@
|
||||
"message": "Your avatar",
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 264]],
|
||||
"origin": [["src/views/onboarding/select-plan/index.tsx", 260]],
|
||||
"translation": "Ваш аватар"
|
||||
},
|
||||
"evg7+A": {
|
||||
@@ -7445,8 +7433,7 @@
|
||||
"placeholders": {},
|
||||
"comments": [],
|
||||
"origin": [["src/pages/unsubscribe/index.tsx", 33]],
|
||||
"translation": "В вашей ссылке для отписки отсутствует токен. Пожалуйста, откройте последнее письмо и попробуйте снова.",
|
||||
"obsolete": true
|
||||
"translation": "В вашей ссылке для отписки отсутствует токен. Пожалуйста, откройте последнее письмо и попробуйте снова."
|
||||
},
|
||||
"GRAGsB": {
|
||||
"message": "Your workspace",
|
||||
|
||||
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
@@ -82,8 +82,8 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
|
||||
)}
|
||||
<script src="/__ENV.js" />
|
||||
<main className="font-sans">
|
||||
<LinguiProviderWrapper>
|
||||
<KeyboardShortcutProvider>
|
||||
<KeyboardShortcutProvider>
|
||||
<LinguiProviderWrapper>
|
||||
<FontSizeProvider>
|
||||
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
||||
<ModalProvider>
|
||||
@@ -99,8 +99,8 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
|
||||
</ModalProvider>
|
||||
</ThemeProvider>
|
||||
</FontSizeProvider>
|
||||
</KeyboardShortcutProvider>
|
||||
</LinguiProviderWrapper>
|
||||
</LinguiProviderWrapper>
|
||||
</KeyboardShortcutProvider>
|
||||
</main>
|
||||
</>
|
||||
);
|
||||
|
||||
108
apps/web/src/pages/api/unsubscribe.ts
Normal file
108
apps/web/src/pages/api/unsubscribe.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
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 });
|
||||
},
|
||||
),
|
||||
);
|
||||
110
apps/web/src/pages/unsubscribe/index.tsx
Normal file
110
apps/web/src/pages/unsubscribe/index.tsx
Normal file
@@ -0,0 +1,110 @@
|
||||
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,7 +20,6 @@ import { HiXMark } from "react-icons/hi2";
|
||||
|
||||
import { env } from "~/env";
|
||||
import { useEventListener } from "~/hooks/useEventListener";
|
||||
import { useLinguiContext } from "~/providers/lingui";
|
||||
|
||||
const ModifierKey = {
|
||||
CONTROL: "CONTROL",
|
||||
@@ -161,7 +160,6 @@ export function KeyboardShortcutProvider({
|
||||
const sequenceTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
||||
|
||||
const [isLegendOpen, setIsLegendOpen] = useState(false);
|
||||
const { locale } = useLinguiContext();
|
||||
|
||||
const openLegendShortcut: KeyboardShortcut = useMemo(
|
||||
() => ({
|
||||
@@ -174,7 +172,7 @@ export function KeyboardShortcutProvider({
|
||||
description: t`Open keyboard shortcuts`,
|
||||
group: ShortcutGroup.GENERAL,
|
||||
}),
|
||||
[locale],
|
||||
[setIsLegendOpen],
|
||||
);
|
||||
|
||||
const handleKeyDown = useCallback((event: KeyboardEvent) => {
|
||||
|
||||
@@ -35,31 +35,10 @@ function detectBrowserLocale(availableLocales: readonly string[]): Locale {
|
||||
const browserLanguages = navigator.languages || [navigator.language];
|
||||
|
||||
for (const browserLang of browserLanguages) {
|
||||
const normalizedLocale = browserLang.toLowerCase();
|
||||
const exactLocale = availableLocales.find(
|
||||
(availableLocale) => availableLocale.toLowerCase() === normalizedLocale,
|
||||
);
|
||||
const langCode = browserLang.split("-")[0];
|
||||
|
||||
if (exactLocale) {
|
||||
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;
|
||||
if (langCode && availableLocales.includes(langCode.toLowerCase())) {
|
||||
return langCode.toLowerCase() as Locale;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,7 +49,7 @@ export function LinguiProviderWrapper({
|
||||
children,
|
||||
initialLocale = defaultLocale,
|
||||
}: LinguiProviderProps) {
|
||||
const [locale, setLocale] = useState<Locale>(initialLocale);
|
||||
const [locale, setLocale] = useState<Locale>(defaultLocale);
|
||||
const [isHydrated, setIsHydrated] = useState(false);
|
||||
|
||||
initializeI18n();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { createContext, useCallback, useContext, useState } from "react";
|
||||
import { createContext, useContext, useState } from "react";
|
||||
|
||||
interface PopupContextType {
|
||||
isOpen: boolean;
|
||||
@@ -25,27 +25,24 @@ export const PopupProvider: React.FC<Props> = ({ children }) => {
|
||||
const [popupMessage, setPopupMessage] = useState("");
|
||||
const [popupIcon, setPopupIcon] = useState("");
|
||||
|
||||
const showPopup = useCallback(
|
||||
({
|
||||
header,
|
||||
message,
|
||||
icon,
|
||||
}: {
|
||||
header: string;
|
||||
message: string;
|
||||
icon: string;
|
||||
}) => {
|
||||
setIsOpen(true);
|
||||
setPopupHeader(header);
|
||||
setPopupMessage(message);
|
||||
setPopupIcon(icon);
|
||||
},
|
||||
[],
|
||||
);
|
||||
const showPopup = ({
|
||||
header,
|
||||
message,
|
||||
icon,
|
||||
}: {
|
||||
header: string;
|
||||
message: string;
|
||||
icon: string;
|
||||
}) => {
|
||||
setIsOpen(true);
|
||||
setPopupHeader(header);
|
||||
setPopupMessage(message);
|
||||
setPopupIcon(icon);
|
||||
};
|
||||
|
||||
const hidePopup = useCallback(() => {
|
||||
const hidePopup = () => {
|
||||
setIsOpen(false);
|
||||
}, []);
|
||||
};
|
||||
|
||||
return (
|
||||
<PopupContext.Provider
|
||||
|
||||
@@ -3,7 +3,6 @@ import { i18n } from "@lingui/core";
|
||||
import type { Locale } from "~/locales";
|
||||
import { defaultLocale } from "~/locales";
|
||||
import { messages as enMessages } from "~/locales/en/messages";
|
||||
import { messages as zhCNMessages } from "~/locales/zh-CN/messages";
|
||||
|
||||
const loadMessages = async (locale: Locale) => {
|
||||
switch (locale) {
|
||||
@@ -25,8 +24,6 @@ const loadMessages = async (locale: Locale) => {
|
||||
return (await import("~/locales/pl/messages")).messages;
|
||||
case "ptbr":
|
||||
return (await import("~/locales/ptbr/messages")).messages;
|
||||
case "zh-CN":
|
||||
return (await import("~/locales/zh-CN/messages")).messages;
|
||||
default:
|
||||
return enMessages;
|
||||
}
|
||||
@@ -35,15 +32,11 @@ const loadMessages = async (locale: Locale) => {
|
||||
let isInitialized = false;
|
||||
const loadedLocales = new Set<string>();
|
||||
|
||||
export function initializeI18n() {
|
||||
export function initializeI18n(locale: Locale = defaultLocale) {
|
||||
if (!isInitialized) {
|
||||
// 首屏同步加载中英文,避免默认语言激活前出现中英混排。
|
||||
i18n.load("en", enMessages);
|
||||
i18n.load("zh-CN", zhCNMessages);
|
||||
i18n.load(defaultLocale, enMessages);
|
||||
i18n.activate(defaultLocale);
|
||||
loadedLocales.add(defaultLocale);
|
||||
loadedLocales.add("en");
|
||||
loadedLocales.add("zh-CN");
|
||||
isInitialized = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { useEffect, useRef } from "react";
|
||||
import {
|
||||
HiLink,
|
||||
HiOutlineArrowRightCircle,
|
||||
HiOutlineCalendar,
|
||||
HiOutlineDocumentDuplicate,
|
||||
HiOutlineTag,
|
||||
HiOutlineTrash,
|
||||
HiOutlineUserGroup,
|
||||
HiOutlineArrowRightCircle,
|
||||
} from "react-icons/hi2";
|
||||
|
||||
import { useIsomorphicLayoutEffect } from "~/hooks/useIsomorphicLayoutEffect";
|
||||
|
||||
export type CardContextMenuAction =
|
||||
| "members"
|
||||
| "move"
|
||||
@@ -87,55 +85,6 @@ export function CardContextMenu({
|
||||
canEdit,
|
||||
}: CardContextMenuProps) {
|
||||
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(() => {
|
||||
const handleClickOutside = (e: MouseEvent) => {
|
||||
@@ -154,11 +103,13 @@ export function CardContextMenu({
|
||||
};
|
||||
}, [onClose]);
|
||||
|
||||
const items = MENU_ITEMS.filter((item) => !item.requiresEdit || canEdit);
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={menuRef}
|
||||
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: position.x, top: position.y }}
|
||||
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"
|
||||
style={{ left: x, top: y }}
|
||||
>
|
||||
{items.map(({ action, label, icon }) => (
|
||||
<button
|
||||
@@ -168,7 +119,7 @@ export function CardContextMenu({
|
||||
onAction(action);
|
||||
onClose();
|
||||
}}
|
||||
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"
|
||||
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"
|
||||
>
|
||||
{icon}
|
||||
{label}
|
||||
|
||||
@@ -14,7 +14,6 @@ export function DeleteBoardConfirmation({
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const { closeModal } = useModal();
|
||||
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||
|
||||
const deleteBoard = api.board.delete.useMutation({
|
||||
onSuccess: () => {
|
||||
@@ -34,7 +33,7 @@ export function DeleteBoardConfirmation({
|
||||
<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`Are you sure you want to delete this ${boardTypeLabel}?`}
|
||||
{t`Are you sure you want to delete this ${isTemplate ? "template" : "board"}?`}
|
||||
</h2>
|
||||
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
|
||||
{t`This action can't be undone.`}
|
||||
|
||||
@@ -31,7 +31,7 @@ export function MoveBoardForm({
|
||||
closeModal();
|
||||
showPopup({
|
||||
header: t`Board moved`,
|
||||
message: t`The board has been moved to ${targetWorkspace?.name ?? t`the workspace`}.`,
|
||||
message: t`The board has been moved to ${targetWorkspace?.name ?? "the workspace"}.`,
|
||||
icon: "success",
|
||||
});
|
||||
if (targetWorkspace) {
|
||||
|
||||
@@ -42,13 +42,12 @@ const VisibilityButton = ({
|
||||
}, [visibility]);
|
||||
|
||||
const isPublic = stateVisibility === "public";
|
||||
const visibilityLabel = isPublic ? t`public` : t`private`;
|
||||
|
||||
const updateBoardVisibility = api.board.update.useMutation({
|
||||
onSuccess: () => {
|
||||
showPopup({
|
||||
header: t`Board visibility updated`,
|
||||
message: t`The visibility of your board has been set to ${visibilityLabel}.`,
|
||||
message: t`The visibility of your board has been set to ${isPublic ? "public" : "private"}.`,
|
||||
icon: "success",
|
||||
});
|
||||
},
|
||||
|
||||
@@ -5,7 +5,7 @@ import { useRouter } from "next/router";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { keepPreviousData } from "@tanstack/react-query";
|
||||
import { env } from "next-runtime-env";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { DragDropContext, Draggable } from "react-beautiful-dnd";
|
||||
import { useForm } from "react-hook-form";
|
||||
import {
|
||||
@@ -46,10 +46,10 @@ import { CardContextMembersModal } from "./components/CardContextMembersModal";
|
||||
import { CardContextMenu } from "./components/CardContextMenu";
|
||||
import { CardContextMoveListModal } from "./components/CardContextMoveListModal";
|
||||
import { DeleteBoardConfirmation } from "./components/DeleteBoardConfirmation";
|
||||
import { MoveBoardForm } from "./components/MoveBoardForm";
|
||||
import { DeleteListConfirmation } from "./components/DeleteListConfirmation";
|
||||
import Filters from "./components/Filters";
|
||||
import List from "./components/List";
|
||||
import { MoveBoardForm } from "./components/MoveBoardForm";
|
||||
import { NewCardForm } from "./components/NewCardForm";
|
||||
import { NewListForm } from "./components/NewListForm";
|
||||
import { NewTemplateForm } from "./components/NewTemplateForm";
|
||||
@@ -85,26 +85,21 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
const { canCreateList, canEditList, canEditCard, canEditBoard } =
|
||||
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
|
||||
? Array.isArray(params.boardId)
|
||||
? params.boardId[0]
|
||||
: params.boardId
|
||||
: 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 { register, handleSubmit, setValue } = useForm<UpdateBoardInput>({
|
||||
@@ -540,7 +535,7 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
return (
|
||||
<>
|
||||
<PageHead
|
||||
title={`${boardData?.name ?? (isTemplate ? t`Template` : t`Board`)} | ${workspace.name ?? t`Workspace`}`}
|
||||
title={`${boardData?.name ?? (isTemplate ? t`Board` : t`Template`)} | ${workspace.name ?? t`Workspace`}`}
|
||||
/>
|
||||
<div className="relative flex h-full flex-col">
|
||||
<PatternedBackground />
|
||||
@@ -567,7 +562,7 @@ export default function BoardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
)}
|
||||
{!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">
|
||||
{isTemplate ? t`Template not found` : t`Board not found`}
|
||||
{t`${isTemplate ? "Template" : "Board"} not found`}
|
||||
</p>
|
||||
)}
|
||||
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
|
||||
|
||||
@@ -14,8 +14,6 @@ export function BoardsList({ isTemplate, archived = false }: { isTemplate?: bool
|
||||
const { workspace } = useWorkspace();
|
||||
const { openModal } = useModal();
|
||||
const { canCreateBoard } = usePermissions();
|
||||
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||
const boardLabel = isTemplate ? t`templates` : t`boards`;
|
||||
|
||||
const utils = api.useUtils();
|
||||
const updateBoard = api.board.update.useMutation({
|
||||
@@ -62,10 +60,10 @@ export function BoardsList({ isTemplate, archived = false }: { isTemplate?: bool
|
||||
<div className="flex flex-col items-center">
|
||||
<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">
|
||||
{archived ? t`No archived boards` : t`No ${boardLabel}`}
|
||||
{archived ? t`No archived boards` : t`No ${isTemplate ? "templates" : "boards"}`}
|
||||
</p>
|
||||
<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 ${boardTypeLabel}`}
|
||||
{archived ? t`Boards you archive will appear here.` : t`Get started by creating a new ${isTemplate ? "template" : "board"}`}
|
||||
</p>
|
||||
</div>
|
||||
<Tooltip
|
||||
@@ -79,7 +77,7 @@ export function BoardsList({ isTemplate, archived = false }: { isTemplate?: bool
|
||||
}}
|
||||
disabled={!canCreateBoard}
|
||||
>
|
||||
{t`Create new ${boardTypeLabel}`}
|
||||
{t`Create new ${isTemplate ? "template" : "board"}`}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
@@ -32,7 +32,6 @@ interface NewBoardInputWithTemplate {
|
||||
}
|
||||
|
||||
export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
||||
const boardTypeLabel = isTemplate ? t`template` : t`board`;
|
||||
const utils = api.useUtils();
|
||||
const { closeModal } = useModal();
|
||||
const router = useRouter();
|
||||
@@ -118,7 +117,7 @@ export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
||||
<form onSubmit={handleSubmit(onSubmit)}>
|
||||
<div className="px-5 pt-5">
|
||||
<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 ${boardTypeLabel}`}</h2>
|
||||
<h2 className="text-sm font-bold">{t`New ${isTemplate ? "template" : "board"}`}</h2>
|
||||
<button
|
||||
type="button"
|
||||
className="hover:bg-li ght-300 rounded p-1 focus:outline-none dark:hover:bg-dark-300"
|
||||
@@ -164,7 +163,7 @@ export function NewBoardForm({ isTemplate }: { isTemplate?: boolean }) {
|
||||
)}
|
||||
<div>
|
||||
<Button type="submit" isLoading={createBoard.isPending}>
|
||||
{t`Create ${boardTypeLabel}`}
|
||||
{t`Create ${isTemplate ? "template" : "board"}`}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,12 +5,8 @@ import {
|
||||
ListboxOptions,
|
||||
} from "@headlessui/react";
|
||||
import { t } from "@lingui/core/macro";
|
||||
import { useMemo, useState } from "react";
|
||||
import {
|
||||
HiArrowDownTray,
|
||||
HiChevronDown,
|
||||
HiOutlinePlusSmall,
|
||||
} from "react-icons/hi2";
|
||||
import { HiArrowDownTray, HiChevronDown, HiOutlinePlusSmall } from "react-icons/hi2";
|
||||
import { useState } from "react";
|
||||
|
||||
import Button from "~/components/Button";
|
||||
import FeedbackModal from "~/components/FeedbackModal";
|
||||
@@ -26,41 +22,35 @@ import { BoardsList } from "./components/BoardsList";
|
||||
import { ImportBoardsForm } from "./components/ImportBoardsForm";
|
||||
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 }) {
|
||||
const { openModal, modalContentType, isOpen } = useModal();
|
||||
const { workspace } = useWorkspace();
|
||||
const [activeTab, setActiveTab] = useState<"boards" | "archived">("boards");
|
||||
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 createBoardShortcut = useMemo(
|
||||
() => ({
|
||||
type: "PRESS" as const,
|
||||
stroke: { key: "C" },
|
||||
action: () => canCreateBoard && openModal("NEW_BOARD"),
|
||||
description: t`Create new ${boardTypeLabel}`,
|
||||
group: "ACTIONS" as const,
|
||||
}),
|
||||
[boardTypeLabel, canCreateBoard, isTemplate, openModal],
|
||||
);
|
||||
|
||||
const { tooltipContent: createModalShortcutTooltipContent } =
|
||||
useKeyboardShortcut(createBoardShortcut);
|
||||
useKeyboardShortcut({
|
||||
type: "PRESS",
|
||||
stroke: { key: "C" },
|
||||
action: () => canCreateBoard && openModal("NEW_BOARD"),
|
||||
description: t`Create new ${isTemplate ? "template" : "board"}`,
|
||||
group: "ACTIONS",
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
<PageHead
|
||||
title={t`${boardLabel} | ${workspace.name ?? t`Workspace`}`}
|
||||
title={t`${isTemplate ? "Templates" : "Boards"} | ${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="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]">
|
||||
{boardLabel}
|
||||
{t`${isTemplate ? "Templates" : "Boards"}`}
|
||||
</h1>
|
||||
<div className="flex gap-2">
|
||||
{!isTemplate && (
|
||||
@@ -147,7 +137,7 @@ export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
onChange={(tab) => setActiveTab(tab)}
|
||||
>
|
||||
<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 ??
|
||||
"Select a tab"}
|
||||
<HiChevronDown
|
||||
@@ -161,10 +151,9 @@ export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
key={tab.key}
|
||||
value={tab.key}
|
||||
className={({ selected }) =>
|
||||
`relative cursor-pointer select-none py-2 pl-3 pr-9 ${
|
||||
selected
|
||||
? "font-bold text-light-1000 dark:text-dark-1000"
|
||||
: "font-normal text-light-1000 dark:text-dark-1000"
|
||||
`relative cursor-pointer select-none py-2 pl-3 pr-9 ${selected
|
||||
? "font-bold text-light-1000 dark:text-dark-1000"
|
||||
: "font-normal text-light-1000 dark:text-dark-1000"
|
||||
}`
|
||||
}
|
||||
>
|
||||
@@ -186,11 +175,10 @@ export default function BoardsPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
key={tab.key}
|
||||
type="button"
|
||||
onClick={() => setActiveTab(tab.key)}
|
||||
className={`mb-8 mt-2 whitespace-nowrap px-1 py-0 text-sm font-semibold transition-colors focus:outline-none ${
|
||||
activeTab === tab.key
|
||||
? "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"
|
||||
}`}
|
||||
className={`whitespace-nowrap px-1 py-0 mt-2 mb-8 text-sm font-semibold transition-colors focus:outline-none ${activeTab === tab.key
|
||||
? "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}
|
||||
</button>
|
||||
|
||||
@@ -48,11 +48,7 @@ export default function SelectPlanView() {
|
||||
(searchParams.get("billing") as Billing | null) ?? "annual",
|
||||
);
|
||||
const returnUrl = searchParams.get("returnUrl") ?? "/boards";
|
||||
const workspacePublicId =
|
||||
searchParams.get("workspacePublicId") ??
|
||||
(typeof window !== "undefined"
|
||||
? localStorage.getItem("workspacePublicId")
|
||||
: null);
|
||||
const workspacePublicId = searchParams.get("workspacePublicId");
|
||||
const { data: workspaces } = api.workspace.all.useQuery();
|
||||
const { data: session } = authClient.useSession();
|
||||
const { data: user } = api.user.getUser.useQuery(undefined, {
|
||||
|
||||
@@ -61,9 +61,9 @@ services:
|
||||
- SMTP_REJECT_UNAUTHORIZED=${SMTP_REJECT_UNAUTHORIZED}
|
||||
|
||||
# Notifications
|
||||
- SUBSCRIBER_API_URL=${SUBSCRIBER_API_URL}
|
||||
- SUBSCRIBER_API_KEY=${SUBSCRIBER_API_KEY}
|
||||
- SUBSCRIBER_ENVIRONMENT_ID=${SUBSCRIBER_ENVIRONMENT_ID}
|
||||
- NOVU_API_KEY=${NOVU_API_KEY}
|
||||
- DISCORD_WEBHOOK_URL=${DISCORD_WEBHOOK_URL}
|
||||
- EMAIL_UNSUBSCRIBE_SECRET=${EMAIL_UNSUBSCRIBE_SECRET}
|
||||
|
||||
# S3 storage
|
||||
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
migrate:
|
||||
image: kan-migrate:local
|
||||
image: ghcr.io/kanbn/kan-migrate:latest
|
||||
container_name: ${CONTAINER_NAME:-kan-migrate}
|
||||
networks:
|
||||
- kan-network
|
||||
@@ -16,7 +16,7 @@ services:
|
||||
restart: "no"
|
||||
|
||||
web:
|
||||
image: kan:local
|
||||
image: ghcr.io/kanbn/kan:latest
|
||||
container_name: ${CONTAINER_NAME:-kan-web}
|
||||
ports:
|
||||
- "${WEB_PORT:-3000}:3000"
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
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";
|
||||
import { describe, it, expect, vi, beforeEach } from "vitest";
|
||||
|
||||
vi.mock("next-runtime-env", () => ({
|
||||
env: vi.fn(),
|
||||
@@ -20,11 +15,11 @@ vi.mock("@kan/db/repository/user.repo", () => ({
|
||||
}));
|
||||
|
||||
vi.mock("@kan/email", () => ({
|
||||
createSubscriber: vi.fn(),
|
||||
triggerSubscriberWorkflow: vi.fn(),
|
||||
notificationClient: null,
|
||||
}));
|
||||
|
||||
vi.mock("@kan/shared", () => ({
|
||||
createEmailUnsubscribeLink: vi.fn(),
|
||||
createS3Client: vi.fn(),
|
||||
}));
|
||||
|
||||
@@ -32,10 +27,17 @@ vi.mock("@aws-sdk/client-s3", () => ({
|
||||
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 mockGetByEmailAndStatus = memberRepo.getByEmailAndStatus as ReturnType<
|
||||
typeof vi.fn
|
||||
>;
|
||||
const mockGetByEmailAndStatus =
|
||||
memberRepo.getByEmailAndStatus as ReturnType<typeof vi.fn>;
|
||||
|
||||
const db = {} as Parameters<typeof createDatabaseHooks>[0];
|
||||
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||
import { ChatOrPushProviderEnum } from "@novu/api/models/components";
|
||||
import { createAuthMiddleware } from "better-auth/api";
|
||||
import { env } from "next-runtime-env";
|
||||
|
||||
import type { dbClient } from "@kan/db/client";
|
||||
import * as memberRepo from "@kan/db/repository/member.repo";
|
||||
import * as userRepo from "@kan/db/repository/user.repo";
|
||||
import { createSubscriber, triggerSubscriberWorkflow } from "@kan/email";
|
||||
import { notificationClient } from "@kan/email";
|
||||
import { createLogger } from "@kan/logger";
|
||||
import { createS3Client } from "@kan/shared";
|
||||
|
||||
import { downloadImage } from "./utils";
|
||||
import { createEmailUnsubscribeLink, createS3Client } from "@kan/shared";
|
||||
|
||||
const log = createLogger("auth");
|
||||
|
||||
import { downloadImage } from "./utils";
|
||||
|
||||
type BetterAuthUser = {
|
||||
id: string;
|
||||
createdAt: Date;
|
||||
@@ -93,49 +94,53 @@ export function createDatabaseHooks(db: dbClient) {
|
||||
}
|
||||
}
|
||||
|
||||
const [firstName, ...rest] = (user.name || "")
|
||||
.split(" ")
|
||||
.filter(Boolean);
|
||||
const lastName = rest.length ? rest.join(" ") : undefined;
|
||||
if (notificationClient) {
|
||||
try {
|
||||
const [firstName, ...rest] = (user.name || "")
|
||||
.split(" ")
|
||||
.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;
|
||||
|
||||
try {
|
||||
const avatarUrl = avatarKey
|
||||
? `${env("NEXT_PUBLIC_STORAGE_URL")}/${env("NEXT_PUBLIC_AVATAR_BUCKET_NAME")}/${avatarKey}`
|
||||
: undefined;
|
||||
const unsubscribeUrl = await createEmailUnsubscribeLink(user.id);
|
||||
|
||||
await createSubscriber({
|
||||
publicId: user.id,
|
||||
email: user.email,
|
||||
externalId: user.id,
|
||||
firstName,
|
||||
lastName,
|
||||
name: user.name,
|
||||
attributes: {
|
||||
avatarUrl,
|
||||
emailVerified: user.emailVerified,
|
||||
stripeCustomerId: user.stripeCustomerId,
|
||||
createdAt: user.createdAt,
|
||||
updatedAt: user.updatedAt,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
log.error({ err: error }, "Error creating subscriber");
|
||||
}
|
||||
log.info({ workflowId: "user-signup", userId: user.id, email: user.email }, "Triggering Novu workflow");
|
||||
await notificationClient.trigger({
|
||||
to: {
|
||||
subscriberId: user.id,
|
||||
firstName: firstName,
|
||||
lastName: lastName,
|
||||
email: user.email,
|
||||
avatar: avatarUrl,
|
||||
data: {
|
||||
emailVerified: user.emailVerified,
|
||||
stripeCustomerId: user.stripeCustomerId,
|
||||
createdAt: user.createdAt,
|
||||
updatedAt: user.updatedAt,
|
||||
},
|
||||
},
|
||||
payload: {
|
||||
emailUnsubscribeUrl: unsubscribeUrl,
|
||||
},
|
||||
workflowId: "user-signup",
|
||||
});
|
||||
log.info({ workflowId: "user-signup", userId: user.id }, "Novu workflow triggered");
|
||||
|
||||
try {
|
||||
log.info(
|
||||
{ workflowId: "user-signup", userId: user.id, email: user.email },
|
||||
"Triggering user-signup workflow",
|
||||
);
|
||||
await triggerSubscriberWorkflow("user-signup", {
|
||||
publicId: user.id,
|
||||
});
|
||||
log.info(
|
||||
{ workflowId: "user-signup", userId: user.id },
|
||||
"user-signup workflow triggered",
|
||||
);
|
||||
} catch (error) {
|
||||
log.error({ err: error }, "Error triggering user-signup workflow");
|
||||
await notificationClient.subscribers.credentials.update(
|
||||
{
|
||||
providerId: ChatOrPushProviderEnum.Discord,
|
||||
credentials: {
|
||||
webhookUrl: env("DISCORD_WEBHOOK_URL"),
|
||||
},
|
||||
integrationIdentifier: "discord",
|
||||
},
|
||||
user.id,
|
||||
);
|
||||
} catch (error) {
|
||||
log.error({ err: error }, "Error adding user to notification client");
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
@@ -3,8 +3,9 @@ import type Stripe from "stripe";
|
||||
|
||||
import type { dbClient } from "@kan/db/client";
|
||||
import * as userRepo from "@kan/db/repository/user.repo";
|
||||
import { triggerSubscriberWorkflow } from "@kan/email";
|
||||
import { notificationClient } from "@kan/email";
|
||||
import { createLogger } from "@kan/logger";
|
||||
import { createEmailUnsubscribeLink } from "@kan/shared";
|
||||
|
||||
const log = createLogger("auth");
|
||||
|
||||
@@ -23,22 +24,30 @@ export async function triggerWorkflow(
|
||||
cancellationDetails?: Stripe.Subscription.CancellationDetails | null,
|
||||
) {
|
||||
try {
|
||||
if (!subscription.stripeCustomerId) return;
|
||||
if (!subscription.stripeCustomerId || !notificationClient) return;
|
||||
|
||||
const user = await userRepo.getByStripeCustomerId(
|
||||
db,
|
||||
subscription.stripeCustomerId,
|
||||
);
|
||||
|
||||
if (!user) return;
|
||||
if (!user || !notificationClient) return;
|
||||
|
||||
log.info({ workflowId, userId: user.id }, "Triggering workflow");
|
||||
await triggerSubscriberWorkflow(
|
||||
const unsubscribeUrl = await createEmailUnsubscribeLink(user.id);
|
||||
|
||||
log.info({ workflowId, userId: user.id }, "Triggering Novu workflow");
|
||||
await notificationClient.trigger({
|
||||
to: {
|
||||
subscriberId: user.id,
|
||||
},
|
||||
payload: {
|
||||
...subscription,
|
||||
cancellationDetails,
|
||||
emailUnsubscribeUrl: unsubscribeUrl,
|
||||
},
|
||||
workflowId,
|
||||
{ publicId: user.id },
|
||||
{ ...subscription, cancellationDetails },
|
||||
);
|
||||
log.info({ workflowId, userId: user.id }, "Workflow triggered");
|
||||
});
|
||||
log.info({ workflowId, userId: user.id }, "Novu workflow triggered");
|
||||
} catch (error) {
|
||||
log.error({ err: error, workflowId }, "Error triggering workflow");
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@kan/logger": "workspace:^",
|
||||
"@novu/api": "^3.11.0",
|
||||
"@react-email/components": "^1.0.1",
|
||||
"nodemailer": "^7.0.3",
|
||||
"react-email": "^5.0.6"
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
export const name = "email";
|
||||
|
||||
export { sendEmail } from "./sendEmail";
|
||||
export {
|
||||
createSubscriber,
|
||||
updateSubscriberPreferences,
|
||||
triggerSubscriberWorkflow,
|
||||
} from "./subscriberClient";
|
||||
export { notificationClient } from "./notificationClient";
|
||||
|
||||
6
packages/email/src/notificationClient.tsx
Normal file
6
packages/email/src/notificationClient.tsx
Normal file
@@ -0,0 +1,6 @@
|
||||
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;
|
||||
@@ -1,115 +0,0 @@
|
||||
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",
|
||||
);
|
||||
}
|
||||
@@ -91,35 +91,21 @@ export function registerBoardTools(server: McpServer): void {
|
||||
|
||||
server.tool(
|
||||
"create_board",
|
||||
"Create a new board in a workspace, optionally with initial lists and labels",
|
||||
"Create a new board in a workspace",
|
||||
{
|
||||
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"])
|
||||
slug: z.string().optional().describe("URL-friendly slug (auto-generated if omitted)"),
|
||||
visibility: z
|
||||
.enum(["public", "private"])
|
||||
.optional()
|
||||
.describe("Board type (defaults to regular)"),
|
||||
sourceBoardPublicId: z
|
||||
.string()
|
||||
.min(12)
|
||||
.optional()
|
||||
.describe("Source board public ID when cloning an existing board"),
|
||||
.describe("Board visibility (default: private)"),
|
||||
},
|
||||
async ({ workspacePublicId, name, lists, labels, type, sourceBoardPublicId }) => {
|
||||
async ({ workspacePublicId, name, slug, visibility }) => {
|
||||
const data = await kanRequest("POST", `/workspaces/${workspacePublicId}/boards`, {
|
||||
name,
|
||||
lists,
|
||||
labels,
|
||||
type,
|
||||
sourceBoardPublicId,
|
||||
slug,
|
||||
visibility,
|
||||
});
|
||||
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||
},
|
||||
|
||||
@@ -119,7 +119,7 @@ export function registerCardTools(server: McpServer): void {
|
||||
content: z.string().describe("Comment text"),
|
||||
},
|
||||
async ({ cardPublicId, content }) => {
|
||||
const data = await kanRequest("POST", `/cards/${cardPublicId}/comments`, { comment: content });
|
||||
const data = await kanRequest("POST", `/cards/${cardPublicId}/comments`, { content });
|
||||
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||
},
|
||||
);
|
||||
@@ -136,7 +136,7 @@ export function registerCardTools(server: McpServer): void {
|
||||
const data = await kanRequest(
|
||||
"PUT",
|
||||
`/cards/${cardPublicId}/comments/${commentPublicId}`,
|
||||
{ comment: content },
|
||||
{ content },
|
||||
);
|
||||
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||
},
|
||||
|
||||
@@ -64,7 +64,7 @@ export function registerChecklistTools(server: McpServer): void {
|
||||
async ({ checklistItemPublicId, title, isCompleted, index }) => {
|
||||
const data = await kanRequest("PATCH", `/checklists/items/${checklistItemPublicId}`, {
|
||||
title,
|
||||
completed: isCompleted,
|
||||
isCompleted,
|
||||
index,
|
||||
});
|
||||
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
||||
|
||||
32
packages/shared/src/utils/email.ts
Normal file
32
packages/shared/src/utils/email.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
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,6 +2,7 @@ export * from "./generateUID";
|
||||
export * from "./generateSlug";
|
||||
export * from "./generateWorkspacePrefix";
|
||||
export * from "./subscriptions";
|
||||
export * from "./email";
|
||||
export * from "./dueDateFilters";
|
||||
export * from "./s3";
|
||||
export * from "./mentions";
|
||||
|
||||
43
pnpm-lock.yaml
generated
43
pnpm-lock.yaml
generated
@@ -103,9 +103,6 @@ importers:
|
||||
'@kan/db':
|
||||
specifier: workspace:^
|
||||
version: link:../../packages/db
|
||||
'@kan/email':
|
||||
specifier: workspace:^
|
||||
version: link:../../packages/email
|
||||
'@kan/logger':
|
||||
specifier: workspace:^
|
||||
version: link:../../packages/logger
|
||||
@@ -124,6 +121,9 @@ importers:
|
||||
'@lingui/react':
|
||||
specifier: ^5.3.2
|
||||
version: 5.4.1(@lingui/babel-plugin-lingui-macro@5.4.1(typescript@5.9.2))(react@18.3.1)
|
||||
'@novu/api':
|
||||
specifier: ^3.11.0
|
||||
version: 3.11.0
|
||||
'@t3-oss/env-nextjs':
|
||||
specifier: ^0.11.1
|
||||
version: 0.11.1(typescript@5.9.2)(zod@3.25.76)
|
||||
@@ -467,6 +467,9 @@ importers:
|
||||
'@kan/logger':
|
||||
specifier: workspace:^
|
||||
version: link:../logger
|
||||
'@novu/api':
|
||||
specifier: ^3.11.0
|
||||
version: 3.11.0
|
||||
'@react-email/components':
|
||||
specifier: ^1.0.1
|
||||
version: 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
@@ -1538,11 +1541,11 @@ packages:
|
||||
|
||||
'@esbuild-kit/core-utils@3.3.2':
|
||||
resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
|
||||
deprecated: 'Merged into tsx: https://tsx.hirok.io'
|
||||
deprecated: 'Merged into tsx: https://tsx.is'
|
||||
|
||||
'@esbuild-kit/esm-loader@2.6.5':
|
||||
resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
|
||||
deprecated: 'Merged into tsx: https://tsx.hirok.io'
|
||||
deprecated: 'Merged into tsx: https://tsx.is'
|
||||
|
||||
'@esbuild/aix-ppc64@0.19.12':
|
||||
resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
|
||||
@@ -2995,6 +2998,9 @@ packages:
|
||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
'@novu/api@3.11.0':
|
||||
resolution: {integrity: sha512-8u0mB5VThL7MhdxoN0UoA4CS9eu2k3Xa6iulauMhCHENuJNxUNuirJWq5t8jDoH4bFTQTfMN0VRkC0qodKR2qA==}
|
||||
|
||||
'@octokit/auth-token@3.0.4':
|
||||
resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==}
|
||||
engines: {node: '>= 14'}
|
||||
@@ -3091,111 +3097,95 @@ packages:
|
||||
|
||||
'@react-email/body@0.2.0':
|
||||
resolution: {integrity: sha512-9GCWmVmKUAoRfloboCd+RKm6X17xn7eGL7HnpAZUnjBXBilWCxsKnLMTC/ixSHDKS/A/057M1Tx6ZUXd89sVBw==}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/button@0.2.0':
|
||||
resolution: {integrity: sha512-8i+v6cMxr2emz4ihCrRiYJPp2/sdYsNNsBzXStlcA+/B9Umpm5Jj3WJKYpgTPM+aeyiqlG/MMI1AucnBm4f1oQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/code-block@0.2.0':
|
||||
resolution: {integrity: sha512-eIrPW9PIFgDopQU0e/OPpwCW2QWQDtNZDSsiN4sJO8KdMnWWnXJicnRfzrit5rHwFo+Y98i+w/Y5ScnBAFr1dQ==}
|
||||
engines: {node: '>=22.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/code-inline@0.0.5':
|
||||
resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/column@0.0.13':
|
||||
resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/components@1.0.1':
|
||||
resolution: {integrity: sha512-HnL0Y/up61sOBQT2cQg9N/kCoW0bP727gDs2MkFWQYELg6+iIHidMDvENXFC0f1ZE6hTB+4t7sszptvTcJWsDA==}
|
||||
engines: {node: '>=22.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/container@0.0.15':
|
||||
resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/font@0.0.9':
|
||||
resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/head@0.0.12':
|
||||
resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/heading@0.0.15':
|
||||
resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/hr@0.0.11':
|
||||
resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/html@0.0.11':
|
||||
resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/img@0.0.11':
|
||||
resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/link@0.0.12':
|
||||
resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/markdown@0.0.17':
|
||||
resolution: {integrity: sha512-6op3AfsBC9BJKkhG+eoMFRFWlr0/f3FYbtQrK+VhGzJocEAY0WINIFN+W8xzXr//3IL0K/aKtnH3FtpIuescQQ==}
|
||||
engines: {node: '>=22.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/preview@0.0.13':
|
||||
resolution: {integrity: sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
@@ -3209,21 +3199,18 @@ packages:
|
||||
'@react-email/row@0.0.12':
|
||||
resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/section@0.0.16':
|
||||
resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
'@react-email/tailwind@2.0.1':
|
||||
resolution: {integrity: sha512-/xq0IDYVY7863xPY7cdI45Xoz7M6CnIQBJcQvbqN7MNVpopfH9f+mhjayV1JGfKaxlGWuxfLKhgi9T2shsnEFg==}
|
||||
engines: {node: '>=22.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
'@react-email/body': 0.2.0
|
||||
'@react-email/button': 0.2.0
|
||||
@@ -3262,7 +3249,6 @@ packages:
|
||||
'@react-email/text@0.1.5':
|
||||
resolution: {integrity: sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
|
||||
peerDependencies:
|
||||
react: ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
|
||||
@@ -4310,7 +4296,6 @@ packages:
|
||||
|
||||
'@ungap/structured-clone@1.3.0':
|
||||
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
|
||||
deprecated: Potential CWE-502 - Update to 1.3.1 or higher
|
||||
|
||||
'@vitest/expect@3.2.4':
|
||||
resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
|
||||
@@ -4633,7 +4618,6 @@ packages:
|
||||
basic-ftp@5.0.5:
|
||||
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
deprecated: Security vulnerability fixed in 5.2.1, please upgrade
|
||||
|
||||
before-after-hook@2.2.3:
|
||||
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
|
||||
@@ -8750,7 +8734,6 @@ packages:
|
||||
|
||||
uuid@9.0.1:
|
||||
resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
|
||||
deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).
|
||||
hasBin: true
|
||||
|
||||
uvu@0.5.6:
|
||||
@@ -11496,6 +11479,10 @@ snapshots:
|
||||
'@nodelib/fs.scandir': 2.1.5
|
||||
fastq: 1.19.1
|
||||
|
||||
'@novu/api@3.11.0':
|
||||
dependencies:
|
||||
zod: 3.25.76
|
||||
|
||||
'@octokit/auth-token@3.0.4': {}
|
||||
|
||||
'@octokit/core@4.2.4':
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
"NEXT_PUBLIC_KAN_ENV",
|
||||
"NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY",
|
||||
"STRIPE_SECRET_KEY",
|
||||
"DISCORD_WEBHOOK_URL",
|
||||
"STRIPE_WEBHOOK_SECRET",
|
||||
"STRIPE_WEBHOOK_SECRET_LEGACY",
|
||||
"STRIPE_PRO_PLAN_MONTHLY_PRICE_ID",
|
||||
@@ -147,6 +148,8 @@
|
||||
"PORT",
|
||||
"BETTER_AUTH_SECRET",
|
||||
"BETTER_AUTH_TRUSTED_ORIGINS",
|
||||
"NOVU_API_KEY",
|
||||
"EMAIL_UNSUBSCRIBE_SECRET",
|
||||
"REDIS_URL",
|
||||
"LOG_LEVEL",
|
||||
"AXIOM_TOKEN",
|
||||
|
||||
Reference in New Issue
Block a user