Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5cd28cce48 | ||
|
|
2e0237ef81 | ||
|
|
26e503b078 |
@@ -1,7 +1,6 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: ['plugin:prettier/recommended', 'plugin:lingui/recommended'],
|
||||
ignorePatterns: ['node_modules'],
|
||||
plugins: [
|
||||
'@nx',
|
||||
'prefer-arrow',
|
||||
+5
-114
@@ -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',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
@@ -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=${{ 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: ${{ steps.globals.outputs.CACHE_KEY_PREFIX }}-${{github.sha}}
|
||||
restore-keys: ${{ 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 == '' }}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
[
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -21,7 +21,7 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
danger-js:
|
||||
timeout-minutes: 5
|
||||
timeout-minutes: 3
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.action != 'closed'
|
||||
steps:
|
||||
|
||||
@@ -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
@@ -42,5 +42,4 @@ dump.rdb
|
||||
/flake.lock
|
||||
/flake.nix
|
||||
|
||||
.crowdin.yml
|
||||
.react-email/
|
||||
.crowdin.yml
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
+5
-7
@@ -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>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
// Open options page programmatically in a new tab.
|
||||
// chrome.runtime.onInstalled.addListener((details) => {
|
||||
// if (details.reason === 'install') {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
interface CustomDiv extends HTMLDivElement {
|
||||
onClickHandler: (newHandler: () => void) => void;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import { createDefaultButton } from '~/contentScript/createButton';
|
||||
import changeSidePanelUrl from '~/contentScript/utils/changeSidepanelUrl';
|
||||
import extractCompanyLinkedinLink from '~/contentScript/utils/extractCompanyLinkedinLink';
|
||||
import extractDomain from '~/contentScript/utils/extractDomain';
|
||||
import { createCompany, fetchCompany } from '~/db/company.db';
|
||||
import { CompanyInput } from '~/db/types/company.types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const checkIfCompanyExists = async () => {
|
||||
const { tab: activeTab } = await chrome.runtime.sendMessage({
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import { createDefaultButton } from '~/contentScript/createButton';
|
||||
import changeSidePanelUrl from '~/contentScript/utils/changeSidepanelUrl';
|
||||
import extractFirstAndLastName from '~/contentScript/utils/extractFirstAndLastName';
|
||||
import { createPerson, fetchPerson } from '~/db/person.db';
|
||||
import { PersonInput } from '~/db/types/person.types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const checkIfPersonExists = async () => {
|
||||
const { tab: activeTab } = await chrome.runtime.sendMessage({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import { insertButtonForCompany } from '~/contentScript/extractCompanyProfile';
|
||||
import { insertButtonForPerson } from '~/contentScript/extractPersonProfile';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
// Inject buttons into the DOM when SPA is reloaded on the resource url.
|
||||
// e.g. reload the page when on https://www.linkedin.com/in/mabdullahabaid/
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
const btn = document.getElementById('twenty-settings-btn');
|
||||
if (!isDefined(btn)) {
|
||||
const div = document.createElement('div');
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
const changeSidePanelUrl = async (url: string) => {
|
||||
if (isDefined(url)) {
|
||||
chrome.storage.local.set({ navigateSidepanel: 'sidepanel' });
|
||||
|
||||
+4
-1
@@ -1,4 +1,7 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
// Extract "https://www.linkedin.com/company/twenty/" from any of the following urls, which the user can visit while on the company page.
|
||||
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
// "https://www.linkedin.com/company/twenty/" "https://www.linkedin.com/company/twenty/about/" "https://www.linkedin.com/company/twenty/people/".
|
||||
const extractCompanyLinkedinLink = (activeTabUrl: string) => {
|
||||
// Regular expression to match the company ID
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import {
|
||||
ExchangeAuthCodeInput,
|
||||
ExchangeAuthCodeResponse,
|
||||
@@ -5,7 +6,6 @@ import {
|
||||
} from '~/db/types/auth.types';
|
||||
import { EXCHANGE_AUTHORIZATION_CODE } from '~/graphql/auth/mutations';
|
||||
import { callMutation } from '~/utils/requestDb';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const exchangeAuthorizationCode = async (
|
||||
exchangeAuthCodeInput: ExchangeAuthCodeInput,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import {
|
||||
CompanyInput,
|
||||
CreateCompanyResponse,
|
||||
@@ -8,7 +9,6 @@ import { CREATE_COMPANY } from '~/graphql/company/mutations';
|
||||
import { FIND_COMPANY } from '~/graphql/company/queries';
|
||||
|
||||
import { callMutation, callQuery } from '../utils/requestDb';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const fetchCompany = async (
|
||||
companyfilerInput: CompanyFilterInput,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import {
|
||||
CreatePersonResponse,
|
||||
FindPersonResponse,
|
||||
@@ -8,7 +9,6 @@ import { CREATE_PERSON } from '~/graphql/person/mutations';
|
||||
import { FIND_PERSON } from '~/graphql/person/queries';
|
||||
|
||||
import { callMutation, callQuery } from '../utils/requestDb';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const fetchPerson = async (
|
||||
personFilterData: PersonFilterInput,
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ApolloClient, InMemoryCache } from '@apollo/client';
|
||||
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import { Tokens } from '~/db/types/auth.types';
|
||||
import { RENEW_TOKEN } from '~/graphql/auth/mutations';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const renewToken = async (
|
||||
appToken: string,
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import Settings from '~/options/Settings';
|
||||
import Sidepanel from '~/options/Sidepanel';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
const App = () => {
|
||||
const [currentScreen, setCurrentScreen] = useState('');
|
||||
|
||||
@@ -3,8 +3,8 @@ import { useEffect, useState } from 'react';
|
||||
|
||||
import { MainButton } from '@/ui/input/button/MainButton';
|
||||
import { TextInput } from '@/ui/input/components/TextInput';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import { clearStore } from '~/utils/apolloClient';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
const StyledWrapper = styled.div`
|
||||
align-items: center;
|
||||
|
||||
@@ -2,7 +2,7 @@ import styled from '@emotion/styled';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
|
||||
import { MainButton } from '@/ui/input/button/MainButton';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
const StyledIframe = styled.iframe`
|
||||
display: block;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import styled from '@emotion/styled';
|
||||
import { motion } from 'framer-motion';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
export type ToggleSize = 'small' | 'medium';
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { ApolloClient, from, HttpLink, InMemoryCache } from '@apollo/client';
|
||||
import { setContext } from '@apollo/client/link/context';
|
||||
import { onError } from '@apollo/client/link/error';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { isDefined } from 'twenty-shared';
|
||||
|
||||
export const clearStore = () => {
|
||||
chrome.storage.local.remove([
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { OperationVariables } from '@apollo/client';
|
||||
import { DocumentNode } from 'graphql';
|
||||
|
||||
import { isDefined } from 'twenty-shared';
|
||||
import getApolloClient from '~/utils/apolloClient';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
export const callQuery = async <T>(
|
||||
query: DocumentNode,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ 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
|
||||
@@ -64,6 +63,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 +78,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
|
||||
|
||||
@@ -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 "$@"
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
{
|
||||
"name": "twenty-e2e-testing",
|
||||
"version": "0.44.12",
|
||||
"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();
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"presets": [
|
||||
[
|
||||
"@nx/react/babel",
|
||||
{
|
||||
"runtime": "automatic",
|
||||
"useBuiltIns": "usage"
|
||||
}
|
||||
]
|
||||
],
|
||||
"plugins": []
|
||||
}
|
||||
@@ -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,2 +1 @@
|
||||
dist
|
||||
.react-email/
|
||||
|
||||
@@ -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.
|
||||
@@ -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';
|
||||
|
||||
export default defineConfig({
|
||||
sourceLocale: 'en',
|
||||
locales: Object.values(APP_LOCALES),
|
||||
pseudoLocale: 'pseudo-en',
|
||||
fallbackLocales: {
|
||||
default: SOURCE_LOCALE,
|
||||
'pseudo-en': 'en',
|
||||
},
|
||||
extractorParserOptions: {
|
||||
tsExperimentalDecorators: true,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"name": "twenty-emails",
|
||||
"version": "0.44.12",
|
||||
"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": {
|
||||
".": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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,11 @@
|
||||
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 { APP_LOCALES, SOURCE_LOCALE } from 'twenty-shared';
|
||||
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';
|
||||
@@ -38,11 +38,10 @@ 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';
|
||||
|
||||
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,10 +1,9 @@
|
||||
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';
|
||||
import { Title } from 'src/components/Title';
|
||||
import { APP_LOCALES } from 'twenty-shared/translations';
|
||||
import { APP_LOCALES } from 'twenty-shared';
|
||||
|
||||
type CleanSuspendedWorkspaceEmailProps = {
|
||||
daysSinceInactive: number;
|
||||
@@ -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,11 +1,10 @@
|
||||
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';
|
||||
import { MainText } from 'src/components/MainText';
|
||||
import { Title } from 'src/components/Title';
|
||||
import { APP_LOCALES } from 'twenty-shared/translations';
|
||||
import { APP_LOCALES } from 'twenty-shared';
|
||||
|
||||
type PasswordResetLinkEmailProps = {
|
||||
duration: string;
|
||||
@@ -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,10 +1,12 @@
|
||||
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';
|
||||
import { Title } from 'src/components/Title';
|
||||
import { APP_LOCALES } from 'twenty-shared/translations';
|
||||
import { APP_LOCALES } from 'twenty-shared';
|
||||
|
||||
type PasswordUpdateNotifyEmailProps = {
|
||||
userName: string;
|
||||
@@ -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,10 +1,11 @@
|
||||
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';
|
||||
import { APP_LOCALES } from 'twenty-shared';
|
||||
|
||||
type SendEmailVerificationLinkEmailProps = {
|
||||
link: string;
|
||||
@@ -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';
|
||||
|
||||
@@ -12,8 +11,7 @@ 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';
|
||||
import { APP_LOCALES, getImageAbsoluteURI } from 'twenty-shared';
|
||||
|
||||
type SendInviteLinkEmailProps = {
|
||||
link: string;
|
||||
@@ -38,58 +36,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,9 +10,9 @@ 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';
|
||||
import { APP_LOCALES, getImageAbsoluteURI } from 'twenty-shared';
|
||||
|
||||
type SendApprovedAccessDomainValidationProps = {
|
||||
link: string;
|
||||
@@ -39,62 +39,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,10 +1,9 @@
|
||||
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';
|
||||
import { Title } from 'src/components/Title';
|
||||
import { APP_LOCALES } from 'twenty-shared/translations';
|
||||
import { APP_LOCALES } from 'twenty-shared';
|
||||
|
||||
type WarnSuspendedWorkspaceEmailProps = {
|
||||
daysSinceInactive: number;
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user