mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-08 02:23:43 +00:00
Compare commits
28 Commits
v0.14.0-be
...
v0.13.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5534ec4dd | ||
|
|
f2dda8cd95 | ||
|
|
c517a71361 | ||
|
|
848ca3a0c4 | ||
|
|
296362ced1 | ||
|
|
f1c70d5df0 | ||
|
|
c078f32a83 | ||
|
|
605a5abee8 | ||
|
|
0abd24654d | ||
|
|
35715ab1d8 | ||
|
|
1a873ecf3c | ||
|
|
0ce6401a6f | ||
|
|
d14552b5af | ||
|
|
7cd75824a4 | ||
|
|
c2847e2082 | ||
|
|
88d04e23e9 | ||
|
|
7526dea705 | ||
|
|
ef354f1643 | ||
|
|
8ed38d7c0d | ||
|
|
fbe7a346c6 | ||
|
|
f69649c922 | ||
|
|
e53744b740 | ||
|
|
4e7652f108 | ||
|
|
e24b6e4ddc | ||
|
|
ba9dad95b4 | ||
|
|
710edd28db | ||
|
|
d412635f6b | ||
|
|
bf88a36fac |
25
.github/workflows/build-selfhost-image.yml
vendored
Normal file
25
.github/workflows/build-selfhost-image.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
name: Build Selfhost Image
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
flavor:
|
||||
description: 'Select distribution to build'
|
||||
type: choice
|
||||
default: canary
|
||||
options:
|
||||
- canary
|
||||
- beta
|
||||
- stable
|
||||
|
||||
permissions:
|
||||
contents: 'write'
|
||||
id-token: 'write'
|
||||
packages: 'write'
|
||||
|
||||
jobs:
|
||||
build-image:
|
||||
name: Build Image
|
||||
uses: ./.github/workflows/build-server-image.yml
|
||||
with:
|
||||
flavor: ${{ github.event.inputs.flavor }}
|
||||
191
.github/workflows/build-server-image.yml
vendored
Normal file
191
.github/workflows/build-server-image.yml
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
name: Build Images
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
flavor:
|
||||
type: string
|
||||
required: true
|
||||
|
||||
env:
|
||||
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
|
||||
|
||||
permissions:
|
||||
contents: 'write'
|
||||
id-token: 'write'
|
||||
packages: 'write'
|
||||
|
||||
jobs:
|
||||
build-server:
|
||||
name: Build Server
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
id: version
|
||||
uses: ./.github/actions/setup-version
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
with:
|
||||
electron-install: false
|
||||
extra-flags: workspaces focus @affine/server
|
||||
- name: Build Server
|
||||
run: yarn workspace @affine/server build
|
||||
- name: Upload server dist
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: server-dist
|
||||
path: ./packages/backend/server/dist
|
||||
if-no-files-found: error
|
||||
|
||||
build-web-selfhost:
|
||||
name: Build @affine/web selfhost
|
||||
runs-on: ubuntu-latest
|
||||
environment: ${{ github.event.inputs.flavor }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
id: version
|
||||
uses: ./.github/actions/setup-version
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Build Core
|
||||
run: yarn nx build @affine/web --skip-nx-cache
|
||||
env:
|
||||
BUILD_TYPE: ${{ github.event.inputs.flavor }}
|
||||
SHOULD_REPORT_TRACE: false
|
||||
PUBLIC_PATH: '/'
|
||||
SELF_HOSTED: true
|
||||
- name: Download selfhost fonts
|
||||
run: node ./scripts/download-blocksuite-fonts.mjs
|
||||
- name: Upload web artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: selfhost-web
|
||||
path: ./packages/frontend/web/dist
|
||||
if-no-files-found: error
|
||||
|
||||
build-storage:
|
||||
name: Build Storage - ${{ matrix.targets.name }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
targets:
|
||||
- name: x86_64-unknown-linux-gnu
|
||||
file: storage.node
|
||||
- name: aarch64-unknown-linux-gnu
|
||||
file: storage.arm64.node
|
||||
- name: armv7-unknown-linux-gnueabihf
|
||||
file: storage.armv7.node
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
id: version
|
||||
uses: ./.github/actions/setup-version
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
with:
|
||||
electron-install: false
|
||||
extra-flags: workspaces focus @affine/storage
|
||||
- name: Build Rust
|
||||
uses: ./.github/actions/build-rust
|
||||
with:
|
||||
target: ${{ matrix.targets.name }}
|
||||
package: '@affine/storage'
|
||||
nx_token: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
|
||||
- name: Upload ${{ matrix.targets.file }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.targets.file }}
|
||||
path: ./packages/backend/storage/storage.node
|
||||
if-no-files-found: error
|
||||
|
||||
build-docker:
|
||||
name: Build Docker
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build-server
|
||||
- build-web-selfhost
|
||||
- build-storage
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Download server dist
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: server-dist
|
||||
path: ./packages/backend/server/dist
|
||||
- name: Download storage.node
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: storage.node
|
||||
path: ./packages/backend/server
|
||||
- name: Download storage.node arm64
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: storage.arm64.node
|
||||
path: ./packages/backend/storage
|
||||
- name: Download storage.node arm64
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: storage.armv7.node
|
||||
path: .
|
||||
- name: move storage files
|
||||
run: |
|
||||
mv ./packages/backend/storage/storage.node ./packages/backend/server/storage.arm64.node
|
||||
mv storage.node ./packages/backend/server/storage.armv7.node
|
||||
- name: Setup env
|
||||
run: |
|
||||
echo "GIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV"
|
||||
if [ -z "${{ inputs.flavor }}" ]
|
||||
then
|
||||
echo "RELEASE_FLAVOR=canary" >> "$GITHUB_ENV"
|
||||
else
|
||||
echo "RELEASE_FLAVOR=${{ inputs.flavor }}" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
logout: false
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
# setup node without cache configuration
|
||||
# Prisma cache is not compatible with docker build cache
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
registry-url: https://npm.pkg.github.com
|
||||
scope: '@toeverything'
|
||||
|
||||
- name: Download selfhost web artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: selfhost-web
|
||||
path: ./packages/frontend/web/dist
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: |
|
||||
yarn config set --json supportedArchitectures.cpu '["x64", "arm64", "arm"]'
|
||||
yarn config set --json supportedArchitectures.libc '["glibc"]'
|
||||
yarn workspaces focus @affine/server --production
|
||||
|
||||
- name: Generate Prisma client
|
||||
run: yarn workspace @affine/server prisma generate
|
||||
|
||||
- name: Build graphql Dockerfile
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
pull: true
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
provenance: true
|
||||
file: .github/deployment/node/Dockerfile
|
||||
tags: ghcr.io/toeverything/affine-graphql:${{env.RELEASE_FLAVOR}}-${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-graphql:${{env.RELEASE_FLAVOR}}
|
||||
4
.github/workflows/build-test.yml
vendored
4
.github/workflows/build-test.yml
vendored
@@ -280,8 +280,10 @@ jobs:
|
||||
- name: Build Web
|
||||
# always skip cache because its fast, and cache configuration is always changing
|
||||
run: yarn nx build @affine/web --skip-nx-cache
|
||||
env:
|
||||
DISTRIBUTION: 'desktop'
|
||||
- name: zip web
|
||||
run: tar -czf dist.tar.gz --directory=packages/frontend/web/dist .
|
||||
run: tar -czf dist.tar.gz --directory=packages/frontend/electron/dist .
|
||||
- name: Upload web artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
178
.github/workflows/deploy.yml
vendored
178
.github/workflows/deploy.yml
vendored
@@ -13,32 +13,21 @@ on:
|
||||
- stable
|
||||
- internal
|
||||
env:
|
||||
APP_NAME: affine
|
||||
NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
|
||||
MIXPANEL_TOKEN: '389c0615a69b57cca7d3fa0a4824c930'
|
||||
|
||||
permissions:
|
||||
contents: 'write'
|
||||
id-token: 'write'
|
||||
packages: 'write'
|
||||
|
||||
jobs:
|
||||
build-server:
|
||||
name: Build Server
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
id: version
|
||||
uses: ./.github/actions/setup-version
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
with:
|
||||
electron-install: false
|
||||
extra-flags: workspaces focus @affine/server
|
||||
- name: Build Server
|
||||
run: yarn workspace @affine/server build
|
||||
- name: Upload server dist
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: server-dist
|
||||
path: ./packages/backend/server/dist
|
||||
if-no-files-found: error
|
||||
build-server-image:
|
||||
name: Build Server Image
|
||||
uses: ./.github/workflows/build-server-image.yml
|
||||
with:
|
||||
flavor: ${{ github.event.inputs.flavor }}
|
||||
|
||||
build-web:
|
||||
name: Build @affine/web
|
||||
runs-on: ubuntu-latest
|
||||
@@ -72,112 +61,18 @@ jobs:
|
||||
path: ./packages/frontend/web/dist
|
||||
if-no-files-found: error
|
||||
|
||||
build-web-selfhost:
|
||||
name: Build @affine/web selfhost
|
||||
build-frontend-image:
|
||||
name: Build Frontend Image
|
||||
runs-on: ubuntu-latest
|
||||
environment: ${{ github.event.inputs.flavor }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
id: version
|
||||
uses: ./.github/actions/setup-version
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Build Core
|
||||
run: yarn nx build @affine/web --skip-nx-cache
|
||||
env:
|
||||
BUILD_TYPE: ${{ github.event.inputs.flavor }}
|
||||
SHOULD_REPORT_TRACE: false
|
||||
PUBLIC_PATH: '/'
|
||||
SELF_HOSTED: true
|
||||
- name: Download selfhost fonts
|
||||
run: node ./scripts/download-blocksuite-fonts.mjs
|
||||
- name: Upload web artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: selfhost-web
|
||||
path: ./packages/frontend/web/dist
|
||||
if-no-files-found: error
|
||||
|
||||
build-storage:
|
||||
name: Build Storage - ${{ matrix.targets.name }}
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
targets:
|
||||
- name: x86_64-unknown-linux-gnu
|
||||
file: storage.node
|
||||
- name: aarch64-unknown-linux-gnu
|
||||
file: storage.arm64.node
|
||||
- name: armv7-unknown-linux-gnueabihf
|
||||
file: storage.armv7.node
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
id: version
|
||||
uses: ./.github/actions/setup-version
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
with:
|
||||
electron-install: false
|
||||
extra-flags: workspaces focus @affine/storage
|
||||
- name: Build Rust
|
||||
uses: ./.github/actions/build-rust
|
||||
with:
|
||||
target: ${{ matrix.targets.name }}
|
||||
package: '@affine/storage'
|
||||
nx_token: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }}
|
||||
- name: Upload ${{ matrix.targets.file }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.targets.file }}
|
||||
path: ./packages/backend/storage/storage.node
|
||||
if-no-files-found: error
|
||||
|
||||
build-docker:
|
||||
name: Build Docker
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: 'write'
|
||||
id-token: 'write'
|
||||
packages: 'write'
|
||||
needs:
|
||||
- build-server
|
||||
- build-web
|
||||
- build-web-selfhost
|
||||
- build-storage
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Download core artifact
|
||||
- name: Download web artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: web
|
||||
path: ./packages/frontend/web/dist
|
||||
- name: Download server dist
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: server-dist
|
||||
path: ./packages/backend/server/dist
|
||||
- name: Download storage.node
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: storage.node
|
||||
path: ./packages/backend/server
|
||||
- name: Download storage.node arm64
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: storage.arm64.node
|
||||
path: ./packages/backend/storage
|
||||
- name: Download storage.node arm64
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: storage.armv7.node
|
||||
path: .
|
||||
- name: move storage files
|
||||
run: |
|
||||
mv ./packages/backend/storage/storage.node ./packages/backend/server/storage.arm64.node
|
||||
mv storage.node ./packages/backend/server/storage.armv7.node
|
||||
- name: Setup env
|
||||
run: |
|
||||
echo "GIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV"
|
||||
@@ -187,7 +82,6 @@ jobs:
|
||||
else
|
||||
echo "RELEASE_FLAVOR=${{ inputs.flavor }}" >> "$GITHUB_ENV"
|
||||
fi
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
@@ -210,53 +104,13 @@ jobs:
|
||||
file: .github/deployment/front/Dockerfile
|
||||
tags: ghcr.io/toeverything/affine-front:${{env.RELEASE_FLAVOR}}-${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-front:${{env.RELEASE_FLAVOR}}
|
||||
|
||||
# setup node without cache configuration
|
||||
# Prisma cache is not compatible with docker build cache
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: '.nvmrc'
|
||||
registry-url: https://npm.pkg.github.com
|
||||
scope: '@toeverything'
|
||||
|
||||
- name: Remove web dist
|
||||
run: rm -rf ./packages/frontend/web/dist
|
||||
|
||||
- name: Download selfhost web artifact
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: selfhost-web
|
||||
path: ./packages/frontend/web/dist
|
||||
|
||||
- name: Install Node.js dependencies
|
||||
run: |
|
||||
yarn config set --json supportedArchitectures.cpu '["x64", "arm64", "arm"]'
|
||||
yarn config set --json supportedArchitectures.libc '["glibc"]'
|
||||
yarn workspaces focus @affine/server --production
|
||||
|
||||
- name: Generate Prisma client
|
||||
run: yarn workspace @affine/server prisma generate
|
||||
|
||||
- name: Build graphql Dockerfile
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
pull: true
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
provenance: true
|
||||
file: .github/deployment/node/Dockerfile
|
||||
tags: ghcr.io/toeverything/affine-graphql:${{env.RELEASE_FLAVOR}}-${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-graphql:${{env.RELEASE_FLAVOR}}
|
||||
|
||||
deploy:
|
||||
name: Deploy to cluster
|
||||
if: ${{ github.event_name == 'workflow_dispatch' }}
|
||||
environment: ${{ github.event.inputs.flavor }}
|
||||
permissions:
|
||||
contents: 'write'
|
||||
id-token: 'write'
|
||||
needs:
|
||||
- build-docker
|
||||
- build-frontend-image
|
||||
- build-server-image
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
8
.github/workflows/release-desktop.yml
vendored
8
.github/workflows/release-desktop.yml
vendored
@@ -90,6 +90,10 @@ jobs:
|
||||
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||
SKIP_GENERATE_ASSETS: 1
|
||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
@@ -169,6 +173,10 @@ jobs:
|
||||
FILES_TO_BE_SIGNED: ${{ steps.get_files_to_be_signed.outputs.FILES_TO_BE_SIGNED }}
|
||||
env:
|
||||
SKIP_GENERATE_ASSETS: 1
|
||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
|
||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Version
|
||||
|
||||
18
README.md
18
README.md
@@ -10,7 +10,7 @@
|
||||
</a>
|
||||
<br/>
|
||||
<p align="center">
|
||||
A privacy-focussed, local-first, open-source, and ready-to-use alternative for Notion & Miro. <br />
|
||||
A privacy-focused, local-first, open-source, and ready-to-use alternative for Notion & Miro. <br />
|
||||
One hyper-fused platform for wildly creative minds.
|
||||
</p>
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
## Getting started & staying tuned with us.
|
||||
|
||||
Star us, and you will receive all releases notifications from GitHub without any delay!
|
||||
Star us, and you will receive all release notifications from GitHub without any delay!
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/79301703/230891830-0110681e-8c7e-483b-b6d9-9e42b291b9ef.gif" style="width: 100%"/>
|
||||
|
||||
@@ -65,7 +65,7 @@ AFFiNE is an open-source, all-in-one workspace and an operating system for all t
|
||||
|
||||
**Multimodal AI partner ready to kick in any work**
|
||||
|
||||
- Write up professional work report? Turn an outline into expressive and presentable slides? Summary an article into a well-structured mindmap? Sorting your job plan and backlog for tasks? Or....draw and code prototype apps and web pages directly all with one prompt? With you, AFFiNE AI pushes your creativity to the edge of your imagination.
|
||||
- Write up professional work report? Turn an outline into expressive and presentable slides? Summary an article into a well-structured mindmap? Sorting your job plan and backlog for tasks? Or... draw and code prototype apps and web pages directly all with one prompt? With you, AFFiNE AI pushes your creativity to the edge of your imagination.
|
||||
|
||||
**Local-first & Real-time collaborative**
|
||||
|
||||
@@ -73,7 +73,7 @@ AFFiNE is an open-source, all-in-one workspace and an operating system for all t
|
||||
|
||||
**Self-host & Shape your own AFFiNE**
|
||||
|
||||
- You have the freedom to manage, self-host, fork and build your own AFFiNE. Plugin community and third-party blocks is coming soon. More tractions on [Blocksuite](block-suite.com). Check there to learn how to [self-host AFFiNE](https://docs.affine.pro/docs/self-host-affine-).
|
||||
- You have the freedom to manage, self-host, fork and build your own AFFiNE. Plugin community and third-party blocks are coming soon. More tractions on [Blocksuite](block-suite.com). Check there to learn how to [self-host AFFiNE](https://docs.affine.pro/docs/self-host-affine-).
|
||||
|
||||
## Acknowledgement
|
||||
|
||||
@@ -83,7 +83,7 @@ AFFiNE is an open-source, all-in-one workspace and an operating system for all t
|
||||
- Trello with their Kanban
|
||||
- Airtable & Miro with their no-code programable datasheets
|
||||
- Miro & Whimiscal with their edgeless visual whiteboard
|
||||
- Remnote & Capacities with their object-based tag system
|
||||
- Remote & Capacities with their object-based tag system
|
||||
|
||||
There is a large overlap of their atomic “building blocks” between these apps. They are not open source, nor do they have a plugin system like Vscode for contributors to customize. We want to have something that contains all the features we love and also goes one step even further.
|
||||
|
||||
@@ -104,7 +104,7 @@ For **bug reports**, **feature requests** and other **suggestions** you can also
|
||||
|
||||
For **translation** and **language support** you can visit our [i18n General Space](https://community.affine.pro/c/i18n-general).
|
||||
|
||||
Looking for **others ways to contribute** and wondering where to start? Check out the [AFFiNE Ambassador program](https://community.affine.pro/c/start-here/affine-ambassador), we work closely with passionate community members and provide them with a wide-range of support and resources.
|
||||
Looking for **other ways to contribute** and wondering where to start? Check out the [AFFiNE Ambassador program](https://community.affine.pro/c/start-here/affine-ambassador), we work closely with passionate community members and provide them with a wide range of support and resources.
|
||||
|
||||
If you have questions, you are welcome to contact us. One of the best places to get more info and learn more is in the [AFFiNE Community](https://community.affine.pro) where you can engage with other like-minded individuals.
|
||||
|
||||
@@ -147,11 +147,11 @@ Begin with Docker to deploy your own feature-rich, unrestricted version of AFFiN
|
||||
|
||||
## Hiring
|
||||
|
||||
Some amazing companies including AFFiNE are looking for developers! Are you interesgo to iour discord channel AFFiNE and/or its partners? Check out some of the latest [jobs available].
|
||||
Some amazing companies, including AFFiNE, are looking for developers! Are you interested in joining AFFiNE or its partners? Check out our Discord channel for some of the latest jobs available.
|
||||
|
||||
## Feature Request
|
||||
|
||||
For feature request, please see [community.affine.pro](https://community.affine.pro/c/feature-requests/).
|
||||
For feature requests, please see [community.affine.pro](https://community.affine.pro/c/feature-requests/).
|
||||
|
||||
## Building
|
||||
|
||||
@@ -186,7 +186,7 @@ See [LICENSE] for details.
|
||||
[jobs available]: ./docs/jobs.md
|
||||
[latest packages]: https://github.com/toeverything/AFFiNE/pkgs/container/affine-self-hosted
|
||||
[contributor license agreement]: https://github.com/toeverything/affine/edit/canary/.github/CLA.md
|
||||
[rust-version-icon]: https://img.shields.io/badge/Rust-1.76.0-dea584
|
||||
[rust-version-icon]: https://img.shields.io/badge/Rust-1.77.0-dea584
|
||||
[stars-icon]: https://img.shields.io/github/stars/toeverything/AFFiNE.svg?style=flat&logo=github&colorB=red&label=stars
|
||||
[codecov]: https://codecov.io/gh/toeverything/affine/branch/canary/graphs/badge.svg?branch=canary
|
||||
[node-version-icon]: https://img.shields.io/badge/node-%3E=18.16.1-success
|
||||
|
||||
@@ -6,8 +6,8 @@ We recommend users to always use the latest major version. Security updates will
|
||||
|
||||
| Version | Supported |
|
||||
| --------------- | ------------------ |
|
||||
| 0.12.x (stable) | :white_check_mark: |
|
||||
| < 0.12.x | :x: |
|
||||
| 0.13.x (stable) | :white_check_mark: |
|
||||
| < 0.13.x | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
|
||||
@@ -5,20 +5,22 @@ import type {
|
||||
OperatorFunction,
|
||||
Subscription,
|
||||
TeardownLogic,
|
||||
ThrottleConfig,
|
||||
} from 'rxjs';
|
||||
import {
|
||||
BehaviorSubject,
|
||||
combineLatest,
|
||||
distinctUntilChanged,
|
||||
EMPTY,
|
||||
filter,
|
||||
map,
|
||||
mergeMap,
|
||||
Observable,
|
||||
of,
|
||||
scan,
|
||||
skip,
|
||||
Subject,
|
||||
switchMap,
|
||||
throttleTime,
|
||||
} from 'rxjs';
|
||||
|
||||
const logger = new DebugLogger('livedata');
|
||||
@@ -97,11 +99,10 @@ export class LiveData<T = unknown>
|
||||
? upstream$
|
||||
: stream$ =>
|
||||
stream$.pipe(
|
||||
filter(
|
||||
(op): op is Exclude<LiveDataOperation, 'set'> => op !== 'set'
|
||||
),
|
||||
switchMap(v => {
|
||||
if (v === 'get') {
|
||||
mergeMap(v => {
|
||||
if (v === 'set') {
|
||||
return EMPTY;
|
||||
} else if (v === 'get') {
|
||||
return of('watch' as const, 'unwatch' as const);
|
||||
} else {
|
||||
return of(v);
|
||||
@@ -333,6 +334,23 @@ export class LiveData<T = unknown>
|
||||
return sub$;
|
||||
}
|
||||
|
||||
distinctUntilChanged(comparator?: (previous: T, current: T) => boolean) {
|
||||
return LiveData.from(
|
||||
this.pipe(distinctUntilChanged(comparator)),
|
||||
null as any
|
||||
);
|
||||
}
|
||||
|
||||
throttleTime(
|
||||
duration: number,
|
||||
{ trailing = true, leading = true }: ThrottleConfig = {}
|
||||
) {
|
||||
return LiveData.from(
|
||||
this.pipe(throttleTime(duration, undefined, { trailing, leading })),
|
||||
null as any
|
||||
);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line rxjs/finnish
|
||||
asObservable(): Observable<T> {
|
||||
return new Observable<T>(subscriber => {
|
||||
|
||||
@@ -8,6 +8,7 @@ import type { Workspace, WorkspaceLocalState } from '../workspace';
|
||||
export type PageMode = 'edgeless' | 'page';
|
||||
|
||||
export class PageRecord {
|
||||
meta: Partial<DocMeta> | null = null;
|
||||
constructor(
|
||||
public readonly id: string,
|
||||
private readonly workspace: Workspace,
|
||||
@@ -15,15 +16,14 @@ export class PageRecord {
|
||||
) {}
|
||||
|
||||
meta$ = LiveData.from<Partial<DocMeta>>(
|
||||
new Observable<DocMeta>(subscriber => {
|
||||
new Observable<Partial<DocMeta>>(subscriber => {
|
||||
const emit = () => {
|
||||
const meta = this.workspace.docCollection.meta.docMetas.find(
|
||||
page => page.id === this.id
|
||||
);
|
||||
if (meta === undefined) {
|
||||
return;
|
||||
if (this.meta === null) {
|
||||
// getDocMeta is heavy, so we cache the doc meta reference
|
||||
this.meta =
|
||||
this.workspace.docCollection.meta.getDocMeta(this.id) || null;
|
||||
}
|
||||
subscriber.next(meta);
|
||||
subscriber.next({ ...this.meta });
|
||||
};
|
||||
|
||||
emit();
|
||||
|
||||
@@ -228,6 +228,7 @@ export class DocEngineLocalPart {
|
||||
}
|
||||
if (job.isInitialize && !isEmptyUpdate(job.update)) {
|
||||
this.status.readyDocs.add(job.docId);
|
||||
this.statusUpdatedSubject$.next(job.docId);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -146,7 +146,10 @@ export class DocEngineRemotePart {
|
||||
await this.jobs.pullAndPush(docId, signal);
|
||||
} else {
|
||||
const pulled = await this.storage.loadDocServerClockPulled(docId);
|
||||
if (pulled === null || pulled !== this.status.serverClocks.get(docId)) {
|
||||
if (
|
||||
pulled === null ||
|
||||
pulled !== this.status.serverClocks.get(normalizeServerDocId(docId))
|
||||
) {
|
||||
await this.jobs.pull(docId, signal);
|
||||
}
|
||||
}
|
||||
@@ -204,10 +207,13 @@ export class DocEngineRemotePart {
|
||||
serverClock,
|
||||
} = serverData;
|
||||
await this.storage.saveServerClock(
|
||||
new Map([[docId, serverClock]]),
|
||||
new Map([[normalizeServerDocId(docId), serverClock]]),
|
||||
signal
|
||||
);
|
||||
this.actions.updateServerClock(docId, serverClock);
|
||||
this.actions.updateServerClock(
|
||||
normalizeServerDocId(docId),
|
||||
serverClock
|
||||
);
|
||||
await this.storage.commitDocAsServerUpdate(
|
||||
docId,
|
||||
newData,
|
||||
@@ -242,10 +248,13 @@ export class DocEngineRemotePart {
|
||||
signal
|
||||
);
|
||||
await this.storage.saveServerClock(
|
||||
new Map([[docId, serverClock]]),
|
||||
new Map([[normalizeServerDocId(docId), serverClock]]),
|
||||
signal
|
||||
);
|
||||
this.actions.updateServerClock(docId, serverClock);
|
||||
this.actions.updateServerClock(
|
||||
normalizeServerDocId(docId),
|
||||
serverClock
|
||||
);
|
||||
}
|
||||
await this.storage.saveDocPushedSeqNum(docId, seqNum, signal);
|
||||
}
|
||||
@@ -275,10 +284,10 @@ export class DocEngineRemotePart {
|
||||
update: newData,
|
||||
});
|
||||
await this.storage.saveServerClock(
|
||||
new Map([[docId, serverClock]]),
|
||||
new Map([[normalizeServerDocId(docId), serverClock]]),
|
||||
signal
|
||||
);
|
||||
this.actions.updateServerClock(docId, serverClock);
|
||||
this.actions.updateServerClock(normalizeServerDocId(docId), serverClock);
|
||||
},
|
||||
save: async (
|
||||
docId: string,
|
||||
@@ -287,10 +296,10 @@ export class DocEngineRemotePart {
|
||||
) => {
|
||||
const serverClock = jobs.reduce((a, b) => Math.max(a, b.serverClock), 0);
|
||||
await this.storage.saveServerClock(
|
||||
new Map([[docId, serverClock]]),
|
||||
new Map([[normalizeServerDocId(docId), serverClock]]),
|
||||
signal
|
||||
);
|
||||
this.actions.updateServerClock(docId, serverClock);
|
||||
this.actions.updateServerClock(normalizeServerDocId(docId), serverClock);
|
||||
if (this.status.connectedDocs.has(docId)) {
|
||||
const data = jobs
|
||||
.map(j => j.update)
|
||||
@@ -543,3 +552,48 @@ export class DocEngineRemotePart {
|
||||
this.status.jobDocQueue.updatePriority(docId, priority);
|
||||
}
|
||||
}
|
||||
|
||||
// use normalized id in server clock
|
||||
function normalizeServerDocId(raw: string) {
|
||||
enum DocVariant {
|
||||
Workspace = 'workspace',
|
||||
Page = 'page',
|
||||
Space = 'space',
|
||||
Settings = 'settings',
|
||||
Unknown = 'unknown',
|
||||
}
|
||||
|
||||
try {
|
||||
if (!raw.length) {
|
||||
throw new Error('Invalid Empty Doc ID');
|
||||
}
|
||||
|
||||
let parts = raw.split(':');
|
||||
|
||||
if (parts.length > 3) {
|
||||
// special adapt case `wsId:space:page:pageId`
|
||||
if (parts[1] === DocVariant.Space && parts[2] === DocVariant.Page) {
|
||||
parts = [parts[0], DocVariant.Space, parts[3]];
|
||||
} else {
|
||||
throw new Error(`Invalid format of Doc ID: ${raw}`);
|
||||
}
|
||||
} else if (parts.length === 2) {
|
||||
// `${variant}:${guid}`
|
||||
throw new Error('not supported');
|
||||
} else if (parts.length === 1) {
|
||||
// ${ws} or ${pageId}
|
||||
parts = ['', DocVariant.Unknown, parts[0]];
|
||||
}
|
||||
|
||||
const docId = parts.at(2);
|
||||
|
||||
if (!docId) {
|
||||
throw new Error('ID is required');
|
||||
}
|
||||
|
||||
return docId;
|
||||
} catch (err) {
|
||||
logger.error('Error on normalize docId ' + raw, err);
|
||||
return raw;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import { useDarkMode } from 'storybook-dark-mode';
|
||||
|
||||
import type { Preview } from '@storybook/react';
|
||||
import React from 'react';
|
||||
import { ConfirmModalProvider } from '../src/ui/modal/confirm-modal';
|
||||
|
||||
export const parameters: Preview = {
|
||||
argTypes: {
|
||||
@@ -53,9 +54,11 @@ export const decorators = [
|
||||
(Story: ComponentType, context) => {
|
||||
return (
|
||||
<ThemeProvider themes={['dark', 'light']} enableSystem={true}>
|
||||
<ThemeChange />
|
||||
<Component />
|
||||
<Story {...context} />
|
||||
<ConfirmModalProvider>
|
||||
<ThemeChange />
|
||||
<Component />
|
||||
<Story {...context} />
|
||||
</ConfirmModalProvider>
|
||||
</ThemeProvider>
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import { UNTITLED_WORKSPACE_NAME } from '@affine/env/constant';
|
||||
import type { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { CollaborationIcon, SettingsIcon } from '@blocksuite/icons';
|
||||
import type { WorkspaceMetadata } from '@toeverything/infra';
|
||||
import { useCallback } from 'react';
|
||||
import clsx from 'clsx';
|
||||
import { type MouseEvent, useCallback } from 'react';
|
||||
|
||||
import { Avatar, type AvatarProps } from '../../../ui/avatar';
|
||||
import { Button } from '../../../ui/button';
|
||||
import { Skeleton } from '../../../ui/skeleton';
|
||||
import * as styles from './styles.css';
|
||||
|
||||
@@ -18,7 +20,10 @@ export interface WorkspaceCardProps {
|
||||
meta: WorkspaceMetadata;
|
||||
onClick: (metadata: WorkspaceMetadata) => void;
|
||||
onSettingClick: (metadata: WorkspaceMetadata) => void;
|
||||
onEnableCloudClick?: (meta: WorkspaceMetadata) => void;
|
||||
isOwner?: boolean;
|
||||
openingId?: string | null;
|
||||
enableCloudText?: string;
|
||||
avatar?: string;
|
||||
name?: string;
|
||||
}
|
||||
@@ -45,13 +50,25 @@ const avatarImageProps = {
|
||||
export const WorkspaceCard = ({
|
||||
onClick,
|
||||
onSettingClick,
|
||||
onEnableCloudClick,
|
||||
openingId,
|
||||
currentWorkspaceId,
|
||||
meta,
|
||||
isOwner = true,
|
||||
enableCloudText = 'Enable Cloud',
|
||||
name,
|
||||
avatar,
|
||||
}: WorkspaceCardProps) => {
|
||||
const isLocal = meta.flavour === WorkspaceFlavour.LOCAL;
|
||||
const displayName = name ?? UNTITLED_WORKSPACE_NAME;
|
||||
|
||||
const onEnableCloud = useCallback(
|
||||
(e: MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
onEnableCloudClick?.(meta);
|
||||
},
|
||||
[meta, onEnableCloudClick]
|
||||
);
|
||||
return (
|
||||
<div
|
||||
className={styles.card}
|
||||
@@ -73,6 +90,17 @@ export const WorkspaceCard = ({
|
||||
<div className={styles.workspaceTitle}>{displayName}</div>
|
||||
|
||||
<div className={styles.actionButtons}>
|
||||
{isLocal ? (
|
||||
<Button
|
||||
loading={!!openingId && openingId === meta.id}
|
||||
disabled={!!openingId}
|
||||
type="default"
|
||||
className={clsx(styles.enableCloudButton, styles.showOnCardHover)}
|
||||
onClick={onEnableCloud}
|
||||
>
|
||||
{enableCloudText}
|
||||
</Button>
|
||||
) : null}
|
||||
{isOwner ? null : <CollaborationIcon />}
|
||||
<div
|
||||
className={styles.settingButton}
|
||||
|
||||
@@ -84,3 +84,16 @@ export const settingButton = style({
|
||||
// },
|
||||
},
|
||||
});
|
||||
|
||||
export const enableCloudButton = style({
|
||||
background: 'transparent',
|
||||
});
|
||||
|
||||
export const showOnCardHover = style({
|
||||
display: 'none',
|
||||
selectors: {
|
||||
[`.${card}:hover &`]: {
|
||||
display: 'block',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -5,6 +5,8 @@ import { Provider } from 'jotai';
|
||||
import type { PropsWithChildren } from 'react';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import { ConfirmModalProvider } from '../../ui/modal';
|
||||
|
||||
export type AffineContextProps = PropsWithChildren<{
|
||||
store?: ReturnType<typeof createStore>;
|
||||
}>;
|
||||
@@ -17,6 +19,7 @@ export function AffineContext(props: AffineContextProps) {
|
||||
[
|
||||
<Provider key="JotaiProvider" store={props.store} />,
|
||||
<ThemeProvider key="ThemeProvider" />,
|
||||
<ConfirmModalProvider key="ConfirmModalProvider" />,
|
||||
].filter(Boolean),
|
||||
[props.store]
|
||||
)}
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
import type { DragEndEvent } from '@dnd-kit/core';
|
||||
import {
|
||||
DndContext,
|
||||
PointerSensor,
|
||||
useSensor,
|
||||
useSensors,
|
||||
} from '@dnd-kit/core';
|
||||
import { DndContext, MouseSensor, useSensor, useSensors } from '@dnd-kit/core';
|
||||
import {
|
||||
restrictToParentElement,
|
||||
restrictToVerticalAxis,
|
||||
@@ -24,8 +19,10 @@ export interface WorkspaceListProps {
|
||||
disabled?: boolean;
|
||||
currentWorkspaceId?: string | null;
|
||||
items: WorkspaceMetadata[];
|
||||
openingId?: string | null;
|
||||
onClick: (workspace: WorkspaceMetadata) => void;
|
||||
onSettingClick: (workspace: WorkspaceMetadata) => void;
|
||||
onEnableCloudClick?: (meta: WorkspaceMetadata) => void;
|
||||
onDragEnd: (event: DragEndEvent) => void;
|
||||
useIsWorkspaceOwner: (workspaceMetadata: WorkspaceMetadata) => boolean;
|
||||
useWorkspaceAvatar: (
|
||||
@@ -43,12 +40,14 @@ interface SortableWorkspaceItemProps extends Omit<WorkspaceListProps, 'items'> {
|
||||
const SortableWorkspaceItem = ({
|
||||
disabled,
|
||||
item,
|
||||
openingId,
|
||||
useIsWorkspaceOwner,
|
||||
useWorkspaceAvatar,
|
||||
useWorkspaceName,
|
||||
currentWorkspaceId,
|
||||
onClick,
|
||||
onSettingClick,
|
||||
onEnableCloudClick,
|
||||
}: SortableWorkspaceItemProps) => {
|
||||
const { setNodeRef, attributes, listeners, transform, transition } =
|
||||
useSortable({
|
||||
@@ -82,6 +81,8 @@ const SortableWorkspaceItem = ({
|
||||
meta={item}
|
||||
onClick={onClick}
|
||||
onSettingClick={onSettingClick}
|
||||
onEnableCloudClick={onEnableCloudClick}
|
||||
openingId={openingId}
|
||||
isOwner={isOwner}
|
||||
name={name}
|
||||
avatar={avatar}
|
||||
@@ -94,7 +95,7 @@ const modifiers = [restrictToParentElement, restrictToVerticalAxis];
|
||||
|
||||
export const WorkspaceList = (props: WorkspaceListProps) => {
|
||||
const sensors = useSensors(
|
||||
useSensor(PointerSensor, {
|
||||
useSensor(MouseSensor, {
|
||||
activationConstraint: {
|
||||
distance: 8,
|
||||
},
|
||||
|
||||
@@ -112,7 +112,7 @@ export const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(
|
||||
{colorfulFallback ? (
|
||||
<ColorfulFallback char={firstCharOfName} />
|
||||
) : (
|
||||
firstCharOfName
|
||||
firstCharOfName.toUpperCase()
|
||||
)}
|
||||
</AvatarFallback>
|
||||
{hoverIcon ? (
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
import type { Meta } from '@storybook/react';
|
||||
|
||||
import { Button } from '../button';
|
||||
import {
|
||||
ConfirmModal,
|
||||
type ConfirmModalProps,
|
||||
useConfirmModal,
|
||||
} from './confirm-modal';
|
||||
|
||||
export default {
|
||||
title: 'UI/Modal/Confirm Modal',
|
||||
component: ConfirmModal,
|
||||
argTypes: {},
|
||||
} satisfies Meta<ConfirmModalProps>;
|
||||
|
||||
export const UsingHook = () => {
|
||||
const { openConfirmModal } = useConfirmModal();
|
||||
|
||||
const onConfirm = () =>
|
||||
new Promise<void>(resolve => setTimeout(resolve, 2000));
|
||||
|
||||
const showConfirm = () => {
|
||||
openConfirmModal({
|
||||
cancelText: 'Cancel',
|
||||
confirmButtonOptions: {
|
||||
children: 'Confirm',
|
||||
},
|
||||
title: 'Confirm Modal',
|
||||
children: 'Are you sure you want to confirm?',
|
||||
onConfirm,
|
||||
onCancel: () => {
|
||||
console.log('Cancelled');
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
return <Button onClick={showConfirm}>Show confirm</Button>;
|
||||
};
|
||||
@@ -1,5 +1,7 @@
|
||||
import { DialogTrigger } from '@radix-ui/react-dialog';
|
||||
import clsx from 'clsx';
|
||||
import type { PropsWithChildren } from 'react';
|
||||
import { createContext, useCallback, useContext, useState } from 'react';
|
||||
|
||||
import type { ButtonProps } from '../button';
|
||||
import { Button } from '../button';
|
||||
@@ -9,9 +11,11 @@ import * as styles from './styles.css';
|
||||
|
||||
export interface ConfirmModalProps extends ModalProps {
|
||||
confirmButtonOptions?: ButtonProps;
|
||||
onConfirm?: () => void;
|
||||
onConfirm?: (() => void) | (() => Promise<void>);
|
||||
onCancel?: () => void;
|
||||
cancelText?: string;
|
||||
cancelButtonOptions?: ButtonProps;
|
||||
reverseFooter?: boolean;
|
||||
}
|
||||
|
||||
export const ConfirmModal = ({
|
||||
@@ -20,7 +24,9 @@ export const ConfirmModal = ({
|
||||
// FIXME: we need i18n
|
||||
cancelText = 'Cancel',
|
||||
cancelButtonOptions,
|
||||
reverseFooter,
|
||||
onConfirm,
|
||||
onCancel,
|
||||
width = 480,
|
||||
...props
|
||||
}: ConfirmModalProps) => {
|
||||
@@ -36,13 +42,105 @@ export const ConfirmModal = ({
|
||||
<div
|
||||
className={clsx(styles.modalFooter, {
|
||||
modalFooterWithChildren: !!children,
|
||||
reverse: reverseFooter,
|
||||
})}
|
||||
>
|
||||
<DialogTrigger asChild>
|
||||
<Button {...cancelButtonOptions}>{cancelText}</Button>
|
||||
<Button onClick={onCancel} {...cancelButtonOptions}>
|
||||
{cancelText}
|
||||
</Button>
|
||||
</DialogTrigger>
|
||||
<Button onClick={onConfirm} {...confirmButtonOptions}></Button>
|
||||
</div>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
interface OpenConfirmModalOptions {
|
||||
autoClose?: boolean;
|
||||
onSuccess?: () => void;
|
||||
}
|
||||
interface ConfirmModalContextProps {
|
||||
modalProps: ConfirmModalProps;
|
||||
openConfirmModal: (
|
||||
props?: ConfirmModalProps,
|
||||
options?: OpenConfirmModalOptions
|
||||
) => void;
|
||||
closeConfirmModal: () => void;
|
||||
}
|
||||
const ConfirmModalContext = createContext<ConfirmModalContextProps>({
|
||||
modalProps: { open: false },
|
||||
openConfirmModal: () => {},
|
||||
closeConfirmModal: () => {},
|
||||
});
|
||||
export const ConfirmModalProvider = ({ children }: PropsWithChildren) => {
|
||||
const [modalProps, setModalProps] = useState<ConfirmModalProps>({
|
||||
open: false,
|
||||
});
|
||||
|
||||
const setLoading = useCallback((value: boolean) => {
|
||||
setModalProps(prev => ({
|
||||
...prev,
|
||||
confirmButtonOptions: {
|
||||
...prev.confirmButtonOptions,
|
||||
loading: value,
|
||||
},
|
||||
}));
|
||||
}, []);
|
||||
|
||||
const closeConfirmModal = useCallback(() => {
|
||||
setModalProps({ open: false });
|
||||
}, []);
|
||||
|
||||
const openConfirmModal = useCallback(
|
||||
(props?: ConfirmModalProps, options?: OpenConfirmModalOptions) => {
|
||||
const { autoClose = true, onSuccess } = options ?? {};
|
||||
if (!props) {
|
||||
setModalProps({ open: true });
|
||||
return;
|
||||
}
|
||||
|
||||
const { onConfirm: _onConfirm, ...otherProps } = props;
|
||||
|
||||
const onConfirm = () => {
|
||||
setLoading(true);
|
||||
_onConfirm?.()
|
||||
?.then(() => onSuccess?.())
|
||||
.catch(console.error)
|
||||
.finally(() => autoClose && closeConfirmModal());
|
||||
};
|
||||
setModalProps({ ...otherProps, onConfirm, open: true });
|
||||
},
|
||||
[closeConfirmModal, setLoading]
|
||||
);
|
||||
|
||||
const onOpenChange = useCallback(
|
||||
(open: boolean) => {
|
||||
modalProps.onOpenChange?.(open);
|
||||
setModalProps(props => ({ ...props, open }));
|
||||
},
|
||||
[modalProps]
|
||||
);
|
||||
|
||||
return (
|
||||
<ConfirmModalContext.Provider
|
||||
value={{ openConfirmModal, closeConfirmModal, modalProps }}
|
||||
>
|
||||
{children}
|
||||
{/* TODO: multi-instance support(unnecessary for now) */}
|
||||
<ConfirmModal {...modalProps} onOpenChange={onOpenChange} />
|
||||
</ConfirmModalContext.Provider>
|
||||
);
|
||||
};
|
||||
export const useConfirmModal = () => {
|
||||
const context = useContext(ConfirmModalContext);
|
||||
if (!context) {
|
||||
throw new Error(
|
||||
'useConfirmModal must be used within a ConfirmModalProvider'
|
||||
);
|
||||
}
|
||||
return {
|
||||
openConfirmModal: context.openConfirmModal,
|
||||
closeConfirmModal: context.closeConfirmModal,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -65,6 +65,10 @@ export const modalFooter = style({
|
||||
'&.modalFooterWithChildren': {
|
||||
paddingTop: '20px',
|
||||
},
|
||||
'&.reverse': {
|
||||
flexDirection: 'row-reverse',
|
||||
justifyContent: 'flex-start',
|
||||
},
|
||||
},
|
||||
});
|
||||
export const confirmModalContent = style({
|
||||
|
||||
@@ -4,6 +4,7 @@ import type {
|
||||
TooltipProps as RootProps,
|
||||
} from '@radix-ui/react-tooltip';
|
||||
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
|
||||
import clsx from 'clsx';
|
||||
import type { ReactElement, ReactNode } from 'react';
|
||||
|
||||
import * as styles from './styles.css';
|
||||
@@ -32,6 +33,7 @@ export const Tooltip = ({
|
||||
if (!content) {
|
||||
return children;
|
||||
}
|
||||
const { className, ...contentOptions } = options || {};
|
||||
return (
|
||||
<TooltipPrimitive.Provider>
|
||||
<TooltipPrimitive.Root delayDuration={500} {...rootOptions}>
|
||||
@@ -39,12 +41,12 @@ export const Tooltip = ({
|
||||
|
||||
<TooltipPrimitive.Portal {...portalOptions}>
|
||||
<TooltipPrimitive.Content
|
||||
className={styles.tooltipContent}
|
||||
className={clsx(styles.tooltipContent, className)}
|
||||
side={side}
|
||||
align={align}
|
||||
sideOffset={5}
|
||||
style={{ zIndex: 'var(--affine-z-index-popover)' }}
|
||||
{...options}
|
||||
{...contentOptions}
|
||||
>
|
||||
{content}
|
||||
<TooltipPrimitive.Arrow
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
"exports": {
|
||||
"./app": "./src/app.tsx",
|
||||
"./router": "./src/router.tsx",
|
||||
"./bootstrap/setup": "./src/bootstrap/setup.ts",
|
||||
"./bootstrap/register-plugins": "./src/bootstrap/register-plugins.ts",
|
||||
"./*": "./src/*"
|
||||
},
|
||||
@@ -34,6 +33,7 @@
|
||||
"@emotion/react": "^11.11.3",
|
||||
"@emotion/server": "^11.11.0",
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@juggle/resize-observer": "^3.4.0",
|
||||
"@marsidev/react-turnstile": "^0.5.3",
|
||||
"@radix-ui/react-collapsible": "^1.0.3",
|
||||
"@radix-ui/react-dialog": "^1.0.5",
|
||||
@@ -42,8 +42,8 @@
|
||||
"@radix-ui/react-select": "^2.0.0",
|
||||
"@radix-ui/react-toolbar": "^1.0.4",
|
||||
"@react-hookz/web": "^24.0.4",
|
||||
"@sentry/integrations": "^7.102.1",
|
||||
"@sentry/react": "^7.102.1",
|
||||
"@sentry/integrations": "^7.108.0",
|
||||
"@sentry/react": "^7.108.0",
|
||||
"@toeverything/theme": "^0.7.29",
|
||||
"@vanilla-extract/dynamic": "^2.1.0",
|
||||
"animejs": "^3.2.2",
|
||||
|
||||
25
packages/frontend/core/public/robots.txt
Normal file
25
packages/frontend/core/public/robots.txt
Normal file
@@ -0,0 +1,25 @@
|
||||
# If you would like to crawl AFFiNE public workspace contact us via developer@toeverything.info
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
Disallow: /oauth/*
|
||||
Disallow: /workspace/*
|
||||
Disallow: /public-workspace/*
|
||||
Disallow: /auth/*
|
||||
Disallow: /signin/*
|
||||
Disallow: /_next/*
|
||||
Disallow: /invite/*
|
||||
Disallow: /*/invite/*
|
||||
Disallow: /api/*
|
||||
|
||||
User-agent: PetalBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: BLEXBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Bytespider
|
||||
Disallow: /
|
||||
|
||||
User-agent: Barkrowler
|
||||
Disallow: /
|
||||
10
packages/frontend/core/src/bootstrap/preload.ts
Normal file
10
packages/frontend/core/src/bootstrap/preload.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import '@affine/env/constant';
|
||||
import './register-blocksuite-components';
|
||||
import './edgeless-template';
|
||||
|
||||
import { setupGlobal } from '@affine/env/global';
|
||||
import { ResizeObserver } from '@juggle/resize-observer';
|
||||
|
||||
setupGlobal();
|
||||
|
||||
window.ResizeObserver = ResizeObserver;
|
||||
@@ -1,73 +0,0 @@
|
||||
import './register-blocksuite-components';
|
||||
import './edgeless-template';
|
||||
|
||||
import { apis, events } from '@affine/electron-api';
|
||||
import { setupGlobal } from '@affine/env/global';
|
||||
import * as Sentry from '@sentry/react';
|
||||
import { debounce } from 'lodash-es';
|
||||
import { useEffect } from 'react';
|
||||
import {
|
||||
createRoutesFromChildren,
|
||||
matchRoutes,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
} from 'react-router-dom';
|
||||
|
||||
import { appConfigProxy } from '../hooks/use-app-config-storage';
|
||||
import { performanceLogger } from '../shared';
|
||||
|
||||
const performanceSetupLogger = performanceLogger.namespace('setup');
|
||||
|
||||
export function setup() {
|
||||
performanceSetupLogger.info('start');
|
||||
|
||||
performanceSetupLogger.info('setup global');
|
||||
setupGlobal();
|
||||
|
||||
if (window.SENTRY_RELEASE || environment.isDebug) {
|
||||
// https://docs.sentry.io/platforms/javascript/guides/react/#configure
|
||||
Sentry.init({
|
||||
dsn: process.env.SENTRY_DSN,
|
||||
environment: process.env.BUILD_TYPE ?? 'development',
|
||||
integrations: [
|
||||
new Sentry.BrowserTracing({
|
||||
routingInstrumentation: Sentry.reactRouterV6Instrumentation(
|
||||
useEffect,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
createRoutesFromChildren,
|
||||
matchRoutes
|
||||
),
|
||||
}),
|
||||
new Sentry.Replay(),
|
||||
],
|
||||
// Set tracesSampleRate to 1.0 to capture 100%
|
||||
// of transactions for performance monitoring.
|
||||
tracesSampleRate: 1.0,
|
||||
});
|
||||
Sentry.setTags({
|
||||
appVersion: runtimeConfig.appVersion,
|
||||
editorVersion: runtimeConfig.editorVersion,
|
||||
});
|
||||
}
|
||||
|
||||
// load persistent config for electron
|
||||
// TODO: should be sync, but it's not necessary for now
|
||||
if (environment.isDesktop) {
|
||||
appConfigProxy
|
||||
.getSync()
|
||||
.catch(() => console.error('failed to load app config'));
|
||||
const handleMaximized = (maximized: boolean | undefined) => {
|
||||
document.documentElement.dataset.maximized = String(maximized);
|
||||
};
|
||||
apis?.ui.isMaximized().then(handleMaximized).catch(console.error);
|
||||
events?.ui.onMaximized(handleMaximized);
|
||||
|
||||
const handleResize = debounce(() => {
|
||||
apis?.ui.handleWindowResize().catch(console.error);
|
||||
}, 50);
|
||||
window.addEventListener('resize', handleResize);
|
||||
}
|
||||
|
||||
performanceSetupLogger.info('done');
|
||||
}
|
||||
@@ -35,20 +35,26 @@ export const SignInWithPassword: FC<AuthPanelProps> = ({
|
||||
isMutating: sendingEmail,
|
||||
} = useAuth();
|
||||
const [verifyToken, challenge] = useCaptcha();
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
|
||||
const onSignIn = useAsyncCallback(async () => {
|
||||
if (isLoading) return;
|
||||
setIsLoading(true);
|
||||
|
||||
const res = await signInCloud('credentials', {
|
||||
email,
|
||||
password,
|
||||
}).catch(console.error);
|
||||
|
||||
if (!res?.ok) {
|
||||
return setPasswordError(true);
|
||||
if (res?.ok) {
|
||||
await reload();
|
||||
onSignedIn?.();
|
||||
} else {
|
||||
setPasswordError(true);
|
||||
}
|
||||
|
||||
await reload();
|
||||
onSignedIn?.();
|
||||
}, [email, password, onSignedIn, reload]);
|
||||
setIsLoading(false);
|
||||
}, [email, password, isLoading, onSignedIn, reload]);
|
||||
|
||||
const sendMagicLink = useAsyncCallback(async () => {
|
||||
if (allowSendEmail && verifyToken && !sendingEmail) {
|
||||
@@ -134,6 +140,7 @@ export const SignInWithPassword: FC<AuthPanelProps> = ({
|
||||
type="primary"
|
||||
size="extraLarge"
|
||||
style={{ width: '100%' }}
|
||||
disabled={isLoading}
|
||||
onClick={onSignIn}
|
||||
>
|
||||
{t['com.affine.auth.sign.in']()}
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
import type { ConfirmModalProps } from '@affine/component/ui/modal';
|
||||
import { ConfirmModal } from '@affine/component/ui/modal';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { authAtom } from '../../../atoms';
|
||||
import { setOnceSignedInEventAtom } from '../../../atoms/event';
|
||||
import { useCurrentLoginStatus } from '../../../hooks/affine/use-current-login-status';
|
||||
|
||||
export const EnableAffineCloudModal = ({
|
||||
onConfirm: propsOnConfirm,
|
||||
...props
|
||||
}: ConfirmModalProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const loginStatus = useCurrentLoginStatus();
|
||||
const setAuthAtom = useSetAtom(authAtom);
|
||||
const setOnceSignedInEvent = useSetAtom(setOnceSignedInEventAtom);
|
||||
|
||||
const confirm = useCallback(() => {
|
||||
return propsOnConfirm?.();
|
||||
}, [propsOnConfirm]);
|
||||
|
||||
const onConfirm = useCallback(() => {
|
||||
if (loginStatus === 'unauthenticated') {
|
||||
setAuthAtom(prev => ({
|
||||
...prev,
|
||||
openModal: true,
|
||||
}));
|
||||
setOnceSignedInEvent(confirm);
|
||||
}
|
||||
if (loginStatus === 'authenticated') {
|
||||
return propsOnConfirm?.();
|
||||
}
|
||||
}, [confirm, loginStatus, propsOnConfirm, setAuthAtom, setOnceSignedInEvent]);
|
||||
|
||||
return (
|
||||
<ConfirmModal
|
||||
title={t['Enable AFFiNE Cloud']()}
|
||||
description={t['Enable AFFiNE Cloud Description']()}
|
||||
cancelText={t['com.affine.enableAffineCloudModal.button.cancel']()}
|
||||
onConfirm={onConfirm}
|
||||
confirmButtonOptions={{
|
||||
type: 'primary',
|
||||
['data-testid' as string]: 'confirm-enable-affine-cloud-button',
|
||||
children:
|
||||
loginStatus === 'authenticated'
|
||||
? t['Enable']()
|
||||
: t['Sign in and Enable'](),
|
||||
}}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
@@ -3,64 +3,43 @@ import {
|
||||
openDisableCloudAlertModalAtom,
|
||||
openHistoryTipsModalAtom,
|
||||
} from '@affine/core/atoms';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useNavigateHelper } from '@affine/core/hooks/use-navigate-helper';
|
||||
import { WorkspaceSubPath } from '@affine/core/shared';
|
||||
import { useEnableCloud } from '@affine/core/hooks/affine/use-enable-cloud';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useService, Workspace, WorkspaceManager } from '@toeverything/infra';
|
||||
import { useService, Workspace } from '@toeverything/infra';
|
||||
import { useAtom, useSetAtom } from 'jotai';
|
||||
import { useCallback, useState } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { EnableAffineCloudModal } from '../enable-affine-cloud-modal';
|
||||
import TopSvg from './top-svg';
|
||||
|
||||
export const HistoryTipsModal = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
const { openPage } = useNavigateHelper();
|
||||
const workspaceManager = useService(WorkspaceManager);
|
||||
const currentWorkspace = useService(Workspace);
|
||||
const [open, setOpen] = useAtom(openHistoryTipsModalAtom);
|
||||
const setTempDisableCloudOpen = useSetAtom(openDisableCloudAlertModalAtom);
|
||||
const [openEnableCloudModal, setOpenEnableCloudModal] = useState(false);
|
||||
const confirmEnableCloud = useEnableCloud();
|
||||
|
||||
const handleConfirm = useCallback(() => {
|
||||
setOpen(false);
|
||||
if (runtimeConfig.enableCloud) {
|
||||
return setOpenEnableCloudModal(true);
|
||||
}
|
||||
return setTempDisableCloudOpen(true);
|
||||
}, [setOpen, setTempDisableCloudOpen]);
|
||||
|
||||
const handEnableCloud = useAsyncCallback(async () => {
|
||||
if (!currentWorkspace) {
|
||||
confirmEnableCloud(currentWorkspace);
|
||||
return;
|
||||
}
|
||||
const { id: newId } =
|
||||
await workspaceManager.transformLocalToCloud(currentWorkspace);
|
||||
openPage(newId, WorkspaceSubPath.ALL);
|
||||
setOpenEnableCloudModal(false);
|
||||
}, [openPage, currentWorkspace, workspaceManager]);
|
||||
return setTempDisableCloudOpen(true);
|
||||
}, [confirmEnableCloud, currentWorkspace, setOpen, setTempDisableCloudOpen]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<OverlayModal
|
||||
open={open}
|
||||
topImage={<TopSvg />}
|
||||
title={t['com.affine.history-vision.tips-modal.title']()}
|
||||
onOpenChange={setOpen}
|
||||
description={t['com.affine.history-vision.tips-modal.description']()}
|
||||
cancelText={t['com.affine.history-vision.tips-modal.cancel']()}
|
||||
confirmButtonOptions={{
|
||||
type: 'primary',
|
||||
}}
|
||||
onConfirm={handleConfirm}
|
||||
confirmText={t['com.affine.history-vision.tips-modal.confirm']()}
|
||||
/>
|
||||
<EnableAffineCloudModal
|
||||
open={openEnableCloudModal}
|
||||
onOpenChange={setOpenEnableCloudModal}
|
||||
onConfirm={handEnableCloud}
|
||||
/>
|
||||
</>
|
||||
<OverlayModal
|
||||
open={open}
|
||||
topImage={<TopSvg />}
|
||||
title={t['com.affine.history-vision.tips-modal.title']()}
|
||||
onOpenChange={setOpen}
|
||||
description={t['com.affine.history-vision.tips-modal.description']()}
|
||||
cancelText={t['com.affine.history-vision.tips-modal.cancel']()}
|
||||
confirmButtonOptions={{
|
||||
type: 'primary',
|
||||
}}
|
||||
onConfirm={handleConfirm}
|
||||
confirmText={t['com.affine.history-vision.tips-modal.confirm']()}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import { Menu, MenuItem, MenuTrigger } from '@affine/component/ui/menu';
|
||||
import { DoneIcon } from '@blocksuite/icons';
|
||||
import type { ReactElement } from 'react';
|
||||
import { memo } from 'react';
|
||||
|
||||
import { useLanguageHelper } from '../../../hooks/affine/use-language-helper';
|
||||
import * as styles from './style.css';
|
||||
|
||||
// Fixme: keyboard focus should be supported by Menu component
|
||||
const LanguageMenuContent = memo(function LanguageMenuContent() {
|
||||
@@ -11,15 +13,21 @@ const LanguageMenuContent = memo(function LanguageMenuContent() {
|
||||
return (
|
||||
<>
|
||||
{languagesList.map(option => {
|
||||
const selected = currentLanguage?.originalName === option.originalName;
|
||||
return (
|
||||
<MenuItem
|
||||
key={option.name}
|
||||
selected={currentLanguage?.originalName === option.originalName}
|
||||
title={option.name}
|
||||
lang={option.tag}
|
||||
onSelect={() => onLanguageChange(option.tag)}
|
||||
endFix={(option.Completeness * 100).toFixed(0) + '%'}
|
||||
data-selected={selected}
|
||||
className={styles.menuItem}
|
||||
>
|
||||
{option.originalName}
|
||||
<div className={styles.languageLabelWrapper}>
|
||||
<div>{option.originalName}</div>
|
||||
{selected && <DoneIcon fontSize={'16px'} />}
|
||||
</div>
|
||||
</MenuItem>
|
||||
);
|
||||
})}
|
||||
@@ -33,10 +41,7 @@ export const LanguageMenu = () => {
|
||||
<Menu
|
||||
items={(<LanguageMenuContent />) as ReactElement}
|
||||
contentOptions={{
|
||||
style: {
|
||||
background: 'var(--affine-white)',
|
||||
width: '250px',
|
||||
},
|
||||
className: styles.menu,
|
||||
align: 'end',
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -1,5 +1,24 @@
|
||||
import { cssVar } from '@toeverything/theme';
|
||||
import { style } from '@vanilla-extract/css';
|
||||
export const hoveredLanguageItem = style({
|
||||
background: cssVar('hoverColor'),
|
||||
export const menu = style({
|
||||
background: cssVar('white'),
|
||||
width: '250px',
|
||||
maxHeight: '30vh',
|
||||
overflowY: 'auto',
|
||||
});
|
||||
|
||||
export const menuItem = style({
|
||||
color: cssVar('textPrimaryColor'),
|
||||
selectors: {
|
||||
'&[data-selected=true]': {
|
||||
color: cssVar('primaryColor'),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const languageLabelWrapper = style({
|
||||
display: 'flex',
|
||||
justifyContent: 'space-between',
|
||||
alignItems: 'center',
|
||||
marginRight: '8px',
|
||||
});
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import { Loading, Scrollable } from '@affine/component';
|
||||
import { EditorLoading } from '@affine/component/page-detail-skeleton';
|
||||
import { Button, IconButton } from '@affine/component/ui/button';
|
||||
import { ConfirmModal, Modal } from '@affine/component/ui/modal';
|
||||
import { Modal, useConfirmModal } from '@affine/component/ui/modal';
|
||||
import { openSettingModalAtom } from '@affine/core/atoms';
|
||||
import { useIsWorkspaceOwner } from '@affine/core/hooks/affine/use-is-workspace-owner';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useDocCollectionPageTitle } from '@affine/core/hooks/use-block-suite-workspace-page-title';
|
||||
import { useWorkspaceQuota } from '@affine/core/hooks/use-workspace-quota';
|
||||
import { Trans } from '@affine/i18n';
|
||||
@@ -374,51 +373,6 @@ const PageHistoryList = ({
|
||||
);
|
||||
};
|
||||
|
||||
interface ConfirmRestoreModalProps {
|
||||
open: boolean;
|
||||
onConfirm: (res: boolean) => void;
|
||||
isMutating: boolean;
|
||||
}
|
||||
|
||||
const ConfirmRestoreModal = ({
|
||||
isMutating,
|
||||
open,
|
||||
onConfirm,
|
||||
}: ConfirmRestoreModalProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const handleConfirm = useCallback(() => {
|
||||
onConfirm(true);
|
||||
}, [onConfirm]);
|
||||
|
||||
const handleCancel = useCallback(() => {
|
||||
onConfirm(false);
|
||||
}, [onConfirm]);
|
||||
|
||||
return (
|
||||
<ConfirmModal
|
||||
open={open}
|
||||
onOpenChange={handleCancel}
|
||||
title={t['com.affine.history.restore-current-version']()}
|
||||
description={t['com.affine.history.confirm-restore-modal.hint']()}
|
||||
cancelText={t['Cancel']()}
|
||||
contentOptions={{
|
||||
['data-testid' as string]: 'confirm-restore-history-modal',
|
||||
style: {
|
||||
padding: '20px 26px',
|
||||
},
|
||||
}}
|
||||
confirmButtonOptions={{
|
||||
loading: isMutating,
|
||||
type: 'primary',
|
||||
['data-testid' as string]: 'confirm-restore-history-button',
|
||||
children: t['com.affine.history.confirm-restore-modal.restore'](),
|
||||
}}
|
||||
onConfirm={handleConfirm}
|
||||
></ConfirmModal>
|
||||
);
|
||||
};
|
||||
|
||||
const EmptyHistoryPrompt = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
@@ -453,6 +407,7 @@ const PageHistoryManager = ({
|
||||
const pageDocId = useMemo(() => {
|
||||
return docCollection.getDoc(pageId)?.spaceDoc.guid ?? pageId;
|
||||
}, [pageId, docCollection]);
|
||||
const { openConfirmModal } = useConfirmModal();
|
||||
|
||||
const snapshotPage = useSnapshotPage(docCollection, pageDocId, activeVersion);
|
||||
|
||||
@@ -478,21 +433,23 @@ const PageHistoryManager = ({
|
||||
|
||||
const title = useDocCollectionPageTitle(docCollection, pageId);
|
||||
|
||||
const [showRestoreConfirmModal, setShowRestoreConfirmModal] = useState(false);
|
||||
|
||||
const showRestoreConfirm = useCallback(() => {
|
||||
setShowRestoreConfirmModal(true);
|
||||
}, []);
|
||||
|
||||
const onConfirmRestore = useAsyncCallback(
|
||||
async res => {
|
||||
if (res) {
|
||||
await handleRestore();
|
||||
}
|
||||
setShowRestoreConfirmModal(false);
|
||||
},
|
||||
[handleRestore]
|
||||
);
|
||||
const onConfirmRestore = useCallback(() => {
|
||||
openConfirmModal({
|
||||
title: t['com.affine.history.restore-current-version'](),
|
||||
description: t['com.affine.history.confirm-restore-modal.hint'](),
|
||||
cancelText: t['Cancel'](),
|
||||
contentOptions: {
|
||||
['data-testid' as string]: 'confirm-restore-history-modal',
|
||||
style: { padding: '20px 26px' },
|
||||
},
|
||||
confirmButtonOptions: {
|
||||
type: 'primary',
|
||||
['data-testid' as string]: 'confirm-restore-history-button',
|
||||
children: t['com.affine.history.confirm-restore-modal.restore'](),
|
||||
},
|
||||
onConfirm: handleRestore,
|
||||
});
|
||||
}, [handleRestore, openConfirmModal, t]);
|
||||
|
||||
const [historyList, loadMore, loadingMore] = useDocSnapshotList(
|
||||
workspaceId,
|
||||
@@ -533,18 +490,12 @@ const PageHistoryManager = ({
|
||||
<div className={styles.spacer} />
|
||||
<Button
|
||||
type="primary"
|
||||
onClick={showRestoreConfirm}
|
||||
onClick={onConfirmRestore}
|
||||
disabled={isMutating || !activeVersion}
|
||||
>
|
||||
{t['com.affine.history.restore-current-version']()}
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<ConfirmRestoreModal
|
||||
open={showRestoreConfirmModal}
|
||||
isMutating={isMutating}
|
||||
onConfirm={onConfirmRestore}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -55,7 +55,7 @@ export const ConfirmLoadingModal = ({
|
||||
onOpenChange={onOpenChange}
|
||||
onConfirm={() => {
|
||||
confirmed.current = true;
|
||||
onConfirm?.();
|
||||
onConfirm?.()?.catch(console.error);
|
||||
}}
|
||||
{...props}
|
||||
>
|
||||
|
||||
@@ -13,6 +13,7 @@ import * as styles from './style.css';
|
||||
|
||||
interface WorkspaceDeleteProps extends ConfirmModalProps {
|
||||
workspaceMetadata: WorkspaceMetadata;
|
||||
onConfirm?: () => void;
|
||||
}
|
||||
|
||||
export const WorkspaceDeleteModal = ({
|
||||
|
||||
@@ -1,19 +1,15 @@
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { Button } from '@affine/component/ui/button';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { useEnableCloud } from '@affine/core/hooks/affine/use-enable-cloud';
|
||||
import { useWorkspaceInfo } from '@affine/core/hooks/use-workspace-info';
|
||||
import { UNTITLED_WORKSPACE_NAME } from '@affine/env/constant';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { Workspace } from '@toeverything/infra';
|
||||
import { useService, WorkspaceManager } from '@toeverything/infra';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { useState } from 'react';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import { openSettingModalAtom } from '../../../../../atoms';
|
||||
import { useNavigateHelper } from '../../../../../hooks/use-navigate-helper';
|
||||
import { WorkspaceSubPath } from '../../../../../shared';
|
||||
import { EnableAffineCloudModal } from '../../../enable-affine-cloud-modal';
|
||||
import { TmpDisableAffineCloudModal } from '../../../tmp-disable-affine-cloud-modal';
|
||||
import type { WorkspaceSettingDetailProps } from './types';
|
||||
|
||||
@@ -26,28 +22,21 @@ export const EnableCloudPanel = ({
|
||||
workspace,
|
||||
}: PublishPanelProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const confirmEnableCloud = useEnableCloud();
|
||||
|
||||
const { openPage } = useNavigateHelper();
|
||||
|
||||
const workspaceManager = useService(WorkspaceManager);
|
||||
const workspaceInfo = useWorkspaceInfo(workspaceMetadata);
|
||||
const setSettingModal = useSetAtom(openSettingModalAtom);
|
||||
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const handleEnableCloud = useAsyncCallback(async () => {
|
||||
if (!workspace) {
|
||||
return;
|
||||
}
|
||||
const { id: newId } =
|
||||
await workspaceManager.transformLocalToCloud(workspace);
|
||||
openPage(newId, WorkspaceSubPath.ALL);
|
||||
setOpen(false);
|
||||
setSettingModal(settings => ({
|
||||
...settings,
|
||||
open: false,
|
||||
}));
|
||||
}, [openPage, setSettingModal, workspace, workspaceManager]);
|
||||
const confirmEnableCloudAndClose = useCallback(() => {
|
||||
if (!workspace) return;
|
||||
confirmEnableCloud(workspace, {
|
||||
onSuccess: () => {
|
||||
setSettingModal(settings => ({ ...settings, open: false }));
|
||||
},
|
||||
});
|
||||
}, [confirmEnableCloud, setSettingModal, workspace]);
|
||||
|
||||
if (workspaceMetadata.flavour !== WorkspaceFlavour.LOCAL) {
|
||||
return null;
|
||||
@@ -69,21 +58,13 @@ export const EnableCloudPanel = ({
|
||||
<Button
|
||||
data-testid="publish-enable-affine-cloud-button"
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
setOpen(true);
|
||||
}}
|
||||
onClick={confirmEnableCloudAndClose}
|
||||
style={{ marginTop: '12px' }}
|
||||
>
|
||||
{t['Enable AFFiNE Cloud']()}
|
||||
</Button>
|
||||
</SettingRow>
|
||||
{runtimeConfig.enableCloud ? (
|
||||
<EnableAffineCloudModal
|
||||
open={open}
|
||||
onOpenChange={setOpen}
|
||||
onConfirm={handleEnableCloud}
|
||||
/>
|
||||
) : (
|
||||
{runtimeConfig.enableCloud ? null : (
|
||||
<TmpDisableAffineCloudModal open={open} onOpenChange={setOpen} />
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { useEnableCloud } from '@affine/core/hooks/affine/use-enable-cloud';
|
||||
import type { Doc } from '@blocksuite/store';
|
||||
import type { Workspace } from '@toeverything/infra';
|
||||
import { useService, WorkspaceManager } from '@toeverything/infra';
|
||||
import { useState } from 'react';
|
||||
|
||||
import { useNavigateHelper } from '../../../hooks/use-navigate-helper';
|
||||
import { EnableAffineCloudModal } from '../enable-affine-cloud-modal';
|
||||
import { ShareMenu } from './share-menu';
|
||||
|
||||
type SharePageModalProps = {
|
||||
@@ -20,37 +15,18 @@ export const SharePageButton = ({
|
||||
page,
|
||||
isJournal,
|
||||
}: SharePageModalProps) => {
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const { openPage } = useNavigateHelper();
|
||||
|
||||
const workspaceManager = useService(WorkspaceManager);
|
||||
|
||||
const handleConfirm = useAsyncCallback(async () => {
|
||||
if (workspace.flavour !== WorkspaceFlavour.LOCAL) {
|
||||
return;
|
||||
}
|
||||
const { id: newId } =
|
||||
await workspaceManager.transformLocalToCloud(workspace);
|
||||
openPage(newId, page.id);
|
||||
setOpen(false);
|
||||
}, [openPage, page.id, workspace, workspaceManager]);
|
||||
const confirmEnableCloud = useEnableCloud();
|
||||
|
||||
return (
|
||||
<>
|
||||
<ShareMenu
|
||||
isJournal={isJournal}
|
||||
workspaceMetadata={workspace.meta}
|
||||
currentPage={page}
|
||||
onEnableAffineCloud={() => setOpen(true)}
|
||||
/>
|
||||
{workspace.flavour === WorkspaceFlavour.LOCAL ? (
|
||||
<EnableAffineCloudModal
|
||||
open={open}
|
||||
onOpenChange={setOpen}
|
||||
onConfirm={handleConfirm}
|
||||
/>
|
||||
) : null}
|
||||
</>
|
||||
<ShareMenu
|
||||
isJournal={isJournal}
|
||||
workspaceMetadata={workspace.meta}
|
||||
currentPage={page}
|
||||
onEnableAffineCloud={() =>
|
||||
confirmEnableCloud(workspace, {
|
||||
openPageId: page.id,
|
||||
})
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -45,7 +45,7 @@ export const navHeaderStyle = style({
|
||||
});
|
||||
|
||||
globalStyle(
|
||||
`html[data-maximized="false"]
|
||||
`html[data-fullscreen="false"]
|
||||
${navHeaderStyle}[data-is-macos-electron="true"]`,
|
||||
{
|
||||
paddingLeft: '90px',
|
||||
|
||||
@@ -9,6 +9,18 @@ export const editor = style({
|
||||
},
|
||||
},
|
||||
},
|
||||
'@media': {
|
||||
'screen and (max-width: 800px)': {
|
||||
selectors: {
|
||||
'&.is-public': {
|
||||
vars: {
|
||||
'--affine-editor-width': '100%',
|
||||
'--affine-editor-side-padding': '24px',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
globalStyle(
|
||||
`${editor} .affine-page-viewport:not(.affine-embed-synced-doc-editor)`,
|
||||
|
||||
@@ -104,7 +104,8 @@ const PageDetailEditorMain = memo(function PageDetailEditorMain({
|
||||
return (
|
||||
<Editor
|
||||
className={clsx(styles.editor, {
|
||||
'full-screen': appSettings.fullWidthLayout,
|
||||
'full-screen': !isPublic && appSettings.fullWidthLayout,
|
||||
'is-public': isPublic,
|
||||
})}
|
||||
style={
|
||||
{
|
||||
|
||||
@@ -106,6 +106,7 @@ export const titleCell = style({
|
||||
maxWidth: 'calc(100% - 64px)',
|
||||
flex: 1,
|
||||
whiteSpace: 'nowrap',
|
||||
userSelect: 'none',
|
||||
});
|
||||
export const titleCellMain = style({
|
||||
overflow: 'hidden',
|
||||
|
||||
@@ -5,6 +5,7 @@ import type { PropsWithChildren } from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import { selectionStateAtom, useAtom } from '../scoped-atoms';
|
||||
import type {
|
||||
CollectionListItemProps,
|
||||
DraggableTitleCellData,
|
||||
@@ -172,14 +173,28 @@ function CollectionListItemWrapper({
|
||||
children,
|
||||
draggable,
|
||||
}: collectionListWrapperProps) {
|
||||
const [selectionState, setSelectionActive] = useAtom(selectionStateAtom);
|
||||
const handleClick = useCallback(
|
||||
(e: React.MouseEvent) => {
|
||||
if (onClick) {
|
||||
if (!selectionState.selectable) {
|
||||
return;
|
||||
}
|
||||
if (e.shiftKey) {
|
||||
stopPropagation(e);
|
||||
onClick();
|
||||
setSelectionActive(true);
|
||||
onClick?.();
|
||||
return;
|
||||
}
|
||||
if (selectionState.selectionActive) {
|
||||
return onClick?.();
|
||||
}
|
||||
},
|
||||
[onClick]
|
||||
[
|
||||
onClick,
|
||||
selectionState.selectable,
|
||||
selectionState.selectionActive,
|
||||
setSelectionActive,
|
||||
]
|
||||
);
|
||||
|
||||
const commonProps = useMemo(
|
||||
|
||||
@@ -106,6 +106,7 @@ export const titleCell = style({
|
||||
maxWidth: 'calc(100% - 64px)',
|
||||
flex: 1,
|
||||
whiteSpace: 'nowrap',
|
||||
userSelect: 'none',
|
||||
});
|
||||
export const titleCellMain = style({
|
||||
overflow: 'hidden',
|
||||
|
||||
@@ -6,6 +6,7 @@ import type { PropsWithChildren } from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
|
||||
import { WorkbenchLink } from '../../../modules/workbench/view/workbench-link';
|
||||
import { selectionStateAtom, useAtom } from '../scoped-atoms';
|
||||
import type { DraggableTitleCellData, PageListItemProps } from '../types';
|
||||
import { usePageDisplayProperties } from '../use-page-display-properties';
|
||||
import { ColWrapper, formatDate, stopPropagation } from '../utils';
|
||||
@@ -237,14 +238,22 @@ function PageListItemWrapper({
|
||||
children,
|
||||
draggable,
|
||||
}: PageListWrapperProps) {
|
||||
const [selectionState, setSelectionActive] = useAtom(selectionStateAtom);
|
||||
const handleClick = useCallback(
|
||||
(e: React.MouseEvent) => {
|
||||
if (onClick) {
|
||||
stopPropagation(e);
|
||||
onClick();
|
||||
if (!selectionState.selectable) {
|
||||
return false;
|
||||
}
|
||||
stopPropagation(e);
|
||||
if (e.shiftKey) {
|
||||
setSelectionActive(true);
|
||||
onClick?.();
|
||||
return true;
|
||||
}
|
||||
onClick?.();
|
||||
return false;
|
||||
},
|
||||
[onClick]
|
||||
[onClick, selectionState.selectable, setSelectionActive]
|
||||
);
|
||||
|
||||
const commonProps = useMemo(
|
||||
@@ -255,7 +264,7 @@ function PageListItemWrapper({
|
||||
className: styles.root,
|
||||
'data-clickable': !!onClick || !!to,
|
||||
'data-dragging': isDragging,
|
||||
onClick: handleClick,
|
||||
onClick: onClick ? handleClick : undefined,
|
||||
}),
|
||||
[pageId, draggable, onClick, to, isDragging, handleClick]
|
||||
);
|
||||
|
||||
@@ -25,6 +25,7 @@ export const pageCount = style({
|
||||
fontSize: cssVar('fontBase'),
|
||||
lineHeight: '1.6em',
|
||||
color: cssVar('textSecondaryColor'),
|
||||
marginRight: '12px',
|
||||
});
|
||||
|
||||
export const favouritedIcon = style({
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Tag } from '@affine/core/modules/tag';
|
||||
import { TagService } from '@affine/core/modules/tag';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { FavoritedIcon, FavoriteIcon } from '@blocksuite/icons';
|
||||
@@ -28,7 +29,7 @@ const GroupLabel = ({
|
||||
id,
|
||||
}: {
|
||||
id: string;
|
||||
label: string;
|
||||
label: ReactNode;
|
||||
count: number;
|
||||
icon?: ReactNode;
|
||||
}) => (
|
||||
@@ -115,30 +116,38 @@ export const useDateGroupDefinitions = <T extends ListItem>(
|
||||
[key, t]
|
||||
);
|
||||
};
|
||||
|
||||
const GroupTagLabel = ({ tag, count }: { tag: Tag; count: number }) => {
|
||||
const tagValue = useLiveData(tag.value$);
|
||||
const tagColor = useLiveData(tag.color$);
|
||||
return (
|
||||
<GroupLabel
|
||||
id={tag.id}
|
||||
label={tagValue}
|
||||
count={count}
|
||||
icon={
|
||||
<div
|
||||
className={styles.tagIcon}
|
||||
style={{
|
||||
backgroundColor: tagColor,
|
||||
}}
|
||||
></div>
|
||||
}
|
||||
></GroupLabel>
|
||||
);
|
||||
};
|
||||
export const useTagGroupDefinitions = (): ItemGroupDefinition<ListItem>[] => {
|
||||
const tagService = useService(TagService);
|
||||
const tagMetas = useLiveData(tagService.tagMetas$);
|
||||
const tags = useLiveData(tagService.tags$);
|
||||
return useMemo(() => {
|
||||
return tagMetas.map(tag => ({
|
||||
return tags.map(tag => ({
|
||||
id: tag.id,
|
||||
label: count => (
|
||||
<GroupLabel
|
||||
id={tag.title}
|
||||
label={tag.title}
|
||||
count={count}
|
||||
icon={
|
||||
<div
|
||||
className={styles.tagIcon}
|
||||
style={{
|
||||
backgroundColor: tag.color,
|
||||
}}
|
||||
></div>
|
||||
}
|
||||
/>
|
||||
),
|
||||
label: count => {
|
||||
return <GroupTagLabel tag={tag} count={count} />;
|
||||
},
|
||||
match: item => (item as DocMeta).tags?.includes(tag.id),
|
||||
}));
|
||||
}, [tagMetas]);
|
||||
}, [tags]);
|
||||
};
|
||||
|
||||
export const useFavoriteGroupDefinitions = <
|
||||
|
||||
@@ -67,6 +67,7 @@ const useItemSelectionStateEffect = () => {
|
||||
return;
|
||||
}
|
||||
setSelectionActive(false);
|
||||
selectionState.onSelectedIdsChange?.([]);
|
||||
};
|
||||
|
||||
const escHandler = (e: KeyboardEvent) => {
|
||||
@@ -75,6 +76,7 @@ const useItemSelectionStateEffect = () => {
|
||||
}
|
||||
if (e.key === 'Escape') {
|
||||
setSelectionActive(false);
|
||||
selectionState.onSelectedIdsChange?.([]);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -88,6 +90,7 @@ const useItemSelectionStateEffect = () => {
|
||||
}
|
||||
return;
|
||||
}, [
|
||||
selectionState,
|
||||
selectionState.selectable,
|
||||
selectionState.selectionActive,
|
||||
setSelectionActive,
|
||||
|
||||
@@ -329,7 +329,7 @@ function pageMetaToListItemProp(
|
||||
createDate: new Date(item.createDate),
|
||||
updatedDate: item.updatedDate ? new Date(item.updatedDate) : undefined,
|
||||
to: props.rowAsLink && !props.selectable ? `/${item.id}` : undefined,
|
||||
onClick: props.selectable ? toggleSelection : undefined,
|
||||
onClick: toggleSelection,
|
||||
icon: (
|
||||
<UnifiedPageIcon
|
||||
id={item.id}
|
||||
@@ -378,7 +378,7 @@ function collectionMetaToListItemProp(
|
||||
props.rowAsLink && !props.selectable
|
||||
? `/collection/${item.id}`
|
||||
: undefined,
|
||||
onClick: props.selectable ? toggleSelection : undefined,
|
||||
onClick: toggleSelection,
|
||||
icon: <ViewLayersIcon />,
|
||||
operations: props.operationsRenderer?.(item),
|
||||
selectable: props.selectable,
|
||||
@@ -412,7 +412,7 @@ function tagMetaToListItemProp(
|
||||
tagId: item.id,
|
||||
title: item.title,
|
||||
to: props.rowAsLink && !props.selectable ? `/tag/${item.id}` : undefined,
|
||||
onClick: props.selectable ? toggleSelection : undefined,
|
||||
onClick: toggleSelection,
|
||||
color: item.color,
|
||||
pageCount: item.pageCount,
|
||||
operations: props.operationsRenderer?.(item),
|
||||
|
||||
@@ -105,6 +105,7 @@ export const titleCell = style({
|
||||
maxWidth: 'calc(100% - 64px)',
|
||||
flex: 1,
|
||||
whiteSpace: 'nowrap',
|
||||
userSelect: 'none',
|
||||
});
|
||||
export const titleCellMain = style({
|
||||
overflow: 'hidden',
|
||||
@@ -112,7 +113,7 @@ export const titleCellMain = style({
|
||||
fontWeight: 600,
|
||||
whiteSpace: 'nowrap',
|
||||
textOverflow: 'ellipsis',
|
||||
alignSelf: 'stretch',
|
||||
alignSelf: 'center',
|
||||
paddingRight: '4px',
|
||||
});
|
||||
export const titleCellPreview = style({
|
||||
@@ -122,7 +123,7 @@ export const titleCellPreview = style({
|
||||
flexShrink: 0,
|
||||
whiteSpace: 'nowrap',
|
||||
textOverflow: 'ellipsis',
|
||||
alignSelf: 'stretch',
|
||||
alignSelf: 'center',
|
||||
});
|
||||
export const iconCell = style({
|
||||
display: 'flex',
|
||||
|
||||
@@ -5,6 +5,7 @@ import type { PropsWithChildren } from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
|
||||
import { selectionStateAtom, useAtom } from '../scoped-atoms';
|
||||
import type { DraggableTitleCellData, TagListItemProps } from '../types';
|
||||
import { ColWrapper, stopPropagation } from '../utils';
|
||||
import * as styles from './tag-list-item.css';
|
||||
@@ -165,14 +166,28 @@ function TagListItemWrapper({
|
||||
children,
|
||||
draggable,
|
||||
}: TagListWrapperProps) {
|
||||
const [selectionState, setSelectionActive] = useAtom(selectionStateAtom);
|
||||
const handleClick = useCallback(
|
||||
(e: React.MouseEvent) => {
|
||||
if (onClick) {
|
||||
if (!selectionState.selectable) {
|
||||
return;
|
||||
}
|
||||
if (e.shiftKey) {
|
||||
stopPropagation(e);
|
||||
onClick();
|
||||
setSelectionActive(true);
|
||||
onClick?.();
|
||||
return;
|
||||
}
|
||||
if (selectionState.selectionActive) {
|
||||
return onClick?.();
|
||||
}
|
||||
},
|
||||
[onClick]
|
||||
[
|
||||
onClick,
|
||||
selectionState.selectable,
|
||||
selectionState.selectionActive,
|
||||
setSelectionActive,
|
||||
]
|
||||
);
|
||||
|
||||
const commonProps = useMemo(
|
||||
|
||||
@@ -2,17 +2,34 @@ import { apis, events } from '@affine/electron-api';
|
||||
import { useAtomValue } from 'jotai';
|
||||
import { atomWithObservable } from 'jotai/utils';
|
||||
import { useCallback } from 'react';
|
||||
import { Observable } from 'rxjs';
|
||||
import { combineLatest, map, Observable } from 'rxjs';
|
||||
|
||||
import * as style from './style.css';
|
||||
|
||||
const maximizedAtom = atomWithObservable(() => {
|
||||
return new Observable<boolean>(subscriber => {
|
||||
subscriber.next(false);
|
||||
return events?.ui.onMaximized(maximized => {
|
||||
return subscriber.next(maximized);
|
||||
const maximized$ = new Observable<boolean>(subscriber => {
|
||||
subscriber.next(false);
|
||||
if (events) {
|
||||
return events.ui.onMaximized(res => {
|
||||
subscriber.next(res);
|
||||
});
|
||||
});
|
||||
}
|
||||
return () => {};
|
||||
});
|
||||
|
||||
const fullscreen$ = new Observable<boolean>(subscriber => {
|
||||
subscriber.next(false);
|
||||
if (events) {
|
||||
return events.ui.onFullScreen(res => {
|
||||
subscriber.next(res);
|
||||
});
|
||||
}
|
||||
return () => {};
|
||||
});
|
||||
|
||||
const maximizedAtom = atomWithObservable(() => {
|
||||
return combineLatest([maximized$, fullscreen$]).pipe(
|
||||
map(([maximized, fullscreen]) => maximized || fullscreen)
|
||||
);
|
||||
});
|
||||
|
||||
const minimizeSVG = (
|
||||
|
||||
@@ -2,6 +2,7 @@ import { ScrollableContainer } from '@affine/component';
|
||||
import { Divider } from '@affine/component/ui/divider';
|
||||
import { WorkspaceList } from '@affine/component/workspace-list';
|
||||
import { useSession } from '@affine/core/hooks/affine/use-current-user';
|
||||
import { useEnableCloud } from '@affine/core/hooks/affine/use-enable-cloud';
|
||||
import {
|
||||
useWorkspaceAvatar,
|
||||
useWorkspaceName,
|
||||
@@ -13,7 +14,7 @@ import type { DragEndEvent } from '@dnd-kit/core';
|
||||
import type { WorkspaceMetadata } from '@toeverything/infra';
|
||||
import { useLiveData, useService, WorkspaceManager } from '@toeverything/infra';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
|
||||
import {
|
||||
openCreateWorkspaceModalAtom,
|
||||
@@ -28,8 +29,10 @@ interface WorkspaceModalProps {
|
||||
disabled?: boolean;
|
||||
workspaces: WorkspaceMetadata[];
|
||||
currentWorkspaceId?: string | null;
|
||||
openingId?: string | null;
|
||||
onClickWorkspace: (workspaceMetadata: WorkspaceMetadata) => void;
|
||||
onClickWorkspaceSetting: (workspaceMetadata: WorkspaceMetadata) => void;
|
||||
onClickEnableCloud?: (meta: WorkspaceMetadata) => void;
|
||||
onNewWorkspace: () => void;
|
||||
onAddWorkspace: () => void;
|
||||
onDragEnd: (event: DragEndEvent) => void;
|
||||
@@ -77,6 +80,8 @@ const LocalWorkspaces = ({
|
||||
workspaces,
|
||||
onClickWorkspace,
|
||||
onClickWorkspaceSetting,
|
||||
onClickEnableCloud,
|
||||
openingId,
|
||||
currentWorkspaceId,
|
||||
onDragEnd,
|
||||
}: WorkspaceModalProps) => {
|
||||
@@ -95,11 +100,13 @@ const LocalWorkspaces = ({
|
||||
{t['com.affine.workspaceList.workspaceListType.local']()}
|
||||
</div>
|
||||
<WorkspaceList
|
||||
openingId={openingId}
|
||||
disabled={disabled}
|
||||
items={workspaces}
|
||||
currentWorkspaceId={currentWorkspaceId}
|
||||
onClick={onClickWorkspace}
|
||||
onSettingClick={onClickWorkspaceSetting}
|
||||
onEnableCloudClick={onClickEnableCloud}
|
||||
onDragEnd={onDragEnd}
|
||||
useIsWorkspaceOwner={useIsWorkspaceOwner}
|
||||
useWorkspaceName={useWorkspaceName}
|
||||
@@ -114,11 +121,13 @@ export const AFFiNEWorkspaceList = ({
|
||||
}: {
|
||||
onEventEnd?: () => void;
|
||||
}) => {
|
||||
const workspaces = useLiveData(
|
||||
useService(WorkspaceManager).list.workspaceList$
|
||||
);
|
||||
const openWsRef = useRef<ReturnType<typeof workspaceManager.open>>();
|
||||
const workspaceManager = useService(WorkspaceManager);
|
||||
const workspaces = useLiveData(workspaceManager.list.workspaceList$);
|
||||
|
||||
const setOpenCreateWorkspaceModal = useSetAtom(openCreateWorkspaceModalAtom);
|
||||
const [openingId, setOpeningId] = useState<string | null>(null);
|
||||
const confirmEnableCloud = useEnableCloud();
|
||||
|
||||
const { jumpToSubPath } = useNavigateHelper();
|
||||
|
||||
@@ -160,6 +169,28 @@ export const AFFiNEWorkspaceList = ({
|
||||
[onEventEnd, setOpenSettingModalAtom]
|
||||
);
|
||||
|
||||
const onClickEnableCloud = useCallback(
|
||||
(meta: WorkspaceMetadata) => {
|
||||
openWsRef.current?.release();
|
||||
openWsRef.current = workspaceManager.open(meta);
|
||||
confirmEnableCloud(openWsRef.current.workspace, {
|
||||
onFinished: () => {
|
||||
openWsRef.current?.release();
|
||||
openWsRef.current = undefined;
|
||||
setOpeningId(null);
|
||||
},
|
||||
});
|
||||
setOpeningId(meta.id);
|
||||
},
|
||||
[confirmEnableCloud, workspaceManager]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
openWsRef.current?.release();
|
||||
};
|
||||
}, []);
|
||||
|
||||
const onMoveWorkspace = useCallback((_activeId: string, _overId: string) => {
|
||||
// TODO: order
|
||||
// const oldIndex = workspaces.findIndex(w => w.id === activeId);
|
||||
@@ -219,9 +250,11 @@ export const AFFiNEWorkspaceList = ({
|
||||
</div>
|
||||
) : null}
|
||||
<LocalWorkspaces
|
||||
openingId={openingId}
|
||||
workspaces={localWorkspaces}
|
||||
onClickWorkspace={onClickWorkspace}
|
||||
onClickWorkspaceSetting={onClickWorkspaceSetting}
|
||||
onClickEnableCloud={onClickEnableCloud}
|
||||
onNewWorkspace={onNewWorkspace}
|
||||
onAddWorkspace={onAddWorkspace}
|
||||
currentWorkspaceId={currentWorkspace?.id}
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
UnsyncIcon,
|
||||
} from '@blocksuite/icons';
|
||||
import { useService, Workspace } from '@toeverything/infra';
|
||||
import { cssVar } from '@toeverything/theme';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { debounce } from 'lodash-es';
|
||||
import type { HTMLAttributes } from 'react';
|
||||
@@ -59,7 +60,7 @@ const LocalWorkspaceStatus = () => {
|
||||
return (
|
||||
<>
|
||||
{!environment.isDesktop ? (
|
||||
<InformationFillDuotoneIcon data-warning-color="true" />
|
||||
<InformationFillDuotoneIcon style={{ color: cssVar('errorColor') }} />
|
||||
) : (
|
||||
<LocalWorkspaceIcon />
|
||||
)}
|
||||
@@ -234,7 +235,10 @@ const WorkspaceInfo = ({ name }: { name: string }) => {
|
||||
|
||||
{/* when syncing/offline/... */}
|
||||
<div className={styles.workspaceInfo} data-type="events">
|
||||
<Tooltip content={message}>
|
||||
<Tooltip
|
||||
content={message}
|
||||
options={{ className: styles.workspaceInfoTooltip }}
|
||||
>
|
||||
<div className={styles.workspaceActiveStatus}>
|
||||
<SyncingWorkspaceStatus progress={progress} />
|
||||
</div>
|
||||
|
||||
@@ -96,4 +96,12 @@ export const workspaceActiveStatus = style({
|
||||
globalStyle(`.${workspaceActiveStatus} svg`, {
|
||||
width: 16,
|
||||
height: 16,
|
||||
color: cssVar('iconSecondary'),
|
||||
});
|
||||
|
||||
export const workspaceInfoTooltip = style({
|
||||
fontSize: cssVar('fontXs'),
|
||||
lineHeight: '20px',
|
||||
padding: '0 8px',
|
||||
minHeight: 20,
|
||||
});
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
import { displayFlex, styled, textEllipsis } from '@affine/component';
|
||||
import { cssVar } from '@toeverything/theme';
|
||||
export const StyledSelectorContainer = styled('div')({
|
||||
height: '50px',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
padding: '0 6px',
|
||||
borderRadius: '8px',
|
||||
outline: 'none',
|
||||
width: 'fit-content',
|
||||
maxWidth: '100%',
|
||||
color: cssVar('textPrimaryColor'),
|
||||
':hover': {
|
||||
cursor: 'pointer',
|
||||
background: cssVar('hoverColor'),
|
||||
},
|
||||
});
|
||||
|
||||
export const StyledSelectorWrapper = styled('div')(() => {
|
||||
return {
|
||||
marginLeft: '8px',
|
||||
flexGrow: 1,
|
||||
overflow: 'hidden',
|
||||
};
|
||||
});
|
||||
export const StyledWorkspaceName = styled('div')(() => {
|
||||
return {
|
||||
fontSize: cssVar('fontSm'),
|
||||
lineHeight: '22px',
|
||||
fontWeight: 500,
|
||||
userSelect: 'none',
|
||||
...textEllipsis(1),
|
||||
marginLeft: '4px',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledWorkspaceStatus = styled('div')(() => {
|
||||
return {
|
||||
height: '22px',
|
||||
...displayFlex('flex-start', 'center'),
|
||||
fontSize: cssVar('fontXs'),
|
||||
color: cssVar('black50'),
|
||||
userSelect: 'none',
|
||||
padding: '0 4px',
|
||||
gap: '4px',
|
||||
zIndex: '1',
|
||||
svg: {
|
||||
color: cssVar('iconSecondary'),
|
||||
'&[data-warning-color="true"]': {
|
||||
color: cssVar('errorColor'),
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
@@ -1,18 +1,14 @@
|
||||
import { BrowserWarning, LocalDemoTips } from '@affine/component/affine-banner';
|
||||
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { Trans } from '@affine/i18n';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { Workspace } from '@toeverything/infra';
|
||||
import { useService, WorkspaceManager } from '@toeverything/infra';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import { authAtom } from '../atoms';
|
||||
import { useCurrentLoginStatus } from '../hooks/affine/use-current-login-status';
|
||||
import { useNavigateHelper } from '../hooks/use-navigate-helper';
|
||||
import { WorkspaceSubPath } from '../shared';
|
||||
import { EnableAffineCloudModal } from './affine/enable-affine-cloud-modal';
|
||||
import { useEnableCloud } from '../hooks/affine/use-enable-cloud';
|
||||
|
||||
const minimumChromeVersion = 106;
|
||||
|
||||
@@ -68,47 +64,29 @@ export const TopTip = ({
|
||||
|
||||
const [showWarning, setShowWarning] = useState(shouldShowWarning);
|
||||
const [showLocalDemoTips, setShowLocalDemoTips] = useState(true);
|
||||
const [open, setOpen] = useState(false);
|
||||
const confirmEnableCloud = useEnableCloud();
|
||||
|
||||
const setAuthModal = useSetAtom(authAtom);
|
||||
const onLogin = useCallback(() => {
|
||||
setAuthModal({ openModal: true, state: 'signIn' });
|
||||
}, [setAuthModal]);
|
||||
|
||||
const { openPage } = useNavigateHelper();
|
||||
const workspaceManager = useService(WorkspaceManager);
|
||||
const handleConfirm = useAsyncCallback(async () => {
|
||||
if (workspace.flavour !== WorkspaceFlavour.LOCAL) {
|
||||
return;
|
||||
}
|
||||
// TODO: we need to transform local to cloud
|
||||
const { id: newId } =
|
||||
await workspaceManager.transformLocalToCloud(workspace);
|
||||
openPage(newId, pageId || WorkspaceSubPath.ALL);
|
||||
setOpen(false);
|
||||
}, [openPage, pageId, workspace, workspaceManager]);
|
||||
|
||||
if (
|
||||
showLocalDemoTips &&
|
||||
!environment.isDesktop &&
|
||||
workspace.flavour === WorkspaceFlavour.LOCAL
|
||||
) {
|
||||
return (
|
||||
<>
|
||||
<LocalDemoTips
|
||||
isLoggedIn={isLoggedIn}
|
||||
onLogin={onLogin}
|
||||
onEnableCloud={() => setOpen(true)}
|
||||
onClose={() => {
|
||||
setShowLocalDemoTips(false);
|
||||
}}
|
||||
/>
|
||||
<EnableAffineCloudModal
|
||||
open={open}
|
||||
onOpenChange={setOpen}
|
||||
onConfirm={handleConfirm}
|
||||
/>
|
||||
</>
|
||||
<LocalDemoTips
|
||||
isLoggedIn={isLoggedIn}
|
||||
onLogin={onLogin}
|
||||
onEnableCloud={() =>
|
||||
confirmEnableCloud(workspace, { openPageId: pageId })
|
||||
}
|
||||
onClose={() => {
|
||||
setShowLocalDemoTips(false);
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import { getBaseUrl } from '@affine/graphql';
|
||||
import { useMemo, useReducer } from 'react';
|
||||
import { useEffect, useMemo, useReducer } from 'react';
|
||||
import useSWR from 'swr';
|
||||
|
||||
import { SessionFetchErrorRightAfterLoginOrSignUp } from '../../unexpected-application-state/errors';
|
||||
@@ -145,6 +145,21 @@ export function useCurrentUser(): CheckedUser {
|
||||
[dispatcher, session]
|
||||
);
|
||||
|
||||
// update user when session reloaded
|
||||
// maybe lift user state up to global state?
|
||||
useEffect(() => {
|
||||
if (session.user) {
|
||||
dispatcher({ type: 'update', payload: session.user });
|
||||
} else {
|
||||
dispatcher({ type: 'fetchError', payload: null });
|
||||
}
|
||||
}, [
|
||||
session.user,
|
||||
session.user?.id,
|
||||
session.user?.name,
|
||||
session.user?.avatarUrl,
|
||||
]);
|
||||
|
||||
return useMemo(
|
||||
() => ({
|
||||
...user,
|
||||
|
||||
@@ -4,8 +4,9 @@ import { useMemo } from 'react';
|
||||
export function useDocEngineStatus() {
|
||||
const workspace = useService(Workspace);
|
||||
|
||||
const engineState = useLiveData(workspace.engine.docEngineState$);
|
||||
|
||||
const engineState = useLiveData(
|
||||
workspace.engine.docEngineState$.throttleTime(100)
|
||||
);
|
||||
const progress =
|
||||
(engineState.total - engineState.syncing) / engineState.total;
|
||||
|
||||
|
||||
109
packages/frontend/core/src/hooks/affine/use-enable-cloud.tsx
Normal file
109
packages/frontend/core/src/hooks/affine/use-enable-cloud.tsx
Normal file
@@ -0,0 +1,109 @@
|
||||
import { useConfirmModal } from '@affine/component';
|
||||
import { authAtom } from '@affine/core/atoms';
|
||||
import { setOnceSignedInEventAtom } from '@affine/core/atoms/event';
|
||||
import { WorkspaceSubPath } from '@affine/core/shared';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { Workspace } from '@toeverything/infra';
|
||||
import { useService, WorkspaceManager } from '@toeverything/infra';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { useNavigateHelper } from '../use-navigate-helper';
|
||||
import { useCurrentLoginStatus } from './use-current-login-status';
|
||||
|
||||
interface ConfirmEnableCloudOptions {
|
||||
/**
|
||||
* Fired when the workspace is successfully enabled
|
||||
*/
|
||||
onSuccess?: () => void;
|
||||
/**
|
||||
* Fired when workspace is successfully enabled or user cancels the operation
|
||||
*/
|
||||
onFinished?: () => void;
|
||||
openPageId?: string;
|
||||
}
|
||||
type ConfirmEnableArgs = [Workspace, ConfirmEnableCloudOptions | undefined];
|
||||
|
||||
export const useEnableCloud = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
const loginStatus = useCurrentLoginStatus();
|
||||
const setAuthAtom = useSetAtom(authAtom);
|
||||
const setOnceSignedInEvent = useSetAtom(setOnceSignedInEventAtom);
|
||||
const { openConfirmModal, closeConfirmModal } = useConfirmModal();
|
||||
const workspaceManager = useService(WorkspaceManager);
|
||||
const { openPage } = useNavigateHelper();
|
||||
|
||||
const enableCloud = useCallback(
|
||||
async (ws: Workspace | null, options?: ConfirmEnableCloudOptions) => {
|
||||
if (!ws) return;
|
||||
const { id: newId } = await workspaceManager.transformLocalToCloud(ws);
|
||||
openPage(newId, options?.openPageId || WorkspaceSubPath.ALL);
|
||||
options?.onSuccess?.();
|
||||
},
|
||||
[openPage, workspaceManager]
|
||||
);
|
||||
|
||||
const openSignIn = useCallback(
|
||||
(...args: ConfirmEnableArgs) => {
|
||||
setAuthAtom(prev => ({ ...prev, openModal: true }));
|
||||
setOnceSignedInEvent(() => {
|
||||
enableCloud(...args).catch(console.error);
|
||||
});
|
||||
},
|
||||
[enableCloud, setAuthAtom, setOnceSignedInEvent]
|
||||
);
|
||||
|
||||
const signInOrEnableCloud = useCallback(
|
||||
async (...args: ConfirmEnableArgs) => {
|
||||
// not logged in, open login modal
|
||||
if (loginStatus === 'unauthenticated') {
|
||||
openSignIn(...args);
|
||||
}
|
||||
|
||||
if (loginStatus === 'authenticated') {
|
||||
await enableCloud(...args);
|
||||
}
|
||||
},
|
||||
[enableCloud, loginStatus, openSignIn]
|
||||
);
|
||||
|
||||
const confirmEnableCloud = useCallback(
|
||||
(ws: Workspace, options?: ConfirmEnableCloudOptions) => {
|
||||
const { onSuccess, onFinished } = options ?? {};
|
||||
if (!runtimeConfig.enableCloud) return;
|
||||
|
||||
const closeOnSuccess = () => {
|
||||
closeConfirmModal();
|
||||
onSuccess?.();
|
||||
};
|
||||
|
||||
openConfirmModal(
|
||||
{
|
||||
title: t['Enable AFFiNE Cloud'](),
|
||||
description: t['Enable AFFiNE Cloud Description'](),
|
||||
cancelText: t['com.affine.enableAffineCloudModal.button.cancel'](),
|
||||
confirmButtonOptions: {
|
||||
type: 'primary',
|
||||
['data-testid' as string]: 'confirm-enable-affine-cloud-button',
|
||||
children:
|
||||
loginStatus === 'authenticated'
|
||||
? t['Enable']()
|
||||
: t['Sign in and Enable'](),
|
||||
},
|
||||
onConfirm: async () =>
|
||||
await signInOrEnableCloud(ws, {
|
||||
...options,
|
||||
onSuccess: closeOnSuccess,
|
||||
}),
|
||||
onOpenChange: open => {
|
||||
if (!open) onFinished?.();
|
||||
},
|
||||
},
|
||||
{ autoClose: false }
|
||||
);
|
||||
},
|
||||
[closeConfirmModal, loginStatus, openConfirmModal, signInOrEnableCloud, t]
|
||||
);
|
||||
|
||||
return confirmEnableCloud;
|
||||
};
|
||||
@@ -14,6 +14,7 @@ export function useLanguageHelper() {
|
||||
tag: item.tag,
|
||||
originalName: item.originalName,
|
||||
name: item.name,
|
||||
Completeness: item.completeRate,
|
||||
})),
|
||||
[]
|
||||
);
|
||||
|
||||
@@ -196,11 +196,9 @@ const JournalDailyCountBlock = ({ date }: JournalBlockProps) => {
|
||||
(field: 'createDate' | 'updatedDate') => {
|
||||
return sortPagesByDate(
|
||||
pageRecords.filter(pageRecord => {
|
||||
if (pageRecord.meta$.value.trash) return false;
|
||||
return (
|
||||
pageRecord.meta$.value[field] &&
|
||||
dayjs(pageRecord.meta$.value[field]).isSame(date, 'day')
|
||||
);
|
||||
const meta = pageRecord.meta$.value;
|
||||
if (meta.trash) return false;
|
||||
return meta[field] && dayjs(meta[field]).isSame(date, 'day');
|
||||
}),
|
||||
field
|
||||
);
|
||||
|
||||
@@ -20,6 +20,9 @@ export const WorkbenchLink = ({
|
||||
(event: React.MouseEvent<HTMLAnchorElement>) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
if (onClick?.(event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.ctrlKey || event.metaKey) {
|
||||
if (appSettings.enableMultiView && environment.isDesktop) {
|
||||
@@ -34,7 +37,6 @@ export const WorkbenchLink = ({
|
||||
} else {
|
||||
workbench.open(to);
|
||||
}
|
||||
onClick?.(event);
|
||||
},
|
||||
[appSettings.enableMultiView, basename, onClick, to, workbench]
|
||||
);
|
||||
|
||||
@@ -14,6 +14,12 @@ export const footerContainer = style({
|
||||
paddingLeft: cssVar('editorSidePadding'),
|
||||
paddingRight: cssVar('editorSidePadding'),
|
||||
marginBottom: '200px',
|
||||
'@media': {
|
||||
'screen and (max-width: 800px)': {
|
||||
paddingLeft: '24px',
|
||||
paddingRight: '24px',
|
||||
},
|
||||
},
|
||||
});
|
||||
export const footer = style({
|
||||
display: 'flex',
|
||||
|
||||
@@ -73,7 +73,7 @@ export const Component = (): ReactElement => {
|
||||
|
||||
// avoid doing operation, before workspace is loaded
|
||||
const isRootDocReady =
|
||||
useLiveData(workspace?.engine.rootDocState$)?.ready ?? false;
|
||||
useLiveData(workspace?.engine.rootDocState$.map(v => v.ready)) ?? false;
|
||||
|
||||
// if listLoading is false, we can show 404 page, otherwise we should show loading page.
|
||||
if (listLoading === false && meta === undefined) {
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
openSignOutModalAtom,
|
||||
} from '../atoms';
|
||||
import { PaymentDisableModal } from '../components/affine/payment-disable';
|
||||
import { useSession } from '../hooks/affine/use-current-user';
|
||||
import { useAsyncCallback } from '../hooks/affine-async-hooks';
|
||||
import { useNavigateHelper } from '../hooks/use-navigate-helper';
|
||||
import { CurrentWorkspaceService } from '../modules/workspace/current-workspace';
|
||||
@@ -221,6 +222,7 @@ export function CurrentWorkspaceModals() {
|
||||
|
||||
export const SignOutConfirmModal = () => {
|
||||
const { openPage } = useNavigateHelper();
|
||||
const { reload } = useSession();
|
||||
const [open, setOpen] = useAtom(openSignOutModalAtom);
|
||||
const currentWorkspace = useLiveData(
|
||||
useService(CurrentWorkspaceService).currentWorkspace$
|
||||
@@ -232,6 +234,7 @@ export const SignOutConfirmModal = () => {
|
||||
const onConfirm = useAsyncCallback(async () => {
|
||||
setOpen(false);
|
||||
await signOutCloud();
|
||||
await reload();
|
||||
|
||||
mixpanel.reset();
|
||||
|
||||
@@ -244,7 +247,7 @@ export const SignOutConfirmModal = () => {
|
||||
openPage(localWorkspace.id, WorkspaceSubPath.ALL);
|
||||
}
|
||||
}
|
||||
}, [currentWorkspace?.flavour, openPage, setOpen, workspaces]);
|
||||
}, [currentWorkspace?.flavour, openPage, reload, setOpen, workspaces]);
|
||||
|
||||
return (
|
||||
<SignOutModal open={open} onOpenChange={setOpen} onConfirm={onConfirm} />
|
||||
|
||||
@@ -42,7 +42,10 @@
|
||||
"@electron-forge/plugin-auto-unpack-natives": "^7.3.0",
|
||||
"@electron-forge/shared-types": "^7.3.0",
|
||||
"@emotion/react": "^11.11.4",
|
||||
"@pengx17/electron-forge-maker-appimage": "^1.1.1",
|
||||
"@pengx17/electron-forge-maker-appimage": "^1.2.0",
|
||||
"@sentry/electron": "^4.21.0",
|
||||
"@sentry/esbuild-plugin": "^2.16.0",
|
||||
"@sentry/react": "^7.108.0",
|
||||
"@toeverything/infra": "workspace:*",
|
||||
"@types/uuid": "^9.0.8",
|
||||
"@vitejs/plugin-react-swc": "^3.6.0",
|
||||
|
||||
@@ -1,11 +1,23 @@
|
||||
import './polyfill/dispose';
|
||||
// Side effect import, "declare global"
|
||||
import '@affine/env/constant';
|
||||
import '@affine/core/bootstrap/preload';
|
||||
|
||||
import { setup } from '@affine/core/bootstrap/setup';
|
||||
import { appConfigProxy } from '@affine/core/hooks/use-app-config-storage';
|
||||
import { performanceLogger } from '@affine/core/shared';
|
||||
import { StrictMode } from 'react';
|
||||
import { apis, events } from '@affine/electron-api';
|
||||
import { init, replayIntegration, setTags } from '@sentry/electron/renderer';
|
||||
import {
|
||||
init as reactInit,
|
||||
reactRouterV6BrowserTracingIntegration,
|
||||
} from '@sentry/react';
|
||||
import { debounce } from 'lodash-es';
|
||||
import { StrictMode, useEffect } from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
import {
|
||||
createRoutesFromChildren,
|
||||
matchRoutes,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
} from 'react-router-dom';
|
||||
|
||||
import { App } from './app';
|
||||
|
||||
@@ -18,7 +30,56 @@ function main() {
|
||||
performanceMainLogger.info('skip setup');
|
||||
} else {
|
||||
performanceMainLogger.info('setup start');
|
||||
setup();
|
||||
if (window.SENTRY_RELEASE || environment.isDebug) {
|
||||
// https://docs.sentry.io/platforms/javascript/guides/electron/
|
||||
init(
|
||||
{
|
||||
dsn: process.env.SENTRY_DSN,
|
||||
environment: process.env.BUILD_TYPE ?? 'development',
|
||||
integrations: [
|
||||
reactRouterV6BrowserTracingIntegration({
|
||||
useEffect,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
createRoutesFromChildren,
|
||||
matchRoutes,
|
||||
}),
|
||||
replayIntegration(),
|
||||
],
|
||||
},
|
||||
reactInit
|
||||
);
|
||||
setTags({
|
||||
appVersion: runtimeConfig.appVersion,
|
||||
editorVersion: runtimeConfig.editorVersion,
|
||||
});
|
||||
window.addEventListener('offline', () => {
|
||||
apis?.ui.handleNetworkChange(false);
|
||||
});
|
||||
window.addEventListener('online', () => {
|
||||
apis?.ui.handleNetworkChange(true);
|
||||
});
|
||||
}
|
||||
// load persistent config for electron
|
||||
// TODO: should be sync, but it's not necessary for now
|
||||
appConfigProxy
|
||||
.getSync()
|
||||
.catch(() => console.error('failed to load app config'));
|
||||
const handleMaximized = (maximized: boolean | undefined) => {
|
||||
document.documentElement.dataset.maximized = String(maximized);
|
||||
};
|
||||
const handleFullscreen = (fullscreen: boolean | undefined) => {
|
||||
document.documentElement.dataset.fullscreen = String(fullscreen);
|
||||
};
|
||||
apis?.ui.isMaximized().then(handleMaximized).catch(console.error);
|
||||
apis?.ui.isFullScreen().then(handleFullscreen).catch(console.error);
|
||||
events?.ui.onMaximized(handleMaximized);
|
||||
events?.ui.onFullScreen(handleFullscreen);
|
||||
|
||||
const handleResize = debounce(() => {
|
||||
apis?.ui.handleWindowResize().catch(console.error);
|
||||
}, 50);
|
||||
window.addEventListener('resize', handleResize);
|
||||
performanceMainLogger.info('setup done');
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
||||
import { getRuntimeConfig } from '@affine/cli/src/webpack/runtime-config';
|
||||
import { sentryEsbuildPlugin } from '@sentry/esbuild-plugin';
|
||||
import type { BuildOptions } from 'esbuild';
|
||||
|
||||
export const electronDir = fileURLToPath(new URL('..', import.meta.url));
|
||||
@@ -28,6 +29,26 @@ export const config = (): BuildOptions => {
|
||||
})
|
||||
);
|
||||
|
||||
if (process.env.GITHUB_SHA) {
|
||||
define['process.env.GITHUB_SHA'] = `"${process.env.GITHUB_SHA}"`;
|
||||
}
|
||||
|
||||
const plugins = [];
|
||||
|
||||
if (
|
||||
process.env.SENTRY_AUTH_TOKEN &&
|
||||
process.env.SENTRY_ORG &&
|
||||
process.env.SENTRY_PROJECT
|
||||
) {
|
||||
plugins.push(
|
||||
sentryEsbuildPlugin({
|
||||
org: process.env.SENTRY_ORG,
|
||||
project: process.env.SENTRY_PROJECT,
|
||||
authToken: process.env.SENTRY_AUTH_TOKEN,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
entryPoints: [
|
||||
resolve(electronDir, './src/main/index.ts'),
|
||||
@@ -48,5 +69,6 @@ export const config = (): BuildOptions => {
|
||||
assetNames: '[name]',
|
||||
treeShaking: true,
|
||||
sourcemap: 'linked',
|
||||
plugins,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@ import './security-restrictions';
|
||||
|
||||
import path from 'node:path';
|
||||
|
||||
import { init, IPCMode } from '@sentry/electron/main';
|
||||
import { app } from 'electron';
|
||||
|
||||
import { createApplicationMenu } from './application-menu/create';
|
||||
@@ -12,6 +13,7 @@ import { registerEvents } from './events';
|
||||
import { registerHandlers } from './handlers';
|
||||
import { logger } from './logger';
|
||||
import { registerProtocol } from './protocol';
|
||||
import { isOnline } from './ui/handlers';
|
||||
import { registerUpdater } from './updater';
|
||||
import { launch } from './windows-manager/launcher';
|
||||
import { launchStage } from './windows-manager/stage';
|
||||
@@ -64,6 +66,19 @@ app.on('activate', () => {
|
||||
|
||||
setupDeepLink(app);
|
||||
|
||||
// https://docs.sentry.io/platforms/javascript/guides/electron/
|
||||
if (process.env.SENTRY_DSN) {
|
||||
init({
|
||||
dsn: process.env.SENTRY_DSN,
|
||||
ipcMode: IPCMode.Protocol,
|
||||
transportOptions: {
|
||||
maxQueueAgeDays: 30,
|
||||
maxQueueCount: 100,
|
||||
beforeSend: () => (isOnline ? 'send' : 'queue'),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Create app window when background process will be ready
|
||||
*/
|
||||
|
||||
@@ -104,9 +104,8 @@ async function createWindow(additionalArguments: string[]) {
|
||||
|
||||
logger.info('main window is ready to show');
|
||||
|
||||
if (browserWindow.isMaximized() || browserWindow.isFullScreen()) {
|
||||
uiSubjects.onMaximized$.next(true);
|
||||
}
|
||||
uiSubjects.onMaximized$.next(browserWindow.isMaximized());
|
||||
uiSubjects.onFullScreen$.next(browserWindow.isFullScreen());
|
||||
|
||||
handleWebContentsResize().catch(logger.error);
|
||||
});
|
||||
@@ -143,21 +142,26 @@ async function createWindow(additionalArguments: string[]) {
|
||||
browserWindow.setSize(size[0], size[1]);
|
||||
});
|
||||
uiSubjects.onMaximized$.next(false);
|
||||
uiSubjects.onFullScreen$.next(false);
|
||||
});
|
||||
|
||||
browserWindow.on('maximize', () => {
|
||||
uiSubjects.onMaximized$.next(true);
|
||||
});
|
||||
|
||||
// full-screen == maximized in UI on windows
|
||||
browserWindow.on('enter-full-screen', () => {
|
||||
uiSubjects.onMaximized$.next(true);
|
||||
});
|
||||
|
||||
browserWindow.on('unmaximize', () => {
|
||||
uiSubjects.onMaximized$.next(false);
|
||||
});
|
||||
|
||||
// full-screen == maximized in UI on windows
|
||||
browserWindow.on('enter-full-screen', () => {
|
||||
uiSubjects.onFullScreen$.next(true);
|
||||
});
|
||||
|
||||
browserWindow.on('leave-full-screen', () => {
|
||||
uiSubjects.onFullScreen$.next(false);
|
||||
});
|
||||
|
||||
/**
|
||||
* URL for main window.
|
||||
*/
|
||||
|
||||
@@ -11,4 +11,10 @@ export const uiEvents = {
|
||||
sub.unsubscribe();
|
||||
};
|
||||
},
|
||||
onFullScreen: (fn: (fullScreen: boolean) => void) => {
|
||||
const sub = uiSubjects.onFullScreen$.subscribe(fn);
|
||||
return () => {
|
||||
sub.unsubscribe();
|
||||
};
|
||||
},
|
||||
} satisfies Record<string, MainEventRegister>;
|
||||
|
||||
@@ -15,11 +15,17 @@ import { launchStage } from '../windows-manager/stage';
|
||||
import { getChallengeResponse } from './challenge';
|
||||
import { getGoogleOauthCode } from './google-auth';
|
||||
|
||||
export let isOnline = true;
|
||||
|
||||
export const uiHandlers = {
|
||||
isMaximized: async () => {
|
||||
const window = await getMainWindow();
|
||||
return window?.isMaximized();
|
||||
},
|
||||
isFullScreen: async () => {
|
||||
const window = await getMainWindow();
|
||||
return window?.isFullScreen();
|
||||
},
|
||||
handleThemeChange: async (_, theme: (typeof nativeTheme)['themeSource']) => {
|
||||
nativeTheme.themeSource = theme;
|
||||
},
|
||||
@@ -54,6 +60,9 @@ export const uiHandlers = {
|
||||
handleCloseApp: async () => {
|
||||
app.quit();
|
||||
},
|
||||
handleNetworkChange: async (_, _isOnline: boolean) => {
|
||||
isOnline = _isOnline;
|
||||
},
|
||||
getGoogleOauthCode: async () => {
|
||||
return getGoogleOauthCode();
|
||||
},
|
||||
|
||||
@@ -2,4 +2,5 @@ import { Subject } from 'rxjs';
|
||||
|
||||
export const uiSubjects = {
|
||||
onMaximized$: new Subject<boolean>(),
|
||||
onFullScreen$: new Subject<boolean>(),
|
||||
};
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
import '@sentry/electron/preload';
|
||||
import './bootstrap';
|
||||
|
||||
94
packages/frontend/i18n/src/resources/ca.json
Normal file
94
packages/frontend/i18n/src/resources/ca.json
Normal file
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "404 - No s'ha trobat la pàgina",
|
||||
"About AFFiNE": "Quant a AFFiNE",
|
||||
"Access level": "Nivell d'accés",
|
||||
"Add Filter": "Afegeix filtre",
|
||||
"Add Workspace": "Afegeix espai de treball",
|
||||
"Add a subpage inside": "Afegeix una subpàgina dins",
|
||||
"Add to Favorites": "Afegeix a preferits",
|
||||
"Add to favorites": "Afegeix a preferits",
|
||||
"Added Successfully": "S'ha afegit amb èxit",
|
||||
"Added to Favorites": "S'ha afegit a preferits",
|
||||
"All data has been stored in the cloud": "S'han desat totes les dades al núvol.",
|
||||
"All pages": "Totes les pàgines",
|
||||
"App Version": "Versió de l'aplicació",
|
||||
"Appearance Settings": "Configuració d'aparença",
|
||||
"Available Offline": "Disponible sense connexió",
|
||||
"Bold": "Negreta",
|
||||
"Cancel": "Cancel·la",
|
||||
"Choose your font style": "Trieu l'estil de la lletra",
|
||||
"Collections": "Col·leccions",
|
||||
"Confirm": "Confirma",
|
||||
"Convert to ": "Converteix a",
|
||||
"Copied link to clipboard": "S'ha copiat l'enllaç al porta-retalls",
|
||||
"Copy": "Copia",
|
||||
"Copy Link": "Copia enllaç",
|
||||
"Create": "Crea",
|
||||
"Create Or Import": "Crea o importa",
|
||||
"Create a collection": "Crea una col·lecció",
|
||||
"Date": "Data",
|
||||
"Date Format": "Format de la data",
|
||||
"Default Location": "Ubicació per defecte",
|
||||
"Default db location hint": "Per defecte es desarà a {{location}}",
|
||||
"Delete": "Suprimeix",
|
||||
"Delete Member?": "Suprimeix el membre?",
|
||||
"Delete Workspace": "Suprimeix l'espai de treball",
|
||||
"Export": "Exporta",
|
||||
"Export AFFiNE backup file": "Exporta l'arxiu de còpia de seguretat",
|
||||
"Export Description": "Podeu exportar l'espai de treball sencer per fer-ne una còpia de seguretat i reimportar les dades.",
|
||||
"Export to HTML": "Exporta a HTML",
|
||||
"Export to Markdown": "Exporta a Markdown",
|
||||
"Export to PDF": "Exporta a PDF",
|
||||
"Export to PNG": "Exporta a PNG",
|
||||
"Font Style": "Estil de la lletra",
|
||||
"Got it": "Entesos",
|
||||
"Heading": "Encapçalament {{number}}",
|
||||
"Import": "Importa",
|
||||
"Italic": "Cursiva",
|
||||
"Keyboard Shortcuts": "Dreceres de teclat",
|
||||
"Move to Trash": "Mou a la paperera",
|
||||
"Moved to Trash": "S'ha mogut a la paperera",
|
||||
"New Page": "Nova pàgina",
|
||||
"Pen": "Bolígraf",
|
||||
"Quick Search": "Cerca ràpida",
|
||||
"Settings": "Configuració",
|
||||
"Tags": "Etiquetes",
|
||||
"Trash": "Paperera de reciclatge",
|
||||
"Untitled Collection": "Col·lecció sense títol",
|
||||
"Workspace Settings": "Configuració de l'espai de treball",
|
||||
"com.affine.aboutAFFiNE.legal.title": "Informació legal",
|
||||
"com.affine.aboutAFFiNE.legal.tos": "Condicions d’ús",
|
||||
"com.affine.aboutAFFiNE.subtitle": "Informació sobre AFFiNE",
|
||||
"com.affine.aboutAFFiNE.version.app": "Versió de l'aplicació",
|
||||
"com.affine.aboutAFFiNE.version.editor.title": "Versió de l'editor",
|
||||
"com.affine.aboutAFFiNE.version.title": "Versió",
|
||||
"com.affine.appUpdater.downloading": "S'està descarregant",
|
||||
"com.affine.appUpdater.updateAvailable": "Actualització disponible",
|
||||
"com.affine.appearanceSettings.font.description": "Trieu l'estil de la lletra",
|
||||
"com.affine.appearanceSettings.font.title": "Estil de la lletra",
|
||||
"com.affine.cloudTempDisable.description": "Estem actualitzant el servei de Núvol d'AFFiNE i temporalment no és disponible per als usuaris. Si voleu estar al dia del progrés i ser notificat quan sigui disponible, podeu omplir el <1>Registre del Núvol d'AFFiNE</1>.",
|
||||
"com.affine.cmdk.affine.category.affine.collections": "Col·leccions",
|
||||
"com.affine.collection-bar.action.tooltip.delete": "Suprimeix",
|
||||
"com.affine.collection-bar.action.tooltip.edit": "Edita",
|
||||
"com.affine.editCollection.button.create": "Crea",
|
||||
"com.affine.editCollection.save": "Desa",
|
||||
"com.affine.editCollection.untitledCollection": "Col·lecció sense títol",
|
||||
"com.affine.export.success.title": "S'ha exportat exitosament",
|
||||
"com.affine.keyboardShortcuts.bold": "Negreta",
|
||||
"com.affine.keyboardShortcuts.cancel": "Cancel·la",
|
||||
"com.affine.keyboardShortcuts.heading": "Encapçalament {{number}}",
|
||||
"com.affine.keyboardShortcuts.image": "Imatge",
|
||||
"com.affine.keyboardShortcuts.italic": "Cursiva",
|
||||
"com.affine.keyboardShortcuts.newPage": "Nova pàgina",
|
||||
"com.affine.keyboardShortcuts.note": "Nota",
|
||||
"com.affine.keyboardShortcuts.quickSearch": "Cerca ràpida",
|
||||
"com.affine.keyboardShortcuts.redo": "Refés",
|
||||
"com.affine.keyboardShortcuts.undo": "Desfés",
|
||||
"com.affine.rootAppSidebar.collections": "Col·leccions",
|
||||
"com.affine.settings.appearance.start-week-description": "Per defecte, la setmana comença el diumenge.",
|
||||
"com.affine.settings.suggestion": "Us calen més opcions de personalització? Expliqueu-nos-ho a la comunitat.",
|
||||
"com.affine.workspaceSubPath.all": "Totes les pàgines",
|
||||
"com.affine.workspaceType.offline": "Disponible sense connexió",
|
||||
"com.affine.write_with_a_blank_page": "Escriviu a una pàgina en blanc"
|
||||
}
|
||||
142
packages/frontend/i18n/src/resources/da.json
Normal file
142
packages/frontend/i18n/src/resources/da.json
Normal file
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "404 Fejl - Siden blev ikke fundet",
|
||||
"AFFiNE Cloud": "AFFiNE Cloud",
|
||||
"AFFiNE Community": "AFFiNE Fællesskab",
|
||||
"About AFFiNE": "Om AFFiNE",
|
||||
"All pages": "Alle sider",
|
||||
"Back Home": "Tilbage til hjemmeside",
|
||||
"Back to all": "Tilbage til alle",
|
||||
"Body text": "Brødtekst",
|
||||
"Bold": "Fed",
|
||||
"Communities": "Fællesskaber",
|
||||
"Confirm": "Bekræft",
|
||||
"Contact Us": "Kontakt os",
|
||||
"Contact with us": "Kontakt Os",
|
||||
"Continue": "Fortsæt",
|
||||
"Continue with Google": "Log ind med Google",
|
||||
"Copy": "Kopier",
|
||||
"Copy Link": "Kopier Link",
|
||||
"Create": "Opret",
|
||||
"Create Or Import": "Opret eller import",
|
||||
"Created": "Oprettet",
|
||||
"Created with": "Oprettet med",
|
||||
"Date": "Dato",
|
||||
"Delete": "Slet",
|
||||
"Delete Member?": "Slet medlem?",
|
||||
"Delete page?": "Slet side?",
|
||||
"Delete permanently": "Slet permanent",
|
||||
"Disable": "Deaktiver",
|
||||
"Discover what's new": "Opdag nyhederne",
|
||||
"Discover what's new!": "Opdag nyhederne!",
|
||||
"Download updates automatically": "Indlæs opdateringerne automatisk",
|
||||
"Edgeless": "Kantløs",
|
||||
"Edit": "Redigér",
|
||||
"Edit Filter": "Redigér filter",
|
||||
"Enable": "Activér",
|
||||
"Enable AFFiNE Cloud": "Activér AFFiNE Cloud",
|
||||
"Export": "Eksportér",
|
||||
"Export to HTML": "Eksportér til HTML",
|
||||
"Export to Markdown": "Eksportér til Markdown",
|
||||
"Export to PDF": "Eksportér til PDF",
|
||||
"Export to PNG": "Eksportér til PNG",
|
||||
"FILE_ALREADY_EXISTS": "Filen eksisterer allerede",
|
||||
"Font Style": "Skrifttype",
|
||||
"General": "Generel",
|
||||
"Get in touch!": "Kom i kontakt!",
|
||||
"Got it": "Forstået",
|
||||
"Group": "Gruppe",
|
||||
"Group as Database": "Grupper som database",
|
||||
"Hand": "Hånd",
|
||||
"Heading": "Overskrift {{number}}",
|
||||
"Image": "Billede",
|
||||
"Import": "Importer",
|
||||
"Increase indent": "Forøg indrykning",
|
||||
"Info": "Info",
|
||||
"Invite": "Inviter",
|
||||
"Invite Members": "Inviter medlemmer",
|
||||
"Italic": "Kursiv",
|
||||
"Leave": "Forlad",
|
||||
"Link": "Link (med vælgt tekst)",
|
||||
"Loading": "Indlæser...",
|
||||
"Member": "Medlem",
|
||||
"Member has been removed": "{{name}} blev fjernet",
|
||||
"Members": "Medlemmer",
|
||||
"Move folder": "Flyt mappe",
|
||||
"Move page to": "Flyt siden til",
|
||||
"Move page to...": "Flyt siden til...",
|
||||
"Move to": "Flyt til",
|
||||
"Move to Trash": "Flyt til papirkurv",
|
||||
"Moved to Trash": "Flyttet til papirkurv",
|
||||
"New Keyword Page": "Ny side {{query}}",
|
||||
"New Page": "Ny side",
|
||||
"New version is ready": "Ny version klar",
|
||||
"None yet": "Intet i øjeblikket",
|
||||
"Not now": "Ikke nu",
|
||||
"Official Website": "Officiel hjemmeside",
|
||||
"Open folder": "Åbn mappe",
|
||||
"Open in new tab": "Åbn i ny tab",
|
||||
"Owner": "Ejer",
|
||||
"Page": "Side",
|
||||
"Paper": "Papir",
|
||||
"Pen": "Pen",
|
||||
"Pending": "Afventer",
|
||||
"Permanently deleted": "Slettet permanent",
|
||||
"Privacy": "Privatliv",
|
||||
"Publish": "Udgiv",
|
||||
"Publish to web": "Udgiv online",
|
||||
"Published to Web": "Udgivet online",
|
||||
"Quick Search": "Hurtig Søgning",
|
||||
"Quick search": "Hurtig søgning",
|
||||
"Quick search placeholder": "Hurtig søgning...",
|
||||
"Quick search placeholder2": "Søg i {{workspace}}",
|
||||
"Recent": "Nylig",
|
||||
"Reduce indent": "Formindsk indrykning",
|
||||
"Removed from Favorites": "Fjernet fra Favoritter",
|
||||
"Rename": "Omdøb",
|
||||
"Restore it": "Gentag",
|
||||
"Save": "Gem",
|
||||
"Select": "Vælg",
|
||||
"Select All": "Vælg alt",
|
||||
"Settings": "Indstillinger",
|
||||
"Share with link": "Del med link",
|
||||
"Shared Pages": "Delte sider",
|
||||
"Shortcuts": "Genveje",
|
||||
"Sign in": "Log ind",
|
||||
"Sign out": "Log ud",
|
||||
"Skip": "Spring over",
|
||||
"Stay logged out": "Forbliv logget ud",
|
||||
"Strikethrough": "Gennemstregning",
|
||||
"Switch": "Skift",
|
||||
"Sync": "Synkroniser",
|
||||
"Tags": "Tags",
|
||||
"Text": "Tekst",
|
||||
"Theme": "Tema",
|
||||
"Title": "Titel",
|
||||
"Trash": "Papirkurv",
|
||||
"Underline": "Understreget",
|
||||
"Undo": "Fortryd",
|
||||
"Unpin": "Frigør",
|
||||
"Untitled": "Unavnet",
|
||||
"Users": "Bruger",
|
||||
"Version": "Version",
|
||||
"all": "alt",
|
||||
"com.affine.edgelessMode": "Kantløs Mode",
|
||||
"com.affine.filter": "Filtrer",
|
||||
"com.affine.filter.after": "efter",
|
||||
"com.affine.filter.before": "før",
|
||||
"com.affine.filter.contains all": "indeholder alt",
|
||||
"com.affine.filter.is": "Er",
|
||||
"com.affine.lastMonth": "Sidste måned",
|
||||
"com.affine.lastWeek": "Sidste uge",
|
||||
"com.affine.lastYear": "Sidste år",
|
||||
"com.affine.new_import": "Importer",
|
||||
"com.affine.settings.appearance": "Udseende",
|
||||
"com.affine.today": "I dag",
|
||||
"com.affine.updater.downloading": "Indlæser",
|
||||
"com.affine.yesterday": "I går",
|
||||
"dark": "Mørk",
|
||||
"light": "Lys",
|
||||
"others": "Andre",
|
||||
"system": "System"
|
||||
}
|
||||
@@ -1,286 +1,59 @@
|
||||
{
|
||||
"404 - Page Not Found": "404 - Seite nicht gefunden",
|
||||
"AFFiNE Cloud": "AFFiNE Cloud",
|
||||
"AFFiNE Community": "AFFiNE Community",
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"About AFFiNE": "Über AFFiNE",
|
||||
"Access level": "Zugriffsberechtigung",
|
||||
"Add Filter": "Filter hinzufügen",
|
||||
"Add Workspace": "Workspace hinzufügen",
|
||||
"Add Workspace Hint": "Auswählen, was du schon hast",
|
||||
"Add a subpage inside": "Unterseite hinzufügen",
|
||||
"Add to Favorites": "Zu Favoriten hinzufügen",
|
||||
"Add to favorites": "Zu Favoriten hinzufügen",
|
||||
"Added Successfully": "Erfolgreich hinzugefügt",
|
||||
"Added to Favorites": "Zu Favoriten hinzugefügt",
|
||||
"All changes are saved locally": "Alle Änderungen sind lokal gespeichert",
|
||||
"All data has been stored in the cloud": "Alle Daten wurden in der Cloud gespeichert.",
|
||||
"All pages": "Alle Seiten",
|
||||
"App Version": "App Version",
|
||||
"Available Offline": "Offline verfügbar",
|
||||
"Back Home": "Zurück zum Start",
|
||||
"Back to Quick Search": "Zurück zur Schnellsuche",
|
||||
"Body text": "Haupttext",
|
||||
"Bold": "Fett",
|
||||
"Cancel": "Abbrechen",
|
||||
"Change avatar hint": "Avatar von allen Mitgliedern ändern.",
|
||||
"Change workspace name hint": "Name von allen Mitgliedern ändern.",
|
||||
"Check Our Docs": "Sieh dir unsere Dokumentation an",
|
||||
"Check for updates": "Nach Updates suchen",
|
||||
"Check for updates automatically": "Automatisch nach Updates suchen",
|
||||
"Cloud Workspace": "Cloud Workspace",
|
||||
"Cloud Workspace Description": "Alle Daten werden synchronisiert und zu dem AffiNE account <1>{{email}}</1> gespeichert",
|
||||
"Code block": "Code-Block",
|
||||
"Collaboration": "Zusammenarbeit",
|
||||
"Collaboration Description": "Für die Zusammenarbeit mit anderen Nutzern werden die AFFiNE Cloud Services benötigt.",
|
||||
"Collapse sidebar": "Seitenleiste einklappen",
|
||||
"Confirm": "Bestätigen",
|
||||
"Connector": "Verbindung (bald verfügbar)",
|
||||
"Contact Us": "Kontaktiere uns",
|
||||
"Contact with us": "Kontaktiere uns",
|
||||
"Continue": "Fortfahren",
|
||||
"Continue with Google": "Mit Google fortfahren",
|
||||
"Convert to ": "Konvertiere zu",
|
||||
"Copied link to clipboard": "Link in die Zwischenablage kopiert",
|
||||
"Copy": "Kopieren",
|
||||
"Copy Link": "Link kopieren",
|
||||
"Create": "Erstellen",
|
||||
"Create Or Import": "Erstellen oder importieren",
|
||||
"Create Shared Link Description": "Erstelle einen Link, den du leicht mit jedem teilen kannst.",
|
||||
"Create your own workspace": "Eigenen Workspace erstellen",
|
||||
"Created": "Erstellt",
|
||||
"Created Successfully": "Erfolgreich erstellt",
|
||||
"Created with": "Erstellt mit",
|
||||
"Customize": "Anpassen",
|
||||
"DB_FILE_ALREADY_LOADED": "Datenbankdatei bereits geladen",
|
||||
"DB_FILE_INVALID": "Ungültige Datenbankdatei",
|
||||
"DB_FILE_PATH_INVALID": "Pfad der Datenbankdatei ungültig",
|
||||
"Data sync mode": "Daten-Sync Modus",
|
||||
"Date": "Datum",
|
||||
"Date Format": "Datumsformat",
|
||||
"Default Location": "Standard-Speicherort",
|
||||
"Default db location hint": "Standardmäßig wird unter {{location}} gespeichert.",
|
||||
"Delete": "Löschen",
|
||||
"Delete Member?": "Mitglied löschen?",
|
||||
"Delete Workspace": "Workspace löschen",
|
||||
"Delete Workspace Description": "Workspace <1>{{workspace}}</1> wird gelöscht und der Inhalt wird verloren sein. Dies kann nicht rückgängig gemacht werden.",
|
||||
"Delete Workspace Description2": "Das Löschen von <1>{{workspace}}</1> wird sowohl lokale als auch Daten in der Cloud löschen. Dies kann nicht rückgängig gemacht werden.",
|
||||
"Delete Workspace Label Hint": "Wenn dieser Workspace gelöscht wird, wird sein gesamter Inhalt für alle Benutzer dauerhaft gelöscht. Niemand wird in der Lage sein, den Inhalt dieses Workspaces wiederherzustellen.",
|
||||
"Delete Workspace placeholder": "Bitte gib als Bestätigung \"Delete\" ein",
|
||||
"Delete page?": "Seite löschen?",
|
||||
"Delete permanently": "Dauerhaft löschen",
|
||||
"Disable": "Deaktivieren",
|
||||
"Disable Public Link": "Öffentlichen Link deaktivieren",
|
||||
"Disable Public Link ?": "Öffentlichen Link deaktivieren ?",
|
||||
"Disable Public Link Description": "Wenn du diesen öffentlichen Link deaktivierst, können andere Personen mit diesem Link nicht mehr auf diese Seite zugreifen.",
|
||||
"Disable Public Sharing": "Öffentliche Freigabe deaktivieren",
|
||||
"Discover what's new": "Erfahre was neu ist!",
|
||||
"Discover what's new!": "Erfahre was neu ist!",
|
||||
"Divider": "Trenner",
|
||||
"Download all data": "Alle Daten herunterladen",
|
||||
"Download core data": "Core Daten herunterladen",
|
||||
"Download data": "{{CoreOrAll}} Daten herunterladen",
|
||||
"Download data Description1": "Es verbraucht mehr Speicherplatz auf deinem Gerät.",
|
||||
"Download data Description2": "Es verbraucht nur wenig Speicherplatz auf deinem Gerät.",
|
||||
"Edgeless": "Edgeless",
|
||||
"Edit": "Bearbeiten",
|
||||
"Edit Filter": "Filter bearbeiten",
|
||||
"Enable": "Aktivieren",
|
||||
"Enable AFFiNE Cloud": "AFFiNE Cloud aktivieren",
|
||||
"Enable AFFiNE Cloud Description": "Falls aktiviert, werden die Daten in diesem Workspace via der AFFiNE Cloud gesichert und synchronisiert.",
|
||||
"Enabled success": "Aktivierung erfolgreich",
|
||||
"Exclude from filter": "Von Filter ausschließen",
|
||||
"Expand sidebar": "Seitenleiste ausklappen",
|
||||
"Export": "Exportieren",
|
||||
"Export AFFiNE backup file": "AFFiNE-Backup als Datei exportieren",
|
||||
"Export Description": "Du kannst alle Workspace Daten zur Sicherung exportieren, und die exportierten Daten können wieder importiert werden.",
|
||||
"Export Shared Pages Description": "Laden eine statische Kopie dieser Seite herunter, um sie mit anderen zu teilen.",
|
||||
"Export Workspace": "Das Exportieren von Workspace <1>{{workspace}}</1> kommt bald",
|
||||
"Export failed": "Export fehlgeschlagen",
|
||||
"Export success": "Export erfolgreich",
|
||||
"Export to HTML": "Zu HTML exportieren",
|
||||
"Export to Markdown": "Zu Markdown exportieren",
|
||||
"Export to PDF": "Zu PDF exportieren",
|
||||
"Export to PNG": "Zu PNG exportieren",
|
||||
"FILE_ALREADY_EXISTS": "Datei existiert bereits",
|
||||
"Failed to publish workspace": "Workspace Veröffentlichung fehlgeschlagen",
|
||||
"Favorite": "Favorisieren",
|
||||
"Favorite pages for easy access": "Favoriten-Seiten für schnellen Zugriff",
|
||||
"Favorited": "Favorisiert",
|
||||
"Favorites": "Favoriten",
|
||||
"Filters": "Filter",
|
||||
"Find 0 result": "0 Ergebnisse gefunden",
|
||||
"Find results": "{{number}} Ergebnis(se) gefunden",
|
||||
"Font Style": "Schriftart",
|
||||
"Force Sign Out": "Abmeldung erwingen",
|
||||
"General": "Generelles",
|
||||
"Get in touch!": "Kontaktiere uns!",
|
||||
"Get in touch! Join our communities": "Nimm teil! Treten Sie unseren Communities bei.",
|
||||
"Get in touch! Join our communities.": "Bleib mit uns in Kontakt und trete unseren Communitys bei!",
|
||||
"Go Back": "Zurück gehen",
|
||||
"Go Forward": "Vorwärts gehen",
|
||||
"Got it": "Verstanden",
|
||||
"Group": "Gruppieren",
|
||||
"Hand": "Hand",
|
||||
"Heading": "Überschrift {{number}}",
|
||||
"Help and Feedback": "Hilfe und Feedback",
|
||||
"How is AFFiNE Alpha different?": "Worin unterscheidet sich AFFiNE Alpha?",
|
||||
"Image": "Bild",
|
||||
"Import": "Importieren",
|
||||
"Increase indent": "Einzug vergrößern",
|
||||
"Info": "Info",
|
||||
"Inline code": "Inline-Code",
|
||||
"Invitation sent": "Einladung gesendet",
|
||||
"Invite": "Einladen",
|
||||
"Invite Members": "Mitglieder einladen",
|
||||
"Invite placeholder": "E-Mails durchsuchen (Unterstützt nur Gmail)",
|
||||
"It takes up little space on your device": "Es nimmt nur wenig Platz auf deinem Gerät ein.",
|
||||
"It takes up little space on your device.": "Es verbraucht nur wenig Speicherplatz auf deinem Gerät.",
|
||||
"It takes up more space on your device": "Es verbraucht mehr Speicherplatz auf deinem Gerät.",
|
||||
"It takes up more space on your device.": "Es verbraucht mehr Speicherplatz auf deinem Gerät.",
|
||||
"Italic": "Kursiv",
|
||||
"Joined Workspace": "Workspace beigetreten",
|
||||
"Jump to": "Springe zu",
|
||||
"Keyboard Shortcuts": "Tastaturkürzel",
|
||||
"Leave": "Verlassen",
|
||||
"Leave Workspace": "Workspace verlassen",
|
||||
"Leave Workspace Description": "Nach dem Verlassen hast du keinen Zugriff mehr auf die Inhalte dieses Workspaces.",
|
||||
"Link": "Hyperlink (mit ausgewähltem Text)",
|
||||
"Loading": "Lade...",
|
||||
"Local Workspace": "Lokaler Workspace",
|
||||
"Local Workspace Description": "Alle Daten sind auf dem aktuellen Gerät gespeichert. Du kannst AFFiNE Cloud für diesen Workspace aktivieren, um deine Daten mit der Cloud zu synchronisieren.",
|
||||
"Markdown Syntax": "Markdown Syntax",
|
||||
"Member": "Mitglied",
|
||||
"Member has been removed": "{{name}} wurde entfernt",
|
||||
"Members": "Mitglieder",
|
||||
"Move folder": "Ordner verschieben",
|
||||
"Move folder hint": "Neuen Speicherort auswählen.",
|
||||
"Move folder success": "Ordnerverschiebung erfolgreich",
|
||||
"Move page to": "Seite verschieben nach...",
|
||||
"Move page to...": "Seite verschieben nach...",
|
||||
"Move to": "Verschieben zu",
|
||||
"Move to Trash": "In Papierkorb verschieben",
|
||||
"Moved to Trash": "In Papierkorb verschoben",
|
||||
"My Workspaces": "Meine Workspaces",
|
||||
"Name Your Workspace": "Workspace benennen",
|
||||
"Navigation Path": "Navigationspfad",
|
||||
"New Keyword Page": "Neue '{{query}}' Seite",
|
||||
"New Page": "Neue Seite",
|
||||
"New Workspace": "Neuer Workspace",
|
||||
"New version is ready": "Neue Version ist verfügbar",
|
||||
"No item": "Kein Inhalt",
|
||||
"Non-Gmail": "Nur Gmail wird unterstützt",
|
||||
"Not now": "Vielleicht später",
|
||||
"Note": "Notiz",
|
||||
"Official Website": "Offizielle Webseite",
|
||||
"Open Workspace Settings": "Workspace Einstellungen öffnen",
|
||||
"Open folder": "Ordner öffnen",
|
||||
"Open folder hint": "Prüfe, wo sich der Speicherordner befindet.",
|
||||
"Open in new tab": "In neuem Tab öffnen",
|
||||
"Organize pages to build knowledge": "Seiten organisieren, um Wissen aufzubauen",
|
||||
"Owner": "Besitzer",
|
||||
"Page": "Seite",
|
||||
"Paper": "Papier",
|
||||
"Pen": "Stift (bald verfügbar)",
|
||||
"Pending": "Ausstehend",
|
||||
"Permanently deleted": "Dauerhaft gelöscht",
|
||||
"Pivots": "Pivots",
|
||||
"Placeholder of delete workspace": "Bitte zur Bestätigung den Workspace-Namen eingeben",
|
||||
"Please make sure you are online": "Bitte stelle sicher, dass du online bist",
|
||||
"Privacy": "Datenschutz",
|
||||
"Publish": "Veröffentlichen",
|
||||
"Publish to web": "Im Web veröffentlichen",
|
||||
"Published Description": "Der aktuelle Workspace wurde im Web veröffentlicht, jeder mit dem Link kann den Inhalt sehen.",
|
||||
"Published to Web": "Im Web veröffentlicht",
|
||||
"Publishing": "Für das Veröffentlichen im Web werden die AFFiNE Cloud Services benötigt.",
|
||||
"Publishing Description": "Nach der Veröffentlichung im Web kann jeder den Inhalt dieses Workspaces über den Link einsehen.",
|
||||
"Quick Search": "Schnelle Suche",
|
||||
"Quick search": "Schnelle Suche",
|
||||
"Quick search placeholder": "Schnelle Suche...",
|
||||
"Quick search placeholder2": "Suche in {{workspace}}",
|
||||
"RFP": "Seiten können frei zu Pivots hinzugefügt/entfernt werden und bleiben über \"Alle Seiten\" zugänglich.",
|
||||
"Recent": "Neueste",
|
||||
"Redo": "Wiederholen",
|
||||
"Reduce indent": "Einzug verringern",
|
||||
"Remove from Pivots": "Von Pivots entfernen",
|
||||
"Remove from favorites": "Von Favoriten entfernen",
|
||||
"Remove from workspace": "Vom Workspace entfernen",
|
||||
"Remove photo": "Foto entfernen",
|
||||
"Removed from Favorites": "Von Favoriten entfernt",
|
||||
"Removed successfully": "Erfolgreich entfernt",
|
||||
"Rename": "Umbenennen",
|
||||
"Restart Install Client Update": "Neustart zum Installieren des Updates",
|
||||
"Restore it": "Wiederherstellen",
|
||||
"Retain cached cloud data": "Zwischengespeicherte Cloud-Daten behalten",
|
||||
"Retain local cached data": "Lokale, zwischengespeicherte Daten beibehalten",
|
||||
"Save": "Speichern",
|
||||
"Saved then enable AFFiNE Cloud": "Alle Änderungen werden lokal gespeichert. Klicke hier, um AFFiNE Cloud zu aktivieren.",
|
||||
"Select": "Auswählen",
|
||||
"Select All": "Alle auswählen",
|
||||
"Set a Workspace name": "Name vom Workspace ändern",
|
||||
"Set database location": "Datenbankstandort festlegen",
|
||||
"Set up an AFFiNE account to sync data": "Für das Synchronisieren wird ein AFFiNE Account benötigt",
|
||||
"Settings": "Einstellungen",
|
||||
"Shape": "Form",
|
||||
"Share Menu Public Workspace Description1": "Laden andere ein, dem Workspace beizutreten oder veröffentliche ihn im Internet.",
|
||||
"Share Menu Public Workspace Description2": "Der aktuelle Workspace wurde im Internet als öffentlicher Workspace veröffentlicht.",
|
||||
"Share with link": "Mit Link teilen",
|
||||
"Shared Pages": "Freigegebene Seiten",
|
||||
"Shared Pages Description": "Die öffentliche Freigabe der Seite erfordert den AFFiNE-Cloud-Dienst.",
|
||||
"Shared Pages In Public Workspace Description": "Der gesamte Workspace wird im Web veröffentlicht und kann über <1>Workspace Einstellungen</1> bearbeitet werden.",
|
||||
"Shortcuts": "Shortcuts",
|
||||
"Sign in": "In AFFiNE Cloud anmelden",
|
||||
"Sign in and Enable": "Anmelden und aktivieren",
|
||||
"Sign out": "Abmelden",
|
||||
"Sign out description": "Nach dem Abmelden gehen alle nicht synchronisierten Inhalte verloren.",
|
||||
"Skip": "Überspringen",
|
||||
"Stay logged out": "Abgemeldet bleiben",
|
||||
"Sticky": "Haftnotiz (bald verfügbar)",
|
||||
"Stop publishing": "Veröffentlichen stoppen",
|
||||
"Storage": "Speicher",
|
||||
"Storage Folder": "Speicherordner",
|
||||
"Strikethrough": "Durchgestrichen",
|
||||
"Successfully deleted": "Erfolgreich gelöscht",
|
||||
"Successfully enabled AFFiNE Cloud": "AFFiNE Cloud erfolgreich aktiviert",
|
||||
"Successfully joined!": "Erfolgreich beigetreten!",
|
||||
"Sync": "Sync",
|
||||
"Sync across devices with AFFiNE Cloud": "Geräteübergreifende Synchronisierung mit AFFiNE Cloud",
|
||||
"Synced with AFFiNE Cloud": "Synchronisiert mit AFFiNE Cloud",
|
||||
"Tags": "Tags",
|
||||
"Terms of Use": "Nutzungsbedingungen",
|
||||
"Text": "Text (bald verfügbar)",
|
||||
"Theme": "Thema",
|
||||
"Title": "Titel",
|
||||
"Trash": "Papierkorb",
|
||||
"TrashButtonGroupDescription": "Das Löschen kann nicht rückgängig gemacht werden. Fortfahren?",
|
||||
"TrashButtonGroupTitle": "Dauerhaft löschen",
|
||||
"UNKNOWN_ERROR": "Unbekannter Fehler",
|
||||
"Underline": "Unterstreichen",
|
||||
"Undo": "Rückgängig",
|
||||
"Ungroup": "Gruppierung aufheben",
|
||||
"Untitled": "Unbenannt",
|
||||
"Update Available": "Update verfügbar",
|
||||
"Update workspace name success": "Update vom Workspace-Namen erfolgreich",
|
||||
"Updated": "Aktualisiert",
|
||||
"Upload": "Hochladen",
|
||||
"Use on current device only": "Nur auf dem aktuellen Gerät verwenden",
|
||||
"Users": "Benutzer",
|
||||
"Version": "Version",
|
||||
"View Navigation Path": "Navigationspfad ansehen",
|
||||
"Visit Workspace": "Workspace besuchen",
|
||||
"Wait for Sync": "Warte auf Sync",
|
||||
"Workspace Avatar": "Workspace Avatar",
|
||||
"Workspace Icon": "Workspace Icon",
|
||||
"Workspace Name": "Workspace Name",
|
||||
"Workspace Not Found": "Workspace nicht gefunden",
|
||||
"Workspace Owner": "Workspace-Besitzer",
|
||||
"Workspace Profile": "Workspace Profil",
|
||||
"Workspace Settings": "Workspace Einstellungen",
|
||||
"Workspace Settings with name": "{{name}}s Einstellungen",
|
||||
"Workspace Type": "Workspace Typ",
|
||||
"Workspace database storage description": "Wähle den Ort, an dem du deinen Workspace erstellen möchten. Die Daten vom Workspace werden standardmäßig lokal gespeichert.",
|
||||
"Workspace description": "Ein Workspace ist dein virtueller Raum zum Erfassen, Gestalten und Planen, ob allein oder gemeinsam im Team.",
|
||||
"You cannot delete the last workspace": "Du kannst den letzten Workspace nicht löschen",
|
||||
"all": "Alle",
|
||||
"com.affine.banner.content": "Dir gefällt die Demo? <1>Lade den AFFiNE Client herunter</1>, um das volle Potenzial zu entdecken.",
|
||||
"com.affine.cloudTempDisable.description": "Wir aktualisieren den AFFiNE Cloud Service und er ist vorübergehend auf dem Client nicht verfügbar. Wenn du auf dem Laufenden bleiben und über die Verfügbarkeit informiert werden möchtest, kannst du das <1>AFFiNE Cloud Anmeldeformular</1> ausfüllen.",
|
||||
"com.affine.cloudTempDisable.title": "Die AFFiNE Cloud wird gerade aufgerüstet.",
|
||||
@@ -289,7 +62,6 @@
|
||||
"com.affine.currentYear": "Aktuelles Jahr",
|
||||
"com.affine.draw_with_a_blank_whiteboard": "Zeichnen mit einem leeren Whiteboard",
|
||||
"com.affine.earlier": "Früher",
|
||||
"com.affine.edgelessMode": "Edgeless-Modus",
|
||||
"com.affine.export.error.message": "Bitte versuche es später wieder.",
|
||||
"com.affine.export.success.title": "Erfolgreich exportiert",
|
||||
"com.affine.filter": "Filter",
|
||||
@@ -312,11 +84,6 @@
|
||||
"com.affine.lastYear": "Letztes Jahr",
|
||||
"com.affine.new_edgeless": "Neuer Edgeless",
|
||||
"com.affine.new_import": "Importieren",
|
||||
"com.affine.onboarding.title1": "Hyperfusion von Whiteboard und Dokumenten",
|
||||
"com.affine.onboarding.title2": "Intuitive und robuste, blockbasierte Bearbeitung",
|
||||
"com.affine.onboarding.videoDescription1": "Wechsle mühelos zwischen dem Seitenmodus für die strukturierte Dokumentenerstellung und dem Whiteboard-Modus für den Ausdruck kreativer Ideen in freier Form.",
|
||||
"com.affine.onboarding.videoDescription2": "Verwende eine modulare Schnittstelle, um strukturierte Dokumente zu erstellen, indem du Textblöcke, Bilder und andere Inhalte einfach per Drag-and-drop anordnen kannst.",
|
||||
"com.affine.pageMode": "Seitenmodus",
|
||||
"com.affine.settings.about.message": "Information über AFFiNE",
|
||||
"com.affine.settings.remove-workspace": "Workspace entfernen",
|
||||
"com.affine.settings.workspace": "Workspace",
|
||||
@@ -327,25 +94,5 @@
|
||||
"com.affine.updater.update-available": "Update verfügbar",
|
||||
"com.affine.workspace.cannot-delete": "Du kannst den letzten Workspace nicht löschen",
|
||||
"com.affine.write_with_a_blank_page": "Schreibe mit einer leeren Seite",
|
||||
"com.affine.yesterday": "Gestern",
|
||||
"core": "Core",
|
||||
"dark": "dunkel",
|
||||
"emptyAllPages": "Dieser Workspace ist leer. Erstelle eine Seite, um sie zu bearbeiten.",
|
||||
"emptyFavorite": "Klicke auf \"Zu Favoriten hinzufügen\" und die Seite wird hier erscheinen",
|
||||
"emptySharedPages": "Freigegebene Seiten werden hier angezeigt.",
|
||||
"emptyTrash": "Klicke auf \"In Papierkorb verschieben\" und die Seite wird hier erscheinen.",
|
||||
"is a Cloud Workspace": "ist ein Cloud Workspace.",
|
||||
"is a Local Workspace": "ist ein lokaler Workspace.",
|
||||
"light": "hell",
|
||||
"login success": "Login erfolgreich",
|
||||
"mobile device": "Sieht aus, als ob du ein mobiles Gerät nutzt.",
|
||||
"mobile device description": "Wir arbeiten noch an der Unterstützung für mobile Geräte und empfehlen dir, ein Desktop-Gerät zu verwenden.",
|
||||
"others": "Andere",
|
||||
"recommendBrowser": "Wir empfehlen den <1>Chrome</1> Browser für die beste Nutzererfahrung.",
|
||||
"restored": "{{title}} wiederhergestellt",
|
||||
"still designed": "(Diese Seite ist noch im Aufbau.)",
|
||||
"system": "system",
|
||||
"upgradeBrowser": "Bitte aktualisiere auf die neueste Chrome-Version, um eine optimale Nutzererfahrung zu gewährleisten.",
|
||||
"will be moved to Trash": "{{title}} wird in den Papierkorb verschoben",
|
||||
"will delete member": "wird Mitglied löschen"
|
||||
"com.affine.yesterday": "Gestern"
|
||||
}
|
||||
|
||||
16
packages/frontend/i18n/src/resources/en-US.json
Normal file
16
packages/frontend/i18n/src/resources/en-US.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"Add to Favorites": "Add to Favorites",
|
||||
"Added to Favorites": "Added to Favorites",
|
||||
"Customize": "Customize",
|
||||
"Enable AFFiNE Cloud Description": "If enabled, the data in this workspace will be backed up and synchronized via AFFiNE Cloud.",
|
||||
"Favorite": "Favorite",
|
||||
"Favorited": "Favorited",
|
||||
"Favorites": "Favorites",
|
||||
"Remove from favorites": "Remove from favorites",
|
||||
"Removed from Favorites": "Removed from Favorites",
|
||||
"com.affine.filter.is-favourited": "Favorited",
|
||||
"com.affine.settings.suggestion": "Need more customization options? You can suggest them to us in the community.",
|
||||
"com.affine.settings.workspace.description": "You can customize your workspace here.",
|
||||
"emptyFavorite": "Click Add to Favorites and the page will appear here."
|
||||
}
|
||||
@@ -406,12 +406,10 @@
|
||||
"com.affine.appearanceSettings.windowFrame.description": "Customise appearance of Windows Client.",
|
||||
"com.affine.appearanceSettings.windowFrame.frameless": "Frameless",
|
||||
"com.affine.appearanceSettings.windowFrame.title": "Window frame style",
|
||||
"com.affine.auth.verify.email.message": "Your current email is {{email}}. We’ll send a temporary verification link to this email.",
|
||||
"com.affine.auth.change.email.message": "Your current email is {{email}}. We’ll send a temporary verification link to this email.",
|
||||
"com.affine.auth.change.email.page.subtitle": "Please enter your new email address below. We will send a verification link to this email address to complete the process.",
|
||||
"com.affine.auth.change.email.page.success.subtitle": "Congratulations! You have successfully updated the email address associated with your AFFiNE Cloud account.",
|
||||
"com.affine.auth.change.email.page.success.title": "Email address updated!",
|
||||
"com.affine.auth.verify.email.page.success.title": "Email address verified!",
|
||||
"com.affine.auth.verify.email.page.success.subtitle": "Congratulations! You have successfully verified the email address associated with your AFFiNE Cloud account.",
|
||||
"com.affine.auth.change.email.page.title": "Change email address",
|
||||
"com.affine.auth.create.count": "Create Account",
|
||||
"com.affine.auth.desktop.signing.in": "Signing in...",
|
||||
@@ -432,21 +430,23 @@
|
||||
"com.affine.auth.reset.password.message": "You will receive an email with a link to reset your password. Please check your inbox.",
|
||||
"com.affine.auth.reset.password.page.success": "Password reset successful",
|
||||
"com.affine.auth.reset.password.page.title": "Reset your AFFiNE Cloud password",
|
||||
"com.affine.auth.send.verify.email.hint": "Send verification link",
|
||||
"com.affine.auth.send.change.email.link": "Send verification link",
|
||||
"com.affine.auth.send.reset.password.link": "Send reset link",
|
||||
"com.affine.auth.send.set.password.link": "Send set link",
|
||||
"com.affine.auth.send.verify.email.hint": "Send verification link",
|
||||
"com.affine.auth.sent": "Sent",
|
||||
"com.affine.auth.sent.verify.email.hint": "Verification link has been sent.",
|
||||
"com.affine.auth.sent.change.email.fail": "The verification link failed to be sent, please try again later.",
|
||||
"com.affine.auth.sent.change.email.hint": "Verification link has been sent.",
|
||||
"com.affine.auth.sent.change.password.hint": "Reset password link has been sent.",
|
||||
"com.affine.auth.sent.reset.password.success.message": "Your password has upgraded! You can sign in AFFiNE Cloud with new password!",
|
||||
"com.affine.auth.sent.set.password.hint": "Set password link has been sent.",
|
||||
"com.affine.auth.sent.set.password.success.message": "Your password has saved! You can sign in AFFiNE Cloud with email and password!",
|
||||
"com.affine.auth.sent.verify.email.hint": "Verification link has been sent.",
|
||||
"com.affine.auth.set.email.save": "Save Email",
|
||||
"com.affine.auth.set.password": "Set password",
|
||||
"com.affine.auth.set.password.message": "Please set a password of {{min}}-{{max}} characters with both letters and numbers to continue signing up with ",
|
||||
"com.affine.auth.set.password.message.minlength": "Minimum {{min}} characters",
|
||||
"com.affine.auth.set.password.message.maxlength": "Maximum {{max}} characters",
|
||||
"com.affine.auth.set.password.message.minlength": "Minimum {{min}} characters",
|
||||
"com.affine.auth.set.password.page.success": "Password set successful",
|
||||
"com.affine.auth.set.password.page.title": "Set your AFFiNE Cloud password",
|
||||
"com.affine.auth.set.password.placeholder": "Set a password at least {{min}} letters long",
|
||||
@@ -487,6 +487,9 @@
|
||||
"com.affine.auth.toast.message.signed-in": "You have been signed in, start to sync your data with AFFiNE Cloud!",
|
||||
"com.affine.auth.toast.title.failed": "Unable to sign in",
|
||||
"com.affine.auth.toast.title.signed-in": "Signed in",
|
||||
"com.affine.auth.verify.email.message": "Your current email is {{email}}. We’ll send a temporary verification link to this email.",
|
||||
"com.affine.auth.verify.email.page.success.subtitle": "Congratulations! You have successfully verified the email address associated with your AFFiNE Cloud account.",
|
||||
"com.affine.auth.verify.email.page.success.title": "Email address verified!",
|
||||
"com.affine.backButton": "Back",
|
||||
"com.affine.banner.content": "This demo is limited. <1>Download the AFFiNE Client</1> for the latest features and Performance.",
|
||||
"com.affine.banner.local-warning": "Your local data is stored in the browser and may be lost. Don't risk it - enable cloud now!",
|
||||
@@ -573,12 +576,19 @@
|
||||
"com.affine.collection.toolbar.selected": "<0>{{count}}</0> selected",
|
||||
"com.affine.collection.toolbar.selected_one": "<0>{{count}}</0> collection selected",
|
||||
"com.affine.collection.toolbar.selected_other": "<0>{{count}}</0> collection(s) selected",
|
||||
"com.affine.collection.toolbar.selected_others": "<0>{{count}}</0> collection(s) selected",
|
||||
"com.affine.collectionBar.backToAll": "Back to all",
|
||||
"com.affine.collections.empty.message": "No collections",
|
||||
"com.affine.collections.empty.new-collection-button": "New Collection",
|
||||
"com.affine.collections.header": "Collections",
|
||||
"com.affine.confirmModal.button.cancel": "Cancel",
|
||||
"com.affine.currentYear": "Current Year",
|
||||
"com.affine.delete-tags.confirm.description": "Deleting <1>{{tag}}</1> cannot be undone, please proceed with caution.",
|
||||
"com.affine.delete-tags.confirm.multi-tag-description": "Deleting {{count}} tags cannot be undone, please proceed with caution.",
|
||||
"com.affine.delete-tags.confirm.title": "Delete Tag?",
|
||||
"com.affine.delete-tags.count": "{{count}} tag deleted",
|
||||
"com.affine.delete-tags.count_one": "{{count}} tag deleted",
|
||||
"com.affine.delete-tags.count_other": "{{count}} tags deleted",
|
||||
"com.affine.deleteLeaveWorkspace.description": "Delete workspace from this device and optionally delete all data.",
|
||||
"com.affine.deleteLeaveWorkspace.leave": "Leave Workspace",
|
||||
"com.affine.deleteLeaveWorkspace.leaveDescription": "After you leave, you will not be able to access content within this workspace.",
|
||||
@@ -627,7 +637,7 @@
|
||||
"com.affine.emptyDesc.tag": "There's no tag here yet",
|
||||
"com.affine.enableAffineCloudModal.button.cancel": "Cancel",
|
||||
"com.affine.error.contact.description": "If you are still experiencing this issue, please <1>contact us through the community.</1>",
|
||||
"com.affine.error.no-page-root.title": "Page content is missing",
|
||||
"com.affine.error.no-page-root.title": "Doc content is missing",
|
||||
"com.affine.error.page-not-found.title": "Refresh",
|
||||
"com.affine.error.refetch": "Refetch",
|
||||
"com.affine.error.reload": "Reload",
|
||||
@@ -804,11 +814,22 @@
|
||||
"com.affine.page-properties.settings.title": "customize properties",
|
||||
"com.affine.page-properties.tags.open-tags-page": "Open tag page",
|
||||
"com.affine.page-properties.tags.selector-header-title": "Select tag or create one",
|
||||
"com.affine.page.display": "Display",
|
||||
"com.affine.page.display.display-properties": "Display properties",
|
||||
"com.affine.page.display.display-properties.body-notes": "Body notes",
|
||||
"com.affine.page.display.grouping": "Grouping",
|
||||
"com.affine.page.display.grouping.group-by-favourites": "Favourites",
|
||||
"com.affine.page.display.grouping.group-by-tag": "Tag",
|
||||
"com.affine.page.display.grouping.no-grouping": "No Grouping",
|
||||
"com.affine.page.display.list-option": "List option",
|
||||
"com.affine.page.group-header.clear": "Clear Selection",
|
||||
"com.affine.page.group-header.favourited": "Favourited",
|
||||
"com.affine.page.group-header.not-favourited": "Not Favourited",
|
||||
"com.affine.page.group-header.select-all": "Select All",
|
||||
"com.affine.page.toolbar.selected": "<0>{{count}}</0> selected",
|
||||
"com.affine.page.toolbar.selected_one": "<0>{{count}}</0> doc selected",
|
||||
"com.affine.page.toolbar.selected_other": "<0>{{count}}</0> doc(s) selected",
|
||||
"com.affine.page.toolbar.selected_others": "<0>{{count}}</0> doc(s) selected",
|
||||
"com.affine.pageMode": "Doc Mode",
|
||||
"com.affine.pageMode.all": "all",
|
||||
"com.affine.pageMode.edgeless": "Edgeless",
|
||||
@@ -915,10 +936,13 @@
|
||||
"com.affine.publicLinkDisableModal.button.disable": "Disable",
|
||||
"com.affine.publicLinkDisableModal.description": "Disabling this public link will prevent anyone with the link from accessing this doc.",
|
||||
"com.affine.publicLinkDisableModal.title": "Disable Public Link",
|
||||
"com.affine.resetSyncStatus.button": "Reset Sync",
|
||||
"com.affine.resetSyncStatus.description": "This operation may fix some synchronization issues.",
|
||||
"com.affine.rootAppSidebar.collections": "Collections",
|
||||
"com.affine.rootAppSidebar.favorites": "Favourites",
|
||||
"com.affine.rootAppSidebar.favorites.empty": "You can add documents to your favourites",
|
||||
"com.affine.rootAppSidebar.others": "Others",
|
||||
"com.affine.search-tags.placeholder": "Type here ...",
|
||||
"com.affine.selectPage.empty": "Empty",
|
||||
"com.affine.selectPage.empty.tips": "No doc titles contain <1>{{search}}</1>",
|
||||
"com.affine.selectPage.selected": "Selected",
|
||||
@@ -955,6 +979,7 @@
|
||||
"com.affine.settings.auto-check-description": "If enabled, it will automatically check for new versions at regular intervals.",
|
||||
"com.affine.settings.auto-download-description": " If enabled, new versions will be automatically downloaded to the current device.",
|
||||
"com.affine.settings.email": "Email",
|
||||
"com.affine.settings.email.action": "Change Email",
|
||||
"com.affine.settings.email.action.change": "Change Email",
|
||||
"com.affine.settings.email.action.verify": "Verify Email",
|
||||
"com.affine.settings.member-tooltip": "Enable AFFiNE Cloud to collaborate with others",
|
||||
@@ -1033,6 +1058,10 @@
|
||||
"com.affine.share-menu.share-privately.description": "Only members of this Workspace can open this link.",
|
||||
"com.affine.share-menu.shareButton": "Share",
|
||||
"com.affine.share-menu.sharedButton": "Shared",
|
||||
"com.affine.share-page.footer.built-with": "Built with",
|
||||
"com.affine.share-page.footer.create-with": "Create with",
|
||||
"com.affine.share-page.footer.description": "Empower your sharing with AffiNE Cloud: One-click doc sharing",
|
||||
"com.affine.share-page.footer.get-started": "Get started for free",
|
||||
"com.affine.share-page.header.present": "Present",
|
||||
"com.affine.shortcutsTitle.edgeless": "Edgeless",
|
||||
"com.affine.shortcutsTitle.general": "General",
|
||||
@@ -1057,6 +1086,19 @@
|
||||
"com.affine.tag.toolbar.selected": "<0>{{count}}</0> selected",
|
||||
"com.affine.tag.toolbar.selected_one": "<0>{{count}}</0> tag selected",
|
||||
"com.affine.tag.toolbar.selected_other": "<0>{{count}}</0> tag(s) selected",
|
||||
"com.affine.tag.toolbar.selected_others": "<0>{{count}}</0> tag(s) selected",
|
||||
"com.affine.tags.count": "{{count}} doc",
|
||||
"com.affine.tags.count_one": "{{count}} doc",
|
||||
"com.affine.tags.count_other": "{{count}} docs",
|
||||
"com.affine.tags.count_zero": "{{count}} doc",
|
||||
"com.affine.tags.create-tag.placeholder": "Type tag name here...",
|
||||
"com.affine.tags.create-tag.toast.exist": "Tag already exists",
|
||||
"com.affine.tags.create-tag.toast.success": "Tag created",
|
||||
"com.affine.tags.delete-tags.toast": "Tag deleted",
|
||||
"com.affine.tags.edit-tag.toast.success": "Tag updated",
|
||||
"com.affine.tags.empty.new-tag-button": "New Tag",
|
||||
"com.affine.telemetry.enable": "Enable Telemetry",
|
||||
"com.affine.telemetry.enable.desc": "Telemetry is a feature that allows us to collect data on how you use the app. This data helps us improve the app and provide better features.",
|
||||
"com.affine.themeSettings.dark": "Dark",
|
||||
"com.affine.themeSettings.light": "Light",
|
||||
"com.affine.themeSettings.system": "System",
|
||||
@@ -1088,6 +1130,12 @@
|
||||
"com.affine.upgrade.tips.done": "After upgrading the workspace data, please refresh the page to see the changes.",
|
||||
"com.affine.upgrade.tips.error": "We encountered some errors while upgrading the workspace data.",
|
||||
"com.affine.upgrade.tips.normal": "To ensure compatibility with the updated AFFiNE client, please upgrade your data by clicking the \"Upgrade Workspace Data\" button below.",
|
||||
"com.affine.workbench.split-view-menu.close": "Close",
|
||||
"com.affine.workbench.split-view-menu.full-screen": "Full Screen",
|
||||
"com.affine.workbench.split-view-menu.keep-this-one": "Solo View",
|
||||
"com.affine.workbench.split-view-menu.move-left": "Move Left",
|
||||
"com.affine.workbench.split-view-menu.move-right": "Move Right",
|
||||
"com.affine.workbench.split-view.page-menu-open": "Open in split view",
|
||||
"com.affine.workspace.cannot-delete": "You cannot delete the last workspace",
|
||||
"com.affine.workspace.cloud": "Cloud Workspaces",
|
||||
"com.affine.workspace.cloud.account.logout": "Sign Out",
|
||||
@@ -1120,8 +1168,6 @@
|
||||
"com.affine.workspaceType.offline": "Available Offline",
|
||||
"com.affine.write_with_a_blank_page": "Write with a blank page",
|
||||
"com.affine.yesterday": "Yesterday",
|
||||
"com.affine.telemetry.enable": "Enable Telemetry",
|
||||
"com.affine.telemetry.enable.desc": "Telemetry is a feature that allows us to collect data on how you use the app. This data helps us improve the app and provide better features.",
|
||||
"core": "core",
|
||||
"dark": "Dark",
|
||||
"emptyAllPages": "Click on the <1>$t(New Doc)</1> button to create your first doc.",
|
||||
@@ -1145,44 +1191,5 @@
|
||||
"unnamed": "unnamed",
|
||||
"upgradeBrowser": "Please upgrade to the latest version of Chrome for the best experience.",
|
||||
"will be moved to Trash": "{{title}} will be moved to Trash",
|
||||
"will delete member": "will delete member",
|
||||
"com.affine.share-page.footer.create-with": "Create with",
|
||||
"com.affine.share-page.footer.built-with": "Built with",
|
||||
"com.affine.share-page.footer.description": "Empower your sharing with AffiNE Cloud: One-click doc sharing",
|
||||
"com.affine.share-page.footer.get-started": "Get started for free",
|
||||
"com.affine.workbench.split-view-menu.close": "Close",
|
||||
"com.affine.workbench.split-view-menu.move-left": "Move Left",
|
||||
"com.affine.workbench.split-view-menu.move-right": "Move Right",
|
||||
"com.affine.workbench.split-view-menu.full-screen": "Full Screen",
|
||||
"com.affine.tags.empty.new-tag-button": "New Tag",
|
||||
"com.affine.tags.create-tag.placeholder": "Type tag name here...",
|
||||
"com.affine.tags.create-tag.toast.success": "Tag created",
|
||||
"com.affine.tags.create-tag.toast.exist": "Tag already exists",
|
||||
"com.affine.tags.edit-tag.toast.success": "Tag updated",
|
||||
"com.affine.tags.count": "{{count}} doc",
|
||||
"com.affine.tags.count_zero": "{{count}} doc",
|
||||
"com.affine.tags.count_one": "{{count}} doc",
|
||||
"com.affine.tags.count_other": "{{count}} docs",
|
||||
"com.affine.tags.delete-tags.toast": "Tag deleted",
|
||||
"com.affine.delete-tags.count": "{{count}} tag deleted",
|
||||
"com.affine.delete-tags.count_one": "{{count}} tag deleted",
|
||||
"com.affine.delete-tags.count_other": "{{count}} tags deleted",
|
||||
"com.affine.delete-tags.confirm.title": "Delete Tag?",
|
||||
"com.affine.delete-tags.confirm.description": "Deleting <1>{{tag}}</1> cannot be undone, please proceed with caution.",
|
||||
"com.affine.delete-tags.confirm.multi-tag-description": "Deleting {{count}} tags cannot be undone, please proceed with caution.",
|
||||
"com.affine.workbench.split-view-menu.keep-this-one": "Solo View",
|
||||
"com.affine.workbench.split-view.page-menu-open": "Open in split view",
|
||||
"com.affine.search-tags.placeholder": "Type here ...",
|
||||
"com.affine.resetSyncStatus.button": "Reset Sync",
|
||||
"com.affine.resetSyncStatus.description": "This operation may fix some synchronization issues.",
|
||||
"com.affine.page.group-header.favourited": "Favourited",
|
||||
"com.affine.page.group-header.not-favourited": "Not Favourited",
|
||||
"com.affine.page.display": "Display",
|
||||
"com.affine.page.display.grouping": "Grouping",
|
||||
"com.affine.page.display.grouping.no-grouping": "No Grouping",
|
||||
"com.affine.page.display.grouping.group-by-tag": "Tag",
|
||||
"com.affine.page.display.grouping.group-by-favourites": "Favourites",
|
||||
"com.affine.page.display.list-option": "List option",
|
||||
"com.affine.page.display.display-properties": "Display properties",
|
||||
"com.affine.page.display.display-properties.body-notes": "Body notes"
|
||||
"will delete member": "will delete member"
|
||||
}
|
||||
|
||||
40
packages/frontend/i18n/src/resources/es-CL.json
Normal file
40
packages/frontend/i18n/src/resources/es-CL.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "Error 404 - Página no encontrada",
|
||||
"AFFiNE Cloud": "AFFiNE en la Nube",
|
||||
"AFFiNE Community": "Comunidad AFFiNE",
|
||||
"About AFFiNE": "Qué es AFFiNE?",
|
||||
"Access level": "Nivel de acceso",
|
||||
"Add Filter": "Agregar filtro",
|
||||
"Add Workspace": "Agregar Espacio de Trabajo",
|
||||
"Add Workspace Hint": "Selecciona una base de datos existente",
|
||||
"Add a subpage inside": "Agrega una subpágina",
|
||||
"Add to Favorites": "Agregar a Favoritos",
|
||||
"Add to favorites": "Agregar a favoritos",
|
||||
"Added Successfully": "Exito! Agregado!",
|
||||
"Added to Favorites": "Agregado a Favoritos",
|
||||
"All changes are saved locally": "Todos los cambios guardados en local.",
|
||||
"All data has been stored in the cloud": "Todos los datos han sido guardados en la nube.",
|
||||
"All pages": "Todas las páginas",
|
||||
"Appearance Settings": "Personalizar Apariencia",
|
||||
"Append to Daily Note": "Agregar a Nota Diaria",
|
||||
"Available Offline": "Disponible sin conexión",
|
||||
"Back Home": "Volver al Inicio",
|
||||
"Back to Quick Search": "Volver a búsqueda rápida",
|
||||
"Continue with Google": "Continuar en Google",
|
||||
"Convert to ": "Convertir a",
|
||||
"Copied link to clipboard": "Link copiado!",
|
||||
"Copy": "Copiar",
|
||||
"Copy Link": "Copiar link",
|
||||
"Create": "Crear",
|
||||
"Create Or Import": "Crear o importar",
|
||||
"Create Shared Link Description": "Crear un link para compartir",
|
||||
"Create your own workspace": "Crea tu propio espacio de trabajo",
|
||||
"Date": "Fecha",
|
||||
"Date Format": "Formato de fecha",
|
||||
"Default Location": "Ubicación por defecto",
|
||||
"Default db location hint": "Será guardado por defecto en {{location}}",
|
||||
"Delete": "Borrar",
|
||||
"Delete Member?": "Borrar Miembro?",
|
||||
"Delete Workspace": "Borrar Espacio de Trabajo"
|
||||
}
|
||||
@@ -1,105 +1,29 @@
|
||||
{
|
||||
"404 - Page Not Found": "Error 404 - Página no encontrada",
|
||||
"404.back": "Volver a Mi Contenido",
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404.hint": "Lo sentimos, no tienes acceso o este contenido no existe...",
|
||||
"404.signOut": "Iniciar sesión con otra cuenta",
|
||||
"AFFiNE Cloud": "Affine Cloud",
|
||||
"AFFiNE Community": "Comunidad de AFFiNE",
|
||||
"About AFFiNE": "Sobre AFFiNE",
|
||||
"Access level": "Nivel de permisos",
|
||||
"Add Filter": "Agregar Filtro",
|
||||
"Add Workspace": "Añadir Espacio de trabajo",
|
||||
"Add Workspace Hint": "Seleccionar un archivo de base de datos ya existente ",
|
||||
"Add a subpage inside": "Añadir subpágina",
|
||||
"Add to Favorites": "Añadir a Favoritos",
|
||||
"Add to favorites": "Añadir a favoritos",
|
||||
"Added Successfully": "Añadido exitosamente ",
|
||||
"Added to Favorites": "Añadido a Favoritos",
|
||||
"All changes are saved locally": "Todos los cambios se guardaron localmente",
|
||||
"All data has been stored in the cloud": "Todos los datos han sido almacenados en la nube.",
|
||||
"All pages": "Todas las páginas ",
|
||||
"App Version": "Versión de la aplicación",
|
||||
"Appearance Settings": "Ajustes de Apariencia",
|
||||
"Append to Daily Note": "Añadir a la nota diaria ",
|
||||
"Available Offline": "Disponible Offline",
|
||||
"Back Home": "Volver al inicio",
|
||||
"Back to Quick Search": "Volver a la barra de búsqueda",
|
||||
"Body text": "Cuerpo del texto",
|
||||
"Bold": "Negrita",
|
||||
"Cancel": "Cancelar",
|
||||
"Change avatar hint": "El nuevo avatar se mostrará para todos",
|
||||
"Change workspace name hint": "El nuevo nombre se mostrará para todos",
|
||||
"Changelog description": "Ver el registro de cambios de AFFiNE",
|
||||
"Check Keyboard Shortcuts quickly": "Revisar las teclas de acceso rápido",
|
||||
"Check Our Docs": "Revisa nuestra documentación",
|
||||
"Check for updates": "Comprobar nuevas actualizaciones",
|
||||
"Check for updates automatically": "Comprobar nuevas actualizaciones automáticamente",
|
||||
"Choose your font style": "Elegir estilo de fuente",
|
||||
"Click to replace photo": "Click para reemplazar foto",
|
||||
"Client Border Style": "Estilo de borde del cliente",
|
||||
"Cloud Workspace": "Espacio de trabajo en la nube",
|
||||
"Cloud Workspace Description": "Todos los datos se sincronizarán y guardarán en la cuenta de AFFINE <1>{{email}}</1>",
|
||||
"Code block": "Bloque de código",
|
||||
"Collaboration": "Colaboración",
|
||||
"Collaboration Description": "Colaborar con otros miembros requiere AFFINE Cloud",
|
||||
"Collapse sidebar": "Ocultar panel lateral.",
|
||||
"Collections": "Colecciones",
|
||||
"Communities": "Comunidades",
|
||||
"Confirm": "Confirmar",
|
||||
"Connector": "Conector",
|
||||
"Contact Us": "Contáctanos",
|
||||
"Contact with us": "Contáctanos",
|
||||
"Continue": "Continuar",
|
||||
"Continue with Google": "Iniciar sesión con Google",
|
||||
"Convert to ": "Convertir a",
|
||||
"Copied link to clipboard": "Enlace copiado al portapapeles",
|
||||
"Copy": "Copiar",
|
||||
"Copy Link": "Copiar enlace",
|
||||
"Create": "Crear",
|
||||
"Create Or Import": "Crear o importar",
|
||||
"Create Shared Link Description": "Crea un enlace que puedes compartir fácilmente con cualquiera.",
|
||||
"Create a collection": "Crear una colección",
|
||||
"Create your own workspace": "Crear tu propio espacio de trabajo",
|
||||
"Created": "Creado",
|
||||
"Created Successfully": "Creado exitosamente",
|
||||
"Created with": "Creado con",
|
||||
"Curve Connector": "Conector Curvo",
|
||||
"Customize": "Personalizar",
|
||||
"Customize your AFFiNE Appearance": "Personalizar la apariencia de AFFiNE",
|
||||
"DB_FILE_ALREADY_LOADED": "Archivo de base de datos cargado",
|
||||
"DB_FILE_INVALID": "Archivo de base de datos inválido",
|
||||
"DB_FILE_MIGRATION_FAILED": "Migración de archivo de base de datos fallida",
|
||||
"DB_FILE_PATH_INVALID": "Ruta de archivo de base de datos inválida",
|
||||
"Data sync mode": "Modo de sincronización de datos",
|
||||
"Date": "Fecha",
|
||||
"Date Format": "Formato de fecha",
|
||||
"Default Location": "Ubicación predeterminada",
|
||||
"Default db location hint": "Por defecto se guardará en {{location}}",
|
||||
"Delete": "Eliminar",
|
||||
"Delete Member?": "¿Eliminar Miembro?",
|
||||
"Delete Workspace": "Eliminar Espacio de trabajo",
|
||||
"Delete Workspace Description": "Borrar <1>{{workspace}}</1> no se puede deshacer, procede con cuidado. Todo su contenido se borrará.",
|
||||
"Delete Workspace Description2": "Borrar <1>{{workspace}}</1> borrará tanto los datos locales como en la nube, esta operación no se puede deshacer, procede con cuidado.",
|
||||
"Delete Workspace Label Hint": "Al borrar este espacio de trabajo, se borrará su contenido de forma permanente para todos. Nadie será capaz de recuperar su contenido.",
|
||||
"Delete Workspace placeholder": "Por favor escribe \"Delete\" para confirmar",
|
||||
"Delete page?": "¿Eliminar página?",
|
||||
"Delete permanently": "Eliminar permanentemente ",
|
||||
"Disable": "Desactivar",
|
||||
"Disable Public Link": "Deshabilitar enlace público",
|
||||
"Disable Public Link ?": "¿Deshabilitar enlace público?",
|
||||
"Disable Public Link Description": "Desabilitar este enlace público impedirá que cualquier persona con el enlace pueda acceder a la página.",
|
||||
"Disable Public Sharing": "Dejar de compartir al público",
|
||||
"Discover what's new": "Descubre que hay de nuevo.",
|
||||
"Discover what's new!": "¡Descubre las novedades!",
|
||||
"Display Language": "Idioma",
|
||||
"Divider": "Divisor",
|
||||
"Download all data": "Descargar todos los datos",
|
||||
"Download data Description1": "Ocupará más espacio en tu dispositivo",
|
||||
"Download data Description2": "Ocupará menos espacio en tu dispositivo",
|
||||
"Download updates automatically": "Descargar actualizaciones automáticamente ",
|
||||
"Early Access Stage": "Etapa de acceso anticipado",
|
||||
"Edgeless": "Sin bordes",
|
||||
"Edit": "Editar",
|
||||
"Edit Filter": "Editar Filtro",
|
||||
"Editor Version": "Versión del Editor",
|
||||
"Elbowed Connector": "Conector de codo",
|
||||
@@ -118,15 +42,8 @@
|
||||
"Export Workspace": "Exportar espacio de trabajo <1>{{workspace}}</1> llegará pronto",
|
||||
"Export failed": "Exportación fallida",
|
||||
"Export success": "Exportación correcta",
|
||||
"Export to HTML": "Exportar a HTML",
|
||||
"Export to Markdown": "Exportar a Markdown",
|
||||
"Export to PDF": "Exportar a PDF",
|
||||
"Export to PNG": "Exportar a PNG",
|
||||
"FILE_ALREADY_EXISTS": "Ya existe un archivo con ese nombre",
|
||||
"Failed to publish workspace": "Publicación de espacio de trabajo fallida",
|
||||
"Favorite": "Favorito",
|
||||
"Favorited": "Añadido a favoritos",
|
||||
"Favorites": "Favoritos",
|
||||
"Filters": "Filtros",
|
||||
"Find 0 result": "Se encontraron 0 resultados",
|
||||
"Find results": "Se encontró {{number}} resultado(s)",
|
||||
@@ -147,14 +64,9 @@
|
||||
"Help and Feedback": "Ayuda y comentarios",
|
||||
"How is AFFiNE Alpha different?": "Cuan diferente es AFFiNE Alpha?",
|
||||
"Image": "Imagen",
|
||||
"Import": "Importar",
|
||||
"Increase indent": "Aumentar sangria",
|
||||
"Info": "Información",
|
||||
"Info of legal": "Información legal",
|
||||
"Inline code": "Código de una línea",
|
||||
"Invitation sent": "Invitación enviada",
|
||||
"Invitation sent hint": "Los miembros invitados han sido notificados a su email para unirse a este Espacio de trabajo",
|
||||
"Invite": "Invitar",
|
||||
"Invite Members": "Invitar a Miembros",
|
||||
"Invite Members Message": "Los miembros invitados podrán colaborar contigo en este Espacio de trabajo",
|
||||
"Invite placeholder": "Buscar mail (Soporte sólo para Gmail)",
|
||||
|
||||
@@ -1,354 +1,88 @@
|
||||
{
|
||||
"404 - Page Not Found": "Erreur 404 - Page non trouvée",
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404.back": "Retour vers Mon Contenu",
|
||||
"404.hint": "Désolé, vous n'avez pas accès à ce contenu, ou celui-ci n'existe pas…",
|
||||
"404.signOut": "Se connecter à un autre compte",
|
||||
"AFFiNE Cloud": "AFFiNE Cloud",
|
||||
"AFFiNE Community": "Communauté AFFiNE",
|
||||
"About AFFiNE": "À propos d'AFFiNE",
|
||||
"Access level": "Permissions",
|
||||
"Actions": "Action",
|
||||
"Add Filter": "Ajouter un filtre",
|
||||
"Add Workspace": "Ajouter un nouvel espace de travail",
|
||||
"Add Workspace Hint": "Sélectionnez le fichier de la base de données déjà existant",
|
||||
"Add a subpage inside": "Ajouter une sous-page à l'intérieur ",
|
||||
"Add to Favorites": "Ajouter aux Favoris",
|
||||
"Add to favorites": "Ajouter aux favoris",
|
||||
"Added Successfully": "Ajouté avec succès",
|
||||
"Added to Favorites": "Ajouté aux favoris ",
|
||||
"All changes are saved locally": "Les changements sont sauvegardés localement",
|
||||
"All data has been stored in the cloud": "Toutes les données ont été sauvegardées dans le cloud.",
|
||||
"All pages": "Toutes les pages",
|
||||
"App Version": "Version",
|
||||
"Appearance Settings": "Paramètres d'apparence",
|
||||
"Append to Daily Note": "Ajouter à la note journalière",
|
||||
"Available Offline": "Disponible hors ligne",
|
||||
"Back Home": "Retour à l'accueil",
|
||||
"Back to Quick Search": "Retourner à la Recherche Rapide",
|
||||
"Back to all": "Retour à tous",
|
||||
"Body text": "Corps du texte",
|
||||
"Bold": "Gras",
|
||||
"Cancel": "Annuler ",
|
||||
"Change avatar hint": "Le nouvel avatar s'affichera pour tout le monde.",
|
||||
"Change workspace name hint": "Le nouveau nom s'affichera pour tout le monde.",
|
||||
"Changelog description": "Voir le journal des modifications d'AFFiNE",
|
||||
"Check Keyboard Shortcuts quickly": "Regarder rapidement les raccourcis clavier",
|
||||
"Check Our Docs": "Consultez notre documentation",
|
||||
"Check for updates": "Vérifier pour les mises à jour",
|
||||
"Check for updates automatically": "Vérifier automatiquement les mises à jours",
|
||||
"Choose your font style": "Choisissez votre police de caractères",
|
||||
"Click to replace photo": "Cliquez pour remplacer la photo",
|
||||
"Client Border Style": "Style de bordure de l'application",
|
||||
"Cloud Workspace": "Espace de travail distant",
|
||||
"Cloud Workspace Description": "Toutes les données vont être synchronisées et sauvegardées sur le compte AFFiNE <1>{{email}}</1>",
|
||||
"Code block": "Bloc de code",
|
||||
"Collaboration": "Collaboration",
|
||||
"Collaboration Description": "La collaboration avec d'autres membres nécessite AFFiNE Cloud.",
|
||||
"Collapse sidebar": "Rabattre la barre latérale",
|
||||
"Collections": "Collections",
|
||||
"Communities": "Communautés",
|
||||
"Confirm": "Confirmer",
|
||||
"Connector": "Connecteur (bientôt disponible) ",
|
||||
"Contact Us": "Contactez-nous ",
|
||||
"Contact with us": "Contactez-nous",
|
||||
"Continue": "Continuer",
|
||||
"Continue with Google": "Se connecter avec Google ",
|
||||
"Convert to ": "Convertir en ",
|
||||
"Copied link to clipboard": "Lien copié dans le presse-papier",
|
||||
"Copy": "Copier",
|
||||
"Copy Link": "Copier le lien",
|
||||
"Create": "Créer ",
|
||||
"Create Or Import": "Créer ou importer",
|
||||
"Create Shared Link Description": "Créez un lien que vous pouvez facilement partager avec n'importe qui.",
|
||||
"Create a collection": "Créer un collection",
|
||||
"Create your own workspace": "Créer votre propre espace de travail",
|
||||
"Created": "Objet créé ",
|
||||
"Created Successfully": "Créé avec succès",
|
||||
"Created with": "Créé avec",
|
||||
"Curve Connector": "Connecteur arrondi",
|
||||
"Customize": "Parcourir",
|
||||
"Customize your AFFiNE Appearance": "Personnalisez l'apparence de votre AFFiNE",
|
||||
"DB_FILE_ALREADY_LOADED": "Le fichier de base de données a déjà été chargé",
|
||||
"DB_FILE_INVALID": "Fichier de base de données invalide",
|
||||
"DB_FILE_MIGRATION_FAILED": "La migration du fichier de base de données a échoué",
|
||||
"DB_FILE_PATH_INVALID": "Le chemin d'accès du fichier de base de données est invalide",
|
||||
"Data sync mode": "Mode de synchronisation des données",
|
||||
"Date": "Date",
|
||||
"Date Format": "Format de date",
|
||||
"Default Location": "Emplacement par défaut",
|
||||
"Default db location hint": "Par défaut, elle sera enregistrée sous {{location}}",
|
||||
"Delete": "Supprimer objet ",
|
||||
"Delete Member?": "Supprimer le membre ?",
|
||||
"Delete Workspace": "Supprimer l'espace de travail",
|
||||
"Delete Workspace Description": "Attention, la suppression de <1>{{workspace}}</1> est irréversible. Le contenu sera perdu.",
|
||||
"Delete Workspace Description2": "La suppression de <1>{{workspace}}</1> aura pour effet de supprimer les données locales et les données dans le cloud. Attention, cette opération est irréversible.",
|
||||
"Delete Workspace Label Hint": "Après la suppression de cet espace de travail, vous supprimerez de manière permanente tout le contenu de tous les utilisateurs. En aucun cas le contenu de cet espace de travail ne pourra être restauré.",
|
||||
"Delete Workspace placeholder": "Veuillez écrire \"Delete\" pour confirmer",
|
||||
"Delete page?": "Supprimer la page ?",
|
||||
"Delete permanently": "Supprimer définitivement",
|
||||
"Disable": "Désactiver",
|
||||
"Disable Public Link": "Désactiver le lien public",
|
||||
"Disable Public Link ?": "Désactiver le lien public ?",
|
||||
"Disable Public Link Description": "Désactiver ce lien public empêchera à quiconque avec le lien d’accéder à cette page.",
|
||||
"Disable Public Sharing": "Désactiver le Partage Public ",
|
||||
"Discover what's new": "Découvrez les nouveautés",
|
||||
"Discover what's new!": "Découvrez les nouveautés !",
|
||||
"Display Language": "Langue d'affichage",
|
||||
"Divider": "Séparateur",
|
||||
"Download all data": "Télécharger toutes les données",
|
||||
"Download core data": "Télécharger les données principales",
|
||||
"Download data": "Télécharger les données {{CoreOrAll}}",
|
||||
"Download data Description1": "Cela prend davantage d’espace sur votre appareil.",
|
||||
"Download data Description2": "Cela prend peu d’espace sur votre appareil.",
|
||||
"Download updates automatically": "Télécharger les mises à jour automatiquement",
|
||||
"Early Access Stage": "Accès anticipé",
|
||||
"Edgeless": "Mode sans bords",
|
||||
"Edit": "Éditer",
|
||||
"Edit Filter": "Editer le filtre",
|
||||
"Editor Version": "Mode Édition",
|
||||
"Elbowed Connector": "Connecteur coudé",
|
||||
"Enable": "Activer",
|
||||
"Enable AFFiNE Cloud": "Activer AFFiNE Cloud",
|
||||
"Enable AFFiNE Cloud Description": "Si cette option est activée, les données de cet espace de travail seront sauvegardées et synchronisées via AFFiNE Cloud.",
|
||||
"Enable cloud hint": "Les fonctions suivantes nécessitent AFFiNE Cloud. Toutes les données sont actuellement stockées sur cet appareil. Vous pouvez activer AFFiNE Cloud pour cet espace de travail afin de le garder synchronisé avec le Cloud.",
|
||||
"Enabled success": "Activation réussie",
|
||||
"Exclude from filter": "Exclure du filtre",
|
||||
"Expand sidebar": "Agrandir la barre latérale",
|
||||
"Expand/Collapse Sidebar": "Agrandir/Rabattre la barre latérale",
|
||||
"Export": "Exporter ",
|
||||
"Export AFFiNE backup file": "Exporter un fichier de sauvegarde AFFiNE",
|
||||
"Export Description": "Vous pouvez exporter l'intégralité des données de l'espace de travail à titre de sauvegarde ; les données ainsi exportées peuvent être réimportées.",
|
||||
"Export Shared Pages Description": "Télécharger une copie de la version actuelle pour la partager avec les autres.",
|
||||
"Export Workspace": "L'exportation de l'espace de travail <1>{{workspace}}</1> sera bientôt disponible.",
|
||||
"Export failed": "L'exportation à échouer",
|
||||
"Export success": "Exporté avec succès",
|
||||
"Export to HTML": "Exporter en HTML",
|
||||
"Export to Markdown": "Exporter en Markdown",
|
||||
"Export to PDF": "Exporter en PDF",
|
||||
"Export to PNG": "Exporter en PNG",
|
||||
"FILE_ALREADY_EXISTS": "Fichier déjà existant",
|
||||
"Failed to publish workspace": "La publication de l'espace de travail a échoué",
|
||||
"Favorite": "Favori",
|
||||
"Favorite pages for easy access": "Pages favorites pour un accès rapide",
|
||||
"Favorited": "Ajouté aux favoris",
|
||||
"Favorites": "Favoris ",
|
||||
"Filters": "Filtres",
|
||||
"Find 0 result": "Aucun résultat trouvé ",
|
||||
"Find results": "{{number}} résultats trouvés",
|
||||
"Font Style": "Police de caractères",
|
||||
"Force Sign Out": "Forcer la déconnexion",
|
||||
"Full width Layout": "Disposition en pleine largeur",
|
||||
"General": "Général",
|
||||
"Get in touch!": "Contactez-nous ! ",
|
||||
"Get in touch! Join our communities": "Contactez-nous ! Rejoignez nos communautés.",
|
||||
"Get in touch! Join our communities.": "Contactez-nous ! Rejoignez nos communautés.",
|
||||
"Go Back": "Retour en arrière",
|
||||
"Go Forward": "Retour en avant",
|
||||
"Got it": "Compris",
|
||||
"Group": "Grouper",
|
||||
"Group as Database": "Grouper comme une base de donnée",
|
||||
"Hand": "Main",
|
||||
"Heading": "Titre {{number}}",
|
||||
"Help and Feedback": "Aide et feedbacks",
|
||||
"How is AFFiNE Alpha different?": "Quelles sont les différences avec AFFiNE Alpha ?",
|
||||
"Image": "Image",
|
||||
"Import": "Importer ",
|
||||
"Increase indent": "Augmenter l'indentation",
|
||||
"Info": "Information",
|
||||
"Info of legal": "Mentions légales",
|
||||
"Inline code": "Code inline",
|
||||
"Invitation sent": "Invitation envoyée",
|
||||
"Invitation sent hint": "Les membres invités ont été informés par e-mail pour rejoindre cet espace de travail.",
|
||||
"Invite": "Inviter",
|
||||
"Invite Members": "Inviter des membres",
|
||||
"Invite Members Message": "Les membres invités collaboreront avec vous dans l'espace de travail actuel",
|
||||
"Invite placeholder": "Rechercher une adresse mail (compatible uniquement avec Gmail)",
|
||||
"It takes up little space on your device": "Prend peu d’espace sur l'appareil.",
|
||||
"It takes up little space on your device.": "Prend peu d’espace sur l'appareil.",
|
||||
"It takes up more space on your device": "Prend davantage d’espace sur l'appareil.",
|
||||
"It takes up more space on your device.": "Cela prend davantage d’espace sur votre appareil.",
|
||||
"Italic": "Italique",
|
||||
"Joined Workspace": "L'espace de travail a été rejoint",
|
||||
"Jump to": "Passer à ",
|
||||
"Keyboard Shortcuts": "Raccourcis clavier",
|
||||
"Leave": "Quitter",
|
||||
"Leave Workspace": "Quitter l'espace de travail",
|
||||
"Leave Workspace Description": "Une fois quitté, vous ne pourrez plus accéder au contenu de cet espace de travail.",
|
||||
"Leave Workspace hint": "Une fois quitté, vous ne pourrez plus accéder au contenu à l'intérieur de cet espace de travail.",
|
||||
"Link": "Lien hypertexte (avec le texte sélectionné)",
|
||||
"Loading": "Chargement...",
|
||||
"Loading All Workspaces": "Chargement de tous les espaces de travail",
|
||||
"Local": "Local",
|
||||
"Local Workspace": "Espace de travail local",
|
||||
"Local Workspace Description": "Toutes les données sont stockées sur cet appareil. Vous pouvez activer AFFiNE Cloud pour garder les données de cet espace de travail synchronisé dans le cloud.",
|
||||
"Markdown Syntax": "Syntaxe Markdown",
|
||||
"Member": "Membre",
|
||||
"Member has been removed": "{{name}} a été supprimé",
|
||||
"Members": "Membres",
|
||||
"Members hint": "Gérez les membres ici, invitez des nouveaux membres par e-mail.",
|
||||
"Move Down": "Descendre",
|
||||
"Move Up": "Remonter",
|
||||
"Move folder": "Déplacer le dossier",
|
||||
"Move folder hint": "Sélectionnez le nouveau chemin d'accès pour le stockage ",
|
||||
"Move folder success": "Le déplacement du fichier a été réalisé avec succès",
|
||||
"Move page to": "Déplacer la page vers ...",
|
||||
"Move page to...": "Déplacer la page vers ...",
|
||||
"Move to": "Déplacer vers",
|
||||
"Move to Trash": "Déplacer à la corbeille",
|
||||
"Moved to Trash": "Déplacé dans la corbeille ",
|
||||
"My Workspaces": "Mes espaces de travail",
|
||||
"Name Your Workspace": "Nommer l'espace de travail",
|
||||
"NativeTitleBar": "Barre de titre",
|
||||
"Navigation Path": "Chemin d'accès",
|
||||
"New Keyword Page": "Nouvelle page '{{query}}'",
|
||||
"New Page": "Nouvelle page",
|
||||
"New Workspace": "Nouvel espace de travail ",
|
||||
"New version is ready": "Nouvelle version disponible",
|
||||
"No item": "Aucun objet ",
|
||||
"Non-Gmail": "Seul Gmail est supporté",
|
||||
"None yet": "Aucun pour l'instant",
|
||||
"Not now": "Pas maintenant",
|
||||
"Note": "Note",
|
||||
"Official Website": "Site officiel ",
|
||||
"Open Workspace Settings": "Ouvrir les paramètres de l'espace de travail",
|
||||
"Open folder": "Ouvrir le dossier",
|
||||
"Open folder hint": "Vérifiez l'emplacement du dossier de stockage.",
|
||||
"Open in new tab": "Ouvrir dans un nouvel onglet",
|
||||
"Organize pages to build knowledge": "Organisez vos pages pour construire l'entièreté de votre savoir",
|
||||
"Owner": "Propriétaire",
|
||||
"Page": "Page",
|
||||
"Paper": "Papier",
|
||||
"Pen": "Stylo",
|
||||
"Pending": "En attente",
|
||||
"Permanently deleted": "Supprimé définitivement ",
|
||||
"Pivots": "Arborescence",
|
||||
"Placeholder of delete workspace": "Entrez le nom de l'espace de travail pour confirmer",
|
||||
"Please make sure you are online": "Vérifiez que vous êtes bien en ligne",
|
||||
"Privacy": "Confidentialité",
|
||||
"Publish": "Publier",
|
||||
"Publish to web": "Publier sur internet",
|
||||
"Published Description": "L'espace de travail actuel a été publié sur Internet. Toute personne disposant du lien peut consulter le contenu.",
|
||||
"Published hint": "Les visiteurs peuvent prévisualiser le contenu via le lien fourni.",
|
||||
"Published to Web": "Publié sur Internet",
|
||||
"Publishing": "Publier sur le web nécessite le service AFFiNE Cloud.",
|
||||
"Publishing Description": "Après avoir publié sur le net, toute personne disposant du lien pourra consulter le contenu.",
|
||||
"Quick Search": "Recherche rapide",
|
||||
"Quick search": "Recherche rapide",
|
||||
"Quick search placeholder": "Recherche Rapide ...",
|
||||
"Quick search placeholder2": "Rechercher dans {{workspace}}",
|
||||
"RFP": "Les pages peuvent librement être rajoutées/retirées de l'arborescence, tout en restant accessible depuis \"Toutes les pages\".",
|
||||
"Recent": "Récent",
|
||||
"Redo": "Rétablir",
|
||||
"Reduce indent": "Réduire l'indentation du texte",
|
||||
"Remove from Pivots": "Retirer de l'Arborescence",
|
||||
"Remove from favorites": "Retirer des favoris",
|
||||
"Remove from workspace": "Retirer de l'espace de travail",
|
||||
"Remove photo": "Supprimer la photo",
|
||||
"Remove special filter": "Retirer le filtre spécial",
|
||||
"Removed from Favorites": "Retiré des Favoris ",
|
||||
"Removed successfully": "Supprimer avec succès",
|
||||
"Rename": "Renommer",
|
||||
"Restart Install Client Update": "Redémarrez pour installer la mise à jour",
|
||||
"Restore it": "Restaurer ",
|
||||
"Retain cached cloud data": "Conserver les données mises en cache dans le cloud",
|
||||
"Retain local cached data": "Conserver les données du cache local",
|
||||
"Save": "Enregistrer",
|
||||
"Save As New Collection": "Enregistrer en tant que nouvelle collection",
|
||||
"Save as New Collection": "Enregistrer en tant que nouvelle collection",
|
||||
"Saved then enable AFFiNE Cloud": "Toutes les modifications sont sauvegardées localement, cliquez ici pour activer la sauvegarde AFFiNE Cloud",
|
||||
"Select": "Sélectionner ",
|
||||
"Select All": "Tout Sélectionnner",
|
||||
"Set a Workspace name": "Définir un nom pour l'espace de travail",
|
||||
"Set database location": "Définir l'emplacement de la base de données",
|
||||
"Set up an AFFiNE account to sync data": "Configurer un compte AFFiNE pour synchroniser les données",
|
||||
"Settings": "Paramètres",
|
||||
"Shape": "Forme",
|
||||
"Share Menu Public Workspace Description1": "Invitez d'autres personnes à rejoindre cet espace de travail ou publiez-le sur internet.",
|
||||
"Share Menu Public Workspace Description2": "L'espace de travail actuel a été publié sur le web en tant qu'espace de travail public.",
|
||||
"Share with link": "Partager un lien",
|
||||
"Shared Pages": "Pages partagées",
|
||||
"Shared Pages Description": "Le service de partage de page public nécessite AFFiNE Cloud.",
|
||||
"Shared Pages In Public Workspace Description": "L'intégralité de cet espace de travail a été publiée sur internet et peut être modifiée via les <1>Paramètres de l'espace de travail</1>.",
|
||||
"Shortcuts": "Raccourcis",
|
||||
"Sidebar": "Barre latérale",
|
||||
"Sign in": "Se connecter à AFFiNE Cloud",
|
||||
"Sign in and Enable": "Se connecter et activer",
|
||||
"Sign out": "Se déconnecter",
|
||||
"Sign out description": "Se déconnecter provoquera la perte du contenu non synchronisé.",
|
||||
"Skip": "Passer",
|
||||
"Start Week On Monday": "Commencer la semaine le lundi",
|
||||
"Stay logged out": "Rester déconnecté",
|
||||
"Sticky": "Post-it",
|
||||
"Stop publishing": "Arrêter de publier",
|
||||
"Storage": "Stockage",
|
||||
"Storage Folder": "Dossier du stockage ",
|
||||
"Storage and Export": "Stockage et Exportation",
|
||||
"Straight Connector": "Connecteur droit",
|
||||
"Strikethrough": "Barrer",
|
||||
"Successfully deleted": "Supprimé avec succès",
|
||||
"Successfully enabled AFFiNE Cloud": "Activation d'AFFINE Cloud avec succès.",
|
||||
"Successfully joined!": "Rejoint avec succès !",
|
||||
"Switch": "Changer",
|
||||
"Sync": "Synchroniser",
|
||||
"Sync across devices with AFFiNE Cloud": "Synchroniser parmi plusieurs appareils avec AFFiNE Cloud",
|
||||
"Synced with AFFiNE Cloud": "Synchronisé avec AFFiNE Cloud",
|
||||
"Tags": "Tags",
|
||||
"Terms of Use": "Conditions générales d'utilisation",
|
||||
"Text": "Texte ",
|
||||
"Theme": "Thème",
|
||||
"Title": "Titre ",
|
||||
"Trash": "Corbeille ",
|
||||
"TrashButtonGroupDescription": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ",
|
||||
"TrashButtonGroupTitle": "Supprimer définitivement",
|
||||
"UNKNOWN_ERROR": "Erreur inconnue",
|
||||
"Underline": "Souligner ",
|
||||
"Undo": "Annuler",
|
||||
"Ungroup": "Dégrouper",
|
||||
"Unpin": "Désépingler",
|
||||
"Unpublished hint": "Une fois publié sur internet, les visiteurs peuvent voir le contenu via le lien fourni.",
|
||||
"Untitled": "Sans titre",
|
||||
"Untitled Collection": "Collection sans titre",
|
||||
"Update Available": "Mise à jour disponible",
|
||||
"Update Collection": "Mettre à jour la collection",
|
||||
"Update workspace name success": "L'espace de travail à été renommé avec succès",
|
||||
"Updated": "Mis à jour",
|
||||
"Upload": "Uploader ",
|
||||
"Use on current device only": "Utiliser seulement sur l'appareil actuel",
|
||||
"Users": "Utilisateur",
|
||||
"Version": "Version",
|
||||
"View Navigation Path": "Voir le Chemin d'Accès",
|
||||
"Visit Workspace": "Visiter l'espace de travail",
|
||||
"Wait for Sync": "Attendez la synchronisation",
|
||||
"Window frame style": "Style de fenêtre",
|
||||
"Workspace Avatar": "Avatar de l'espace de travail",
|
||||
"Workspace Icon": "Icône espace de travail",
|
||||
"Workspace Name": "Nom de l'espace de travail",
|
||||
"Workspace Not Found": "L'epace de travail n'a pas été trouvé",
|
||||
"Workspace Owner": "Propriétaire de l’espace de travail ",
|
||||
"Workspace Profile": "Profil de l'Espace de travail",
|
||||
"Workspace Settings": "Paramètres de l'espace de travail",
|
||||
"Workspace Settings with name": "Paramètres de {{name}}",
|
||||
"Workspace Type": "Type de l'espace de travail",
|
||||
"Workspace database storage description": "Sélectionnez l'endroit où vous souhaitez créer votre espace de travail. Les données de l'espace de travail sont enregistrées localement par défaut.",
|
||||
"Workspace description": "Un espace de travail est votre espace virtuel pour capturer, créer et planifier aussi bien seul qu'en équipe.",
|
||||
"Workspace saved locally": "{{name}} est sauvegardé localement",
|
||||
"You cannot delete the last workspace": "Vous ne pouvez pas supprimer le dernier Espace de travail",
|
||||
"Zoom in": "Agrandir",
|
||||
"Zoom out": "Rétrécir",
|
||||
"Zoom to 100%": "Zoom à 100%",
|
||||
"Zoom to fit": "Zoom à l'échelle",
|
||||
"all": "tout",
|
||||
"com.affine.aboutAFFiNE.autoCheckUpdate.description": "Vérifiez automatiquement pour de nouvelles mises à jour régulièrement.",
|
||||
"com.affine.aboutAFFiNE.autoCheckUpdate.title": "Vérifier automatiquement les mises à jours",
|
||||
"com.affine.aboutAFFiNE.autoDownloadUpdate.description": "Télécharger les mises à jour automatiquement (pour cet appareil)",
|
||||
"com.affine.aboutAFFiNE.autoDownloadUpdate.title": "Télécharger les mises à jour automatiquement",
|
||||
"com.affine.aboutAFFiNE.changelog.description": "Voir le journal des modifications d'AFFiNE",
|
||||
"com.affine.aboutAFFiNE.changelog.title": "Découvrez les nouveautés !",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.check": "Vérifier pour des mises à jour",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.download": "Télécharger la mise à jour",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.restart": "Redémarrez pour la mise à jour",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.retry": "Réessayer",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.description": "Nouvelle version disponible",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.check": "Vérifiez manuellement les mises à jour.",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.checking": "Vérification des mises à jour...",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.downloading": "Téléchargement de la dernière version...",
|
||||
@@ -356,57 +90,11 @@
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.latest": "Vous avez la dernière version d'AFFiNE",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.restart": "Redémarrez pour appliquer la mise à jour.",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.update-available": "Nouvelle version disponible ({{version}})",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.title": "Vérifier pour les mises à jour",
|
||||
"com.affine.aboutAFFiNE.community.title": "Communautés",
|
||||
"com.affine.aboutAFFiNE.contact.community": "Communauté AFFiNE",
|
||||
"com.affine.aboutAFFiNE.contact.title": "Contactez-nous ",
|
||||
"com.affine.aboutAFFiNE.contact.website": "Site officiel ",
|
||||
"com.affine.aboutAFFiNE.legal.privacy": "Confidentialité",
|
||||
"com.affine.aboutAFFiNE.legal.title": "Mentions légales",
|
||||
"com.affine.aboutAFFiNE.legal.tos": "Conditions générales d'utilisation",
|
||||
"com.affine.aboutAFFiNE.subtitle": "Information à propos de AFFiNE",
|
||||
"com.affine.aboutAFFiNE.title": "À propos d'AFFiNE",
|
||||
"com.affine.aboutAFFiNE.version.app": "Version",
|
||||
"com.affine.aboutAFFiNE.version.editor.title": "Mode Édition",
|
||||
"com.affine.aboutAFFiNE.version.title": "Version",
|
||||
"com.affine.all-pages.header": "Toutes les pages",
|
||||
"com.affine.appUpdater.downloadUpdate": "Télécharger la mise à jour",
|
||||
"com.affine.appUpdater.downloading": "Téléchargement en cours",
|
||||
"com.affine.appUpdater.installUpdate": "Redémarrez pour installer la mise à jour",
|
||||
"com.affine.appUpdater.openDownloadPage": "Ouvrir la page de téléchargement",
|
||||
"com.affine.appUpdater.updateAvailable": "Mise à jour disponible",
|
||||
"com.affine.appUpdater.whatsNew": "Découvrez les nouveautés !",
|
||||
"com.affine.appearanceSettings.clientBorder.description": "Personnalisez l'apparence de l'application ",
|
||||
"com.affine.appearanceSettings.clientBorder.title": "Style de bordure de l'application",
|
||||
"com.affine.appearanceSettings.color.description": "Choisissez votre thème de couleur",
|
||||
"com.affine.appearanceSettings.color.title": "Thème de couleur",
|
||||
"com.affine.appearanceSettings.date.title": "Date",
|
||||
"com.affine.appearanceSettings.dateFormat.description": "Personnalisez le style de date",
|
||||
"com.affine.appearanceSettings.dateFormat.title": "Format de date",
|
||||
"com.affine.appearanceSettings.font.description": "Choisissez votre police de caractères",
|
||||
"com.affine.appearanceSettings.font.title": "Police de caractères",
|
||||
"com.affine.appearanceSettings.fontStyle.mono": "Mono",
|
||||
"com.affine.appearanceSettings.fontStyle.sans": "Sans",
|
||||
"com.affine.appearanceSettings.fontStyle.serif": "Sérif",
|
||||
"com.affine.appearanceSettings.fullWidth.description": "Afficher un maximum de contenu sur la page",
|
||||
"com.affine.appearanceSettings.fullWidth.title": "Disposition en pleine largeur",
|
||||
"com.affine.appearanceSettings.language.description": "Modifier la langue de l'interface",
|
||||
"com.affine.appearanceSettings.language.title": "Langue d'affichage",
|
||||
"com.affine.appearanceSettings.noisyBackground.description": "Utiliser l'effet de bruit d'arrière-plan sur la barre latérale",
|
||||
"com.affine.appearanceSettings.noisyBackground.title": "Bruit d'arrière-plan de la barre latérale",
|
||||
"com.affine.appearanceSettings.sidebar.title": "Barre latérale",
|
||||
"com.affine.appearanceSettings.startWeek.description": "Par défaut, la semaine commence le dimanche",
|
||||
"com.affine.appearanceSettings.startWeek.title": "Commencer la semaine le lundi",
|
||||
"com.affine.appearanceSettings.subtitle": "Personnalisez l'apparence de votre AFFiNE",
|
||||
"com.affine.appearanceSettings.theme.title": "Thème",
|
||||
"com.affine.appearanceSettings.title": "Paramètres d'apparence",
|
||||
"com.affine.appearanceSettings.translucentUI.description": "Utiliser l'effet translucide sur la barre latérale",
|
||||
"com.affine.appearanceSettings.translucentUI.title": "UI translucide sur la barre latérale",
|
||||
"com.affine.appearanceSettings.windowFrame.NativeTitleBar": "Barre native",
|
||||
"com.affine.appearanceSettings.windowFrame.description": "Personnalisez l'apparence de l'application Windows",
|
||||
"com.affine.appearanceSettings.windowFrame.frameless": "Sans Bords",
|
||||
"com.affine.appearanceSettings.windowFrame.title": "Style de fenêtre",
|
||||
"com.affine.auth.verify.email.message": "Votre email actuel est {{email}}. Nous enverrons un lien de vérification temporaire à cette addresse.",
|
||||
"com.affine.auth.change.email.page.subtitle": "Rentrez votre nouvelle adresse mail en dessous. Nous enverrons un lien de vérification à cette adresse mail pour compléter le processus",
|
||||
"com.affine.auth.change.email.page.success.subtitle": "Félicitation ! Vous avez réussi à mettre à jour votre adresse mail associé avec votre compte AFFiNE cloud ",
|
||||
"com.affine.auth.change.email.page.success.title": "Adresse mail mise à jour !",
|
||||
@@ -415,36 +103,33 @@
|
||||
"com.affine.auth.desktop.signing.in": "Connexion...",
|
||||
"com.affine.auth.forget": "Mot de passe oublié",
|
||||
"com.affine.auth.has.signed": "S'est connecté ! ",
|
||||
"com.affine.auth.has.signed.message": "Vous êtes connecté, commencez à synchroniser vos données avec AFFINE Cloud!",
|
||||
"com.affine.auth.later": "Plus tard",
|
||||
"com.affine.auth.open.affine": "Ouvrir AFFiNE",
|
||||
"com.affine.auth.open.affine.download-app": "Télécharger l'application",
|
||||
"com.affine.auth.open.affine.prompt": "Ouverture de l'application <1>AFFiNE</1> ",
|
||||
"com.affine.auth.open.affine.try-again": "Veuillez réessayer",
|
||||
"com.affine.auth.page.sent.email.subtitle": "Merci de rentrer un mot de passe de 8-20 caractères avec des lettres et des numéros pour continuer à vous créer un compte",
|
||||
"com.affine.auth.page.sent.email.subtitle": "Merci de rentrer un mot de passe de {{min}}-{{max}} caractères avec des lettres et des numéros pour continuer à vous créer un compte",
|
||||
"com.affine.auth.page.sent.email.title": "Bienvenu au AFFiNE Cloud, vous êtes presque là !",
|
||||
"com.affine.auth.password": "Mot de passe",
|
||||
"com.affine.auth.password.error": "Mot de passe invalide",
|
||||
"com.affine.auth.password.set-failed": "Échec de la définition du mot de passe",
|
||||
"com.affine.auth.reset.password": "Réinitialiser le mot de passe",
|
||||
"com.affine.auth.reset.password.message": "Vous allez recevoir un mail avec un lien pour réinitialiser votre mot de passe. Merci de vérifier votre boite de réception",
|
||||
"com.affine.auth.reset.password.page.success": "Mot de passe réinitialisé avec succès",
|
||||
"com.affine.auth.reset.password.page.title": "Réinitialiser votre mot de passe AFFiNE Cloud",
|
||||
"com.affine.auth.send.verify.email.hint": "Envoyer un lien de vérification",
|
||||
"com.affine.auth.send.change.email.link": "Envoyer un lien de vérification",
|
||||
"com.affine.auth.send.reset.password.link": "Envoyer un lien de réinitialisation",
|
||||
"com.affine.auth.send.set.password.link": "Envoyer un lien pour définir votre mot de passe",
|
||||
"com.affine.auth.sent": "Envoyé",
|
||||
"com.affine.auth.sent.verify.email.hint": "Le lien de vérification a été envoyé",
|
||||
"com.affine.auth.sent.change.email.hint": "Le lien de vérification a été envoyé",
|
||||
"com.affine.auth.sent.change.password.hint": "Le lien de réinitialisation de mot de passe a été envoyé",
|
||||
"com.affine.auth.sent.reset.password.success.message": "Votre mot de passe a été changé ! Vous pouvez à nouveau vous connecter à AFFiNE Cloud avec votre nouveau mot de passe ! ",
|
||||
"com.affine.auth.sent.set.password.hint": "Le lien pour définir votre mot de passe à été envoyé",
|
||||
"com.affine.auth.sent.set.password.success.message": "Votre mot de passe est enregistré! Vous pouvez vous connecter sur AFFINE Cloud avec votre email et votre mot de passe!",
|
||||
"com.affine.auth.set.email.save": "Enregistrer le mail",
|
||||
"com.affine.auth.set.password": "Définir le mot de passe",
|
||||
"com.affine.auth.set.password.message": "Merci de rentrer un mot de passe de 8-20 caractères avec des lettres et des numéros pour continuer à vous créer un compte",
|
||||
"com.affine.auth.set.password.message": "Merci de rentrer un mot de passe de {{min}}-{{max}} caractères avec des lettres et des numéros pour continuer à vous créer un compte",
|
||||
"com.affine.auth.set.password.page.success": "Mot de passe définit avec succès",
|
||||
"com.affine.auth.set.password.page.title": "Définir votre mot de passe pour AFFiNE Cloud",
|
||||
"com.affine.auth.set.password.placeholder": "Définissez un mot de passe d'au moins 8 caractères",
|
||||
"com.affine.auth.set.password.placeholder": "Définissez un mot de passe d'au moins {{min}} caractères",
|
||||
"com.affine.auth.set.password.placeholder.confirm": "Confirmer votre mot de passe",
|
||||
"com.affine.auth.set.password.save": "Enregistrer votre mot de passe",
|
||||
"com.affine.auth.sign-out.confirm-modal.cancel": "Annuler",
|
||||
@@ -478,12 +163,7 @@
|
||||
"com.affine.auth.toast.message.signed-in": "Vous êtes maintenant connecté, commencez la synchronisation de vos données avec AFFiNE Cloud ! ",
|
||||
"com.affine.auth.toast.title.failed": "Impossible de vous connecter ",
|
||||
"com.affine.auth.toast.title.signed-in": "Connecté",
|
||||
"com.affine.backButton": "Retour à l'accueil",
|
||||
"com.affine.banner.content": "La démo vous plait ? <1> Télécharger le client AFFiNE </1> pour une expérience complète.",
|
||||
"com.affine.banner.local-warning": "Vos données locales sont enregistrées sur le navigateur et peuvent être perdue. Ne prenez pas le risque - activez le cloud maintenant !",
|
||||
"com.affine.brand.affineCloud": "AFFiNE Cloud",
|
||||
"com.affine.cloudTempDisable.description": "Nous mettons à jour le service AFFiNE Cloud et celui-ci est temporairement indisponible côté client. Si vous souhaitez rester informé des avancements et être informé de la disponibilité du projet, vous pouvez remplir l'<1>inscription au AFFiNE Cloud</1>.",
|
||||
"com.affine.cloudTempDisable.title": "AFFiNE Cloud est actuellement en cours de mise à jour.",
|
||||
"com.affine.cmdk.affine.category.affine.collections": "Collections",
|
||||
"com.affine.cmdk.affine.category.affine.creation": "Créer ",
|
||||
"com.affine.cmdk.affine.category.affine.edgeless": "Mode sans bords",
|
||||
@@ -550,22 +230,12 @@
|
||||
"com.affine.collection.menu.edit": "Modifier les collections",
|
||||
"com.affine.collection.menu.rename": "Renommer",
|
||||
"com.affine.collection.removePage.success": "Supprimer avec succès",
|
||||
"com.affine.collectionBar.backToAll": "Retour à tous",
|
||||
"com.affine.collections.empty.message": "Pas de collections",
|
||||
"com.affine.collections.empty.new-collection-button": "Nouvelle collection",
|
||||
"com.affine.collections.header": "Collections",
|
||||
"com.affine.confirmModal.button.cancel": "Annuler ",
|
||||
"com.affine.currentYear": "Année en cours",
|
||||
"com.affine.deleteLeaveWorkspace.description": "Supprimer l'espace de travail de cet appareil et éventuellement supprimer toutes les données.",
|
||||
"com.affine.deleteLeaveWorkspace.leave": "Quitter l'espace de travail",
|
||||
"com.affine.deleteLeaveWorkspace.leaveDescription": "Une fois quitté, vous ne pourrez plus accéder au contenu à l'intérieur de cet espace de travail.",
|
||||
"com.affine.draw_with_a_blank_whiteboard": "Dessiner sur un tableau blanc",
|
||||
"com.affine.earlier": "Récemment",
|
||||
"com.affine.edgelessMode": "Mode sans bords",
|
||||
"com.affine.editCollection.button.cancel": "Annuler ",
|
||||
"com.affine.editCollection.button.create": "Créer ",
|
||||
"com.affine.editCollection.createCollection": "Créer des collections",
|
||||
"com.affine.editCollection.filters": "Filtres",
|
||||
"com.affine.editCollection.pages": "Pages",
|
||||
"com.affine.editCollection.pages.clear": "Effacer la sélection",
|
||||
"com.affine.editCollection.renameCollection": "Renommer la Collection",
|
||||
@@ -587,29 +257,16 @@
|
||||
"com.affine.editCollection.rules.reset": "Réinitialiser",
|
||||
"com.affine.editCollection.rules.tips": "Les pages qui respectent ces conditions seront ajoutées à la collection actuelle <2>{{highlight}}</2>",
|
||||
"com.affine.editCollection.rules.tips.highlight": "Automatiquement",
|
||||
"com.affine.editCollection.save": "Enregistrer",
|
||||
"com.affine.editCollection.saveCollection": "Enregistrer en tant que nouvelle collection",
|
||||
"com.affine.editCollection.search.placeholder": "Rechercher une page...",
|
||||
"com.affine.editCollection.untitledCollection": "Collection sans titre",
|
||||
"com.affine.editCollection.updateCollection": "Mettre à jour la collection",
|
||||
"com.affine.editCollectionName.createTips": "Les collections sont des dossiers intelligent avec lesquels vous pouvez manuellement ajouter des pages ou l'automatiser avec des règles ",
|
||||
"com.affine.editCollectionName.name": "Nom",
|
||||
"com.affine.editCollectionName.name.placeholder": "Nom de la Collection",
|
||||
"com.affine.editorModeSwitch.tooltip": "Changer",
|
||||
"com.affine.emptyDesc": "Il n'y a pas encore de page ici",
|
||||
"com.affine.enableAffineCloudModal.button.cancel": "Annuler ",
|
||||
"com.affine.error.page-not-found.title": "Rafraichir",
|
||||
"com.affine.expired.page.subtitle": "Merci de demander un nouveau lien pour réinitialiser votre mot de passe",
|
||||
"com.affine.expired.page.title": "Le lien a expiré...",
|
||||
"com.affine.export.error.message": "Veuillez réessayer plus tard.",
|
||||
"com.affine.export.error.title": "Échec lors de l'exportation en raison d'une erreur inattendue",
|
||||
"com.affine.export.success.message": "Veuillez ouvrir le fichier de téléchargement afin de vérifier",
|
||||
"com.affine.export.success.title": "Exporté avec succès",
|
||||
"com.affine.favoritePageOperation.add": "Ajouter aux Favoris",
|
||||
"com.affine.favoritePageOperation.remove": "Retirer des favoris",
|
||||
"com.affine.filter": "Filtrer",
|
||||
"com.affine.filter.after": "après",
|
||||
"com.affine.filter.before": "avant",
|
||||
"com.affine.filter.contains all": "contient tout",
|
||||
"com.affine.filter.contains one of": "Contient un élément suivant ",
|
||||
"com.affine.filter.does not contains all": "Ne contient aucun des éléments suivants ",
|
||||
@@ -619,86 +276,17 @@
|
||||
"com.affine.filter.is empty": "est vide",
|
||||
"com.affine.filter.is not empty": "n'est pas vide",
|
||||
"com.affine.filter.is-favourited": "Est favori",
|
||||
"com.affine.filter.save-view": "Sauvegarder la vue",
|
||||
"com.affine.filter.true": "Oui",
|
||||
"com.affine.filterList.button.add": "Ajouter un filtre",
|
||||
"com.affine.header.option.add-tag": "Ajouter des Tags",
|
||||
"com.affine.header.option.duplicate": "Dupliquer",
|
||||
"com.affine.helpIsland.contactUs": "Contactez-nous ",
|
||||
"com.affine.helpIsland.gettingStarted": "Commencer",
|
||||
"com.affine.helpIsland.helpAndFeedback": "Aide et feedbacks",
|
||||
"com.affine.import_file": "Support Markdown/Notion",
|
||||
"com.affine.inviteModal.button.cancel": "Annuler ",
|
||||
"com.affine.keyboardShortcuts.appendDailyNote": "Ajouter à la note journalière",
|
||||
"com.affine.keyboardShortcuts.bodyText": "Corps du texte",
|
||||
"com.affine.keyboardShortcuts.bold": "Gras",
|
||||
"com.affine.keyboardShortcuts.cancel": "Annuler ",
|
||||
"com.affine.keyboardShortcuts.codeBlock": "Bloc de code",
|
||||
"com.affine.keyboardShortcuts.curveConnector": "Connecteur arrondi",
|
||||
"com.affine.keyboardShortcuts.divider": "Séparateur",
|
||||
"com.affine.keyboardShortcuts.elbowedConnector": "Connecteur coudé",
|
||||
"com.affine.keyboardShortcuts.expandOrCollapseSidebar": "Agrandir/Rabattre la barre latérale",
|
||||
"com.affine.keyboardShortcuts.goBack": "Retour en arrière",
|
||||
"com.affine.keyboardShortcuts.goForward": "Retour en avant",
|
||||
"com.affine.keyboardShortcuts.group": "Grouper",
|
||||
"com.affine.keyboardShortcuts.groupDatabase": "Grouper comme une base de donnée",
|
||||
"com.affine.keyboardShortcuts.hand": "Main",
|
||||
"com.affine.keyboardShortcuts.heading": "Titre {{number}}",
|
||||
"com.affine.keyboardShortcuts.image": "Image",
|
||||
"com.affine.keyboardShortcuts.increaseIndent": "Augmenter l'indentation",
|
||||
"com.affine.keyboardShortcuts.inlineCode": "Code inline",
|
||||
"com.affine.keyboardShortcuts.italic": "Italique",
|
||||
"com.affine.keyboardShortcuts.link": "Lien hypertexte (avec le texte sélectionné)",
|
||||
"com.affine.keyboardShortcuts.moveDown": "Descendre",
|
||||
"com.affine.keyboardShortcuts.moveUp": "Remonter",
|
||||
"com.affine.keyboardShortcuts.newPage": "Nouvelle page",
|
||||
"com.affine.keyboardShortcuts.note": "Note",
|
||||
"com.affine.keyboardShortcuts.pen": "Stylo",
|
||||
"com.affine.keyboardShortcuts.quickSearch": "Recherche rapide",
|
||||
"com.affine.keyboardShortcuts.redo": "Rétablir",
|
||||
"com.affine.keyboardShortcuts.reduceIndent": "Réduire l'indentation du texte",
|
||||
"com.affine.keyboardShortcuts.select": "Sélectionner ",
|
||||
"com.affine.keyboardShortcuts.selectAll": "Sélectionner l'ensemble",
|
||||
"com.affine.keyboardShortcuts.shape": "Forme",
|
||||
"com.affine.keyboardShortcuts.straightConnector": "Connecteur droit",
|
||||
"com.affine.keyboardShortcuts.strikethrough": "Barrer",
|
||||
"com.affine.keyboardShortcuts.subtitle": "Regarder rapidement les raccourcis clavier",
|
||||
"com.affine.keyboardShortcuts.switch": "Changer",
|
||||
"com.affine.keyboardShortcuts.text": "Texte ",
|
||||
"com.affine.keyboardShortcuts.title": "Raccourcis clavier",
|
||||
"com.affine.keyboardShortcuts.unGroup": "Dégrouper",
|
||||
"com.affine.keyboardShortcuts.underline": "Souligner ",
|
||||
"com.affine.keyboardShortcuts.undo": "Annuler",
|
||||
"com.affine.keyboardShortcuts.zoomIn": "Agrandir",
|
||||
"com.affine.keyboardShortcuts.zoomOut": "Rétrécir",
|
||||
"com.affine.keyboardShortcuts.zoomTo100": "Zoom à 100%",
|
||||
"com.affine.keyboardShortcuts.zoomToFit": "Zoom à l'échelle",
|
||||
"com.affine.last30Days": "30 derniers jours",
|
||||
"com.affine.last7Days": "7 derniers jours",
|
||||
"com.affine.lastMonth": "Le mois dernier",
|
||||
"com.affine.lastWeek": "La semaine dernière ",
|
||||
"com.affine.lastYear": "L'année dernière ",
|
||||
"com.affine.loading": "Chargement...",
|
||||
"com.affine.moreThan30Days": "Plus d'un mois",
|
||||
"com.affine.moveToTrash.confirmModal.description": "{{title}} sera déplacé à la corbeille ",
|
||||
"com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} pages seront déplacés à la corbeille ",
|
||||
"com.affine.moveToTrash.confirmModal.title": "Supprimer la page ?",
|
||||
"com.affine.moveToTrash.confirmModal.title.multiple": "Supprimer {{ number }} pages ?",
|
||||
"com.affine.moveToTrash.title": "Déplacer à la corbeille",
|
||||
"com.affine.nameWorkspace.button.cancel": "Annuler ",
|
||||
"com.affine.nameWorkspace.button.create": "Créer ",
|
||||
"com.affine.nameWorkspace.description": "Un espace de travail est votre espace virtuel pour capturer, créer et planifier aussi bien seul qu'en équipe.",
|
||||
"com.affine.nameWorkspace.placeholder": "Définir un nom pour l'espace de travail",
|
||||
"com.affine.nameWorkspace.title": "Nommer l'espace de travail",
|
||||
"com.affine.new_edgeless": "Nouvelle page sans bords",
|
||||
"com.affine.new_import": "Importer",
|
||||
"com.affine.notFoundPage.backButton": "Retour à l'accueil",
|
||||
"com.affine.notFoundPage.title": "Erreur 404 - Page non trouvée",
|
||||
"com.affine.onboarding.title1": "Tableau blanc et documents fusionnés",
|
||||
"com.affine.onboarding.title2": "Un mode d'édition intuitif et robuste basé sur des blocs",
|
||||
"com.affine.onboarding.videoDescription1": "Basculez facilement entre le mode Page pour de la création de documents structurés et le mode Tableau blanc pour de l'expression visuelle libre d'idées créatives.",
|
||||
"com.affine.onboarding.videoDescription2": "Créez facilement des documents structurés, à l'aide d'une interface modulaire où l'on peut faire glisser et déposer des blocs de texte, des images et d'autres contenus.",
|
||||
"com.affine.openPageOperation.newTab": "Ouvrir dans un nouvel onglet",
|
||||
"com.affine.other-page.nav.affine-community": "Communauté AFFiNE",
|
||||
"com.affine.other-page.nav.blog": "Blog",
|
||||
"com.affine.other-page.nav.contact-us": "Contactez-nous ",
|
||||
@@ -707,10 +295,6 @@
|
||||
"com.affine.other-page.nav.open-affine": "Ouvrir AFFiNE",
|
||||
"com.affine.page.group-header.clear": "Effacer la sélection",
|
||||
"com.affine.page.group-header.select-all": "Tout Sélectionnner",
|
||||
"com.affine.pageMode": "Mode page",
|
||||
"com.affine.pageMode.all": "tout",
|
||||
"com.affine.pageMode.edgeless": "Mode sans bords",
|
||||
"com.affine.pageMode.page": "Page",
|
||||
"com.affine.payment.benefit-1": "Espaces de travail locaux illimités",
|
||||
"com.affine.payment.benefit-6": "Nombre de collaborateurs par Espace de Travail ≤ {{capacity}}",
|
||||
"com.affine.payment.billing-setting.cancel-subscription": "Annuler l'abonnement",
|
||||
@@ -748,80 +332,28 @@
|
||||
"com.affine.payment.sign-up-free": "S'enregistrer gratuitement",
|
||||
"com.affine.payment.subscription.exist": "Vous possédez déjà un abonnement.",
|
||||
"com.affine.payment.updated-notify-title": "L'abonnement a été mis à jour",
|
||||
"com.affine.publicLinkDisableModal.button.cancel": "Annuler ",
|
||||
"com.affine.publicLinkDisableModal.button.disable": "Désactiver",
|
||||
"com.affine.publicLinkDisableModal.description": "Désactiver ce lien public empêchera à quiconque avec le lien d’accéder à cette page.",
|
||||
"com.affine.publicLinkDisableModal.title": "Désactiver le lien public",
|
||||
"com.affine.rootAppSidebar.collections": "Collections",
|
||||
"com.affine.rootAppSidebar.favorites": "Favoris ",
|
||||
"com.affine.rootAppSidebar.others": "Autres",
|
||||
"com.affine.selectPage.empty": "Vide",
|
||||
"com.affine.setDBLocation.button.customize": "Parcourir",
|
||||
"com.affine.setDBLocation.button.defaultLocation": "Emplacement par défaut",
|
||||
"com.affine.setDBLocation.description": "Sélectionnez l'endroit où vous souhaitez créer votre espace de travail. Les données de l'espace de travail sont enregistrées localement par défaut.",
|
||||
"com.affine.setDBLocation.title": "Définir l'emplacement de la base de données",
|
||||
"com.affine.setDBLocation.tooltip.defaultLocation": "Par défaut, elle sera enregistrée sous {{location}}",
|
||||
"com.affine.setSyncingMode.button.continue": "Continuer",
|
||||
"com.affine.setSyncingMode.cloud": "Synchroniser parmi plusieurs appareils avec AFFiNE Cloud",
|
||||
"com.affine.setSyncingMode.deviceOnly": "Utiliser seulement sur l'appareil actuel",
|
||||
"com.affine.setSyncingMode.title.added": "Ajouté avec succès",
|
||||
"com.affine.setSyncingMode.title.created": "Créé avec succès",
|
||||
"com.affine.setting.account": "Paramètres du compte",
|
||||
"com.affine.setting.account.delete": "Supprimer le compte",
|
||||
"com.affine.setting.account.delete.message": "Supprimer définitivement ce compte et la sauvegarde des données de l'espace de travail dans AFFiNE Cloud. Cette action ne peut pas être annulée.",
|
||||
"com.affine.setting.account.message": "Vos données personnelles ",
|
||||
"com.affine.setting.sign.message": "Synchroniser avec AFFiNE Cloud",
|
||||
"com.affine.setting.sign.out.message": "Déconnecté de manière sécurisée de votre compte",
|
||||
"com.affine.settingSidebar.settings.general": "Général",
|
||||
"com.affine.settingSidebar.settings.workspace": "Espace de travail",
|
||||
"com.affine.settingSidebar.title": "Paramètres",
|
||||
"com.affine.settings.about.message": "Information à propos de AFFiNE",
|
||||
"com.affine.settings.about.update.check.message": "Vérifiez automatiquement pour de nouvelles mises à jour régulièrement.",
|
||||
"com.affine.settings.about.update.download.message": "Télécharger les mises à jour automatiquement (pour cet appareil)",
|
||||
"com.affine.settings.appearance": "Apparence",
|
||||
"com.affine.settings.appearance.border-style-description": "Personnalisez l'apparence de l'application ",
|
||||
"com.affine.settings.appearance.date-format-description": "Personnalisez le style de date",
|
||||
"com.affine.settings.appearance.full-width-description": "Afficher un maximum de contenu sur la page",
|
||||
"com.affine.settings.appearance.language-description": "Modifier la langue de l'interface",
|
||||
"com.affine.settings.appearance.start-week-description": "Par défaut, la semaine commence le dimanche",
|
||||
"com.affine.settings.appearance.window-frame-description": "Personnalisez l'apparence de l'application Windows",
|
||||
"com.affine.settings.auto-check-description": "Si activé, l'option cherchera automatiquement pour les nouvelles versions à intervalles réguliers",
|
||||
"com.affine.settings.auto-download-description": "Si activé, les nouvelles versions seront automatiquement téléchargées sur l'appareil actuel",
|
||||
"com.affine.settings.email": "Email",
|
||||
"com.affine.settings.email.action.change": "Changer l'Email",
|
||||
"com.affine.settings.member-tooltip": "Activer AFFiNE Cloud pour collaborer avec d'autres personnes",
|
||||
"com.affine.settings.email.action": "Changer l'Email",
|
||||
"com.affine.settings.noise-style": "Bruit d'arrière-plan de la barre latérale",
|
||||
"com.affine.settings.noise-style-description": "Utiliser l'effet de bruit d'arrière-plan sur la barre latérale",
|
||||
"com.affine.settings.password": "Mot de passe",
|
||||
"com.affine.settings.password.action.change": "Changer le mot de passe",
|
||||
"com.affine.settings.password.action.set": "Définir le mot de passe",
|
||||
"com.affine.settings.password.message": "Définissez un mot de passe pour vous connecter à votre compte",
|
||||
"com.affine.settings.profile": "Mon Profil",
|
||||
"com.affine.settings.profile.message": "Votre profil de compte sera montré à tout le monde",
|
||||
"com.affine.settings.profile.name": "Afficher le nom",
|
||||
"com.affine.settings.profile.placeholder": "Saisir le nom du compte",
|
||||
"com.affine.settings.remove-workspace": "Supprimer l'espace de travail",
|
||||
"com.affine.settings.remove-workspace-description": "Supprimer l'espace de travail de cet appareil et éventuellement supprimer toutes les données.\n\n",
|
||||
"com.affine.settings.sign": "Se connecter / S'inscrire",
|
||||
"com.affine.settings.storage.db-location.change-hint": "Cliquer pour changer l'emplacement du stockage ",
|
||||
"com.affine.settings.storage.description": "Vérifier ou changer l'emplacement du lieu de stockage",
|
||||
"com.affine.settings.storage.description-alt": "Vérifier ou changer l'emplacement du lieu de stockage. Cliquer pour éditer le chemin d'accès.",
|
||||
"com.affine.settings.suggestion": "Besoin de plus de personnalisation ? Vous pouvez nous les proposer via la communauté.",
|
||||
"com.affine.settings.translucent-style": "UI translucide sur la barre latérale",
|
||||
"com.affine.settings.translucent-style-description": "Utiliser l'effet translucide sur la barre latérale",
|
||||
"com.affine.settings.workspace": "Espace de travail",
|
||||
"com.affine.settings.workspace.description": "Vous pouvez personnaliser votre espace ici.",
|
||||
"com.affine.settings.workspace.not-owner": "L'icône et le nom peuvent seulement être modifiés par le propriétaire de l'Espace de groupe. Les modifications seront visibles par tous",
|
||||
"com.affine.settings.workspace.publish-tooltip": "Activer AFFiNE Cloud pour publier cet espace de travail en ligne",
|
||||
"com.affine.settings.workspace.storage.tip": "Cliquer pour changer l'emplacement du stockage ",
|
||||
"com.affine.share-menu.EnableCloudDescription": "Le service de partage de page public nécessite AFFiNE Cloud.",
|
||||
"com.affine.share-menu.ShareMode": "Mode de partage",
|
||||
"com.affine.share-menu.SharePage": "Partager la page",
|
||||
"com.affine.share-menu.ShareViaExport": "Partager via Export",
|
||||
"com.affine.share-menu.ShareViaExportDescription": "Télécharger une copie fixe de la version actuelle pour la partager avec les autres.",
|
||||
"com.affine.share-menu.ShareWithLink": "Partager avec un lien",
|
||||
"com.affine.share-menu.ShareWithLinkDescription": "Créez un lien que vous pouvez facilement partager avec tout le monde. Les visiteurs peuvent ouvrir votre page sous forme de document.",
|
||||
"com.affine.share-menu.SharedPage": "Page partagée",
|
||||
"com.affine.share-menu.confirm-modify-mode.notification.fail.message": "Veuillez réessayer plus tard.",
|
||||
"com.affine.share-menu.copy-private-link": "Copier le lien privé",
|
||||
"com.affine.share-menu.create-public-link.notification.fail.message": "Veuillez réessayer plus tard.",
|
||||
@@ -830,96 +362,13 @@
|
||||
"com.affine.share-menu.publish-to-web.description": "Permettre à toutes les personnes disposant du lien une version \"lecture uniquement\" de la version de la page",
|
||||
"com.affine.share-menu.share-privately": "Partage privé",
|
||||
"com.affine.share-menu.share-privately.description": "Seuls les membres de l'Espace de Travail peuvent ouvrir ce lien.",
|
||||
"com.affine.share-menu.shareButton": "Partager",
|
||||
"com.affine.share-menu.sharedButton": "Partagé",
|
||||
"com.affine.shortcutsTitle.edgeless": "Mode sans bords",
|
||||
"com.affine.shortcutsTitle.general": "Général",
|
||||
"com.affine.shortcutsTitle.markdownSyntax": "Syntaxe Markdown",
|
||||
"com.affine.shortcutsTitle.page": "Page",
|
||||
"com.affine.sidebarSwitch.collapse": "Rabattre la barre latérale",
|
||||
"com.affine.sidebarSwitch.expand": "Agrandir la barre latérale",
|
||||
"com.affine.storage.disabled.hint": "AFFiNE Cloud est actuellement en phase d'accès anticipé et ne prends en charge la mise à niveau, veuillez être patient et attendre notre plan tarifaire.",
|
||||
"com.affine.storage.extend.hint": "Vous avez atteint la capacité maximale de votre plan actuel, AFFiNE Cloud est actuellement en phase d'accès anticipé et ne prends en charge la mise à niveau, veuillez être patient et attendre notre plan tarifaire.",
|
||||
"com.affine.storage.extend.link": "Pour avoir plus d'information, cliquez ici.",
|
||||
"com.affine.storage.title": "Stockage AFFiNE Cloud",
|
||||
"com.affine.storage.upgrade": "Passer à la version Pro",
|
||||
"com.affine.storage.used.hint": "Espace utilisé",
|
||||
"com.affine.themeSettings.dark": "Sombre",
|
||||
"com.affine.themeSettings.light": "Clair",
|
||||
"com.affine.themeSettings.system": "Système",
|
||||
"com.affine.toastMessage.addedFavorites": "Ajouté aux favoris ",
|
||||
"com.affine.toastMessage.edgelessMode": "Mode sans bords",
|
||||
"com.affine.toastMessage.movedTrash": "Déplacé dans la corbeille ",
|
||||
"com.affine.toastMessage.pageMode": "Mode page",
|
||||
"com.affine.toastMessage.permanentlyDeleted": "Supprimé définitivement ",
|
||||
"com.affine.toastMessage.removedFavorites": "Retiré des Favoris ",
|
||||
"com.affine.toastMessage.restored": "{{title}} a été restauré ",
|
||||
"com.affine.toastMessage.successfullyDeleted": "Supprimé avec succès",
|
||||
"com.affine.today": "Aujourd'hui",
|
||||
"com.affine.trashOperation.delete": "Supprimer objet ",
|
||||
"com.affine.trashOperation.delete.description": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ",
|
||||
"com.affine.trashOperation.delete.title": "Supprimer définitivement",
|
||||
"com.affine.trashOperation.deleteDescription": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ",
|
||||
"com.affine.trashOperation.deletePermanently": "Supprimer définitivement",
|
||||
"com.affine.trashOperation.restoreIt": "Restaurer ",
|
||||
"com.affine.updater.downloading": "Téléchargement en cours",
|
||||
"com.affine.updater.open-download-page": "Ouvrir la page de téléchargement",
|
||||
"com.affine.updater.restart-to-update": "Redémarrez pour installer la mise à jour",
|
||||
"com.affine.updater.update-available": "Mise à jour disponible",
|
||||
"com.affine.upgrade.button-text.done": "Rafraichir la page",
|
||||
"com.affine.upgrade.button-text.upgrading": "Mise à niveau",
|
||||
"com.affine.workspace.cannot-delete": "Vous ne pouvez pas supprimer le dernier Espace de travail",
|
||||
"com.affine.workspace.cloud": "Espaces de travail distants",
|
||||
"com.affine.workspace.cloud.account.logout": "Déconnection",
|
||||
"com.affine.workspace.cloud.account.settings": "Paramètres du compte",
|
||||
"com.affine.workspace.cloud.auth": "S'inscrire / Se connecter",
|
||||
"com.affine.workspace.cloud.description": "Synchroniser avec AFFiNE Cloud",
|
||||
"com.affine.workspace.cloud.join": "Rejoindre l'espace de travail",
|
||||
"com.affine.workspace.cloud.sync": "Synchronisation dans le cloud",
|
||||
"com.affine.workspace.local": "Espaces de travail locaux",
|
||||
"com.affine.workspace.local.import": "Importer un espace de travail",
|
||||
"com.affine.workspaceDelete.button.cancel": "Annuler ",
|
||||
"com.affine.workspaceDelete.button.delete": "Supprimer objet ",
|
||||
"com.affine.workspaceDelete.description": "Attention, la suppression de <1>{{workspace}}</1> est irréversible. Le contenu sera perdu.",
|
||||
"com.affine.workspaceDelete.description2": "La suppression de <1>{{workspace}}</1> aura pour effet de supprimer les données locales et les données dans le cloud. Attention, cette opération est irréversible.",
|
||||
"com.affine.workspaceDelete.placeholder": "Entrez le nom de l'espace de travail pour confirmer",
|
||||
"com.affine.workspaceDelete.title": "Supprimer l'espace de travail",
|
||||
"com.affine.workspaceLeave.button.cancel": "Annuler ",
|
||||
"com.affine.workspaceLeave.button.leave": "Quitter",
|
||||
"com.affine.workspaceLeave.description": "Une fois quitté, vous ne pourrez plus accéder au contenu de cet espace de travail.",
|
||||
"com.affine.workspaceList.addWorkspace.create": "Créer un espace de travail",
|
||||
"com.affine.workspaceList.workspaceListType.cloud": "Synchronisation dans le cloud",
|
||||
"com.affine.workspaceList.workspaceListType.local": "Stockage en Local",
|
||||
"com.affine.workspaceSubPath.all": "Toutes les pages",
|
||||
"com.affine.workspaceSubPath.trash": "Corbeille ",
|
||||
"com.affine.workspaceSubPath.trash.empty-description": "Les pages supprimées apparaïtront ici.",
|
||||
"com.affine.workspaceType.cloud": "Espace de travail distant",
|
||||
"com.affine.workspaceType.joined": "L'espace de travail a été rejoint",
|
||||
"com.affine.workspaceType.local": "Espace de travail local",
|
||||
"com.affine.workspaceType.offline": "Disponible hors ligne",
|
||||
"com.affine.write_with_a_blank_page": "Écrire sur une page vide",
|
||||
"com.affine.yesterday": "Hier",
|
||||
"core": "l'essentiel",
|
||||
"dark": "Sombre",
|
||||
"emptyAllPages": "Cet espace de travail est vide. Créez une nouvelle page pour commencer l'édition.",
|
||||
"emptyAllPagesClient": "Cliquez sur le bouton <1>$t(New Page)</1> ou bien, appuyez sur le raccourci clavier <3>{{shortcut}}</3> afin de créer votre première page.",
|
||||
"emptyFavorite": "Cliquez sur Ajouter aux Favoris et la page apparaitra ici.",
|
||||
"emptySharedPages": "Les pages partagées apparaîtront ici",
|
||||
"emptyTrash": "Cliquez sur Ajouter à la corbeille et la page apparaitra ici.",
|
||||
"frameless": "Sans Bords",
|
||||
"invited you to join": "vous a invité à rejoindre",
|
||||
"is a Cloud Workspace": "est un espace de travail distant",
|
||||
"is a Local Workspace": "est un espace de travail local",
|
||||
"light": "Clair",
|
||||
"login success": "Connexion réussie",
|
||||
"mobile device": "Il semblerait que vous naviguiez sur un appareil mobile.",
|
||||
"mobile device description": "Nous travaillons toujours sur le support des appareils mobiles. Ainsi, nous vous recommandons d'utiliser un ordinateur.",
|
||||
"others": "Autres",
|
||||
"recommendBrowser": "Pour une expérience optimale, nous vous recommandons le navigateur <1>Chrome</1>.",
|
||||
"restored": "{{title}} a été restauré ",
|
||||
"still designed": "(Cette page est toujours en cours de conception.)",
|
||||
"system": "Système",
|
||||
"upgradeBrowser": "Veuillez installer la dernière version de Chrome pour bénéficier d'une expérience optimale.",
|
||||
"will be moved to Trash": "{{title}} sera déplacé à la corbeille ",
|
||||
"will delete member": "supprimera le membre"
|
||||
"com.affine.workspaceSubPath.trash.empty-description": "Les pages supprimées apparaïtront ici."
|
||||
}
|
||||
|
||||
26
packages/frontend/i18n/src/resources/hi.json
Normal file
26
packages/frontend/i18n/src/resources/hi.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "404 - पृष्ठ नहीं मिला",
|
||||
"AFFiNE Cloud": "एफ़िन क्लाउड",
|
||||
"AFFiNE Community": "एफ़िन समुदाय",
|
||||
"About AFFiNE": "एफ़िन के बारे में",
|
||||
"Access level": "पहुंच स्तर",
|
||||
"Add Workspace": "कार्यक्षेत्र जोड़ें",
|
||||
"Add Workspace Hint": "मौजूदा डेटाबेस फ़ाइल का चयन करें",
|
||||
"Add a subpage inside": "अंदर एक उपपृष्ठ जोड़ें",
|
||||
"Add to favorites": "पसंदीदा करने के लिए जोड़ें",
|
||||
"Added Successfully": "सफलतापूर्वक जोड़ा गया",
|
||||
"Added to Favorites": "पसंदीदा में जोड़ा गया",
|
||||
"All changes are saved locally": "सभी परिवर्तन स्थानीय रूप से सहेजे जाते हैं",
|
||||
"All data has been stored in the cloud": "सारा डेटा क्लाउड में संग्रहीत किया गया है",
|
||||
"All pages": "सभी पेज",
|
||||
"App Version": "एप्लिकेशन वेरीज़न",
|
||||
"Appearance Settings": "उपस्थिति सेटिंग्स",
|
||||
"Append to Daily Note": "दैनिक नोट में संलग्न करें",
|
||||
"Available Offline": "ऑफ़लाइन उपलब्ध है",
|
||||
"Back Home": "वापस घर",
|
||||
"Back to Quick Search": "त्वरित खोज पर वापस जाएँ",
|
||||
"Back to all": "सभी पर वापस जाएँ",
|
||||
"Body text": "मुख्य भाग",
|
||||
"Bold": "बोल्ड "
|
||||
}
|
||||
@@ -1,10 +1,15 @@
|
||||
// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
// Run `yarn run download-resources` to regenerate.
|
||||
// If you need to update the code, please edit `i18n/src/scripts/download.ts` inside your project.
|
||||
import ca from './ca.json';
|
||||
import da from './da.json';
|
||||
import de from './de.json';
|
||||
import en from './en.json';
|
||||
import en_US from './en-US.json';
|
||||
import es from './es.json';
|
||||
import es_CL from './es-CL.json';
|
||||
import fr from './fr.json';
|
||||
import hi from './hi.json';
|
||||
import ja from './ja.json';
|
||||
import ko from './ko.json';
|
||||
import pt_BR from './pt-BR.json';
|
||||
@@ -20,7 +25,7 @@ export const LOCALES = [
|
||||
originalName: '한국어(대한민국)',
|
||||
flagEmoji: '🇰🇷',
|
||||
base: false,
|
||||
completeRate: 0.914,
|
||||
completeRate: 0.878,
|
||||
res: ko,
|
||||
},
|
||||
{
|
||||
@@ -30,7 +35,7 @@ export const LOCALES = [
|
||||
originalName: 'português (Brasil)',
|
||||
flagEmoji: '🇧🇷',
|
||||
base: false,
|
||||
completeRate: 0.399,
|
||||
completeRate: 0.381,
|
||||
res: pt_BR,
|
||||
},
|
||||
{
|
||||
@@ -40,7 +45,7 @@ export const LOCALES = [
|
||||
originalName: 'English',
|
||||
flagEmoji: '🇬🇧',
|
||||
base: true,
|
||||
completeRate: 0.953,
|
||||
completeRate: 1,
|
||||
res: en,
|
||||
},
|
||||
{
|
||||
@@ -50,7 +55,7 @@ export const LOCALES = [
|
||||
originalName: '繁體中文',
|
||||
flagEmoji: '🇭🇰',
|
||||
base: false,
|
||||
completeRate: 0.432,
|
||||
completeRate: 0.412,
|
||||
res: zh_Hant,
|
||||
},
|
||||
{
|
||||
@@ -60,7 +65,7 @@ export const LOCALES = [
|
||||
originalName: '简体中文',
|
||||
flagEmoji: '🇨🇳',
|
||||
base: false,
|
||||
completeRate: 0.831,
|
||||
completeRate: 1,
|
||||
res: zh_Hans,
|
||||
},
|
||||
{
|
||||
@@ -70,7 +75,7 @@ export const LOCALES = [
|
||||
originalName: 'français',
|
||||
flagEmoji: '🇫🇷',
|
||||
base: false,
|
||||
completeRate: 0.787,
|
||||
completeRate: 0.751,
|
||||
res: fr,
|
||||
},
|
||||
{
|
||||
@@ -80,7 +85,7 @@ export const LOCALES = [
|
||||
originalName: 'español',
|
||||
flagEmoji: '🇪🇸',
|
||||
base: false,
|
||||
completeRate: 0.306,
|
||||
completeRate: 0.292,
|
||||
res: es,
|
||||
},
|
||||
{
|
||||
@@ -90,7 +95,7 @@ export const LOCALES = [
|
||||
originalName: 'Deutsch',
|
||||
flagEmoji: '🇩🇪',
|
||||
base: false,
|
||||
completeRate: 0.303,
|
||||
completeRate: 0.289,
|
||||
res: de,
|
||||
},
|
||||
{
|
||||
@@ -100,7 +105,7 @@ export const LOCALES = [
|
||||
originalName: 'русский',
|
||||
flagEmoji: '🇷🇺',
|
||||
base: false,
|
||||
completeRate: 0.373,
|
||||
completeRate: 0.356,
|
||||
res: ru,
|
||||
},
|
||||
{
|
||||
@@ -110,7 +115,57 @@ export const LOCALES = [
|
||||
originalName: '日本語',
|
||||
flagEmoji: '🇯🇵',
|
||||
base: false,
|
||||
completeRate: 0.239,
|
||||
completeRate: 0.228,
|
||||
res: ja,
|
||||
},
|
||||
{
|
||||
id: 1000070001,
|
||||
name: 'Catalan',
|
||||
tag: 'ca',
|
||||
originalName: 'català',
|
||||
flagEmoji: '🇦🇩',
|
||||
base: false,
|
||||
completeRate: 0.076,
|
||||
res: ca,
|
||||
},
|
||||
{
|
||||
id: 1000074001,
|
||||
name: 'Danish',
|
||||
tag: 'da',
|
||||
originalName: 'dansk',
|
||||
flagEmoji: '🇩🇰',
|
||||
base: false,
|
||||
completeRate: 0.116,
|
||||
res: da,
|
||||
},
|
||||
{
|
||||
id: 1000074002,
|
||||
name: 'English (United States)',
|
||||
tag: 'en-US',
|
||||
originalName: 'English (United States)',
|
||||
flagEmoji: '🇺🇸',
|
||||
base: false,
|
||||
completeRate: 0.011,
|
||||
res: en_US,
|
||||
},
|
||||
{
|
||||
id: 1000074003,
|
||||
name: 'Spanish (Chile)',
|
||||
tag: 'es-CL',
|
||||
originalName: 'español (Chile)',
|
||||
flagEmoji: '🇨🇱',
|
||||
base: false,
|
||||
completeRate: 0.031,
|
||||
res: es_CL,
|
||||
},
|
||||
{
|
||||
id: 1000074004,
|
||||
name: 'Hindi',
|
||||
tag: 'hi',
|
||||
originalName: 'हिन्दी',
|
||||
flagEmoji: '🇮🇳',
|
||||
base: false,
|
||||
completeRate: 0.019,
|
||||
res: hi,
|
||||
},
|
||||
] as const;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "404 - ページが見つかりません",
|
||||
"AFFiNE Cloud": "AFFiNEクラウド",
|
||||
"AFFiNE Community": "AFFiNEコミュニティ",
|
||||
|
||||
@@ -1,16 +1,11 @@
|
||||
{
|
||||
"404 - Page Not Found": "404 - 페이지를 찾을 수 없음",
|
||||
"404.back": "내 콘텐츠로 돌아가기",
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404.hint": "죄송합니다, 액세스 권한이 없거나 해당 콘텐츠가 없습니다...",
|
||||
"404.signOut": "다른 계정으로 로그인",
|
||||
"AFFiNE Cloud": "AFFiNE Cloud",
|
||||
"AFFiNE Community": "AFFiNE 커뮤니티",
|
||||
"About AFFiNE": "AFFiNE 소개",
|
||||
"Access level": "접근 권한",
|
||||
"Actions": "Actions",
|
||||
"Add Filter": "필터 추가",
|
||||
"Add Workspace": "워크스페이스 추가",
|
||||
"Add Workspace Hint": "기존 데이터베이스 파일 선택",
|
||||
"Add a subpage inside": "내부에 하위 페이지 추가",
|
||||
"Add to Favorites": "즐겨찾기 추가",
|
||||
"Add to favorites": "즐겨찾기에 추가",
|
||||
@@ -27,73 +22,38 @@
|
||||
"Back to Quick Search": "빠른 검색으로 돌아가기",
|
||||
"Back to all": "Back to all",
|
||||
"Body text": "본문 내용",
|
||||
"Bold": "굵게",
|
||||
"Cancel": "취소",
|
||||
"Change avatar hint": "모든 사람에게 새 아바타가 표시됩니다.",
|
||||
"Change workspace name hint": "모든 사람에게 새 이름이 표시됩니다.",
|
||||
"Changelog description": "AFFiNE 변경 기록을 확인합니다.",
|
||||
"Check Keyboard Shortcuts quickly": "키보드 단축키 빠르게 확인",
|
||||
"Check Our Docs": "우리의 공식 문서 확인",
|
||||
"Check for updates": "업데이트 확인",
|
||||
"Check for updates automatically": "자동으로 업데이트 확인",
|
||||
"Choose your font style": "나의 폰트 스타일 선택",
|
||||
"Click to replace photo": "클릭하여 사진 바꾸기",
|
||||
"Client Border Style": "클라이언트 테두리 스타일",
|
||||
"Cloud Workspace": "클라우드 워크스페이스",
|
||||
"Cloud Workspace Description": "모든 데이터는 동기화되어 AFFiNE 계정 <1>{{email}}</1> 에 저장됩니다.",
|
||||
"Code block": "코드 블록",
|
||||
"Collaboration": "협업",
|
||||
"Collaboration Description": "다른 사람들과 협업하기 위해서는 AFFiNE Cloud 서비스가 필요합니다..",
|
||||
"Collapse sidebar": "사이드바 축소",
|
||||
"Collections": "컬렉션",
|
||||
"Communities": "커뮤니티",
|
||||
"Confirm": "확인",
|
||||
"Connector": "연결 선",
|
||||
"Contact Us": "Contact us",
|
||||
"Contact with us": "Contact Us",
|
||||
"Continue": "계속",
|
||||
"Continue with Google": "Google로 계속하기",
|
||||
"Convert to ": "다음으로 변환 ",
|
||||
"Copied link to clipboard": "클립보드에 링크 복사함",
|
||||
"Copy": "복사",
|
||||
"Copy Link": "링크 복사",
|
||||
"Create": "생성",
|
||||
"Create Or Import": "생성 또는 가져오기",
|
||||
"Create Shared Link Description": "누구와도 쉽게 공유할 수 있는 링크를 만들어 보세요.",
|
||||
"Create a collection": "컬렉션 생성",
|
||||
"Create your own workspace": "나만의 워크스페이스 만들기",
|
||||
"Created": "생성함",
|
||||
"Created Successfully": "성공적으로 생성함",
|
||||
"Created with": "다음과 같이 생성함",
|
||||
"Curve Connector": "연결 곡선",
|
||||
"Customize": "사용자 정의",
|
||||
"Customize your AFFiNE Appearance": "AFFiNE 외형 사용자 정의",
|
||||
"DB_FILE_ALREADY_LOADED": "데이터베이스 파일을 이미 로드함",
|
||||
"DB_FILE_INVALID": "유효하지 않은 데이터베이스 파일",
|
||||
"DB_FILE_MIGRATION_FAILED": "데이터베이스 파일 마이그레이션 실패",
|
||||
"DB_FILE_PATH_INVALID": "데이터베이스 파일 경로가 잘못됨",
|
||||
"Data sync mode": "데이터 동기화 모드",
|
||||
"Date": "날짜",
|
||||
"Date Format": "날짜 형식",
|
||||
"Default Location": "기본 위치",
|
||||
"Default db location hint": "기본적으로 {{location}}에 저장",
|
||||
"Delete": "삭제",
|
||||
"Delete Member?": "멤버를 삭제하시겠습니까?",
|
||||
"Delete Workspace": "워크스페이스 제거",
|
||||
"Delete Workspace Description": "<1>{{workspace}}</1> 삭제는 되돌릴 수 없으니 주의해서 진행하세요. 모든 내용이 손실됩니다.",
|
||||
"Delete Workspace Description2": "<1>{{workspace}}</1>을 삭제하면 로컬 데이터와 클라우드 데이터가 모두 삭제되며, 이 작업은 되돌릴 수 없으므로 주의해서 진행하세요.",
|
||||
"Delete Workspace Label Hint": "이 워크스페이스를 삭제하면 모든 사용자의 모든 콘텐츠가 영구적으로 삭제됩니다. 누구도 이 워크스페이스의 콘텐츠를 복원할 수 없습니다.",
|
||||
"Delete Workspace placeholder": "\"Delete\"를 입력하여 확인",
|
||||
"Delete page?": "페이지를 삭제하시겠습니까?",
|
||||
"Delete permanently": "영구적으로 삭제",
|
||||
"Disable": "비활성화",
|
||||
"Disable Public Link": "공개 링크 비활성화",
|
||||
"Disable Public Link ?": "공개 링크를 비활성화 하시겠습니까?",
|
||||
"Disable Public Link Description": "이 공개 링크를 비활성화하면 해당하는 링크를 가지고 있더라도 이 페이지에 액세스할 수 없습니다.",
|
||||
"Disable Public Sharing": "공개 공유 비활성화",
|
||||
"Discover what's new": "새로운 소식 알아보기",
|
||||
"Discover what's new!": "새로운 소식을 알아봅니다!",
|
||||
"Display Language": "표시 언어",
|
||||
"Divider": "구분자",
|
||||
"Download all data": "모든 데이터 다운로드",
|
||||
"Download core data": "주요 데이터 다운로드",
|
||||
@@ -108,7 +68,6 @@
|
||||
"Editor Version": "에디터 버전",
|
||||
"Elbowed Connector": "꺽인 연결 선",
|
||||
"Enable": "활성화",
|
||||
"Enable AFFiNE Cloud": "AFFiNE Cloud 활성화",
|
||||
"Enable AFFiNE Cloud Description": "이 기능을 활성화하면, 이 워크스페이스의 데이터가 AFFiNE Cloud를 통해 백업 및 동기화됩니다.",
|
||||
"Enable cloud hint": "다음 기능은 AFFiNE Cloud에 의존합니다. 모든 데이터는 현재 디바이스에 저장됩니다. 이 워크스페이스에서 AFFiNE Cloud를 활성화하여 데이터를 클라우드와 동기화할 수 있습니다.",
|
||||
"Enabled success": "성공적으로 활성화함",
|
||||
@@ -120,14 +79,10 @@
|
||||
"Export Description": "백업을 위해 전체 워크스페이스 데이터를 내보낼 수 있으며, 내보낸 데이터를 다시 가져올 수 있습니다.",
|
||||
"Export Shared Pages Description": "다른 사람들과 공유할 수 있도록 페이지의 정적 사본을 다운로드하세요.",
|
||||
"Export Workspace": "워크스페이스 내보내기 <1>{{workspace}}</1>가 곧 제공됩니다",
|
||||
"Export failed": "내보내기 실패",
|
||||
"Export success": "내보내기 성공",
|
||||
"Export to HTML": "HTML로 내보내기",
|
||||
"Export to Markdown": "마크다운으로 내보내기",
|
||||
"Export to PDF": "PDF로 내보내기",
|
||||
"Export to PNG": "PNG로 내보내기",
|
||||
"FILE_ALREADY_EXISTS": "파일이 이미 있음",
|
||||
"Failed to publish workspace": "워크스페이스 발행 실패",
|
||||
"Favorite": "즐겨찾기",
|
||||
"Favorite pages for easy access": "쉽게 액세스할 수 있는 즐겨찾기 페이지",
|
||||
"Favorited": "즐겨찾기",
|
||||
@@ -135,22 +90,16 @@
|
||||
"Filters": "필터",
|
||||
"Find 0 result": "결과 0개 발견",
|
||||
"Find results": "결과 {{number}}건을 발견",
|
||||
"Font Style": "폰트 스타일",
|
||||
"Force Sign Out": "강제 로그아웃",
|
||||
"Full width Layout": "전체 너비 레이아웃",
|
||||
"General": "일반",
|
||||
"Get in touch!": "연락하세요!",
|
||||
"Get in touch! Join our communities": "연락하세요! 우리의 커뮤니티에 가입하세요.",
|
||||
"Get in touch! Join our communities.": "연락하세요! 우리의 커뮤니티에 가입하세요.",
|
||||
"Go Back": "이전으로",
|
||||
"Go Forward": "다음으로",
|
||||
"Got it": "알겠습니다",
|
||||
"Group": "그룹",
|
||||
"Group as Database": "데이터베이스로 묶기",
|
||||
"Hand": "Hand",
|
||||
"Heading": "헤딩 {{number}}",
|
||||
"Help and Feedback": "Help and Feedback",
|
||||
"How is AFFiNE Alpha different?": "AFFiNE 알파는 어떤 점이 다른가요?",
|
||||
"Image": "이미지",
|
||||
"Import": "불러오기",
|
||||
"Increase indent": "들여쓰기 추가",
|
||||
@@ -167,7 +116,6 @@
|
||||
"It takes up little space on your device.": "디바이스 공간을 거의 차지하지 않습니다.",
|
||||
"It takes up more space on your device": "디바이스 공간을 더 많이 차지합니다.",
|
||||
"It takes up more space on your device.": "디바이스 공간을 더 많이 차지합니다.",
|
||||
"Italic": "기울임",
|
||||
"Joined Workspace": "참가한 워크스페이스",
|
||||
"Jump to": "다음으로 이동",
|
||||
"Keyboard Shortcuts": "키보드 단축키",
|
||||
@@ -215,7 +163,6 @@
|
||||
"Open folder hint": "저장 폴더가 있는 위치를 확인합니다.",
|
||||
"Open in new tab": "새 탭에서 열기",
|
||||
"Organize pages to build knowledge": "지식을 쌓을 수 있도록 페이지 구성",
|
||||
"Owner": "소유자",
|
||||
"Page": "페이지",
|
||||
"Paper": "페이퍼",
|
||||
"Pen": "펜",
|
||||
@@ -267,7 +214,6 @@
|
||||
"Share Menu Public Workspace Description2": "공개 워크스페이스로 현재 워크스페이스를 웹에 발행했습니다.",
|
||||
"Share with link": "링크로 공유",
|
||||
"Shared Pages": "공유한 페이지",
|
||||
"Shared Pages Description": "페이지를 공개적으로 공유하려면 AFFiNE Cloud 서비스가 필요합니다.",
|
||||
"Shared Pages In Public Workspace Description": "전체 워크스페이스를 웹으로 발행했습니다. <1>Workspace Settings</1>을 통해 편집할 수 있습니다.",
|
||||
"Shortcuts": "단축키",
|
||||
"Sidebar": "사이드바",
|
||||
@@ -286,7 +232,6 @@
|
||||
"Straight Connector": "연결 직선",
|
||||
"Strikethrough": "취소선",
|
||||
"Successfully deleted": "성공적으로 삭제함",
|
||||
"Successfully enabled AFFiNE Cloud": "AFFiNE 클라우드 활성화 성공",
|
||||
"Successfully joined!": "성공적으로 가입했습니다!",
|
||||
"Switch": "전환",
|
||||
"Sync": "동기화",
|
||||
@@ -298,12 +243,9 @@
|
||||
"Theme": "테마",
|
||||
"Title": "제목",
|
||||
"Trash": "휴지통",
|
||||
"TrashButtonGroupDescription": "삭제한 후에는, 이 작업을 실행 취소할 수 없습니다. 확인하셨습니까?",
|
||||
"TrashButtonGroupTitle": "영구적으로 삭제",
|
||||
"UNKNOWN_ERROR": "알 수 없는 오류",
|
||||
"Underline": "밑줄",
|
||||
"Undo": "실행 취소",
|
||||
"Ungroup": "그룹 취소",
|
||||
"Unpin": "고정 취소",
|
||||
"Unpublished hint": "웹에 발행하면, 방문자는 제공된 링크를 통해 콘텐츠를 볼 수 있습니다.",
|
||||
"Untitled": "무제",
|
||||
@@ -315,7 +257,6 @@
|
||||
"Upload": "업로드",
|
||||
"Use on current device only": "현재 디바이스에서만 사용",
|
||||
"Users": "사용자",
|
||||
"Version": "버전",
|
||||
"View Navigation Path": "탐색 경로 보기",
|
||||
"Visit Workspace": "워크스페이스 방문",
|
||||
"Wait for Sync": "동기화 대기",
|
||||
@@ -368,7 +309,6 @@
|
||||
"com.affine.aboutAFFiNE.title": "AFFiNE 소개",
|
||||
"com.affine.aboutAFFiNE.version.app": "앱 버전",
|
||||
"com.affine.aboutAFFiNE.version.editor.title": "에디터 버전",
|
||||
"com.affine.aboutAFFiNE.version.title": "버전",
|
||||
"com.affine.all-pages.header": "모든 페이지",
|
||||
"com.affine.appUpdater.downloadUpdate": "업데이트 다운로드",
|
||||
"com.affine.appUpdater.downloading": "다운로드 중",
|
||||
@@ -406,7 +346,7 @@
|
||||
"com.affine.appearanceSettings.windowFrame.description": "Windows 클라이언트의 모양을 사용자 정의합니다.",
|
||||
"com.affine.appearanceSettings.windowFrame.frameless": "프레임 없이",
|
||||
"com.affine.appearanceSettings.windowFrame.title": "윈도우 프레임 스타일",
|
||||
"com.affine.auth.verify.email.message": "현재 이메일은 {{email}}입니다. 이 이메일 주소로 임시 인증 링크를 보내 드리겠습니다.",
|
||||
"com.affine.auth.change.email.message": "현재 이메일은 {{email}}입니다. 이 이메일 주소로 임시 인증 링크를 보내 드리겠습니다.",
|
||||
"com.affine.auth.change.email.page.subtitle": "아래에 새 이메일 주소를 입력하세요. 절차를 완료하기 위해 이 이메일 주소로 인증 링크를 보내드립니다.",
|
||||
"com.affine.auth.change.email.page.success.subtitle": "축하합니다! AFFiNE Cloud 계정과 연결된 이메일 주소를 성공적으로 업데이트했습니다.",
|
||||
"com.affine.auth.change.email.page.success.title": "이메일 주소를 업데이트했습니다!",
|
||||
@@ -421,7 +361,7 @@
|
||||
"com.affine.auth.open.affine.download-app": "앱 다운로드",
|
||||
"com.affine.auth.open.affine.prompt": "<1>AFFiNE</1> 앱을 지금 열기",
|
||||
"com.affine.auth.open.affine.try-again": "다시 시도하세요",
|
||||
"com.affine.auth.page.sent.email.subtitle": "계속 가입하려면 문자와 숫자가 모두 포함된 8~20자의 비밀번호를 설정하세요.",
|
||||
"com.affine.auth.page.sent.email.subtitle": "계속 가입하려면 문자와 숫자가 모두 포함된 {{min}}-{{max}}자의 비밀번호를 설정하세요.",
|
||||
"com.affine.auth.page.sent.email.title": "AFFiNE Cloud에 오신 것을 환영합니다. 거의 다 오셨습니다!",
|
||||
"com.affine.auth.password": "비밀번호",
|
||||
"com.affine.auth.password.error": "유효하지 않은 비밀번호",
|
||||
@@ -430,21 +370,23 @@
|
||||
"com.affine.auth.reset.password.message": "비밀번호를 재설정할 수 있는 링크가 포함된 이메일을 받게 됩니다. 받은 편지함을 확인해 주세요.",
|
||||
"com.affine.auth.reset.password.page.success": "비밀번호 재설정 성공",
|
||||
"com.affine.auth.reset.password.page.title": "AFFiNE Cloud 비밀번호 재설정",
|
||||
"com.affine.auth.send.verify.email.hint": "인증 링크 전송",
|
||||
"com.affine.auth.send.change.email.link": "인증 링크 전송",
|
||||
"com.affine.auth.send.reset.password.link": "재설정 링크 전송",
|
||||
"com.affine.auth.send.set.password.link": "설정 링크 전송",
|
||||
"com.affine.auth.send.verify.email.hint": "인증 링크 전송",
|
||||
"com.affine.auth.sent": "보냄",
|
||||
"com.affine.auth.sent.verify.email.hint": "인증 링크를 보냈습니다.",
|
||||
"com.affine.auth.sent.change.email.hint": "인증 링크를 보냈습니다.",
|
||||
"com.affine.auth.sent.change.password.hint": "비밀번호 재설정 링크를 보냈습니다.",
|
||||
"com.affine.auth.sent.reset.password.success.message": "비밀번호가 업그레이드했습니다! 새 비밀번호로 AFFiNE Cloud에 로그인할 수 있습니다!",
|
||||
"com.affine.auth.sent.set.password.hint": "비밀번호 설정 링크를 보냈습니다.",
|
||||
"com.affine.auth.sent.set.password.success.message": "비밀번호를 저장했습니다! 이메일과 비밀번호로 AFFiNE Cloud에 로그인할 수 있습니다!",
|
||||
"com.affine.auth.sent.verify.email.hint": "인증 링크를 보냈습니다.",
|
||||
"com.affine.auth.set.email.save": "이메일 저장",
|
||||
"com.affine.auth.set.password": "비밀번호 설정",
|
||||
"com.affine.auth.set.password.message": "계속 가입하려면 문자와 숫자가 모두 포함된 8~20자의 비밀번호를 설정하세요.",
|
||||
"com.affine.auth.set.password.message": "계속 가입하려면 문자와 숫자가 모두 포함된 {{min}}-{{max}}자의 비밀번호를 설정하세요.",
|
||||
"com.affine.auth.set.password.page.success": "비밀번호 설정 성공",
|
||||
"com.affine.auth.set.password.page.title": "AFFiNE Cloud 비밀번호 설정",
|
||||
"com.affine.auth.set.password.placeholder": "비밀번호는 최소 8자 이상",
|
||||
"com.affine.auth.set.password.placeholder": "비밀번호는 최소 {{min}}자 이상",
|
||||
"com.affine.auth.set.password.placeholder.confirm": "비밀번호 확인",
|
||||
"com.affine.auth.set.password.save": "비밀번호 저장",
|
||||
"com.affine.auth.sign-out.confirm-modal.cancel": "취소",
|
||||
@@ -482,6 +424,7 @@
|
||||
"com.affine.auth.toast.message.signed-in": "로그인이 완료되었으니, AFFiNE Cloud와 데이터 동기화를 시작하세요!",
|
||||
"com.affine.auth.toast.title.failed": "로그인할 수 없음",
|
||||
"com.affine.auth.toast.title.signed-in": "로그인함",
|
||||
"com.affine.auth.verify.email.message": "현재 이메일은 {{email}}입니다. 이 이메일 주소로 임시 인증 링크를 보내 드리겠습니다.",
|
||||
"com.affine.backButton": "뒤로",
|
||||
"com.affine.banner.content": "이 데모는 제한적으로 제공됩니다. 최신 기능 및 성능을 보려면 <1>Download the AFFiNE Client</1> 하세요.",
|
||||
"com.affine.banner.local-warning": "로컬 데이터는 브라우저에 저장되며 손실될 수 있습니다. 위험을 감수하지 마세요 - 지금 클라우드를 활성화 하세요!",
|
||||
@@ -546,14 +489,10 @@
|
||||
"com.affine.cmdk.affine.whats-new": "새로운 소식",
|
||||
"com.affine.cmdk.placeholder": "명령어를 입력하거나 무엇이든 검색합니다...",
|
||||
"com.affine.collection-bar.action.tooltip.delete": "삭제",
|
||||
"com.affine.collection-bar.action.tooltip.edit": "수정",
|
||||
"com.affine.collection-bar.action.tooltip.pin": "사이드바에 고정",
|
||||
"com.affine.collection-bar.action.tooltip.unpin": "고정 해제",
|
||||
"com.affine.collection.addPage.alreadyExists": "페이지가 이미 존재함",
|
||||
"com.affine.collection.addPage.success": "성공적으로 추가함",
|
||||
"com.affine.collection.addPages": "페이지 추가",
|
||||
"com.affine.collection.addPages.tips": "<0>Add pages:</0> 페이지를 자유롭게 선택하여 컬렉션에 추가할 수 있습니다.",
|
||||
"com.affine.collection.addRules": "규칙 추가",
|
||||
"com.affine.collection.addRules.tips": "<0>Add rules:</0> 규칙은 필터링을 기반으로 합니다. 규칙을 추가하면, 요구 사항을 충족하는 페이지가 현재 컬렉션에 자동으로 추가됩니다.",
|
||||
"com.affine.collection.allCollections": "모든 컬렉션",
|
||||
"com.affine.collection.emptyCollection": "빈 컬렉션",
|
||||
@@ -564,6 +503,7 @@
|
||||
"com.affine.collection.removePage.success": "성공적으로 제거함",
|
||||
"com.affine.collection.toolbar.selected": "<0>{{count}}</0>개 선택함",
|
||||
"com.affine.collection.toolbar.selected_one": "<0>{{count}}</0>개 컬렉션 선택함",
|
||||
"com.affine.collection.toolbar.selected_other": "<0>{{count}}</0>개 컬랙션 선택함",
|
||||
"com.affine.collection.toolbar.selected_others": "<0>{{count}}</0>개 컬랙션 선택함",
|
||||
"com.affine.collectionBar.backToAll": "Back to all",
|
||||
"com.affine.collections.empty.message": "컬렉션 없음",
|
||||
@@ -585,14 +525,11 @@
|
||||
"com.affine.editCollection.pages": "페이지",
|
||||
"com.affine.editCollection.pages.clear": "선택 취소",
|
||||
"com.affine.editCollection.renameCollection": "컬렉션 이름 변경",
|
||||
"com.affine.editCollection.rules": "규칙",
|
||||
"com.affine.editCollection.rules.countTips": "<1>{{selectedCount}}</1>개 선택함, <3>{{filteredCount}}</3> 개 필터링함",
|
||||
"com.affine.editCollection.rules.countTips.more": "Showing <1>{{count}}</1> pages.",
|
||||
"com.affine.editCollection.rules.countTips.one": "Showing <1>{{count}}</1> page.",
|
||||
"com.affine.editCollection.rules.countTips.zero": "Showing <1>{{count}}</1> pages.",
|
||||
"com.affine.editCollection.rules.empty.noResults": "결과 없음",
|
||||
"com.affine.editCollection.rules.empty.noResults.tips": "필터링 규칙을 충족하는 페이지가 없음",
|
||||
"com.affine.editCollection.rules.empty.noRules": "규칙 없음",
|
||||
"com.affine.editCollection.rules.empty.noRules.tips": "<1>add rules</1>을 통해 이 컬렉션을 저장하거나 <3>Pages</3>로 전환하려면, 수동 선택 모드를 사용하세요.",
|
||||
"com.affine.editCollection.rules.include.add": "선택한 페이지 추가",
|
||||
"com.affine.editCollection.rules.include.is": "는",
|
||||
@@ -661,10 +598,8 @@
|
||||
"com.affine.history.confirm-restore-modal.plan-prompt.limited-title": "제한된 페이지 기록",
|
||||
"com.affine.history.confirm-restore-modal.plan-prompt.title": "HELP INFO",
|
||||
"com.affine.history.confirm-restore-modal.pro-plan-prompt.description": "Pro 사용자는 최대 <1>최근 30일<1> 의 페이지 기록을 볼 수 있습니다.",
|
||||
"com.affine.history.confirm-restore-modal.pro-plan-prompt.upgrade": "업그레이드",
|
||||
"com.affine.history.confirm-restore-modal.restore": "복원",
|
||||
"com.affine.history.empty-prompt.description": "이 문서는 정말 풋내기예요, 아직 역사적인 가지 하나도 돋아나지 않았어요!",
|
||||
"com.affine.history.empty-prompt.title": "비어 있음",
|
||||
"com.affine.history.restore-current-version": "현재 버전 복원",
|
||||
"com.affine.history.version-history": "버전 이력",
|
||||
"com.affine.history.view-history-version": "버전 이력 보기",
|
||||
@@ -688,7 +623,6 @@
|
||||
"com.affine.keyboardShortcuts.expandOrCollapseSidebar": "사이드바 확장/축소",
|
||||
"com.affine.keyboardShortcuts.goBack": "이전으로",
|
||||
"com.affine.keyboardShortcuts.goForward": "다음으로",
|
||||
"com.affine.keyboardShortcuts.group": "그룹",
|
||||
"com.affine.keyboardShortcuts.groupDatabase": "데이터베이스로 묶기",
|
||||
"com.affine.keyboardShortcuts.hand": "Hand",
|
||||
"com.affine.keyboardShortcuts.heading": "헤딩 {{number}}",
|
||||
@@ -714,7 +648,6 @@
|
||||
"com.affine.keyboardShortcuts.switch": "전환",
|
||||
"com.affine.keyboardShortcuts.text": "Text",
|
||||
"com.affine.keyboardShortcuts.title": "키보드 단축키",
|
||||
"com.affine.keyboardShortcuts.unGroup": "그룹 취소",
|
||||
"com.affine.keyboardShortcuts.underline": "밑줄",
|
||||
"com.affine.keyboardShortcuts.undo": "실행 취소",
|
||||
"com.affine.keyboardShortcuts.zoomIn": "확대",
|
||||
@@ -759,9 +692,9 @@
|
||||
"com.affine.other-page.nav.open-affine": "AFFiNE 열기",
|
||||
"com.affine.page-operation.add-linked-page": "링크한 페이지에 추가",
|
||||
"com.affine.page.group-header.clear": "선택 초기화",
|
||||
"com.affine.page.group-header.select-all": "모두 선택",
|
||||
"com.affine.page.toolbar.selected": "<0>{{count}}</0> 선택함",
|
||||
"com.affine.page.toolbar.selected_one": "<0>{{count}}</0> 개의 페이지 선택함",
|
||||
"com.affine.page.toolbar.selected_other": "<0>{{count}}</0> 개의 페이지 선택함",
|
||||
"com.affine.page.toolbar.selected_others": "<0>{{count}}</0> 개의 페이지 선택함",
|
||||
"com.affine.pageMode": "페이지 모드",
|
||||
"com.affine.pageMode.all": "all",
|
||||
@@ -804,7 +737,6 @@
|
||||
"com.affine.payment.blob-limit.description.owner.free": "{{planName}} 유저는 최대 {{currentQuota}} 크기의 파일을 업로드할 수 있습니다. 계정을 업그레이드하여 최대 {{upgradeQuota}} 크기의 파일을 업로드 할 수 있습니다.",
|
||||
"com.affine.payment.blob-limit.description.owner.pro": "{{planName}} 유저는 최대 {{quota}} 크기의 파일을 업로드 할 수 있습니다.",
|
||||
"com.affine.payment.blob-limit.title": "제한에 도달하였습니다.",
|
||||
"com.affine.payment.buy-pro": "Pro 구매",
|
||||
"com.affine.payment.change-to": "{{to}}로 결제를 변경",
|
||||
"com.affine.payment.contact-sales": "Contact Sales",
|
||||
"com.affine.payment.current-plan": "현재 플랜",
|
||||
@@ -830,7 +762,6 @@
|
||||
"com.affine.payment.modal.change.title": "구독 변경",
|
||||
"com.affine.payment.modal.downgrade.cancel": "구독 취소",
|
||||
"com.affine.payment.modal.downgrade.caption": "이 청구 기간이 끝날 때까지 AFFiNE Cloud Pro를 계속 사용할 수 있습니다. :)",
|
||||
"com.affine.payment.modal.downgrade.confirm": "AFFiNE Cloud Pro 유지",
|
||||
"com.affine.payment.modal.downgrade.content": "회원님이 떠나게 되어 아쉽지만, 저희는 항상 개선을 위해 노력하고 있으며 여러분의 피드백을 환영합니다. 나중에 다시 찾아뵙기를 기대합니다.",
|
||||
"com.affine.payment.modal.downgrade.title": "정말 다운그레이드 하시겠습니까?",
|
||||
"com.affine.payment.modal.resume.cancel": "취소",
|
||||
@@ -905,18 +836,13 @@
|
||||
"com.affine.settings.appearance.language-description": "인터페이스에 사용할 언어를 선택합니다.",
|
||||
"com.affine.settings.appearance.start-week-description": "기본적으로, 한 주는 일요일에 시작합니다.",
|
||||
"com.affine.settings.appearance.window-frame-description": "Windows 클라이언트의 모양을 사용자 정의합니다.",
|
||||
"com.affine.settings.auto-check-description": "이 기능을 활성화하면, 정기적으로 새 버전을 자동으로 확인합니다.",
|
||||
"com.affine.settings.auto-download-description": "이 기능을 활성화하면, 새 버전이 현재 디바이스에 자동으로 다운로드됩니다.",
|
||||
"com.affine.settings.email": "이메일",
|
||||
"com.affine.settings.email.action.change": "이메일 변경",
|
||||
"com.affine.settings.member-tooltip": "다른 사람들과 협업할 수 있는 AFFiNE Cloud 활성화",
|
||||
"com.affine.settings.noise-style": "Noise background on the sidebar",
|
||||
"com.affine.settings.noise-style-description": "Use background noise effect on the sidebar.",
|
||||
"com.affine.settings.password": "비밀번호",
|
||||
"com.affine.settings.password.action.change": "비밀번호 변경",
|
||||
"com.affine.settings.password.action.set": "비밀번호 설정",
|
||||
"com.affine.settings.password.message": "계정에 로그인하기 위한 비밀번호 설정",
|
||||
"com.affine.settings.profile": "내 프로필",
|
||||
"com.affine.settings.profile.message": "내 계정 프로필은 모든 사람에게 표시됩니다.",
|
||||
"com.affine.settings.profile.name": "표시 이름",
|
||||
"com.affine.settings.profile.placeholder": "계정 이름 입력",
|
||||
@@ -938,7 +864,6 @@
|
||||
"com.affine.settings.workspace.experimental-features.prompt-header": "시험 단계에 있는 플러그인 시스템을 사용하겠습니까?",
|
||||
"com.affine.settings.workspace.experimental-features.prompt-warning": "실험 기능을 활성화하였습니다. 이 기능은 아직 개발중이며 비정상적인 동작을 할 수 있습니다. 주의를 하고 위험성을 인지하여 진행하세요.",
|
||||
"com.affine.settings.workspace.experimental-features.prompt-warning-title": "경고 문구",
|
||||
"com.affine.settings.workspace.not-owner": "소유자만 워크스페이스 아바타와 이름을 수정할 수 있으며, 변경사항은 모든 사람에게 표시됩니다.",
|
||||
"com.affine.settings.workspace.preferences": "선호",
|
||||
"com.affine.settings.workspace.publish-tooltip": "이 워크스페이스를 발행하려면 AFFiNE Cloud를 활성화하세요.",
|
||||
"com.affine.settings.workspace.storage.tip": "저장소 위치를 이동하려면 클릭합니다.",
|
||||
@@ -964,7 +889,6 @@
|
||||
"com.affine.share-menu.disable-publish-link.notification.success.message": "이 페이지는 더 이상 공개적으로 공유하지 않습니다.",
|
||||
"com.affine.share-menu.disable-publish-link.notification.success.title": "공개 링크 비활성화함",
|
||||
"com.affine.share-menu.publish-to-web": "웹으로 발행",
|
||||
"com.affine.share-menu.publish-to-web.description": "링크가 있는 사람은 누구나 이 페이지의 읽기 전용 버전을 볼 수 있습니다.",
|
||||
"com.affine.share-menu.share-privately": "비공개 공유",
|
||||
"com.affine.share-menu.share-privately.description": "이 워크스페이스의 구성원만 이 링크를 열 수 있습니다.",
|
||||
"com.affine.share-menu.shareButton": "공유",
|
||||
@@ -988,6 +912,7 @@
|
||||
"com.affine.storage.used.hint": "공간 사용",
|
||||
"com.affine.tag.toolbar.selected": " <0>{{count}}</0> 개 선택함",
|
||||
"com.affine.tag.toolbar.selected_one": "<0>{{count}}</0> 개 태그 선택함",
|
||||
"com.affine.tag.toolbar.selected_other": "<0>{{count}}</0> 개 태그 선택함",
|
||||
"com.affine.tag.toolbar.selected_others": "<0>{{count}}</0> 개 태그 선택함",
|
||||
"com.affine.themeSettings.dark": "어두움",
|
||||
"com.affine.themeSettings.light": "밝음",
|
||||
@@ -1004,9 +929,7 @@
|
||||
"com.affine.toastMessage.successfullyDeleted": "성공적으로 제거함",
|
||||
"com.affine.today": "오늘",
|
||||
"com.affine.trashOperation.delete": "삭제",
|
||||
"com.affine.trashOperation.delete.description": "한번 삭제하면, 이 작업을 실행 취소할 수 없습니다. 확인 하셨습니까?",
|
||||
"com.affine.trashOperation.delete.title": "영구적으로 삭제",
|
||||
"com.affine.trashOperation.deleteDescription": "한번 삭제하면, 이 작업을 실행 취소할 수 없습니다. 확인 하셨습니까?",
|
||||
"com.affine.trashOperation.deletePermanently": "영구적으로 삭제",
|
||||
"com.affine.trashOperation.restoreIt": "항목 복원",
|
||||
"com.affine.updater.downloading": "다운로드 중",
|
||||
@@ -1071,7 +994,6 @@
|
||||
"restored": "{{title}} 복원함",
|
||||
"still designed": "(이 페이지는 아직 설계 중입니다.)",
|
||||
"system": "System",
|
||||
"upgradeBrowser": "최상의 사용 환경을 위해 최신 버전의 Chrome으로 업그레이드하세요.",
|
||||
"will be moved to Trash": "{{title}} 이 휴지통으로 옮겨집니다",
|
||||
"will delete member": "멤버를 삭제"
|
||||
}
|
||||
|
||||
@@ -1,215 +1,6 @@
|
||||
{
|
||||
"404 - Page Not Found": "404 - Página não encontrada",
|
||||
"404.back": "Voltar para Meu Conteúdo\n",
|
||||
"404.hint": "Desculpe, você não tem acesso ou este conteúdo não existe...",
|
||||
"404.signOut": "Entrar com outra conta",
|
||||
"AFFiNE Cloud": "AFFiNE Cloud",
|
||||
"AFFiNE Community": "Comunidade AFFiNE",
|
||||
"About AFFiNE": "Sobre AFFiNE",
|
||||
"Access level": "Nível de acesso",
|
||||
"Actions": "Ações",
|
||||
"Add Filter": "Adicionar Filtro",
|
||||
"Add Workspace": "Adicionar Workspace",
|
||||
"Add Workspace Hint": "Selecione o arquivo de banco de dados existente",
|
||||
"Add a subpage inside": "Adicione uma subpágina dentro",
|
||||
"Add to Favorites": "Adicionar aos Favoritos",
|
||||
"Add to favorites": "Adicionar aos favoritos",
|
||||
"Added Successfully": "Adicionado com sucesso",
|
||||
"Added to Favorites": "Adicionado aos Favoritos",
|
||||
"All changes are saved locally": "Todas as alterações estão salvas localmente",
|
||||
"All data has been stored in the cloud": "Todos os dados foram armazenados na nuvem.",
|
||||
"All pages": "Todas as páginas",
|
||||
"App Version": "Versão do App",
|
||||
"Appearance Settings": "Configurações de Aparência",
|
||||
"Append to Daily Note": "Anexar à Nota Diária",
|
||||
"Available Offline": "Disponível Offline",
|
||||
"Back Home": "Voltar para Início",
|
||||
"Back to Quick Search": "Voltar para Pesquisa Rápida",
|
||||
"Back to all": "Voltar para todos",
|
||||
"Body text": "Corpo de Texto",
|
||||
"Bold": "Negrito",
|
||||
"Cancel": "Cancelar",
|
||||
"Change avatar hint": "Novo avatar será mostrado para todo mundo.",
|
||||
"Change workspace name hint": "Novo nome será mostrado para todo mundo.",
|
||||
"Changelog description": "Veja o log de alterações do AFFiNE.",
|
||||
"Check Keyboard Shortcuts quickly": "Verifique os Atalhos de Teclado rapidamente",
|
||||
"Check Our Docs": "Confira Nossa Documentação",
|
||||
"Check for updates": "Verifique se há atualizações",
|
||||
"Check for updates automatically": "Verifique se há atualizações automaticamente",
|
||||
"Choose your font style": "Selecione seu estilo de fonte",
|
||||
"Click to replace photo": "Clique para trocar a foto",
|
||||
"Client Border Style": "Estilo de Borda do Cliente",
|
||||
"Cloud Workspace": "Workspace na Nuvem",
|
||||
"Cloud Workspace Description": "Todos os dados serão sincronizados e salvos na conta AFFiNE <1>{{email}}</1>",
|
||||
"Code block": "Bloco de Código",
|
||||
"Collaboration": "Colaboração",
|
||||
"Collaboration Description": "Colaborar com outros membros requer o serviço AFFiNE Cloud.",
|
||||
"Collapse sidebar": "Ocultar barra lateral",
|
||||
"Collections": "Coleções",
|
||||
"Communities": "Comunidades",
|
||||
"Confirm": "Confirmar",
|
||||
"Connector": "Conector",
|
||||
"Contact Us": "Entre em contato",
|
||||
"Contact with us": "Entre em contato",
|
||||
"Continue": "Continuar",
|
||||
"Continue with Google": "Continue com o Google",
|
||||
"Convert to ": "Converter para",
|
||||
"Copied link to clipboard": "Link copiado para a área de transferência",
|
||||
"Copy": "Copiar",
|
||||
"Copy Link": "Copiar link",
|
||||
"Create": "Criar",
|
||||
"Create Or Import": "Criar ou Importar",
|
||||
"Create Shared Link Description": "Criar descrição de link compartilhado",
|
||||
"Create a collection": "Criar uma coleção",
|
||||
"Create your own workspace": "Crie seu próprio Workspace",
|
||||
"Created": "Criado",
|
||||
"Created Successfully": "Criado com sucesso",
|
||||
"Created with": "Criado com",
|
||||
"Curve Connector": "Conector Curvo\n",
|
||||
"Customize": "Customizar",
|
||||
"Customize your AFFiNE Appearance": "Personalize sua aparência AFFiNE",
|
||||
"DB_FILE_ALREADY_LOADED": "Arquivo de banco de dados já carregado",
|
||||
"DB_FILE_INVALID": "Arquivo de banco de dados inválido",
|
||||
"DB_FILE_MIGRATION_FAILED": "Falha na migração do arquivo de banco de dados",
|
||||
"DB_FILE_PATH_INVALID": "Caminho do arquivo de banco de dados inválido",
|
||||
"Data sync mode": "Modo de sincronização de dados",
|
||||
"Date": "Data",
|
||||
"Date Format": "Formato de Data",
|
||||
"Default Location": "Localização Padrão",
|
||||
"Default db location hint": "Por padrão será salvo em {{location}}",
|
||||
"Delete": "Deletar",
|
||||
"Delete Member?": "Apagar Membro?",
|
||||
"Delete Workspace": "Deletar Workspace",
|
||||
"Delete Workspace Description": "Deletar <1>{{workspace}}</1> não pode ser desfeito, por favor proceder com atenção. Todos os conteúdos da sua Workspace serão perdidos. ",
|
||||
"Delete Workspace Description2": "Deletar <1>{{workspace}}</1> deletará tanto a cópia local como na nuvem, esta operação não pode ser desfeita, por favor proceda com atenção.",
|
||||
"Delete Workspace Label Hint": "Após apagar este Workspace, você apagará permanentemente todo o seu conteúdo para todo mundo. Ninguém poderá recuperar o conteúdo deste Workspace.",
|
||||
"Delete Workspace placeholder": "Por favor, digite \"Delete\" para confirmar",
|
||||
"Delete page?": "Deletar página?",
|
||||
"Delete permanently": "Deletar permanentemente",
|
||||
"Disable": "Desabilitar",
|
||||
"Disable Public Link": "Desativar Link Público",
|
||||
"Disable Public Link ?": "Desativar Link Público?",
|
||||
"Disable Public Link Description": "Desativar este link público impedirá que qualquer pessoa com o link acesse esta página.",
|
||||
"Disable Public Sharing": "Desativar Compartilhamento Público",
|
||||
"Discover what's new": "Descubra o que há de novo",
|
||||
"Discover what's new!": "Descubre o que há de novo!",
|
||||
"Display Language": "Idioma de Exibição",
|
||||
"Divider": "Divisor",
|
||||
"Download all data": "Baixe todos os dados",
|
||||
"Download core data": "Baixar dados principais",
|
||||
"Download data": "Baixar {{CoreOrAll}} dados",
|
||||
"Download data Description1": "Ocupa mais espaço no seu dispositivo.",
|
||||
"Download data Description2": "Ocupa pouco espaço no seu dispositivo.\n",
|
||||
"Download updates automatically": "Baixe atualizações automaticamente",
|
||||
"Early Access Stage": "Estágio de Acesso Antecipado\n",
|
||||
"Edgeless": "Sem Bordas",
|
||||
"Edit": "Editar",
|
||||
"Edit Filter": "Editar Filtro",
|
||||
"Editor Version": "Versão do Editor",
|
||||
"Elbowed Connector": "Conector Angular",
|
||||
"Enable": "Habilitar",
|
||||
"Enable AFFiNE Cloud": "Habilitar AFFiNE Cloud",
|
||||
"Enable AFFiNE Cloud Description": "Se habilitada, os dados desta Workspace serão salvos e sincronizados via AFFiNE Cloud.",
|
||||
"Enable cloud hint": "As seguintes funções dependem do AFFiNE Cloud. Todos os dados são armazenados no dispositivo atual. Você pode ativar o AFFiNE Cloud para este workspace para manter os dados sincronizados com a nuvem.\n\n",
|
||||
"Enabled success": "Habilitado com sucesso",
|
||||
"Exclude from filter": "Excluir do filtro",
|
||||
"Expand sidebar": "Expandir barra lateral",
|
||||
"Expand/Collapse Sidebar": "Expandir/Retrair Barra Lateral",
|
||||
"Export": "Exportar",
|
||||
"Export AFFiNE backup file": "Exportar arquivo de backup AFFiNE",
|
||||
"Export Description": "Você pode exportar todos os dados do Workspace para backup, e os dados exportados podem ser reimportados.\n\n",
|
||||
"Export Shared Pages Description": "Baixe uma cópia estática da sua página para compartilhar com outros.",
|
||||
"Export Workspace": "Exportar Workspace <1>{{workspace}}</1> está vindo em breve",
|
||||
"Export failed": "Exportação falhou",
|
||||
"Export success": "Exportado com sucesso",
|
||||
"Export to HTML": "Exportar para HTML",
|
||||
"Export to Markdown": "Exportar para Markdown",
|
||||
"Export to PDF": "Exportar para PDF",
|
||||
"Export to PNG": "Exportar para PNG",
|
||||
"FILE_ALREADY_EXISTS": "Arquivo já existe",
|
||||
"Failed to publish workspace": "Falha ao publicar o workspace",
|
||||
"Favorite": "Favorito",
|
||||
"Favorite pages for easy access": "Favorite páginas para acesso fácil",
|
||||
"Favorited": "Favoritado",
|
||||
"Favorites": "Favoritos",
|
||||
"Filters": "Filtros",
|
||||
"Find 0 result": "Nenhum resultado foi encontrado",
|
||||
"Find results": "Foram encontrados {{number}} resultados",
|
||||
"Font Style": "Estilo de Fonte",
|
||||
"Force Sign Out": "Forçar Saída",
|
||||
"Full width Layout": "Layout de largura total",
|
||||
"General": "Geral",
|
||||
"Get in touch!": "Entre em contato!",
|
||||
"Get in touch! Join our communities": "Entre em contato! Junte-se às nossas comunidades.",
|
||||
"Get in touch! Join our communities.": "Entre em contato! Junte-se às nossas comunidades",
|
||||
"Go Back": "Voltar",
|
||||
"Go Forward": "Avançar",
|
||||
"Got it": "Entendi",
|
||||
"Group": "Grupo",
|
||||
"Group as Database": "Agrupe como Base de Dados",
|
||||
"Hand": "Mão",
|
||||
"Heading": "Cabeçalho {{number}}",
|
||||
"Help and Feedback": "Ajuda e Feedback",
|
||||
"How is AFFiNE Alpha different?": "Como AFFiNE Alpha é diferente?",
|
||||
"Image": "Imagem",
|
||||
"Import": "Importar",
|
||||
"Increase indent": "Aumentar recuo",
|
||||
"Info": "Informações",
|
||||
"Info of legal": "Informações Legais",
|
||||
"Inline code": "Código inline",
|
||||
"Invitation sent": "Convite enviado",
|
||||
"Invitation sent hint": "Os membros convidados foram notificados por e-mail para se juntarem a este Workspace.\n",
|
||||
"Invite": "Convidar",
|
||||
"Invite Members": "Convidar Membros",
|
||||
"Invite Members Message": "Os membros convidados colaborarão com você no Workspace atual",
|
||||
"Invite placeholder": "Pesquisar e-mail (Apenas para Gmail)",
|
||||
"It takes up little space on your device": "Ocupa pouco espaço no seu dispositivo.\n",
|
||||
"It takes up little space on your device.": "Ocupa pouco espaço no seu dispositivo.\n",
|
||||
"It takes up more space on your device": "Ocupa mais espaço no seu dispositivo.",
|
||||
"It takes up more space on your device.": "Ocupa mais espaço no seu dispositivo.",
|
||||
"Italic": "Itálico",
|
||||
"Joined Workspace": "Juntou-se ao Workspace",
|
||||
"Jump to": "Pular para",
|
||||
"Keyboard Shortcuts": "Atalhos do Teclado",
|
||||
"Leave": "Sair",
|
||||
"Leave Workspace": "Sair do Workspace.",
|
||||
"Leave Workspace Description": "Depois de você sair, você não conseguirá acessar os conteúdos deste Workspace.",
|
||||
"Leave Workspace hint": "Depois de você sair, você não terá como acessar o conteúdo dentro deste Workspace.",
|
||||
"Link": "Hyperlink (com o texto selecionado)",
|
||||
"Loading": "Carregando...",
|
||||
"Loading All Workspaces": "Carregando Todos os Workspaces",
|
||||
"Local": "Local",
|
||||
"Local Workspace": "Workspace Local",
|
||||
"Local Workspace Description": "Todos os dados são armazenados no dispositivo atual. Você pode ativar AFFiNE Cloud para este workspace para que mantenha os dados sincronizados com a nuvem.",
|
||||
"Markdown Syntax": "Sintaxe Markdown",
|
||||
"Member": "Membro",
|
||||
"Member has been removed": "{{name}} foi removido",
|
||||
"Members": "Membros",
|
||||
"Members hint": "Gerencie membros aqui, convide novos membros por email.",
|
||||
"Move Down": "Mover para baixo",
|
||||
"Move Up": "Mover para cima",
|
||||
"Move folder": "Mover pasta",
|
||||
"Move folder hint": "Selecione um novo local de armazenamento",
|
||||
"Move folder success": "Pasta movida com sucesso",
|
||||
"Move page to": "Mover página para...",
|
||||
"Move page to...": "Mover página para...",
|
||||
"Move to": "Mover para",
|
||||
"Move to Trash": "Mandar para Lixeira",
|
||||
"Moved to Trash": "Movido para a Lixeira",
|
||||
"My Workspaces": "Meus Workspaces",
|
||||
"Name Your Workspace": "Nomeie Seu Workspace",
|
||||
"New Keyword Page": "Nova página '{{query}}' ",
|
||||
"New Page": "Nova Página",
|
||||
"New Workspace": "Novo Workspace",
|
||||
"New version is ready": "Nova Versão está pronta",
|
||||
"No item": "Nenhum item",
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"Non-Gmail": "Apenas o Gmail é suportado momento. Demais e-mails não são.",
|
||||
"None yet": "Nenhum ainda",
|
||||
"Not now": "Agora não",
|
||||
"Note": "Nota",
|
||||
"Official Website": "Website Oficial",
|
||||
"Open Workspace Settings": "Abrir Configurações do Workspace",
|
||||
"Open folder": "Abrir pasta",
|
||||
"Open folder hint": "Confira onde a pasta está armazenada.",
|
||||
"Open in new tab": "Abrir em uma nova aba",
|
||||
"Organize pages to build knowledge": "Organize as páginas para construir conhecimento",
|
||||
@@ -219,25 +10,18 @@
|
||||
"Pen": "Caneta (em breve)",
|
||||
"Pending": "Pendente",
|
||||
"Permanently deleted": "Deletado permanentemente",
|
||||
"Placeholder of delete workspace": "Por favor digite o nome do Workspace para confirmar",
|
||||
"Please make sure you are online": "Por favor confirme se você está online",
|
||||
"Privacy": "Privacidade",
|
||||
"Publish": "Publicar",
|
||||
"Publish to web": "Publicar na Web",
|
||||
"Published Description": "O workspace atual foi publicado na web, todos podem visualizar o conteúdo deste workspace através do link.",
|
||||
"Published hint": "Os visitantes podem visualizar o conteúdo através do link fornecido.",
|
||||
"Published to Web": "Publicado na Web",
|
||||
"Publishing": "Publicar para a web requer o serviço AFFiNE Cloud.",
|
||||
"Publishing Description": "Após publicar para a web, qualquer pessoa poderá ver o conteúdo desta workspace através do link.",
|
||||
"Quick Search": "Pesquisa Rápida",
|
||||
"Quick search": "Pesquisa rápida",
|
||||
"Quick search placeholder": "Pesquisa rápida...",
|
||||
"Quick search placeholder2": "Pesquisar em {{workspace}}",
|
||||
"Recent": "Recente",
|
||||
"Redo": "Refazer",
|
||||
"Reduce indent": "Diminuir recuo",
|
||||
"Remove from favorites": "Remover dos Favoritos",
|
||||
"Remove from workspace": "Remover do workspace",
|
||||
"Remove special filter": "Remover filtro especial",
|
||||
"Removed from Favorites": "Removido dos Favoritos",
|
||||
"Rename": "Renomear",
|
||||
@@ -245,23 +29,17 @@
|
||||
"Restore it": "Restaurar",
|
||||
"Save": "Salvar",
|
||||
"Save As New Collection": "Salve como uma Nova Coleção",
|
||||
"Saved then enable AFFiNE Cloud": "Todas as modificações são salvas localmente, clique para habilitar AFFiNE Cloud.",
|
||||
"Select": "Selecionar",
|
||||
"Select All": "Selecione Todos",
|
||||
"Set a Workspace name": "Defina o nome do Workspace",
|
||||
"Set database location": "Definir localização da base de dados",
|
||||
"Set up an AFFiNE account to sync data": "Crie uma conta AFFiNE para sincronizar seus dados",
|
||||
"Settings": "Configurações",
|
||||
"Shape": "Forma",
|
||||
"Share Menu Public Workspace Description1": "Convide outros para integrar seu Workspace ou publique na internet.",
|
||||
"Share Menu Public Workspace Description2": "O Workspace atual foi publicado na internet como um Workspace público.",
|
||||
"Share with link": "Compartilhar com link",
|
||||
"Shared Pages": "Páginas Compartilhadas",
|
||||
"Shared Pages Description": "Compartilhar publicamente uma página requer o serviço AFFiNE Cloud.",
|
||||
"Shared Pages In Public Workspace Description": "Todo o Workspace está publicado na web e pode ser editado através das <1>Workspace Settings</1>.",
|
||||
"Shortcuts": "Atalhos",
|
||||
"Sidebar": "Barra Lateral",
|
||||
"Sign in": "Logar no AFFiNE Cloud",
|
||||
"Sign in and Enable": "Logar na conta e Habilitar",
|
||||
"Sign out": "Desconectar",
|
||||
"Sign out description": "Sair fará com que você perca todo o conteúdo que ainda não foi sincronizado.",
|
||||
@@ -273,14 +51,10 @@
|
||||
"Storage": "Armazenar",
|
||||
"Storage Folder": "Pasta de Armazenamento",
|
||||
"Storage and Export": "Armazenamento e Exportação",
|
||||
"Straight Connector": "Conector Reto",
|
||||
"Strikethrough": "Riscado",
|
||||
"Successfully deleted": "Apagado com Sucesso",
|
||||
"Successfully enabled AFFiNE Cloud": "Sucesso ao habilitar AFFiNE Cloud",
|
||||
"Switch": "Troque",
|
||||
"Sync": "Sincronizar",
|
||||
"Sync across devices with AFFiNE Cloud": "Sincronize entre dispositivos com AFFiNE Cloud",
|
||||
"Synced with AFFiNE Cloud": "Sincronizado com AFFiNE Cloud",
|
||||
"Tags": "Tags",
|
||||
"Terms of Use": "Termos de Uso",
|
||||
"Text": "Texto (em breve)",
|
||||
@@ -303,48 +77,30 @@
|
||||
"Upload": "Upload",
|
||||
"Users": "Usuários",
|
||||
"Version": "Versão",
|
||||
"Visit Workspace": "Visite o Workspace",
|
||||
"Workspace Avatar": "Avatar do Workspace",
|
||||
"Workspace Icon": "Ícone do Workspace",
|
||||
"Workspace Name": "Nome do Workspace",
|
||||
"Workspace Not Found": "Workspace Não Encontrado",
|
||||
"Workspace Owner": "Dono do Workspace",
|
||||
"Workspace Profile": "Perfil do Workspace",
|
||||
"Workspace Settings": "Configurações do Workspace",
|
||||
"Workspace Settings with name": "Configurações de {{name}}",
|
||||
"Workspace Type": "Tipo de Workspace",
|
||||
"Workspace database storage description": "Selecione onde você deseja criar seu workspace. Os dados do Workspace são salvos localmente por padrão.",
|
||||
"Workspace description": "O workspace é o seu espaço virtual para capturar, criar e planejar individualmente ou colaborando com sua equipe.",
|
||||
"Workspace saved locally": "{{name}} é salvo localmente",
|
||||
"You cannot delete the last workspace": "Você não pode excluir o último workspace",
|
||||
"Zoom in": "Mais Zoom",
|
||||
"Zoom out": "Reduzir o zoom",
|
||||
"Zoom to 100%": "Zoom para 100%",
|
||||
"all": "todos",
|
||||
"com.affine.auth.change.email.page.subtitle": "Por favor digite seu novo endereço de email abaixo. Enviaremos um link de verificação para este email para completar o processo.",
|
||||
"com.affine.auth.change.email.page.success.subtitle": "Parabéns! Você atualizou com sucesso seu email associado com a sua conta AFFiNE Cloud.",
|
||||
"com.affine.auth.change.email.page.success.title": "Endereço de email atualizado!",
|
||||
"com.affine.auth.change.email.page.title": "Mudar endereço de email",
|
||||
"com.affine.auth.create.count": "Criar Conta",
|
||||
"com.affine.auth.forget": "Esqueceu sua senha",
|
||||
"com.affine.auth.has.signed": "você entrou!",
|
||||
"com.affine.auth.has.signed.message": "Você está conectado, começe a sincronizar seus dados com AFFiNE Cloud!",
|
||||
"com.affine.auth.later": "Depois",
|
||||
"com.affine.auth.open.affine": "Abrir AFFiNE",
|
||||
"com.affine.auth.page.sent.email.title": "Bem-vindo ao AFFiNE Cloud, você está quase lá!",
|
||||
"com.affine.auth.password": "Senha",
|
||||
"com.affine.auth.password.error": "Senha incorreta",
|
||||
"com.affine.auth.reset.password": "Redefinir Senha",
|
||||
"com.affine.auth.reset.password.message": "Você receberá um email com um link para redefinir sua senha. Por favor verifique sua caixa de entrada.",
|
||||
"com.affine.auth.reset.password.page.title": "Redefina sua senha da AFFiNE Cloud",
|
||||
"com.affine.auth.send.verify.email.hint": "Envie um link de verificação",
|
||||
"com.affine.auth.send.change.email.link": "Envie um link de verificação",
|
||||
"com.affine.auth.send.reset.password.link": "Enviar link de redefinição",
|
||||
"com.affine.auth.send.set.password.link": "Enviar link de definição",
|
||||
"com.affine.auth.sent": "Enviado",
|
||||
"com.affine.auth.sent.verify.email.hint": "Link de verificação foi enviado.",
|
||||
"com.affine.auth.sent.change.email.hint": "Link de verificação foi enviado.",
|
||||
"com.affine.auth.sent.change.password.hint": "Link de redefinição de senha foi enviado.",
|
||||
"com.affine.auth.set.email.save": "Salvar Email",
|
||||
"com.affine.auth.set.password.page.title": "Defina sua senha para AFFiNE Cloud",
|
||||
"com.affine.auth.set.password.placeholder.confirm": "Confirmar senha",
|
||||
"com.affine.auth.set.password.save": "Salvar Senha",
|
||||
"com.affine.auth.sign.auth.code.error.hint": "Código errado, por favor tente novamente",
|
||||
@@ -356,8 +112,6 @@
|
||||
"com.affine.auth.sign.email.placeholder": "Digite seu endereço de email",
|
||||
"com.affine.auth.sign.in": "Entrar",
|
||||
"com.affine.auth.sign.in.sent.email.subtitle": "Confirme seu email",
|
||||
"com.affine.auth.sign.no.access.hint": "AFFiNE Cloud está em acesso antecipado. Clique neste link para aprender mais sobre os benefícions de virar um Apoiador de Acesso Antecipado do AFFiNE Cloud:",
|
||||
"com.affine.auth.sign.no.access.link": "Acesso antecipado à AFFiNE Cloud",
|
||||
"com.affine.auth.sign.no.access.wait": "Aguarde o lançamento público",
|
||||
"com.affine.auth.sign.policy": "Políticas de Privacidade",
|
||||
"com.affine.auth.sign.sent.email.message.end": "Você pode acessar o link e criar uma conta automaticamente.",
|
||||
@@ -367,10 +121,6 @@
|
||||
"com.affine.auth.signed.success.subtitle": "Você fez login com sucesso. O aplicativo será aberto automaticamente ou redirecionado para a versão web. se encontrar algum problema, você também pode clicar no botão abaixo para abrir manualmente o aplicativo AFFiNE.",
|
||||
"com.affine.auth.signed.success.title": "Você está quase lá!",
|
||||
"com.affine.auth.toast.message.failed": "Erro no servidor, tente novamente mais tarde.",
|
||||
"com.affine.auth.toast.message.signed-in": "Você está conectado, começe a sincronizar seus dados com AFFiNE Cloud!",
|
||||
"com.affine.brand.affineCloud": "AFFiNE Cloud",
|
||||
"com.affine.cloudTempDisable.title": "AFFiNE Cloud está atualizando agora.",
|
||||
"com.affine.cmdk.affine.import-workspace": "Importar Workspace",
|
||||
"com.affine.collection-bar.action.tooltip.delete": "Apagar",
|
||||
"com.affine.collection-bar.action.tooltip.edit": "Editar",
|
||||
"com.affine.collection-bar.action.tooltip.pin": "Fixar na barra lateral",
|
||||
@@ -392,11 +142,6 @@
|
||||
"com.affine.header.option.add-tag": "Adicione Tag",
|
||||
"com.affine.header.option.duplicate": "Duplique",
|
||||
"com.affine.helpIsland.gettingStarted": "Começando",
|
||||
"com.affine.keyboardShortcuts.curveConnector": "Conector Curvo",
|
||||
"com.affine.keyboardShortcuts.elbowedConnector": "Conector Angular",
|
||||
"com.affine.keyboardShortcuts.increaseIndent": "Aumentar recuo",
|
||||
"com.affine.keyboardShortcuts.reduceIndent": "Diminuir recuo",
|
||||
"com.affine.keyboardShortcuts.straightConnector": "Conector Reto",
|
||||
"com.affine.last30Days": "Últimos 30 dias",
|
||||
"com.affine.last7Days": "Últimos 7 dias",
|
||||
"com.affine.lastMonth": "Mês passado",
|
||||
@@ -404,14 +149,10 @@
|
||||
"com.affine.lastYear": "Ano passado",
|
||||
"com.affine.loading": "Carregando...",
|
||||
"com.affine.new_import": "Importar",
|
||||
"com.affine.notFoundPage.backButton": "Voltar para Início",
|
||||
"com.affine.pageMode": "Modo de página",
|
||||
"com.affine.payment.modal.downgrade.caption": "Você ainda pode usar o AFFiNE Cloud Pro até o final deste período de faturamento :)",
|
||||
"com.affine.payment.modal.downgrade.confirm": "Manter AFFiNE Cloud Pro",
|
||||
"com.affine.setting.account": "Configurações de Conta",
|
||||
"com.affine.setting.account.delete": "Apagar Conta",
|
||||
"com.affine.setting.account.message": "Sua informação pessoal",
|
||||
"com.affine.setting.sign.message": "Sincronize com AFFiNE Cloud",
|
||||
"com.affine.setting.sign.out.message": "Saia da sua conta com segurança.",
|
||||
"com.affine.settings.about.message": "Informações sobre AFFiNE",
|
||||
"com.affine.settings.about.update.check.message": "Verifique automaticamente se há novas atualizações periodicamente.",
|
||||
@@ -422,7 +163,7 @@
|
||||
"com.affine.settings.auto-check-description": "Se ativado, ele verificará automaticamente novas versões em intervalos regulares.",
|
||||
"com.affine.settings.auto-download-description": "Se ativado, novas versões serão baixadas automaticamente para o dispositivo atual.",
|
||||
"com.affine.settings.email": "Email",
|
||||
"com.affine.settings.email.action.change": "Mudar Email",
|
||||
"com.affine.settings.email.action": "Mudar Email",
|
||||
"com.affine.settings.password": "Senha",
|
||||
"com.affine.settings.password.action.change": "Mudar senha",
|
||||
"com.affine.settings.profile": "Meu Perfil",
|
||||
@@ -431,20 +172,13 @@
|
||||
"com.affine.settings.remove-workspace": "Remover Área de Trabalho",
|
||||
"com.affine.settings.sign": "Entrar / Cadastrar",
|
||||
"com.affine.settings.suggestion": "Precisa de mais opções de customização? Nos avise na comunidade.",
|
||||
"com.affine.settings.workspace": "Workspace",
|
||||
"com.affine.settings.workspace.description": "Você pode visualizar a informação do seu workspace aqui.",
|
||||
"com.affine.settings.workspace.not-owner": "Apenas o dono pode editar um avatar ou nome do Workspace.Mudanças serão mostradas para todo mundo.",
|
||||
"com.affine.settings.workspace.publish-tooltip": "Habilite o AFFiNE Cloud para publicar esta Workspace",
|
||||
"com.affine.today": "Hoje",
|
||||
"com.affine.updater.downloading": "Baixando",
|
||||
"com.affine.updater.update-available": "Atualização disponível",
|
||||
"com.affine.workspace.cannot-delete": "Você não pode apagar o último workspace",
|
||||
"com.affine.workspace.cloud.account.logout": "Sair",
|
||||
"com.affine.workspace.cloud.account.settings": "Configurações de Conta",
|
||||
"com.affine.workspace.cloud.auth": "Cadastrar/ Entrar",
|
||||
"com.affine.workspace.cloud.join": "Juntar-se ao Workspace",
|
||||
"com.affine.workspace.cloud.sync": "Sincronizar nuvem",
|
||||
"com.affine.workspace.local.import": "Importar Workspace",
|
||||
"com.affine.yesterday": "Ontem",
|
||||
"core": "core",
|
||||
"dark": "Escuro",
|
||||
@@ -452,8 +186,6 @@
|
||||
"emptyFavorite": "Clique Adicionar para Favoritos e a página irá aparecer aqui.",
|
||||
"emptySharedPages": "As páginas compartilhadas aparecerão aqui.",
|
||||
"emptyTrash": "Clique Adicionar para Lixeira e a página irá aparecer aqui.",
|
||||
"is a Cloud Workspace": "é um Workspace na Nuvem",
|
||||
"is a Local Workspace": "é um Workspace Local",
|
||||
"light": "Claro",
|
||||
"login success": "Login feito com sucesso",
|
||||
"mobile device": "Parece que você está acessando de um smartphone.",
|
||||
|
||||
@@ -1,223 +1,56 @@
|
||||
{
|
||||
"404 - Page Not Found": "404 - Страница не найдена",
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404.hint": "Извините, у вас нет доступа или этого материала не существует...",
|
||||
"404.signOut": "Войдите в другой аккаунт",
|
||||
"AFFiNE Cloud": "AFFiNE Cloud",
|
||||
"AFFiNE Community": "Сообщество AFFiNE",
|
||||
"About AFFiNE": "Об AFFiNE",
|
||||
"Access level": "Уровень доступа",
|
||||
"Actions": "Действия",
|
||||
"Add Filter": "Добавить фильтр",
|
||||
"Add Workspace": "Добавить пространство",
|
||||
"Add Workspace Hint": "Выберите файл существующей базы данных",
|
||||
"Add a subpage inside": "Добавить подстраницу внутри",
|
||||
"Add to Favorites": "В Избранное",
|
||||
"Add to favorites": "В Избранное",
|
||||
"Added Successfully": "Успешно добавлено",
|
||||
"Added to Favorites": "Добавлено в Избранное",
|
||||
"All changes are saved locally": "Все изменения сохраняются локально",
|
||||
"All data has been stored in the cloud": "Все данные хранятся в облаке.",
|
||||
"All pages": "Все страницы",
|
||||
"App Version": "Версия приложения",
|
||||
"Appearance Settings": "Настройки оформления",
|
||||
"Append to Daily Note": "Добавить в ежедневник",
|
||||
"Available Offline": "Доступно оффлайн",
|
||||
"Back Home": "Вернуться на Главную",
|
||||
"Back to Quick Search": "Назад к Быстрому поиску",
|
||||
"Body text": "Основной текст",
|
||||
"Bold": "Жирный",
|
||||
"Cancel": "Отменить",
|
||||
"Change avatar hint": "Новый аватар будет отображаться для всех пользователей.",
|
||||
"Change workspace name hint": "Новое имя будет отображаться для всех пользователей.",
|
||||
"Changelog description": "Просмотреть журнал изменений AFFiNE.",
|
||||
"Check Keyboard Shortcuts quickly": "Быстрая проверка горячих клавиш",
|
||||
"Check Our Docs": "Проверьте нашу документацию",
|
||||
"Check for updates": "Проверить обновления",
|
||||
"Check for updates automatically": "Проверять обновления автоматически",
|
||||
"Choose your font style": "Выберите стиль шрифта",
|
||||
"Cloud Workspace": "Облачное рабочее пространство",
|
||||
"Cloud Workspace Description": "Все данные будут синхронизированы и сохранены в AFFiNE аккаунт <1>{{email}}</1>",
|
||||
"Code block": "Блок кода",
|
||||
"Collaboration": "Совместная работа",
|
||||
"Collaboration Description": "Для совместной работы с другими участниками требуется сервис AFFiNE Cloud.",
|
||||
"Collapse sidebar": "Свернуть боковую панель",
|
||||
"Collections": "Коллекции",
|
||||
"Communities": "Сообщества",
|
||||
"Confirm": "Подтвердить",
|
||||
"Connector": "Коннектор (скоро)",
|
||||
"Contact Us": "Связаться с нами",
|
||||
"Contact with us": "Связаться с нами",
|
||||
"Continue": "Продолжить",
|
||||
"Continue with Google": "Войти через Google",
|
||||
"Convert to ": "Конвертировать в ",
|
||||
"Copied link to clipboard": "Ссылка скопирована в буфер обмена",
|
||||
"Copy": "Копировать",
|
||||
"Copy Link": "Копировать ссылку",
|
||||
"Create": "Создать",
|
||||
"Create Or Import": "Создать или Импортировать",
|
||||
"Create Shared Link Description": "Создайте ссылку, которой можно легко поделиться с кем угодно.",
|
||||
"Create a collection": "Создать коллекцию",
|
||||
"Create your own workspace": "Создать свое пространство",
|
||||
"Created": "Создано",
|
||||
"Created Successfully": "Успешно создано",
|
||||
"Curve Connector": "Изогнутый коннектор",
|
||||
"Customize": "Настроить",
|
||||
"Customize your AFFiNE Appearance": "Настройте внешний вид AFFiNE",
|
||||
"DB_FILE_ALREADY_LOADED": "Файл базы данных уже загружен",
|
||||
"DB_FILE_INVALID": "Неверный файл базы данных",
|
||||
"DB_FILE_MIGRATION_FAILED": "Не удалось выполнить перенос файлов базы данных",
|
||||
"DB_FILE_PATH_INVALID": "Неверный путь к файлу базы данных",
|
||||
"Data sync mode": "Режим синхронизации данных",
|
||||
"Date": "Дата",
|
||||
"Date Format": "Формат даты",
|
||||
"Default Location": "Расположение по умолчанию",
|
||||
"Default db location hint": "По умолчанию сохраняется в {{location}}.",
|
||||
"Delete": "Удалить",
|
||||
"Delete Member?": "Удалить участника?",
|
||||
"Delete Workspace": "Удалить пространство",
|
||||
"Delete Workspace Description": "Удаление <1>{{workspace}}</1> нельзя отменить, пожалуйста, действуйте с осторожностью. Все содержимое будет потеряно.",
|
||||
"Delete Workspace Description2": "Удаление <1>{{workspace}}</1> приведет к удалению как локальных, так и облачных данных, эта операция не может быть отменена, пожалуйста действуйте с осторожностью.",
|
||||
"Delete Workspace Label Hint": "После удаления этого рабочего пространства вы навсегда удалите все его содержимое для всех. Никто не сможет восстановить содержимое этого рабочего пространства.",
|
||||
"Delete Workspace placeholder": "Пожалуйста, введите \"Delete\" для подтверждения",
|
||||
"Delete page?": "Удалить страницу?",
|
||||
"Delete permanently": "Удалить навсегда",
|
||||
"Disable": "Отключить",
|
||||
"Disable Public Link": "Отключить публичную ссылку",
|
||||
"Disable Public Link ?": "Отключить публичную ссылку ?",
|
||||
"Disable Public Link Description": "При отключении этой публичной ссылки доступ к этой странице будет закрыт для всех.",
|
||||
"Disable Public Sharing": "Отключить общий доступ",
|
||||
"Discover what's new": "Узнайте, что нового",
|
||||
"Discover what's new!": "Узнайте, что нового!",
|
||||
"Display Language": "Язык интерфейса",
|
||||
"Divider": "Разделитель",
|
||||
"Download all data": "Скачать все данные",
|
||||
"Download core data": "Скачать основные данные",
|
||||
"Download data": "Скачать {{CoreOrAll}} данные",
|
||||
"Download data Description1": "Это занимает больше места на вашем устройстве.",
|
||||
"Download data Description2": "Это занимает мало места на вашем устройстве.",
|
||||
"Download updates automatically": "Загружать обновления автоматически",
|
||||
"Edgeless": "Без рамок",
|
||||
"Edit": "Редактировать",
|
||||
"Edit Filter": "Изменить фильтр",
|
||||
"Editor Version": "Версия редактора",
|
||||
"Elbowed Connector": "Угловой коннектор",
|
||||
"Enable": "Включить",
|
||||
"Enable AFFiNE Cloud": "Включить AFFiNE Cloud",
|
||||
"Enable AFFiNE Cloud Description": "Если этот параметр включен, данные в этом рабочем пространстве будут скопированы и синхронизированы с помощью AFFiNE Cloud.",
|
||||
"Enable cloud hint": "Данные функции работают на базе AFFiNE Cloud. Все данные хранятся на данном устройстве. Для синхронизации данных с облаком вы можете включить AFFiNE Cloud для этого рабочего пространства.",
|
||||
"Enabled success": "Успешно",
|
||||
"Exclude from filter": "Убрать из фильтра",
|
||||
"Expand sidebar": "Развернуть боковую панель",
|
||||
"Expand/Collapse Sidebar": "Развернуть/Свернуть Боковую панель",
|
||||
"Export": "Экспорт",
|
||||
"Export AFFiNE backup file": "Экспорт файла резервной копии AFFiNE",
|
||||
"Export Description": "Вы можете экспортировать все данные рабочего пространства, потом эти данные можно повторно импортировать.",
|
||||
"Export Workspace": "Экспорт рабочего пространства <1>{{workspace}}</1> скоро будет доступен",
|
||||
"Export success": "Экспорт прошел успешно",
|
||||
"Export to HTML": "Экспортировать в HTML",
|
||||
"Export to Markdown": "Экспортировать в Markdown",
|
||||
"Export to PDF": "Экспортировать в PDF",
|
||||
"Export to PNG": "Экспортировать в PNG",
|
||||
"FILE_ALREADY_EXISTS": "Файл уже существует",
|
||||
"Failed to publish workspace": "Не удалось опубликовать рабочее пространство",
|
||||
"Favorite": "В Избранное",
|
||||
"Favorite pages for easy access": "Избранные страницы для быстрого доступа",
|
||||
"Favorited": "В Избранном",
|
||||
"Favorites": "Избранное",
|
||||
"Filters": "Фильтры",
|
||||
"Find 0 result": "Найдено 0 результатов",
|
||||
"Find results": "Найдено {{number}} результатов",
|
||||
"Font Style": "Стиль шрифта",
|
||||
"Force Sign Out": "Принудительный выход",
|
||||
"Full width Layout": "Во всю ширину",
|
||||
"General": "Общие",
|
||||
"Get in touch!": "Связаться!",
|
||||
"Get in touch! Join our communities": "Свяжитесь с нами! Присоединяйтесь к нашим сообществам.",
|
||||
"Get in touch! Join our communities.": "Свяжитесь с нами! Присоединяйтесь к нашим сообществам.",
|
||||
"Go Back": "Назад",
|
||||
"Go Forward": "Вперед",
|
||||
"Got it": "Понятно",
|
||||
"Group": "Группировать",
|
||||
"Group as Database": "Сгруппировать в базу данных",
|
||||
"Hand": "Рука",
|
||||
"Heading": "Заголовок {{number}}",
|
||||
"Help and Feedback": "Помощь и обратная связь",
|
||||
"How is AFFiNE Alpha different?": "Чем отличается AFFiNE Alpha?",
|
||||
"Image": "Изображение",
|
||||
"Import": "Импортировать",
|
||||
"Increase indent": "Увеличить отступ",
|
||||
"Info": "Информация",
|
||||
"Info of legal": "Юридическая информация",
|
||||
"Inline code": "Встроенный код",
|
||||
"Invite": "Пригласить",
|
||||
"Invite Members": "Пригласить участников",
|
||||
"Invite placeholder": "Поиск почты (поддерживается только Gmail)",
|
||||
"It takes up little space on your device": "Занимает мало места на вашем устройстве.",
|
||||
"It takes up little space on your device.": "Занимает мало места на вашем устройстве.",
|
||||
"It takes up more space on your device": "Занимает много места на вашем устройстве.",
|
||||
"It takes up more space on your device.": "Занимает много места на вашем устройстве.",
|
||||
"Italic": "Курсив",
|
||||
"Joined Workspace": "Присоединенное рабочее пространство",
|
||||
"Jump to": "Перейти к",
|
||||
"Keyboard Shortcuts": "Горячие Клавиши",
|
||||
"Leave": "Выйти",
|
||||
"Leave Workspace": "Выйти из рабочего пространства",
|
||||
"Leave Workspace Description": "После выхода вы больше не сможете получить доступ к содержимому этого рабочего пространства.",
|
||||
"Link": "Гиперссылка (с выделенным текстом)",
|
||||
"Loading": "Загрузка...",
|
||||
"Loading All Workspaces": "Загрузка всех пространств",
|
||||
"Local Workspace": "Локальное рабочее пространство",
|
||||
"Local Workspace Description": "Все данные хранятся на текущем устройстве. Для синхронизации данных с облаком вы можете включить AFFiNE Cloud для этого рабочего пространства.",
|
||||
"Markdown Syntax": "Markdown Синтаксис",
|
||||
"Member": "Участник",
|
||||
"Member has been removed": "{{name}} был удален",
|
||||
"Members": "Участники",
|
||||
"Members hint": "Здесь можно управлять участниками, приглашать новых участников по электронной почте.",
|
||||
"Move Down": "Переместить вниз",
|
||||
"Move Up": "Переместить вверх",
|
||||
"Move folder": "Переместить папку",
|
||||
"Move folder hint": "Выберите новое место хранения.",
|
||||
"Move folder success": "Перемещение папки успешно",
|
||||
"Move page to": "Переместить страницу в...",
|
||||
"Move page to...": "Переместить страницу в...",
|
||||
"Move to": "Переместить в",
|
||||
"Move to Trash": "В Корзину",
|
||||
"Moved to Trash": "Перемещено в корзину",
|
||||
"My Workspaces": "Мои рабочие пространства",
|
||||
"Name Your Workspace": "Назовите ваше пространство",
|
||||
"Navigation Path": "Путь",
|
||||
"New Keyword Page": "Новая '{{query}}' страница",
|
||||
"New Page": "Новая страница",
|
||||
"New Workspace": "Новое рабочее пространство",
|
||||
"New version is ready": "Доступна новая версия",
|
||||
"No item": "Нет элементов",
|
||||
"Non-Gmail": "Поддерживается только Gmail",
|
||||
"Not now": "Не сейчас",
|
||||
"Note": "Заметка",
|
||||
"Official Website": "Официальный Сайт",
|
||||
"Open Workspace Settings": "Открыть Настройки Пространства",
|
||||
"Open folder": "Открыть папку",
|
||||
"Open folder hint": "Проверить, где находится папка хранения.",
|
||||
"Open in new tab": "Открыть в новой вкладке",
|
||||
"Owner": "Владелец",
|
||||
"Page": "Страница",
|
||||
"Paper": "Лист",
|
||||
"Pen": "Ручка (скоро)",
|
||||
"Pending": "В ожидании",
|
||||
"Permanently deleted": "Удалено навсегда",
|
||||
"Placeholder of delete workspace": "Для подтверждения введите имя рабочего пространства",
|
||||
"Please make sure you are online": "Пожалуйста, убедитесь, что вы онлайн",
|
||||
"Privacy": "Конфиденциальность",
|
||||
"Publish": "Публикация",
|
||||
"Publish to web": "Опубликовать в Интернете",
|
||||
"Published Description": "Текущее рабочее пространство было опубликовано в Интернете. Любой может просматривать содержимое по ссылке. ",
|
||||
"Published hint": "Пользователи могут просмотреть содержимое по указанной ссылке.",
|
||||
"Published to Web": "Опубликовано в Интернете",
|
||||
"Publishing": "Для публикации в интернете требуется сервис AFFiNE Cloud",
|
||||
"Publishing Description": "После публикации в Интернете любой сможет просматривать содержимое этого рабочего пространства по ссылке.",
|
||||
"Quick Search": "Быстрый поиск",
|
||||
"Quick search": "Быстрый поиск",
|
||||
"Quick search placeholder": "Быстрый поиск...",
|
||||
"Quick search placeholder2": "Поиск в {{workspace}}",
|
||||
"Recent": "Недавнее",
|
||||
"Redo": "Повторно выполнить",
|
||||
@@ -225,81 +58,54 @@
|
||||
"Remove from favorites": "Удалить из Избранного",
|
||||
"Remove from workspace": "Удалить из рабочего пространства",
|
||||
"Remove special filter": "Удалить спец. фильтр",
|
||||
"Removed from Favorites": "Удалено из Избранного",
|
||||
"Rename": "Переименовать",
|
||||
"Restart Install Client Update": "Перезапустить для установки обновления",
|
||||
"Restore it": "Восстановить",
|
||||
"Retain cached cloud data": "Сохраняйте кэшированные облачные данные",
|
||||
"Retain local cached data": "Сохранять локальные кэшированные данные",
|
||||
"Save": "Сохранить",
|
||||
"Save As New Collection": "Сохранить как Новую Коллекцию",
|
||||
"Saved then enable AFFiNE Cloud": "Все изменения сохраняются локально, нажмите чтобы включить AFFiNE Cloud.",
|
||||
"Select": "Выбор",
|
||||
"Select All": "Выбрать все",
|
||||
"Set a Workspace name": "Задайте имя рабочего пространства",
|
||||
"Set database location": "Задайте расположение базы данных",
|
||||
"Set up an AFFiNE account to sync data": "Настройте учетную запись AFFiNE для синхронизации данных",
|
||||
"Settings": "Настройки",
|
||||
"Shape": "Фигура",
|
||||
"Share with link": "Поделиться ссылкой",
|
||||
"Shared Pages": "Общие страницы",
|
||||
"Shared Pages Description": "Чтобы предоставить публичный доступ к странице, требуется AFFiNE Cloud.",
|
||||
"Shortcuts": "Ярлыки",
|
||||
"Sidebar": "Боковая панель",
|
||||
"Sign in": "Войти в AFFiNE Cloud",
|
||||
"Sign in and Enable": "Войти и Включить",
|
||||
"Sign out": "Выйти из AFFiNE Cloud",
|
||||
"Sign out description": "Выход приведет к потере несинхронизированного контента.",
|
||||
"Skip": "Пропустить",
|
||||
"Start Week On Monday": "Начать неделю с понедельника",
|
||||
"Stay logged out": "Не выходить из системы",
|
||||
"Sticky": "Стикер (скоро)",
|
||||
"Stop publishing": "Остановить публикацию",
|
||||
"Storage": "Хранилище",
|
||||
"Storage Folder": "Папка для хранения",
|
||||
"Storage and Export": "Хранение и экспорт",
|
||||
"Straight Connector": "Прямой коннектор",
|
||||
"Strikethrough": "Перечеркнутый",
|
||||
"Successfully deleted": "Успешно удалено",
|
||||
"Switch": "Переключить",
|
||||
"Sync": "Синхронизация",
|
||||
"Sync across devices with AFFiNE Cloud": "Синхронизируйте устройства с помощью AFFiNE Cloud",
|
||||
"Synced with AFFiNE Cloud": "Синхронизировано с AFFiNE Cloud",
|
||||
"Tags": "Теги",
|
||||
"Terms of Use": "Правила пользования",
|
||||
"Text": "Текст",
|
||||
"Theme": "Тема",
|
||||
"Title": "Название",
|
||||
"Trash": "Корзина",
|
||||
"TrashButtonGroupDescription": "После удаления вы не сможете отменить это действие. Уверены?",
|
||||
"TrashButtonGroupTitle": "Удалить навсегда",
|
||||
"UNKNOWN_ERROR": "Неизвестная ошибка",
|
||||
"Underline": "Подчеркнутый",
|
||||
"Undo": "Отменить",
|
||||
"Ungroup": "Разгруппировать",
|
||||
"Unpin": "Открепить",
|
||||
"Unpublished hint": "После размещения в сети, пользователи могут просмотреть содержимое по указанной ссылке.",
|
||||
"Untitled": "Без названия",
|
||||
"Untitled Collection": "Без названия",
|
||||
"Update Available": "Доступно обновление",
|
||||
"Update Collection": "Обновить Коллекцию",
|
||||
"Update workspace name success": "Успешное обновление имени рабочего пространства",
|
||||
"Updated": "Обновлено",
|
||||
"Upload": "Загрузить",
|
||||
"Use on current device only": "Использовать только на текущем устройстве",
|
||||
"Users": "Пользователи",
|
||||
"Version": "Версия",
|
||||
"View Navigation Path": "Просмотреть путь",
|
||||
"Wait for Sync": "Дождитесь синхронизации",
|
||||
"Workspace Avatar": "Аватар рабочего пространства",
|
||||
"Workspace Icon": "Иконка рабочего пространства",
|
||||
"Workspace Name": "Имя рабочего пространства",
|
||||
"Workspace Owner": "Владелец рабочего пространства",
|
||||
"Workspace Settings": "Настройки рабочего пространства",
|
||||
"Workspace Settings with name": "Настройки {{name}}",
|
||||
"Workspace Type": "Тип рабочего пространства",
|
||||
"Workspace description": "Рабочее пространство - это ваше виртуальное пространство для фиксации, создания и планирования в одиночку или в команде. ",
|
||||
"Workspace saved locally": "{{name}} хранится локально",
|
||||
"You cannot delete the last workspace": "Невозможно удалить последнее пространство",
|
||||
"Zoom in": "Увеличить",
|
||||
"Zoom out": "Уменьшить",
|
||||
@@ -316,22 +122,18 @@
|
||||
"com.affine.auth.password": "Пароль",
|
||||
"com.affine.auth.password.error": "Неверный пароль",
|
||||
"com.affine.auth.reset.password": "Восстановить пароль",
|
||||
"com.affine.auth.reset.password.message": "Вы получите письмо со ссылкой для восстановления пароля. Пожалуйста, проверьте свой почтовый ящик.",
|
||||
"com.affine.auth.reset.password.page.title": "Восстановить пароль AFFiNE Cloud",
|
||||
"com.affine.auth.send.verify.email.hint": "Отправить ссылку для подтверждения",
|
||||
"com.affine.auth.send.change.email.link": "Отправить ссылку для подтверждения",
|
||||
"com.affine.auth.send.reset.password.link": "Отправить ссылку для восстановления",
|
||||
"com.affine.auth.sent": "Отправлено",
|
||||
"com.affine.auth.sent.verify.email.hint": "Ссылка для подтверждения отправлена.",
|
||||
"com.affine.auth.sent.change.email.hint": "Ссылка для подтверждения отправлена.",
|
||||
"com.affine.auth.sent.change.password.hint": "Ссылка для восстановления пароля отправлена.",
|
||||
"com.affine.auth.sent.set.password.hint": "Ссылка для установки пароля отправлена.",
|
||||
"com.affine.auth.set.email.save": "Сохранить электронную почту",
|
||||
"com.affine.auth.set.password": "Задать пароль",
|
||||
"com.affine.auth.set.password.message": "Для продолжения регистрации задайте пароль из 8-20 символов с буквами и цифрами",
|
||||
"com.affine.auth.set.password.page.success": "Пароль задан успешно",
|
||||
"com.affine.auth.set.password.placeholder.confirm": "Подтвердить пароль",
|
||||
"com.affine.auth.set.password.save": "Сохранить пароль",
|
||||
"com.affine.auth.sign.auth.code.error.hint": "Неправильный код, попробуйте еще раз",
|
||||
"com.affine.auth.sign.auth.code.message": "Если вы не получили письмо, проверьте папку \"Спам\".",
|
||||
"com.affine.auth.sign.auth.code.on.resend.hint": "Отправить код повторно",
|
||||
"com.affine.auth.sign.auth.code.resend.hint": "Отправить код повторно",
|
||||
"com.affine.auth.sign.condition": "Условия",
|
||||
@@ -354,22 +156,14 @@
|
||||
"com.affine.collection-bar.action.tooltip.edit": "Редактировать",
|
||||
"com.affine.collection-bar.action.tooltip.pin": "Закрепить на боковой панели",
|
||||
"com.affine.collection-bar.action.tooltip.unpin": "Открепить",
|
||||
"com.affine.collection.menu.rename": "Переименовать",
|
||||
"com.affine.currentYear": "Текущий год",
|
||||
"com.affine.draw_with_a_blank_whiteboard": "Рисуйте на пустой доске",
|
||||
"com.affine.earlier": "Ранее",
|
||||
"com.affine.edgelessMode": "Безрамочный режим",
|
||||
"com.affine.editCollection.renameCollection": "Переименовать коллекцию",
|
||||
"com.affine.editCollectionName.name": "Имя",
|
||||
"com.affine.editCollectionName.name.placeholder": "Имя коллекции",
|
||||
"com.affine.emptyDesc": "Здесь пока нет страниц",
|
||||
"com.affine.expired.page.subtitle": "Пожалуйста, запросите новую ссылку для восстановления пароля.",
|
||||
"com.affine.expired.page.title": "Срок действия этой ссылки истек...",
|
||||
"com.affine.export.error.message": "Пожалуйста, повторите попытку позже.",
|
||||
"com.affine.export.error.title": "Экспорт не удался из-за непредвиденной ошибки",
|
||||
"com.affine.export.success.message": "Пожалуйста, проверьте папку загрузки.",
|
||||
"com.affine.export.success.title": "Экспорт прошел успешно",
|
||||
"com.affine.filter": "Фильтр",
|
||||
"com.affine.filter.after": "после",
|
||||
"com.affine.filter.before": "до",
|
||||
"com.affine.filter.contains all": "содержит все",
|
||||
@@ -385,54 +179,27 @@
|
||||
"com.affine.header.option.duplicate": "Дублировать",
|
||||
"com.affine.helpIsland.gettingStarted": "Начало работы",
|
||||
"com.affine.import_file": "Поддержка Markdown/Notion",
|
||||
"com.affine.last30Days": "Последние 30 дней",
|
||||
"com.affine.last7Days": "Последние 7 дней",
|
||||
"com.affine.lastMonth": "Последний месяц",
|
||||
"com.affine.lastWeek": "Прошлая неделя",
|
||||
"com.affine.lastYear": "Прошлый год",
|
||||
"com.affine.nameWorkspace.button.cancel": "Отменить",
|
||||
"com.affine.nameWorkspace.button.create": "Создать",
|
||||
"com.affine.nameWorkspace.title": "Назовите ваше пространство",
|
||||
"com.affine.new_edgeless": "Новый безрамочный",
|
||||
"com.affine.new_import": "Импортировать",
|
||||
"com.affine.onboarding.title2": "Интуитивное и надежное редактирование на основе блоков",
|
||||
"com.affine.pageMode": "Режим страницы",
|
||||
"com.affine.payment.plans-error-tip": "Невозможно загрузить тарифные планы, проверьте свое подключение к сети.",
|
||||
"com.affine.payment.upgrade-success-page.support": "Если у Вас возникли вопросы, обращайтесь в нашу <1> службу поддержки клиентов</1>.",
|
||||
"com.affine.setting.account": "Настройки учетной записи",
|
||||
"com.affine.setting.account.delete": "Удалить аккаунт",
|
||||
"com.affine.setting.account.message": "Ваша персональная информация",
|
||||
"com.affine.settings.about.message": "Информация об AFFiNE",
|
||||
"com.affine.settings.about.update.download.message": "Загружать обновления автоматически (на данное устройство).",
|
||||
"com.affine.settings.appearance": "Внешний вид",
|
||||
"com.affine.settings.appearance.border-style-description": "Настроить внешний вид клиента.",
|
||||
"com.affine.settings.appearance.date-format-description": "Настроить формат даты.",
|
||||
"com.affine.settings.appearance.start-week-description": "По умолчанию неделя начинается с воскресенья.",
|
||||
"com.affine.settings.remove-workspace": "Удалить рабочее пространство",
|
||||
"com.affine.settings.workspace.not-owner": "Только владелец может редактировать аватар и имя рабочего пространства. Изменения будут отображаться для всех.",
|
||||
"com.affine.settings.workspace.storage.tip": "Щелкните, чтобы переместить место хранения.",
|
||||
"com.affine.today": "Сегодня",
|
||||
"com.affine.updater.downloading": "Загрузка",
|
||||
"com.affine.updater.restart-to-update": "Перезапустить для установки обновления",
|
||||
"com.affine.updater.update-available": "Доступно обновление",
|
||||
"com.affine.workspaceDelete.placeholder": "Для подтверждения введите имя рабочего пространства",
|
||||
"com.affine.yesterday": "Вчера",
|
||||
"core": "основных",
|
||||
"dark": "Темная",
|
||||
"emptyAllPages": "Это рабочее пространство пусто. Создайте новую страницу, чтобы начать редактирование.",
|
||||
"emptyAllPagesClient": "Нажмите <1>$t(New Page)</1> или <3>{{shortcut}}</3>, чтобы создать свою первую страницу.",
|
||||
"emptyFavorite": "Нажмите «Добавить в избранное», и страница появится здесь.",
|
||||
"emptyTrash": "Нажмите «Добавить в корзину», и страница появится здесь.",
|
||||
"is a Cloud Workspace": "это облачное рабочее пространство.",
|
||||
"is a Local Workspace": "это локальное рабочее пространство",
|
||||
"light": "Светлая",
|
||||
"login success": "Успешный вход в систему",
|
||||
"mobile device": "Похоже, что вы просматриваете страницу на мобильном устройстве.",
|
||||
"mobile device description": "Мы все еще работаем над поддержкой мобильных устройств и рекомендуем использовать настольное устройство.",
|
||||
"recommendBrowser": "Для оптимальной работы мы рекомендуем использовать браузер <1>Chrome</1>.",
|
||||
"restored": "{{title}} восстановлен",
|
||||
"still designed": "(Эта страница все еще находится в разработке.)",
|
||||
"upgradeBrowser": "Пожалуйста, обновите Chrome до последней версии для лучшего взаимодействия.",
|
||||
"will be moved to Trash": "{{title}} будет перемещен в Корзину",
|
||||
"will delete member": "удалит участника"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "404 - 找不到页面",
|
||||
"404.back": "返回我的内容",
|
||||
"404.hint": "抱歉,您没有访问权限或该内容不存在...",
|
||||
@@ -11,14 +12,14 @@
|
||||
"Add Filter": "添加筛选条件",
|
||||
"Add Workspace": "导入工作区",
|
||||
"Add Workspace Hint": "选择已有的数据库文件",
|
||||
"Add a subpage inside": "添加一个子页面",
|
||||
"Add a subpage inside": "添加一篇子文档",
|
||||
"Add to Favorites": "加入收藏",
|
||||
"Add to favorites": "加入收藏",
|
||||
"Added Successfully": "导入成功",
|
||||
"Added to Favorites": "已收藏",
|
||||
"All changes are saved locally": "所有改动已保存到本地",
|
||||
"All data has been stored in the cloud": "所有数据已被保存在云端。",
|
||||
"All pages": "全部页面",
|
||||
"All pages": "全部文档",
|
||||
"App Version": "应用版本",
|
||||
"Appearance Settings": "外观设置",
|
||||
"Append to Daily Note": "附加到随笔",
|
||||
@@ -84,7 +85,7 @@
|
||||
"Delete Workspace Description2": "正在删除<1>{{workspace}}</1> ,将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。",
|
||||
"Delete Workspace Label Hint": "在删除此工作区后,您将永久删除所有内容,任何人都无法恢复此工作区的内容。",
|
||||
"Delete Workspace placeholder": "请输入”Delete“以确认",
|
||||
"Delete page?": "确定要删除页面?",
|
||||
"Delete page?": "确定要删除文档?",
|
||||
"Delete permanently": "永久删除",
|
||||
"Disable": "禁用",
|
||||
"Disable Public Link": "禁用公共链接",
|
||||
@@ -129,7 +130,7 @@
|
||||
"FILE_ALREADY_EXISTS": "文件已存在",
|
||||
"Failed to publish workspace": "工作区发布失败",
|
||||
"Favorite": "收藏",
|
||||
"Favorite pages for easy access": "将页面添加到收藏夹以便轻松访问",
|
||||
"Favorite pages for easy access": "将文档添加到收藏以便轻松访问",
|
||||
"Favorited": "已收藏",
|
||||
"Favorites": "收藏夹",
|
||||
"Filters": "筛选条件",
|
||||
@@ -191,8 +192,8 @@
|
||||
"Move folder": "移动文件夹",
|
||||
"Move folder hint": "选择新的存储位置",
|
||||
"Move folder success": "移动文件夹成功",
|
||||
"Move page to": "将此页面移动到...",
|
||||
"Move page to...": "将此页面移动...",
|
||||
"Move page to": "将此文档移动到...",
|
||||
"Move page to...": "将此文档移动...",
|
||||
"Move to": "移动到",
|
||||
"Move to Trash": "移到垃圾箱",
|
||||
"Moved to Trash": "已移到垃圾箱",
|
||||
@@ -200,8 +201,8 @@
|
||||
"Name Your Workspace": "给您的工作区命名",
|
||||
"NativeTitleBar": "原生标题栏",
|
||||
"Navigation Path": "导航路径",
|
||||
"New Keyword Page": "新建 “{{query}}“ 为标题的页面 ",
|
||||
"New Page": "新建页面",
|
||||
"New Keyword Page": "新建 “{{query}}“ 为标题的文档 ",
|
||||
"New Page": "新建文档",
|
||||
"New Workspace": "新建工作区",
|
||||
"New version is ready": "新版本已准备就绪",
|
||||
"No item": "无项目",
|
||||
@@ -214,7 +215,7 @@
|
||||
"Open folder": "打开文件夹",
|
||||
"Open folder hint": "检查存储文件夹的位置。",
|
||||
"Open in new tab": "在新标签页打开",
|
||||
"Organize pages to build knowledge": "组织页面以建立知识库。",
|
||||
"Organize pages to build knowledge": "组织文档以建立知识库。",
|
||||
"Owner": "所有者",
|
||||
"Page": "页面",
|
||||
"Paper": "文档",
|
||||
@@ -236,7 +237,7 @@
|
||||
"Quick search": "快速搜索",
|
||||
"Quick search placeholder": "快速搜索...",
|
||||
"Quick search placeholder2": "在 {{workspace}} 中搜索",
|
||||
"RFP": "页面可以从枢纽上被自由添加或删除,但仍然可以在“所有页面”中访问。",
|
||||
"RFP": "文档可以从枢纽上被自由添加或删除,但仍然可以在“所有文档”中访问。",
|
||||
"Recent": "最近",
|
||||
"Redo": "重做",
|
||||
"Reduce indent": "减少缩进",
|
||||
@@ -266,8 +267,8 @@
|
||||
"Share Menu Public Workspace Description1": "邀请其他人加入工作区或将其发布到网络。",
|
||||
"Share Menu Public Workspace Description2": "当前工作区已被发布到网络作为公共工作区。",
|
||||
"Share with link": "通过链接分享",
|
||||
"Shared Pages": "已分享页面",
|
||||
"Shared Pages Description": "公开分享页面需要 AFFiNE Cloud 服务。",
|
||||
"Shared Pages": "已分享文档",
|
||||
"Shared Pages Description": "公开分享文档需要 AFFiNE Cloud 服务。",
|
||||
"Shared Pages In Public Workspace Description": "整个工作区已在网络上发布,可以通过<1>工作区设置</1>进行编辑。",
|
||||
"Shortcuts": "快捷键",
|
||||
"Sidebar": "侧边栏",
|
||||
@@ -344,7 +345,18 @@
|
||||
"com.affine.aboutAFFiNE.autoDownloadUpdate.title": "自动下载更新",
|
||||
"com.affine.aboutAFFiNE.changelog.description": "查看 AFFiNE 更新日志。",
|
||||
"com.affine.aboutAFFiNE.changelog.title": "发现新动态",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.check": "检查更新",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.download": "下载更新",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.restart": "重新启动以安装更新",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.button.retry": "重试",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.description": "新版本已准备就绪",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.check": "手动检查更新",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.checking": "检查更新中...",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.downloading": "正在下载最新版本...",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.error": "无法连接服务器。",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.latest": "您已获得最新版本的 AFFiNE。",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.restart": "重新启动以应用更新。",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.subtitle.update-available": "有可用的更新({{version}})",
|
||||
"com.affine.aboutAFFiNE.checkUpdate.title": "检查更新",
|
||||
"com.affine.aboutAFFiNE.community.title": "社区",
|
||||
"com.affine.aboutAFFiNE.contact.community": "AFFiNE 社区",
|
||||
@@ -358,7 +370,8 @@
|
||||
"com.affine.aboutAFFiNE.version.app": "应用版本",
|
||||
"com.affine.aboutAFFiNE.version.editor.title": "编辑器版本",
|
||||
"com.affine.aboutAFFiNE.version.title": "版本",
|
||||
"com.affine.all-pages.header": "所有页面",
|
||||
"com.affine.all-pages.header": "所有文档",
|
||||
"com.affine.appUpdater.downloadUpdate": "下载更新",
|
||||
"com.affine.appUpdater.downloading": "下载中",
|
||||
"com.affine.appUpdater.installUpdate": "重新启动以安装更新",
|
||||
"com.affine.appUpdater.openDownloadPage": "打开下载页面",
|
||||
@@ -376,7 +389,7 @@
|
||||
"com.affine.appearanceSettings.fontStyle.mono": "等宽",
|
||||
"com.affine.appearanceSettings.fontStyle.sans": "默认",
|
||||
"com.affine.appearanceSettings.fontStyle.serif": "衬线",
|
||||
"com.affine.appearanceSettings.fullWidth.description": "页面内容的最大显示量。",
|
||||
"com.affine.appearanceSettings.fullWidth.description": "文档内容的最大显示量。",
|
||||
"com.affine.appearanceSettings.fullWidth.title": "全宽布局",
|
||||
"com.affine.appearanceSettings.language.description": "选择界面语言。",
|
||||
"com.affine.appearanceSettings.language.title": "显示语言",
|
||||
@@ -394,7 +407,7 @@
|
||||
"com.affine.appearanceSettings.windowFrame.description": "自定义 Windows 客户端外观。",
|
||||
"com.affine.appearanceSettings.windowFrame.frameless": "无边框",
|
||||
"com.affine.appearanceSettings.windowFrame.title": "视窗样式",
|
||||
"com.affine.auth.verify.email.message": "您当前的邮箱是 {{email}}。我们将向此邮箱发送一个临时的验证链接。",
|
||||
"com.affine.auth.change.email.message": "您当前的邮箱是 {{email}}。我们将向此邮箱发送一个临时的验证链接。",
|
||||
"com.affine.auth.change.email.page.subtitle": "请在下方输入您的新电子邮件地址。我们将把验证链接发送至该电子邮件地址以完成此过程。",
|
||||
"com.affine.auth.change.email.page.success.subtitle": "恭喜!您已更新了与 AFFiNE Cloud 账户关联的电子邮件地址。",
|
||||
"com.affine.auth.change.email.page.success.title": "邮箱地址已更新!",
|
||||
@@ -418,20 +431,23 @@
|
||||
"com.affine.auth.reset.password.message": "您将收到一封电子邮件,以便重置密码。请在收件箱中查收。",
|
||||
"com.affine.auth.reset.password.page.success": "密码重置成功",
|
||||
"com.affine.auth.reset.password.page.title": "重置您的 AFFiNE Cloud 密码",
|
||||
"com.affine.auth.send.verify.email.hint": "发送验证链接",
|
||||
"com.affine.auth.send.change.email.link": "发送验证链接",
|
||||
"com.affine.auth.send.reset.password.link": "发送重置链接",
|
||||
"com.affine.auth.send.set.password.link": "发送设置链接",
|
||||
"com.affine.auth.send.verify.email.hint": "发送验证链接",
|
||||
"com.affine.auth.sent": "已发送",
|
||||
"com.affine.auth.sent.verify.email.hint": "验证链接已发送",
|
||||
"com.affine.auth.sent.change.email.fail": "验证链接发送失败,请稍后重试。",
|
||||
"com.affine.auth.sent.change.email.hint": "验证链接已发送",
|
||||
"com.affine.auth.sent.change.password.hint": "重置密码链接已发送。",
|
||||
"com.affine.auth.sent.reset.password.success.message": "您的密码已更新!您可以使用新密码登录 AFFiNE Cloud!",
|
||||
"com.affine.auth.sent.set.password.hint": "设置密码链接已发送。",
|
||||
"com.affine.auth.sent.set.password.success.message": "您的密码已保存!您可以使用邮箱和密码登录 AFFiNE Cloud!",
|
||||
"com.affine.auth.sent.verify.email.hint": "验证链接已发送",
|
||||
"com.affine.auth.set.email.save": "保存电子邮件",
|
||||
"com.affine.auth.set.password": "设置密码",
|
||||
"com.affine.auth.set.password.message": "请输入一个长度在 {{min}}-{{max}} 个字符之间,同时包含字母和数字的密码以继续注册",
|
||||
"com.affine.auth.set.password.message.minlength": "至少 {{min}} 个字符",
|
||||
"com.affine.auth.set.password.message.maxlength": "至多 {{max}} 个字符",
|
||||
"com.affine.auth.set.password.message.minlength": "至少 {{min}} 个字符",
|
||||
"com.affine.auth.set.password.page.success": "密码设置成功",
|
||||
"com.affine.auth.set.password.page.title": "设置您的 AFFiNE Cloud 密码",
|
||||
"com.affine.auth.set.password.placeholder": "密码长度至少需要 {{min}} 个字符",
|
||||
@@ -446,6 +462,7 @@
|
||||
"com.affine.auth.sign.auth.code.message.password": "或者使用<1>密码登录</1>。",
|
||||
"com.affine.auth.sign.auth.code.on.resend.hint": "再次发送验证码",
|
||||
"com.affine.auth.sign.auth.code.resend.hint": "重发验证码",
|
||||
"com.affine.auth.sign.auth.code.send-email.sign-in": "使用魔法链接登录",
|
||||
"com.affine.auth.sign.condition": "条款与条件",
|
||||
"com.affine.auth.sign.email.continue": "以电子邮件继续",
|
||||
"com.affine.auth.sign.email.error": "无效的电子邮件",
|
||||
@@ -458,6 +475,9 @@
|
||||
"com.affine.auth.sign.no.access.wait": "请期待正式发行",
|
||||
"com.affine.auth.sign.policy": "隐私政策",
|
||||
"com.affine.auth.sign.sent.email.message.end": "您可以点击链接自动创建账户。",
|
||||
"com.affine.auth.sign.sent.email.message.sent-tips": "一封带有魔法链接的电子邮件已发送至 <a>{{email}}</a> 。",
|
||||
"com.affine.auth.sign.sent.email.message.sent-tips.sign-in": "您可以点击链接自动登录。",
|
||||
"com.affine.auth.sign.sent.email.message.sent-tips.sign-up": "您可以点击链接自动创建帐户。",
|
||||
"com.affine.auth.sign.up": "注册",
|
||||
"com.affine.auth.sign.up.sent.email.subtitle": "创建您的账号",
|
||||
"com.affine.auth.sign.up.success.subtitle": "AFFiNE 客户端将自动打开或重定向到网页端,如果您遇到任何问题,可以点击下方按钮手动打开 AFFiNE。",
|
||||
@@ -468,9 +488,23 @@
|
||||
"com.affine.auth.toast.message.signed-in": "您已登录,开始与 AFFiNE Cloud 同步您的数据!",
|
||||
"com.affine.auth.toast.title.failed": "无法登录",
|
||||
"com.affine.auth.toast.title.signed-in": "已登录",
|
||||
"com.affine.auth.verify.email.message": "您当前的邮箱是 {{email}}。我们将向此邮箱发送一个临时的验证链接。",
|
||||
"com.affine.auth.verify.email.page.success.subtitle": "恭喜! 您已成功验证与您的 AFFiNE Cloud 帐户关联的电子邮件地址。",
|
||||
"com.affine.auth.verify.email.page.success.title": "电子邮件地址已验证!",
|
||||
"com.affine.backButton": "返回首页",
|
||||
"com.affine.banner.content": "此演示有限。<1>下载 AFFiNE 客户端</1>以获取最新功能和表现。",
|
||||
"com.affine.banner.local-warning": "您的本地数据存储在浏览器中,可能会丢失。 不要冒险 - 立即启用 AFFiNE Cloud !",
|
||||
"com.affine.brand.affineCloud": "AFFiNE Cloud",
|
||||
"com.affine.calendar-date-picker.month-names": "一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月",
|
||||
"com.affine.calendar-date-picker.today": "今天",
|
||||
"com.affine.calendar-date-picker.week-days": "周日,周一,周二,周三,周四,周五,周六",
|
||||
"com.affine.calendar.weekdays.fri": "周五",
|
||||
"com.affine.calendar.weekdays.mon": "周一",
|
||||
"com.affine.calendar.weekdays.sat": "周六",
|
||||
"com.affine.calendar.weekdays.sun": "周日",
|
||||
"com.affine.calendar.weekdays.thu": "周四",
|
||||
"com.affine.calendar.weekdays.tue": "周二",
|
||||
"com.affine.calendar.weekdays.wed": "周三",
|
||||
"com.affine.cloudTempDisable.description": "我们正在升级 AFFiNE Cloud 服务,客户端暂时不可启用它。如果您希望随时了解进度并收到关于云服务的可用性通知,您可以填写我们的<1>表单</1>。",
|
||||
"com.affine.cloudTempDisable.title": "AFFiNE Cloud 正在进行升级。",
|
||||
"com.affine.cmdk.affine.category.affine.collections": "精选",
|
||||
@@ -480,38 +514,41 @@
|
||||
"com.affine.cmdk.affine.category.affine.help": "帮助",
|
||||
"com.affine.cmdk.affine.category.affine.layout": "布局控制",
|
||||
"com.affine.cmdk.affine.category.affine.navigation": "导航",
|
||||
"com.affine.cmdk.affine.category.affine.pages": "页面",
|
||||
"com.affine.cmdk.affine.category.affine.pages": "文档",
|
||||
"com.affine.cmdk.affine.category.affine.recent": "最近",
|
||||
"com.affine.cmdk.affine.category.affine.settings": "设置",
|
||||
"com.affine.cmdk.affine.category.affine.updates": "更新",
|
||||
"com.affine.cmdk.affine.category.editor.edgeless": "无界命令",
|
||||
"com.affine.cmdk.affine.category.editor.insert-object": "插入对象",
|
||||
"com.affine.cmdk.affine.category.editor.page": "页面命令",
|
||||
"com.affine.cmdk.affine.category.editor.page": "文档命令",
|
||||
"com.affine.cmdk.affine.category.results": "结果",
|
||||
"com.affine.cmdk.affine.client-border-style.to": "更改客户端边框样式为",
|
||||
"com.affine.cmdk.affine.color-mode.to": "更改颜色模式为",
|
||||
"com.affine.cmdk.affine.color-scheme.to": "更改颜色方案为",
|
||||
"com.affine.cmdk.affine.contact-us": "联系我们",
|
||||
"com.affine.cmdk.affine.create-new-edgeless-as": "新建 “{{keyWord}}” 为标题的无界页面",
|
||||
"com.affine.cmdk.affine.create-new-page-as": "新建 “{{keyWord}}” 为标题的页面",
|
||||
"com.affine.cmdk.affine.create-new-page-as": "新建 “{{keyWord}}” 为标题的文档",
|
||||
"com.affine.cmdk.affine.display-language.to": "更改显示语言为",
|
||||
"com.affine.cmdk.affine.editor.add-to-favourites": "加入收藏",
|
||||
"com.affine.cmdk.affine.editor.edgeless.presentation-start": "开始演示",
|
||||
"com.affine.cmdk.affine.editor.remove-from-favourites": "从收藏中移除",
|
||||
"com.affine.cmdk.affine.editor.restore-from-trash": "从垃圾箱恢复",
|
||||
"com.affine.cmdk.affine.editor.reveal-page-history-modal": "显示文档历史模式",
|
||||
"com.affine.cmdk.affine.editor.trash-footer-hint": "该文档已移至回收站,您可以恢复或永久删除它。",
|
||||
"com.affine.cmdk.affine.font-style.to": "更改字体样式为",
|
||||
"com.affine.cmdk.affine.full-width-layout.to": "更改全宽布局为",
|
||||
"com.affine.cmdk.affine.getting-started": "开始使用",
|
||||
"com.affine.cmdk.affine.import-workspace": "导入工作区",
|
||||
"com.affine.cmdk.affine.left-sidebar.collapse": "折叠左侧边栏",
|
||||
"com.affine.cmdk.affine.left-sidebar.expand": "展开左侧边栏",
|
||||
"com.affine.cmdk.affine.navigation.goto-all-pages": "前往所有页面",
|
||||
"com.affine.cmdk.affine.navigation.goto-all-pages": "前往所有文档",
|
||||
"com.affine.cmdk.affine.navigation.goto-edgeless-list": "前往无界列表",
|
||||
"com.affine.cmdk.affine.navigation.goto-page-list": "前往页面列表",
|
||||
"com.affine.cmdk.affine.navigation.goto-trash": "前往垃圾箱",
|
||||
"com.affine.cmdk.affine.navigation.goto-workspace": "前往工作区",
|
||||
"com.affine.cmdk.affine.navigation.open-settings": "前往设置",
|
||||
"com.affine.cmdk.affine.new-edgeless-page": "新建无界页面",
|
||||
"com.affine.cmdk.affine.new-page": "新建页面",
|
||||
"com.affine.cmdk.affine.new-page": "新建文档",
|
||||
"com.affine.cmdk.affine.new-workspace": "新建工作区",
|
||||
"com.affine.cmdk.affine.noise-background-on-the-sidebar.to": "更改侧边栏噪声背景为",
|
||||
"com.affine.cmdk.affine.restart-to-upgrade": "重启以升级",
|
||||
@@ -524,25 +561,39 @@
|
||||
"com.affine.collection-bar.action.tooltip.edit": "编辑",
|
||||
"com.affine.collection-bar.action.tooltip.pin": "固定到侧边栏",
|
||||
"com.affine.collection-bar.action.tooltip.unpin": "取消固定",
|
||||
"com.affine.collection.addPage.alreadyExists": "页面已存在",
|
||||
"com.affine.collection.addPage.alreadyExists": "文档已存在",
|
||||
"com.affine.collection.addPage.success": "页面添加成功",
|
||||
"com.affine.collection.addPages": "添加页面",
|
||||
"com.affine.collection.addPages.tips": "<0>添加页面:</0>您可以自由选择页面并将其添加到精选中。",
|
||||
"com.affine.collection.addPages": "添加文档",
|
||||
"com.affine.collection.addPages.tips": "<0>添加文档:</0>您可以自由选择文档并将其添加到精选中。",
|
||||
"com.affine.collection.addRules": "添加规则",
|
||||
"com.affine.collection.addRules.tips": "<0>添加规则:</0>规则基于过滤条件。 添加规则后,符合要求的页面会自动添加到当前精选中。",
|
||||
"com.affine.collection.addRules.tips": "<0>添加规则:</0>规则基于过滤条件。 添加规则后,符合要求的文档会自动添加到当前精选中。",
|
||||
"com.affine.collection.allCollections": "所有精选",
|
||||
"com.affine.collection.emptyCollection": "空的精选",
|
||||
"com.affine.collection.emptyCollectionDescription": "精选是一个智能文件夹,您可以手动添加页面或通过规则自动添加页面。",
|
||||
"com.affine.collection.emptyCollectionDescription": "精选是一个智能文件夹,您可以手动添加文档或通过规则自动添加文档。",
|
||||
"com.affine.collection.helpInfo": "帮助信息",
|
||||
"com.affine.collection.menu.edit": "编辑精选",
|
||||
"com.affine.collection.menu.rename": "重命名",
|
||||
"com.affine.collection.removePage.success": "成功移除",
|
||||
"com.affine.collection.toolbar.selected": "已选择 <0>{{count}}</0> 个精选",
|
||||
"com.affine.collection.toolbar.selected_one": "已选择 <0>{{count}}</0> 个精选",
|
||||
"com.affine.collection.toolbar.selected_other": "已选择 <0>{{count}}</0> 个精选",
|
||||
"com.affine.collection.toolbar.selected_others": "已选择 <0>{{count}}</0> 个精选",
|
||||
"com.affine.collectionBar.backToAll": "返回全部",
|
||||
"com.affine.collections.empty.message": "精选为空",
|
||||
"com.affine.collections.empty.new-collection-button": "新建精选",
|
||||
"com.affine.collections.header": "精选",
|
||||
"com.affine.confirmModal.button.cancel": "取消",
|
||||
"com.affine.currentYear": "今年",
|
||||
"com.affine.delete-tags.confirm.description": "正在删除 <1>{{tag}}</1> ,此操作无法撤销,所有内容将会丢失。",
|
||||
"com.affine.delete-tags.confirm.multi-tag-description": "正在删除 {{count}} 个标签,此操作无法撤销,所有内容将会丢失。",
|
||||
"com.affine.delete-tags.confirm.title": "删除标签?",
|
||||
"com.affine.delete-tags.count": "已删除 {{count}} 个标签",
|
||||
"com.affine.delete-tags.count_one": "已删除 {{count}} 个标签",
|
||||
"com.affine.delete-tags.count_other": "已删除 {{count}} 个标签",
|
||||
"com.affine.deleteLeaveWorkspace.description": "从此设备删除工作区,并可选择删除所有数据。",
|
||||
"com.affine.deleteLeaveWorkspace.leave": "退出工作区",
|
||||
"com.affine.deleteLeaveWorkspace.leaveDescription": "退出后,您将无法再访问此工作区的内容。",
|
||||
"com.affine.docs.header": "文档",
|
||||
"com.affine.draw_with_a_blank_whiteboard": "在空白白板画画",
|
||||
"com.affine.earlier": "更早",
|
||||
"com.affine.edgelessMode": "无界模式",
|
||||
@@ -550,39 +601,49 @@
|
||||
"com.affine.editCollection.button.create": "创建",
|
||||
"com.affine.editCollection.createCollection": "创建精选",
|
||||
"com.affine.editCollection.filters": "过滤",
|
||||
"com.affine.editCollection.pages": "页面",
|
||||
"com.affine.editCollection.pages": "文档",
|
||||
"com.affine.editCollection.pages.clear": "清除页面",
|
||||
"com.affine.editCollection.renameCollection": "重命名精选",
|
||||
"com.affine.editCollection.rules": "规则",
|
||||
"com.affine.editCollection.rules.countTips": "已选择 <1>{{selectedCount}}</1>,已过滤 <3>{{filteredCount}}</3>",
|
||||
"com.affine.editCollection.rules.countTips.more": "显示 <1>{{count}}</1> 个页面。",
|
||||
"com.affine.editCollection.rules.countTips.one": "显示1个页面。",
|
||||
"com.affine.editCollection.rules.countTips.zero": "显示0个页面。",
|
||||
"com.affine.editCollection.rules.countTips.more": "显示 <1>{{count}}</1> 篇文档。",
|
||||
"com.affine.editCollection.rules.countTips.one": "显示 1 篇文档。",
|
||||
"com.affine.editCollection.rules.countTips.zero": "显示 0 篇文档。",
|
||||
"com.affine.editCollection.rules.empty.noResults": "没有结果",
|
||||
"com.affine.editCollection.rules.empty.noResults.tips": "没有页面符合过滤规则",
|
||||
"com.affine.editCollection.rules.empty.noResults.tips": "没有文档符合过滤规则",
|
||||
"com.affine.editCollection.rules.empty.noRules": "没有规则",
|
||||
"com.affine.editCollection.rules.empty.noRules.tips": "请<1>添加规则</1>保存此精选或切换到<3>页面</3>,使用手动选择模式",
|
||||
"com.affine.editCollection.rules.include.add": "添加被选中的页面",
|
||||
"com.affine.editCollection.rules.empty.noRules.tips": "请<1>添加规则</1>保存此精选或切换到<3>文档</3>,使用手动选择模式",
|
||||
"com.affine.editCollection.rules.include.add": "添加被选中的文档",
|
||||
"com.affine.editCollection.rules.include.is": "是",
|
||||
"com.affine.editCollection.rules.include.page": "页面",
|
||||
"com.affine.editCollection.rules.include.tips": "“选定页面”是指手动添加页面,而不是通过规则匹配自动添加页面。 您可以通过“添加所选页面”选项或通过拖放来手动添加页面。",
|
||||
"com.affine.editCollection.rules.include.tipsTitle": "什么是“选定页面”?",
|
||||
"com.affine.editCollection.rules.include.title": "选中的页面",
|
||||
"com.affine.editCollection.rules.include.page": "文档",
|
||||
"com.affine.editCollection.rules.include.tips": "“选定文档”是指手动添加文档,而不是通过规则匹配自动添加文档。 您可以通过“添加所选文档”选项或通过拖放来手动添加文档。",
|
||||
"com.affine.editCollection.rules.include.tipsTitle": "什么是“选定文档”?",
|
||||
"com.affine.editCollection.rules.include.title": "选中的文档",
|
||||
"com.affine.editCollection.rules.preview": "预览",
|
||||
"com.affine.editCollection.rules.reset": "重置",
|
||||
"com.affine.editCollection.rules.tips": "符合规则的页面将 <2>{{highlight}}</2> 被添加到当前精选",
|
||||
"com.affine.editCollection.rules.tips": "符合规则的文档将 <2>{{highlight}}</2> 被添加到当前精选",
|
||||
"com.affine.editCollection.rules.tips.highlight": "自动",
|
||||
"com.affine.editCollection.save": "保存",
|
||||
"com.affine.editCollection.saveCollection": "保存精选",
|
||||
"com.affine.editCollection.search.placeholder": "搜索页面...",
|
||||
"com.affine.editCollection.search.placeholder": "搜索文档...",
|
||||
"com.affine.editCollection.untitledCollection": "未命名精选",
|
||||
"com.affine.editCollection.updateCollection": "更新精选",
|
||||
"com.affine.editCollectionName.createTips": "精选是一个智能文件夹,您可以手动添加页面或通过规则自动添加页面。",
|
||||
"com.affine.editCollectionName.createTips": "精选是一个智能文件夹,您可以手动添加页面或通过规则自动添加文档。",
|
||||
"com.affine.editCollectionName.name": "名称",
|
||||
"com.affine.editCollectionName.name.placeholder": "精选名称",
|
||||
"com.affine.editor.reference-not-found": "未找到已链接的文档",
|
||||
"com.affine.editorModeSwitch.tooltip": "切换",
|
||||
"com.affine.emptyDesc": "这里还没有页面",
|
||||
"com.affine.emptyDesc": "这里还没有文档",
|
||||
"com.affine.emptyDesc.collection": "这里还没有精选",
|
||||
"com.affine.emptyDesc.tag": "这里还没有标签",
|
||||
"com.affine.enableAffineCloudModal.button.cancel": "取消",
|
||||
"com.affine.error.contact.description": "如果您仍然遇到此问题,请通过<1>社区</1>与我们联系。",
|
||||
"com.affine.error.no-page-root.title": "文档内容丢失",
|
||||
"com.affine.error.page-not-found.title": "刷新",
|
||||
"com.affine.error.refetch": "重新连接",
|
||||
"com.affine.error.reload": "重新加载",
|
||||
"com.affine.error.retry": "刷新",
|
||||
"com.affine.error.unexpected-error.title": "出了点问题...",
|
||||
"com.affine.expired.page.subtitle": "请重新请求重置密码链接。",
|
||||
"com.affine.expired.page.title": "链接已失效...",
|
||||
"com.affine.export.error.message": "请稍后再试。",
|
||||
@@ -603,6 +664,8 @@
|
||||
"com.affine.filter.is empty": "为空",
|
||||
"com.affine.filter.is not empty": "不为空",
|
||||
"com.affine.filter.is-favourited": "已收藏",
|
||||
"com.affine.filter.is-public": "已分享",
|
||||
"com.affine.filter.last": "最近",
|
||||
"com.affine.filter.save-view": "保存视图",
|
||||
"com.affine.filter.true": "是",
|
||||
"com.affine.filterList.button.add": "添加筛选条件",
|
||||
@@ -611,8 +674,37 @@
|
||||
"com.affine.helpIsland.contactUs": "联系我们",
|
||||
"com.affine.helpIsland.gettingStarted": "开始使用",
|
||||
"com.affine.helpIsland.helpAndFeedback": "帮助与反馈",
|
||||
"com.affine.history-vision.tips-modal.cancel": "取消",
|
||||
"com.affine.history-vision.tips-modal.confirm": "启用 AFFiNE Cloud",
|
||||
"com.affine.history-vision.tips-modal.description": "当前工作区是本地工作区,我们目前不支持记录它的历史版本。 您可以启用 AFFiNE Cloud。 这会将工作区与云同步,以便您使用此功能。",
|
||||
"com.affine.history-vision.tips-modal.title": "历史版本需要 AFFiNE Cloud ",
|
||||
"com.affine.history.back-to-page": "返回文档",
|
||||
"com.affine.history.confirm-restore-modal.free-plan-prompt.description": "通过工作区创建者的免费帐户,每个成员都可以访问最多 <1>7 天<1> 的版本历史记录。",
|
||||
"com.affine.history.confirm-restore-modal.hint": "您即将将文档的当前版本恢复到可用的最新版本。 此操作将覆盖最新版本之前所做的任何更改。",
|
||||
"com.affine.history.confirm-restore-modal.load-more": "加载更多",
|
||||
"com.affine.history.confirm-restore-modal.plan-prompt.limited-title": "有限的文档历史",
|
||||
"com.affine.history.confirm-restore-modal.plan-prompt.title": "帮助信息",
|
||||
"com.affine.history.confirm-restore-modal.pro-plan-prompt.description": "通过工作区创建者的 Pro 帐户,每个成员都享有访问最多<1>30 天<1>版本历史记录的特权。",
|
||||
"com.affine.history.confirm-restore-modal.pro-plan-prompt.upgrade": "升级",
|
||||
"com.affine.history.confirm-restore-modal.restore": "恢复",
|
||||
"com.affine.history.empty-prompt.description": "这篇文档尚未孕育出一丝历史的枝芽!",
|
||||
"com.affine.history.empty-prompt.title": "历史记录为空",
|
||||
"com.affine.history.restore-current-version": "恢复当前版本",
|
||||
"com.affine.history.version-history": "历史版本",
|
||||
"com.affine.history.view-history-version": "查看历史版本",
|
||||
"com.affine.import_file": "支持 Markdown/Notion",
|
||||
"com.affine.inviteModal.button.cancel": "取消",
|
||||
"com.affine.issue-feedback.cancel": "稍后",
|
||||
"com.affine.issue-feedback.confirm": "在 GitHUb 分享反馈",
|
||||
"com.affine.issue-feedback.description": "有任何反馈? 我们都洗耳恭听! 在 GitHub 分享反馈,让我们了解您的想法和建议。",
|
||||
"com.affine.issue-feedback.title": "在 GitHub 分享您的反馈",
|
||||
"com.affine.journal.app-sidebar-title": "Journals",
|
||||
"com.affine.journal.cmdk.append-to-today": "添加到 Journal",
|
||||
"com.affine.journal.conflict-show-more": "还有 {{count}} 篇文章",
|
||||
"com.affine.journal.created-today": "创建于",
|
||||
"com.affine.journal.daily-count-created-empty-tips": "你还没有创建任何东西",
|
||||
"com.affine.journal.daily-count-updated-empty-tips": "你还没有任何更新",
|
||||
"com.affine.journal.updated-today": "更新于",
|
||||
"com.affine.keyboardShortcuts.appendDailyNote": "添加日常笔记快捷键",
|
||||
"com.affine.keyboardShortcuts.bodyText": "正文",
|
||||
"com.affine.keyboardShortcuts.bold": "粗体",
|
||||
@@ -635,7 +727,7 @@
|
||||
"com.affine.keyboardShortcuts.link": "超链接(选定文本)",
|
||||
"com.affine.keyboardShortcuts.moveDown": "下移",
|
||||
"com.affine.keyboardShortcuts.moveUp": "上移",
|
||||
"com.affine.keyboardShortcuts.newPage": "新建页面",
|
||||
"com.affine.keyboardShortcuts.newPage": "新建文档",
|
||||
"com.affine.keyboardShortcuts.note": "笔记快捷键",
|
||||
"com.affine.keyboardShortcuts.pen": "笔",
|
||||
"com.affine.keyboardShortcuts.quickSearch": "快速搜索",
|
||||
@@ -665,15 +757,20 @@
|
||||
"com.affine.loading": "加载中...",
|
||||
"com.affine.moreThan30Days": "超过30天",
|
||||
"com.affine.moveToTrash.confirmModal.description": "{{title}} 将被移动到回收站",
|
||||
"com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} 个页面将移至回收站",
|
||||
"com.affine.moveToTrash.confirmModal.title": "确定要删除页面?",
|
||||
"com.affine.moveToTrash.confirmModal.title.multiple": "确认删除 {{ number }} 个页面吗?",
|
||||
"com.affine.moveToTrash.confirmModal.description.multiple": "{{ number }} 篇文档将移至回收站",
|
||||
"com.affine.moveToTrash.confirmModal.title": "确定要删除文档?",
|
||||
"com.affine.moveToTrash.confirmModal.title.multiple": "确认删除 {{ number }} 篇文档吗?",
|
||||
"com.affine.moveToTrash.title": "移动到回收站",
|
||||
"com.affine.nameWorkspace.affine-cloud.description": "启用 AFFiNE Cloud 可以让您同步和备份数据,并支持多用户协作和内容分享。",
|
||||
"com.affine.nameWorkspace.affine-cloud.title": "使用 AFFiNE Cloud 在多个设备间进行同步",
|
||||
"com.affine.nameWorkspace.affine-cloud.web-tips": "如果您希望工作区在本地储存,可以下载桌面客户端。",
|
||||
"com.affine.nameWorkspace.button.cancel": "取消",
|
||||
"com.affine.nameWorkspace.button.create": "创建",
|
||||
"com.affine.nameWorkspace.description": "工作区是为个人和团队进行引用、创建和规划的虚拟空间。",
|
||||
"com.affine.nameWorkspace.placeholder": "设置工作区名称",
|
||||
"com.affine.nameWorkspace.subtitle.workspace-name": "工作区名称",
|
||||
"com.affine.nameWorkspace.title": "命名您的工作区",
|
||||
"com.affine.new.page-mode": "创建新的页面",
|
||||
"com.affine.new_edgeless": "新的无界页面",
|
||||
"com.affine.new_import": "导入",
|
||||
"com.affine.notFoundPage.backButton": "返回首页",
|
||||
@@ -682,6 +779,9 @@
|
||||
"com.affine.onboarding.title2": "直观且强大的块级编辑",
|
||||
"com.affine.onboarding.videoDescription1": "在页面模式和白板模式之间轻松切换,你可以在页面模式下创建结构化文档,并在白板模式下自由表达创意思想。",
|
||||
"com.affine.onboarding.videoDescription2": "轻松创建结构化文档,使用模块化界面将文本块、图像和其他内容拖放到页面中。",
|
||||
"com.affine.onboarding.workspace-guide.content": "工作区是为个人和团队进行引用、创建和规划的虚拟空间。",
|
||||
"com.affine.onboarding.workspace-guide.got-it": "知道了!",
|
||||
"com.affine.onboarding.workspace-guide.title": "在这里创建您自己的工作区来启动 AFFiNE!",
|
||||
"com.affine.openPageOperation.newTab": "在新标签页打开",
|
||||
"com.affine.other-page.nav.affine-community": "AFFiNE 社区",
|
||||
"com.affine.other-page.nav.blog": "博客",
|
||||
@@ -689,12 +789,49 @@
|
||||
"com.affine.other-page.nav.download-app": "下载应用",
|
||||
"com.affine.other-page.nav.official-website": "官方网站",
|
||||
"com.affine.other-page.nav.open-affine": "打开 AFFiNE",
|
||||
"com.affine.page-operation.add-linked-page": "添加链接文档",
|
||||
"com.affine.page-properties.add-property": "添加属性",
|
||||
"com.affine.page-properties.add-property.menu.create": "创建属性",
|
||||
"com.affine.page-properties.add-property.menu.header": "属性",
|
||||
"com.affine.page-properties.backlinks": "反向链接",
|
||||
"com.affine.page-properties.create-property.menu.header": "类型",
|
||||
"com.affine.page-properties.icons": "图标",
|
||||
"com.affine.page-properties.page-info": "信息",
|
||||
"com.affine.page-properties.property-value-placeholder": "属性为空",
|
||||
"com.affine.page-properties.property.always-hide": "始终隐藏",
|
||||
"com.affine.page-properties.property.always-show": "始终显示",
|
||||
"com.affine.page-properties.property.checkbox": "复选框",
|
||||
"com.affine.page-properties.property.date": "日期",
|
||||
"com.affine.page-properties.property.hide-in-view": "在视图中隐藏",
|
||||
"com.affine.page-properties.property.hide-in-view-when-empty": "当属性为空时在视图中隐藏",
|
||||
"com.affine.page-properties.property.hide-when-empty": "当属性为空时隐藏",
|
||||
"com.affine.page-properties.property.number": "数字",
|
||||
"com.affine.page-properties.property.progress": "进程",
|
||||
"com.affine.page-properties.property.remove-property": "删除属性",
|
||||
"com.affine.page-properties.property.required": "必选",
|
||||
"com.affine.page-properties.property.show-in-view": "在视图中显示",
|
||||
"com.affine.page-properties.property.tags": "标签",
|
||||
"com.affine.page-properties.property.text": "文本",
|
||||
"com.affine.page-properties.settings.title": "自定义属性",
|
||||
"com.affine.page-properties.tags.open-tags-page": "打开标签页面",
|
||||
"com.affine.page-properties.tags.selector-header-title": "选择或者创建一个标签",
|
||||
"com.affine.page.display": "显示",
|
||||
"com.affine.page.display.display-properties": "显示属性",
|
||||
"com.affine.page.display.display-properties.body-notes": "内容预览",
|
||||
"com.affine.page.display.grouping": "分组",
|
||||
"com.affine.page.display.grouping.group-by-favourites": "收藏",
|
||||
"com.affine.page.display.grouping.group-by-tag": "标签",
|
||||
"com.affine.page.display.grouping.no-grouping": "不分组",
|
||||
"com.affine.page.display.list-option": "选项列表",
|
||||
"com.affine.page.group-header.clear": "清除选择",
|
||||
"com.affine.page.group-header.favourited": "已收藏",
|
||||
"com.affine.page.group-header.not-favourited": "未收藏",
|
||||
"com.affine.page.group-header.select-all": "全选",
|
||||
"com.affine.page.toolbar.selected": "已选择 <0>{{count}}</0> 个",
|
||||
"com.affine.page.toolbar.selected_one": "已选中 <0>{{count}}</0> 个页面",
|
||||
"com.affine.page.toolbar.selected_others": "已选中 <0>{{count}}</0> 个页面",
|
||||
"com.affine.pageMode": "页面模式",
|
||||
"com.affine.page.toolbar.selected": "已选择 <0>{{count}}</0> 篇文档",
|
||||
"com.affine.page.toolbar.selected_one": "已选中 <0>{{count}}</0> 篇文档",
|
||||
"com.affine.page.toolbar.selected_other": "已选中 <0>{{count}}</0> 篇文档",
|
||||
"com.affine.page.toolbar.selected_others": "已选中 <0>{{count}}</0> 篇文档",
|
||||
"com.affine.pageMode": "文档模式",
|
||||
"com.affine.pageMode.all": "全部",
|
||||
"com.affine.pageMode.edgeless": "无界",
|
||||
"com.affine.pageMode.page": "页面",
|
||||
@@ -704,6 +841,7 @@
|
||||
"com.affine.payment.benefit-4": "{{capacity}} 的云存储",
|
||||
"com.affine.payment.benefit-5": "{{capacity}} 的最大文件大小",
|
||||
"com.affine.payment.benefit-6": "每个工作区的成员数量 ≤ {{capacity}}",
|
||||
"com.affine.payment.benefit-7": "{{capacity}} 日的历史版本记录",
|
||||
"com.affine.payment.billing-setting.cancel-subscription": "取消订阅",
|
||||
"com.affine.payment.billing-setting.cancel-subscription.description": "订阅已取消,您的 Pro 账户将在 {{cancelDate}} 到期",
|
||||
"com.affine.payment.billing-setting.change-plan": "更改计划",
|
||||
@@ -729,6 +867,12 @@
|
||||
"com.affine.payment.billing-setting.upgrade": "升级",
|
||||
"com.affine.payment.billing-setting.view-invoice": "查看发票",
|
||||
"com.affine.payment.billing-setting.year": "年",
|
||||
"com.affine.payment.blob-limit.description.local": "本地工作区的最大文件上传大小为 {{quota}}。",
|
||||
"com.affine.payment.blob-limit.description.member": "您加入的此工作区的最大文件上传大小为 {{quota}}。 您可以联系该工作区的所有者。",
|
||||
"com.affine.payment.blob-limit.description.owner.free": "{{planName}} 用户可以上传最大大小为 {{currentQuota}} 的文件。 您可以升级帐户以解锁最大文件大小 {{upgradeQuota}}。",
|
||||
"com.affine.payment.blob-limit.description.owner.pro": "{{planName}} 用户可以上传最大大小为 {{quota}} 的文件。",
|
||||
"com.affine.payment.blob-limit.title": "您已达到存储极限",
|
||||
"com.affine.payment.book-a-demo": "预订 Demo",
|
||||
"com.affine.payment.buy-pro": "购买专业版",
|
||||
"com.affine.payment.change-to": "切换到 {{to}} 计费",
|
||||
"com.affine.payment.contact-sales": "联系销售",
|
||||
@@ -743,6 +887,11 @@
|
||||
"com.affine.payment.dynamic-benefit-3": "按座位付费,适应所有团队规模。",
|
||||
"com.affine.payment.dynamic-benefit-4": "针对专门需求的解决方案和最佳实践。",
|
||||
"com.affine.payment.dynamic-benefit-5": "嵌入式与IT支持的询问。",
|
||||
"com.affine.payment.member-limit.free.confirm": "升级",
|
||||
"com.affine.payment.member-limit.free.description": "每个 {{planName}} 用户最多可以邀请 {{quota}} 个成员加入他们的工作区。 您可以升级您的帐户以解锁更多名额。",
|
||||
"com.affine.payment.member-limit.pro.confirm": "知道了",
|
||||
"com.affine.payment.member-limit.pro.description": "每个 {{planName}} 用户最多可以邀请 {{quota}} 个成员加入他们的工作区。 如果您想继续添加协作成员,可以创建新的工作区。",
|
||||
"com.affine.payment.member-limit.title": "成员数量已达到极限",
|
||||
"com.affine.payment.member.description": "在此处管理成员。{{planName}} 用户可以邀请最多 {{memberLimit}} 人。",
|
||||
"com.affine.payment.member.description.go-upgrade": "前往升级",
|
||||
"com.affine.payment.modal.change.cancel": "取消",
|
||||
@@ -766,6 +915,10 @@
|
||||
"com.affine.payment.resume-renewal": "恢复自动续费",
|
||||
"com.affine.payment.see-all-plans": "查看所有计划",
|
||||
"com.affine.payment.sign-up-free": "免费注册",
|
||||
"com.affine.payment.storage-limit.description.member": "云存储空间不足。 请联系该工作区的所有者。",
|
||||
"com.affine.payment.storage-limit.description.owner": "云存储空间不足。 您可以升级您的帐户以解锁更多云存储空间。",
|
||||
"com.affine.payment.storage-limit.title": "同步失败",
|
||||
"com.affine.payment.storage-limit.view": "查看",
|
||||
"com.affine.payment.subscription.exist": "您已有订阅。",
|
||||
"com.affine.payment.subscription.go-to-subscribe": "订阅AFFiNE",
|
||||
"com.affine.payment.subtitle-active": "您目前处于 {{currentPlan}} 计划。如果您有任何问题,请联系我们的<3>客户支持</3>。",
|
||||
@@ -782,15 +935,19 @@
|
||||
"com.affine.payment.upgrade-success-page.title": "升级成功!",
|
||||
"com.affine.publicLinkDisableModal.button.cancel": "取消",
|
||||
"com.affine.publicLinkDisableModal.button.disable": "禁用",
|
||||
"com.affine.publicLinkDisableModal.description": "禁用此公共链接将阻止任何拥有此链接的人访问此页面。",
|
||||
"com.affine.publicLinkDisableModal.description": "禁用此公共链接将阻止任何拥有此链接的人访问此文档。",
|
||||
"com.affine.publicLinkDisableModal.title": "禁用公共链接",
|
||||
"com.affine.resetSyncStatus.button": "重置同步",
|
||||
"com.affine.resetSyncStatus.description": "此操作可能会修复一些同步问题。",
|
||||
"com.affine.rootAppSidebar.collections": "精选",
|
||||
"com.affine.rootAppSidebar.favorites": "收藏夹",
|
||||
"com.affine.rootAppSidebar.favorites.empty": "您可以将文档添加到您的收藏",
|
||||
"com.affine.rootAppSidebar.others": "其他",
|
||||
"com.affine.search-tags.placeholder": "在这输入...",
|
||||
"com.affine.selectPage.empty": "选择页面为空",
|
||||
"com.affine.selectPage.empty.tips": "没有页面标题包含 <1>{{search}}</1>",
|
||||
"com.affine.selectPage.selected": "已选中的页面",
|
||||
"com.affine.selectPage.title": "添加选中的页面",
|
||||
"com.affine.selectPage.empty.tips": "没有文档标题包含 <1>{{search}}</1>",
|
||||
"com.affine.selectPage.selected": "已选中的文档",
|
||||
"com.affine.selectPage.title": "添加选中的文档",
|
||||
"com.affine.setDBLocation.button.customize": "自定义",
|
||||
"com.affine.setDBLocation.button.defaultLocation": "默认位置",
|
||||
"com.affine.setDBLocation.description": "选择您要创建工作区的位置。工作区的数据默认情况下会保存在本地。",
|
||||
@@ -816,13 +973,14 @@
|
||||
"com.affine.settings.appearance": "外观",
|
||||
"com.affine.settings.appearance.border-style-description": "自定义客户端外观。",
|
||||
"com.affine.settings.appearance.date-format-description": "定制您的日期格式。",
|
||||
"com.affine.settings.appearance.full-width-description": "页面内容的最大显示量。",
|
||||
"com.affine.settings.appearance.full-width-description": "文档内容的最大显示量。",
|
||||
"com.affine.settings.appearance.language-description": "选择界面语言。",
|
||||
"com.affine.settings.appearance.start-week-description": "默认情况下,一周从星期日开始。",
|
||||
"com.affine.settings.appearance.window-frame-description": "自定义 Windows 客户端外观。",
|
||||
"com.affine.settings.auto-check-description": "如果启用,它将定期自动检查新版本。",
|
||||
"com.affine.settings.auto-download-description": "如果启用,新版本将自动下载到当前设备。",
|
||||
"com.affine.settings.email": "电子邮件",
|
||||
"com.affine.settings.email.action": "更改邮箱",
|
||||
"com.affine.settings.email.action.change": "更改邮箱",
|
||||
"com.affine.settings.email.action.verify": "验证邮箱",
|
||||
"com.affine.settings.member-tooltip": "启用 AFFiNE Cloud 以与他人协作",
|
||||
@@ -843,21 +1001,45 @@
|
||||
"com.affine.settings.storage.description": "检查或更改存储位置",
|
||||
"com.affine.settings.storage.description-alt": "检查或更改存储位置。点击路径以编辑位置。",
|
||||
"com.affine.settings.suggestion": "需要更多定制选项?您可以在社区中向我们推荐它们。",
|
||||
"com.affine.settings.suggestion-2": "喜欢我们的应用程序吗? <1>在 GitHub 给我们加星标</1>并<2>分享您的宝贵反馈</2>!",
|
||||
"com.affine.settings.translucent-style": "侧边栏的透明效果",
|
||||
"com.affine.settings.translucent-style-description": "在侧边栏使用半透明效果。",
|
||||
"com.affine.settings.workspace": "工作区",
|
||||
"com.affine.settings.workspace.description": "您可以在此处自定义您的工作区。",
|
||||
"com.affine.settings.workspace.experimental-features": "插件",
|
||||
"com.affine.settings.workspace.experimental-features.get-started": "开始使用",
|
||||
"com.affine.settings.workspace.experimental-features.header.plugins": "实验性功能",
|
||||
"com.affine.settings.workspace.experimental-features.prompt-disclaimer": "我已明确风险,并且愿意继续使用它。",
|
||||
"com.affine.settings.workspace.experimental-features.prompt-header": "您想使用处于实验阶段的插件系统吗?",
|
||||
"com.affine.settings.workspace.experimental-features.prompt-warning": "您即将启用一项实验性功能。 此功能仍在开发中,可能包含错误或行为不可预测。 请谨慎行事并自行承担风险。",
|
||||
"com.affine.settings.workspace.experimental-features.prompt-warning-title": "警告",
|
||||
"com.affine.settings.workspace.not-owner": "只有所有者才能编辑工作区头像和名称。更改将向所有人显示。",
|
||||
"com.affine.settings.workspace.preferences": "偏好设置",
|
||||
"com.affine.settings.workspace.properties": "属性",
|
||||
"com.affine.settings.workspace.properties.add_property": "添加属性",
|
||||
"com.affine.settings.workspace.properties.all": "全部",
|
||||
"com.affine.settings.workspace.properties.delete-property": "删除属性",
|
||||
"com.affine.settings.workspace.properties.delete-property-prompt": "“<1>{{ name }}</1>”性将从 {{ count }} 个文档中删除。 此操作无法撤消。",
|
||||
"com.affine.settings.workspace.properties.doc": "<0>{{count}}</0> 篇文档",
|
||||
"com.affine.settings.workspace.properties.doc_others": "<0>{{count}}</0> 篇文档",
|
||||
"com.affine.settings.workspace.properties.edit-property": "编辑属性",
|
||||
"com.affine.settings.workspace.properties.general-properties": "通用属性",
|
||||
"com.affine.settings.workspace.properties.header.subtitle": "管理工作区 <1>{{name}}</1> 属性",
|
||||
"com.affine.settings.workspace.properties.header.title": "属性",
|
||||
"com.affine.settings.workspace.properties.in-use": "使用中",
|
||||
"com.affine.settings.workspace.properties.required-properties": "必选属性",
|
||||
"com.affine.settings.workspace.properties.set-as-required": "设置为必选属性",
|
||||
"com.affine.settings.workspace.properties.unused": "未使用",
|
||||
"com.affine.settings.workspace.publish-tooltip": "启用 AFFiNE Cloud 以发布此 Workspace",
|
||||
"com.affine.settings.workspace.storage.tip": "点击可移动存储位置。",
|
||||
"com.affine.share-menu.EnableCloudDescription": "共享页面需要 AFFiNE Cloud 服务。",
|
||||
"com.affine.share-menu.EnableCloudDescription": "共享文档需要 AFFiNE Cloud 服务。",
|
||||
"com.affine.share-menu.ShareMode": "分享模式",
|
||||
"com.affine.share-menu.SharePage": "分享页面",
|
||||
"com.affine.share-menu.SharePage": "分享文档",
|
||||
"com.affine.share-menu.ShareViaExport": "通过导出分享",
|
||||
"com.affine.share-menu.ShareViaExportDescription": "下载页面的静态副本以与他人分享。",
|
||||
"com.affine.share-menu.ShareViaExportDescription": "下载文档的静态副本以与他人分享。",
|
||||
"com.affine.share-menu.ShareWithLink": "通过链接分享",
|
||||
"com.affine.share-menu.ShareWithLinkDescription": "创建一个链接,便于与任何人分享。访问者将以文档形式打开您的页面。",
|
||||
"com.affine.share-menu.SharedPage": "已分享页面",
|
||||
"com.affine.share-menu.ShareWithLinkDescription": "创建一个链接,便于与任何人分享。访问者将以文档形式打开您的文档。",
|
||||
"com.affine.share-menu.SharedPage": "已分享文档",
|
||||
"com.affine.share-menu.confirm-modify-mode.notification.fail.message": "请稍后再试。",
|
||||
"com.affine.share-menu.confirm-modify-mode.notification.fail.title": "修改失败",
|
||||
"com.affine.share-menu.confirm-modify-mode.notification.success.message": "您已将公共链接从 {{preMode}} 模式更改为 {{currentMode}} 模式。",
|
||||
@@ -869,38 +1051,66 @@
|
||||
"com.affine.share-menu.create-public-link.notification.success.title": "已创建公开分享链接",
|
||||
"com.affine.share-menu.disable-publish-link.notification.fail.message": "请稍后再试。",
|
||||
"com.affine.share-menu.disable-publish-link.notification.fail.title": "禁用公开分享链接失败",
|
||||
"com.affine.share-menu.disable-publish-link.notification.success.message": "这个页面不再公开分享了。",
|
||||
"com.affine.share-menu.disable-publish-link.notification.success.message": "这篇文档不再公开分享了。",
|
||||
"com.affine.share-menu.disable-publish-link.notification.success.title": "已禁用公开分享链接",
|
||||
"com.affine.share-menu.publish-to-web": "发布至网页",
|
||||
"com.affine.share-menu.publish-to-web.description": "允许任何人通过链接查看此页面的只读版本。",
|
||||
"com.affine.share-menu.publish-to-web.description": "允许任何人通过链接查看此文档的只读版本。",
|
||||
"com.affine.share-menu.share-privately": "私密分享",
|
||||
"com.affine.share-menu.share-privately.description": "只有此工作区的成员可以打开此链接。",
|
||||
"com.affine.share-menu.shareButton": "分享",
|
||||
"com.affine.share-menu.sharedButton": "已分享",
|
||||
"com.affine.share-page.footer.built-with": "构建于",
|
||||
"com.affine.share-page.footer.create-with": "创建于",
|
||||
"com.affine.share-page.footer.description": "使用 AffiNE Cloud 增强您的共享能力:一键文档共享",
|
||||
"com.affine.share-page.footer.get-started": "免费开始使用",
|
||||
"com.affine.share-page.header.present": "演示",
|
||||
"com.affine.shortcutsTitle.edgeless": "无界",
|
||||
"com.affine.shortcutsTitle.general": "常规",
|
||||
"com.affine.shortcutsTitle.markdownSyntax": "Markdown 语法",
|
||||
"com.affine.shortcutsTitle.page": "页面",
|
||||
"com.affine.sidebarSwitch.collapse": "折叠侧边栏",
|
||||
"com.affine.sidebarSwitch.expand": "展开侧边栏",
|
||||
"com.affine.star-affine.cancel": "稍后",
|
||||
"com.affine.star-affine.confirm": "在 GitHub 点亮星标",
|
||||
"com.affine.star-affine.description": "您觉得我们的应用程序有用且有趣吗? 我们希望得到您的支持,以不断进步! 帮助我们的一个好方法是在 GitHub 给我们一颗星。 这个简单的行动可以给我们很大的激励,并帮助我们继续为您提供最佳体验。",
|
||||
"com.affine.star-affine.title": "在 GitHub 为我们点亮星标",
|
||||
"com.affine.storage.change-plan": "更改",
|
||||
"com.affine.storage.disabled.hint": "AFFiNE Cloud 目前处于抢先体验阶段,不支持升级,请耐心等待我们的定价计划。",
|
||||
"com.affine.storage.extend.hint": "使用量已达到最大容量,AFFiNE Cloud 目前处于抢先体验阶段,不支持升级,请耐心等待我们的定价计划。",
|
||||
"com.affine.storage.extend.link": "点击以获取更多信息。",
|
||||
"com.affine.storage.maximum-tips": "您已达到当前账户的最大容量限制",
|
||||
"com.affine.storage.maximum-tips.pro": "Pro 用户在团队版 alpha 测试期间将拥有无限存储容量",
|
||||
"com.affine.storage.plan": "计划",
|
||||
"com.affine.storage.title": "AFFiNE Cloud 存储",
|
||||
"com.affine.storage.upgrade": "升级",
|
||||
"com.affine.storage.used.hint": "已使用空间",
|
||||
"com.affine.tag.toolbar.selected": "已选择 <0>{{count}}</0> 个标签",
|
||||
"com.affine.tag.toolbar.selected_one": "已选择 <0>{{count}}</0> 个标签",
|
||||
"com.affine.tag.toolbar.selected_other": "已选择 <0>{{count}}</0> 个标签",
|
||||
"com.affine.tag.toolbar.selected_others": "已选择 <0>{{count}}</0> 个标签",
|
||||
"com.affine.tags.count": "{{count}} 篇文档",
|
||||
"com.affine.tags.count_one": "{{count}} 篇文档",
|
||||
"com.affine.tags.count_other": "{{count}} 篇文档",
|
||||
"com.affine.tags.count_zero": "{{count}} 篇文档",
|
||||
"com.affine.tags.create-tag.placeholder": "在这输入标签名称...",
|
||||
"com.affine.tags.create-tag.toast.exist": "标签已存在",
|
||||
"com.affine.tags.create-tag.toast.success": "已创建标签",
|
||||
"com.affine.tags.delete-tags.toast": "标签已删除",
|
||||
"com.affine.tags.edit-tag.toast.success": "标签已更新",
|
||||
"com.affine.tags.empty.new-tag-button": "新建标签",
|
||||
"com.affine.telemetry.enable": "启用遥测",
|
||||
"com.affine.telemetry.enable.desc": "遥测功能使我们能够收集有关您如何使用该应用程序的数据。 这些数据有助于我们改进应用程序并提供更好的功能。",
|
||||
"com.affine.themeSettings.dark": "深色",
|
||||
"com.affine.themeSettings.light": "浅色",
|
||||
"com.affine.themeSettings.system": "跟随系统",
|
||||
"com.affine.toastMessage.addLinkedPage": "已成功添加链接文档",
|
||||
"com.affine.toastMessage.addedFavorites": "已添加到收藏夹",
|
||||
"com.affine.toastMessage.edgelessMode": "无界模式",
|
||||
"com.affine.toastMessage.movedTrash": "已移动到垃圾箱",
|
||||
"com.affine.toastMessage.pageMode": "页面模式",
|
||||
"com.affine.toastMessage.permanentlyDeleted": "已永久删除",
|
||||
"com.affine.toastMessage.removedFavorites": "已从收藏中移除",
|
||||
"com.affine.toastMessage.rename": "更名成功",
|
||||
"com.affine.toastMessage.restored": "{{title}} 已恢复",
|
||||
"com.affine.toastMessage.successfullyDeleted": "删除成功",
|
||||
"com.affine.today": "今天",
|
||||
@@ -921,6 +1131,12 @@
|
||||
"com.affine.upgrade.tips.done": "升级工作区数据后,请刷新页面以查看更改。",
|
||||
"com.affine.upgrade.tips.error": "在升级工作区数据时遇到了一些错误。",
|
||||
"com.affine.upgrade.tips.normal": "为确保与更新后的 AFFiNE 客户端兼容,请点击下方的“升级工作区数据”按钮进行数据升级。",
|
||||
"com.affine.workbench.split-view-menu.close": "关闭",
|
||||
"com.affine.workbench.split-view-menu.full-screen": "全屏",
|
||||
"com.affine.workbench.split-view-menu.keep-this-one": "单独视窗",
|
||||
"com.affine.workbench.split-view-menu.move-left": "移至左侧",
|
||||
"com.affine.workbench.split-view-menu.move-right": "移至右侧",
|
||||
"com.affine.workbench.split-view.page-menu-open": "在分割视图中打开",
|
||||
"com.affine.workspace.cannot-delete": "您无法删除最后一个工作区",
|
||||
"com.affine.workspace.cloud": "云工作区",
|
||||
"com.affine.workspace.cloud.account.logout": "退出登录",
|
||||
@@ -941,11 +1157,12 @@
|
||||
"com.affine.workspaceLeave.button.leave": "退出",
|
||||
"com.affine.workspaceLeave.description": "离开后,您将无法访问此工作区的内容。",
|
||||
"com.affine.workspaceList.addWorkspace.create": "创建工作区",
|
||||
"com.affine.workspaceList.addWorkspace.create-cloud": "创建云端工作区",
|
||||
"com.affine.workspaceList.workspaceListType.cloud": "云同步",
|
||||
"com.affine.workspaceList.workspaceListType.local": "本地储存",
|
||||
"com.affine.workspaceSubPath.all": "全部页面",
|
||||
"com.affine.workspaceSubPath.all": "全部文档",
|
||||
"com.affine.workspaceSubPath.trash": "回收站",
|
||||
"com.affine.workspaceSubPath.trash.empty-description": "已删除的页面将显示在此处。",
|
||||
"com.affine.workspaceSubPath.trash.empty-description": "已删除的文档将显示在此处。",
|
||||
"com.affine.workspaceType.cloud": "云端工作区",
|
||||
"com.affine.workspaceType.joined": "加入的工作区",
|
||||
"com.affine.workspaceType.local": "本地工作区",
|
||||
@@ -954,11 +1171,11 @@
|
||||
"com.affine.yesterday": "昨天",
|
||||
"core": "核心",
|
||||
"dark": "深色",
|
||||
"emptyAllPages": "点击<1>$t(New Page)</1>按钮创建您的第一个页面。",
|
||||
"emptyAllPagesClient": "点击 <1>$t(New Page)</1> 按钮或按 <3>{{shortcut}}</3> 以创建您的第一个页面。",
|
||||
"emptyFavorite": "点击添加到收藏夹,页面将出现在这里。",
|
||||
"emptySharedPages": "共享的页面将显示在此处。",
|
||||
"emptyTrash": "点击添加到垃圾箱,页面将出现在这里。",
|
||||
"emptyAllPages": "点击<1>$t(New Page)</1>按钮创建您的第一篇文档。",
|
||||
"emptyAllPagesClient": "点击 <1>$t(New Page)</1> 按钮或按 <3>{{shortcut}}</3> 以创建您的第一篇文档。",
|
||||
"emptyFavorite": "点击添加到收藏,文档将出现在这里。",
|
||||
"emptySharedPages": "共享的文档将显示在此处。",
|
||||
"emptyTrash": "点击添加到垃圾箱,文档将出现在这里。",
|
||||
"frameless": "无边框",
|
||||
"invited you to join": "邀请您加入",
|
||||
"is a Cloud Workspace": "是云端工作区",
|
||||
@@ -972,6 +1189,7 @@
|
||||
"restored": "{{title}} 已恢复",
|
||||
"still designed": "(此页面仍在设计中。)",
|
||||
"system": "跟随系统",
|
||||
"unnamed": "未命名",
|
||||
"upgradeBrowser": "请升级至最新版Chrome浏览器以获得最佳体验。",
|
||||
"will be moved to Trash": "{{title}} 将被移到垃圾箱",
|
||||
"will delete member": "将删除成员"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"404 - Page Not Found": "404 - 搵唔到搜尋的網頁",
|
||||
"AFFiNE Cloud": "\nAFFiNE Cloud",
|
||||
"AFFiNE Community": "AFFiNE 社群",
|
||||
@@ -336,18 +337,20 @@
|
||||
"com.affine.auth.reset.password": "重設密碼",
|
||||
"com.affine.auth.reset.password.message": "您將收到一封電子郵件,其中包含重設密碼的連結。請檢查您的收件箱。",
|
||||
"com.affine.auth.reset.password.page.title": "重設您的 AFFiNE Cloud 密碼",
|
||||
"com.affine.auth.send.verify.email.hint": "發送驗證連結",
|
||||
"com.affine.auth.send.change.email.link": "發送驗證連結",
|
||||
"com.affine.auth.send.reset.password.link": "發送重設連結",
|
||||
"com.affine.auth.send.set.password.link": "發送設定連結",
|
||||
"com.affine.auth.send.verify.email.hint": "發送驗證連結",
|
||||
"com.affine.auth.sent": "已發送",
|
||||
"com.affine.auth.sent.verify.email.hint": "驗證連結已發送。",
|
||||
"com.affine.auth.sent.change.email.hint": "驗證連結已發送。",
|
||||
"com.affine.auth.sent.change.password.hint": "重設密碼連結已發送。",
|
||||
"com.affine.auth.sent.set.password.hint": "設定密碼連結已發送。",
|
||||
"com.affine.auth.sent.verify.email.hint": "驗證連結已發送。",
|
||||
"com.affine.auth.set.email.save": "保存電子郵件地址",
|
||||
"com.affine.auth.set.password": "設定密碼",
|
||||
"com.affine.auth.set.password.message": "請設定由 {{min}}-{{max}} 位字母和數字組成的密碼",
|
||||
"com.affine.auth.set.password.message.minlength": "至少 {{min}} 位字符",
|
||||
"com.affine.auth.set.password.message.maxlength": "至多 {{max}} 位字符",
|
||||
"com.affine.auth.set.password.message.minlength": "至少 {{min}} 位字符",
|
||||
"com.affine.auth.set.password.page.success": "成功設定密碼",
|
||||
"com.affine.auth.set.password.page.title": "重定您的 AFFiNE Cloud 密碼",
|
||||
"com.affine.auth.set.password.placeholder": "設定至少包含 {{min}} 位字符的密碼",
|
||||
@@ -440,6 +443,7 @@
|
||||
"com.affine.settings.auto-check-description": "若啟用,將定期自動檢測新版本。",
|
||||
"com.affine.settings.auto-download-description": "若啟用,將自動下載新版本。",
|
||||
"com.affine.settings.email": "電子郵件地址",
|
||||
"com.affine.settings.email.action": "更改電子郵件地址",
|
||||
"com.affine.settings.email.action.change": "更改電子郵件地址",
|
||||
"com.affine.settings.email.action.verify": "验证電子郵件地址",
|
||||
"com.affine.settings.member-tooltip": "啟用 AFFiNE Cloud 以與他人協作",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"@affine/component": "workspace:*",
|
||||
"@affine/core": "workspace:*",
|
||||
"@affine/env": "workspace:*",
|
||||
"@juggle/resize-observer": "^3.4.0",
|
||||
"@sentry/react": "^7.108.0",
|
||||
"core-js": "^3.36.1",
|
||||
"intl-segmenter-polyfill-rs": "^0.1.7",
|
||||
"jotai": "^2.7.1",
|
||||
|
||||
@@ -1,13 +1,24 @@
|
||||
import './polyfill/dispose';
|
||||
import './polyfill/intl-segmenter';
|
||||
import './polyfill/request-idle-callback';
|
||||
import './polyfill/resize-observer';
|
||||
import '@affine/core/bootstrap/preload';
|
||||
|
||||
import { setup } from '@affine/core/bootstrap/setup';
|
||||
import { performanceLogger } from '@affine/core/shared';
|
||||
import { isDesktop } from '@affine/env/constant';
|
||||
import { StrictMode } from 'react';
|
||||
import {
|
||||
init,
|
||||
reactRouterV6BrowserTracingIntegration,
|
||||
replayIntegration,
|
||||
setTags,
|
||||
} from '@sentry/react';
|
||||
import { StrictMode, useEffect } from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
import {
|
||||
createRoutesFromChildren,
|
||||
matchRoutes,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
} from 'react-router-dom';
|
||||
|
||||
import { App } from './app';
|
||||
|
||||
@@ -20,7 +31,27 @@ function main() {
|
||||
performanceMainLogger.info('skip setup');
|
||||
} else {
|
||||
performanceMainLogger.info('setup start');
|
||||
setup();
|
||||
if (window.SENTRY_RELEASE || environment.isDebug) {
|
||||
// https://docs.sentry.io/platforms/javascript/guides/react/#configure
|
||||
init({
|
||||
dsn: process.env.SENTRY_DSN,
|
||||
environment: process.env.BUILD_TYPE ?? 'development',
|
||||
integrations: [
|
||||
reactRouterV6BrowserTracingIntegration({
|
||||
useEffect,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
createRoutesFromChildren,
|
||||
matchRoutes,
|
||||
}),
|
||||
replayIntegration(),
|
||||
],
|
||||
});
|
||||
setTags({
|
||||
appVersion: runtimeConfig.appVersion,
|
||||
editorVersion: runtimeConfig.editorVersion,
|
||||
});
|
||||
}
|
||||
performanceMainLogger.info('setup done');
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
import { ResizeObserver } from '@juggle/resize-observer';
|
||||
|
||||
// prevents the following error in development mode:
|
||||
// ResizeOvserver loop limit exceeded
|
||||
// https://github.com/petyosi/react-virtuoso/issues/875#issuecomment-1962897033
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
window.ResizeObserver = ResizeObserver;
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
[toolchain]
|
||||
channel = "1.76.0"
|
||||
channel = "1.77.0"
|
||||
profile = "default"
|
||||
|
||||
@@ -27,8 +27,10 @@ const config: PlaywrightTestConfig = {
|
||||
port: 8080,
|
||||
timeout: 120 * 1000,
|
||||
reuseExistingServer: !process.env.CI,
|
||||
stdout: 'pipe',
|
||||
env: {
|
||||
COVERAGE: process.env.COVERAGE || 'false',
|
||||
DISTRIBUTION: 'desktop',
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -74,7 +74,8 @@ test('allow creation of filters by favorite', async ({ page }) => {
|
||||
await openHomePage(page);
|
||||
await waitForEditorLoad(page);
|
||||
await clickSideBarAllPageButton(page);
|
||||
await createFirstFilter(page, 'Favourited');
|
||||
// playwright first language is en-US
|
||||
await createFirstFilter(page, 'Favorited');
|
||||
await page
|
||||
.locator('[data-testid="filter-arg"]', { hasText: 'true' })
|
||||
.locator('div')
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import './polyfill';
|
||||
import '@affine/component/theme/global.css';
|
||||
import '@affine/component/theme/theme.css';
|
||||
import '@affine/core/bootstrap/preload';
|
||||
import { createI18n } from '@affine/i18n';
|
||||
import { ThemeProvider, useTheme } from 'next-themes';
|
||||
import { useDarkMode } from 'storybook-dark-mode';
|
||||
@@ -12,7 +13,6 @@ import { setupGlobal, type Environment } from '@affine/env/global';
|
||||
|
||||
import type { Preview } from '@storybook/react';
|
||||
import { useLayoutEffect, useRef } from 'react';
|
||||
import { setup } from '@affine/core/bootstrap/setup';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { ServiceCollection } from '@toeverything/infra';
|
||||
import {
|
||||
@@ -81,7 +81,6 @@ const provider = services.provider();
|
||||
|
||||
const store = createStore();
|
||||
_setCurrentStore(store);
|
||||
setup();
|
||||
|
||||
provider
|
||||
.get(WorkspaceManager)
|
||||
|
||||
@@ -42,11 +42,17 @@ function useRegisterCommands() {
|
||||
languageHelper: {
|
||||
onLanguageChange: () => {},
|
||||
languagesList: [
|
||||
{ tag: 'en', name: 'English', originalName: 'English' },
|
||||
{
|
||||
tag: 'en',
|
||||
name: 'English',
|
||||
originalName: 'English',
|
||||
Completeness: 1,
|
||||
},
|
||||
{
|
||||
tag: 'zh-Hans',
|
||||
name: 'Simplified Chinese',
|
||||
originalName: '简体中文',
|
||||
Completeness: 1,
|
||||
},
|
||||
],
|
||||
currentLanguage: undefined,
|
||||
|
||||
@@ -12,7 +12,8 @@ import { watchI18N } from '../util/i18n.js';
|
||||
import { createWebpackConfig } from '../webpack/webpack.config.js';
|
||||
|
||||
const flags: BuildFlags = {
|
||||
distribution: 'browser',
|
||||
distribution:
|
||||
(process.env.DISTRIBUTION as BuildFlags['distribution']) ?? 'browser',
|
||||
mode: 'development',
|
||||
channel: 'canary',
|
||||
coverage: process.env.COVERAGE === 'true',
|
||||
@@ -132,6 +133,8 @@ if (buildFlags.debugBlockSuite) {
|
||||
flags.localBlockSuite = localBlockSuite;
|
||||
}
|
||||
|
||||
console.info(flags);
|
||||
|
||||
watchI18N();
|
||||
|
||||
try {
|
||||
|
||||
402
yarn.lock
402
yarn.lock
@@ -341,6 +341,7 @@ __metadata:
|
||||
"@emotion/react": "npm:^11.11.3"
|
||||
"@emotion/server": "npm:^11.11.0"
|
||||
"@emotion/styled": "npm:^11.11.0"
|
||||
"@juggle/resize-observer": "npm:^3.4.0"
|
||||
"@marsidev/react-turnstile": "npm:^0.5.3"
|
||||
"@perfsee/webpack": "npm:^1.12.2"
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "npm:^0.5.11"
|
||||
@@ -351,8 +352,8 @@ __metadata:
|
||||
"@radix-ui/react-select": "npm:^2.0.0"
|
||||
"@radix-ui/react-toolbar": "npm:^1.0.4"
|
||||
"@react-hookz/web": "npm:^24.0.4"
|
||||
"@sentry/integrations": "npm:^7.102.1"
|
||||
"@sentry/react": "npm:^7.102.1"
|
||||
"@sentry/integrations": "npm:^7.108.0"
|
||||
"@sentry/react": "npm:^7.108.0"
|
||||
"@sentry/webpack-plugin": "npm:^2.14.2"
|
||||
"@swc/core": "npm:^1.4.8"
|
||||
"@testing-library/react": "npm:^14.2.1"
|
||||
@@ -464,7 +465,10 @@ __metadata:
|
||||
"@electron-forge/plugin-auto-unpack-natives": "npm:^7.3.0"
|
||||
"@electron-forge/shared-types": "npm:^7.3.0"
|
||||
"@emotion/react": "npm:^11.11.4"
|
||||
"@pengx17/electron-forge-maker-appimage": "npm:^1.1.1"
|
||||
"@pengx17/electron-forge-maker-appimage": "npm:^1.2.0"
|
||||
"@sentry/electron": "npm:^4.21.0"
|
||||
"@sentry/esbuild-plugin": "npm:^2.16.0"
|
||||
"@sentry/react": "npm:^7.108.0"
|
||||
"@toeverything/infra": "workspace:*"
|
||||
"@types/uuid": "npm:^9.0.8"
|
||||
"@vitejs/plugin-react-swc": "npm:^3.6.0"
|
||||
@@ -824,7 +828,7 @@ __metadata:
|
||||
"@affine/component": "workspace:*"
|
||||
"@affine/core": "workspace:*"
|
||||
"@affine/env": "workspace:*"
|
||||
"@juggle/resize-observer": "npm:^3.4.0"
|
||||
"@sentry/react": "npm:^7.108.0"
|
||||
"@types/react": "npm:^18.2.60"
|
||||
"@types/react-dom": "npm:^18.2.19"
|
||||
core-js: "npm:^3.36.1"
|
||||
@@ -1888,7 +1892,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1":
|
||||
"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.23.5, @babel/code-frame@npm:^7.24.1, @babel/code-frame@npm:^7.24.2":
|
||||
version: 7.24.2
|
||||
resolution: "@babel/code-frame@npm:7.24.2"
|
||||
dependencies:
|
||||
@@ -1928,30 +1932,30 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.22.5, @babel/core@npm:^7.22.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9, @babel/core@npm:^7.7.5":
|
||||
version: 7.23.9
|
||||
resolution: "@babel/core@npm:7.23.9"
|
||||
"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.14.0, @babel/core@npm:^7.18.5, @babel/core@npm:^7.18.9, @babel/core@npm:^7.20.12, @babel/core@npm:^7.22.5, @babel/core@npm:^7.22.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.5, @babel/core@npm:^7.23.9, @babel/core@npm:^7.7.5":
|
||||
version: 7.24.3
|
||||
resolution: "@babel/core@npm:7.24.3"
|
||||
dependencies:
|
||||
"@ampproject/remapping": "npm:^2.2.0"
|
||||
"@babel/code-frame": "npm:^7.23.5"
|
||||
"@babel/generator": "npm:^7.23.6"
|
||||
"@babel/code-frame": "npm:^7.24.2"
|
||||
"@babel/generator": "npm:^7.24.1"
|
||||
"@babel/helper-compilation-targets": "npm:^7.23.6"
|
||||
"@babel/helper-module-transforms": "npm:^7.23.3"
|
||||
"@babel/helpers": "npm:^7.23.9"
|
||||
"@babel/parser": "npm:^7.23.9"
|
||||
"@babel/template": "npm:^7.23.9"
|
||||
"@babel/traverse": "npm:^7.23.9"
|
||||
"@babel/types": "npm:^7.23.9"
|
||||
"@babel/helpers": "npm:^7.24.1"
|
||||
"@babel/parser": "npm:^7.24.1"
|
||||
"@babel/template": "npm:^7.24.0"
|
||||
"@babel/traverse": "npm:^7.24.1"
|
||||
"@babel/types": "npm:^7.24.0"
|
||||
convert-source-map: "npm:^2.0.0"
|
||||
debug: "npm:^4.1.0"
|
||||
gensync: "npm:^1.0.0-beta.2"
|
||||
json5: "npm:^2.2.3"
|
||||
semver: "npm:^6.3.1"
|
||||
checksum: 10/268cdbb86bef1b8ea5b1300f2f325e56a1740a5051360cb228ffeaa0f80282b6674f3a2b4d6466adb0691183759b88d4c37b4a4f77232c84a49ed771c84cdc27
|
||||
checksum: 10/3a7b9931fe0d93c500dcdb6b36f038b0f9d5090c048818e62aa8321c8f6e8ccc3d47373f0b40591c1fe3b13e5096bacabb1ade83f9f4d86f57878c39a9d1ade1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.18.2, @babel/generator@npm:^7.22.5, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2":
|
||||
"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.18.2, @babel/generator@npm:^7.22.5, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.24.1, @babel/generator@npm:^7.7.2":
|
||||
version: 7.24.1
|
||||
resolution: "@babel/generator@npm:7.24.1"
|
||||
dependencies:
|
||||
@@ -2201,14 +2205,14 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/helpers@npm:^7.18.2, @babel/helpers@npm:^7.23.9":
|
||||
version: 7.23.9
|
||||
resolution: "@babel/helpers@npm:7.23.9"
|
||||
"@babel/helpers@npm:^7.18.2, @babel/helpers@npm:^7.24.1":
|
||||
version: 7.24.1
|
||||
resolution: "@babel/helpers@npm:7.24.1"
|
||||
dependencies:
|
||||
"@babel/template": "npm:^7.23.9"
|
||||
"@babel/traverse": "npm:^7.23.9"
|
||||
"@babel/types": "npm:^7.23.9"
|
||||
checksum: 10/dd56daac8bbd7ed174bb00fd185926fd449e591d9a00edaceb7ac6edbdd7a8db57e2cb365b4fafda382201752789ced2f7ae010f667eab0f198a4571cda4d2c5
|
||||
"@babel/template": "npm:^7.24.0"
|
||||
"@babel/traverse": "npm:^7.24.1"
|
||||
"@babel/types": "npm:^7.24.0"
|
||||
checksum: 10/82d3cdd3beafc4583f237515ef220bc205ced8b0540c6c6e191fc367a9589bd7304b8f9800d3d7574d4db9f079bd555979816b1874c86e53b3e7dd2032ad6c7c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2224,7 +2228,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.10.3, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.18.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.1":
|
||||
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.10.3, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.18.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.6, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.0, @babel/parser@npm:^7.24.1":
|
||||
version: 7.24.1
|
||||
resolution: "@babel/parser@npm:7.24.1"
|
||||
bin:
|
||||
@@ -3406,18 +3410,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/template@npm:^7.16.7, @babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3":
|
||||
version: 7.23.9
|
||||
resolution: "@babel/template@npm:7.23.9"
|
||||
"@babel/template@npm:^7.16.7, @babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.24.0, @babel/template@npm:^7.3.3":
|
||||
version: 7.24.0
|
||||
resolution: "@babel/template@npm:7.24.0"
|
||||
dependencies:
|
||||
"@babel/code-frame": "npm:^7.23.5"
|
||||
"@babel/parser": "npm:^7.23.9"
|
||||
"@babel/types": "npm:^7.23.9"
|
||||
checksum: 10/1b011ba9354dc2e646561d54b6862e0df51760e6179faadd79be05825b0b6da04911e4e192df943f1766748da3037fd8493615b38707f7cadb0cf0c96601c170
|
||||
"@babel/parser": "npm:^7.24.0"
|
||||
"@babel/types": "npm:^7.24.0"
|
||||
checksum: 10/8c538338c7de8fac8ada691a5a812bdcbd60bd4a4eb5adae2cc9ee19773e8fb1a724312a00af9e1ce49056ffd3c3475e7287b5668cf6360bfb3f8ac827a06ffe
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/traverse@npm:^7.10.3, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.5, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.23.9":
|
||||
"@babel/traverse@npm:^7.10.3, @babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.18.5, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.23.2, @babel/traverse@npm:^7.24.1":
|
||||
version: 7.24.1
|
||||
resolution: "@babel/traverse@npm:7.24.1"
|
||||
dependencies:
|
||||
@@ -3435,7 +3439,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.10.3, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.4, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
|
||||
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.10.3, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.4, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.4, @babel/types@npm:^7.23.6, @babel/types@npm:^7.24.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3":
|
||||
version: 7.24.0
|
||||
resolution: "@babel/types@npm:7.24.0"
|
||||
dependencies:
|
||||
@@ -9512,14 +9516,14 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@pengx17/electron-forge-maker-appimage@npm:^1.1.1":
|
||||
version: 1.1.1
|
||||
resolution: "@pengx17/electron-forge-maker-appimage@npm:1.1.1"
|
||||
"@pengx17/electron-forge-maker-appimage@npm:^1.2.0":
|
||||
version: 1.2.0
|
||||
resolution: "@pengx17/electron-forge-maker-appimage@npm:1.2.0"
|
||||
dependencies:
|
||||
"@electron-forge/maker-base": "npm:^7.3.0"
|
||||
"@electron-forge/shared-types": "npm:^7.3.0"
|
||||
app-builder-lib: "npm:^24.13.3"
|
||||
checksum: 10/6c9b785f3fa8582c8eaa78d571582a75b1ba07da65f56f576b2b156522decbc5a2fcaeea4fbad8fd035897c8a46e6ff74b617c637f754b596dbf89925b00d1ac
|
||||
checksum: 10/f5e8927810b5381462ec2cde8fcbbaab74b66e025e549d49707c1d855a9618c1b88bf136a4a0df9bc2b80a19ea136443115c462feb2a5b8b0311ec6c6c0ea1fa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -11215,37 +11219,71 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry-internal/feedback@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry-internal/feedback@npm:7.102.1"
|
||||
"@sentry-internal/feedback@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry-internal/feedback@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
checksum: 10/1d7157f62844d8c06d59941c8fed48fd7987a7b76eaf81666d071ebefe4fc9fc6e43ced902725964191b613062f71f1bd98b99a199449aa2f5b187e90abb7568
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/80045c253681cd34a83338c21cc99e4a7b0f882032e6f682bc5395b87ad36758cefd129acafb5ae3747b7d12ec12effaef2728eea85a184fe27177b01a4186fa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry-internal/replay-canvas@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry-internal/replay-canvas@npm:7.102.1"
|
||||
"@sentry-internal/feedback@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry-internal/feedback@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/replay": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
checksum: 10/737a437925267bb0296b8d1d742cfee2154fdf6dd1ad13a9148a658b98d5c19dbbfbd85014770e704d6a36d802e59370761185e23c69eadfefcde74fc08e95a6
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
checksum: 10/74cba185f9bde1e4e2405061684b8380157c30c9e4ecf51d94c94dcfeb922f2fa2e3b1c62569f8cd19b78d8f8abefd70bf3d319093a02b74956a9987747e1524
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry-internal/tracing@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry-internal/tracing@npm:7.102.1"
|
||||
"@sentry-internal/replay-canvas@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry-internal/replay-canvas@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
checksum: 10/5577d8cdd92187ebfe4213d52c3fa13d013528d04b09d63c112a0460c5a1c9d6d890653c0379e30fdff9d324894f85931551bda1a9734c02ac6b26b70a806562
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/replay": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/c4c53d252c01b98b593ee2643ededd2e8ae53054e4fe712915f1440e2c643c4c8b462ac28f7fd6588db28271b4967f55fa727c19eef4074cfe0f70afee3ae18d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry-internal/replay-canvas@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry-internal/replay-canvas@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/replay": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
checksum: 10/2a992b140ba7fc0cd37c4cf94f9b4d36bed8534f730480520b29c53a03bcf8f52407ec9f340ff407c924cd7f9fbd7c881278387271eda99913c41375fbe58815
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry-internal/tracing@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry-internal/tracing@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/c04eb7edf4a82650c728ac09d9b4e6673dbf914bf83953111bf1bc31225401381d959edabeb4a272d4b395247b0744e8460fd130bbbfae74120c43bcf74f00aa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry-internal/tracing@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry-internal/tracing@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
checksum: 10/dde3c07650b0a0b4f3c7be3da8bcb6d2731333bca28de99afed3b9179f80917af871a9ab2fe78fa91fe895baa55e0aba375806be869589f4aa34bd30bdf5b145
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -11256,18 +11294,40 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/browser@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/browser@npm:7.102.1"
|
||||
"@sentry/babel-plugin-component-annotate@npm:2.16.0":
|
||||
version: 2.16.0
|
||||
resolution: "@sentry/babel-plugin-component-annotate@npm:2.16.0"
|
||||
checksum: 10/e1f7d4250c2973f41e57eb89db29db383ef3b68c4c7c7f0b059209bf61dc0857169044d0802d0294086903725a96e81bb27825d5656c9dfe100ca51a44965092
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/browser@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry/browser@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry-internal/feedback": "npm:7.102.1"
|
||||
"@sentry-internal/replay-canvas": "npm:7.102.1"
|
||||
"@sentry-internal/tracing": "npm:7.102.1"
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/replay": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
checksum: 10/709b3d74ad115801e3e3934f1bc56e160c9e963ac34c68dc971dc5dfad0bf1ad64c1da8a84b5297c11e3d39046412443c1e9802a5eb6ebcf588bdd85d2823f89
|
||||
"@sentry-internal/feedback": "npm:7.107.0"
|
||||
"@sentry-internal/replay-canvas": "npm:7.107.0"
|
||||
"@sentry-internal/tracing": "npm:7.107.0"
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/replay": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/befa7fc976c258ac2b94ae16156e07219a393023dd5b086e15bc1711ee623909b627893c8d2b039639ebfd3a38f49b828e5091035774b2570c8edc4b85ab59a7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/browser@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/browser@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry-internal/feedback": "npm:7.108.0"
|
||||
"@sentry-internal/replay-canvas": "npm:7.108.0"
|
||||
"@sentry-internal/tracing": "npm:7.108.0"
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/replay": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
checksum: 10/3d2eb11ba8c4374c0e84e7e8555cca15e2acb24ccb8723279c7a139ce88de2dc5b5fc78cbbb35188f646ec72fa4c91a6ef00246ccbc8a2a25e6642929722eddb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -11287,6 +11347,22 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/bundler-plugin-core@npm:2.16.0":
|
||||
version: 2.16.0
|
||||
resolution: "@sentry/bundler-plugin-core@npm:2.16.0"
|
||||
dependencies:
|
||||
"@babel/core": "npm:^7.18.5"
|
||||
"@sentry/babel-plugin-component-annotate": "npm:2.16.0"
|
||||
"@sentry/cli": "npm:^2.22.3"
|
||||
dotenv: "npm:^16.3.1"
|
||||
find-up: "npm:^5.0.0"
|
||||
glob: "npm:^9.3.2"
|
||||
magic-string: "npm:0.27.0"
|
||||
unplugin: "npm:1.0.1"
|
||||
checksum: 10/2095d532af8b980939a17275b12a1d187fd658fd4f3b33715dadc37cc1f4210289f5b0d863392811dc6e995f54d696cddec291f7d03d7a1d9f3b77022df0476e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/cli-darwin@npm:2.28.6":
|
||||
version: 2.28.6
|
||||
resolution: "@sentry/cli-darwin@npm:2.28.6"
|
||||
@@ -11373,68 +11449,144 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/core@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/core@npm:7.102.1"
|
||||
"@sentry/core@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry/core@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
checksum: 10/8a4e75aa0b366be9801b309f3e2d1bf8e9b4a8b4532b5e17134e0a9d5eb07691151be1fff9fe592a07522a2c5d29d854234eac339235f664a395ea131ce7f20f
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/79465058a0bc45653bfbd319b9d28e55ee97adaaf1e240c4717ea5bfea37fe8d57affce89c2e2b3151d3a1894897833dcedb3d2685c059d5ca8b81f803ff6b4b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/integrations@npm:^7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/integrations@npm:7.102.1"
|
||||
"@sentry/core@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/core@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
checksum: 10/30f2be108499a30ba5c9a19e2870e80f6c03de3f32aa0537c4a305428f989ebb96831cc4b0b8c8e30eea3dfeff0262d05fbd34d876b7189ddf439933ae8a560f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/electron@npm:^4.21.0":
|
||||
version: 4.21.0
|
||||
resolution: "@sentry/electron@npm:4.21.0"
|
||||
dependencies:
|
||||
"@sentry/browser": "npm:7.107.0"
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/node": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
deepmerge: "npm:4.3.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 10/f057cca75479711d6cde5450ac69bea0b41119d0fb069cac8f5aefbacf81d21c94ea952a192b9e097fdc0415f0384041babd8a85f8a9d06fd9b6ab87dec3ec77
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/esbuild-plugin@npm:^2.16.0":
|
||||
version: 2.16.0
|
||||
resolution: "@sentry/esbuild-plugin@npm:2.16.0"
|
||||
dependencies:
|
||||
"@sentry/bundler-plugin-core": "npm:2.16.0"
|
||||
unplugin: "npm:1.0.1"
|
||||
uuid: "npm:^9.0.0"
|
||||
checksum: 10/8a8bf7a1c0e31081c5b834d8a995eb1a58f48c5283fb1c93ab8bce9b9dad2081d3b1be3284828b5d6eba5592898dcc46d33f3ff784cc796d020ee41147fcdd23
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/integrations@npm:^7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/integrations@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
localforage: "npm:^1.8.1"
|
||||
checksum: 10/f9af4b9fdb436dfecc067fd5c87d2df0e8014a4ed78b7d42e86f47c583519917f0185e4d4f669cc207e44b369b6dd604dec04a67131ef11942fb50b023860047
|
||||
checksum: 10/6c9bce95bb35c6d20c6fd699b77258dbc1390e9fc8e109a2f79f16abc53c76f7594be2eb6a0471d64677436928840d84c81ced69f2378b9c61f257e87e533f2a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/react@npm:^7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/react@npm:7.102.1"
|
||||
"@sentry/node@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry/node@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry/browser": "npm:7.102.1"
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
"@sentry-internal/tracing": "npm:7.107.0"
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/0ad83e6842122393bd874f8f99157c0d73ded9924f4ece358f176e6ed698eef0cbb4a3341052a96588c398398e158a05656a7d247c0c839a7d073f41b056455b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/react@npm:^7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/react@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/browser": "npm:7.108.0"
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
hoist-non-react-statics: "npm:^3.3.2"
|
||||
peerDependencies:
|
||||
react: 15.x || 16.x || 17.x || 18.x
|
||||
checksum: 10/74bb55ed1775e4b14b0c89e25b028ff47cbe826b3072f14fd13d0bd88fb6b7a732962c949a8bc7b8bcd173e7d1531858a4f70de915c539ddf880284426fafddc
|
||||
checksum: 10/acda065ea91915cb93b36087a57c8fae0408012594265315074ec6882faaca27ac436cda990ce743f3f4c772e6a074bc9916c358569ab4702fecf95bacf159b7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/replay@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/replay@npm:7.102.1"
|
||||
"@sentry/replay@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry/replay@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry-internal/tracing": "npm:7.102.1"
|
||||
"@sentry/core": "npm:7.102.1"
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
"@sentry/utils": "npm:7.102.1"
|
||||
checksum: 10/ad2cf119298a9b62e7440033b531d983d126f4d9603471baef188cc2f0a8f48bec90eb5d8b920f4d364ed003f128a3dc4551a1456fd8c208914dd29a089b3e21
|
||||
"@sentry-internal/tracing": "npm:7.107.0"
|
||||
"@sentry/core": "npm:7.107.0"
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
"@sentry/utils": "npm:7.107.0"
|
||||
checksum: 10/9797c876a738a37bf42b3ae8b5ea35d4de5555999906cb8293dce395d42010959b27c1e8954dc49b24ab88e79e56de5e94c934a4c4c8cbe8e3756ea44b42e16b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/types@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/types@npm:7.102.1"
|
||||
checksum: 10/794aeeb398f37374f7527de5490e6ae220c2e4ae190a5c6eed3cf3facbe65b603ce8e74691441701cc65294028b0e16eeb7394d07ef498098c207183dcc7f963
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/utils@npm:7.102.1":
|
||||
version: 7.102.1
|
||||
resolution: "@sentry/utils@npm:7.102.1"
|
||||
"@sentry/replay@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/replay@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/types": "npm:7.102.1"
|
||||
checksum: 10/9ec4f4778eac7ac36d0fed2ab4a1fbe9953a5a18258255bbc7a65db93739f87d7d10cb92afea05c2db8bd219f2c4db1715088f2a0cdc9b6892c4cc65e5d97386
|
||||
"@sentry-internal/tracing": "npm:7.108.0"
|
||||
"@sentry/core": "npm:7.108.0"
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
"@sentry/utils": "npm:7.108.0"
|
||||
checksum: 10/42806c531f5b644c2c54ef363c824c85506ff8ac75b00821023dccde254edb034fbe4f774c4cf1d5fea2b4704be19f8a4fecfdbb351359a055d8437caeb68a95
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/types@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry/types@npm:7.107.0"
|
||||
checksum: 10/68b349006bce831fae40e29586e59f345148caa740318d6d6edc08abe15d933d290adf67354ed02027e966b6be2be408be9c341b77fdfd70b4196c765c7cd511
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/types@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/types@npm:7.108.0"
|
||||
checksum: 10/ab5231ddc2839d3ef2cb647fc775ba6467f8551e5f19ef55f43be39ec6def505f90303b9abf1342820b7aec6bd9cbfd80623ba4b6defafd32e0589197a832bec
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/utils@npm:7.107.0":
|
||||
version: 7.107.0
|
||||
resolution: "@sentry/utils@npm:7.107.0"
|
||||
dependencies:
|
||||
"@sentry/types": "npm:7.107.0"
|
||||
checksum: 10/ece92ba70575c3e4e15442739e49aedc667a812ebe8eb444a861605b4a6d297b0e939849e0bdb4fcdcd976f2bb9740698e01269f376c849f7d311c62000050c9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sentry/utils@npm:7.108.0":
|
||||
version: 7.108.0
|
||||
resolution: "@sentry/utils@npm:7.108.0"
|
||||
dependencies:
|
||||
"@sentry/types": "npm:7.108.0"
|
||||
checksum: 10/605ec9a79d596c677db361d963e63f41bb609f06ef331d0b811dfa3371bcb16c52a235d51696c2cc65678bd2160fda4832eb9cc297fffc6f19b8002272d672a2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -19142,6 +19294,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"deepmerge@npm:4.3.0":
|
||||
version: 4.3.0
|
||||
resolution: "deepmerge@npm:4.3.0"
|
||||
checksum: 10/9f6ef59c33aff23dbfbbdff0607919d671e1af3057dd3627e9708915e64a5575c5797868c6f540fb2faab82d2ca4e30577b808dd085e0b3bf7a5a3184cdfa3a9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"deepmerge@npm:^4.2.2":
|
||||
version: 4.3.1
|
||||
resolution: "deepmerge@npm:4.3.1"
|
||||
@@ -22509,6 +22668,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"glob@npm:^9.3.2":
|
||||
version: 9.3.5
|
||||
resolution: "glob@npm:9.3.5"
|
||||
dependencies:
|
||||
fs.realpath: "npm:^1.0.0"
|
||||
minimatch: "npm:^8.0.2"
|
||||
minipass: "npm:^4.2.4"
|
||||
path-scurry: "npm:^1.6.1"
|
||||
checksum: 10/e5fa8a58adf53525bca42d82a1fad9e6800032b7e4d372209b80cfdca524dd9a7dbe7d01a92d7ed20d89c572457f12c250092bc8817cb4f1c63efefdf9b658c0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"global-agent@npm:^3.0.0":
|
||||
version: 3.0.0
|
||||
resolution: "global-agent@npm:3.0.0"
|
||||
@@ -27749,6 +27920,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:^8.0.2":
|
||||
version: 8.0.4
|
||||
resolution: "minimatch@npm:8.0.4"
|
||||
dependencies:
|
||||
brace-expansion: "npm:^2.0.1"
|
||||
checksum: 10/aef05598ee565e1013bc8a10f53410ac681561f901c1a084b8ecfd016c9ed919f58f4bbd5b63e05643189dfb26e8106a84f0e1ff12e4a263aa37e1cae7ce9828
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimist@npm:^1.1.1, minimist@npm:^1.1.3, minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6, minimist@npm:^1.2.8, minimist@npm:~1.2.5":
|
||||
version: 1.2.8
|
||||
resolution: "minimist@npm:1.2.8"
|
||||
|
||||
Reference in New Issue
Block a user