Compare commits

..
1 Commits
Author SHA1 Message Date
Charles Bochet 587a6c1ad6 Bump versions 2025-03-24 15:36:41 +01:00
4184 changed files with 55865 additions and 148481 deletions
-1
View File
@@ -1,7 +1,6 @@
module.exports = {
root: true,
extends: ['plugin:prettier/recommended', 'plugin:lingui/recommended'],
ignorePatterns: ['node_modules'],
plugins: [
'@nx',
'prefer-arrow',
+5 -114
View File
@@ -6,74 +6,14 @@ module.exports = {
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:storybook/recommended',
'plugin:prettier/recommended',
'plugin:lingui/recommended',
'plugin:@nx/typescript'
],
plugins: ['react-hooks', 'react-refresh', '@nx', 'prefer-arrow', 'import', 'unused-imports', 'unicorn', 'lingui'],
rules: {
'lingui/no-single-variables-to-translate': 'off',
'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
'no-console': ['warn', { allow: ['group', 'groupCollapsed', 'groupEnd'] }],
'no-control-regex': 0,
'no-debugger': 'error',
'no-duplicate-imports': 'error',
'no-undef': 'off',
'no-unused-vars': 'off',
'@nx/enforce-module-boundaries': [
'error',
{
enforceBuildableLibDependency: true,
allow: [],
depConstraints: [
{
sourceTag: 'scope:shared',
onlyDependOnLibsWithTags: ['scope:shared'],
},
{
sourceTag: 'scope:backend',
onlyDependOnLibsWithTags: ['scope:shared', 'scope:backend'],
},
{
sourceTag: 'scope:frontend',
onlyDependOnLibsWithTags: ['scope:shared', 'scope:frontend'],
},
{
sourceTag: 'scope:zapier',
onlyDependOnLibsWithTags: ['scope:shared'],
},
],
},
],
'import/no-relative-packages': 'error',
'import/no-useless-path-segments': 'error',
'import/no-duplicates': ['error', { considerQueryString: true }],
'prefer-arrow/prefer-arrow-functions': [
'error',
{
disallowPrototype: true,
singleReturnOnly: false,
classPropertiesAllowed: false,
},
],
'unused-imports/no-unused-imports': 'warn',
'unused-imports/no-unused-vars': [
'warn',
{
vars: 'all',
varsIgnorePattern: '^_',
args: 'after-used',
argsIgnorePattern: '^_',
},
],
},
plugins: ['react-hooks', 'react-refresh'],
overrides: [
{
files: ['**/*.ts', '**/*.tsx'],
files: ['*.ts', '*.tsx'],
parserOptions: {
project: ['./tsconfig.base.{json,*.json}'],
},
rules: {
'no-restricted-imports': [
'error',
@@ -97,14 +37,6 @@ module.exports = {
],
},
],
'@typescript-eslint/no-empty-interface': [
'error',
{
allowSingleExtends: true,
},
],
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@nx/workspace-effect-components': 'error',
'@nx/workspace-no-hardcoded-colors': 'error',
'@nx/workspace-matching-state-variable': 'error',
@@ -154,46 +86,5 @@ module.exports = {
],
},
},
{
files: ['*.js', '*.jsx'],
extends: ['plugin:@nx/javascript'],
rules: {},
},
{
files: [
'*.test.@(ts|tsx|js|jsx)',
],
env: {
jest: true,
},
rules: {
'@typescript-eslint/no-non-null-assertion': 'off',
},
},
{
files: ['**/*.constants.ts'],
rules: {
'@typescript-eslint/naming-convention': [
'error',
{
selector: 'variable',
format: ['UPPER_CASE'],
},
],
'unicorn/filename-case': [
'warn',
{
cases: {
pascalCase: true,
},
},
],
'@nx/workspace-max-consts-per-file': ['error', { max: 1 }],
},
},
{
files: ['*.json'],
parser: 'jsonc-eslint-parser',
},
],
};
+8 -4
View File
@@ -13,10 +13,14 @@ Good first issues are a great way to start contributing and get familiar with th
## Issue assignment
To avoid conflicts, we follow these guidelines:
Having multiple contributors address the same issue can cause frustration.
1. For `Good First Issue` and `Experienced Contributor` issues without `size: long` labels, we'll merge the first PRs that meet our [code quality standards](https://twenty.com/developers). **We don't assign contributors to these issues**. For `priority: high` issues, our core team will step in within days if no adequate contributions are received.
2. For `size: long` Issues, assigned contributors have one week to submit their first draft PR.
To avoid conflicts, we follow these guidelines:
1. If a core team member assigned you the issue within the last three days, your PR takes priority.
2. Otherwise, the first submitted PR is prioritized.
3. For "size: long" PRs, the assignment period extends to one week.
Please ensure you're assigned to an issue before starting work.
## How to Contribute
@@ -63,4 +67,4 @@ git push origin your-branch-name
## Reporting Issues
If you face any issues or have suggestions, please feel free to (create an issue on Twenty's GitHub repository)[https://github.com/twentyhq/twenty/issues/new]. Please provide as much detail as possible.
If you face any issues or have suggestions, please feel free to (create an issue on Twenty's GitHub repository)[https://github.com/twentyhq/twenty/issues/new]. Please provide as much detail as possible.
@@ -20,7 +20,7 @@ runs:
id: cache-primary-key-builder
shell: bash
run: |
echo "CACHE_PRIMARY_KEY_PREFIX=v3-${{ inputs.key }}-${{ github.ref_name }}" >> "${GITHUB_OUTPUT}"
echo "CACHE_PRIMARY_KEY_PREFIX=v2-${{ inputs.key }}-${{ github.ref_name }}" >> "${GITHUB_OUTPUT}"
- name: Restore cache
uses: actions/cache/restore@v4
id: restore-cache
@@ -25,8 +25,8 @@ runs:
id: cache-node-modules
uses: actions/cache/restore@v4
with:
key: v3-${{ steps.globals.outputs.CACHE_KEY_PREFIX }}-${{github.sha}}
restore-keys: v3-${{ steps.globals.outputs.CACHE_KEY_PREFIX }}-
key: v2-${{ steps.globals.outputs.CACHE_KEY_PREFIX }}-${{github.sha}}
restore-keys: v2-${{ steps.globals.outputs.CACHE_KEY_PREFIX }}-
path: ${{ steps.globals.outputs.PATH_TO_CACHE }}
- name: Install Dependencies
if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' && steps.cache-node-modules.outputs.cache-matched-key == '' }}
+1 -1
View File
@@ -39,7 +39,7 @@ jobs:
run: npx nx build twenty-chrome-extension
ci-chrome-extension-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 1
runs-on: ubuntu-latest
needs: [changed-files-check, chrome-extension-build]
steps:
+1 -1
View File
@@ -124,7 +124,7 @@ jobs:
retention-days: 30
ci-e2e-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 1
runs-on: ubuntu-latest
needs: [changed-files-check, test]
steps:
-62
View File
@@ -1,62 +0,0 @@
name: CI Emails
on:
push:
branches:
- main
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
changed-files-check:
uses: ./.github/workflows/changed-files.yaml
with:
files: |
package.json
packages/twenty-emails/**
emails-test:
needs: changed-files-check
if: needs.changed-files-check.outputs.any_changed == 'true'
timeout-minutes: 10
runs-on: depot-ubuntu-24.04-8
env:
NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
steps:
- name: Fetch custom Github Actions and base branch history
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/workflows/actions/yarn-install
- name: Build twenty-emails
run: npx nx build twenty-emails
- name: Run email tests
run: |
# Start the email server in the background
npx nx run twenty-emails:start &
SERVER_PID=$!
# Wait for server to start
sleep 20
# Check if server is running
if ! curl -s http://localhost:4001/preview/test.email > /dev/null; then
echo "Email server failed to start"
kill $SERVER_PID
exit 1
fi
# Kill the server
kill $SERVER_PID
ci-emails-status-check:
if: always() && !cancelled()
timeout-minutes: 5
runs-on: depot-ubuntu-24.04-8
needs: [changed-files-check, emails-test]
steps:
- name: Fail job if any needs failed
if: contains(needs.*.result, 'failure')
run: exit 1
+1 -1
View File
@@ -189,7 +189,7 @@ jobs:
key: ${{ steps.restore-task-cache.outputs.cache-primary-key }}
ci-front-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 1
runs-on: depot-ubuntu-24.04-8
needs:
[
+2 -22
View File
@@ -168,25 +168,9 @@ jobs:
image: redis
ports:
- 6379:6379
clickhouse:
image: clickhouse/clickhouse-server:latest
env:
CLICKHOUSE_PASSWORD: clickhousePassword
CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty"
ports:
- 8123:8123
- 9000:9000
options: >-
--health-cmd "clickhouse-client --host=localhost --port=9000 --user=default --password=clickhousePassword --query='SELECT 1'"
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
NX_REJECT_UNKNOWN_LOCAL_CACHE: 0
NODE_ENV: test
ANALYTICS_ENABLED: true
CLICKHOUSE_URL: "http://default:clickhousePassword@localhost:8123/twenty"
CLICKHOUSE_PASSWORD: clickhousePassword
steps:
- name: Fetch custom Github Actions and base branch history
uses: actions/checkout@v4
@@ -194,7 +178,7 @@ jobs:
fetch-depth: 0
- name: Install dependencies
uses: ./.github/workflows/actions/yarn-install
- name: Update .env.test for integrations tests
- name: Update .env.test for billing
run: |
echo "IS_BILLING_ENABLED=true" >> .env.test
echo "BILLING_STRIPE_API_KEY=test-api-key" >> .env.test
@@ -214,10 +198,6 @@ jobs:
- name: Server / Create Test DB
run: |
PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "test";'
- name: Run ClickHouse migrations
run: npx nx clickhouse:migrate twenty-server
- name: Run ClickHouse seeds
run: npx nx clickhouse:seed twenty-server
- name: Server / Run Integration Tests
uses: ./.github/workflows/actions/nx-affected
with:
@@ -232,7 +212,7 @@ jobs:
path: reset-logs.log
ci-server-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 1
runs-on: depot-ubuntu-24.04-8
needs: [changed-files-check, server-setup, server-test, server-integration-test]
steps:
+1 -1
View File
@@ -44,7 +44,7 @@ jobs:
tasks: ${{ matrix.task }}
ci-shared-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 1
runs-on: ubuntu-latest
needs: [changed-files-check, shared-test]
steps:
@@ -84,7 +84,7 @@ jobs:
working-directory: ./packages/twenty-docker/
ci-test-docker-compose-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 1
runs-on: ubuntu-latest
needs: [changed-files-check, test]
steps:
+53
View File
@@ -0,0 +1,53 @@
name: CI Tinybird
on:
push:
branches:
- feature/reimplement-tinybird
- main
paths:
- 'package.json'
- 'packages/twenty-tinybird/**'
pull_request:
paths:
- 'package.json'
- 'packages/twenty-tinybird/**'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
TINYBIRD_HOST: https://api.eu-central-1.aws.tinybird.co
TINYBIRD_TOKEN: ${{ secrets.TB_ADMIN_TOKEN }}
jobs:
changed-files-check:
uses: ./.github/workflows/changed-files.yaml
with:
files: packages/twenty-tinybird/**
ci:
runs-on: ubuntu-latest
needs: changed-files-check
if: needs.changed-files-check.outputs.any_changed == 'true'
timeout-minutes: 10
defaults:
run:
working-directory: './packages/twenty-tinybird'
services:
tinybird:
image: tinybirdco/tinybird-local:beta
ports:
- 7181:7181
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha }}
- name: Install Tinybird CLI
run: curl https://tinybird.co | sh
- name: Build project
run: tb build
- name: Test project
run: tb test run
+1 -1
View File
@@ -21,7 +21,7 @@ concurrency:
jobs:
danger-js:
timeout-minutes: 5
timeout-minutes: 3
runs-on: ubuntu-latest
if: github.event.action != 'closed'
steps:
+1 -1
View File
@@ -62,7 +62,7 @@ jobs:
NEXT_PUBLIC_KEYSTATIC_GITHUB_APP_SLUG: xxx
ci-website-status-check:
if: always() && !cancelled()
timeout-minutes: 5
timeout-minutes: 10
runs-on: ubuntu-latest
needs: [changed-files-check, website-build]
steps:
@@ -1,36 +0,0 @@
name: 'Preview Environment Dispatch'
on:
# Using pull_request_target instead of pull_request to have access to secrets for external contributors
# Security note: This is safe because we're only using the repository-dispatch action with limited scope
# and not checking out or running any code from the external contributor's PR
pull_request_target:
types: [opened, synchronize, reopened, labeled]
paths:
- packages/twenty-docker/**
- packages/twenty-server/**
- packages/twenty-front/**
- .github/workflows/preview-env-dispatch.yaml
- .github/workflows/preview-env-keepalive.yaml
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
trigger-preview:
permissions:
contents: write
actions: write
pull-requests: read
if: github.event.action == 'opened' || github.event.action == 'synchronize' || github.event.action == 'reopened' || (github.event.action == 'labeled' && github.event.label.name == 'preview-app')
timeout-minutes: 5
runs-on: ubuntu-latest
steps:
- name: Trigger preview environment workflow
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}
event-type: preview-environment
client-payload: '{"pr_number": "${{ github.event.pull_request.number }}", "pr_head_sha": "${{ github.event.pull_request.head.sha }}", "repo_full_name": "${{ github.repository }}"}'
@@ -1,150 +0,0 @@
name: 'Preview Environment Keep Alive'
on:
repository_dispatch:
types: [preview-environment]
jobs:
preview-environment:
timeout-minutes: 310
runs-on: ubuntu-latest
steps:
- name: Checkout PR
uses: actions/checkout@v4
with:
ref: ${{ github.event.client_payload.pr_head_sha }}
- name: Run compose setup
run: |
echo "Patching docker-compose.yml..."
# change image to localbuild using yq
yq eval 'del(.services.server.image)' -i packages/twenty-docker/docker-compose.yml
yq eval '.services.server.build.context = "../../"' -i packages/twenty-docker/docker-compose.yml
yq eval '.services.server.build.dockerfile = "./packages/twenty-docker/twenty/Dockerfile"' -i packages/twenty-docker/docker-compose.yml
yq eval 'del(.services.worker.image)' -i packages/twenty-docker/docker-compose.yml
yq eval '.services.worker.build.context = "../../"' -i packages/twenty-docker/docker-compose.yml
yq eval '.services.worker.build.dockerfile = "./packages/twenty-docker/twenty/Dockerfile"' -i packages/twenty-docker/docker-compose.yml
echo "Setting up .env file..."
cp packages/twenty-docker/.env.example packages/twenty-docker/.env
echo "Generating secrets..."
echo "# === Randomly generated secrets ===" >> packages/twenty-docker/.env
echo "APP_SECRET=$(openssl rand -base64 32)" >> packages/twenty-docker/.env
echo "PG_DATABASE_PASSWORD=$(openssl rand -hex 16)" >> packages/twenty-docker/.env
echo "SIGN_IN_PREFILLED=true" >> packages/twenty-docker/.env
echo "Docker compose build..."
cd packages/twenty-docker/
docker compose build
working-directory: ./
- name: Create Tunnel
id: expose-tunnel
uses: codetalkio/expose-tunnel@v1.5.0
with:
service: bore.pub
port: 3000
- name: Start services with correct SERVER_URL
run: |
cd packages/twenty-docker/
# Update the SERVER_URL with the tunnel URL
echo "Setting SERVER_URL to ${{ steps.expose-tunnel.outputs.tunnel-url }}"
sed -i '/SERVER_URL=/d' .env
echo "SERVER_URL=${{ steps.expose-tunnel.outputs.tunnel-url }}" >> .env
# Start the services
echo "Docker compose up..."
docker compose up -d || {
echo "Docker compose failed to start"
docker compose logs
exit 1
}
echo "Waiting for services to be ready..."
count=0
while [ ! $(docker inspect --format='{{.State.Health.Status}}' twenty-db-1) = "healthy" ] || [ ! $(docker inspect --format='{{.State.Health.Status}}' twenty-server-1) = "healthy" ]; do
sleep 5
count=$((count+1))
if [ $count -gt 60 ]; then
echo "Timeout waiting for services to be ready"
docker compose logs
exit 1
fi
echo "Still waiting for services... ($count/60)"
done
echo "All services are up and running!"
working-directory: ./
- name: Seed Dev Workspace
run: |
cd packages/twenty-docker/
echo "Seeding full dev workspace..."
if ! docker compose exec -T server yarn command:prod -- workspace:seed:dev; then
echo "❌ Seeding full dev workspace failed. Dumping server logs..."
docker compose logs server
exit 1
fi
working-directory: ./
- name: Output tunnel URL to logs
run: |
echo "✅ Preview Environment Ready!"
echo "🔗 Preview URL: ${{ steps.expose-tunnel.outputs.tunnel-url }}"
echo "⏱️ This environment will be available for 5 hours"
- name: Post comment on PR
uses: actions/github-script@v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const COMMENT_MARKER = '<!-- PR_PREVIEW_ENV -->';
const commentBody = `${COMMENT_MARKER}
🚀 **Preview Environment Ready!**
Your preview environment is available at: ${{ steps.expose-tunnel.outputs.tunnel-url }}
This environment will automatically shut down when the PR is closed or after 5 hours.`;
// Get all comments
const {data: comments} = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: ${{ github.event.client_payload.pr_number }},
});
// Find our comment
const botComment = comments.find(comment => comment.body.includes(COMMENT_MARKER));
if (botComment) {
// Update existing comment
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: commentBody
});
console.log('Updated existing comment');
} else {
// Create new comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: ${{ github.event.client_payload.pr_number }},
body: commentBody
});
console.log('Created new comment');
}
- name: Keep tunnel alive for 5 hours
run: timeout 300m sleep 18000 # Stop on whichever we reach first (300m or 5hour sleep)
- name: Cleanup
if: always()
run: |
cd packages/twenty-docker/
docker compose down -v
working-directory: ./
+1 -2
View File
@@ -42,5 +42,4 @@ dump.rdb
/flake.lock
/flake.nix
.crowdin.yml
.react-email/
.crowdin.yml
@@ -0,0 +1,26 @@
diff --git a/cli/dist/preconstruct-cli-cli.cjs.js b/cli/dist/preconstruct-cli-cli.cjs.js
index 8fbd4efc8ee4d98bc72d16344ff6f6ab4e5e2736..cf451d99128fd06053426d1a265f4e305380dd7b 100644
--- a/cli/dist/preconstruct-cli-cli.cjs.js
+++ b/cli/dist/preconstruct-cli-cli.cjs.js
@@ -1509,7 +1509,7 @@ let memoizedGetProgram = weakMemoize(typescript => memoize(async configFileName
return nonMemoizedGetProgram(typescript, configFileName);
}));
async function getProgram(dirname, pkgName, ts) {
- let configFileName = ts.findConfigFile(dirname, ts.sys.fileExists);
+ let configFileName = ts.findConfigFile(dirname, ts.sys.fileExists, 'tsconfig.lib.json');
if (!configFileName) {
throw new FatalError("an entrypoint source file ends with the .ts or tsx extension but no TypeScript config exists, please create one.", pkgName);
}
diff --git a/cli/dist/preconstruct-cli-cli.esm.js b/cli/dist/preconstruct-cli-cli.esm.js
index 0045392b46c8928753af564f67681886e0f15bed..164a9bfbae85f1a8f41fffc87c6a3c4014cb9d33 100644
--- a/cli/dist/preconstruct-cli-cli.esm.js
+++ b/cli/dist/preconstruct-cli-cli.esm.js
@@ -1460,7 +1460,7 @@ let memoizedGetProgram = weakMemoize(typescript => memoize(async configFileName
return nonMemoizedGetProgram(typescript, configFileName);
}));
async function getProgram(dirname, pkgName, ts) {
- let configFileName = ts.findConfigFile(dirname, ts.sys.fileExists);
+ let configFileName = ts.findConfigFile(dirname, ts.sys.fileExists, 'tsconfig.lib.json');
if (!configFileName) {
throw new FatalError("an entrypoint source file ends with the .ts or tsx extension but no TypeScript config exists, please create one.", pkgName);
}
+1 -4
View File
@@ -17,7 +17,4 @@ postgres-on-docker:
-c "CREATE DATABASE \"test\" WITH OWNER postgres;"
redis-on-docker:
docker run -d --name twenty_redis -p 6379:6379 redis/redis-stack-server:latest
clickhouse-on-docker:
docker run -d --name twenty_clickhouse -p 8123:8123 -p 9000:9000 -e CLICKHOUSE_PASSWORD=clickhousePassword clickhouse/clickhouse-server:latest \
docker run -d --name twenty_redis -p 6379:6379 redis/redis-stack-server:latest
+34 -45
View File
@@ -1,28 +1,28 @@
<br />
<br>
<p align="center">
<a href="https://www.twenty.com">
<img src="./packages/twenty-website/public/images/core/logo.svg" width="100px" alt="Twenty logo" />
</a>
</p>
<h2 align="center" >The #1 Open-Source CRM </h2>
<h2 align="center" >The #1 Open-Source CRM </h3>
<p align="center"><a href="https://twenty.com">🌐 Website</a> · <a href="https://twenty.com/developers">📚 Documentation</a> · <a href="https://github.com/orgs/twentyhq/projects/1"><img src="./packages/twenty-website/public/images/readme/planner-icon.svg" width="12" height="12"/> Roadmap </a> · <a href="https://discord.gg/cx5n4Jzs57"><img src="./packages/twenty-website/public/images/readme/discord-icon.svg" width="12" height="12"/> Discord</a> · <a href="https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty"><img src="./packages/twenty-website/public/images/readme/figma-icon.png" width="12" height="12"/> Figma</a></p>
<p align="center"><a href="https://twenty.com">🌐 Website</a> · <a href="https://twenty.com/developers">📚 Documentation</a> · <a href="https://github.com/orgs/twentyhq/projects/1"><img src="./packages/twenty-website/public/images/readme/planner-icon.svg" width="12" height="12"/> Roadmap </a> · <a href="https://discord.gg/cx5n4Jzs57"><img src="./packages/twenty-website/public/images/readme/discord-icon.svg" width="12" height="12"/> Discord</a> · <a href="https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty"><img src="./packages/twenty-website/public/images/readme/figma-icon.png" width="12" height="12"/> Figma</a><p>
<br />
<p align="center">
<a href="https://www.twenty.com">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/preview-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/preview-light.png" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/preview-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/preview-light.png">
<img src="./packages/twenty-docs/static/img/preview-light.png" alt="Companies view" />
</picture>
</a>
</p>
<br />
<br>
# Installation
@@ -40,7 +40,7 @@ We built Twenty for three reasons:
**We believe in Open-source and community.** Hundreds of developers are already building Twenty together. Once we have plugin capabilities, a whole ecosystem will grow around it.
<br />
<br>
# What You Can Do With Twenty
We're currently developing Twenty's beta version.
@@ -60,8 +60,8 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/index-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/index-light.png" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/index-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/index-light.png">
<img src="./packages/twenty-docs/static/img/visualise-customer-light.png" alt="Companies view" />
</picture>
</p>
@@ -70,9 +70,9 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/kanban-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/kanban-light.png" />
<img src="./packages/twenty-docs/static/img/follow-your-deals-light.png" alt="Opportunities view" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/kanban-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/kanban-light.png">
<img src="./packages/twenty-docs/static/img/follow-your-deals-light.png" alt="Companies view" />
</picture>
</p>
@@ -80,9 +80,9 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/emails-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/emails-light.png" />
<img src="./packages/twenty-docs/static/img/emails-light.png" alt="Emails" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/emails-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/emails-light.png">
<img src="./packages/twenty-docs/static/img/rich-notes-light.png" alt="Companies view" />
</picture>
</p>
@@ -90,9 +90,9 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/data-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/data-light.png" />
<img src="./packages/twenty-docs/static/img/data-light.png" alt="Data model" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/data-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/data-light.png">
<img src="./packages/twenty-docs/static/img/rich-notes-light.png" alt="Companies view" />
</picture>
</p>
@@ -100,9 +100,9 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/notes-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/notes-light.png" />
<img src="./packages/twenty-docs/static/img/notes-light.png" alt="Rich notes" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/notes-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/notes-light.png">
<img src="./packages/twenty-docs/static/img/rich-notes-light.png" alt="Companies view" />
</picture>
</p>
@@ -110,9 +110,9 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/tasks-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/tasks-light.png" />
<img src="./packages/twenty-docs/static/img/create-tasks-light.png" alt="Tasks" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/tasks-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/tasks-light.png">
<img src="./packages/twenty-docs/static/img/create-tasks-light.png" alt="Companies view" />
</picture>
</p>
@@ -120,9 +120,9 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/keyboard-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/keyboard-light.png" />
<img src="./packages/twenty-docs/static/img/keyboard-dark.png" alt="Keyboard shortcuts" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/keyboard-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/keyboard-light.png">
<img src="./packages/twenty-docs/static/img/shortcut-navigation-light.png" alt="Companies view" />
</picture>
</p>
@@ -130,33 +130,22 @@ Below are a few features we have implemented to date:
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/api-dark.png" />
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/api-light.png" />
<img src="./packages/twenty-docs/static/img/api-light.png" alt="API" />
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/api-dark.png">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/twentyhq/twenty/v0.12.0/packages/twenty-docs/static/img/api-light.png">
<img src="./packages/twenty-docs/static/img/shortcut-navigation-light.png" alt="Companies view" />
</picture>
</p>
<br />
<br>
# Stack
- [TypeScript](https://www.typescriptlang.org/)
- [Nx](https://nx.dev/)
- [NestJS](https://nestjs.com/), with [BullMQ](https://bullmq.io/), [PostgreSQL](https://www.postgresql.org/), [Redis](https://redis.io/)
- [React](https://reactjs.org/), with [Recoil](https://recoiljs.org/), [Emotion](https://emotion.sh/) and [Lingui](https://lingui.dev/)
# Thanks
<p align="center">
<a href="https://www.chromatic.com/"><img src="./packages/twenty-website/public/images/readme/chromatic.png" height="30" alt="Chromatic" /></a>
<a href="https://greptile.com"><img src="./packages/twenty-website/public/images/readme/greptile.png" height="30" alt="Greptile" /></a>
<a href="https://sentry.io/"><img src="./packages/twenty-website/public/images/readme/sentry.png" height="30" alt="Sentry" /></a>
<a href="https://crowdin.com/"><img src="./packages/twenty-website/public/images/readme/crowdin.png" height="30" alt="Crowdin" /></a>
</p>
Thanks to these amazing services that we use and recommend for UI testing (Chromatic), code review (Greptile), catching bugs (Sentry) and translating (Crowdin).
- [React](https://reactjs.org/), with [Recoil](https://recoiljs.org/) and [Emotion](https://emotion.sh/)
- [Greptile](https://greptile.com) for code reviews.
- [Lingui](https://lingui.dev/) and [Crowdin](https://twenty.crowdin.com/twenty) for translations.
# Join the Community
View File
+5 -7
View File
@@ -44,7 +44,7 @@
"@octokit/graphql": "^7.0.2",
"@ptc-org/nestjs-query-core": "^4.2.0",
"@ptc-org/nestjs-query-typeorm": "4.2.1-alpha.2",
"@react-email/components": "0.0.35",
"@react-email/components": "0.0.32",
"@react-email/render": "0.0.17",
"@sentry/node": "^8",
"@sentry/profiling-node": "^8",
@@ -77,7 +77,6 @@
"bytes": "^3.1.2",
"class-transformer": "^0.5.1",
"clsx": "^2.1.1",
"cron-parser": "^5.1.1",
"cron-validate": "^1.4.5",
"cross-env": "^7.0.3",
"css-loader": "^7.1.2",
@@ -100,9 +99,7 @@
"graphql-fields": "^2.0.3",
"graphql-middleware": "^6.1.35",
"graphql-rate-limit": "^3.3.0",
"graphql-redis-subscriptions": "^2.7.0",
"graphql-scalars": "^1.23.0",
"graphql-sse": "^2.5.4",
"graphql-subscriptions": "2.0.0",
"graphql-tag": "^2.12.6",
"graphql-type-json": "^0.3.2",
@@ -143,6 +140,8 @@
"next-mdx-remote": "^4.4.1",
"nodemailer": "^6.9.8",
"openapi-types": "^12.1.3",
"overlayscrollbars": "^2.6.1",
"overlayscrollbars-react": "^0.5.4",
"passport": "^0.7.0",
"passport-google-oauth20": "^2.0.0",
"passport-jwt": "^4.0.1",
@@ -184,13 +183,13 @@
"semver": "^7.5.4",
"sharp": "^0.32.1",
"slash": "^5.1.0",
"storybook-addon-mock-date": "^0.6.0",
"stripe": "^17.3.1",
"ts-key-enum": "^2.0.12",
"tslib": "^2.3.0",
"tsup": "^8.2.4",
"type-fest": "4.10.1",
"typescript": "5.3.3",
"use-context-selector": "^2.0.0",
"use-debounce": "^10.0.0",
"uuid": "^9.0.0",
"vite-tsconfig-paths": "^4.2.1",
@@ -357,8 +356,7 @@
"type-fest": "4.10.1",
"typescript": "5.3.3",
"prosemirror-model": "1.23.0",
"yjs": "13.6.18",
"graphql-redis-subscriptions/ioredis": "^5.6.0"
"yjs": "13.6.18"
},
"version": "0.2.1",
"nx": {},
@@ -1,16 +1,11 @@
module.exports = {
root: true,
extends: ['../../.eslintrc.global.cjs', '../../.eslintrc.react.cjs'],
ignorePatterns: [
'node_modules',
'dist',
'**/generated/*',
],
extends: ['../../.eslintrc.cjs', '../../.eslintrc.react.cjs'],
ignorePatterns: ['!**/*', 'node_modules', 'dist', '**/generated/*'],
overrides: [
{
files: ['**/*.ts', '**/*.tsx'],
files: ['*.ts', '*.tsx'],
parserOptions: {
project: ['packages/twenty-chrome-extension/tsconfig.*.json'],
project: ['packages/twenty-chrome-extension/tsconfig.{json,*.json}'],
},
rules: {
'@nx/workspace-explicit-boolean-predicates-in-if': 'warn',
@@ -1,7 +1,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="images/icons/android/android-launchericon-48-48.png" />
<link rel="icon" href="/icons/android/android-launchericon-48-48.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Twenty</title>
</head>
@@ -1,7 +1,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="images/icons/android/android-launchericon-48-48.png" />
<link rel="icon" href="/icons/android/android-launchericon-48-48.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Twenty</title>
</head>
@@ -1,7 +1,7 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="images/icons/android/android-launchericon-48-48.png" />
<link rel="icon" href="/icons/android/android-launchericon-48-48.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Twenty</title>
<style>
+5 -18
View File
@@ -1,27 +1,14 @@
# Makefile for building Twenty CRM docker images.
# Set the tag and/or target build platform using make command-line variables assignments.
#
# Optional make variables:
# PLATFORM - defaults to 'linux/amd64'
# TAG - defaults to 'latest'
#
# Example: make
# Example: make PLATFORM=linux/aarch64 TAG=my-tag
PLATFORM ?= linux/amd64
TAG ?= latest
prod-build:
@cd ../.. && docker build -f ./packages/twenty-docker/twenty/Dockerfile --platform $(PLATFORM) --tag twenty:$(TAG) . && cd -
@cd ../.. && docker build -f ./packages/twenty-docker/twenty/Dockerfile --tag twenty . && cd -
prod-run:
@docker run -d -p 3000:3000 --name twenty twenty:$(TAG)
@docker run -d -p 3000:3000 --name twenty twenty
prod-postgres-run:
@docker run -d -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres --name twenty-postgres twenty-postgres:$(TAG)
@docker run -d -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres --name twenty-postgres twenty-postgres
prod-website-build:
@cd ../.. && docker build -f ./packages/twenty-docker/twenty-website/Dockerfile --platform $(PLATFORM) --tag twenty-website:$(TAG) . && cd -
@cd ../.. && docker build -f ./packages/twenty-docker/twenty-website/Dockerfile --tag twenty-website . && cd -
prod-website-run:
@docker run -d -p 3000:3000 --name twenty-website twenty-website:$(TAG)
@docker run -d -p 3000:3000 --name twenty-website twenty-website
+20 -4
View File
@@ -1,10 +1,22 @@
name: twenty
services:
change-vol-ownership:
image: ubuntu
user: root
volumes:
- server-local-data:/tmp/server-local-data
- docker-data:/tmp/docker-data
command: >
bash -c "
chown -R 1000:1000 /tmp/server-local-data
&& chown -R 1000:1000 /tmp/docker-data"
server:
image: twentycrm/twenty:${TAG:-latest}
volumes:
- server-local-data:/app/packages/twenty-server/.local-storage
- server-local-data:/app/packages/twenty-server/${STORAGE_LOCAL_PATH:-.local-storage}
- docker-data:/app/docker-data
ports:
- "3000:3000"
environment:
@@ -19,6 +31,7 @@ services:
STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT}
APP_SECRET: ${APP_SECRET:-replace_me_with_a_random_string}
# MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED}
# CALENDAR_PROVIDER_GOOGLE_ENABLED: ${CALENDAR_PROVIDER_GOOGLE_ENABLED}
# AUTH_GOOGLE_CLIENT_ID: ${AUTH_GOOGLE_CLIENT_ID}
@@ -44,13 +57,15 @@ services:
# EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD:-}
depends_on:
change-vol-ownership:
condition: service_completed_successfully
db:
condition: service_healthy
healthcheck:
test: curl --fail http://localhost:3000/healthz
interval: 5s
timeout: 5s
retries: 20
retries: 10
restart: always
worker:
@@ -70,6 +85,7 @@ services:
STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT}
APP_SECRET: ${APP_SECRET:-replace_me_with_a_random_string}
# MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED}
# CALENDAR_PROVIDER_GOOGLE_ENABLED: ${CALENDAR_PROVIDER_GOOGLE_ENABLED}
# AUTH_GOOGLE_CLIENT_ID: ${AUTH_GOOGLE_CLIENT_ID}
@@ -93,7 +109,7 @@ services:
# EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT:-465}
# EMAIL_SMTP_USER: ${EMAIL_SMTP_USER:-}
# EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD:-}
depends_on:
db:
condition: service_healthy
@@ -118,8 +134,8 @@ services:
redis:
image: redis
restart: always
command: ["--maxmemory-policy", "noeviction"]
volumes:
docker-data:
db-data:
server-local-data:
-3
View File
@@ -1,7 +1,4 @@
# README
DISCLAIMER: The k8s and podman deployments are not maintained by the core team.
These files are provided and maintained by the community. Twenty core team
maintains support for docker deployment.
## Overview
@@ -25,10 +25,9 @@ spec:
- name: redis
image: redis/redis-stack-server:latest
imagePullPolicy: Always
args: ["--maxmemory-policy", "noeviction"]
env:
- name: PORT
value: "6379"
value: 6379
ports:
- containerPort: 6379
name: redis
-48
View File
@@ -1,48 +0,0 @@
# How to deploy twenty on podman
DISCLAIMER: The k8s and podman deployments are not maintained by the core team.
These files are provided and maintained by the community. Twenty core team
maintains support for docker deployment.
## How to use
1. Edit `.env` file. At the minimum set `POSTGRES_PASSWORD`, `SERVER_URL`, and `APP_SECRET`.
2. Start twenty by running `podman-compose up -d`.
If you need to stop twenty, you can do so by running `podman-compose down`.
### Install systemd service (optional)
If you want to install a systemd service to run twenty, you can use the provided systemd service.
Edit `twentycrm.service` and change these two variables:
WorkingDirectory=/opt/apps/twenty
EnvironmentFile=/opt/apps/twenty/.env
`WorkingDirectory` should be changed to the path in which `podman-compose.yml` is located.
`EnvironmentFile` should be changed to the path in which your `.env`file is located.
You can run the script `install-systemd-user-service` to install the systemd service under the current user.
./install-systemd-user-service
Note: this script will enable the service and also start it. So it will assume that twenty is not currently running.
If you started it previously, bring it down using:
podman-compose down
## Compatibility
These files should be compatible with podman 4.3+.
I have tested this on Debian GNU/Linux 12 (bookworm) and with the podman that is distributed with the official Debian stable mirrors (podman v4.3.1+ds1-8+deb12u1, podman-compose v1.0.3-3).
@@ -1,11 +0,0 @@
#!/bin/bash
set -e
mkdir -p ~/.config/systemd/user
[ -f twentycrm.service ] || { echo "Error: twentycrm.service not found"; exit 1; }
cp twentycrm.service ~/.config/systemd/user
systemctl --user daemon-reload
systemctl --user enable twentycrm.service
systemctl --user start twentycrm.service
@@ -1,71 +0,0 @@
#!/bin/bash
set -e
if [ ! -f "$(dirname "$0")/.env" ]; then
echo "Error: .env file not found"
exit 1
fi
source "$(dirname "$0")/.env"
## steps to cleanup and start over from scratch - useful when testing
#podman pod stop twenty-pod
#podman pod rm twenty-pod
#podman volume rm twenty-db-data twenty-server-data twenty-redis-data
# end of cleanup
podman volume create twenty-db-data
podman volume create twenty-server-data
podman volume create twenty-redis-data
podman pod create --name twenty-pod -p 127.0.0.1:8080:3000
podman run -d --pod twenty-pod --name twenty-db \
-e POSTGRES_DB=twenty \
-e POSTGRES_USER=twenty \
-e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
-v twenty-db-data:/var/lib/postgresql/data:Z \
docker.io/library/postgres:16
podman run -d --pod twenty-pod --name twenty-redis \
-v twenty-redis-data:/data:Z \
docker.io/library/redis:latest
podman run -d --pod twenty-pod --name twenty-server \
-e NODE_PORT=3000 \
-e SERVER_URL="$SERVER_URL" \
-e PG_DATABASE_URL="postgresql://twenty:$POSTGRES_PASSWORD@twenty-db:5432/twenty" \
-e REDIS_URL="redis://twenty-redis:6379" \
-e APP_SECRET="$APP_SECRET" \
-e NODE_ENV=production \
-e LOG_LEVEL=info \
-v twenty-server-data:/app/docker-data:Z \
docker.io/twentycrm/twenty:latest
podman run -d --pod twenty-pod --name twenty-worker \
--init \
-e SERVER_URL="$SERVER_URL" \
-e PG_DATABASE_URL="postgresql://twenty:$POSTGRES_PASSWORD@twenty-db:5432/twenty" \
-e REDIS_URL="redis://twenty-redis:6379" \
-e APP_SECRET="$APP_SECRET" \
-e DISABLE_DB_MIGRATIONS=true \
-e NODE_ENV=production \
-e LOG_LEVEL=info \
-v twenty-server-data:/app/docker-data:Z \
docker.io/twentycrm/twenty:latest \
yarn worker:prod
# wait some time, check status
sleep 30
podman ps --pod -f name=twenty-pod
mkdir -p ~/.config/systemd/user
if [ ! -f "twentycrm.service" ]; then
echo "Error: twentycrm.service file not found"
exit 1
fi
cp twentycrm.service ~/.config/systemd/user
systemctl --user daemon-reload
systemctl --user enable twentycrm.service
systemctl --user start twentycrm.service
@@ -1,56 +0,0 @@
version: "3.8"
services:
db:
container_name: twenty-db
image: postgres:16
environment:
POSTGRES_DB: twenty
POSTGRES_USER: twenty
POSTGRES_PASSWORD: ${PG_DATABASE_PASSWORD}
volumes:
- twenty-db-data:/var/lib/postgresql/data:Z
redis:
container_name: twenty-redis
image: redis:latest
command: ["--maxmemory-policy", "noeviction"]
volumes:
- twenty-redis-data:/data:Z
server:
container_name: twenty-server
image: twentycrm/twenty:latest
environment:
NODE_PORT: "3000"
SERVER_URL: ${SERVER_URL}
PG_DATABASE_URL: "postgresql://twenty:${PG_DATABASE_PASSWORD}@twenty-db:5432/twenty"
REDIS_URL: "redis://twenty-redis:6379"
APP_SECRET: ${APP_SECRET}
NODE_ENV: production
LOG_LEVEL: info
volumes:
- twenty-server-data:/app/docker-data:Z
ports:
- 127.0.0.1:8080:3000
worker:
container_name: twenty-worker
image: twentycrm/twenty:latest
command: yarn worker:prod
environment:
SERVER_URL: ${SERVER_URL}
PG_DATABASE_URL: "postgresql://twenty:${PG_DATABASE_PASSWORD}@twenty-db:5432/twenty"
REDIS_URL: "redis://twenty-redis:6379"
APP_SECRET: ${APP_SECRET}
DISABLE_DB_MIGRATIONS: "true"
NODE_ENV: production
LOG_LEVEL: info
volumes:
- twenty-server-data:/app/docker-data:Z
init: true
volumes:
twenty-db-data:
twenty-server-data:
twenty-redis-data:
@@ -1,15 +0,0 @@
[Unit]
Description=TwentyCRM Container Stack via Podman-Compose
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/apps/twenty
EnvironmentFile=/opt/apps/twenty/.env
ExecStart=/usr/bin/podman-compose -f podman-compose.yml up -d
ExecStop=/usr/bin/podman-compose -f podman-compose.yml down
RemainAfterExit=yes
[Install]
WantedBy=default.target
@@ -8,8 +8,6 @@ COPY ./yarn.lock .
COPY ./.yarnrc.yml .
COPY ./.yarn/releases /app/.yarn/releases
COPY ./tools/eslint-rules /app/tools/eslint-rules
COPY ./packages/twenty-ui/package.json /app/packages/twenty-ui/
COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/
COPY ./packages/twenty-website/package.json /app/packages/twenty-website/package.json
RUN yarn
@@ -19,7 +17,6 @@ ENV KEYSTATIC_GITHUB_CLIENT_SECRET="<fake build value>"
ENV KEYSTATIC_SECRET="<fake build value>"
ENV NEXT_PUBLIC_KEYSTATIC_GITHUB_APP_SLUG="<fake build value>"
COPY ./packages/twenty-ui /app/packages/twenty-ui
COPY ./packages/twenty-website /app/packages/twenty-website
RUN npx nx build twenty-website
+5 -3
View File
@@ -7,12 +7,12 @@ WORKDIR /app
COPY ./package.json ./yarn.lock ./.yarnrc.yml ./tsconfig.base.json ./nx.json /app/
COPY ./.yarn/releases /app/.yarn/releases
COPY ./.prettierrc /app/
COPY ./packages/twenty-emails/package.json /app/packages/twenty-emails/
COPY ./packages/twenty-server/package.json /app/packages/twenty-server/
COPY ./packages/twenty-server/patches /app/packages/twenty-server/patches
COPY ./packages/twenty-ui/package.json /app/packages/twenty-ui/
COPY ./packages/twenty-shared/package.json /app/packages/twenty-shared/
COPY ./packages/twenty-shared/patches /app/packages/twenty-shared/patches
COPY ./packages/twenty-front/package.json /app/packages/twenty-front/
# Install all dependencies
@@ -64,6 +64,8 @@ WORKDIR /app/packages/twenty-server
ARG REACT_APP_SERVER_BASE_URL
ENV REACT_APP_SERVER_BASE_URL $REACT_APP_SERVER_BASE_URL
ARG SENTRY_RELEASE
ENV SENTRY_RELEASE $SENTRY_RELEASE
ARG APP_VERSION
ENV APP_VERSION $APP_VERSION
@@ -77,8 +79,8 @@ COPY --chown=1000 --from=twenty-front-build /app/packages/twenty-front/build /ap
LABEL org.opencontainers.image.source=https://github.com/twentyhq/twenty
LABEL org.opencontainers.image.description="This image provides a consistent and reproducible environment for the backend and frontend, ensuring it deploys faster and runs the same way regardless of the deployment environment."
RUN mkdir -p /app/.local-storage /app/packages/twenty-server/.local-storage && \
chown -R 1000:1000 /app
RUN mkdir /app/.local-storage
RUN chown -R 1000 /app
# Use non root user with uid 1000
USER 1000
+13 -21
View File
@@ -1,34 +1,26 @@
#!/bin/sh
set -e
setup_and_migrate_db() {
if [ "${DISABLE_DB_MIGRATIONS}" = "true" ]; then
echo "Database setup and migrations are disabled, skipping..."
return
fi
# Check if the initialization has already been done and that we enabled automatic migration
if [ "${DISABLE_DB_MIGRATIONS}" != "true" ] && [ ! -f /app/docker-data/db_status ]; then
echo "Running database setup and migrations..."
# Creating the database if it doesn't exist
PGUSER=$(echo $PG_DATABASE_URL | awk -F '//' '{print $2}' | awk -F ':' '{print $1}')
PGPASS=$(echo $PG_DATABASE_URL | awk -F ':' '{print $3}' | awk -F '@' '{print $1}')
PGHOST=$(echo $PG_DATABASE_URL | awk -F '@' '{print $2}' | awk -F ':' '{print $1}')
PGPORT=$(echo $PG_DATABASE_URL | awk -F ':' '{print $4}' | awk -F '/' '{print $1}')
PGDATABASE=$(echo $PG_DATABASE_URL | awk -F ':' '{print $4}' | awk -F '/' '{print $2}')
PGPASSWORD=${PGPASS} psql -h ${PGHOST} -p ${PGPORT} -U ${PGUSER} -d postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'default'" | grep -q 1 || \
PGPASSWORD=${PGPASS} psql -h ${PGHOST} -p ${PGPORT} -U ${PGUSER} -d postgres -c "CREATE DATABASE \"default\""
# Creating the database if it doesn't exist
db_count=$(PGPASSWORD=${PGPASS} psql -h ${PGHOST} -p ${PGPORT} -U ${PGUSER} -d postgres -tAc "SELECT COUNT(*) FROM pg_database WHERE datname = '${PGDATABASE}'")
if [ "$db_count" = "0" ]; then
echo "Database ${PGDATABASE} does not exist, creating..."
PGPASSWORD=${PGPASS} psql -h ${PGHOST} -p ${PGPORT} -U ${PGUSER} -d postgres -c "CREATE DATABASE \"${PGDATABASE}\""
# Run setup and migration scripts
NODE_OPTIONS="--max-old-space-size=1500" tsx ./scripts/setup-db.ts
yarn database:migrate:prod
# Run setup and migration scripts
NODE_OPTIONS="--max-old-space-size=1500" tsx ./scripts/setup-db.ts
yarn database:migrate:prod
fi
yarn command:prod upgrade
echo "Successfully migrated DB!"
}
setup_and_migrate_db
# Mark initialization as done
echo "Successfuly migrated DB!"
touch /app/docker-data/db_status
fi
# Continue with the original Docker command
exec "$@"
+1 -1
View File
@@ -2,5 +2,5 @@
FRONTEND_BASE_URL=http://localhost:3001
BACKEND_BASE_URL=http://localhost:3000
DEFAULT_LOGIN=tim@apple.dev
DEFAULT_PASSWORD=tim@apple.dev
DEFAULT_PASSWORD=Applecar2025
WEBSITE_URL=https://twenty.com
@@ -17,15 +17,12 @@ export class WorkflowVisualizerPage {
readonly deactivateWorkflowButton: Locator;
readonly addTriggerButton: Locator;
readonly commandMenu: Locator;
readonly stepHeaderInCommandMenu: Locator;
readonly workflowNameLabel: Locator;
readonly triggerNode: Locator;
readonly background: Locator;
readonly useAsDraftButton: Locator;
readonly overrideDraftButton: Locator;
readonly discardDraftButton: Locator;
readonly seeRunsButton: Locator;
readonly goBackInCommandMenu: Locator;
#actionNames: Record<WorkflowActionType, string> = {
'create-record': 'Create Record',
@@ -33,7 +30,6 @@ export class WorkflowVisualizerPage {
'delete-record': 'Delete Record',
code: 'Code',
'send-email': 'Send Email',
form: 'Form',
};
#createdActionNames: Record<WorkflowActionType, string> = {
@@ -42,7 +38,6 @@ export class WorkflowVisualizerPage {
'delete-record': 'Delete Record',
code: 'Code - Serverless Function',
'send-email': 'Send Email',
form: 'Form',
};
#triggerNames: Record<WorkflowTriggerType, string> = {
@@ -73,9 +68,6 @@ export class WorkflowVisualizerPage {
});
this.addTriggerButton = page.getByText('Add a Trigger');
this.commandMenu = page.getByTestId('command-menu');
this.stepHeaderInCommandMenu = this.commandMenu.getByTestId(
'workflow-step-header',
);
this.workflowNameLabel = page
.getByTestId('top-bar-title')
.getByText(this.workflowName);
@@ -88,10 +80,6 @@ export class WorkflowVisualizerPage {
this.discardDraftButton = page.getByRole('button', {
name: 'Discard Draft',
});
this.seeRunsButton = page.getByRole('link', { name: 'See runs' });
this.goBackInCommandMenu = this.commandMenu
.getByRole('button')
.and(this.commandMenu.getByTestId('command-menu-go-back-button'));
}
async createOneWorkflow() {
@@ -126,7 +114,7 @@ export class WorkflowVisualizerPage {
.getByTestId(`row-id-${this.workflowId}`)
.getByRole('link', { name: this.workflowName });
await workflowLink.click({ force: true });
await workflowLink.click();
await this.waitForWorkflowVisualizerLoad();
}
@@ -258,64 +246,29 @@ export class WorkflowVisualizerPage {
await expect(this.#page.getByTestId('command-menu')).not.toBeVisible();
}
async goToWorkflowsIndexPage() {
await this.#page.goto('/objects/workflows');
}
async setWorkflowsOpenInMode(mode: 'side-panel' | 'record-page') {
const recordTableOptionsButton = this.#page.getByText('Options');
await recordTableOptionsButton.click();
const layoutButton = this.#page.getByText('Layout');
await layoutButton.click();
const openInButton = this.#page.getByText('Open in');
await openInButton.click();
if (mode === 'side-panel') {
const openInSidePanelOption = this.#page.getByRole('option', {
name: 'Side Panel',
});
await openInSidePanelOption.click();
} else {
const openInRecordPageOption = this.#page.getByRole('option', {
name: 'Record Page',
});
await openInRecordPageOption.click();
}
// Close the dropdown
await recordTableOptionsButton.click();
}
}
export const test = base.extend<{
workflowVisualizer: WorkflowVisualizerPage;
}>({
workflowVisualizer: async ({ page }, use) => {
const workflowVisualizer = new WorkflowVisualizerPage({
page,
workflowName: 'Test Workflow',
});
export const test = base.extend<{ workflowVisualizer: WorkflowVisualizerPage }>(
{
workflowVisualizer: async ({ page }, use) => {
const workflowVisualizer = new WorkflowVisualizerPage({
page,
workflowName: 'Test Workflow',
});
await workflowVisualizer.createOneWorkflow();
await workflowVisualizer.goToWorkflowVisualizerPage();
await workflowVisualizer.createOneWorkflow();
await workflowVisualizer.goToWorkflowVisualizerPage();
await use(workflowVisualizer);
await use(workflowVisualizer);
await deleteWorkflow({
page,
workflowId: workflowVisualizer.workflowId,
});
await destroyWorkflow({
page,
workflowId: workflowVisualizer.workflowId,
});
await workflowVisualizer.goToWorkflowsIndexPage();
await workflowVisualizer.setWorkflowsOpenInMode('record-page');
await deleteWorkflow({
page,
workflowId: workflowVisualizer.workflowId,
});
await destroyWorkflow({
page,
workflowId: workflowVisualizer.workflowId,
});
},
},
});
);
@@ -110,10 +110,6 @@ export class SettingsPage {
await this.releasesLink.click();
}
async logout() {
await this.page.getByText('Logout').click();
}
async toggleAdvancedSettings() {
await this.advancedToggle.click();
}
@@ -9,5 +9,4 @@ export type WorkflowActionType =
| 'update-record'
| 'delete-record'
| 'code'
| 'send-email'
| 'form';
| 'send-email';
+1
View File
@@ -1,5 +1,6 @@
{
"name": "twenty-e2e-testing",
"version": "0.44.13",
"description": "",
"author": "",
"private": true,
@@ -10,9 +10,7 @@ test('Create workflow', async ({ page }) => {
const workflowsLink = page.getByRole('link', { name: 'Workflows' });
await workflowsLink.click();
const createWorkflowButton = page.getByRole('button', {
name: 'Create new workflow',
});
const createWorkflowButton = page.getByRole('button', { name: 'New record' });
const [createWorkflowResponse] = await Promise.all([
page.waitForResponse(async (response) => {
@@ -28,7 +26,7 @@ test('Create workflow', async ({ page }) => {
createWorkflowButton.click(),
]);
const recordName = page.getByTestId('top-bar-title').getByText('Untitled');
const recordName = page.getByTestId('top-bar-title').getByTestId('tooltip');
await recordName.click();
const nameInput = page.getByTestId('top-bar-title').getByRole('textbox');
@@ -1,152 +1,60 @@
import { expect } from '@playwright/test';
import { test } from '../lib/fixtures/blank-workflow';
test('The workflow run visualizer shows the executed draft version without the last draft changes', async ({
workflowVisualizer,
page,
}) => {
await workflowVisualizer.createInitialTrigger('manual');
test.fixme(
'The workflow run visualizer shows the executed draft version without the last draft changes',
async ({ workflowVisualizer, page }) => {
await workflowVisualizer.createInitialTrigger('manual');
const manualTriggerAvailabilitySelect = page.getByRole('button', {
name: 'When record(s) are selected',
});
const manualTriggerAvailabilitySelect = page.getByRole('button', {
name: 'When record(s) are selected',
});
await manualTriggerAvailabilitySelect.click();
await manualTriggerAvailabilitySelect.click();
const alwaysAvailableOption = page.getByText(
'When no record(s) are selected',
);
const alwaysAvailableOption = page.getByText(
'When no record(s) are selected',
);
await alwaysAvailableOption.click();
await alwaysAvailableOption.click();
await workflowVisualizer.closeSidePanel();
await workflowVisualizer.closeSidePanel();
const { createdStepId: firstStepId } =
await workflowVisualizer.createStep('create-record');
const { createdStepId: firstStepId } =
await workflowVisualizer.createStep('create-record');
await workflowVisualizer.closeSidePanel();
await workflowVisualizer.closeSidePanel();
const launchTestButton = page.getByLabel(workflowVisualizer.workflowName);
const launchTestButton = page.getByLabel('Test Workflow');
await launchTestButton.click();
await launchTestButton.click();
const goToExecutionPageLink = page.getByRole('link', {
name: 'View execution details',
});
const executionPageUrl = await goToExecutionPageLink.getAttribute('href');
expect(executionPageUrl).not.toBeNull();
const goToExecutionPageLink = page.getByRole('link', {
name: 'View execution details',
});
const executionPageUrl = await goToExecutionPageLink.getAttribute('href');
expect(executionPageUrl).not.toBeNull();
await workflowVisualizer.deleteStep(firstStepId);
await workflowVisualizer.deleteStep(firstStepId);
await page.goto(executionPageUrl!);
await page.goto(executionPageUrl!);
const workflowRunName = page
.getByText(`#1 - ${workflowVisualizer.workflowName}`)
.nth(1);
const workflowRunName = page.getByText('Execution of v1');
await expect(workflowRunName).toBeVisible();
await expect(workflowRunName).toBeVisible();
const executedFirstStepNode = workflowVisualizer.getStepNode(firstStepId);
const flowTab = page.getByText('Flow', { exact: true });
await expect(executedFirstStepNode).toBeVisible();
await flowTab.click();
await executedFirstStepNode.click();
const executedFirstStepNode = workflowVisualizer.getStepNode(firstStepId);
await expect(workflowVisualizer.stepHeaderInCommandMenu).toContainText(
'Create Record',
);
});
await expect(executedFirstStepNode).toBeVisible();
test('Workflow Runs with a pending form step can be opened in the side panel and then in full screen', async ({
workflowVisualizer,
page,
}) => {
await workflowVisualizer.createInitialTrigger('manual');
await executedFirstStepNode.click();
const manualTriggerAvailabilitySelect = page.getByRole('button', {
name: 'When record(s) are selected',
});
await manualTriggerAvailabilitySelect.click();
const alwaysAvailableOption = page.getByText(
'When no record(s) are selected',
);
await alwaysAvailableOption.click();
await workflowVisualizer.closeSidePanel();
const { createdStepId: firstStepId } =
await workflowVisualizer.createStep('form');
await workflowVisualizer.closeSidePanel();
const launchTestButton = page.getByLabel(workflowVisualizer.workflowName);
await launchTestButton.click();
const goToExecutionPageLink = page.getByRole('link', {
name: 'View execution details',
});
await expect(goToExecutionPageLink).toBeVisible();
await workflowVisualizer.seeRunsButton.click();
const workflowRunName = `#1 - ${workflowVisualizer.workflowName}`;
const workflowRunNameCell = page.getByRole('cell', { name: workflowRunName });
await expect(workflowRunNameCell).toBeVisible();
await workflowVisualizer.setWorkflowsOpenInMode('side-panel');
// 1. Exit the dropdown
await workflowRunNameCell.click();
// 2. Actually open the workflow run in the side panel
await workflowRunNameCell.click();
await expect(workflowVisualizer.stepHeaderInCommandMenu).toContainText(
'Form',
);
await workflowVisualizer.goBackInCommandMenu.click();
const workflowRunNameInCommandMenu =
workflowVisualizer.commandMenu.getByText(workflowRunName);
await expect(workflowRunNameInCommandMenu).toBeVisible();
await workflowVisualizer.triggerNode.click();
await expect(workflowVisualizer.stepHeaderInCommandMenu).toContainText(
'Launch manually',
);
await workflowVisualizer.goBackInCommandMenu.click();
const formStep = workflowVisualizer.getStepNode(firstStepId);
await formStep.click();
await workflowVisualizer.goBackInCommandMenu.click();
const openInFullScreenButton = workflowVisualizer.commandMenu.getByRole(
'button',
{ name: 'Open' },
);
await openInFullScreenButton.click();
const workflowRunNameInShowPage = page
.getByText(`#1 - ${workflowVisualizer.workflowName}`)
.nth(1);
await expect(workflowRunNameInShowPage).toBeVisible();
// Expect the side panel to be opened by default on the form.
await expect(workflowVisualizer.stepHeaderInCommandMenu).toContainText(
'Form',
);
});
await expect(
workflowVisualizer.commandMenu.getByRole('textbox').first(),
).toHaveValue('Create Record');
},
);
@@ -8,19 +8,25 @@ test('Use an old version as draft', async ({ workflowVisualizer, page }) => {
await workflowVisualizer.background.click();
await workflowVisualizer.activateWorkflowButton.click();
await Promise.all([
expect(workflowVisualizer.workflowStatus).toHaveText('Active'),
await expect(workflowVisualizer.workflowStatus).toHaveText('Active');
workflowVisualizer.activateWorkflowButton.click(),
]);
await workflowVisualizer.createStep('delete-record');
await Promise.all([
expect(workflowVisualizer.workflowStatus).toHaveText('Draft'),
await expect(workflowVisualizer.workflowStatus).toHaveText('Draft');
workflowVisualizer.createStep('delete-record'),
]);
await workflowVisualizer.closeSidePanel();
await workflowVisualizer.background.click();
await workflowVisualizer.activateWorkflowButton.click();
await Promise.all([
expect(workflowVisualizer.workflowStatus).toHaveText('Active'),
await expect(workflowVisualizer.workflowStatus).toHaveText('Active');
workflowVisualizer.activateWorkflowButton.click(),
]);
await expect(workflowVisualizer.triggerNode).toContainText(
'Record is Created',
@@ -35,8 +41,6 @@ test('Use an old version as draft', async ({ workflowVisualizer, page }) => {
const workflowsLink = page.getByRole('link', { name: 'Workflows' });
await workflowsLink.click();
await workflowVisualizer.setWorkflowsOpenInMode('record-page');
const recordTableRowForWorkflow = page.getByRole('row', {
name: workflowVisualizer.workflowName,
});
@@ -44,7 +48,7 @@ test('Use an old version as draft', async ({ workflowVisualizer, page }) => {
const linkToWorkflow = recordTableRowForWorkflow.getByRole('link', {
name: workflowVisualizer.workflowName,
});
await expect(linkToWorkflow).toBeVisible();
expect(linkToWorkflow).toBeVisible();
const linkToFirstWorkflowVersion = recordTableRowForWorkflow.getByRole(
'link',
@@ -53,7 +57,7 @@ test('Use an old version as draft', async ({ workflowVisualizer, page }) => {
},
);
await linkToFirstWorkflowVersion.click({ force: true });
await linkToFirstWorkflowVersion.click();
await expect(workflowVisualizer.workflowStatus).toHaveText('Archived');
await expect(workflowVisualizer.useAsDraftButton).toBeVisible();
@@ -65,9 +69,11 @@ test('Use an old version as draft', async ({ workflowVisualizer, page }) => {
]);
await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(1);
await workflowVisualizer.useAsDraftButton.click();
await Promise.all([
page.waitForURL(`/object/workflow/${workflowVisualizer.workflowId}`),
await page.waitForURL(`/object/workflow/${workflowVisualizer.workflowId}`);
workflowVisualizer.useAsDraftButton.click(),
]);
await expect(workflowVisualizer.workflowStatus).toHaveText('Draft');
await expect(workflowVisualizer.useAsDraftButton).not.toBeVisible();
@@ -90,13 +96,17 @@ test('Use an old version as draft while having a pending draft version', async (
await workflowVisualizer.background.click();
await workflowVisualizer.activateWorkflowButton.click();
await Promise.all([
expect(workflowVisualizer.workflowStatus).toHaveText('Active'),
await expect(workflowVisualizer.workflowStatus).toHaveText('Active');
workflowVisualizer.activateWorkflowButton.click(),
]);
await workflowVisualizer.createStep('delete-record');
await Promise.all([
expect(workflowVisualizer.workflowStatus).toHaveText('Draft'),
await expect(workflowVisualizer.workflowStatus).toHaveText('Draft');
workflowVisualizer.createStep('delete-record'),
]);
await expect(workflowVisualizer.triggerNode).toContainText(
'Record is Created',
@@ -120,7 +130,7 @@ test('Use an old version as draft while having a pending draft version', async (
const linkToWorkflow = recordTableRowForWorkflow.getByRole('link', {
name: workflowVisualizer.workflowName,
});
await expect(linkToWorkflow).toBeVisible();
expect(linkToWorkflow).toBeVisible();
const linkToFirstWorkflowVersion = recordTableRowForWorkflow.getByRole(
'link',
@@ -129,7 +139,7 @@ test('Use an old version as draft while having a pending draft version', async (
},
);
await linkToFirstWorkflowVersion.click({ force: true });
await linkToFirstWorkflowVersion.click();
await expect(workflowVisualizer.workflowStatus).toHaveText('Active');
await expect(workflowVisualizer.useAsDraftButton).toBeVisible();
@@ -141,13 +151,17 @@ test('Use an old version as draft while having a pending draft version', async (
]);
await expect(workflowVisualizer.getAllStepNodes()).toHaveCount(1);
await workflowVisualizer.useAsDraftButton.click();
await Promise.all([
expect(workflowVisualizer.overrideDraftButton).toBeVisible(),
await expect(workflowVisualizer.overrideDraftButton).toBeVisible();
workflowVisualizer.useAsDraftButton.click(),
]);
await workflowVisualizer.overrideDraftButton.click();
await Promise.all([
page.waitForURL(`/object/workflow/${workflowVisualizer.workflowId}`),
await page.waitForURL(`/object/workflow/${workflowVisualizer.workflowId}`);
workflowVisualizer.overrideDraftButton.click(),
]);
await expect(workflowVisualizer.workflowStatus).toHaveText('Draft');
await expect(workflowVisualizer.useAsDraftButton).not.toBeVisible();
+12
View File
@@ -0,0 +1,12 @@
{
"presets": [
[
"@nx/react/babel",
{
"runtime": "automatic",
"useBuiltIns": "usage"
}
]
],
"plugins": []
}
+4 -3
View File
@@ -1,10 +1,11 @@
module.exports = {
extends: ['../../.eslintrc.global.cjs', '../../.eslintrc.react.cjs'],
extends: ['../../.eslintrc.cjs', '../../.eslintrc.react.cjs'],
ignorePatterns: ['!**/*'],
overrides: [
{
files: ['**/*.ts', '**/*.tsx'],
files: ['*.ts', '*.tsx'],
parserOptions: {
project: ['packages/twenty-emails/tsconfig.*.json'],
project: ['packages/twenty-emails/tsconfig.{json,*.json}'],
},
rules: {
'@nx/dependency-checks': 'error',
-1
View File
@@ -1,2 +1 @@
dist
.react-email/
-33
View File
@@ -1,33 +0,0 @@
# Twenty Emails
This package contains the email templates used by Twenty.
## Features
- Email templates built with [React Email](https://react.email/)
- Internationalization (i18n) support via [@lingui/react](https://lingui.dev/)
- Local preview server for testing email templates
## Getting Started
### Starting the Local Preview Server
To start the local preview server for email development:
```bash
npx nx start twenty-emails
```
This will run the development server on port 4001. You can then view your email templates at [http://localhost:4001](http://localhost:4001).
### Building Emails
To build the email templates:
```bash
npx nx build twenty-emails
```
## Email Structure
Each email template is located in the `src/emails` directory. The templates use various components from the `src/components` directory to maintain consistent styling and functionality.
+2 -2
View File
@@ -1,13 +1,13 @@
import { defineConfig } from '@lingui/conf';
import { formatter } from '@lingui/format-po';
import { APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations';
import { APP_LOCALES } from 'twenty-shared/translations';
export default defineConfig({
sourceLocale: 'en',
locales: Object.values(APP_LOCALES),
pseudoLocale: 'pseudo-en',
fallbackLocales: {
default: SOURCE_LOCALE,
'pseudo-en': 'en',
},
extractorParserOptions: {
tsExperimentalDecorators: true,
+2 -8
View File
@@ -1,5 +1,6 @@
{
"name": "twenty-emails",
"version": "0.44.13",
"description": "",
"author": "",
"private": true,
@@ -13,17 +14,10 @@
"@lingui/react": "^5.1.2",
"twenty-shared": "workspace:*"
},
"peerDependencies": {
"react": "^18.2.0 || ^19.0.0",
"react-dom": "^18.2.0 || ^19.0.0"
},
"devDependencies": {
"@lingui/cli": "^5.1.2",
"@lingui/swc-plugin": "^5.1.0",
"@lingui/vite-plugin": "^5.1.2",
"@types/react": "^19",
"@types/react-dom": "^19",
"react-email": "4.0.3"
"@lingui/vite-plugin": "^5.1.2"
},
"exports": {
".": {
-7
View File
@@ -11,13 +11,6 @@
},
"dependsOn": ["^build"]
},
"start": {
"executor": "nx:run-commands",
"options": {
"cwd": "{projectRoot}",
"command": "email dev -d src/emails -p 4001"
}
},
"typecheck": {},
"lint": {
"options": {
+2 -1
View File
@@ -54,7 +54,8 @@ export const emailTheme = {
},
background: {
colors: { highlight: grayScale.gray15 },
button: grayScale.gray60,
radialGradient: `radial-gradient(50% 62.62% at 50% 0%, #505050 0%, ${grayScale.gray60} 100%)`,
radialGradientHover: `radial-gradient(76.32% 95.59% at 50% 0%, #505050 0%, ${grayScale.gray60} 100%)`,
transparent: {
medium: 'rgba(0, 0, 0, 0.08)',
light: 'rgba(0, 0, 0, 0.04)',
@@ -1,11 +1,10 @@
import { i18n, Messages } from '@lingui/core';
import { I18nProvider } from '@lingui/react';
import { Container, Html } from '@react-email/components';
import { PropsWithChildren } from 'react';
import { BaseHead } from 'src/components/BaseHead';
import { Footer } from 'src/components/Footer';
import { Logo } from 'src/components/Logo';
import { APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations';
import { messages as afMessages } from '../locales/generated/af-ZA';
import { messages as arMessages } from '../locales/generated/ar-SA';
import { messages as caMessages } from '../locales/generated/ca-ES';
@@ -37,12 +36,12 @@ import { messages as ukMessages } from '../locales/generated/uk-UA';
import { messages as viMessages } from '../locales/generated/vi-VN';
import { messages as zhHansMessages } from '../locales/generated/zh-CN';
import { messages as zhHantMessages } from '../locales/generated/zh-TW';
import { APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared/translations';
type BaseEmailProps = {
children: JSX.Element | JSX.Element[] | string;
type BaseEmailProps = PropsWithChildren<{
width?: number;
locale: keyof typeof APP_LOCALES;
};
}>;
const messages: Record<keyof typeof APP_LOCALES, Messages> = {
en: enMessages,
@@ -96,7 +95,6 @@ export const BaseEmail = ({ children, width, locale }: BaseEmailProps) => {
<Container width={width || 290}>
<Logo />
{children}
<Footer />
</Container>
</Html>
</I18nProvider>
@@ -1,23 +1,23 @@
import { Button } from '@react-email/components';
import { ReactNode } from 'react';
import { Button } from '@react-email/button';
import { emailTheme } from 'src/common-style';
const callToActionStyle = {
display: 'inline-flex',
display: 'flex',
padding: '8px 32px',
borderRadius: emailTheme.border.radius.md,
border: `1px solid ${emailTheme.background.transparent.light}`,
background: emailTheme.background.button,
background: emailTheme.background.radialGradient,
boxShadow: `0px 2px 4px 0px ${emailTheme.background.transparent.light}, 0px 0px 4px 0px ${emailTheme.background.transparent.medium}`,
color: emailTheme.font.colors.inverted,
fontSize: emailTheme.font.size.md,
fontWeight: emailTheme.font.weight.bold,
width: 'auto',
};
type CallToActionProps = {
href: string;
value: JSX.Element | JSX.Element[] | string;
value: ReactNode;
};
export const CallToAction = ({ value, href }: CallToActionProps) => {
@@ -1,22 +1,17 @@
import { i18n } from '@lingui/core';
import { Column, Container, Row } from '@react-email/components';
import { Column, Row } from '@react-email/components';
import { Link } from 'src/components/Link';
import { ShadowText } from 'src/components/ShadowText';
const footerContainerStyle = {
marginTop: '12px',
};
export const Footer = () => {
return (
<Container style={footerContainerStyle}>
<>
<Row>
<Column>
<ShadowText>
<Link
href="https://twenty.com/"
value={i18n._('Website')}
aria-label={i18n._("Visit Twenty's website")}
value="Website"
aria-label="Visit Twenty's website"
/>
</ShadowText>
</Column>
@@ -24,8 +19,8 @@ export const Footer = () => {
<ShadowText>
<Link
href="https://github.com/twentyhq/twenty"
value={i18n._('Github')}
aria-label={i18n._("Visit Twenty's GitHub repository")}
value="Github"
aria-label="Visit Twenty's GitHub repository"
/>
</ShadowText>
</Column>
@@ -33,8 +28,8 @@ export const Footer = () => {
<ShadowText>
<Link
href="https://twenty.com/user-guide"
value={i18n._('User guide')}
aria-label={i18n._("Read Twenty's user guide")}
value="User guide"
aria-label="Read Twenty's user guide"
/>
</ShadowText>
</Column>
@@ -42,19 +37,19 @@ export const Footer = () => {
<ShadowText>
<Link
href="https://docs.twenty.com/"
value={i18n._('Developers')}
aria-label={i18n._("Visit Twenty's developer documentation")}
value="Developers"
aria-label="Visit Twenty's developer documentation"
/>
</ShadowText>
</Column>
</Row>
<ShadowText>
<>
{i18n._('Twenty.com, Public Benefit Corporation')}
<br />
{i18n._('San Francisco / Paris')}
</>
Twenty.com Public Benefit Corporation
<br />
2261 Market Street #5275
<br />
San Francisco, CA 94114
</ShadowText>
</Container>
</>
);
};
@@ -1,11 +1,9 @@
import { Column, Container, Row } from '@react-email/components';
import React from 'react';
import React, { PropsWithChildren } from 'react';
import { emailTheme } from 'src/common-style';
type HighlightedContainerProps = {
children: JSX.Element | JSX.Element[] | string;
};
type HighlightedContainerProps = PropsWithChildren;
const highlightedContainerStyle = {
background: emailTheme.background.colors.highlight,
@@ -1,5 +1,5 @@
import { Text } from '@react-email/components';
import { JSX } from 'react';
import { Text } from '@react-email/text';
import { ReactNode } from 'react';
import { emailTheme } from 'src/common-style';
@@ -13,7 +13,7 @@ const highlightedStyle = {
};
type HighlightedTextProps = {
value: JSX.Element | JSX.Element[] | string | undefined;
value: ReactNode;
centered?: boolean;
};
@@ -1,4 +1,5 @@
import { Link as EmailLink } from '@react-email/components';
import { ReactNode } from 'react';
import { emailTheme } from 'src/common-style';
@@ -7,7 +8,7 @@ const linkStyle = {
};
type LinkProps = {
value: JSX.Element | JSX.Element[] | string;
value: ReactNode;
href: string;
color?: string;
};
@@ -1,16 +1,14 @@
import { Text } from '@react-email/components';
import { PropsWithChildren as MainTextProps } from 'react';
import { Text } from '@react-email/text';
import { emailTheme } from 'src/common-style';
type MainTextProps = {
children: JSX.Element | JSX.Element[] | string;
};
const mainTextStyle = {
fontFamily: emailTheme.font.family,
fontSize: emailTheme.font.size.md,
fontWeight: emailTheme.font.weight.regular,
color: emailTheme.font.colors.primary,
margin: '0 0 12px 0',
lineHeight: emailTheme.font.lineHeight,
};
@@ -1,11 +1,8 @@
import { Text } from '@react-email/components';
import { PropsWithChildren as ShadowTextProps } from 'react';
import { Text } from '@react-email/text';
import { emailTheme } from 'src/common-style';
type ShadowTextProps = {
children: JSX.Element | JSX.Element[] | string;
};
const shadowTextStyle = {
fontSize: emailTheme.font.size.sm,
fontWeight: emailTheme.font.weight.regular,
@@ -1,9 +1,10 @@
import { ReactNode } from 'react';
import { Heading } from '@react-email/components';
import { emailTheme } from 'src/common-style';
type SubTitleProps = {
value: JSX.Element | JSX.Element[] | string;
value: ReactNode;
};
const subTitleStyle = {
@@ -1,9 +1,10 @@
import { ReactNode } from 'react';
import { Heading } from '@react-email/components';
import { emailTheme } from 'src/common-style';
type TitleProps = {
value: JSX.Element | JSX.Element[] | string;
value: ReactNode;
};
const titleStyle = {
@@ -1,16 +1,16 @@
import { i18n } from '@lingui/core';
import { Footer } from 'src/components/Footer';
import { MainText } from 'src/components/MainText';
import { SubTitle } from 'src/components/SubTitle';
export const WhatIsTwenty = () => {
return (
<>
<SubTitle value={i18n._('What is Twenty?')} />
<SubTitle value="What is Twenty?" />
<MainText>
{i18n._(
"It's a CRM, a software to help businesses manage their customer data and relationships efficiently.",
)}
It's a CRM, a software to help businesses manage their customer data and
relationships efficiently.
</MainText>
<Footer />
</>
);
};
@@ -1,5 +1,4 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { BaseEmail } from 'src/components/BaseEmail';
import { CallToAction } from 'src/components/CallToAction';
import { MainText } from 'src/components/MainText';
@@ -21,43 +20,32 @@ export const CleanSuspendedWorkspaceEmail = ({
}: CleanSuspendedWorkspaceEmailProps) => {
return (
<BaseEmail width={333} locale={locale}>
<Title value={i18n._('Deleted Workspace')} />
<Title value={<Trans>Deleted Workspace</Trans>} />
<MainText>
{userName?.length > 1 ? (
<Trans id="Dear {userName}," values={{ userName }} />
<Trans>Dear {userName},</Trans>
) : (
<Trans id="Hello," />
<Trans>Hello,</Trans>
)}
<br />
<br />
<Trans
id="Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
values={{ workspaceDisplayName, daysSinceInactive }}
components={{ 0: <b /> }}
/>
<Trans>
Your workspace <b>{workspaceDisplayName}</b> has been deleted as your
subscription expired {daysSinceInactive} days ago.
</Trans>
<br />
<br />
<Trans id="All data in this workspace has been permanently deleted." />
<Trans>All data in this workspace has been permanently deleted.</Trans>
<br />
<br />
<Trans id="If you wish to use Twenty again, you can create a new workspace." />
<Trans>
If you wish to use Twenty again, you can create a new workspace.
</Trans>
</MainText>
<br />
<CallToAction
href="https://app.twenty.com/"
value={i18n._('Create a new workspace')}
value={<Trans>Create a new workspace</Trans>}
/>
<br />
<br />
</BaseEmail>
);
};
CleanSuspendedWorkspaceEmail.PreviewProps = {
daysSinceInactive: 1,
userName: 'John Doe',
workspaceDisplayName: 'My Workspace',
locale: 'en',
} as CleanSuspendedWorkspaceEmailProps;
export default CleanSuspendedWorkspaceEmail;
@@ -1,5 +1,4 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { BaseEmail } from 'src/components/BaseEmail';
import { CallToAction } from 'src/components/CallToAction';
import { Link } from 'src/components/Link';
@@ -20,27 +19,16 @@ export const PasswordResetLinkEmail = ({
}: PasswordResetLinkEmailProps) => {
return (
<BaseEmail locale={locale}>
<Title value={i18n._('Reset your password 🗝')} />
<Title value={<Trans>Reset your password 🗝</Trans>} />
<CallToAction href={link} value={<Trans>Reset</Trans>} />
<MainText>
<Trans
id="This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
values={{ duration }}
/>
<Trans>
This link is only valid for the next {duration}. If the link does not
work, you can use the login verification link directly:
</Trans>
<br />
<Link href={link} value={link} />
</MainText>
<br />
<CallToAction href={link} value={i18n._('Reset')} />
<br />
<br />
</BaseEmail>
);
};
PasswordResetLinkEmail.PreviewProps = {
duration: '24 hours',
link: 'https://app.twenty.com/reset-password/123',
locale: 'en',
} as PasswordResetLinkEmailProps;
export default PasswordResetLinkEmail;
@@ -1,5 +1,7 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { t } from '@lingui/core/macro';
import { Trans } from '@lingui/react/macro';
import { BaseEmail } from 'src/components/BaseEmail';
import { CallToAction } from 'src/components/CallToAction';
import { MainText } from 'src/components/MainText';
@@ -19,41 +21,29 @@ export const PasswordUpdateNotifyEmail = ({
link,
locale,
}: PasswordUpdateNotifyEmailProps) => {
const helloString = userName?.length > 1 ? t`Dear ${userName}` : t`Hello`;
const formattedDate = i18n.date(new Date());
return (
<BaseEmail locale={locale}>
<Title value={i18n._('Password updated')} />
<Title value={<Trans>Password updated</Trans>} />
<MainText>
{userName?.length > 1 ? (
<Trans id="Dear {userName}," values={{ userName }} />
) : (
<Trans id="Hello," />
)}
{helloString},
<br />
<br />
<Trans
id="This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
values={{ email, formattedDate }}
/>
<Trans>
This is a confirmation that password for your account ({email}) was
successfully changed on {formattedDate}.
</Trans>
<br />
<br />
<Trans id="If you did not initiate this change, please contact your workspace owner immediately." />
<Trans>
If you did not initiate this change, please contact your workspace
owner immediately.
</Trans>
<br />
</MainText>
<br />
<CallToAction value={i18n._('Connect to Twenty')} href={link} />
<br />
<br />
<CallToAction value={<Trans>Connect to Twenty</Trans>} href={link} />
</BaseEmail>
);
};
PasswordUpdateNotifyEmail.PreviewProps = {
userName: 'John Doe',
email: 'john.doe@example.com',
link: 'https://app.twenty.com',
locale: 'en',
} as PasswordUpdateNotifyEmailProps;
export default PasswordUpdateNotifyEmail;
@@ -1,7 +1,8 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { BaseEmail } from 'src/components/BaseEmail';
import { CallToAction } from 'src/components/CallToAction';
import { Footer } from 'src/components/Footer';
import { MainText } from 'src/components/MainText';
import { Title } from 'src/components/Title';
import { APP_LOCALES } from 'twenty-shared/translations';
@@ -17,21 +18,18 @@ export const SendEmailVerificationLinkEmail = ({
}: SendEmailVerificationLinkEmailProps) => {
return (
<BaseEmail width={333} locale={locale}>
<Title value={i18n._('Confirm your email address')} />
<Title value={<Trans>Confirm your email address</Trans>} />
<CallToAction href={link} value={<Trans>Verify Email</Trans>} />
<br />
<br />
<MainText>
<Trans id="Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address." />
<Trans>
Thanks for registering for an account on Twenty! Before we get
started, we just need to confirm that this is you. Click above to
verify your email address.
</Trans>
</MainText>
<br />
<CallToAction href={link} value={i18n._('Verify Email')} />
<br />
<br />
<Footer />
</BaseEmail>
);
};
SendEmailVerificationLinkEmail.PreviewProps = {
link: 'https://app.twenty.com/verify-email/123',
locale: 'en',
};
export default SendEmailVerificationLinkEmail;
@@ -1,5 +1,4 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { Img } from '@react-email/components';
import { emailTheme } from 'src/common-style';
@@ -38,58 +37,26 @@ export const SendInviteLinkEmail = ({
? getImageAbsoluteURI({ imageUrl: workspace.logo, baseUrl: serverUrl })
: null;
const senderName = capitalize(sender.firstName);
const senderEmail = sender.email;
const workspaceName = workspace.name;
return (
<BaseEmail width={333} locale={locale}>
<Title value={i18n._('Join your team on Twenty')} />
<Title value={<Trans>Join your team on Twenty</Trans>} />
<MainText>
<Trans
id="{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
values={{ senderName, senderEmail, workspaceName }}
components={{
0: (
<Link
href={`mailto:${senderEmail}`}
value={senderEmail}
color={emailTheme.font.colors.blue}
/>
),
1: <b />,
}}
{capitalize(sender.firstName)} (
<Link
href={`mailto:${sender.email}`}
value={sender.email}
color={emailTheme.font.colors.blue}
/>
) <Trans>has invited you to join a workspace called </Trans>
<b>{workspace.name}</b>
<br />
</MainText>
<HighlightedContainer>
{workspaceLogo ? (
<Img
src={workspaceLogo}
width={40}
height={40}
alt="Workspace logo"
/>
) : (
<></>
)}
{workspace.name ? <HighlightedText value={workspace.name} /> : <></>}
<CallToAction href={link} value={i18n._('Accept invite')} />
{workspaceLogo && <Img src={workspaceLogo} width={40} height={40} />}
{workspace.name && <HighlightedText value={workspace.name} />}
<CallToAction href={link} value={<Trans>Accept invite</Trans>} />
</HighlightedContainer>
<WhatIsTwenty />
</BaseEmail>
);
};
SendInviteLinkEmail.PreviewProps = {
link: 'https://app.twenty.com/invite/123',
workspace: {
name: 'Acme Inc.',
logo: 'https://fakeimg.pl/200x200/?text=ACME&font=lobster',
},
sender: { email: 'john.doe@example.com', firstName: 'John', lastName: 'Doe' },
serverUrl: 'https://app.twenty.com',
locale: 'en',
} as SendInviteLinkEmailProps;
export default SendInviteLinkEmail;
@@ -1,26 +0,0 @@
import { i18n } from '@lingui/core';
import { BaseEmail } from 'src/components/BaseEmail';
import { Title } from 'src/components/Title';
import { APP_LOCALES } from 'twenty-shared/translations';
type TestEmailProps = {
locale: keyof typeof APP_LOCALES;
};
// This is a test email which isn't used in production
// It's useful to do tests and play in a local environment
export const TestEmail = ({ locale }: TestEmailProps) => {
return (
<BaseEmail locale={locale}>
<Title value={i18n._('Test email')} />
<br />
<br />
</BaseEmail>
);
};
TestEmail.PreviewProps = {
locale: 'en',
} as TestEmailProps;
export default TestEmail;
@@ -1,5 +1,5 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { t } from '@lingui/core/macro';
import { Trans } from '@lingui/react/macro';
import { Img } from '@react-email/components';
import { emailTheme } from 'src/common-style';
@@ -10,6 +10,7 @@ import { HighlightedText } from 'src/components/HighlightedText';
import { Link } from 'src/components/Link';
import { MainText } from 'src/components/MainText';
import { Title } from 'src/components/Title';
import { WhatIsTwenty } from 'src/components/WhatIsTwenty';
import { capitalize } from 'src/utils/capitalize';
import { APP_LOCALES } from 'twenty-shared/translations';
import { getImageAbsoluteURI } from 'twenty-shared/utils';
@@ -39,62 +40,30 @@ export const SendApprovedAccessDomainValidation = ({
? getImageAbsoluteURI({ imageUrl: workspace.logo, baseUrl: serverUrl })
: null;
const senderName = capitalize(sender.firstName);
const senderEmail = sender.email;
return (
<BaseEmail width={333} locale={locale}>
<Title value={i18n._('Validate domain')} />
<Title value={t`Validate domain`} />
<MainText>
<Trans
id="{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
values={{ senderName, senderEmail, domain }}
components={{
0: (
<Link
href={`mailto:${senderEmail}`}
value={senderEmail}
color={emailTheme.font.colors.blue}
/>
),
1: <b />,
}}
{capitalize(sender.firstName)} (
<Link
href={`mailto:${sender.email}`}
value={sender.email}
color={emailTheme.font.colors.blue}
/>
) <Trans>Please validate this domain to allow users with</Trans>{' '}
<b>@{domain}</b>{' '}
<Trans>
email addresses to join your workspace without requiring an
invitation.
</Trans>
<br />
</MainText>
<HighlightedContainer>
{workspaceLogo ? (
<Img
src={workspaceLogo}
width={40}
height={40}
alt="Workspace logo"
/>
) : (
<></>
)}
{workspace.name ? <HighlightedText value={workspace.name} /> : <></>}
<CallToAction href={link} value={i18n._('Validate domain')} />
{workspaceLogo && <Img src={workspaceLogo} width={40} height={40} />}
{workspace.name && <HighlightedText value={workspace.name} />}
<CallToAction href={link} value={t`Validate domain`} />
</HighlightedContainer>
<br />
<WhatIsTwenty />
</BaseEmail>
);
};
SendApprovedAccessDomainValidation.PreviewProps = {
link: 'https://app.twenty.com/validate-domain',
domain: 'example.com',
workspace: {
name: 'Acme Inc.',
logo: 'https://fakeimg.pl/200x200/?text=ACME&font=lobster',
},
sender: {
email: 'john.doe@example.com',
firstName: 'John',
lastName: 'Doe',
},
serverUrl: 'https://app.twenty.com',
locale: 'en',
} as SendApprovedAccessDomainValidationProps;
export default SendApprovedAccessDomainValidation;
@@ -1,5 +1,4 @@
import { i18n } from '@lingui/core';
import { Trans } from '@lingui/react';
import { Trans } from '@lingui/react/macro';
import { BaseEmail } from 'src/components/BaseEmail';
import { CallToAction } from 'src/components/CallToAction';
import { MainText } from 'src/components/MainText';
@@ -23,54 +22,38 @@ export const WarnSuspendedWorkspaceEmail = ({
}: WarnSuspendedWorkspaceEmailProps) => {
const daysLeft = inactiveDaysBeforeDelete - daysSinceInactive;
const dayOrDays = daysLeft > 1 ? 'days' : 'day';
const remainingDays = daysLeft > 0 ? daysLeft : 0;
const remainingDays = daysLeft > 0 ? `${daysLeft} ` : '';
const helloString = userName?.length > 1 ? `Hello ${userName}` : 'Hello';
return (
<BaseEmail width={333} locale={locale}>
<Title value={i18n._('Suspended Workspace')} />
<Title value={<Trans>Suspended Workspace </Trans>} />
<MainText>
{userName?.length > 1 ? (
<Trans id="Dear {userName}," values={{ userName }} />
) : (
<Trans id="Hello," />
)}
{helloString},
<br />
<br />
<Trans
id="It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
values={{ workspaceDisplayName, daysSinceInactive }}
components={{ 0: <b /> }}
/>
<Trans>
It appears that your workspace <b>{workspaceDisplayName}</b> has been
suspended for {daysSinceInactive} days.
</Trans>
<br />
<br />
<Trans
id="The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
values={{ remainingDays, dayOrDays }}
/>
<Trans>
The workspace will be deactivated in {remainingDays} {dayOrDays}, and
all its data will be deleted.
</Trans>
<br />
<br />
<Trans
id="If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
values={{ remainingDays, dayOrDays }}
/>
<Trans>
If you wish to continue using Twenty, please update your subscription
within the next {remainingDays} {dayOrDays}.
</Trans>
</MainText>
<br />
<CallToAction
href="https://app.twenty.com/settings/billing"
value={i18n._('Update your subscription')}
value={<Trans>Update your subscription</Trans>}
/>
<br />
<br />
</BaseEmail>
);
};
WarnSuspendedWorkspaceEmail.PreviewProps = {
daysSinceInactive: 10,
inactiveDaysBeforeDelete: 14,
userName: 'John Doe',
workspaceDisplayName: 'Acme Inc.',
locale: 'en',
};
export default WarnSuspendedWorkspaceEmail;
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Aanvaar uitnodiging"
msgid "Accept invite"
msgstr "Aanvaar uitnodiging"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Alle data in hierdie werkruimte is permanent verwyder."
msgid "All data in this workspace has been permanently deleted."
msgstr "Alle data in hierdie werkruimte is permanent verwyder."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Bevestig jou e-posadres"
msgid "Confirm your email address"
msgstr "Bevestig jou e-posadres"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Konnekteer met Twenty"
msgid "Connect to Twenty"
msgstr "Konnekteer met Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Skep 'n nuwe werksruimte"
msgid "Create a new workspace"
msgstr "Skep 'n nuwe werksruimte"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Liewe {userName}"
msgid "Dear {userName}"
msgstr "Liewe {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Liewe {userName},"
msgid "Dear {userName},"
msgstr "Liewe {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Verwyderde Werkruimte"
msgid "Deleted Workspace"
msgstr "Verwyderde Werkruimte"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "e-posadresse om by jou werkruimte aan te sluit sonder om 'n uitnodiging te vereis."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "e-posadresse om by jou werkruimte aan te sluit sonder om 'n uitnodiging te vereis."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "het jou genooi om aan te sluit by 'n werkruimte genaamd "
msgid "has invited you to join a workspace called "
msgstr "het jou genooi om aan te sluit by 'n werkruimte genaamd "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hallo"
msgid "Hello"
msgstr "Hallo"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hallo,"
msgid "Hello,"
msgstr "Hallo,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "As jy nie hierdie verandering geïnisieer het nie, kontak asseblief jou werkruimte-eienaar dadelik."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "As jy nie hierdie verandering geïnisieer het nie, kontak asseblief jou werkruimte-eienaar dadelik."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "As jy wil voortgaan om Twenty te gebruik, moet asseblief jou intekening binne die volgende {remainingDays} {dayOrDays} opdateer."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "As jy wil voortgaan om Twenty te gebruik, moet asseblief jou intekening binne die volgende {remainingDays} {dayOrDays} opdateer."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "As jy Twenty weer wil gebruik, kan jy 'n nuwe werkruimte skep."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "As jy Twenty weer wil gebruik, kan jy 'n nuwe werkruimte skep."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Dit blyk dat jou werkruimte <0>{workspaceDisplayName}</0> vir {daysSinceInactive} dae opgeskort is."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Dit blyk dat jou werkruimte <0>{workspaceDisplayName}</0> vir {daysSinceInactive} dae opgeskort is."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Sluit aan by jou span op Twenty"
msgid "Join your team on Twenty"
msgstr "Sluit aan by jou span op Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Wagwoord opgedateer"
msgid "Password updated"
msgstr "Wagwoord opgedateer"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Valideer asseblief hierdie domein om gebruikers met"
msgid "Please validate this domain to allow users with"
msgstr "Valideer asseblief hierdie domein om gebruikers met"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Stel terug"
msgid "Reset"
msgstr "Stel terug"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Stel jou wagwoord terug 🗝"
msgid "Reset your password 🗝"
msgstr "Stel jou wagwoord terug 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Geskorsde Werkruimte "
msgid "Suspended Workspace "
msgstr "Geskorsde Werkruimte "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Dankie dat jy registreer het vir 'n rekening op Twenty! Voordat ons begin, moet ons net bevestig dat dit jy is. Klik bo om jou e-posadres te verifieer."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Dankie dat jy registreer het vir 'n rekening op Twenty! Voordat ons begin, moet ons net bevestig dat dit jy is. Klik bo om jou e-posadres te verifieer."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "Die werkruimte sal gedeaktiveer word in {remainingDays} {dayOrDays}, en al sy data sal verwyder word."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "Die werkruimte sal gedeaktiveer word in {remainingDays} {dayOrDays}, en al sy data sal verwyder word."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Dit is 'n bevestiging dat die wagwoord vir jou rekening ({email}) suksesvol verander is op {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Dit is 'n bevestiging dat die wagwoord vir jou rekening ({email}) suksesvol verander is op {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Hierdie skakel is slegs geldig vir die volgende {duration}. Indien die skakel nie werk nie, kan jy die aanmeldverifiëringskakel direk gebruik:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Hierdie skakel is slegs geldig vir die volgende {duration}. Indien die skakel nie werk nie, kan jy die aanmeldverifiëringskakel direk gebruik:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Opdateer jou intekening"
msgid "Update your subscription"
msgstr "Opdateer jou intekening"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Valideer domein"
msgid "Validate domain"
msgstr "Valideer domein"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Verifieer E-pos"
msgid "Verify Email"
msgstr "Verifieer E-pos"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Jou werkruimte <0>{workspaceDisplayName}</0> is verwyder aangesien jou intekening {daysSinceInactive} dae gelede verval het."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Jou werkruimte <0>{workspaceDisplayName}</0> is verwyder aangesien jou intekening {daysSinceInactive} dae gelede verval het."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "قبول الدعوة"
msgid "Accept invite"
msgstr "قبول الدعوة"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "تم حذف جميع البيانات في هذه الواجهة بشكل دائم."
msgid "All data in this workspace has been permanently deleted."
msgstr "تم حذف جميع البيانات في هذه الواجهة بشكل دائم."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "تأكد من عنوان بريدك الإلكتروني"
msgid "Confirm your email address"
msgstr "تأكد من عنوان بريدك الإلكتروني"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "الاتصال بـ Twenty"
msgid "Connect to Twenty"
msgstr "الاتصال بـ Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "إنشاء مساحة عمل جديدة"
msgid "Create a new workspace"
msgstr "إنشاء مساحة عمل جديدة"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "عزيزي {userName}"
msgid "Dear {userName}"
msgstr "عزيزي {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "عزيزي {userName},"
msgid "Dear {userName},"
msgstr "عزيزي {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "مساحة العمل المحذوفة"
msgid "Deleted Workspace"
msgstr "مساحة العمل المحذوفة"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "عناوين البريد الإلكتروني للانضمام إلى مساحة العمل الخاصة بك دون الحاجة إلى دعوة."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "عناوين البريد الإلكتروني للانضمام إلى مساحة العمل الخاصة بك دون الحاجة إلى دعوة."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "لقد دُعيت للإنضمام إلى مساحة عمل تسمى "
msgid "has invited you to join a workspace called "
msgstr "لقد دُعيت للإنضمام إلى مساحة عمل تسمى "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "مرحبًا"
msgid "Hello"
msgstr "مرحبًا"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "مرحبًا,"
msgid "Hello,"
msgstr "مرحبًا,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "إذا لم تكن قد بدأت هذا التغيير، يرجى الاتصال بمالك مساحة العمل الخاصة بك على الفور."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "إذا لم تكن قد بدأت هذا التغيير، يرجى الاتصال بمالك مساحة العمل الخاصة بك على الفور."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "إذا كنت ترغب في الاستمرار في استخدام Twenty، يُرجى تحديث اشتراكك خلال الأيام {remainingDays} {dayOrDays} القادمة."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "إذا كنت ترغب في الاستمرار في استخدام Twenty، يُرجى تحديث اشتراكك خلال الأيام {remainingDays} {dayOrDays} القادمة."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "إذا كنت ترغب في استخدام Twenty مرة أخرى، يمكنك إنشاء مساحة عمل جديدة."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "إذا كنت ترغب في استخدام Twenty مرة أخرى، يمكنك إنشاء مساحة عمل جديدة."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "يبدو أن مساحة عملك <0>{workspaceDisplayName}</0> قد تم تعليقها لمدة {daysSinceInactive} أيام."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "يبدو أن مساحة عملك <0>{workspaceDisplayName}</0> قد تم تعليقها لمدة {daysSinceInactive} أيام."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "انضم إلى فريقك في Twenty"
msgid "Join your team on Twenty"
msgstr "انضم إلى فريقك في Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "تم تحديث كلمة المرور"
msgid "Password updated"
msgstr "تم تحديث كلمة المرور"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "يرجى التحقق من صحة هذا النطاق للسماح للمستخدمين ب"
msgid "Please validate this domain to allow users with"
msgstr "يرجى التحقق من صحة هذا النطاق للسماح للمستخدمين ب"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "إعادة تعيين"
msgid "Reset"
msgstr "إعادة تعيين"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "إعادة تعيين كلمة مرورك 🗝"
msgid "Reset your password 🗝"
msgstr "إعادة تعيين كلمة مرورك 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "فاعِل مساحة العمل المعلّقة "
msgid "Suspended Workspace "
msgstr "فاعِل مساحة العمل المعلّقة "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "شكراً لتسجيلك لحساب على Twenty! قبل أن نبدأ، نحتاج فقط إلى التأكد من أن هذا أنت. انقر أعلاه للتحقق من عنوان بريدك الإلكتروني."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "شكراً لتسجيلك لحساب على Twenty! قبل أن نبدأ، نحتاج فقط إلى التأكد من أن هذا أنت. انقر أعلاه للتحقق من عنوان بريدك الإلكتروني."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "سيتم تعطيل مساحة العمل في غضون {remainingDays} {dayOrDays}، وسيتم حذف كل بياناتها."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "سيتم تعطيل مساحة العمل في غضون {remainingDays} {dayOrDays}، وسيتم حذف كل بياناتها."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "هذا تأكيد أن كلمة مرور حسابك ({email}) قد تم تغييرها بنجاح في {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "هذا تأكيد أن كلمة مرور حسابك ({email}) قد تم تغييرها بنجاح في {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "هذا الرابط صالح فقط للمدة {duration} القادمة. إذا لم يعمل الرابط، يمكنك استخدام رابط التحقق من تسجيل الدخول مباشرة:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "هذا الرابط صالح فقط للمدة {duration} القادمة. إذا لم يعمل الرابط، يمكنك استخدام رابط التحقق من تسجيل الدخول مباشرة:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "تحديث الاشتراك"
msgid "Update your subscription"
msgstr "تحديث الاشتراك"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "تحقق من النطاق"
msgid "Validate domain"
msgstr "تحقق من النطاق"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "تحقق من البريد الإلكتروني"
msgid "Verify Email"
msgstr "تحقق من البريد الإلكتروني"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "تم حذف مساحة العمل <0>{workspaceDisplayName}</0> كون اشتراكك قد انتهى منذ {daysSinceInactive} أيام."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "تم حذف مساحة العمل <0>{workspaceDisplayName}</0> كون اشتراكك قد انتهى منذ {daysSinceInactive} أيام."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Accepta la invitació"
msgid "Accept invite"
msgstr "Accepta la invitació"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Totes les dades en aquest espai de treball s'han esborrat permanentment."
msgid "All data in this workspace has been permanently deleted."
msgstr "Totes les dades en aquest espai de treball s'han esborrat permanentment."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Confirma la teva adreça de correu electrònic"
msgid "Confirm your email address"
msgstr "Confirma la teva adreça de correu electrònic"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Connecta't a Twenty"
msgid "Connect to Twenty"
msgstr "Connecta't a Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Crea un nou espai de treball"
msgid "Create a new workspace"
msgstr "Crea un nou espai de treball"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Benvolgut {userName}"
msgid "Dear {userName}"
msgstr "Benvolgut {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Benvolgut {userName},"
msgid "Dear {userName},"
msgstr "Benvolgut {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Espai de treball esborrat"
msgid "Deleted Workspace"
msgstr "Espai de treball esborrat"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "adreces de correu electrònic per unir-se al teu espai de treball sense requerir una invitació."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "adreces de correu electrònic per unir-se al teu espai de treball sense requerir una invitació."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "t'ha convidat a unir-te a un espai de treball anomenat "
msgid "has invited you to join a workspace called "
msgstr "t'ha convidat a unir-te a un espai de treball anomenat "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hola"
msgid "Hello"
msgstr "Hola"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hola,"
msgid "Hello,"
msgstr "Hola,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Si no has iniciat aquest canvi, si us plau contacta amb el propietari de l'espai de treball immediatament."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Si no has iniciat aquest canvi, si us plau contacta amb el propietari de l'espai de treball immediatament."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Si vols continuar utilitzant Twenty, si us plau actualitza la teva subscripció en els propers {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Si vols continuar utilitzant Twenty, si us plau actualitza la teva subscripció en els propers {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Si vols utilitzar Twenty de nou, pots crear un nou espai de treball."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Si vols utilitzar Twenty de nou, pots crear un nou espai de treball."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Sembla que el teu espai de treball <0>{workspaceDisplayName}</0> ha estat suspès per {daysSinceInactive} dies."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Sembla que el teu espai de treball <0>{workspaceDisplayName}</0> ha estat suspès per {daysSinceInactive} dies."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Uneix-te al teu equip a Twenty"
msgid "Join your team on Twenty"
msgstr "Uneix-te al teu equip a Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Contrasenya actualitzada"
msgid "Password updated"
msgstr "Contrasenya actualitzada"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Si us plau, valida aquest domini per permetre als usuaris amb"
msgid "Please validate this domain to allow users with"
msgstr "Si us plau, valida aquest domini per permetre als usuaris amb"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Restableix"
msgid "Reset"
msgstr "Restableix"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Restableix la teva contrasenya 🗝"
msgid "Reset your password 🗝"
msgstr "Restableix la teva contrasenya 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Espai de treball suspès "
msgid "Suspended Workspace "
msgstr "Espai de treball suspès "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Gràcies per registrar-te a Twenty! Abans de començar, només necessitem confirmar que ets tu. Clica a sobre per verificar la teva adreça de correu electrònic."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Gràcies per registrar-te a Twenty! Abans de començar, només necessitem confirmar que ets tu. Clica a sobre per verificar la teva adreça de correu electrònic."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "L'espai de treball es desactivarà en {remainingDays} {dayOrDays}, i totes les seves dades seran eliminades."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "L'espai de treball es desactivarà en {remainingDays} {dayOrDays}, i totes les seves dades seran eliminades."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Això és una confirmació que la contrasenya del teu compte ({email}) s'ha canviat amb èxit el {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Això és una confirmació que la contrasenya del teu compte ({email}) s'ha canviat amb èxit el {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Aquest enllaç només és vàlid durant els propers {duration}. Si l'enllaç no funciona, pots fer servir directament l'enllaç de verificació d'inici de sessió:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Aquest enllaç només és vàlid durant els propers {duration}. Si l'enllaç no funciona, pots fer servir directament l'enllaç de verificació d'inici de sessió:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Actualitza la teva subscripció"
msgid "Update your subscription"
msgstr "Actualitza la teva subscripció"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Valida el domini"
msgid "Validate domain"
msgstr "Valida el domini"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Verifica el correu electrònic"
msgid "Verify Email"
msgstr "Verifica el correu electrònic"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "El teu espai de treball <0>{workspaceDisplayName}</0> s'ha eliminat ja que la teva subscripció va caducar fa {daysSinceInactive} dies."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "El teu espai de treball <0>{workspaceDisplayName}</0> s'ha eliminat ja que la teva subscripció va caducar fa {daysSinceInactive} dies."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Přijměte pozvánku"
msgid "Accept invite"
msgstr "Přijměte pozvánku"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Všechna data v tomto pracovním prostoru byla trvale odstraněna."
msgid "All data in this workspace has been permanently deleted."
msgstr "Všechna data v tomto pracovním prostoru byla trvale odstraněna."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Potvrďte svou e-mailovou adresu"
msgid "Confirm your email address"
msgstr "Potvrďte svou e-mailovou adresu"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Připojte se k Twenty"
msgid "Connect to Twenty"
msgstr "Připojte se k Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Vytvořit nový pracovní prostor"
msgid "Create a new workspace"
msgstr "Vytvořit nový pracovní prostor"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Vážený {userName}"
msgid "Dear {userName}"
msgstr "Vážený {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Vážený {userName},"
msgid "Dear {userName},"
msgstr "Vážený {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Smazaný pracovní prostor"
msgid "Deleted Workspace"
msgstr "Smazaný pracovní prostor"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "e-mailové adresy ke vstupu do vašeho pracovního prostoru bez nutnosti pozvánky."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "e-mailové adresy ke vstupu do vašeho pracovního prostoru bez nutnosti pozvánky."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "vás pozval do pracovního prostoru s názvem "
msgid "has invited you to join a workspace called "
msgstr "vás pozval do pracovního prostoru s názvem "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Dobrý den"
msgid "Hello"
msgstr "Dobrý den"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Dobrý den,"
msgid "Hello,"
msgstr "Dobrý den,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Pokud jste tuto změnu neiniciovali, prosím, okamžitě kontaktujte majitele vašeho pracovního prostoru."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Pokud jste tuto změnu neiniciovali, prosím, okamžitě kontaktujte majitele vašeho pracovního prostoru."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Pokud si přejete dále používat Twenty, prosím, aktualizujte své předplatné během příštích {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Pokud si přejete dále používat Twenty, prosím, aktualizujte své předplatné během příštích {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Pokud si přejete znovu použít Twenty, můžete vytvořit nový pracovní prostor."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Pokud si přejete znovu použít Twenty, můžete vytvořit nový pracovní prostor."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Zdá se, že váš pracovní prostor <0>{workspaceDisplayName}</0> byl pozastaven na dobu {daysSinceInactive} dní."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Zdá se, že váš pracovní prostor <0>{workspaceDisplayName}</0> byl pozastaven na dobu {daysSinceInactive} dní."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Připojte se k svému týmu na Twenty"
msgid "Join your team on Twenty"
msgstr "Připojte se k svému týmu na Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Heslo bylo aktualizováno"
msgid "Password updated"
msgstr "Heslo bylo aktualizováno"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Prosím, ověřte tuto doménu pro umožnění přístupu uživatelům s"
msgid "Please validate this domain to allow users with"
msgstr "Prosím, ověřte tuto doménu pro umožnění přístupu uživatelům s"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Obnovit"
msgid "Reset"
msgstr "Obnovit"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Obnovte své heslo 🗝"
msgid "Reset your password 🗝"
msgstr "Obnovte své heslo 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Pozastavený pracovní prostor "
msgid "Suspended Workspace "
msgstr "Pozastavený pracovní prostor "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Děkujeme za registraci účtu na Twenty! Než začneme, musíme potvrdit, že jste to vy. Klikněte výše k ověření vaší e-mailové adresy."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Děkujeme za registraci účtu na Twenty! Než začneme, musíme potvrdit, že jste to vy. Klikněte výše k ověření vaší e-mailové adresy."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "Pracovní prostor bude deaktivován za {remainingDays} {dayOrDays} a všechna jeho data budou smazána."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "Pracovní prostor bude deaktivován za {remainingDays} {dayOrDays} a všechna jeho data budou smazána."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Toto je potvrzení, že heslo k vašemu účtu ({email}) bylo úspěšně změněno {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Toto je potvrzení, že heslo k vašemu účtu ({email}) bylo úspěšně změněno {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Tento odkaz je platný pouze následující {duration}. Pokud odkaz nefunguje, můžete přímo použít odkaz pro ověření přihlášení:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Tento odkaz je platný pouze následující {duration}. Pokud odkaz nefunguje, můžete přímo použít odkaz pro ověření přihlášení:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Aktualizujte své předplatné"
msgid "Update your subscription"
msgstr "Aktualizujte své předplatné"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Ověřit doménu"
msgid "Validate domain"
msgstr "Ověřit doménu"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Ověřit e-mail"
msgid "Verify Email"
msgstr "Ověřit e-mail"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Váš pracovní prostor <0>{workspaceDisplayName}</0> byl odstraněn, protože vaše předplatné vypršelo před {daysSinceInactive} dny."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Váš pracovní prostor <0>{workspaceDisplayName}</0> byl odstraněn, protože vaše předplatné vypršelo před {daysSinceInactive} dny."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Accepter invitation"
msgid "Accept invite"
msgstr "Accepter invitation"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Alle data i dette arbejdsområde er blevet permanent slettet."
msgid "All data in this workspace has been permanently deleted."
msgstr "Alle data i dette arbejdsområde er blevet permanent slettet."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Bekræft din e-mailadresse"
msgid "Confirm your email address"
msgstr "Bekræft din e-mailadresse"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Forbind til Twenty"
msgid "Connect to Twenty"
msgstr "Forbind til Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Opret et nyt arbejdsområde"
msgid "Create a new workspace"
msgstr "Opret et nyt arbejdsområde"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Kære {userName}"
msgid "Dear {userName}"
msgstr "Kære {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Kære {userName},"
msgid "Dear {userName},"
msgstr "Kære {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Slettet arbejdsområde"
msgid "Deleted Workspace"
msgstr "Slettet arbejdsområde"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "emailadresser for at tilslutte din arbejdsområde uden at kræve en invitation."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "emailadresser for at tilslutte din arbejdsområde uden at kræve en invitation."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "har inviteret dig til at deltage i et arbejdsområde kaldet "
msgid "has invited you to join a workspace called "
msgstr "har inviteret dig til at deltage i et arbejdsområde kaldet "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hej"
msgid "Hello"
msgstr "Hej"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hej,"
msgid "Hello,"
msgstr "Hej,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Hvis du ikke har initieret denne ændring, bedes du straks kontakte ejeren af dit arbejdsområde."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Hvis du ikke har initieret denne ændring, bedes du straks kontakte ejeren af dit arbejdsområde."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Hvis du ønsker at fortsætte med at bruge Twenty, opdater da dit abonnement inden for de næste {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Hvis du ønsker at fortsætte med at bruge Twenty, opdater da dit abonnement inden for de næste {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Hvis du ønsker at bruge Twenty igen, kan du oprette et nyt arbejdsområde."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Hvis du ønsker at bruge Twenty igen, kan du oprette et nyt arbejdsområde."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Det ser ud til, at dit arbejdsområde <0>{workspaceDisplayName}</0> er blevet suspenderet i {daysSinceInactive} dage."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Det ser ud til, at dit arbejdsområde <0>{workspaceDisplayName}</0> er blevet suspenderet i {daysSinceInactive} dage."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Deltag i dit team på Twenty"
msgid "Join your team on Twenty"
msgstr "Deltag i dit team på Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Adgangskode opdateret"
msgid "Password updated"
msgstr "Adgangskode opdateret"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Bekræft venligst dette domæne for at tillade brugere med"
msgid "Please validate this domain to allow users with"
msgstr "Bekræft venligst dette domæne for at tillade brugere med"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Nulstil"
msgid "Reset"
msgstr "Nulstil"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Nulstil din adgangskode 🗝"
msgid "Reset your password 🗝"
msgstr "Nulstil din adgangskode 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Suspenderet arbejdsområde "
msgid "Suspended Workspace "
msgstr "Suspenderet arbejdsområde "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Tak fordi du har registreret en konto på Twenty! Før vi starter, skal vi bare bekræfte, at det er dig. Klik ovenfor for at bekræfte din e-mailadresse."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Tak fordi du har registreret en konto på Twenty! Før vi starter, skal vi bare bekræfte, at det er dig. Klik ovenfor for at bekræfte din e-mailadresse."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "Arbejdsområdet vil blive deaktiveret om {remainingDays} {dayOrDays}, og alle dens data vil blive slettet."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "Arbejdsområdet vil blive deaktiveret om {remainingDays} {dayOrDays}, og alle dens data vil blive slettet."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Dette er en bekræftelse på, at adgangskoden til din konto ({email}) er blevet ændret den {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Dette er en bekræftelse på, at adgangskoden til din konto ({email}) er blevet ændret den {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Dette link er kun gyldigt i de næste {duration}. Hvis linket ikke fungerer, kan du bruge loginbekræftelseslinket direkte:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Dette link er kun gyldigt i de næste {duration}. Hvis linket ikke fungerer, kan du bruge loginbekræftelseslinket direkte:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Opdater dit abonnement"
msgid "Update your subscription"
msgstr "Opdater dit abonnement"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Bekræft domæne"
msgid "Validate domain"
msgstr "Bekræft domæne"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Bekræft e-mail"
msgid "Verify Email"
msgstr "Bekræft e-mail"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Dit arbejdsområde <0>{workspaceDisplayName}</0> er blevet slettet, da dit abonnement udløb for {daysSinceInactive} dage siden."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Dit arbejdsområde <0>{workspaceDisplayName}</0> er blevet slettet, da dit abonnement udløb for {daysSinceInactive} dage siden."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Einladung akzeptieren"
msgid "Accept invite"
msgstr "Einladung akzeptieren"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Alle Daten in diesem Workspace wurden dauerhaft gelöscht."
msgid "All data in this workspace has been permanently deleted."
msgstr "Alle Daten in diesem Workspace wurden dauerhaft gelöscht."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Bestätigen Sie Ihre E-Mail-Adresse"
msgid "Confirm your email address"
msgstr "Bestätigen Sie Ihre E-Mail-Adresse"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Mit Twenty verbinden"
msgid "Connect to Twenty"
msgstr "Mit Twenty verbinden"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Erstellen Sie einen neuen Arbeitsbereich"
msgid "Create a new workspace"
msgstr "Erstellen Sie einen neuen Arbeitsbereich"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Sehr geehrte/r {userName}"
msgid "Dear {userName}"
msgstr "Sehr geehrte/r {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Sehr geehrte/r {userName},"
msgid "Dear {userName},"
msgstr "Sehr geehrte/r {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Gelöschter Arbeitsbereich"
msgid "Deleted Workspace"
msgstr "Gelöschter Arbeitsbereich"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "E-Mail-Adressen, um Ihrem Arbeitsbereich ohne Einladung beizutreten."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "E-Mail-Adressen, um Ihrem Arbeitsbereich ohne Einladung beizutreten."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "hat Sie eingeladen, einem Workspace namens "
msgid "has invited you to join a workspace called "
msgstr "hat Sie eingeladen, einem Workspace namens "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hallo"
msgid "Hello"
msgstr "Hallo"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hallo,"
msgid "Hello,"
msgstr "Hallo,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Wenn Sie diese Änderung nicht veranlasst haben, kontaktieren Sie bitte umgehend den Eigentümer Ihres Workspaces."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Wenn Sie diese Änderung nicht veranlasst haben, kontaktieren Sie bitte umgehend den Eigentümer Ihres Workspaces."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Wenn Sie Twenty weiterhin nutzen möchten, aktualisieren Sie bitte Ihr Abonnement innerhalb der nächsten {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Wenn Sie Twenty weiterhin nutzen möchten, aktualisieren Sie bitte Ihr Abonnement innerhalb der nächsten {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Wenn Sie Twenty erneut nutzen möchten, können Sie einen neuen Workspace erstellen."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Wenn Sie Twenty erneut nutzen möchten, können Sie einen neuen Workspace erstellen."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Es scheint, dass Ihr Workspace <0>{workspaceDisplayName}</0> seit {daysSinceInactive} Tagen gesperrt ist."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Es scheint, dass Ihr Workspace <0>{workspaceDisplayName}</0> seit {daysSinceInactive} Tagen gesperrt ist."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Treten Sie Ihrem Team auf Twenty bei"
msgid "Join your team on Twenty"
msgstr "Treten Sie Ihrem Team auf Twenty bei"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Passwort wurde aktualisiert"
msgid "Password updated"
msgstr "Passwort wurde aktualisiert"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Bitte validieren Sie diese Domain, um Benutzern mit"
msgid "Please validate this domain to allow users with"
msgstr "Bitte validieren Sie diese Domain, um Benutzern mit"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Zurücksetzen"
msgid "Reset"
msgstr "Zurücksetzen"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Setzen Sie Ihr Passwort zurück 🗝"
msgid "Reset your password 🗝"
msgstr "Setzen Sie Ihr Passwort zurück 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Ausgesetzter Arbeitsbereich "
msgid "Suspended Workspace "
msgstr "Ausgesetzter Arbeitsbereich "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Vielen Dank für Ihre Registrierung bei Twenty! Bevor wir beginnen, müssen wir nur bestätigen, dass Sie es sind. Klicken Sie oben, um Ihre E-Mail-Adresse zu verifizieren."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Vielen Dank für Ihre Registrierung bei Twenty! Bevor wir beginnen, müssen wir nur bestätigen, dass Sie es sind. Klicken Sie oben, um Ihre E-Mail-Adresse zu verifizieren."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "Der Workspace wird in {remainingDays} {dayOrDays} deaktiviert, und alle Daten werden gelöscht."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "Der Workspace wird in {remainingDays} {dayOrDays} deaktiviert, und alle Daten werden gelöscht."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Dies ist eine Bestätigung, dass das Passwort für Ihr Konto ({email}) am {formattedDate} erfolgreich geändert wurde."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Dies ist eine Bestätigung, dass das Passwort für Ihr Konto ({email}) am {formattedDate} erfolgreich geändert wurde."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Dieser Link ist nur für die nächsten {duration} gültig. Wenn der Link nicht funktioniert, können Sie den Anmeldebestätigungslink direkt verwenden:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Dieser Link ist nur für die nächsten {duration} gültig. Wenn der Link nicht funktioniert, können Sie den Anmeldebestätigungslink direkt verwenden:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Aktualisieren Sie Ihr Abonnement"
msgid "Update your subscription"
msgstr "Aktualisieren Sie Ihr Abonnement"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Domain validieren"
msgid "Validate domain"
msgstr "Domain validieren"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "E-Mail verifizieren"
msgid "Verify Email"
msgstr "E-Mail verifizieren"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Ihr Workspace <0>{workspaceDisplayName}</0> wurde gelöscht, da Ihr Abonnement vor {daysSinceInactive} Tagen abgelaufen ist."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Ihr Workspace <0>{workspaceDisplayName}</0> wurde gelöscht, da Ihr Abonnement vor {daysSinceInactive} Tagen abgelaufen ist."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Αποδοχή πρόσκλησης"
msgid "Accept invite"
msgstr "Αποδοχή πρόσκλησης"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Όλα τα δεδομένα σε αυτόν τον χώρο εργασίας έχουν διαγραφεί μόνιμα."
msgid "All data in this workspace has been permanently deleted."
msgstr "Όλα τα δεδομένα σε αυτόν τον χώρο εργασίας έχουν διαγραφεί μόνιμα."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Επιβεβαιώστε τη διεύθυνση email σας"
msgid "Confirm your email address"
msgstr "Επιβεβαιώστε τη διεύθυνση email σας"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Συνδεθείτε στο Twenty"
msgid "Connect to Twenty"
msgstr "Συνδεθείτε στο Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Δημιουργία νέου χώρου εργασίας"
msgid "Create a new workspace"
msgstr "Δημιουργία νέου χώρου εργασίας"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Αγαπητέ/ή {userName}"
msgid "Dear {userName}"
msgstr "Αγαπητέ/ή {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Αγαπητέ/ή {userName},"
msgid "Dear {userName},"
msgstr "Αγαπητέ/ή {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Διαγραμμένος Χώρος Εργασίας"
msgid "Deleted Workspace"
msgstr "Διαγραμμένος Χώρος Εργασίας"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "διευθύνσεις ηλεκτρονικού ταχυδρομείου για να συμμετάσχουν στο χώρο εργασίας σας χωρίς να απαιτείται πρόσκληση."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "διευθύνσεις ηλεκτρονικού ταχυδρομείου για να συμμετάσχουν στο χώρο εργασίας σας χωρίς να απαιτείται πρόσκληση."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "σας έχει προσκαλέσει να συμμετάσχετε σε έναν χώρο εργασίας με την ονομασία "
msgid "has invited you to join a workspace called "
msgstr "σας έχει προσκαλέσει να συμμετάσχετε σε έναν χώρο εργασίας με την ονομασία "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Γεια σας"
msgid "Hello"
msgstr "Γεια σας"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Γεια σας,"
msgid "Hello,"
msgstr "Γεια σας,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Εάν δεν έχετε προβεί εσείς σε αυτήν την αλλαγή, παρακαλώ επικοινωνήστε άμεσα με τον ιδιοκτήτη του χώρου εργασίας σας."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Εάν δεν έχετε προβεί εσείς σε αυτήν την αλλαγή, παρακαλώ επικοινωνήστε άμεσα με τον ιδιοκτήτη του χώρου εργασίας σας."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Εάν επιθυμείτε να συνεχίστε να χρησιμοποιείτε το Twenty, παρακαλούμε ενημερώστε την συνδρομή σας εντός των επόμενων {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Εάν επιθυμείτε να συνεχίστε να χρησιμοποιείτε το Twenty, παρακαλούμε ενημερώστε την συνδρομή σας εντός των επόμενων {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Εάν επιθυμείτε να χρησιμοποιήσετε ξανά το Twenty, μπορείτε να δημιουργήσετε ένα νέο χώρο εργασίας."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Εάν επιθυμείτε να χρησιμοποιήσετε ξανά το Twenty, μπορείτε να δημιουργήσετε ένα νέο χώρο εργασίας."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Φαίνεται ότι ο χώρος εργασίας σας <0>{workspaceDisplayName}</0> έχει ανασταλεί για {daysSinceInactive} ημέρες."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Φαίνεται ότι ο χώρος εργασίας σας <0>{workspaceDisplayName}</0> έχει ανασταλεί για {daysSinceInactive} ημέρες."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Συμμετέχετε στην ομάδα σας στο Twenty"
msgid "Join your team on Twenty"
msgstr "Συμμετέχετε στην ομάδα σας στο Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Ο κωδικός έχει ενημερωθεί"
msgid "Password updated"
msgstr "Ο κωδικός έχει ενημερωθεί"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Παρακαλώ επικυρώστε αυτόν τον τομέα για να επιτρέψετε στους χρήστες με"
msgid "Please validate this domain to allow users with"
msgstr "Παρακαλώ επικυρώστε αυτόν τον τομέα για να επιτρέψετε στους χρήστες με"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Επαναφορά"
msgid "Reset"
msgstr "Επαναφορά"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Επαναφέρετε τον κωδικό σας 🗝"
msgid "Reset your password 🗝"
msgstr "Επαναφέρετε τον κωδικό σας 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Ανασταλμένος Χώρος Εργασίας "
msgid "Suspended Workspace "
msgstr "Ανασταλμένος Χώρος Εργασίας "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Σας ευχαριστούμε που εγγραφήκατε για έναν λογαριασμό στο Twenty! Πριν ξεκινήσουμε, πρέπει μόνο να επιβεβαιώσουμε ότι αυτός είστε εσείς. Κάντε κλικ παραπάνω για να επαληθεύσετε τη διεύθυνση email σας."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Σας ευχαριστούμε που εγγραφήκατε για έναν λογαριασμό στο Twenty! Πριν ξεκινήσουμε, πρέπει μόνο να επιβεβαιώσουμε ότι αυτός είστε εσείς. Κάντε κλικ παραπάνω για να επαληθεύσετε τη διεύθυνση email σας."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "Ο χώρος εργασίας θα απενεργοποιηθεί σε {remainingDays} {dayOrDays}, και όλα τα δεδομένα του θα διαγραφούν."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "Ο χώρος εργασίας θα απενεργοποιηθεί σε {remainingDays} {dayOrDays}, και όλα τα δεδομένα του θα διαγραφούν."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Αυτό είναι ένα επιβεβαίωση ότι ο κωδικός για τον λογαριασμό σας ({email}) άλλαξε με επιτυχία στις {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Αυτό είναι ένα επιβεβαίωση ότι ο κωδικός για τον λογαριασμό σας ({email}) άλλαξε με επιτυχία στις {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Αυτός ο σύνδεσμος ισχύει μόνο για τις επόμενες {duration}. Εάν ο σύνδεσμος δεν λειτουργεί, μπορείτε να χρησιμοποιήσετε τον σύνδεσμο επαλήθευσης σύνδεσης απευθείας:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Αυτός ο σύνδεσμος ισχύει μόνο για τις επόμενες {duration}. Εάν ο σύνδεσμος δεν λειτουργεί, μπορείτε να χρησιμοποιήσετε τον σύνδεσμο επαλήθευσης σύνδεσης απευθείας:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Ενημερώστε τη συνδρομή σας"
msgid "Update your subscription"
msgstr "Ενημερώστε τη συνδρομή σας"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Επικύρωση τομέα"
msgid "Validate domain"
msgstr "Επικύρωση τομέα"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Επαληθεύστε το Email"
msgid "Verify Email"
msgstr "Επαληθεύστε το Email"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Ο χώρος εργασίας σας <0>{workspaceDisplayName}</0> έχει διαγραφεί καθώς η συνδρομή σας έληξε {daysSinceInactive} ημέρες πριν."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Ο χώρος εργασίας σας <0>{workspaceDisplayName}</0> έχει διαγραφεί καθώς η συνδρομή σας έληξε {daysSinceInactive} ημέρες πριν."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+58 -268
View File
@@ -13,240 +13,30 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr "Suspended Workspace"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr "Dear {userName},"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr "Hello,"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr "Update your subscription"
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr "Validate domain"
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr "Test email"
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr "Join your team on Twenty"
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
#. js-lingui-explicit-id
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr "Accept invite"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr "Confirm your email address"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr "Verify Email"
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr "Password updated"
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "If you did not initiate this change, please contact your workspace owner immediately."
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr "Connect to Twenty"
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr "Reset your password 🗝"
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr "Reset"
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr "Deleted Workspace"
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#. js-lingui-explicit-id
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr "All data in this workspace has been permanently deleted."
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "If you wish to use Twenty again, you can create a new workspace."
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr "Create a new workspace"
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr "What is Twenty?"
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr "Website"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr "Visit Twenty's website"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr "Github"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr "Visit Twenty's GitHub repository"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr "User guide"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr "Read Twenty's user guide"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr "Developers"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr "Visit Twenty's developer documentation"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr "Twenty.com, Public Benefit Corporation"
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr "San Francisco / Paris"
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Accept invite"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "All data in this workspace has been permanently deleted."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Confirm your email address"
msgid "Confirm your email address"
msgstr "Confirm your email address"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Connect to Twenty"
msgid "Connect to Twenty"
msgstr "Connect to Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Create a new workspace"
msgid "Create a new workspace"
msgstr "Create a new workspace"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -255,73 +45,73 @@ msgstr "San Francisco / Paris"
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Dear {userName}"
msgid "Dear {userName}"
msgstr "Dear {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Dear {userName},"
msgid "Dear {userName},"
msgstr "Dear {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Deleted Workspace"
msgid "Deleted Workspace"
msgstr "Deleted Workspace"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "email addresses to join your workspace without requiring an invitation."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "email addresses to join your workspace without requiring an invitation."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "has invited you to join a workspace called "
msgid "has invited you to join a workspace called "
msgstr "has invited you to join a workspace called "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hello"
msgid "Hello"
msgstr "Hello"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hello,"
msgid "Hello,"
msgstr "Hello,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "If you did not initiate this change, please contact your workspace owner immediately."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "If you did not initiate this change, please contact your workspace owner immediately."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "If you wish to use Twenty again, you can create a new workspace."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "If you wish to use Twenty again, you can create a new workspace."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Join your team on Twenty"
msgid "Join your team on Twenty"
msgstr "Join your team on Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Password updated"
msgid "Password updated"
msgstr "Password updated"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Please validate this domain to allow users with"
msgid "Please validate this domain to allow users with"
msgstr "Please validate this domain to allow users with"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -330,33 +120,33 @@ msgstr "San Francisco / Paris"
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Reset"
msgid "Reset"
msgstr "Reset"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Reset your password 🗝"
msgid "Reset your password 🗝"
msgstr "Reset your password 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Suspended Workspace "
msgid "Suspended Workspace "
msgstr "Suspended Workspace "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -365,8 +155,8 @@ msgstr "San Francisco / Paris"
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -375,24 +165,24 @@ msgstr "San Francisco / Paris"
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Update your subscription"
msgid "Update your subscription"
msgstr "Update your subscription"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Validate domain"
msgid "Validate domain"
msgstr "Validate domain"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Verify Email"
msgid "Verify Email"
msgstr "Verify Email"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Aceptar invitación"
msgid "Accept invite"
msgstr "Aceptar invitación"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Todos los datos de este espacio de trabajo han sido eliminados permanentemente."
msgid "All data in this workspace has been permanently deleted."
msgstr "Todos los datos de este espacio de trabajo han sido eliminados permanentemente."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Confirma tu dirección de correo electrónico"
msgid "Confirm your email address"
msgstr "Confirma tu dirección de correo electrónico"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Conéctate a Twenty"
msgid "Connect to Twenty"
msgstr "Conéctate a Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Crea un nuevo espacio de trabajo"
msgid "Create a new workspace"
msgstr "Crea un nuevo espacio de trabajo"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Estimado/a {userName}"
msgid "Dear {userName}"
msgstr "Estimado/a {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Estimado/a {userName},"
msgid "Dear {userName},"
msgstr "Estimado/a {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Espacio de trabajo eliminado"
msgid "Deleted Workspace"
msgstr "Espacio de trabajo eliminado"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "direcciones de correo electrónico para unirse a su espacio de trabajo sin requerir una invitación."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "direcciones de correo electrónico para unirse a su espacio de trabajo sin requerir una invitación."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "te ha invitado a unirte a un espacio de trabajo llamado "
msgid "has invited you to join a workspace called "
msgstr "te ha invitado a unirte a un espacio de trabajo llamado "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hola"
msgid "Hello"
msgstr "Hola"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hola,"
msgid "Hello,"
msgstr "Hola,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Si no iniciaste este cambio, contacta inmediatamente al propietario de tu espacio de trabajo."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Si no iniciaste este cambio, contacta inmediatamente al propietario de tu espacio de trabajo."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Si deseas seguir usando Twenty, actualiza tu suscripción en los próximos {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Si deseas seguir usando Twenty, actualiza tu suscripción en los próximos {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Si deseas usar Twenty nuevamente, puedes crear un nuevo espacio de trabajo."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Si deseas usar Twenty nuevamente, puedes crear un nuevo espacio de trabajo."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Parece que tu espacio de trabajo <0>{workspaceDisplayName}</0> ha estado suspendido durante {daysSinceInactive} días."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Parece que tu espacio de trabajo <0>{workspaceDisplayName}</0> ha estado suspendido durante {daysSinceInactive} días."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Únete a tu equipo en Twenty"
msgid "Join your team on Twenty"
msgstr "Únete a tu equipo en Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Contraseña actualizada"
msgid "Password updated"
msgstr "Contraseña actualizada"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Por favor, valide este dominio para permitir a los usuarios con"
msgid "Please validate this domain to allow users with"
msgstr "Por favor, valide este dominio para permitir a los usuarios con"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Restablecer"
msgid "Reset"
msgstr "Restablecer"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Restablece tu contraseña 🗝"
msgid "Reset your password 🗝"
msgstr "Restablece tu contraseña 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Espacio de trabajo suspendido "
msgid "Suspended Workspace "
msgstr "Espacio de trabajo suspendido "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "¡Gracias por registrarte en Twenty! Antes de comenzar, solo necesitamos confirmar que eres tú. Haz clic arriba para verificar tu dirección de correo electrónico."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "¡Gracias por registrarte en Twenty! Antes de comenzar, solo necesitamos confirmar que eres tú. Haz clic arriba para verificar tu dirección de correo electrónico."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "El espacio de trabajo se desactivará en {remainingDays} {dayOrDays} y se eliminarán todos sus datos."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "El espacio de trabajo se desactivará en {remainingDays} {dayOrDays} y se eliminarán todos sus datos."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Esta es una confirmación de que la contraseña de tu cuenta ({email}) se cambió correctamente el {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Esta es una confirmación de que la contraseña de tu cuenta ({email}) se cambió correctamente el {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Este enlace solo es válido por los próximos {duration}. Si el enlace no funciona, puedes usar directamente el enlace de verificación de inicio de sesión:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Este enlace solo es válido por los próximos {duration}. Si el enlace no funciona, puedes usar directamente el enlace de verificación de inicio de sesión:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Actualiza tu suscripción"
msgid "Update your subscription"
msgstr "Actualiza tu suscripción"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Validar dominio"
msgid "Validate domain"
msgstr "Validar dominio"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Verificar correo electrónico"
msgid "Verify Email"
msgstr "Verificar correo electrónico"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Tu espacio de trabajo <0>{workspaceDisplayName}</0> ha sido eliminado porque tu suscripción caducó hace {daysSinceInactive} días."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Tu espacio de trabajo <0>{workspaceDisplayName}</0> ha sido eliminado porque tu suscripción caducó hace {daysSinceInactive} días."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Hyväksy kutsu"
msgid "Accept invite"
msgstr "Hyväksy kutsu"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Kaikki tiedot tässä työtilassa on pysyvästi poistettu."
msgid "All data in this workspace has been permanently deleted."
msgstr "Kaikki tiedot tässä työtilassa on pysyvästi poistettu."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Vahvista sähköpostiosoitteesi"
msgid "Confirm your email address"
msgstr "Vahvista sähköpostiosoitteesi"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Yhdistä Twenty"
msgid "Connect to Twenty"
msgstr "Yhdistä Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Luo uusi työtila"
msgid "Create a new workspace"
msgstr "Luo uusi työtila"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Hyvä {userName}"
msgid "Dear {userName}"
msgstr "Hyvä {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Hyvä {userName},"
msgid "Dear {userName},"
msgstr "Hyvä {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Poistettu työtila"
msgid "Deleted Workspace"
msgstr "Poistettu työtila"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "sähköpostiosoitteet liittymään työtilaasi ilman kutsua."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "sähköpostiosoitteet liittymään työtilaasi ilman kutsua."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "on kutsunut sinut liittymään työtilaan nimeltä "
msgid "has invited you to join a workspace called "
msgstr "on kutsunut sinut liittymään työtilaan nimeltä "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Hei"
msgid "Hello"
msgstr "Hei"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Hei,"
msgid "Hello,"
msgstr "Hei,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Jos et itse aloittanut tätä muutosta, ota heti yhteyttä työtilasi omistajaan."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Jos et itse aloittanut tätä muutosta, ota heti yhteyttä työtilasi omistajaan."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Jos haluat jatkaa Twenty:n käyttöä, päivitä tilauksesi seuraavan {remainingDays} {dayOrDays} kuluessa."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Jos haluat jatkaa Twenty:n käyttöä, päivitä tilauksesi seuraavan {remainingDays} {dayOrDays} kuluessa."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Jos haluat käyttää Twentyä uudelleen, voit luoda uuden työtilan."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Jos haluat käyttää Twentyä uudelleen, voit luoda uuden työtilan."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Vaikuttaa siltä, että työtilasi <0>{workspaceDisplayName}</0> on ollut jäädytettynä {daysSinceInactive} päivää."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Vaikuttaa siltä, että työtilasi <0>{workspaceDisplayName}</0> on ollut jäädytettynä {daysSinceInactive} päivää."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Liity tiimiisi Twentyssä"
msgid "Join your team on Twenty"
msgstr "Liity tiimiisi Twentyssä"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Salasana päivitetty"
msgid "Password updated"
msgstr "Salasana päivitetty"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Vahvista tämä verkkotunnus, jotta tämä sallitaan käyttäjille, joilla on"
msgid "Please validate this domain to allow users with"
msgstr "Vahvista tämä verkkotunnus, jotta tämä sallitaan käyttäjille, joilla on"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Nollaa"
msgid "Reset"
msgstr "Nollaa"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Nollaa salasanasi 🗝"
msgid "Reset your password 🗝"
msgstr "Nollaa salasanasi 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Keskeytetty työtila "
msgid "Suspended Workspace "
msgstr "Keskeytetty työtila "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Kiitos, että rekisteröidyit Twenty:n käyttäjäksi! Ennen kuin aloitamme, meidän täytyy vahvistaa, että kyseessä on sinä. Klikkaa yllä vahvistaaksesi sähköpostiosoitteesi."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Kiitos, että rekisteröidyit Twenty:n käyttäjäksi! Ennen kuin aloitamme, meidän täytyy vahvistaa, että kyseessä on sinä. Klikkaa yllä vahvistaaksesi sähköpostiosoitteesi."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "Työtila poistetaan käytöstä {remainingDays} {dayOrDays} kuluttua, ja kaikki sen tiedot poistetaan."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "Työtila poistetaan käytöstä {remainingDays} {dayOrDays} kuluttua, ja kaikki sen tiedot poistetaan."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Tämä on vahvistus siitä, että tilisi ({email}) salasana on vaihdettu onnistuneesti {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Tämä on vahvistus siitä, että tilisi ({email}) salasana on vaihdettu onnistuneesti {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Tämä linkki on voimassa vain seuraavat {duration}. Jos linkki ei toimi, voit käyttää suoraan kirjautumisen varmennuslinkkiä:"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Tämä linkki on voimassa vain seuraavat {duration}. Jos linkki ei toimi, voit käyttää suoraan kirjautumisen varmennuslinkkiä:"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Päivitä tilauksesi"
msgid "Update your subscription"
msgstr "Päivitä tilauksesi"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Vahvista verkkotunnus"
msgid "Validate domain"
msgstr "Vahvista verkkotunnus"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Vahvista sähköposti"
msgid "Verify Email"
msgstr "Vahvista sähköposti"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Työtilasi <0>{workspaceDisplayName}</0> on poistettu, koska tilauksesi vanheni {daysSinceInactive} päivää sitten."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Työtilasi <0>{workspaceDisplayName}</0> on poistettu, koska tilauksesi vanheni {daysSinceInactive} päivää sitten."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
+60 -270
View File
@@ -18,240 +18,30 @@ msgstr ""
"X-Crowdin-File: /packages/twenty-emails/src/locales/en.po\n"
"X-Crowdin-File-ID: 27\n"
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Suspended Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Dear {userName},"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
#: src/emails/password-update-notify.email.tsx
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Hello,"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/warn-suspended-workspace.email.tsx
msgid "Update your subscription"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
msgid "Validate domain"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/validate-approved-access-domain.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>): Please validate this domain to allow users with <1>@{domain}</1> email addresses to join your workspace without requiring an invitation."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/test.email.tsx
msgid "Test email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Join your team on Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "{senderName} (<0>{senderEmail}</0>) has invited you to join a workspace called <1>{workspaceName}</1>."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-invite-link.email.tsx
msgid "Accept invite"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Confirm your email address"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click below to verify your email address."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
msgid "Verify Email"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Password updated"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-update-notify.email.tsx
msgid "Connect to Twenty"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset your password 🗝"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/password-reset-link.email.tsx
msgid "Reset"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Deleted Workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "All data in this workspace has been permanently deleted."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr ""
#. js-lingui-explicit-id
#: src/emails/clean-suspended-workspace.email.tsx
msgid "Create a new workspace"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "What is Twenty?"
msgstr ""
#. js-lingui-explicit-id
#: src/components/WhatIsTwenty.tsx
msgid "It's a CRM, a software to help businesses manage their customer data and relationships efficiently."
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's website"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Github"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's GitHub repository"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "User guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Read Twenty's user guide"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Developers"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Visit Twenty's developer documentation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "Twenty.com, Public Benefit Corporation"
msgstr ""
#. js-lingui-explicit-id
#: src/components/Footer.tsx
msgid "San Francisco / Paris"
msgstr ""
#. js-lingui-explicit-id
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr ""
#. js-lingui-id: 4WPI3S
#: src/emails/send-invite-link.email.tsx
#~ msgid "Accept invite"
#~ msgstr "Accepter l'invitation"
msgid "Accept invite"
msgstr "Accepter l'invitation"
#. js-lingui-id: Yxj+Uc
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "All data in this workspace has been permanently deleted."
#~ msgstr "Toutes les données de cet espace de travail ont été supprimées définitivement."
msgid "All data in this workspace has been permanently deleted."
msgstr "Toutes les données de cet espace de travail ont été supprimées définitivement."
#. js-lingui-id: RPHFhC
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Confirm your email address"
#~ msgstr "Confirmez votre adresse e-mail"
msgid "Confirm your email address"
msgstr "Confirmez votre adresse e-mail"
#. js-lingui-id: nvkBPN
#: src/emails/password-update-notify.email.tsx
#~ msgid "Connect to Twenty"
#~ msgstr "Connectez-vous à Twenty"
msgid "Connect to Twenty"
msgstr "Connectez-vous à Twenty"
#. js-lingui-id: jPQSEz
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Create a new workspace"
#~ msgstr "Créez un nouvel espace de travail"
msgid "Create a new workspace"
msgstr "Créez un nouvel espace de travail"
#. js-lingui-id: JRzgV7
#: src/emails/password-update-notify.email.tsx
@@ -260,73 +50,73 @@ msgstr ""
#. js-lingui-id: Lm5BBI
#: src/emails/password-update-notify.email.tsx
#~ msgid "Dear {userName}"
#~ msgstr "Cher {userName}"
msgid "Dear {userName}"
msgstr "Cher {userName}"
#. js-lingui-id: lIdkf2
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Dear {userName},"
#~ msgstr "Cher {userName},"
msgid "Dear {userName},"
msgstr "Cher {userName},"
#. js-lingui-id: NTwcnq
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Deleted Workspace"
#~ msgstr "Espace de travail supprimé"
msgid "Deleted Workspace"
msgstr "Espace de travail supprimé"
#. js-lingui-id: S3uuQj
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "email addresses to join your workspace without requiring an invitation."
#~ msgstr "adresses e-mail pour rejoindre votre espace de travail sans nécessiter d'invitation."
msgid "email addresses to join your workspace without requiring an invitation."
msgstr "adresses e-mail pour rejoindre votre espace de travail sans nécessiter d'invitation."
#. js-lingui-id: tGme7M
#: src/emails/send-invite-link.email.tsx
#~ msgid "has invited you to join a workspace called "
#~ msgstr "vous a invité à rejoindre un espace de travail appelé "
msgid "has invited you to join a workspace called "
msgstr "vous a invité à rejoindre un espace de travail appelé "
#. js-lingui-id: uzTaYi
#: src/emails/password-update-notify.email.tsx
#~ msgid "Hello"
#~ msgstr "Bonjour"
msgid "Hello"
msgstr "Bonjour"
#. js-lingui-id: Xa0d85
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Hello,"
#~ msgstr "Bonjour,"
msgid "Hello,"
msgstr "Bonjour,"
#. js-lingui-id: eE1nG1
#: src/emails/password-update-notify.email.tsx
#~ msgid "If you did not initiate this change, please contact your workspace owner immediately."
#~ msgstr "Si vous n'avez pas initié ce changement, veuillez contacter immédiatement le propriétaire de votre espace de travail."
msgid "If you did not initiate this change, please contact your workspace owner immediately."
msgstr "Si vous n'avez pas initié ce changement, veuillez contacter immédiatement le propriétaire de votre espace de travail."
#. js-lingui-id: Gz91L8
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
#~ msgstr "Pour continuer à utiliser Twenty, veuillez mettre à jour votre abonnement dans les {remainingDays} {dayOrDays}."
msgid "If you wish to continue using Twenty, please update your subscription within the next {remainingDays} {dayOrDays}."
msgstr "Pour continuer à utiliser Twenty, veuillez mettre à jour votre abonnement dans les {remainingDays} {dayOrDays}."
#. js-lingui-id: 0weyko
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "If you wish to use Twenty again, you can create a new workspace."
#~ msgstr "Pour réutiliser Twenty, vous pouvez créer un nouvel espace de travail."
msgid "If you wish to use Twenty again, you can create a new workspace."
msgstr "Pour réutiliser Twenty, vous pouvez créer un nouvel espace de travail."
#. js-lingui-id: 7JuhZQ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
#~ msgstr "Il semble que votre espace de travail <0>{workspaceDisplayName}</0> soit suspendu depuis {daysSinceInactive} jours."
msgid "It appears that your workspace <0>{workspaceDisplayName}</0> has been suspended for {daysSinceInactive} days."
msgstr "Il semble que votre espace de travail <0>{workspaceDisplayName}</0> soit suspendu depuis {daysSinceInactive} jours."
#. js-lingui-id: PviVyk
#: src/emails/send-invite-link.email.tsx
#~ msgid "Join your team on Twenty"
#~ msgstr "Rejoignez votre équipe sur Twenty"
msgid "Join your team on Twenty"
msgstr "Rejoignez votre équipe sur Twenty"
#. js-lingui-id: ogtYkT
#: src/emails/password-update-notify.email.tsx
#~ msgid "Password updated"
#~ msgstr "Mot de passe mis à jour"
msgid "Password updated"
msgstr "Mot de passe mis à jour"
#. js-lingui-id: Yucjaa
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Please validate this domain to allow users with"
#~ msgstr "Veuillez valider ce domaine pour permettre aux utilisateurs avec"
msgid "Please validate this domain to allow users with"
msgstr "Veuillez valider ce domaine pour permettre aux utilisateurs avec"
#. js-lingui-id: u3Ns4p
#: src/emails/validate-approved-access-domain.email.tsx
@@ -335,33 +125,33 @@ msgstr ""
#. js-lingui-id: OfhWJH
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset"
#~ msgstr "Réinitialiser"
msgid "Reset"
msgstr "Réinitialiser"
#. js-lingui-id: RE5NiU
#: src/emails/password-reset-link.email.tsx
#~ msgid "Reset your password 🗝"
#~ msgstr "Réinitialisez votre mot de passe 🗝"
msgid "Reset your password 🗝"
msgstr "Réinitialisez votre mot de passe 🗝"
#. js-lingui-id: UBadaJ
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Suspended Workspace "
#~ msgstr "Espace de travail suspendu "
msgid "Suspended Workspace "
msgstr "Espace de travail suspendu "
#. js-lingui-id: 7yDt8q
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
#~ msgstr "Merci de vous être inscrit sur Twenty ! Avant de commencer, nous devons confirmer votre identité. Cliquez ci-dessus pour vérifier votre adresse e-mail."
msgid "Thanks for registering for an account on Twenty! Before we get started, we just need to confirm that this is you. Click above to verify your email address."
msgstr "Merci de vous être inscrit sur Twenty ! Avant de commencer, nous devons confirmer votre identité. Cliquez ci-dessus pour vérifier votre adresse e-mail."
#. js-lingui-id: igorB1
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
#~ msgstr "L'espace de travail sera désactivé dans {remainingDays} {dayOrDays} et toutes ses données seront supprimées."
msgid "The workspace will be deactivated in {remainingDays} {dayOrDays}, and all its data will be deleted."
msgstr "L'espace de travail sera désactivé dans {remainingDays} {dayOrDays} et toutes ses données seront supprimées."
#. js-lingui-id: 7OEHy1
#: src/emails/password-update-notify.email.tsx
#~ msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
#~ msgstr "Ceci est une confirmation que le mot de passe de votre compte ({email}) a été modifié avec succès le {formattedDate}."
msgid "This is a confirmation that password for your account ({email}) was successfully changed on {formattedDate}."
msgstr "Ceci est une confirmation que le mot de passe de votre compte ({email}) a été modifié avec succès le {formattedDate}."
#. js-lingui-id: wSOsS+
#: src/emails/password-update-notify.email.tsx
@@ -370,8 +160,8 @@ msgstr ""
#. js-lingui-id: R4gMjN
#: src/emails/password-reset-link.email.tsx
#~ msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
#~ msgstr "Ce lien n'est valable que pour les {duration} suivants. Si le lien ne fonctionne pas, vous pouvez utiliser directement le lien de vérification de connexion :"
msgid "This link is only valid for the next {duration}. If the link does not work, you can use the login verification link directly:"
msgstr "Ce lien n'est valable que pour les {duration} suivants. Si le lien ne fonctionne pas, vous pouvez utiliser directement le lien de vérification de connexion :"
#. js-lingui-id: 2oA637
#: src/emails/password-reset-link.email.tsx
@@ -380,24 +170,24 @@ msgstr ""
#. js-lingui-id: H0v4yC
#: src/emails/warn-suspended-workspace.email.tsx
#~ msgid "Update your subscription"
#~ msgstr "Mettez à jour votre abonnement"
msgid "Update your subscription"
msgstr "Mettez à jour votre abonnement"
#. js-lingui-id: QbiUqd
#: src/emails/validate-approved-access-domain.email.tsx
#: src/emails/validate-approved-access-domain.email.tsx
#~ msgid "Validate domain"
#~ msgstr "Valider le domaine"
msgid "Validate domain"
msgstr "Valider le domaine"
#. js-lingui-id: wCKkSr
#: src/emails/send-email-verification-link.email.tsx
#~ msgid "Verify Email"
#~ msgstr "Vérifiez l'e-mail"
msgid "Verify Email"
msgstr "Vérifiez l'e-mail"
#. js-lingui-id: 9MqLGX
#: src/emails/clean-suspended-workspace.email.tsx
#~ msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
#~ msgstr "Votre espace de travail <0>{workspaceDisplayName}</0> a été supprimé car votre abonnement a expiré il y a {daysSinceInactive} jours."
msgid "Your workspace <0>{workspaceDisplayName}</0> has been deleted as your subscription expired {daysSinceInactive} days ago."
msgstr "Votre espace de travail <0>{workspaceDisplayName}</0> a été supprimé car votre abonnement a expiré il y a {daysSinceInactive} jours."
#. js-lingui-id: KFmFrQ
#: src/emails/clean-suspended-workspace.email.tsx
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More