Compare commits

...

118 Commits

Author SHA1 Message Date
Corentin Thomasset
3903eed170 chore(release): update versions (#605)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-11-02 21:20:30 +01:00
Corentin Thomasset
c70d7e419a chore(release): use provenance for release (#604) 2025-11-02 20:16:24 +00:00
Corentin Thomasset
2240f58f04 chore(release): update versions (#576)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-31 16:39:30 +01:00
Corentin Thomasset
79e9bb1b61 feat(auth): added an email verification confirmation/expiration page (#602) 2025-10-30 10:38:23 +01:00
Corentin Thomasset
6e18162435 fix(queries): clear query client on sign out and invalidate organization queries on error (#600) 2025-10-28 23:56:22 +01:00
Corentin Thomasset
16ae4617df feat(tagging-rules): add condition match mode to tagging rules (#601)
- Introduced a new column `condition_match_mode` in the `tagging_rules` table to specify how conditions should be evaluated (either 'all' or 'any').
- Updated the tagging rules repository, routes, and schemas to handle the new `conditionMatchMode` property.
- Enhanced the tagging rules use cases to apply tags based on the specified condition match mode.
- Added tests to verify the behavior of tagging rules with different condition match modes.
- Created a migration to add the new column and update existing records accordingly.
2025-10-28 14:07:16 +01:00
Corentin Thomasset
1c46071e00 refactor(unocss): migrated preset to wind4 (#599) 2025-10-27 22:09:09 +00:00
Corentin Thomasset
377c11c185 fix(organization): corrected organization redirect (#598)
* fix(organization): corrected organization redirect

* Update .changeset/chatty-monkeys-joke.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-27 12:03:34 +01:00
Corentin Thomasset
28c3c15cef chore(deps): update better-auth (#596) 2025-10-27 01:35:47 +01:00
Corentin Thomasset
0391a3bcd5 chore(deps): updated eslint and config dependencies (#595) 2025-10-27 00:00:28 +00:00
Corentin Thomasset
2c75eec862 test(logs): reduced log spam in test (#594) 2025-10-26 23:50:59 +00:00
Corentin Thomasset
ccf7602f19 chore(deps): use catalog eslint packages in doc app (#593) 2025-10-26 23:29:50 +00:00
Corentin Thomasset
b8a515a313 chore(deps): updated vitest monorepo (#592) 2025-10-26 23:09:49 +00:00
Corentin Thomasset
0aad88471b chore(pnpm): updated pnpm to 10.19.0 (#591) 2025-10-26 21:43:23 +00:00
Corentin Thomasset
efd2ae1c73 chore(deps): removed unused jsdom in client (#590) 2025-10-26 21:48:25 +01:00
Corentin Thomasset
e9a719d06a fix(client): proper feedback messages in auth pages (#589) 2025-10-26 17:04:52 +00:00
Corentin Thomasset
68714267ad fix(subscriptions): stabilized subscriptions webhook states (#588) 2025-10-26 16:47:34 +01:00
Corentin Thomasset
75a13da526 fix(subscriptions): stop preventing org deletion when subscription is active (#587) 2025-10-26 09:27:56 +00:00
Corentin Thomasset
59d5819018 fix(cli): correct import path to prevent CLI crash (#586) 2025-10-25 15:43:21 +00:00
Corentin Thomasset
a857370343 fix(webhooks): update webhook creation to allow without secrets (#585) 2025-10-25 13:08:07 +00:00
Corentin Thomasset
f4740ba59a feat(date): replace timeAgo with RelativeTime component (#584) 2025-10-25 14:26:47 +02:00
Corentin Thomasset
b0abf7f78a feat(i18n): add date and time ago formatting functions (#583) 2025-10-25 11:51:28 +02:00
Corentin Thomasset
182ccbb30b fix(webhooks): corrected webhooks last triggered date (#582) 2025-10-25 02:12:57 +02:00
Jan-Olaf Becker
75340f0ce7 feat(tagging-rules): added a "run now" button for tagging rules (#540)
* feat: add run now button for tagging rules

Allow users to apply existing tagging rules to all documents
in their organization. This helps when rules are created after
documents have already been imported.

Fixes #251

* docs: add tagging rules guide and API endpoint

- Add comprehensive guide for using tagging rules
- Document the new 'Apply to existing documents' feature
- Add API endpoint documentation for applying rules to existing documents

* feat(docs): add Tagging Rules to sidebar navigation

* refactor(ui): normalized button sizes

* refactor(repository): remove unused getOrganizationDocumentsQuery function

* refactor(tagging-rules): mutualized tagging rule application

* chore(version): added changeset

---------

Co-authored-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
2025-10-24 23:44:12 +02:00
Corentin Thomasset
1228486f28 feat(lecture): add support for extracting text from .docx, .odt, .rtf, .pptx and .odp (#580) 2025-10-24 21:44:11 +02:00
Corentin Thomasset
655a1c5475 feat(auth): enhance user signup logging with email capture (#579) 2025-10-24 16:07:45 +00:00
Corentin Thomasset
d1797eb9be fix(fly.toml): update deployment strategy to canary and adjust process environment variable syntax (#578) 2025-10-24 17:28:54 +02:00
Corentin Thomasset
bd3e321eb7 feat(processes): added worker vs web processes (#577) 2025-10-24 17:06:28 +02:00
Corentin Thomasset
be25de7721 fix(server): add global error handlers for uncaught exceptions and unhandled promise rejections (#575) 2025-10-24 16:05:21 +02:00
Corentin Thomasset
e85403f9a1 fix(fly.toml): set minimum machines running to 1 (#574) 2025-10-24 11:47:51 +00:00
Corentin Thomasset
7de5d0956b feat(upgrade-dialog): add promotional banner for early adopters (#573) 2025-10-24 10:03:23 +00:00
Corentin Thomasset
b1a88230cd fix(subscriptions): added organization deletion restrictions based on active subscriptions (#572) 2025-10-24 01:37:30 +02:00
Corentin Thomasset
55bb29582e fix(docker): update build context paths in package.json scripts (#571) 2025-10-23 21:36:25 +00:00
Corentin Thomasset
d9263dc703 chore(release): update versions (#549)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-23 21:51:13 +02:00
Corentin Thomasset
c3ffa8387e feat(config): add hostname configuration (#570) 2025-10-23 21:48:39 +02:00
Corentin Thomasset
d40514c043 feat(subscriptions): enhance subscription webhook handling (#569) 2025-10-23 21:23:11 +02:00
Corentin Thomasset
d7df2f095b refactor(layouts): removed icons bar (#567)
* refactor(layouts): removed icons bar

* Update .changeset/bumpy-pens-study.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-23 14:58:31 +02:00
Corentin Thomasset
afdcc1c5ba feat(demo): add subscription and usage endpoints (#559) 2025-10-19 23:18:33 +02:00
Corentin Thomasset
92daaa35bb fix(webhooks): omit secret from webhook response in update route (#566) 2025-10-19 14:04:59 +00:00
Corentin Thomasset
e4295e14ab fix(theme): prevent flash of wrong theme on load (#565) 2025-10-19 15:55:00 +02:00
Corentin Thomasset
ae37d1db36 fix(tasks): add FLY_MACHINE_ID fallback to worker ids (#564) 2025-10-19 12:16:42 +00:00
Corentin Thomasset
a7464f8b89 chore(fly): update configuration for deployment and health checks (#563) 2025-10-18 21:42:09 +00:00
Corentin Thomasset
2dd9ca9835 chore(fly): test fly.io hosting (#561) 2025-10-18 14:17:17 +00:00
Corentin Thomasset
54cc14052c refactor(tracking): replace posthog-js with posthog-js-lite to reduced bundle (#560) 2025-10-17 21:22:56 +00:00
Corentin Thomasset
f930e46dde fix(docker): correct package changelog title to @papra/docker (#551) 2025-10-16 16:15:17 +02:00
Corentin Thomasset
df75e5accb feat(subscriptions): add global coupon support for checkout sessions (#558) 2025-10-16 15:36:42 +02:00
Corentin Thomasset
f66a9f5d1b feat(documents): added deleted and total metrics in the organization stats route (#556) 2025-10-14 17:59:37 +02:00
Corentin Thomasset
c5b337f3bb fix(upload): use organization-specific file size limits (#555) 2025-10-14 03:09:54 +02:00
Corentin Thomasset
bb1ba3e15e chore(release): ensure job runs only for the correct repository (#554) 2025-10-13 21:40:34 +00:00
Corentin Thomasset
ce839c4127 feat(plans): pro plan (#553) 2025-10-13 23:33:55 +02:00
Corentin Thomasset
8aabd28168 refactor(utils): removed lodash-es (#552) 2025-10-13 17:03:25 +02:00
Corentin Thomasset
1a7a14b3ed refactor(query): dropped unnecessary tanstack useQueries (#550) 2025-10-13 02:22:58 +02:00
Corentin Thomasset
17cebde051 fix(intake-emails): make email validation more permissive for webhook addresses (#548) 2025-10-12 18:56:18 +00:00
Corentin Thomasset
12ead3d017 chore(release): update versions (#535)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-12 16:50:36 +02:00
Corentin Thomasset
f6c0221858 fix(release): update Docker build trigger to use '@papra/docker' package (#546) 2025-10-12 14:35:26 +00:00
Corentin Thomasset
1aaf2c96cd fix(docker): update version from 25.10.0 to 25.9.0 and change release type to minor (#545) 2025-10-12 14:30:42 +00:00
Corentin Thomasset
9c6f14fc13 refactor(docker): dedicated package for docker management (#544)
* feat(docker): initialize Docker package with build configurations and README

* Update packages/docker/CHANGELOG.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update packages/docker/package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-12 16:22:38 +02:00
Corentin Thomasset
3d49962ca5 feat(docs): add architecture documentation (#543)
* feat(docs): add architecture documentation

* Update apps/docs/src/content/navigation.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-11 19:39:12 +00:00
Corentin Thomasset
c434d873bc feat(organizations): soft delete organizations with recovery (#542) 2025-10-11 16:21:55 +00:00
Corentin Thomasset
60982da847 refactor(tagging-rules): enhance tagging rules repository with tag associations (#539) 2025-10-08 22:08:35 +02:00
Corentin Thomasset
73ab9e8ab5 fix(webhooks): trigger webhooks and save activity log on auto-tagging (#538) 2025-10-08 18:30:59 +00:00
Corentin Thomasset
c4a9b9b088 fix(test): forward injected date in invitation tests (#537) 2025-10-08 11:09:11 +00:00
Corentin Thomasset
9a6e822e71 feat(docker): drop support for armv7 (#532) 2025-10-06 23:56:24 +02:00
Corentin Thomasset
e52bc261db feat(organizations): added max members count check for organization invitations (#536) 2025-10-05 15:11:08 +02:00
Corentin Thomasset
624ad62c53 feat(orgs): added usage page and related components (#534)
- Implemented a new page to view organization usage, including document storage, intake emails, and member counts.
- Added translations for the new usage features in multiple languages (DE, EN, ES, FR, IT, PL, PT-BR, RO).
- Created a `UsageWarningCard` to alert users when they are nearing their storage limits.
- Updated the sidebar and organization settings layout to include a link to the usage page.
- Added API endpoints to fetch organization usage data and handle limits.
- Introduced a `ProgressCircle` component for visual representation of usage statistics.
- Refactored utility functions to handle positive infinity values in usage calculations.
2025-10-05 02:45:21 +02:00
Corentin Thomasset
630f9cc328 feat(subscriptions): add billing interval options (#533) 2025-10-04 21:57:09 +02:00
Corentin Thomasset
9f5be458fe feat(subscriptions): added cta and subscription management features (#523) 2025-10-04 14:58:42 +02:00
Corentin Thomasset
1bfdb8aa66 chore(release): update versions (#525)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-10-04 11:47:47 +02:00
Corentin Thomasset
2e2bb6fbbd chore(changeset): added changeset for ip env variable (#531) 2025-10-02 22:48:38 +00:00
Corentin Thomasset
d09b9ed70d feat(auth): add IP address header configuration and logging support (#530) 2025-10-03 00:41:42 +02:00
Corentin Thomasset
e1571d2b87 fix(auth): enhance logging to include additional arguments in log messages (#529) 2025-10-02 22:36:06 +00:00
Corentin Thomasset
c9a66e4aa8 fix(docs): update env variable name for OwlRelay configuration (#528) 2025-10-02 20:29:55 +00:00
Corentin Thomasset
9fa2df4235 feat(package): add module type to root package.json (#526) 2025-10-01 14:15:23 +00:00
Corentin Thomasset
c84a921988 feat(tags): update tag color validation to allow uppercase letters (#524)
* feat(tags): update tag color validation to allow uppercase letters

* Update .changeset/quiet-peas-mate.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-01 14:09:49 +00:00
Corentin Thomasset
9b5f3993c3 chore(release): update versions (#518)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-30 11:51:10 +02:00
Corentin Thomasset
b28772317c fix(file-upload): set default parameter charset to utf8 (#521) 2025-09-29 21:20:43 +02:00
Corentin Thomasset
a3f9f05c66 feat(organizations): restrict organization deletion to owners only (#517) 2025-09-26 01:49:59 +02:00
Corentin Thomasset
0616635cd6 chore(release): update versions (#509)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-24 17:00:01 +02:00
Corentin Thomasset
9e7a3ba70b chore(version): update version bump for api keys permissions changes (#516) 2025-09-24 16:49:11 +02:00
Corentin Thomasset
04990b986e docs(api-endpoints): added explications on how to use api keys (#515) 2025-09-24 14:41:14 +00:00
Corentin Thomasset
097b6bf2b7 feat(api-keys): added format check for api tokens to avoid unnecessary db call (#514) 2025-09-24 14:32:34 +00:00
Corentin Thomasset
cb3ce6b1d8 feat(api-keys): add organization permissions for api keys (#512) 2025-09-24 15:25:48 +02:00
Corentin Thomasset
405ba645f6 feat(docker): disable Better Auth telemetry in Dockerfiles (#511) 2025-09-21 20:56:43 +00:00
Corentin Thomasset
ab6fd6ad10 feat(tasks): update figue to allow for fallback task worker ids env variables (#510) 2025-09-21 22:53:04 +02:00
Corentin Thomasset
782f70ff66 feat(tasks): add option to disable PRAGMA statements in migrations (#508) 2025-09-20 22:07:34 +00:00
Corentin Thomasset
1abbf18e94 chore(release): update versions (#505)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-20 14:59:01 +02:00
Corentin Thomasset
6bcb2a71e9 feat(intake-emails): add intake email username pattern config (#506)
Co-authored-by: Alexander <goldengamerlp@users.noreply.github.com>
2025-09-19 20:37:25 +02:00
Corentin Thomasset
936bc2bd0a refactor(intake-emails): split username creation from addresses management (#504) 2025-09-18 01:59:29 +02:00
Corentin Thomasset
2efe7321cd chore(release): update versions (#494)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-14 11:31:31 +02:00
Corentin Thomasset
947bdf8385 docs(CONTRIBUTING): add IDE setup instructions for ESLint in VS Code (#502)
* docs(CONTRIBUTING): add IDE setup instructions for ESLint in VS Code

* Update CONTRIBUTING.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-14 09:18:37 +00:00
Corentin Thomasset
b5bf0cca4b fix(upload): disable client size guard when maxUploadSize <= 0 (#501) 2025-09-14 10:44:29 +02:00
Corentin Thomasset
208a561668 feat(tasks): added libsql task service driver (#500) 2025-09-13 22:42:08 +02:00
Corentin Thomasset
40cb1d71d5 fix(documents): enhance file fetching security by setting appropriate headers (#499) 2025-09-13 15:46:34 +02:00
Corentin Thomasset
3da13f7591 refactor(document-page): remove "open in new tab" button (#498) 2025-09-13 15:29:51 +02:00
Corentin Thomasset
2a444aad31 chore(tests): set timezone in vitest configurations (#497) 2025-09-13 09:25:40 +00:00
Corentin Thomasset
47d8bbd356 refactor(utils): added isString and isNonEmptyString utility functions (#495) 2025-09-12 22:22:01 +02:00
Corentin Thomasset
ed4d7e4a00 fix(folder-ingestion): allow cross docker volume file moving (#493) 2025-09-10 22:48:56 +02:00
Corentin Thomasset
f382397c0e chore(release): update versions (#489)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-10 15:38:36 +02:00
Corentin Thomasset
54514e15db fix(translations): update error messages for file size limits across multiple languages (#492) 2025-09-10 15:35:34 +02:00
Corentin Thomasset
bb9d5556d3 fix(upload): properly handle file-too-big errors (#491) 2025-09-10 14:57:46 +02:00
Corentin Thomasset
83e943c5b4 refactor(client): update favicons (#488) 2025-09-09 23:30:27 +02:00
Corentin Thomasset
40b0557553 chore(release): update versions (#465)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-09-09 15:06:26 +02:00
Corentin Thomasset
b5a0317d24 refactor(documents): made the document creation usecase factory synchronous (#485) 2025-09-09 09:42:33 +00:00
Corentin Thomasset
9730a06468 refactor(documents): narrowed down the document storage config parameter (#484) 2025-09-09 09:32:49 +00:00
Corentin Thomasset
ec0a437d86 fix(ingestion-folders): ensure doneFolders and errorFolders are string arrays for proper exclusion pattern (#483) 2025-09-08 23:36:04 +02:00
Corentin Thomasset
1606310745 refactor(intake-emails): update email validation to use RFC 322 compliant email for intake email origins (#481) 2025-09-04 11:53:51 +02:00
Corentin Thomasset
0a03f42231 feat(documents): implement document encryption (#480) 2025-09-04 10:15:30 +02:00
Corentin Thomasset
a62d376772 fix(tags): retreive tags affected even when only affected to deleted documents (#477)
* fix(tags): retreive tags affected even when only affected to deleted documents

* Update apps/papra-server/src/modules/tags/tags.repository.test.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update .changeset/lazy-tables-cover.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-21 13:50:48 +02:00
Corentin Thomasset
ea9d90d6cf refactor(ingestion-folders): use file streaming instead of loading in ram (#475) 2025-08-20 23:01:56 +02:00
Corentin Thomasset
27a6b0b53d refactor(documents): made the creation of storage driver sync (#474) 2025-08-20 21:44:53 +02:00
Corentin Thomasset
94c4d76b86 refactor(driver): no longer use file instances in memory driver (#473) 2025-08-20 20:34:06 +02:00
Corentin Thomasset
b08241f20f refactor(server): use streaming for handling file upload (#472) 2025-08-20 20:15:57 +02:00
Corentin Thomasset
e77a42fbf1 refactor(documents): lazy load PdfViewer component for smaller main chunk (#471) 2025-08-12 22:52:00 +00:00
Corentin Thomasset
d488efe2cc refactor(i18n): simplified translation management and performance (#470) 2025-08-12 02:22:20 +02:00
Corentin Thomasset
14c3587de0 refactor(documents): improved UX of the document content update (#468) 2025-08-09 23:33:42 +02:00
Corentin Thomasset
7400a3a6ec chore(dependencies): removed unbuild (#467) 2025-08-09 20:05:48 +00:00
Corentin Thomasset
14bc2b8f8d chore(dependencies): replace unbuild with tsdown (#464) 2025-08-09 17:03:14 +02:00
Corentin Thomasset
e48745331f chore(ci): mutualized CI workflows (#463) 2025-08-09 16:43:43 +02:00
422 changed files with 30129 additions and 12536 deletions

View File

@@ -5,13 +5,11 @@
{ "repo": "papra-hq/papra"}
],
"commit": false,
"fixed": [
["@papra/app-client", "@papra/app-server"]
],
"fixed": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"ignore": ["@papra/app-client", "@papra/app-server", "@papra/docs"],
"privatePackages": {
"tag": true,
"version": true

View File

@@ -1,11 +0,0 @@
node_modules
.pnp
.pnp.*
*.log
dist
*.local
.git
db.sqlite
local-documents
.env
**/.env

1
.dockerignore Symbolic link
View File

@@ -0,0 +1 @@
packages/docker/.dockerignore

View File

@@ -1,42 +0,0 @@
name: CI - Docs
on:
pull_request:
push:
branches:
- main
jobs:
ci-apps-docs:
name: CI - Docs
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/docs
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
working-directory: ./
- name: Run linters
run: pnpm lint
# - name: Type check
# run: pnpm typecheck
# - name: Run unit test
# run: pnpm test
- name: Build the app
run: pnpm build

View File

@@ -1,49 +0,0 @@
name: CI - App Client
on:
pull_request:
push:
branches:
- main
jobs:
ci-apps-papra-client:
name: CI - Papra Client
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/papra-client
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
working-directory: ./
- name: Run linters
run: pnpm lint
- name: Type check
run: pnpm typecheck
- name: Run unit test
run: pnpm test
# Ensure locales types are up to date, must be run before building the app
- name: Check locales types
run: |
pnpm script:generate-i18n-types
git diff --exit-code -- src/modules/i18n/locales.types.ts > /dev/null || (echo "Locales types are outdated, please run 'pnpm script:generate-i18n-types' and commit the changes." && exit 1)
- name: Build the app
run: pnpm build

View File

@@ -1,43 +0,0 @@
name: CI - App Server
on:
pull_request:
push:
branches:
- main
jobs:
ci-apps-papra-server:
name: CI - Papra Server
runs-on: ubuntu-latest
defaults:
run:
working-directory: apps/papra-server
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: |
pnpm i --frozen-lockfile
pnpm --filter "@papra/app-server^..." build
- name: Run linters
run: pnpm lint
- name: Type check
run: pnpm typecheck
- name: Run unit test
run: pnpm test
- name: Build the app
run: pnpm build

View File

@@ -1,41 +0,0 @@
name: CI - Api SDK
on:
pull_request:
push:
branches:
- main
jobs:
ci-packages-api-sdk:
name: CI - Api SDK
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/api-sdk
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Run linters
run: pnpm lint
- name: Type check
run: pnpm typecheck
# - name: Run unit test
# run: pnpm test
- name: Build the app
run: pnpm build

View File

@@ -1,44 +0,0 @@
name: CI - CLI
on:
pull_request:
push:
branches:
- main
jobs:
ci-packages-cli:
name: CI - CLI
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/cli
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Build related packages
run: cd ../api-sdk && pnpm build
- name: Run linters
run: pnpm lint
- name: Type check
run: pnpm typecheck
# - name: Run unit test
# run: pnpm test
- name: Build the app
run: pnpm build

View File

@@ -1,41 +0,0 @@
name: CI - Lecture
on:
pull_request:
push:
branches:
- main
jobs:
ci-packages-lecture:
name: CI - Lecture
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/lecture
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Run linters
run: pnpm lint
- name: Type check
run: pnpm typecheck
- name: Run unit test
run: pnpm test
- name: Build the app
run: pnpm build

View File

@@ -1,41 +0,0 @@
name: CI - Webhooks
on:
pull_request:
push:
branches:
- main
jobs:
ci-packages-webhooks:
name: CI - Webhooks
runs-on: ubuntu-latest
defaults:
run:
working-directory: packages/webhooks
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
- name: Run linters
run: pnpm lint
- name: Type check
run: pnpm typecheck
- name: Run unit test
run: pnpm test
- name: Build the app
run: pnpm build

47
.github/workflows/ci.yaml vendored Normal file
View File

@@ -0,0 +1,47 @@
name: CI
on:
pull_request:
push:
branches:
- main
jobs:
ci:
name: CI
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm i
# Build only the packages first to properly run the lint and test first to get faster feedback
- name: Build packages
run: pnpm -r --parallel -F "./packages/*" build
- name: Run linters
run: pnpm -r --parallel lint
- name: Type check
# Exclude docs as their are some typing issues we are ok with for now
run: pnpm -r --parallel -F "!@papra/docs" typecheck
# Tests are run using vitest projects
- name: Run tests
run: pnpm test
# Now build the apps, the longer step, so we do it last as they are more unlikely to fail if the previous steps works
- name: Build the apps
run: pnpm -r --parallel -F "./apps/*" build
- name: Ensure no non-excluded files are changed for the whole repo
run: git diff --exit-code > /dev/null || (echo "After running the CI, some un-committed changes were detected. Please ensure cleanness before merging." && exit 1)

View File

@@ -1,10 +1,10 @@
name: Release new versions
name: Build and publish Docker images
on:
workflow_dispatch:
inputs:
version:
description: 'Version to release'
description: 'Version to release (e.g. 0.8.2)'
required: true
type: string
@@ -14,7 +14,7 @@ permissions:
jobs:
docker-release:
name: Release Docker images
name: Build and publish Docker images
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -43,8 +43,8 @@ jobs:
uses: docker/build-push-action@v6
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
file: ./packages/docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
corentinth/papra:latest-root
@@ -56,8 +56,8 @@ jobs:
uses: docker/build-push-action@v6
with:
context: .
file: ./docker/Dockerfile.rootless
platforms: linux/amd64,linux/arm64,linux/arm/v7
file: ./packages/docker/Dockerfile.rootless
platforms: linux/amd64,linux/arm64
push: true
tags: |
corentinth/papra:latest

View File

@@ -11,6 +11,7 @@ jobs:
release:
name: Release
runs-on: ubuntu-latest
if: github.repository == 'papra-hq/papra'
permissions:
contents: write
pull-requests: write
@@ -18,14 +19,18 @@ jobs:
actions: write
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
cache: "pnpm"
# Ensure npm 11.5.1 or later is installed
- name: Update npm
run: npm install -g npm@latest
- name: Install dependencies
run: pnpm i
@@ -41,12 +46,11 @@ jobs:
title: "chore(release): update versions"
env:
GITHUB_TOKEN: ${{ secrets.CHANGESET_GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Trigger Docker build
if: steps.changesets.outputs.published == 'true' && contains(fromJson(steps.changesets.outputs.publishedPackages).*.name, '@papra/app-server')
if: steps.changesets.outputs.published == 'true' && contains(fromJson(steps.changesets.outputs.publishedPackages).*.name, '@papra/docker')
run: |
VERSION=$(echo '${{ steps.changesets.outputs.publishedPackages }}' | jq -r '.[] | select(.name=="@papra/app-server") | .version')
VERSION=$(echo '${{ steps.changesets.outputs.publishedPackages }}' | jq -r '.[] | select(.name=="@papra/docker") | .version')
echo "VERSION: $VERSION"
gh workflow run release-docker.yaml -f version="$VERSION"
env:

7
.gitignore vendored
View File

@@ -35,8 +35,13 @@ cache
*.db-shm
*.db-wal
*.sqlite
*.sqlite-shm
*.sqlite-wal
local-documents
ingestion
.cursorrules
*.traineddata
*.traineddata
.eslintcache
.claude

222
CLAUDE.md Normal file
View File

@@ -0,0 +1,222 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Papra is a minimalistic document management and archiving platform built as a monorepo using PNPM workspaces. The project includes a SolidJS frontend, HonoJS backend, CLI tools, and supporting packages.
It's open-source and designed for easy self-hosting using Docker, and also offers a cloud-hosted SaaS version.
## Architecture
### Monorepo Structure
- **apps/papra-server**: Backend API server (HonoJS + Drizzle ORM + Better Auth)
- **apps/papra-client**: Frontend application (SolidJS + UnoCSS + Shadcn Solid)
- **apps/docs**: Documentation site (Astro + Starlight)
- **packages/lecture**: Text extraction library for documents
- **packages/api-sdk**: API client SDK
- **packages/cli**: Command-line interface
- **packages/webhooks**: Webhook types and utilities
### Backend Architecture (apps/papra-server)
The backend follows a modular architecture with feature-based modules:
- **Module pattern**: Each feature lives in `src/modules/<feature>/` with:
- `*.repository.ts`: Database access layer (Drizzle ORM queries)
- `*.usecases.ts`: Business logic and orchestration
- `*.routes.ts`: HTTP route handlers (Hono)
- `*.services.ts`: Service layer for external integrations
- `*.table.ts`: Drizzle schema definitions
- `*.types.ts`: TypeScript type definitions
- `*.errors.ts`: Error definitions
- **Core modules**: `app`, `shared`, `config`, `tasks`
- **Feature modules**: `documents`, `organizations`, `users`, `tags`, `tagging-rules`, `intake-emails`, `ingestion-folders`, `webhooks`, `api-keys`, `subscriptions`, etc.
- **Database**: Uses Drizzle ORM with SQLite/Turso (libsql). Schema is in `*.table.ts` files, migrations in `src/migrations/`
- **Authentication**: Better Auth library for user auth
- **Task system**: Background job processing using Cadence MQ, a custom made queue system (papra-hq/cadence-mq)
- **Document storage**: Abstracted storage supporting local filesystem, S3, and Azure Blob
### Frontend Architecture (apps/papra-client)
- **SolidJS** for reactivity with router (`@solidjs/router`)
- **Module pattern**: Features in `src/modules/<feature>/` with:
- `components/`: UI components
- `pages/`: Route components
- `*.services.ts`: API client calls
- `*.provider.tsx`: Context providers
- `*.types.ts`: Type definitions
- **Routing**: Defined in `src/routes.tsx`
- **Styling**: UnoCSS for atomic CSS with Shadcn Solid components
- **State**: TanStack Query for server state, local storage for client state
- **i18n**: TypeScript-based translations in `src/locales/*.dictionary.ts`
### Dependency Injection Pattern
The server uses a dependency injection pattern with `@corentinth/chisels/injectArguments` to create testable services that accept dependencies as parameters.
## Development Commands
### Initial Setup
```bash
# Install dependencies
pnpm install
# Build all packages (required before running apps)
pnpm build:packages
```
### Backend Development
```bash
cd apps/papra-server
# Run database migrations
pnpm migrate:up
# Start development server (localhost:1221)
pnpm dev
# Run tests
pnpm test # All tests
pnpm test:watch # Watch mode
pnpm test:unit # Unit tests only
pnpm test:int # Integration tests only
# Lint and typecheck
pnpm lint
pnpm typecheck
# Database management
pnpm db:studio # Open Drizzle Studio
pnpm migrate:create "migration_name" # Create new migration
```
### Frontend Development
```bash
cd apps/papra-client
# Start development server (localhost:3000)
pnpm dev
# Run tests
pnpm test
pnpm test:watch
pnpm test:e2e # Playwright E2E tests
# Lint and typecheck
pnpm lint
pnpm typecheck
# i18n key synchronization
pnpm script:sync-i18n-key-order
```
### Package Development
```bash
cd packages/<package-name>
# Build package
pnpm build
pnpm build:watch # Watch mode (or pnpm dev)
# Run tests
pnpm test
pnpm test:watch
```
### Root-level Commands
```bash
# Run tests across all packages
pnpm test
pnpm test:watch
# Build all packages
pnpm build:packages
# Version management (changesets)
pnpm changeset # Create changeset
pnpm version # Apply changesets and bump versions
# Docker builds
pnpm docker:build:root
pnpm docker:build:root:amd64
pnpm docker:build:root:arm64
```
### Documentation Development
```bash
cd apps/docs
pnpm dev # localhost:4321
```
## Testing Guidelines
- Use **Vitest** for all testing
- Test files: `*.test.ts` for unit tests, `*.int.test.ts` for integration tests
- Integration tests may use Testcontainers (Azurite, LocalStack)
- All new features require test coverage
### Writing Good Test Names
Test names should explain the **why** (business logic, user scenario, or expected behavior), not the **how** (implementation details or return values).
**Key principles:**
- **Describe blocks** should explain the business goal or rule being tested
- **Test names** should explain the scenario, context, and reason for the behavior
- Avoid implementation details like "returns X", "should be Y", "calls Z method"
- Focus on user scenarios and business rules
- Make tests readable as documentation - someone unfamiliar with the code should understand what's being tested and why
## Code Style
- **ESLint config**: `@antfu/eslint-config` (auto-fix on save recommended)
- **Conventions**:
- Use functional programming where possible
- Prefer clarity and maintainability over performance
- Use meaningful names for variables, functions, and components
- Follow Conventional Commits for commit messages
- **Type safety**: Strict TypeScript throughout
## i18n
- Language files in `apps/papra-client/src/locales/*.dictionary.ts`
- Reference `en.dictionary.ts` for all keys (English is fallback)
- Fully type-safe with TypeScript
- Update `i18n.constants.ts` when adding new languages
- Use `pnpm script:sync-i18n-key-order` to sync key order
- **Branchlet/core**: Uses `@branchlet/core` for pluralization and conditional i18n string templates (variant of ICU message format)
- Basic interpolation: `'Hello {{ name }}!'` with `{ name: 'World' }`
- Conditionals: `'{{ count, =0:no items, =1:one item, many items }}'`
- Pluralization with variables: `'{{ count, =0:no items, =1:{count} item, {count} items }}'`
- Range conditions: `'{{ score, [0-50]:bad, [51-75]:good, [76-100]:excellent }}'`
- See [branchlet documentation](https://github.com/CorentinTh/branchlet) for more details
## Contributing Flow
1. Open an issue before submitting PRs for features/bugs
2. Target the `main` branch (continuously deployed to production)
3. Keep PRs small and atomic
4. Ensure CI is green (linting, type checking, testing, building)
5. PRs are squashed on merge
## Key Technologies
- **Frontend**: SolidJS, UnoCSS, Shadcn Solid, TanStack Query, Vite
- **Backend**: HonoJS, Drizzle ORM, Better Auth, Zod, Cadence MQ
- **Database**: SQLite/Turso (libsql)
- **Testing**: Vitest, Playwright, Testcontainers
- **Monorepo**: PNPM workspaces with catalog for shared dependencies
- **Build**: esbuild (backend), Vite (frontend), tsdown (packages)

View File

@@ -43,9 +43,9 @@ We welcome contributions to improve and expand the app's internationalization (i
### Adding a New Language
1. **Create a Language File**: To add a new language, create a YAML file named with the appropriate [ISO language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) (e.g., `fr.yml` for French) in the [`apps/papra-client/src/locales`](./apps/papra-client/src/locales) directory.
1. **Create a Language File**: To add a new language, create a TypeScript file named with the appropriate [ISO language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) followed by `.dictionary.ts` (e.g., `fr.dictionary.ts` for French) in the [`apps/papra-client/src/locales`](./apps/papra-client/src/locales) directory.
2. **Use the Reference File**: Refer to the [`en.yml`](./apps/papra-client/src/locales/en.yml) file, which contains all keys used in the app. Use it as a base to ensure consistency when creating your new language file. And act as a fallback if a key is missing in the new language file.
2. **Use the Reference File**: Refer to the [`en.dictionary.ts`](./apps/papra-client/src/locales/en.dictionary.ts) file, which contains all keys used in the app. Use it as a base to ensure consistency when creating your new language file. The English translations act as a fallback if a key is missing in the new language file.
3. **Update the Locale List**: After adding the new language file, include the language code in the `locales` array found in the [`apps/papra-client/src/modules/i18n/i18n.constants.ts`](./apps/papra-client/src/modules/i18n/i18n.constants.ts) file.
@@ -53,17 +53,21 @@ We welcome contributions to improve and expand the app's internationalization (i
### Updating an Existing Language
If you want to update an existing language file, you can do so directly in the corresponding JSON file in the [`apps/papra-client/src/locales`](./apps/papra-client/src/locales) directory. If you're adding or removing keys in the default language file ([`en.yml`](./apps/papra-client/src/locales/en.yml)), please run the following command to update the types (used for type checking the translations keys in the app):
```bash
pnpm script:generate-i18n-types
```
- This command will update the file [`locales.types.ts`](./apps/papra-client/src/modules/i18n/locale.types.ts) with the new/removed keys.
- When developing in papra-client (using `pnpm dev`), **the i18n types definition will automatically update** when you touch the [`en.yml`](./apps/papra-client/src/locales/en.yml) file, so no need to run the command above.
If you want to update an existing language file, you can do so directly in the corresponding TypeScript file in the [`apps/papra-client/src/locales`](./apps/papra-client/src/locales) directory. The translation keys are now fully type-safe with TypeScript, so you'll get immediate feedback if you add invalid keys or have syntax errors.
> [!TIP]
> You can use the command `pnpm script:sync-i18n-key-order` to sync the order of the keys in the i18n files, it'll also add the missing keys as comments.
> You can use the command `pnpm script:sync-i18n-key-order` to sync the order of the keys in the TypeScript i18n files, it'll also add the missing keys as comments.
### Using Branchlet for Pluralization and Conditionals
Papra uses [`@branchlet/core`](https://github.com/CorentinTh/branchlet) for pluralization and conditional i18n string templates (a variant of ICU message format). Here are some common patterns:
- **Basic interpolation**: `'Hello {{ name }}!'` with `{ name: 'World' }`
- **Conditionals**: `'{{ count, =0:no items, =1:one item, many items }}'`
- **Pluralization with variables**: `'{{ count, =0:no items, =1:{count} item, {count} items }}'`
- **Range conditions**: `'{{ score, [0-50]:bad, [51-75]:good, [76-100]:excellent }}'`
See the [branchlet documentation](https://github.com/CorentinTh/branchlet) for more details on syntax and advanced usage.
## Development Setup
@@ -112,6 +116,73 @@ We recommend running the app locally for development. Follow these steps:
6. Open your browser and navigate to `http://localhost:3000`.
### IDE Setup
#### ESLint Extension
We recommend installing the [ESLint extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) for VS Code to get real-time linting feedback and automatic code fixing.
The linting configuration is based on [@antfu/eslint-config](https://github.com/antfu/eslint-config), you can find specific IDE configurations in their repository.
<details>
<summary>Recommended VS Code Settings</summary>
Create or update your `.vscode/settings.json` file with the following configuration:
```json
{
// Disable the default formatter, use eslint instead
"prettier.enable": false,
"editor.formatOnSave": false,
// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "never"
},
// Silent the stylistic rules in your IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off", "fixable": true },
{ "rule": "format/*", "severity": "off", "fixable": true },
{ "rule": "*-indent", "severity": "off", "fixable": true },
{ "rule": "*-spacing", "severity": "off", "fixable": true },
{ "rule": "*-spaces", "severity": "off", "fixable": true },
{ "rule": "*-order", "severity": "off", "fixable": true },
{ "rule": "*-dangle", "severity": "off", "fixable": true },
{ "rule": "*-newline", "severity": "off", "fixable": true },
{ "rule": "*quotes", "severity": "off", "fixable": true },
{ "rule": "*semi", "severity": "off", "fixable": true }
],
// Enable eslint for all supported languages
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"markdown",
"json",
"jsonc",
"yaml",
"toml",
"xml",
"gql",
"graphql",
"astro",
"svelte",
"css",
"less",
"scss",
"pcss",
"postcss"
]
}
```
</details>
### Testing
We use **Vitest** for testing. Each package comes with its own testing commands.

View File

@@ -1,5 +1,17 @@
# @papra/docs
## 0.6.1
### Patch Changes
- [#512](https://github.com/papra-hq/papra/pull/512) [`cb3ce6b`](https://github.com/papra-hq/papra/commit/cb3ce6b1d8d5dba09cbf0d2964f14b1c93220571) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added organizations permissions for api keys
## 0.6.0
### Minor Changes
- [#480](https://github.com/papra-hq/papra/pull/480) [`0a03f42`](https://github.com/papra-hq/papra/commit/0a03f42231f691d339c7ab5a5916c52385e31bd2) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added documents encryption layer
## 0.5.3
### Patch Changes

View File

@@ -1,9 +1,8 @@
{
"name": "@papra/docs",
"type": "module",
"version": "0.5.3",
"version": "0.6.1",
"private": true,
"packageManager": "pnpm@10.12.3",
"description": "Papra documentation website",
"author": "Corentin Thomasset <corentinth@proton.me> (https://corentin.tech)",
"license": "AGPL-3.0-or-later",
@@ -28,19 +27,21 @@
"tailwind-merge": "^2.6.0",
"unocss-preset-animations": "^1.2.1",
"yaml": "^2.8.0",
"zod": "^3.25.67",
"zod-to-json-schema": "^3.24.5"
},
"devDependencies": {
"@antfu/eslint-config": "^3.13.0",
"@antfu/eslint-config": "catalog:",
"@iconify-json/tabler": "^1.1.120",
"@types/lodash-es": "^4.17.12",
"@unocss/reset": "^0.64.0",
"eslint": "^9.17.0",
"eslint": "catalog:",
"eslint-plugin-astro": "^1.3.1",
"figue": "^2.2.2",
"figue": "^3.1.1",
"lodash-es": "^4.17.21",
"marked": "^15.0.6",
"typescript": "^5.7.3",
"unocss": "0.65.0-beta.2"
"unocss": "0.65.0-beta.2",
"vitest": "catalog:"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 458 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

View File

@@ -0,0 +1,48 @@
const linesToRemove = [
/^# (.*)$/gm, // Remove main title
/^### (.*)$/gm, // Remove section titles
];
export function parseChangelog(changelog: string) {
const logs: { entries: {
pr: { number: number; url: string };
commit: { hash: string; url: string };
contributor: { username: string; url: string };
content: string;
}[]; version: string; }[] = [];
for (const lineToRemove of linesToRemove) {
changelog = changelog.replace(lineToRemove, '');
}
const sections = changelog.match(/## (.*)\n([\s\S]*?)(?=\n## |$)/g) ?? [];
for (const section of sections) {
const version = section.match(/## (.*)\n/)?.[1].trim() ?? 'unknown version';
const entries = section.split('\n- ').slice(1).map((entry) => {
// Example entry:
// [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Maybe multiline content
// Thanks copilot! :sweat-smile:
const prMatch = entry.match(/\[#(\d+)\]\((https:\/\/github\.com\/papra-hq\/papra\/pull\/\d+)\)/);
const commitMatch = entry.match(/\[`([a-f0-9]{7,40})`\]\((https:\/\/github\.com\/papra-hq\/papra\/commit\/[a-f0-9]{7,40})\)/);
const contributorMatch = entry.match(/Thanks \[@([\w-]+)\]\((https:\/\/github\.com\/[\w-]+)\)/);
const contentMatch = entry.match(/\)! - (.*)$/s);
return {
pr: prMatch ? { number: Number.parseInt(prMatch[1], 10), url: prMatch[2] } : { number: 0, url: '' },
commit: commitMatch ? { hash: commitMatch[1], url: commitMatch[2] } : { hash: '', url: '' },
contributor: contributorMatch ? { username: contributorMatch[1], url: contributorMatch[2] } : { username: 'unknown', url: '' },
content: contentMatch ? contentMatch[1].trim() : entry.trim(),
};
});
logs.push({
version,
entries,
});
}
return logs;
}

View File

@@ -0,0 +1,154 @@
---
const iconSize = '20';
const refreshIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="${iconSize}" height="${iconSize}" viewBox="0 0 24 24"><!-- Icon from Tabler Icons by Paweł Kuna - https://github.com/tabler/tabler-icons/blob/master/LICENSE --><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20 11A8.1 8.1 0 0 0 4.5 9M4 5v4h4m-4 4a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4"/></svg>`;
const copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="${iconSize}" height="${iconSize}" viewBox="0 0 24 24"><!-- Icon from Tabler Icons by Paweł Kuna - https://github.com/tabler/tabler-icons/blob/master/LICENSE --><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M7 9.667A2.667 2.667 0 0 1 9.667 7h8.666A2.667 2.667 0 0 1 21 9.667v8.666A2.667 2.667 0 0 1 18.333 21H9.667A2.667 2.667 0 0 1 7 18.333z"/><path d="M4.012 16.737A2 2 0 0 1 3 15V5c0-1.1.9-2 2-2h10c.75 0 1.158.385 1.5 1"/></g></svg>`;
const copiedIcon = `<svg xmlns="http://www.w3.org/2000/svg" width="${iconSize}" height="${iconSize}" viewBox="0 0 24 24"><!-- Icon from Tabler Icons by Paweł Kuna - https://github.com/tabler/tabler-icons/blob/master/LICENSE --><path fill="currentColor" d="M18.333 6A3.667 3.667 0 0 1 22 9.667v8.666A3.667 3.667 0 0 1 18.333 22H9.667A3.667 3.667 0 0 1 6 18.333V9.667A3.667 3.667 0 0 1 9.667 6zM15 2c1.094 0 1.828.533 2.374 1.514a1 1 0 1 1-1.748.972C15.405 4.088 15.284 4 15 4H5c-.548 0-1 .452-1 1v9.998c0 .32.154.618.407.805l.1.065a1 1 0 1 1-.99 1.738A3 3 0 0 1 2 15V5c0-1.652 1.348-3 3-3zm1.293 9.293L13 14.585l-1.293-1.292a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414"/></svg>`;
---
<div class="key-generator">
<div class="key-row">
<input type="text" class="key-input" readonly />
<button class="cbtn btn-refresh" title="Generate new key">
<span set:html={refreshIcon} aria-label="Refresh" />
</button>
<button class="cbtn btn-copy" title="Copy to clipboard">
<span set:html={copyIcon} aria-label="Copy" class="icon-copy" />
<span set:html={copiedIcon} aria-label="Copied" class="icon-copied hidden" />
</button>
</div>
<div class="info-text">
Generated locally in your browser - no network or server involved
</div>
</div>
<script>
function generateKey({ keyInputElement }: { keyInputElement: HTMLInputElement }) {
// Generate a 32-byte (256-bit) encryption key
const array = new Uint8Array(32);
crypto.getRandomValues(array);
// Convert to hex format
const key = Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');
keyInputElement.value = key;
}
function copyToClipboard({ keyInputElement, copyButtonElement, iconCopyElement, iconCopiedElement }: { keyInputElement: HTMLInputElement; copyButtonElement: HTMLButtonElement; iconCopyElement: HTMLSpanElement; iconCopiedElement: HTMLSpanElement }) {
keyInputElement.select();
keyInputElement.setSelectionRange(0, 64); // For mobile devices
navigator.clipboard.writeText(keyInputElement.value).then(() => {
iconCopyElement.classList.add('hidden');
iconCopiedElement.classList.remove('hidden');
copyButtonElement.disabled = true;
setTimeout(() => {
iconCopyElement.classList.remove('hidden');
iconCopiedElement.classList.add('hidden');
copyButtonElement.disabled = false;
}, 1_000);
}).catch(() => {
// Fallback for older browsers
document.execCommand('copy');
});
}
const keyGenerators = document.querySelectorAll('.key-generator');
keyGenerators.forEach((keyGenerator) => {
const refreshButtonElement = keyGenerator.querySelector('.btn-refresh')!;
const copyButtonElement = keyGenerator.querySelector<HTMLButtonElement>('.btn-copy')!;
const keyInputElement = keyGenerator.querySelector<HTMLInputElement>('.key-input')!;
const iconCopyElement = keyGenerator.querySelector<HTMLSpanElement>('.icon-copy')!;
const iconCopiedElement = keyGenerator.querySelector<HTMLSpanElement>('.icon-copied')!;
generateKey({ keyInputElement });
refreshButtonElement.addEventListener('click', () => generateKey({ keyInputElement }));
copyButtonElement.addEventListener('click', () => copyToClipboard({ copyButtonElement, keyInputElement, iconCopyElement, iconCopiedElement }));
});
</script>
<style>
.key-generator {
/* background-color: var(--ec-frm-trmBg);
border-radius: var(--ec-brdRad);
border: 1px solid var(--ec-brdCol);
font-family: monospace;
max-width: 100%; */
}
.key-row {
display: flex;
align-items: center;
}
.key-input {
flex: 1;
background-color: var(--sl-color-black);
border: 1px solid var(--sl-color-gray-5);
border-radius: 4px 0 0 4px;
padding: 8px 12px;
font-family: var(--__sl-font-mono, monospace);
font-size: 14px;
color: var(--sl-color-gray-2);
min-width: 0; /* Allow input to shrink */
border-right: none;
}
.key-input:focus {
outline: none;
border-color: var(--ec-frm-inpBrd, #4a9eff);
box-shadow: 0 0 0 2px var(--ec-frm-inpBrd, #4a9eff)33;
}
.cbtn {
background-color: var(--ec-frm-btnBg);
border: 1px solid var(--ec-brdCol);
padding: 10px 12px;
cursor: pointer;
font-size: 16px;
transition: all 0.2s ease;
min-width: 44px;
display: flex;
align-items: center;
justify-content: center;
margin-top: 0;
}
.cbtn.btn-copy {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
border-left: none;
}
.cbtn.btn-refresh {
border-radius: 0;
}
.cbtn:hover {
background-color: var(--sl-color-gray-6)!important;
}
.cbtn:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
.btn-refresh:hover:not(:disabled) {
background-color: var(--ec-frm-btnBgHover, #3a3a3a);
}
.btn-copy:hover:not(:disabled) {
background-color: var(--ec-frm-btnBgHover, #3a3a3a);
}
.info-text {
color: var(--ec-frm-txtSecondary, #888888);
font-style: italic;
margin-top: 0;
}
</style>

View File

@@ -1,8 +1,8 @@
import type { ConfigDefinition, ConfigDefinitionElement } from 'figue';
import { isArray, isEmpty, isNil } from 'lodash-es';
import { marked } from 'marked';
import { castArray, isArray, isEmpty, isNil } from 'lodash-es';
import { configDefinition } from '../../papra-server/src/modules/config/config';
import { renderMarkdown } from './markdown';
function walk(configDefinition: ConfigDefinition, path: string[] = []): (ConfigDefinitionElement & { path: string[] })[] {
return Object
@@ -46,16 +46,21 @@ const rows = configDetails
};
});
const mdSections = rows.map(({ documentation, env, path, defaultValue }) => `
### ${env}
const mdSections = rows.map(({ documentation, env, path, defaultValue }) => {
const envs = castArray(env);
const [firstEnv, ...restEnvs] = envs;
return `
### ${firstEnv}
${documentation}
- Path: \`${path.join('.')}\`
- Environment variable: \`${env}\`
- Environment variable: \`${firstEnv}\` ${restEnvs.length ? `, with fallback to: ${restEnvs.map(e => `\`${e}\``).join(', ')}` : ''}
- Default value: \`${defaultValue}\`
`.trim()).join('\n\n---\n\n');
`.trim();
}).join('\n\n---\n\n');
function wrapText(text: string, maxLength = 75) {
const words = text.split(' ');
@@ -80,25 +85,15 @@ function wrapText(text: string, maxLength = 75) {
const fullDotEnv = rows.map(({ env, defaultValue, documentation }) => {
const isEmptyDefaultValue = isNil(defaultValue) || (isArray(defaultValue) && isEmpty(defaultValue)) || defaultValue === '';
const envs = castArray(env);
const [firstEnv] = envs;
return [
...wrapText(documentation),
`# ${env}=${isEmptyDefaultValue ? '' : defaultValue}`,
`# ${firstEnv}=${isEmptyDefaultValue ? '' : defaultValue}`,
].join('\n');
}).join('\n\n');
// Dirty hack to add the same anchors to the headings as the ones generated by Starlight
const renderer = new marked.Renderer();
renderer.heading = function ({ text, depth }) {
const slug = text.toLowerCase().replace(/\W+/g, '-');
return `
<div class="sl-heading-wrapper level-h${depth}">
<h${depth} id="${slug}">${text}</h${depth}>
<a class="sl-anchor-link" href="#${slug}"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only">Section titled “Configuration files”</span></a>
</div>
`.trim().replace(/\n/g, '');
};
const sectionsHtml = marked.parse(mdSections, { renderer });
const sectionsHtml = renderMarkdown(mdSections);
export { fullDotEnv, mdSections, sectionsHtml };

View File

@@ -39,7 +39,7 @@ By integrating Papra with OwlRelay, your instance will generate email addresses
3. **Configure your Papra instance**
Once you have created your API key, you can configure your Papra instance to receive emails by setting the `OWLRELAY_API_KEY` and `OWLRELAY_WEBHOOK_SECRET` environment variables.
Once you have created your API key, you can configure your Papra instance to receive emails by setting the `OWLRELAY_API_KEY` and `INTAKE_EMAILS_WEBHOOK_SECRET` environment variables.
```bash
# Enable intake emails

View File

@@ -0,0 +1,448 @@
---
title: Setup Document Encryption
description: Step-by-step guide to enable and configure document encryption in Papra for enhanced data security.
slug: guides/document-encryption
---
import { Steps } from '@astrojs/starlight/components';
import { Aside } from '@astrojs/starlight/components';
import { Code } from '@astrojs/starlight/components';
import { Tabs, TabItem } from '@astrojs/starlight/components';
import EncryptionKeyGenerator from '../../../components/encryption-key-generator.astro';
<Aside type="note">
Document encryption is available in Papra v0.9.0 and above.
</Aside>
Document encryption in Papra provides end-to-end protection for your stored documents using industry-standard AES-256-GCM encryption. This guide will walk you through enabling encryption, understanding how it works, and managing encryption keys.
## How Encryption Works
Papra uses a two-layer encryption approach that provides both security and flexibility:
### Key Encryption Architecture
1. **Key Encryption Key (KEK)**: A master key that you provide, used to encrypt document-specific keys
2. **Document Encryption Key (DEK)**: Unique per-document keys that actually encrypt your files
3. **File Encryption**: Each document gets its own random 256-bit encryption key for maximum security
<div class="dark:block hidden">
![Key Encryption Architecture](../../../assets/docs/encryption-schema-light.png)
</div>
<div class="dark:hidden block">
![Key Encryption Architecture](../../../assets/docs/encryption-schema-dark.png)
</div>
### Encryption Flow
<Steps>
1. **Document Upload**: When you upload a document, Papra generates a unique 256-bit encryption key (DEK)
2. **File Encryption**: The document is encrypted using AES-256-GCM with the DEK
3. **Key Wrapping**: The DEK is encrypted (wrapped) using your Key Encryption Key (KEK)
4. **Storage**: The encrypted document and wrapped DEK are stored separately - the file in your storage backend, the wrapped key in the database along with the document metadata
5. **Retrieval**: When accessing a document, Papra unwraps the DEK using your KEK, then decrypts the file stream
</Steps>
<Aside type="note">
This architecture means that even if someone gains access to your file storage, they cannot decrypt documents without access to both your document records and your KEK, in other words, without your database and your environment variables.
</Aside>
## Quick Setup
<Steps>
1. **Generate an encryption key**
Generate a secure random 256-bit key in hex format, using this generator or OpenSSL command.
<Tabs>
<TabItem label="Key generator">
<EncryptionKeyGenerator />
</TabItem>
<TabItem label="OpenSSL command">
```bash
openssl rand -hex 32
```
This will output something like: `0deba5534bd70548de92d1fd4ae37cf901cca3dc20589b7e022ddb680c98e50c`
</TabItem>
</Tabs>
2. **Enable encryption in your configuration**
Add the following environment variables to your `.env` file or Docker configuration:
```bash
DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED=true
DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS=<your-encryption-key>
```
3. **Restart Papra**
Restart your Papra instance to apply the encryption settings.
</Steps>
## Configuration Options
### Environment Variables
| Variable | Description | Required |
|----------|-------------|----------|
| `DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED` | Enable/disable document encryption | No |
| `DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS` | Key encryption keys for document encryption | Yes (if encryption enabled) |
### Key Formats
<Tabs>
<TabItem label="Single Key">
For simple setups, provide a single 32-byte hex string:
```bash
DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS=<your-encryption-key>
```
This key will automatically be assigned version `1`.
</TabItem>
<TabItem label="Multiple Keys">
For key rotation and advanced setups, provide versioned keys:
```bash
DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS=1:<your-encryption-key-1>,2:<your-encryption-key-2>
```
- The highest version key encrypts new documents
- All keys can decrypt existing documents
- Versions can be any alphabetically sortable string
- Order in the list doesn't matter
</TabItem>
</Tabs>
## Docker Compose Setup
Add encryption configuration to your Docker Compose file:
<Tabs>
<TabItem label="Environment Variables">
```yaml title="docker-compose.yml" ins={8-9}
services:
papra:
container_name: papra
image: ghcr.io/papra-hq/papra:latest
restart: unless-stopped
environment:
# ... other environment variables ...
- DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED=true
- DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS=<your-encryption-key>
volumes:
- ./app-data:/app/app-data
ports:
- "1221:1221"
```
</TabItem>
<TabItem label="Config File">
```yaml title="docker-compose.yml"
services:
papra:
container_name: papra
image: ghcr.io/papra-hq/papra:latest
restart: unless-stopped
volumes:
- ./app-data:/app/app-data
- ./papra.config.yaml:/app/app-data/papra.config.yaml
ports:
- "1221:1221"
```
```yaml title="./papra.config.yaml"
documentsStorage:
encryption:
isEncryptionEnabled: true
documentKeyEncryptionKeys: "<your-encryption-key>"
```
</TabItem>
</Tabs>
## Key Management
### Key Rotation
Key rotation allows you to replace encryption keys without losing access to existing documents:
<Steps>
1. **Generate a new key**
```bash
openssl rand -hex 32
```
2. **Add the new key with a higher version**
```bash
DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS=1:old_key_here,2:new_key_here
```
3. **Restart Papra**
New documents will use the highest version key (version 2), while existing documents remain accessible with the old key.
4. **Optional: Remove old keys**
Once you're confident all documents are using the new key, you can remove old keys. However, this will make any documents encrypted with old keys inaccessible.
</Steps>
<Aside type="caution">
Never remove a key version if there are still documents encrypted with that key, unless you're certain you no longer need access to those documents.
</Aside>
### Key Security Best Practices
1. **Store keys securely**: Use a secrets management system in production
2. **Use different keys per environment**: Development, staging, and production should have separate keys
3. **Backup your keys**: Loss of encryption keys means permanent loss of document access
4. **Rotate keys periodically**: Consider rotating keys annually or after security incidents
5. **Limit key access**: Only authorized personnel should have access to encryption keys
### Docker Secrets Example
For production environments, store your encryption keys securely using external secret management systems or secure file systems, and reference them via environment variables.
## Compatibility and Migration
### Enabling Encryption on Existing Instances
When you enable encryption on a Papra instance that already has documents:
- **Existing documents**: Remain unencrypted but accessible
- **New documents**: Are encrypted using the current KEK
- **Mixed storage**: Papra automatically handles both encrypted and unencrypted documents
### Migrating Existing Documents to Encrypted Format
If you want to encrypt all existing unencrypted documents after enabling encryption, Papra provides a maintenance command to handle this migration automatically.
<Aside type="caution">
It's advised to make a backup of your documents and database before running the migration.
</Aside>
<Steps>
1. **Verify encryption is properly configured**
Ensure encryption is enabled and working for new documents before migrating existing ones:
```bash
# Check that your configuration includes:
DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED=true
DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS=<your-key>
```
2. **Run dry-run to preview changes**
<Tabs>
<TabItem label="Docker Compose">
```bash
# Run dry-run inside the Docker container
docker compose exec papra pnpm maintenance:encrypt-all-documents --dry-run
```
</TabItem>
<TabItem label="Docker">
```bash
# Run dry-run inside the Docker container
docker exec -it papra pnpm maintenance:encrypt-all-documents --dry-run
```
</TabItem>
<TabItem label="Source Installation">
```bash
# From your Papra server directory
pnpm maintenance:encrypt-all-documents --dry-run
```
</TabItem>
</Tabs>
This will show you:
- How many documents will be encrypted
- Which documents will be affected
- No actual encryption will be performed
4. **Run the migration**
<Tabs>
<TabItem label="Docker Compose">
```bash
# Run migration inside the Docker container
docker compose exec papra pnpm maintenance:encrypt-all-documents
```
</TabItem>
<TabItem label="Docker">
```bash
# Run migration inside the Docker container
docker exec -it papra pnpm maintenance:encrypt-all-documents
```
</TabItem>
<TabItem label="Source Installation">
```bash
# From your Papra server directory
pnpm maintenance:encrypt-all-documents
```
</TabItem>
</Tabs>
The command will:
- Find all unencrypted documents
- Encrypt each document using your configured KEK
- Update database records with encryption metadata
- Remove original unencrypted files from storage
- Provide progress logging throughout the process
5. **Verify migration success**
After migration:
- Test document access through the Papra interface
- Check that storage files are now encrypted (should start with `PP01`)
- Verify all documents are accessible and downloadable
</Steps>
<Aside type="tip">
**Migration Performance**
- The migration processes documents sequentially to ensure reliability
- Large document collections may take considerable time
- Monitor disk space during migration (temporary storage overhead)
- Consider running during maintenance windows for production systems
</Aside>
#### Troubleshooting Migration Issues
**Migration fails with "Document encryption is not enabled"**
- Verify `DOCUMENT_STORAGE_ENCRYPTION_IS_ENABLED=true` is set
- Restart Papra after configuration changes
**Migration fails with "Document encryption keys are not set"**
- Ensure `DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS` contains valid keys
- Verify key format is correct (64-character hex string)
**Migration stops or fails partway**
- Check available disk space
- Review Papra logs for specific error messages
- Restore from backup and retry after fixing the issue
**Documents inaccessible after migration**
- Verify encryption keys are still properly configured
- Check that Papra can access your storage backend
- Restore from backup if necessary
### Disabling Encryption
If you disable encryption:
- **Encrypted documents**: Remain encrypted but are automatically decrypted when accessed (if KEK is still available)
- **New documents**: Are stored unencrypted
- **Data loss risk**: If you remove the KEK while encrypted documents exist, those documents become inaccessible
<Aside type="caution">
Disabling encryption doesn't automatically decrypt existing documents in storage. They remain encrypted and require the KEK for access.
</Aside>
### Storage Driver Compatibility
The encryption layer sits between Papra and your chosen storage driver, providing consistent encryption regardless of where files are stored (S3, Azure Blob Storage, File System, etc.).
## Technical Details
### Encryption Algorithm
- **Algorithm**: AES-256-GCM (Authenticated Encryption)
- **Key size**: 256 bits (32 bytes)
- **IV size**: 96 bits (12 bytes)
- **Authentication tag**: 128 bits (16 bytes)
### File Format
Encrypted files use a custom format with a magic number for identification:
```
| Magic (4 bytes) | IV (12 bytes) | Encrypted Data | Auth Tag (16 bytes) |
```
- **Magic number**: `PP01` - identifies Papra encrypted files
- **IV**: Initialization vector for GCM mode
- **Encrypted Data**: The actual encrypted document content
- **Auth Tag**: Authentication tag for integrity verification
### Performance Considerations
- **Streaming encryption**: Files are encrypted/decrypted in streams, minimizing memory usage
- **No size overhead**: Minimal storage overhead (32 bytes per file for headers)
- **CPU impact**: Modern processors handle AES encryption efficiently
## Troubleshooting
### Common Issues
**"Document KEK required" error**
- Ensure `DOCUMENT_STORAGE_DOCUMENT_KEY_ENCRYPTION_KEYS` is set
- Verify the key format is correct (64 character hex string)
**"Document KEK not found" error**
- The document was encrypted with a key version that's no longer available
- Add the missing key version back to your configuration
**"Unsupported encryption algorithm" error**
- The document uses an encryption algorithm not supported by this Papra version
- This shouldn't occur in normal operation
**Performance issues**
- Consider your storage driver's performance characteristics
- Encryption adds minimal overhead, but network/disk I/O remains the bottleneck
### Verification
To verify encryption is working:
1. Upload a document after enabling encryption
2. Check your storage backend - the file should not be readable as plain text
3. The file should start with the magic number `PP01` if you examine it directly
<Aside>
You can find complete configuration options in the [configuration reference](/self-hosting/configuration). Look for variables prefixed with `DOCUMENT_STORAGE_ENCRYPTION_`.
</Aside>
## Security Considerations
### Threat Model
Document encryption in Papra protects against:
- **Storage compromise**: If your file storage is breached, documents remain encrypted
- **Database-only breach**: Without the KEK, wrapped DEKs cannot be unwrapped
- **Configuration exposure**: If the KEK is exposed, the files remain encrypted as long as the DEK are not exposed
### Limitations
Encryption does not protect against:
- **Application-level access**: Users with document access can view decrypted content
- **Memory dumps**: Decrypted content exists temporarily in application memory
- **Key and database compromise**: If KEKs are stolen, all DEKs can be decrypted if the database is compromised
- **Full system compromise**: If the entire Papra instance is compromised, documents can be accessed

View File

@@ -0,0 +1,102 @@
---
title: Using Tagging Rules
description: Learn how to automate document organization with tagging rules.
slug: guides/tagging-rules
---
## What are Tagging Rules?
Tagging rules allow you to automatically apply tags to documents based on specific conditions. This helps maintain consistent organization without manual effort, especially when dealing with large numbers of documents.
## How Tagging Rules Work
When a tagging rule is enabled, it automatically checks new documents as they're uploaded. If a document matches the rule's conditions, the specified tags are automatically applied.
### Rule Components
Each tagging rule consists of:
1. **Conditions**: Rules that determine which documents should be tagged
- Field: The document property to check (e.g., name, content)
- Operator: How to compare the field (e.g., contains, equals)
- Value: The text to match against
2. **Actions**: The tags to apply when conditions are met
## Applying Rules to Existing Documents
### The "Run Now" Feature
When you create a new tagging rule, it only applies to documents uploaded *after* the rule is created. To apply the rule to documents that already exist in your organization, use the **"Apply to existing documents"** button.
This feature is particularly useful when:
- You create a new rule and want to organize your existing documents
- You modify a rule and want to reprocess documents
- You're setting up your organization and want to retroactively organize imported documents
### How to Apply a Rule to Existing Documents
1. Navigate to your organization's Tagging Rules page
2. Find the rule you want to apply
3. Click the **"Apply to existing documents"** button
4. Confirm the action in the dialog
5. The task is queued and will be processed in the background
The system will:
- Queue a background task to process all documents
- Process documents in batches to avoid overloading the system
- Check all existing documents in your organization
- Apply tags where the rule's conditions match
- Show you a success message once the task is queued
:::tip
Applying a rule to existing documents runs as a background task, so you don't need to wait for it to complete. The processing happens asynchronously and efficiently handles large document collections by processing them in batches.
:::
## Best Practices
### Creating Effective Rules
1. **Be specific**: Use precise conditions to avoid over-tagging
2. **Test first**: Create a rule and test it on a few documents before applying to all existing documents
3. **Use multiple conditions**: Combine conditions for more accurate matching
4. **Review regularly**: Periodically review your rules to ensure they're still relevant
### Example Rules
**Invoice Classification**
- Condition: Document name contains "invoice"
- Action: Apply "Invoice" tag
**Quarterly Reports**
- Condition: Document name contains "Q1" or "Q2" or "Q3" or "Q4"
- Action: Apply "Report" tag
## Using the API
You can also apply tagging rules programmatically using the API. The endpoint enqueues a background task and returns immediately:
```bash
curl -X POST \
-H "Authorization: Bearer YOUR_API_TOKEN" \
https://api.papra.app/api/organizations/YOUR_ORG_ID/tagging-rules/RULE_ID/apply
```
Response (HTTP 202 Accepted):
```json
{
"taskId": "task_abc123"
}
```
Where:
- `taskId`: The ID of the background task processing your request
:::note
The API returns a task ID immediately. The actual processing happens in the background and may take some time depending on the number of documents. Task status retrieval will be available in a future release.
:::
## Related Resources
- [API Endpoints Documentation](/resources/api-endpoints)
- [CLI Documentation](/resources/cli)

View File

@@ -18,8 +18,107 @@ The public API uses a bearer token for authentication. You can get a token by lo
</details>
To authenticate your requests, include the token in the `Authorization` header with the `Bearer` prefix:
```
Authorization: Bearer YOUR_API_TOKEN
```
### Examples
**Using cURL:**
```bash
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://api.papra.app/api/organizations
```
**Using JavaScript (fetch):**
```javascript
const response = await fetch('https://api.papra.app/api/organizations', {
headers: {
'Authorization': 'Bearer YOUR_API_TOKEN',
'Content-Type': 'application/json'
}
})
```
### API Key Permissions
When creating an API key, you can select from the following permissions:
**Organizations:**
- `organizations:create` - Create new organizations
- `organizations:read` - Read organization information and list organizations of the user
- `organizations:update` - Update organization details
- `organizations:delete` - Delete organizations
**Documents:**
- `documents:create` - Upload and create new documents
- `documents:read` - Read and download documents
- `documents:update` - Update document metadata and content
- `documents:delete` - Delete documents
**Tags:**
- `tags:create` - Create new tags
- `tags:read` - Read tag information and list tags
- `tags:update` - Update tag details
- `tags:delete` - Delete tags
## Endpoints
### List organizations
**GET** `/api/organizations`
List all organizations accessible to the authenticated user.
- Required API key permissions: `organizations:read`
- Response (JSON)
- `organizations`: The list of organizations.
### Create an organization
**POST** `/api/organizations`
Create a new organization.
- Required API key permissions: `organizations:create`
- Body (JSON)
- `name`: The organization name (3-50 characters).
- Response (JSON)
- `organization`: The created organization.
### Get an organization
**GET** `/api/organizations/:organizationId`
Get an organization by its ID.
- Required API key permissions: `organizations:read`
- Response (JSON)
- `organization`: The organization.
### Update an organization
**PUT** `/api/organizations/:organizationId`
Update an organization's name.
- Required API key permissions: `organizations:update`
- Body (JSON)
- `name`: The new organization name (3-50 characters).
- Response (JSON)
- `organization`: The updated organization.
### Delete an organization
**DELETE** `/api/organizations/:organizationId`
Delete an organization by its ID.
- Required API key permissions: `organizations:delete`
- Response: empty (204 status code)
### Create a document
**POST** `/api/organizations/:organizationId/documents`
@@ -208,3 +307,13 @@ Remove a tag from a document.
- Required API key permissions: `tags:read` and `documents:update`
- Response: empty (204 status code)
### Apply tagging rule to existing documents
**POST** `/api/organizations/:organizationId/tagging-rules/:taggingRuleId/apply`
Enqueue a background task to apply a tagging rule to all existing documents in the organization. This endpoint returns immediately with a task ID, and the processing happens asynchronously in the background. The task will check all documents and apply tags where the rule's conditions match.
- Required API key permissions: `tags:read` and `documents:update`
- Response (JSON, HTTP 202)
- `taskId`: The ID of the background task. You can use this to track the task's progress (task status retrieval coming in a future release).

View File

@@ -0,0 +1,40 @@
---
title: Document Deduplication
description: How Papra prevents duplicate documents and saves storage space.
slug: architecture/document-deduplication
---
## Overview
Papra automatically detects and prevents duplicate documents per organization using content hashing. This ensures that if the same file is uploaded multiple times, only one copy is stored, saving storage space and reducing clutter.
## How It Works
When a document is added to an organization (upload, email ingestion, folder sync, ...), the server computes a **SHA-256 hash** of the file content and checks if a document with the same hash already exists in that organization.
- If there is **no document with the same hash** in the organization, the new document is added as usual
- If a document **with same content exists**, the upload is rejected
- If a document **with same content was previously deleted** (in trash), it is restored instead of creating a new copy, the metadata is updated to match the newly added document
## Technical Details
### Hash Algorithm
- Papra uses **SHA-256** for content hashing.
- Computed during streaming upload (no extra I/O)
- 64-character hexadecimal string stored in the database
### Database Constraint
The database enforces uniqueness with a composite index:
```sql
UNIQUE (organization_id, original_sha256_hash)
```
This guarantees no two active documents in the same organization can have identical content.
### File Content Only
Only the **file content** is hashed and used for deduplication, filenames, upload dates, and metadata don't affect deduplication. Two files are considered duplicates if and only if their content is strictly identical.

View File

@@ -0,0 +1,38 @@
---
title: No-Mutation Principle
description: Why Papra never modifies your original documents and the architectural decisions behind this choice.
slug: architecture/no-mutation-principle
---
## Core Philosophy
Papra follows a fundamental principle: **documents are never mutated after upload**. When you input a document, you can always retrieve it exactly as it was uploaded.
## The Design Choice
An archiving platform should guarantee users they can retrieve their documents in their original form. This means:
- No conversion to different formats
- No metadata injection into the file itself
- No overlay of OCR-ed content on scanned PDFs
- No processing that modifies the original file
The simple mental model is: **"If I input X, I'll retrieve X"**
## Why This Matters
### Trust and Reliability
When archiving important documents, users need absolute confidence that their files remain untouched. Whether it's a legal document, a medical record, or a personal photo, the original should be sacrosanct.
### Simplicity
This approach eliminates the mental overhead of wondering "what happened to my file?" Users don't need to understand concepts like:
- Original vs. processed versions
- Format conversions
- OCR overlays
- Metadata injection
### Flexibility for the Future
While Papra currently doesn't mutate documents, the architecture leaves room for future enhancements. If needed, a "processed" version concept could be added alongside originals, giving users the choice without forcing a particular model.

View File

@@ -0,0 +1,62 @@
---
title: Organization Deletion & Purge
description: How Papra handles organization deletion with a grace period and eventual purge.
slug: architecture/organization-deletion-purge
---
## Overview
Papra implements a two-phase deletion process for organizations: soft deletion followed by hard deletion (purge). This provides a grace period for recovery while ensuring eventual cleanup of resources.
## Deletion Process
### Who Can Delete
Only the **organization owner** can delete an organization. Admins and members do not have this permission.
### What Happens During Deletion
When an organization is deleted:
1. **Members are removed** - All organization members are stripped from the organization, leaving them dangling
2. **Invitations are removed** - All pending invitations are deleted
3. **Metadata is recorded**:
- `deletedAt`: Timestamp when the deletion occurred
- `deletedBy`: ID of the user (owner) who deleted the organization
- `scheduledPurgeAt`: Future date when hard deletion will occur (default: 30 days)
The organization itself remains in the database in a soft-deleted state, allowing for potential restoration.
## Purge Process
### When Purge Occurs
Hard deletion (purge) happens when `scheduledPurgeAt` is reached. By default, this is **30 days** after the deletion date.
### What Gets Purged
When an organization is purged:
- **All documents** are deleted from storage
- **All database records** related to the organization are removed (cascade handles related records, like Tags, Intake Emails, etc.)
- The organization itself is permanently deleted
The process handles documents in batches using an iterator to avoid memory issues with large organizations.
### Background Task
Purging is handled by a periodic background task that:
1. Queries for organizations with `scheduledPurgeAt` in the past
2. For each expired organization:
- Deletes all document files from storage
- Hard deletes the organization (cascade handles related records)
3. Logs the process for monitoring and debugging
The task continues even if individual file deletions fail, logging errors without blocking the entire purge operation.
## Recovery
Organizations can be restored before the `scheduledPurgeAt` date is reached, but only by the user who deleted them (the previous owner). After this date, recovery is no longer possible, even if the purge has not yet occurred.
> Note: After recovery, the organization owner must re-invite members as they were removed during deletion.

View File

@@ -5,6 +5,7 @@ export const sidebar = [
label: 'Getting Started',
items: [
{ label: 'Introduction', slug: '' },
{ label: 'Changelog', link: '/changelog' },
],
},
{
@@ -35,6 +36,31 @@ export const sidebar = [
label: 'Setup Custom OAuth2 Providers',
slug: 'guides/setup-custom-oauth2-providers',
},
{
label: 'Document Encryption',
slug: 'guides/document-encryption',
},
{
label: 'Tagging Rules',
slug: 'guides/tagging-rules',
},
],
},
{
label: 'Architecture',
items: [
{
label: 'No-Mutation Principle',
slug: 'architecture/no-mutation-principle',
},
{
label: 'Document Deduplication',
slug: 'architecture/document-deduplication',
},
{
label: 'Organization Deletion',
slug: 'architecture/organization-deletion-purge',
},
],
},
{

16
apps/docs/src/markdown.ts Normal file
View File

@@ -0,0 +1,16 @@
import { marked } from 'marked';
const renderer = new marked.Renderer();
renderer.heading = function ({ text, depth }) {
const slug = text.toLowerCase().replace(/\W+/g, '-');
return `
<div class="sl-heading-wrapper level-h${depth}">
<h${depth} id="${slug}">${text}</h${depth}>
<a class="sl-anchor-link" href="#${slug}"><span aria-hidden="true" class="sl-anchor-icon"><svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentcolor" d="m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z"></path></svg></span><span class="sr-only">Section titled “Configuration files”</span></a>
</div>
`.trim().replace(/\n/g, '');
};
export function renderMarkdown(markdown: string) {
return marked.parse(markdown, { renderer });
}

View File

@@ -0,0 +1,55 @@
---
import StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';
import rawChangelog from '../../../../packages/docker/CHANGELOG.md?raw';
import { parseChangelog } from '../changelog-parser';
import { renderMarkdown } from '../markdown';
const changelog = parseChangelog(rawChangelog);
---
<StarlightPage
frontmatter={{
title: 'Papra changelog',
description: 'View the changelogs of the docker images released by Papra.',
tableOfContents: false,
}}
>
<p>
Here are the changelogs of the docker images released by Papra.<br />
For version after v0.9.6, Papra uses Calver as a versioning system with the format YY.MM.N where N is the number of releases in the month starting at 0 (e.g. 25.06.0 is the first release of June 2025).
</p>
{
changelog.map(({ entries, version }) => (
<section>
<h2 id={version} class="pb-1 mt-14">v{version}</h2>
<ul>
{entries.map(entry => (
<li>
<div class="flex flex-col">
<div class="text-foreground lh-normal changelog-entry" set:html={renderMarkdown(entry.content)} />
<div class="text-xs mt-1 flex gap-1 flex-wrap">
<a href={entry.pr.url} class="text-muted-foreground hover:bg-muted transition border border-muted border-solid rounded-md no-underline px-1 py-0.5">PR #{entry.pr.number}</a>
<a href={entry.commit.url} class="text-muted-foreground hover:bg-muted transition border border-muted border-solid rounded-md no-underline px-1 py-0.5">{entry.commit.hash.slice(0, 7)}</a>
<a href={entry.contributor.url} class="text-muted-foreground hover:bg-muted transition border border-muted border-solid rounded-md no-underline px-1 py-0.5">
By @{entry.contributor.username}
</a>
</div>
</div>
</li>
))}
</ul>
</section>
))
}
</StarlightPage>
<style is:global>
.changelog-entry pre {
border-radius: 6px;
color: hsl(var(--muted-foreground) / var(--un-text-opacity));
}
</style>

View File

@@ -1,7 +1,7 @@
import type { APIRoute } from 'astro';
import type { ConfigDefinition } from 'figue';
import { z } from 'astro:content';
import { mapValues } from 'lodash-es';
import { z } from 'zod';
import { zodToJsonSchema } from 'zod-to-json-schema';
import { configDefinition } from '../../../papra-server/src/modules/config/config';

View File

@@ -1,5 +1,6 @@
import {
defineConfig,
presetTypography,
presetUno,
transformerDirectives,
transformerVariantGroup,
@@ -10,12 +11,13 @@ export default defineConfig({
presets: [
presetUno({
dark: {
dark: '[data-kb-theme="dark"]',
light: '[data-kb-theme="light"]',
dark: '[data-theme="dark"]',
light: '[data-theme="light"]',
},
prefix: '',
}),
presetAnimations(),
presetTypography(),
],
transformers: [transformerVariantGroup(), transformerDirectives()],
theme: {

1
apps/papra-client/.nvmrc Normal file
View File

@@ -0,0 +1 @@
22

View File

@@ -1,129 +0,0 @@
# @papra/app-client
## 0.8.2
## 0.8.1
## 0.8.0
### Minor Changes
- [#432](https://github.com/papra-hq/papra/pull/432) [`6723baf`](https://github.com/papra-hq/papra/commit/6723baf98ad46f989fe1e1e19ad0dd25622cca77) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added new webhook events: document:updated, document:tag:added, document:tag:removed
- [#432](https://github.com/papra-hq/papra/pull/432) [`6723baf`](https://github.com/papra-hq/papra/commit/6723baf98ad46f989fe1e1e19ad0dd25622cca77) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Webhooks invocation is now defered
### Patch Changes
- [#419](https://github.com/papra-hq/papra/pull/419) [`7768840`](https://github.com/papra-hq/papra/commit/7768840aa4425a03cb96dc1c17605bfa8e6a0de4) Thanks [@Edward205](https://github.com/Edward205)! - Added diacritics and improved wording for Romanian translation
- [#448](https://github.com/papra-hq/papra/pull/448) [`5868800`](https://github.com/papra-hq/papra/commit/5868800bcec6ed69b5441b50e4445fae5cdb5bfb) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added feedback when an error occurs while deleting a tag
- [#412](https://github.com/papra-hq/papra/pull/412) [`ffdae8d`](https://github.com/papra-hq/papra/commit/ffdae8db56c6ecfe63eb263ee606e9469eef8874) Thanks [@OsafAliSayed](https://github.com/OsafAliSayed)! - Simplified the organization intake email list
- [#441](https://github.com/papra-hq/papra/pull/441) [`5e46bb9`](https://github.com/papra-hq/papra/commit/5e46bb9e6a39cd16a83636018370607a27db042a) Thanks [@Zavy86](https://github.com/Zavy86)! - Added Italian (it) language support
- [#455](https://github.com/papra-hq/papra/pull/455) [`b33fde3`](https://github.com/papra-hq/papra/commit/b33fde35d3e8622e31b51aadfe56875d8e48a2ef) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Improved feedback message in case of invalid origin configuration
## 0.7.0
### Minor Changes
- [#417](https://github.com/papra-hq/papra/pull/417) [`a82ff3a`](https://github.com/papra-hq/papra/commit/a82ff3a755fa1164b4d8ff09b591ed6482af0ccc) Thanks [@CorentinTh](https://github.com/CorentinTh)! - v0.7 release
## 0.6.4
### Patch Changes
- [#377](https://github.com/papra-hq/papra/pull/377) [`205c6cf`](https://github.com/papra-hq/papra/commit/205c6cfd461fa0020a93753571f886726ddfdb57) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Improve file preview for text-like files (.env, yaml, extension-less text files,...)
- [#393](https://github.com/papra-hq/papra/pull/393) [`aad36f3`](https://github.com/papra-hq/papra/commit/aad36f325296548019148bc4e32782fe562fd95b) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Fix weird centering in document page for long filenames
- [#394](https://github.com/papra-hq/papra/pull/394) [`f28d824`](https://github.com/papra-hq/papra/commit/f28d8245bf385d7be3b3b8ee449c3fdc88fa375c) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added the possibility to disable login via email, to support sso-only auth
- [#405](https://github.com/papra-hq/papra/pull/405) [`3401cfb`](https://github.com/papra-hq/papra/commit/3401cfbfdc7e280d2f0f3166ceddcbf55486f574) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Introduce APP_BASE_URL to mutualize server and client base url
- [#346](https://github.com/papra-hq/papra/pull/346) [`c54a71d`](https://github.com/papra-hq/papra/commit/c54a71d2c5998abde8ec78741b8c2e561203a045) Thanks [@blstmo](https://github.com/blstmo)! - Fixes 400 error when submitting tags with uppercase hex colour codes.
- [#408](https://github.com/papra-hq/papra/pull/408) [`09e3bc5`](https://github.com/papra-hq/papra/commit/09e3bc5e151594bdbcb1f9df1b869a78e583af3f) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added Romanian (ro) translation
- [#383](https://github.com/papra-hq/papra/pull/383) [`0b276ee`](https://github.com/papra-hq/papra/commit/0b276ee0d5e936fffc1f8284c654a8ada0efbafb) Thanks [@LMArantes](https://github.com/LMArantes)! - Added Brazilian Portuguese (pt-BR) language support
- [#399](https://github.com/papra-hq/papra/pull/399) [`47b69b1`](https://github.com/papra-hq/papra/commit/47b69b15f4f711e47421fc21a3ac447824d67642) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Fix back to organization link in organization settings
- [#403](https://github.com/papra-hq/papra/pull/403) [`1711ef8`](https://github.com/papra-hq/papra/commit/1711ef866d0071a804484b3e163a5e2ccbcec8fd) Thanks [@Icikowski](https://github.com/Icikowski)! - Added Polish (pl) language support
- [#379](https://github.com/papra-hq/papra/pull/379) [`6cedc30`](https://github.com/papra-hq/papra/commit/6cedc30716e320946f79a0a9fd8d3b26e834f4db) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Updated dependencies
- [#411](https://github.com/papra-hq/papra/pull/411) [`2601566`](https://github.com/papra-hq/papra/commit/26015666de197827a65a5bebf376921bbfcc3ab8) Thanks [@4DRIAN0RTIZ](https://github.com/4DRIAN0RTIZ)! - Added Spanish (es) translation
- [#391](https://github.com/papra-hq/papra/pull/391) [`40a1f91`](https://github.com/papra-hq/papra/commit/40a1f91b67d92e135d13dfcd41e5fd3532c30ca5) Thanks [@itsjuoum](https://github.com/itsjuoum)! - Added European Portuguese (pt) translation
- [#378](https://github.com/papra-hq/papra/pull/378) [`f1e1b40`](https://github.com/papra-hq/papra/commit/f1e1b4037b31ff5de1fd228b8390dd4d97a8bda8) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added tag color swatches and picker
## 0.6.3
### Patch Changes
- [#357](https://github.com/papra-hq/papra/pull/357) [`585c53c`](https://github.com/papra-hq/papra/commit/585c53cd9d0d7dbd517dbb1adddfd9e7b70f9fe5) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added a /llms.txt on main website
- [#359](https://github.com/papra-hq/papra/pull/359) [`0c2cf69`](https://github.com/papra-hq/papra/commit/0c2cf698d1a9e9a3cea023920b10cfcd5d83be14) Thanks [@Mavv3006](https://github.com/Mavv3006)! - Add German translation
## 0.6.2
### Patch Changes
- [#333](https://github.com/papra-hq/papra/pull/333) [`ff830c2`](https://github.com/papra-hq/papra/commit/ff830c234a02ddb4cbc480cf77ef49b8de35fbae) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Fixed version release link
## 0.6.1
## 0.6.0
### Minor Changes
- [#317](https://github.com/papra-hq/papra/pull/317) [`79c1d32`](https://github.com/papra-hq/papra/commit/79c1d3206b140cf8b3d33ef8bda6098dcf4c9c9c) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added document activity log
- [#319](https://github.com/papra-hq/papra/pull/319) [`60059c8`](https://github.com/papra-hq/papra/commit/60059c895c4860cbfda69d3c989ad00542def65b) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added pending invitation management page
### Patch Changes
- [#309](https://github.com/papra-hq/papra/pull/309) [`d4f72e8`](https://github.com/papra-hq/papra/commit/d4f72e889a4d39214de998942bc0eb88cd5cee3d) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Disable "Manage subscription" from organization setting by default
- [#308](https://github.com/papra-hq/papra/pull/308) [`759a3ff`](https://github.com/papra-hq/papra/commit/759a3ff713db8337061418b9c9b122b957479343) Thanks [@CorentinTh](https://github.com/CorentinTh)! - I18n: full support for French language
- [#312](https://github.com/papra-hq/papra/pull/312) [`e5ef40f`](https://github.com/papra-hq/papra/commit/e5ef40f36c27ea25dc8a79ef2805d673761eec2a) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Fixed an issue with the reset-password page navigation guard that prevented reset
## 0.5.1
## 0.5.0
### Minor Changes
- [#295](https://github.com/papra-hq/papra/pull/295) [`438a311`](https://github.com/papra-hq/papra/commit/438a31171c606138c4b7fa299fdd58dcbeaaf298) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added support for custom oauth2 providers
- [#291](https://github.com/papra-hq/papra/pull/291) [`0627ec2`](https://github.com/papra-hq/papra/commit/0627ec25a422b7b820b08740cfc2905f9c55c00e) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added invitation system to add users to an organization
### Patch Changes
- [#296](https://github.com/papra-hq/papra/pull/296) [`0ddc234`](https://github.com/papra-hq/papra/commit/0ddc2340f092cf6fe5bf2175b55fb46db7681c36) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Fix register page description
## 0.4.0
### Minor Changes
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added webhook management
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added API keys support
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added document searchable content edit
### Patch Changes
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Added tag creation button in document page
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Improved tag selector input wrapping
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Properly handle file names without extensions
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Wrap text in document preview
- [#280](https://github.com/papra-hq/papra/pull/280) [`85fa5c4`](https://github.com/papra-hq/papra/commit/85fa5c43424d139f5c2752a3ad644082e61d3d67) Thanks [@CorentinTh](https://github.com/CorentinTh)! - Excluded deleted documents from doc count

View File

@@ -6,8 +6,7 @@ export default antfu({
},
ignores: [
// Generated file
'src/modules/i18n/locales.types.ts',
'public/manifest.json',
],
rules: {
@@ -23,4 +22,10 @@ export default antfu({
caughtErrorsIgnorePattern: '^_',
}],
},
}, {
files: ['src/locales/*.dictionary.ts'],
rules: {
// Sometimes for formatting amounts of dollar, we need "${{value}}" as value is interpolated later, it's not a template string here
'no-template-curly-in-string': 'off',
},
});

View File

@@ -27,10 +27,23 @@
<meta property="twitter:image" content="https://papra.app/og-image.png">
<!-- Favicon and Icons -->
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<!-- Structured Data (JSON-LD for rich snippets) -->
<script type="application/ld+json">
@@ -52,8 +65,19 @@
</script>
<style>.sr-only {position: absolute;width: 1px;height: 1px;padding: 0;margin: -1px;overflow: hidden;clip: rect(0, 0, 0, 0);white-space: nowrap;border-width: 0;}</style>
<!-- Prevent flash of wrong theme on load -->
<script>
(function () {
const stored = localStorage?.getItem('papra_color_mode') ?? 'dark';
if (stored === 'dark') {
document.documentElement.setAttribute('data-kb-theme', 'dark');
}
})();
</script>
</head>
<body>
<body class="bg-background text-foreground">
<h1 class="sr-only">Papra - Document archiving and sharing platform</h1>
<p class="sr-only">Papra, the document archiving and sharing platform.</p>

View File

@@ -1,9 +1,8 @@
{
"name": "@papra/app-client",
"type": "module",
"version": "0.8.2",
"version": "0.0.0",
"private": true,
"packageManager": "pnpm@10.12.3",
"description": "Papra frontend client",
"author": "Corentin Thomasset <corentinth@proton.me> (https://corentin.tech)",
"license": "AGPL-3.0-or-later",
@@ -25,35 +24,31 @@
"test:watch": "vitest watch",
"test:e2e": "playwright test",
"typecheck": "tsc --noEmit",
"script:get-missing-i18n-keys": "tsx src/scripts/get-missing-i18n-keys.script.ts",
"script:generate-i18n-types": "tsx src/scripts/generate-i18n-types.script.ts",
"script:sync-i18n-key-order": "tsx src/scripts/sync-i18n-key-order.script.ts"
},
"dependencies": {
"@corentinth/chisels": "^1.3.1",
"@branchlet/core": "^1.0.0",
"@corentinth/chisels": "catalog:",
"@kobalte/core": "^0.13.10",
"@kobalte/utils": "^0.9.1",
"@modular-forms/solid": "^0.25.1",
"@pdfslick/solid": "^2.3.0",
"@solid-primitives/storage": "^4.3.2",
"@solidjs/router": "^0.14.10",
"@tanstack/solid-query": "^5.81.2",
"@tanstack/solid-query": "^5.90.3",
"@tanstack/solid-table": "^8.21.3",
"@unocss/reset": "^0.64.1",
"better-auth": "catalog:",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk-solid": "^1.1.2",
"date-fns": "^4.1.0",
"lodash-es": "^4.17.21",
"ofetch": "^1.4.1",
"posthog-js": "^1.255.1",
"posthog-js-lite": "^4.1.5",
"radix3": "^1.1.2",
"solid-js": "^1.9.7",
"solid-js": "^1.9.9",
"solid-sonner": "^0.2.8",
"tailwind-merge": "^2.6.0",
"ts-pattern": "^5.7.1",
"unocss-preset-animations": "^1.2.1",
"unocss-preset-animations": "^1.3.0",
"unstorage": "^1.16.0",
"valibot": "1.0.0-beta.10"
},
@@ -61,17 +56,14 @@
"@antfu/eslint-config": "catalog:",
"@iconify-json/tabler": "^1.2.19",
"@playwright/test": "^1.53.1",
"@types/lodash-es": "^4.17.12",
"@types/node": "catalog:",
"eslint": "catalog:",
"jsdom": "^25.0.1",
"tinyglobby": "^0.2.14",
"tsx": "^4.20.3",
"typescript": "catalog:",
"unocss": "0.65.0-beta.2",
"vite": "^5.4.19",
"vite-plugin-solid": "^2.11.7",
"vitest": "catalog:",
"yaml": "^2.8.0"
"unocss": "^66.5.4",
"vite": "^7.1.9",
"vite-plugin-solid": "^2.11.9",
"vitest": "catalog:"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig><msapplication><tile><square70x70logo src="/ms-icon-70x70.png"/><square150x150logo src="/ms-icon-150x150.png"/><square310x310logo src="/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,41 @@
{
"name": "Papra",
"icons": [
{
"src": "\/android-icon-36x36.png",
"sizes": "36x36",
"type": "image\/png",
"density": "0.75"
},
{
"src": "\/android-icon-48x48.png",
"sizes": "48x48",
"type": "image\/png",
"density": "1.0"
},
{
"src": "\/android-icon-72x72.png",
"sizes": "72x72",
"type": "image\/png",
"density": "1.5"
},
{
"src": "\/android-icon-96x96.png",
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
},
{
"src": "\/android-icon-144x144.png",
"sizes": "144x144",
"type": "image\/png",
"density": "3.0"
},
{
"src": "\/android-icon-192x192.png",
"sizes": "192x192",
"type": "image\/png",
"density": "4.0"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -21,10 +21,10 @@
--accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--destructive-foreground: 0 0% 0%;
--warning: 31 98% 50%;
--warning-foreground: 0 0% 98%;
--warning-foreground: 0 0% 0%;
--border: 0 0% 89.8%;
--input: 0 0% 89.8%;
@@ -59,7 +59,7 @@
--destructive-foreground: 0 0% 98%;
--warning: 31 98% 50%;
--warning-foreground: 0 0% 98%;
--warning-foreground: 0 0% 0%;
--border: 0 0% 14.9%;
--input: 0 0% 14.9%;

View File

@@ -1,7 +1,7 @@
/* @refresh reload */
import type { ConfigColorMode } from '@kobalte/core/color-mode';
import { ColorModeProvider, ColorModeScript, createLocalStorageManager } from '@kobalte/core/color-mode';
import { ColorModeProvider, createLocalStorageManager } from '@kobalte/core/color-mode';
import { Router } from '@solidjs/router';
import { QueryClientProvider } from '@tanstack/solid-query';
@@ -17,7 +17,6 @@ import { IdentifyUser } from './modules/tracking/components/identify-user.compon
import { PageViewTracker } from './modules/tracking/components/pageview-tracker.component';
import { Toaster } from './modules/ui/components/sonner';
import { routes } from './routes';
import '@unocss/reset/tailwind.css';
import 'virtual:uno.css';
import './app.css';
@@ -28,17 +27,15 @@ render(
const localStorageManager = createLocalStorageManager(colorModeStorageKey);
return (
<Router
children={routes}
root={props => (
<QueryClientProvider client={queryClient}>
<PageViewTracker />
<IdentifyUser />
<QueryClientProvider client={queryClient}>
<Router
children={routes}
root={props => (
<Suspense>
<PageViewTracker />
<IdentifyUser />
<I18nProvider>
<ConfirmModalProvider>
<ColorModeScript storageType={localStorageManager.type} storageKey={colorModeStorageKey} initialColorMode={initialColorMode} />
<ColorModeProvider
initialColorMode={initialColorMode}
storageManager={localStorageManager}
@@ -60,9 +57,9 @@ render(
</ConfirmModalProvider>
</I18nProvider>
</Suspense>
</QueryClientProvider>
)}
/>
)}
/>
</QueryClientProvider>
);
},
document.getElementById('root')!,

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Passwort zurücksetzen',
'auth.request-password-reset.description': 'Geben Sie Ihre E-Mail-Adresse ein, um Ihr Passwort zurückzusetzen.',
'auth.request-password-reset.requested': 'Wenn ein Konto mit dieser E-Mail-Adresse existiert, haben wir Ihnen eine E-Mail zum Zurücksetzen Ihres Passworts gesendet.',
'auth.request-password-reset.back-to-login': 'Zurück zum Login',
'auth.request-password-reset.form.email.label': 'E-Mail',
'auth.request-password-reset.form.email.placeholder': 'Beispiel: ada@papra.app',
'auth.request-password-reset.form.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein',
'auth.request-password-reset.form.email.invalid': 'Diese E-Mail-Adresse ist ungültig',
'auth.request-password-reset.form.submit': 'Passwort zurücksetzen anfordern',
'auth.reset-password.title': 'Passwort zurücksetzen',
'auth.reset-password.description': 'Geben Sie Ihr neues Passwort ein, um Ihr Passwort zurückzusetzen.',
'auth.reset-password.reset': 'Ihr Passwort wurde zurückgesetzt.',
'auth.reset-password.back-to-login': 'Zurück zum Login',
'auth.reset-password.form.new-password.label': 'Neues Passwort',
'auth.reset-password.form.new-password.placeholder': 'Beispiel: **********',
'auth.reset-password.form.new-password.required': 'Bitte geben Sie Ihr neues Passwort ein',
'auth.reset-password.form.new-password.min-length': 'Das Passwort muss mindestens {{ minLength }} Zeichen lang sein',
'auth.reset-password.form.new-password.max-length': 'Das Passwort muss weniger als {{ maxLength }} Zeichen lang sein',
'auth.reset-password.form.submit': 'Passwort zurücksetzen',
'auth.email-provider.open': '{{ provider }} öffnen',
'auth.login.title': 'Bei Papra anmelden',
'auth.login.description': 'Geben Sie Ihre E-Mail-Adresse ein oder verwenden Sie die soziale Anmeldung, um auf Ihr Papra-Konto zuzugreifen.',
'auth.login.login-with-provider': 'Mit {{ provider }} anmelden',
'auth.login.no-account': 'Sie haben noch kein Konto?',
'auth.login.register': 'Registrieren',
'auth.login.form.email.label': 'E-Mail',
'auth.login.form.email.placeholder': 'Beispiel: ada@papra.app',
'auth.login.form.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein',
'auth.login.form.email.invalid': 'Diese E-Mail-Adresse ist ungültig',
'auth.login.form.password.label': 'Passwort',
'auth.login.form.password.placeholder': 'Passwort festlegen',
'auth.login.form.password.required': 'Bitte geben Sie Ihr Passwort ein',
'auth.login.form.remember-me.label': 'Angemeldet bleiben',
'auth.login.form.forgot-password.label': 'Passwort vergessen?',
'auth.login.form.submit': 'Anmelden',
'auth.register.title': 'Bei Papra registrieren',
'auth.register.description': 'Erstellen Sie ein Konto, um Papra zu nutzen.',
'auth.register.register-with-email': 'Mit E-Mail registrieren',
'auth.register.register-with-provider': 'Mit {{ provider }} registrieren',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Sie haben bereits ein Konto?',
'auth.register.login': 'Anmelden',
'auth.register.registration-disabled.title': 'Registrierung ist deaktiviert',
'auth.register.registration-disabled.description': 'Die Erstellung neuer Konten ist auf dieser Papra-Instanz derzeit deaktiviert. Nur Benutzer mit bestehenden Konten können sich anmelden. Wenn Sie dies für einen Fehler halten, wenden Sie sich bitte an den Administrator dieser Instanz.',
'auth.register.form.email.label': 'E-Mail',
'auth.register.form.email.placeholder': 'Beispiel: ada@papra.app',
'auth.register.form.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein',
'auth.register.form.email.invalid': 'Diese E-Mail-Adresse ist ungültig',
'auth.register.form.password.label': 'Passwort',
'auth.register.form.password.placeholder': 'Passwort festlegen',
'auth.register.form.password.required': 'Bitte geben Sie Ihr Passwort ein',
'auth.register.form.password.min-length': 'Das Passwort muss mindestens {{ minLength }} Zeichen lang sein',
'auth.register.form.password.max-length': 'Das Passwort muss weniger als {{ maxLength }} Zeichen lang sein',
'auth.register.form.name.label': 'Name',
'auth.register.form.name.placeholder': 'Beispiel: Ada Lovelace',
'auth.register.form.name.required': 'Bitte geben Sie Ihren Namen ein',
'auth.register.form.name.max-length': 'Der Name muss weniger als {{ maxLength }} Zeichen lang sein',
'auth.register.form.submit': 'Registrieren',
'auth.email-validation-required.title': 'E-Mail verifizieren',
'auth.email-validation-required.description': 'Eine Verifizierungs-E-Mail wurde an Ihre E-Mail-Adresse gesendet. Bitte verifizieren Sie Ihre E-Mail-Adresse, indem Sie auf den Link in der E-Mail klicken.',
'auth.email-verification.success.title': 'E-Mail verifiziert',
'auth.email-verification.success.description': 'Ihre E-Mail wurde erfolgreich verifiziert. Sie können sich jetzt in Ihr Konto einloggen.',
'auth.email-verification.success.login': 'Zur Anmeldung',
'auth.email-verification.error.title': 'Verifizierung fehlgeschlagen',
'auth.email-verification.error.description': 'Der Verifizierungslink ist ungültig oder abgelaufen. Bitte fordern Sie eine neue Verifizierungs-E-Mail an, indem Sie sich anmelden.',
'auth.email-verification.error.back': 'Zurück zur Anmeldung',
'auth.legal-links.description': 'Indem Sie fortfahren, bestätigen Sie, dass Sie die {{ terms }} und die {{ privacy }} verstanden haben und ihnen zustimmen.',
'auth.legal-links.terms': 'Nutzungsbedingungen',
'auth.legal-links.privacy': 'Datenschutzrichtlinie',
'auth.no-auth-provider.title': 'Kein Authentifizierungsanbieter',
'auth.no-auth-provider.description': 'Es gibt keine Authentifizierungsanbieter auf dieser Papra-Instanz. Bitte kontaktieren Sie den Administrator dieser Instanz, um sie zu aktivieren.',
// User settings
'user.settings.title': 'Benutzereinstellungen',
'user.settings.description': 'Verwalten Sie hier Ihre Kontoeinstellungen.',
'user.settings.email.title': 'E-Mail-Adresse',
'user.settings.email.description': 'Ihre E-Mail-Adresse kann nicht geändert werden.',
'user.settings.email.label': 'E-Mail-Adresse',
'user.settings.name.title': 'Vollständiger Name',
'user.settings.name.description': 'Ihr vollständiger Name wird anderen Organisationsmitgliedern angezeigt.',
'user.settings.name.label': 'Vollständiger Name',
'user.settings.name.placeholder': 'Z.B. Max Mustermann',
'user.settings.name.update': 'Namen aktualisieren',
'user.settings.name.updated': 'Ihr vollständiger Name wurde aktualisiert',
'user.settings.logout.title': 'Abmelden',
'user.settings.logout.description': 'Melden Sie sich von Ihrem Konto ab. Sie können sich später wieder anmelden.',
'user.settings.logout.button': 'Abmelden',
// Organizations
'organizations.list.title': 'Ihre Organisationen',
'organizations.list.description': 'Organisationen sind eine Möglichkeit, Ihre Dokumente zu gruppieren und den Zugriff darauf zu verwalten. Sie können mehrere Organisationen erstellen und Ihre Teammitglieder zur Zusammenarbeit einladen.',
'organizations.list.create-new': 'Neue Organisation erstellen',
'organizations.list.back': 'Zurück zu Organisationen',
'organizations.list.deleted.title': 'Gelöschte Organisationen',
'organizations.list.deleted.description': 'Gelöschte Organisationen werden für {{ days }} Tage aufbewahrt, bevor sie dauerhaft entfernt werden. Sie können sie während dieser Zeit wiederherstellen.',
'organizations.list.deleted.empty': 'Keine gelöschten Organisationen',
'organizations.list.deleted.empty-description': 'Wenn Sie eine Organisation löschen, wird sie hier für {{ days }} Tage angezeigt, bevor sie dauerhaft gelöscht wird.',
'organizations.list.deleted.restore': 'Wiederherstellen',
'organizations.list.deleted.restore-success': 'Organisation erfolgreich wiederhergestellt',
'organizations.list.deleted.restore-confirm.title': 'Organisation wiederherstellen',
'organizations.list.deleted.restore-confirm.message': 'Sind Sie sicher, dass Sie diese Organisation wiederherstellen möchten? Sie wird wieder in Ihre Liste der aktiven Organisationen verschoben.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Organisation wiederherstellen',
'organizations.list.deleted.deleted-at': 'Gelöscht {{ date }}',
'organizations.list.deleted.purge-at': 'Wird dauerhaft gelöscht am {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} Tag, {daysUntilPurge} Tage }} verbleibend)',
'organizations.details.no-documents.title': 'Keine Dokumente',
'organizations.details.no-documents.description': 'Es sind noch keine Dokumente in dieser Organisation vorhanden. Beginnen Sie mit dem Hochladen von Dokumenten.',
'organizations.details.upload-documents': 'Dokumente hochladen',
'organizations.details.documents-count': 'Dokumente insgesamt',
'organizations.details.total-size': 'Gesamtgröße',
'organizations.details.latest-documents': 'Neueste importierte Dokumente',
'organizations.create.title': 'Eine neue Organisation erstellen',
'organizations.create.description': 'Ihre Dokumente werden nach Organisation gruppiert. Sie können mehrere Organisationen erstellen, um Ihre Dokumente zu trennen, z.B. für persönliche und geschäftliche Dokumente.',
'organizations.create.back': 'Zurück',
'organizations.create.error.max-count-reached': 'Sie haben die maximale Anzahl an Organisationen erreicht, die Sie erstellen können. Wenn Sie weitere erstellen möchten, kontaktieren Sie bitte den Support.',
'organizations.create.form.name.label': 'Name der Organisation',
'organizations.create.form.name.placeholder': 'Z.B. Acme Inc.',
'organizations.create.form.name.required': 'Bitte geben Sie einen Organisationsnamen ein',
'organizations.create.form.submit': 'Organisation erstellen',
'organizations.create.success': 'Organisation erfolgreich erstellt',
'organizations.create-first.title': 'Erstellen Sie Ihre Organisation',
'organizations.create-first.description': 'Ihre Dokumente werden nach Organisation gruppiert. Sie können mehrere Organisationen erstellen, um Ihre Dokumente zu trennen, z.B. für persönliche und geschäftliche Dokumente.',
'organizations.create-first.default-name': 'Meine Organisation',
'organizations.create-first.user-name': 'Organisation von "{{ name }}"',
'organization.settings.title': 'Organisationseinstellungen',
'organization.settings.page.title': 'Organisationseinstellungen',
'organization.settings.page.description': 'Verwalten Sie hier Ihre Organisationseinstellungen.',
'organization.settings.name.title': 'Name der Organisation',
'organization.settings.name.update': 'Namen aktualisieren',
'organization.settings.name.placeholder': 'Z.B. Acme Inc.',
'organization.settings.name.updated': 'Organisationsname aktualisiert',
'organization.settings.subscription.title': 'Abonnement',
'organization.settings.subscription.description': 'Verwalten Sie Ihre Abrechnung, Rechnungen und Zahlungsmethoden.',
'organization.settings.subscription.manage': 'Abonnement verwalten',
'organization.settings.subscription.error': 'Kundenportal-URL konnte nicht abgerufen werden',
'organization.settings.delete.title': 'Organisation löschen',
'organization.settings.delete.description': 'Das Löschen dieser Organisation entfernt dauerhaft alle damit verbundenen Daten.',
'organization.settings.delete.confirm.title': 'Organisation löschen',
'organization.settings.delete.confirm.message': 'Sind Sie sicher, dass Sie diese Organisation löschen möchten? Die Organisation wird zum Löschen markiert und nach {{ days }} Tagen endgültig entfernt. Während dieser Zeit können Sie sie aus Ihrer Organisationsliste wiederherstellen. Alle Dokumente und Daten werden nach dieser Frist dauerhaft gelöscht.',
'organization.settings.delete.confirm.confirm-button': 'Organisation löschen',
'organization.settings.delete.confirm.cancel-button': 'Abbrechen',
'organization.settings.delete.success': 'Organisation gelöscht',
'organization.settings.delete.only-owner': 'Nur der Organisationsinhaber kann diese Organisation löschen.',
'organization.settings.delete.has-active-subscription': 'Organisation mit aktivem Abonnement kann nicht gelöscht werden, bitte kündigen Sie zuerst Ihr Abonnement oben.',
'organization.usage.page.title': 'Nutzung',
'organization.usage.page.description': 'Sehen Sie die aktuelle Nutzung und Limits Ihrer Organisation.',
'organization.usage.storage.title': 'Dokumentenspeicher',
'organization.usage.storage.description': 'Gesamtspeicher, der von Ihren Dokumenten verwendet wird',
'organization.usage.intake-emails.title': 'Eingangs-E-Mails',
'organization.usage.intake-emails.description': 'Anzahl der Eingangs-E-Mail-Adressen',
'organization.usage.members.title': 'Mitglieder',
'organization.usage.members.description': 'Anzahl der Mitglieder in der Organisation',
'organization.usage.unlimited': 'Unbegrenzt',
'organizations.members.title': 'Mitglieder',
'organizations.members.description': 'Verwalten Sie Ihre Organisationsmitglieder',
'organizations.members.invite-member': 'Mitglied einladen',
'organizations.members.invite-member-disabled-tooltip': 'Nur Administratoren oder Eigentümer können Mitglieder in die Organisation einladen',
'organizations.members.remove-from-organization': 'Aus Organisation entfernen',
'organizations.members.role': 'Rolle',
'organizations.members.roles.owner': 'Eigentümer',
'organizations.members.roles.admin': 'Administrator',
'organizations.members.roles.member': 'Mitglied',
'organizations.members.delete.confirm.title': 'Mitglied entfernen',
'organizations.members.delete.confirm.message': 'Sind Sie sicher, dass Sie dieses Mitglied aus der Organisation entfernen möchten?',
'organizations.members.delete.confirm.confirm-button': 'Entfernen',
'organizations.members.delete.confirm.cancel-button': 'Abbrechen',
'organizations.members.delete.success': 'Mitglied aus Organisation entfernt',
'organizations.members.update-role.success': 'Mitgliederrolle aktualisiert',
'organizations.members.table.headers.name': 'Name',
'organizations.members.table.headers.email': 'E-Mail',
'organizations.members.table.headers.role': 'Rolle',
'organizations.members.table.headers.created': 'Erstellt',
'organizations.members.table.headers.actions': 'Aktionen',
'organizations.invite-member.title': 'Mitglied einladen',
'organizations.invite-member.description': 'Laden Sie ein Mitglied in Ihre Organisation ein',
'organizations.invite-member.form.email.label': 'E-Mail',
'organizations.invite-member.form.email.placeholder': 'Beispiel: ada@papra.app',
'organizations.invite-member.form.email.required': 'Bitte geben Sie eine gültige E-Mail-Adresse ein',
'organizations.invite-member.form.role.label': 'Rolle',
'organizations.invite-member.form.submit': 'In Organisation einladen',
'organizations.invite-member.success.message': 'Mitglied eingeladen',
'organizations.invite-member.success.description': 'Die E-Mail wurde in die Organisation eingeladen.',
'organizations.invite-member.error.message': 'Mitglied konnte nicht eingeladen werden',
'organizations.invitations.title': 'Einladungen',
'organizations.invitations.description': 'Verwalten Sie Ihre Organisationseinladungen',
'organizations.invitations.list.cta': 'Mitglied einladen',
'organizations.invitations.list.empty.title': 'Keine ausstehenden Einladungen',
'organizations.invitations.list.empty.description': 'Sie wurden noch nicht zu Organisationen eingeladen.',
'organizations.invitations.status.pending': 'Ausstehend',
'organizations.invitations.status.accepted': 'Angenommen',
'organizations.invitations.status.rejected': 'Abgelehnt',
'organizations.invitations.status.expired': 'Abgelaufen',
'organizations.invitations.status.cancelled': 'Abgebrochen',
'organizations.invitations.resend': 'Einladung erneut senden',
'organizations.invitations.cancel.title': 'Einladung abbrechen',
'organizations.invitations.cancel.description': 'Sind Sie sicher, dass Sie diese Einladung abbrechen möchten?',
'organizations.invitations.cancel.confirm': 'Einladung abbrechen',
'organizations.invitations.cancel.cancel': 'Abbrechen',
'organizations.invitations.resend.title': 'Einladung erneut senden',
'organizations.invitations.resend.description': 'Sind Sie sicher, dass Sie diese Einladung erneut senden möchten? Dadurch wird eine neue E-Mail an den Empfänger gesendet.',
'organizations.invitations.resend.confirm': 'Einladung erneut senden',
'organizations.invitations.resend.cancel': 'Abbrechen',
'invitations.list.title': 'Einladungen',
'invitations.list.description': 'Verwalten Sie Ihre Organisationseinladungen',
'invitations.list.empty.title': 'Keine ausstehenden Einladungen',
'invitations.list.empty.description': 'Sie wurden noch nicht zu Organisationen eingeladen.',
'invitations.list.headers.organization': 'Organisation',
'invitations.list.headers.status': 'Status',
'invitations.list.headers.created': 'Erstellt',
'invitations.list.headers.actions': 'Aktionen',
'invitations.list.actions.accept': 'Annehmen',
'invitations.list.actions.reject': 'Ablehnen',
'invitations.list.actions.accept.success.message': 'Einladung angenommen',
'invitations.list.actions.accept.success.description': 'Die Einladung wurde angenommen.',
'invitations.list.actions.reject.success.message': 'Einladung abgelehnt',
'invitations.list.actions.reject.success.description': 'Die Einladung wurde abgelehnt.',
// Documents
'documents.list.title': 'Dokumente',
'documents.list.no-documents.title': 'Keine Dokumente',
'documents.list.no-documents.description': 'Es sind noch keine Dokumente in dieser Organisation vorhanden. Beginnen Sie mit dem Hochladen von Dokumenten.',
'documents.list.no-results': 'Keine Dokumente gefunden',
'documents.tabs.info': 'Info',
'documents.tabs.content': 'Inhalt',
'documents.tabs.activity': 'Aktivität',
'documents.deleted.message': 'Dieses Dokument wurde gelöscht und wird in {{ days }} Tagen dauerhaft entfernt.',
'documents.actions.download': 'Herunterladen',
'documents.actions.open-in-new-tab': 'In neuem Tab öffnen',
'documents.actions.restore': 'Wiederherstellen',
'documents.actions.delete': 'Löschen',
'documents.actions.edit': 'Bearbeiten',
'documents.actions.cancel': 'Abbrechen',
'documents.actions.save': 'Speichern',
'documents.actions.saving': 'Speichern...',
'documents.content.alert': 'Der Inhalt des Dokuments wird beim Hochladen automatisch aus dem Dokument extrahiert. Er wird nur für Such- und Indexierungszwecke verwendet.',
'documents.content.empty-placeholder': 'Dieses Dokument hat keinen extrahierten Inhalt, Sie können ihn manuell hier eintragen.',
'documents.info.id': 'ID',
'documents.info.name': 'Name',
'documents.info.type': 'Typ',
'documents.info.size': 'Größe',
'documents.info.created-at': 'Erstellt am',
'documents.info.updated-at': 'Aktualisiert am',
'documents.info.never': 'Nie',
'documents.rename.title': 'Dokument umbenennen',
'documents.rename.form.name.label': 'Name',
'documents.rename.form.name.placeholder': 'Beispiel: Rechnung 2024',
'documents.rename.form.name.required': 'Bitte geben Sie einen Namen für das Dokument ein',
'documents.rename.form.name.max-length': 'Der Name muss weniger als 255 Zeichen lang sein',
'documents.rename.form.submit': 'Dokument umbenennen',
'documents.rename.success': 'Dokument erfolgreich umbenannt',
'documents.rename.cancel': 'Abbrechen',
'import-documents.title.error': '{{ count }} Dokumente fehlgeschlagen',
'import-documents.title.success': '{{ count }} Dokumente importiert',
'import-documents.title.pending': '{{ count }} / {{ total }} Dokumente importiert',
'import-documents.title.none': 'Dokumente importieren',
'import-documents.no-import-in-progress': 'Kein Dokumentimport im Gange',
'documents.deleted.title': 'Gelöschte Dokumente',
'documents.deleted.empty.title': 'Keine gelöschten Dokumente',
'documents.deleted.empty.description': 'Sie haben keine gelöschten Dokumente. Gelöschte Dokumente werden für {{ days }} Tage in den Papierkorb verschoben.',
'documents.deleted.retention-notice': 'Alle gelöschten Dokumente werden für {{ days }} Tage im Papierkorb gespeichert. Nach Ablauf dieser Frist werden die Dokumente dauerhaft gelöscht und Sie können sie nicht wiederherstellen.',
'documents.deleted.deleted-at': 'Gelöscht',
'documents.deleted.restoring': 'Wiederherstellen...',
'documents.deleted.deleting': 'Löschen...',
'documents.preview.unknown-file-type': 'Kein Vorschau verfügbar für diesen Dateityp',
'documents.preview.binary-file': 'Dies scheint eine Binärdatei zu sein und kann nicht als Text angezeigt werden',
'trash.delete-all.button': 'Alles löschen',
'trash.delete-all.confirm.title': 'Alle Dokumente dauerhaft löschen?',
'trash.delete-all.confirm.description': 'Sind Sie sicher, dass Sie alle Dokumente aus dem Papierkorb dauerhaft löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.',
'trash.delete-all.confirm.label': 'Löschen',
'trash.delete-all.confirm.cancel': 'Abbrechen',
'trash.delete.button': 'Löschen',
'trash.delete.confirm.title': 'Dokument dauerhaft löschen?',
'trash.delete.confirm.description': 'Sind Sie sicher, dass Sie dieses Dokument dauerhaft aus dem Papierkorb löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.',
'trash.delete.confirm.label': 'Löschen',
'trash.delete.confirm.cancel': 'Abbrechen',
'trash.deleted.success.title': 'Dokument gelöscht',
'trash.deleted.success.description': 'Das Dokument wurde dauerhaft gelöscht.',
'activity.document.created': 'Das Dokument wurde erstellt',
'activity.document.updated.single': 'Das Feld {{ field }} wurde aktualisiert',
'activity.document.updated.multiple': 'Die Felder {{ fields }} wurden aktualisiert',
'activity.document.updated': 'Das Dokument wurde aktualisiert',
'activity.document.deleted': 'Das Dokument wurde gelöscht',
'activity.document.restored': 'Das Dokument wurde wiederhergestellt',
'activity.document.tagged': 'Tag {{ tag }} wurde hinzugefügt',
'activity.document.untagged': 'Tag {{ tag }} wurde entfernt',
'activity.document.user.name': 'von {{ name }}',
'activity.load-more': 'Mehr laden',
'activity.no-more-activities': 'Keine weiteren Aktivitäten für dieses Dokument',
// Tags
'tags.no-tags.title': 'Noch keine Tags',
'tags.no-tags.description': 'Diese Organisation hat noch keine Tags. Tags werden zur Kategorisierung von Dokumenten verwendet. Sie können Ihren Dokumenten Tags hinzufügen, um sie leichter zu finden und zu organisieren.',
'tags.no-tags.create-tag': 'Tag erstellen',
'tags.title': 'Dokumenten-Tags',
'tags.description': 'Tags werden zur Kategorisierung von Dokumenten verwendet. Sie können Ihren Dokumenten Tags hinzufügen, um sie leichter zu finden und zu organisieren.',
'tags.create': 'Tag erstellen',
'tags.update': 'Tag aktualisieren',
'tags.delete': 'Tag löschen',
'tags.delete.confirm.title': 'Tag löschen',
'tags.delete.confirm.message': 'Sind Sie sicher, dass Sie diesen Tag löschen möchten? Das Löschen eines Tags entfernt ihn von allen Dokumenten.',
'tags.delete.confirm.confirm-button': 'Löschen',
'tags.delete.confirm.cancel-button': 'Abbrechen',
'tags.delete.success': 'Tag erfolgreich gelöscht',
'tags.create.success': 'Tag "{{ name }}" erfolgreich erstellt.',
'tags.update.success': 'Tag "{{ name }}" erfolgreich aktualisiert.',
'tags.form.name.label': 'Name',
'tags.form.name.placeholder': 'Z.B. Verträge',
'tags.form.name.required': 'Bitte geben Sie einen Tag-Namen ein',
'tags.form.name.max-length': 'Tag-Name muss weniger als 64 Zeichen lang sein',
'tags.form.color.label': 'Farbe',
'tags.form.color.required': 'Bitte geben Sie eine Farbe ein',
'tags.form.color.invalid': 'Die Hex-Farbe ist falsch formatiert.',
'tags.form.description.label': 'Beschreibung',
'tags.form.description.optional': '(optional)',
'tags.form.description.placeholder': 'Z.B. Alle von der Firma unterzeichneten Verträge',
'tags.form.description.max-length': 'Beschreibung muss weniger als 256 Zeichen lang sein',
'tags.form.no-description': 'Keine Beschreibung',
'tags.table.headers.tag': 'Tag',
'tags.table.headers.description': 'Beschreibung',
'tags.table.headers.documents': 'Dokumente',
'tags.table.headers.created': 'Erstellt',
'tags.table.headers.actions': 'Aktionen',
// Tagging rules
'tagging-rules.field.name': 'Dokumentenname',
'tagging-rules.field.content': 'Dokumenteninhalt',
'tagging-rules.operator.equals': 'ist gleich',
'tagging-rules.operator.not-equals': 'ist nicht gleich',
'tagging-rules.operator.contains': 'enthält',
'tagging-rules.operator.not-contains': 'enthält nicht',
'tagging-rules.operator.starts-with': 'beginnt mit',
'tagging-rules.operator.ends-with': 'endet mit',
'tagging-rules.list.title': 'Tagging-Regeln',
'tagging-rules.list.description': 'Verwalten Sie die Tagging-Regeln Ihrer Organisation, um Dokumente automatisch basierend auf von Ihnen definierten Bedingungen zu taggen.',
'tagging-rules.list.demo-warning': 'Hinweis: Da dies eine Demo-Umgebung (ohne Server) ist, werden Tagging-Regeln nicht auf neu hinzugefügte Dokumente angewendet.',
'tagging-rules.list.no-tagging-rules.title': 'Keine Tagging-Regeln',
'tagging-rules.list.no-tagging-rules.description': 'Erstellen Sie eine Tagging-Regel, um Ihre hinzugefügten Dokumente automatisch basierend auf von Ihnen definierten Bedingungen zu taggen.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Tagging-Regel erstellen',
'tagging-rules.list.card.no-conditions': 'Keine Bedingungen',
'tagging-rules.list.card.one-condition': '1 Bedingung',
'tagging-rules.list.card.conditions': '{{ count }} Bedingungen',
'tagging-rules.list.card.delete': 'Regel löschen',
'tagging-rules.list.card.edit': 'Regel bearbeiten',
'tagging-rules.create.title': 'Tagging-Regel erstellen',
'tagging-rules.create.success': 'Tagging-Regel erfolgreich erstellt',
'tagging-rules.create.error': 'Tagging-Regel konnte nicht erstellt werden',
'tagging-rules.create.submit': 'Regel erstellen',
'tagging-rules.form.name.label': 'Name',
'tagging-rules.form.name.placeholder': 'Beispiel: Rechnungen taggen',
'tagging-rules.form.name.min-length': 'Bitte geben Sie einen Namen für die Regel ein',
'tagging-rules.form.name.max-length': 'Der Name muss weniger als 64 Zeichen lang sein',
'tagging-rules.form.description.label': 'Beschreibung',
'tagging-rules.form.description.placeholder': 'Beispiel: Dokumente mit \'Rechnung\' im Namen taggen',
'tagging-rules.form.description.max-length': 'Die Beschreibung muss weniger als 256 Zeichen lang sein',
'tagging-rules.form.conditions.label': 'Bedingungen',
'tagging-rules.form.conditions.description': 'Definieren Sie die Bedingungen, die erfüllt sein müssen, damit die Regel angewendet wird. Keine Bedingungen bedeutet, dass die Regel auf alle Dokumente angewendet wird',
'tagging-rules.form.conditions.add-condition': 'Bedingung hinzufügen',
'tagging-rules.form.conditions.connector.when': 'Wenn',
'tagging-rules.form.conditions.connector.and': 'und',
'tagging-rules.form.conditions.connector.or': 'oder',
'tagging-rules.condition-match-mode.all': 'Alle Bedingungen müssen erfüllt sein',
'tagging-rules.condition-match-mode.any': 'Mindestens eine Bedingung muss erfüllt sein',
'tagging-rules.form.conditions.no-conditions.title': 'Keine Bedingungen',
'tagging-rules.form.conditions.no-conditions.description': 'Sie haben dieser Regel keine Bedingungen hinzugefügt. Diese Regel wendet ihre Tags auf alle Dokumente an.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Regel ohne Bedingungen anwenden',
'tagging-rules.form.conditions.no-conditions.cancel': 'Abbrechen',
'tagging-rules.form.conditions.value.placeholder': 'Beispiel: Rechnung',
'tagging-rules.form.conditions.value.min-length': 'Bitte geben Sie einen Wert für die Bedingung ein',
'tagging-rules.form.tags.label': 'Tags',
'tagging-rules.form.tags.description': 'Wählen Sie die Tags aus, die auf die hinzugefügten Dokumente angewendet werden sollen, die den Bedingungen entsprechen',
'tagging-rules.form.tags.min-length': 'Es ist mindestens ein anzuwendender Tag erforderlich',
'tagging-rules.form.tags.add-tag': 'Tag erstellen',
'tagging-rules.form.submit': 'Regel erstellen',
'tagging-rules.update.title': 'Tagging-Regel aktualisieren',
'tagging-rules.update.error': 'Fehler beim Aktualisieren der Tagging-Regel',
'tagging-rules.update.submit': 'Regel aktualisieren',
'tagging-rules.update.cancel': 'Abbrechen',
'tagging-rules.apply.button': 'Auf vorhandene Dokumente anwenden',
'tagging-rules.apply.confirm.title': 'Regel auf vorhandene Dokumente anwenden?',
'tagging-rules.apply.confirm.description': 'Dies überprüft alle vorhandenen Dokumente in Ihrer Organisation und wendet Tags an, wo Bedingungen übereinstimmen. Die Verarbeitung erfolgt im Hintergrund.',
'tagging-rules.apply.confirm.button': 'Regel anwenden',
'tagging-rules.apply.success': 'Regelanwendung im Hintergrund gestartet',
'tagging-rules.apply.error': 'Fehler beim Starten der Regelanwendung',
'tagging-rules.apply.processing': 'Wird gestartet...',
// Intake emails
'intake-emails.title': 'E-Mail-Eingang',
'intake-emails.description': 'E-Mail-Eingangsadressen werden verwendet, um E-Mails automatisch in Papra aufzunehmen. Leiten Sie einfach E-Mails an die Eingangsadresse weiter und deren Anhänge werden zu den Dokumenten Ihrer Organisation hinzugefügt.',
'intake-emails.disabled.title': 'E-Mail-Eingang ist deaktiviert',
'intake-emails.disabled.description': 'E-Mail-Eingang ist auf dieser Instanz deaktiviert. Bitte kontaktieren Sie Ihren Administrator, um ihn zu aktivieren. Weitere Informationen finden Sie in der {{ documentation }}.',
'intake-emails.disabled.documentation': 'Dokumentation',
'intake-emails.info': 'Es werden nur aktivierte E-Mails aus zulässigen Ursprüngen verarbeitet. Sie können eine E-Mail-Eingangsadresse jederzeit aktivieren oder deaktivieren.',
'intake-emails.empty.title': 'Keine E-Mail-Eingänge',
'intake-emails.empty.description': 'Generieren Sie eine Eingangsadresse, um E-Mail-Anhänge einfach aufzunehmen.',
'intake-emails.empty.generate': 'E-Mail-Eingang generieren',
'intake-emails.count': '{{ count }} Eingangse-Mail{{ plural }} für diese Organisation',
'intake-emails.new': 'Neue Eingangse-Mail',
'intake-emails.disabled-label': '(Deaktiviert)',
'intake-emails.no-origins': 'Keine zulässigen E-Mail-Ursprünge',
'intake-emails.allowed-origins': 'Zulässig von {{ count }} Adresse{{ plural }}',
'intake-emails.actions.enable': 'Aktivieren',
'intake-emails.actions.disable': 'Deaktivieren',
'intake-emails.actions.manage-origins': 'Ursprungsadressen verwalten',
'intake-emails.actions.delete': 'Löschen',
'intake-emails.delete.confirm.title': 'Eingangse-Mail löschen?',
'intake-emails.delete.confirm.message': 'Sind Sie sicher, dass Sie diese Eingangse-Mail löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.',
'intake-emails.delete.confirm.confirm-button': 'Eingangse-Mail löschen',
'intake-emails.delete.confirm.cancel-button': 'Abbrechen',
'intake-emails.delete.success': 'Eingangse-Mail gelöscht',
'intake-emails.create.success': 'Eingangse-Mail erstellt',
'intake-emails.update.success.enabled': 'Eingangse-Mail aktiviert',
'intake-emails.update.success.disabled': 'Eingangse-Mail deaktiviert',
'intake-emails.allowed-origins.title': 'Zulässige Ursprünge',
'intake-emails.allowed-origins.description': 'Es werden nur E-Mails, die an {{ email }} von diesen Ursprüngen gesendet werden, verarbeitet. Wenn keine Ursprünge angegeben sind, werden alle E-Mails verworfen.',
'intake-emails.allowed-origins.add.label': 'Zulässige Ursprungs-E-Mail hinzufügen',
'intake-emails.allowed-origins.add.placeholder': 'Z.B. ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Hinzufügen',
'intake-emails.allowed-origins.add.error.exists': 'Diese E-Mail ist bereits in den zulässigen Ursprüngen für diese Eingangse-Mail vorhanden',
// API keys
'api-keys.permissions.select-all': 'Alle auswählen',
'api-keys.permissions.deselect-all': 'Alle abwählen',
'api-keys.permissions.organizations.title': 'Organisationen',
'api-keys.permissions.organizations.organizations:create': 'Organisationen erstellen',
'api-keys.permissions.organizations.organizations:read': 'Organisationen lesen',
'api-keys.permissions.organizations.organizations:update': 'Organisationen aktualisieren',
'api-keys.permissions.organizations.organizations:delete': 'Organisationen löschen',
'api-keys.permissions.documents.title': 'Dokumente',
'api-keys.permissions.documents.documents:create': 'Dokumente erstellen',
'api-keys.permissions.documents.documents:read': 'Dokumente lesen',
'api-keys.permissions.documents.documents:update': 'Dokumente aktualisieren',
'api-keys.permissions.documents.documents:delete': 'Dokumente löschen',
'api-keys.permissions.tags.title': 'Tags',
'api-keys.permissions.tags.tags:create': 'Tags erstellen',
'api-keys.permissions.tags.tags:read': 'Tags lesen',
'api-keys.permissions.tags.tags:update': 'Tags aktualisieren',
'api-keys.permissions.tags.tags:delete': 'Tags löschen',
'api-keys.create.title': 'API-Schlüssel erstellen',
'api-keys.create.description': 'Erstellen Sie einen neuen API-Schlüssel, um auf die Papra API zuzugreifen.',
'api-keys.create.success': 'Der API-Schlüssel wurde erfolgreich erstellt.',
'api-keys.create.back': 'Zurück zu den API-Schlüsseln',
'api-keys.create.form.name.label': 'Name',
'api-keys.create.form.name.placeholder': 'Beispiel: Mein API-Schlüssel',
'api-keys.create.form.name.required': 'Bitte geben Sie einen Namen für den API-Schlüssel ein',
'api-keys.create.form.permissions.label': 'Berechtigungen',
'api-keys.create.form.permissions.required': 'Bitte wählen Sie mindestens eine Berechtigung aus',
'api-keys.create.form.submit': 'API-Schlüssel erstellen',
'api-keys.create.created.title': 'API-Schlüssel erstellt',
'api-keys.create.created.description': 'Der API-Schlüssel wurde erfolgreich erstellt. Speichern Sie ihn an einem sicheren Ort, da er nicht erneut angezeigt wird.',
'api-keys.list.title': 'API-Schlüssel',
'api-keys.list.description': 'Verwalten Sie hier Ihre API-Schlüssel.',
'api-keys.list.create': 'API-Schlüssel erstellen',
'api-keys.list.empty.title': 'Keine API-Schlüssel',
'api-keys.list.empty.description': 'Erstellen Sie einen API-Schlüssel, um auf die Papra API zuzugreifen.',
'api-keys.list.card.last-used': 'Zuletzt verwendet',
'api-keys.list.card.never': 'Nie',
'api-keys.list.card.created': 'Erstellt',
'api-keys.delete.success': 'Der API-Schlüssel wurde erfolgreich gelöscht',
'api-keys.delete.confirm.title': 'API-Schlüssel löschen',
'api-keys.delete.confirm.message': 'Sind Sie sicher, dass Sie diesen API-Schlüssel löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.',
'api-keys.delete.confirm.confirm-button': 'Löschen',
'api-keys.delete.confirm.cancel-button': 'Abbrechen',
// Webhooks
'webhooks.list.title': 'Webhooks',
'webhooks.list.description': 'Verwalten Sie Ihre Organisations-Webhooks',
'webhooks.list.empty.title': 'Keine Webhooks',
'webhooks.list.empty.description': 'Erstellen Sie Ihren ersten Webhook, um Ereignisse zu empfangen',
'webhooks.list.create': 'Webhook erstellen',
'webhooks.list.card.last-triggered': 'Zuletzt ausgelöst',
'webhooks.list.card.never': 'Nie',
'webhooks.list.card.created': 'Erstellt',
'webhooks.create.title': 'Webhook erstellen',
'webhooks.create.description': 'Erstellen Sie einen neuen Webhook, um Ereignisse zu empfangen',
'webhooks.create.success': 'Webhook erfolgreich erstellt',
'webhooks.create.back': 'Zurück',
'webhooks.create.form.submit': 'Webhook erstellen',
'webhooks.create.form.name.label': 'Webhook-Name',
'webhooks.create.form.name.placeholder': 'Webhook-Namen eingeben',
'webhooks.create.form.name.required': 'Name ist erforderlich',
'webhooks.create.form.url.label': 'Webhook-URL',
'webhooks.create.form.url.placeholder': 'Webhook-URL eingeben',
'webhooks.create.form.url.required': 'URL ist erforderlich',
'webhooks.create.form.url.invalid': 'URL ist ungültig',
'webhooks.create.form.secret.label': 'Geheimnis',
'webhooks.create.form.secret.placeholder': 'Webhook-Geheimnis eingeben',
'webhooks.create.form.events.label': 'Ereignisse',
'webhooks.create.form.events.required': 'Mindestens ein Ereignis ist erforderlich',
'webhooks.update.title': 'Webhook bearbeiten',
'webhooks.update.description': 'Aktualisieren Sie Ihre Webhook-Details',
'webhooks.update.success': 'Webhook erfolgreich aktualisiert',
'webhooks.update.submit': 'Webhook aktualisieren',
'webhooks.update.cancel': 'Abbrechen',
'webhooks.update.form.secret.placeholder': 'Neues Geheimnis eingeben',
'webhooks.update.form.secret.placeholder-redacted': '[Geheimnis geschwärzt]',
'webhooks.update.form.rotate-secret.button': 'Geheimnis rotieren',
'webhooks.delete.success': 'Webhook erfolgreich gelöscht',
'webhooks.delete.confirm.title': 'Webhook löschen',
'webhooks.delete.confirm.message': 'Sind Sie sicher, dass Sie diesen Webhook löschen möchten?',
'webhooks.delete.confirm.confirm-button': 'Löschen',
'webhooks.delete.confirm.cancel-button': 'Abbrechen',
'webhooks.events.documents.title': 'Dokumente Ereignisse',
'webhooks.events.documents.document:created.description': 'Dokument erstellt',
'webhooks.events.documents.document:deleted.description': 'Dokument gelöscht',
'webhooks.events.documents.document:updated.description': 'Dokument aktualisiert',
'webhooks.events.documents.document:tag:added.description': 'Ein Tag wurde zu einem Dokument hinzugefügt',
'webhooks.events.documents.document:tag:removed.description': 'Ein Tag wurde von einem Dokument entfernt',
// Navigation
'layout.menu.home': 'Startseite',
'layout.menu.documents': 'Dokumente',
'layout.menu.tags': 'Tags',
'layout.menu.tagging-rules': 'Tagging-Regeln',
'layout.menu.deleted-documents': 'Gelöschte Dokumente',
'layout.menu.organization-settings': 'Einstellungen',
'layout.menu.api-keys': 'API-Schlüssel',
'layout.menu.settings': 'Einstellungen',
'layout.menu.account': 'Konto',
'layout.menu.general-settings': 'Allgemeine Einstellungen',
'layout.menu.usage': 'Nutzung',
'layout.menu.intake-emails': 'E-Mail-Eingang',
'layout.menu.webhooks': 'Webhooks',
'layout.menu.members': 'Mitglieder',
'layout.menu.invitations': 'Einladungen',
'layout.upgrade-cta.title': 'Brauchen Sie mehr Platz?',
'layout.upgrade-cta.description': '10x mehr Speicher + Team-Zusammenarbeit',
'layout.upgrade-cta.button': 'Jetzt upgraden',
'layout.theme.light': 'Heller Modus',
'layout.theme.dark': 'Dunkler Modus',
'layout.theme.system': 'Systemmodus',
'layout.search.placeholder': 'Suchen...',
'layout.menu.import-document': 'Dokument importieren',
'user-menu.account-settings': 'Kontoeinstellungen',
'user-menu.api-keys': 'API-Schlüssel',
'user-menu.invitations': 'Einladungen',
'user-menu.language': 'Sprache',
'user-menu.logout': 'Abmelden',
// Command palette
'command-palette.search.placeholder': 'Befehle oder Dokumente suchen',
'command-palette.no-results': 'Keine Ergebnisse gefunden',
'command-palette.sections.documents': 'Dokumente',
'command-palette.sections.theme': 'Thema',
// API errors
'api-errors.document.already_exists': 'Das Dokument existiert bereits',
'api-errors.document.size_too_large': 'Die Datei ist zu groß',
'api-errors.intake-emails.already_exists': 'Eine Eingang-Email mit dieser Adresse existiert bereits.',
'api-errors.intake_email.limit_reached': 'Die maximale Anzahl an Eingang-EMails für diese Organisation wurde erreicht. Bitte aktualisieren Sie Ihren Plan, um weitere Eingangse-Mails zu erstellen.',
'api-errors.user.max_organization_count_reached': 'Sie haben die maximale Anzahl an Organisationen erreicht, die Sie erstellen können. Wenn Sie weitere erstellen möchten, kontaktieren Sie bitte den Support.',
'api-errors.default': 'Beim Verarbeiten Ihrer Anfrage ist ein Fehler aufgetreten.',
'api-errors.organization.invitation_already_exists': 'Eine Einladung für diese E-Mail existiert bereits in dieser Organisation.',
'api-errors.user.already_in_organization': 'Dieser Benutzer ist bereits in dieser Organisation.',
'api-errors.user.organization_invitation_limit_reached': 'Die maximale Anzahl an Einladungen für heute wurde erreicht. Bitte versuchen Sie es morgen erneut.',
'api-errors.demo.not_available': 'Diese Funktion ist in der Demo nicht verfügbar',
'api-errors.tags.already_exists': 'Ein Tag mit diesem Namen existiert bereits für diese Organisation',
'api-errors.internal.error': 'Beim Verarbeiten Ihrer Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
'api-errors.auth.invalid_origin': 'Ungültige Anwendungs-Ursprung. Wenn Sie Papra selbst hosten, stellen Sie sicher, dass Ihre APP_BASE_URL-Umgebungsvariable mit Ihrer aktuellen URL übereinstimmt. Weitere Details finden Sie unter https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'Die maximale Anzahl an Mitgliedern und ausstehenden Einladungen für diese Organisation wurde erreicht. Bitte aktualisieren Sie Ihren Plan, um weitere Mitglieder hinzuzufügen.',
'api-errors.organization.has_active_subscription': 'Organisation mit aktivem Abonnement kann nicht gelöscht werden. Bitte kündigen Sie zuerst Ihr Abonnement über die Schaltfläche Abonnement verwalten oben.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Benutzer nicht gefunden',
'api-errors.FAILED_TO_CREATE_USER': 'Fehler beim Erstellen des Benutzers',
'api-errors.FAILED_TO_CREATE_SESSION': 'Fehler beim Erstellen der Sitzung',
'api-errors.FAILED_TO_UPDATE_USER': 'Fehler beim Aktualisieren des Benutzers',
'api-errors.FAILED_TO_GET_SESSION': 'Fehler beim Abrufen der Sitzung',
'api-errors.INVALID_PASSWORD': 'Ungültiges Passwort',
'api-errors.INVALID_EMAIL': 'Ungültige E-Mail',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'Die E-Mail oder das Passwort ist falsch, oder das Konto existiert nicht.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Social-Media-Konto bereits verknüpft',
'api-errors.PROVIDER_NOT_FOUND': 'Anbieter nicht gefunden',
'api-errors.INVALID_TOKEN': 'Ungültiger Token',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'ID-Token wird nicht unterstützt',
'api-errors.FAILED_TO_GET_USER_INFO': 'Fehler beim Abrufen der Benutzerinformationen',
'api-errors.USER_EMAIL_NOT_FOUND': 'Benutzer-E-Mail nicht gefunden',
'api-errors.EMAIL_NOT_VERIFIED': 'E-Mail nicht verifiziert',
'api-errors.PASSWORD_TOO_SHORT': 'Passwort zu kurz',
'api-errors.PASSWORD_TOO_LONG': 'Passwort zu lang',
'api-errors.USER_ALREADY_EXISTS': 'Ein Benutzer mit dieser E-Mail existiert bereits',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'E-Mail kann nicht aktualisiert werden',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Anmeldekonto nicht gefunden',
'api-errors.SESSION_EXPIRED': 'Sitzung abgelaufen',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Fehler beim Trennen des letzten Kontos',
'api-errors.ACCOUNT_NOT_FOUND': 'Konto nicht gefunden',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'Benutzer hat bereits ein Passwort',
// Not found
'not-found.title': '404 - Seite nicht gefunden',
'not-found.description': 'Entschuldigung, die gesuchte Seite scheint nicht zu existieren. Bitte überprüfen Sie die URL und versuchen Sie es erneut.',
'not-found.back-to-home': 'Zurück zur Startseite',
// Demo
'demo.popup.description': 'Dies ist eine Demo-Umgebung, alle Daten werden im lokalen Speicher Ihres Browsers gespeichert.',
'demo.popup.discord': 'Treten Sie dem {{ discordLink }} bei, um Support zu erhalten, Funktionen vorzuschlagen oder einfach nur zu chatten.',
'demo.popup.discord-link-label': 'Discord-Server',
'demo.popup.reset': 'Demo-Daten zurücksetzen',
'demo.popup.hide': 'Ausblenden',
// Color picker
'color-picker.hue': 'Farbton',
'color-picker.saturation': 'Sättigung',
'color-picker.lightness': 'Helligkeit',
'color-picker.select-color': 'Farbe auswählen',
'color-picker.select-a-color': 'Eine Farbe auswählen',
// Subscriptions
'subscriptions.checkout-success.title': 'Zahlung erfolgreich!',
'subscriptions.checkout-success.description': 'Ihr Abonnement wurde erfolgreich aktiviert.',
'subscriptions.checkout-success.thank-you': 'Vielen Dank für Ihr Upgrade auf Papra Plus. Sie haben jetzt Zugriff auf alle Premium-Funktionen.',
'subscriptions.checkout-success.go-to-organizations': 'Zu Organisationen',
'subscriptions.checkout-success.redirecting': 'Weiterleitung in {{ count }} Sekunde{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Zahlung abgebrochen',
'subscriptions.checkout-cancel.description': 'Ihr Abonnement-Upgrade wurde abgebrochen.',
'subscriptions.checkout-cancel.no-charges': 'Es wurden keine Gebühren von Ihrem Konto abgebucht. Sie können es jederzeit erneut versuchen.',
'subscriptions.checkout-cancel.back-to-organizations': 'Zurück zu Organisationen',
'subscriptions.checkout-cancel.need-help': 'Benötigen Sie Hilfe?',
'subscriptions.checkout-cancel.contact-support': 'Support kontaktieren',
'subscriptions.upgrade-dialog.title': 'Diese Organisation upgraden',
'subscriptions.upgrade-dialog.description': 'Schalten Sie leistungsstarke Funktionen für Ihre Organisation frei',
'subscriptions.upgrade-dialog.contact-us': 'Kontaktieren Sie uns',
'subscriptions.upgrade-dialog.enterprise-plans': 'wenn Sie benutzerdefinierte Enterprise-Pläne benötigen.',
'subscriptions.upgrade-dialog.current-plan': 'Aktueller Plan',
'subscriptions.upgrade-dialog.recommended': 'Empfohlen',
'subscriptions.upgrade-dialog.per-month': '/Monat',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} jährlich abgerechnet',
'subscriptions.upgrade-dialog.upgrade-now': 'Jetzt upgraden',
'subscriptions.upgrade-dialog.promo-banner.title': 'Zeitlich begrenztes Angebot',
'subscriptions.upgrade-dialog.promo-banner.description': 'Erhalten Sie {{ percent }}% Rabatt pro Organisation auf alle Tarife für immer als Early Adopter! Angebot läuft ab in {{ days, >1:{days} Tagen, =1:1 Tag, weniger als 1 Tag }}.',
'subscriptions.plan.free.name': 'Kostenloser Plan',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Dokumentenspeichergröße',
'subscriptions.features.members': 'Organisationsmitglieder',
'subscriptions.features.members-count': '{{ count }} Mitglieder',
'subscriptions.features.email-intakes': 'E-Mail-Eingänge',
'subscriptions.features.email-intakes-count-singular': '{{ count }} Adresse',
'subscriptions.features.email-intakes-count-plural': '{{ count }} Adressen',
'subscriptions.features.max-upload-size': 'Maximale Upload-Dateigröße',
'subscriptions.features.support': 'Support',
'subscriptions.features.support-community': 'Community-Support',
'subscriptions.features.support-email': 'E-Mail-Support',
'subscriptions.features.support-priority': 'Prioritäts-Support',
'subscriptions.billing-interval.monthly': 'Monatlich',
'subscriptions.billing-interval.annual': 'Jährlich',
'subscriptions.usage-warning.message': 'Sie haben {{ percent }}% Ihres Dokumentenspeichers verwendet. Erwägen Sie ein Upgrade Ihres Plans, um mehr Speicherplatz zu erhalten.',
'subscriptions.usage-warning.upgrade-button': 'Plan upgraden',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Geben Sie "{{ text }}" ein zur Bestätigung',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Passwort zurücksetzen
auth.request-password-reset.description: Geben Sie Ihre E-Mail-Adresse ein, um Ihr Passwort zurückzusetzen.
auth.request-password-reset.requested: Wenn ein Konto mit dieser E-Mail-Adresse existiert, haben wir Ihnen eine E-Mail zum Zurücksetzen Ihres Passworts gesendet.
auth.request-password-reset.back-to-login: Zurück zum Login
auth.request-password-reset.form.email.label: E-Mail
auth.request-password-reset.form.email.placeholder: 'Beispiel: ada@papra.app'
auth.request-password-reset.form.email.required: Bitte geben Sie Ihre E-Mail-Adresse ein
auth.request-password-reset.form.email.invalid: Diese E-Mail-Adresse ist ungültig
auth.request-password-reset.form.submit: Passwort zurücksetzen anfordern
auth.reset-password.title: Passwort zurücksetzen
auth.reset-password.description: Geben Sie Ihr neues Passwort ein, um Ihr Passwort zurückzusetzen.
auth.reset-password.reset: Ihr Passwort wurde zurückgesetzt.
auth.reset-password.back-to-login: Zurück zum Login
auth.reset-password.form.new-password.label: Neues Passwort
auth.reset-password.form.new-password.placeholder: 'Beispiel: **********'
auth.reset-password.form.new-password.required: Bitte geben Sie Ihr neues Passwort ein
auth.reset-password.form.new-password.min-length: Das Passwort muss mindestens {{ minLength }} Zeichen lang sein
auth.reset-password.form.new-password.max-length: Das Passwort muss weniger als {{ maxLength }} Zeichen lang sein
auth.reset-password.form.submit: Passwort zurücksetzen
auth.email-provider.open: '{{ provider }} öffnen'
auth.login.title: Bei Papra anmelden
auth.login.description: Geben Sie Ihre E-Mail-Adresse ein oder verwenden Sie die soziale Anmeldung, um auf Ihr Papra-Konto zuzugreifen.
auth.login.login-with-provider: Mit {{ provider }} anmelden
auth.login.no-account: Sie haben noch kein Konto?
auth.login.register: Registrieren
auth.login.form.email.label: E-Mail
auth.login.form.email.placeholder: 'Beispiel: ada@papra.app'
auth.login.form.email.required: Bitte geben Sie Ihre E-Mail-Adresse ein
auth.login.form.email.invalid: Diese E-Mail-Adresse ist ungültig
auth.login.form.password.label: Passwort
auth.login.form.password.placeholder: Passwort festlegen
auth.login.form.password.required: Bitte geben Sie Ihr Passwort ein
auth.login.form.remember-me.label: Angemeldet bleiben
auth.login.form.forgot-password.label: Passwort vergessen?
auth.login.form.submit: Anmelden
auth.register.title: Bei Papra registrieren
auth.register.description: Erstellen Sie ein Konto, um Papra zu nutzen.
auth.register.register-with-email: Mit E-Mail registrieren
auth.register.register-with-provider: Mit {{ provider }} registrieren
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Sie haben bereits ein Konto?
auth.register.login: Anmelden
auth.register.registration-disabled.title: Registrierung ist deaktiviert
auth.register.registration-disabled.description: Die Erstellung neuer Konten ist auf dieser Papra-Instanz derzeit deaktiviert. Nur Benutzer mit bestehenden Konten können sich anmelden. Wenn Sie dies für einen Fehler halten, wenden Sie sich bitte an den Administrator dieser Instanz.
auth.register.form.email.label: E-Mail
auth.register.form.email.placeholder: 'Beispiel: ada@papra.app'
auth.register.form.email.required: Bitte geben Sie Ihre E-Mail-Adresse ein
auth.register.form.email.invalid: Diese E-Mail-Adresse ist ungültig
auth.register.form.password.label: Passwort
auth.register.form.password.placeholder: Passwort festlegen
auth.register.form.password.required: Bitte geben Sie Ihr Passwort ein
auth.register.form.password.min-length: Das Passwort muss mindestens {{ minLength }} Zeichen lang sein
auth.register.form.password.max-length: Das Passwort muss weniger als {{ maxLength }} Zeichen lang sein
auth.register.form.name.label: Name
auth.register.form.name.placeholder: 'Beispiel: Ada Lovelace'
auth.register.form.name.required: Bitte geben Sie Ihren Namen ein
auth.register.form.name.max-length: Der Name muss weniger als {{ maxLength }} Zeichen lang sein
auth.register.form.submit: Registrieren
auth.email-validation-required.title: E-Mail verifizieren
auth.email-validation-required.description: Eine Verifizierungs-E-Mail wurde an Ihre E-Mail-Adresse gesendet. Bitte verifizieren Sie Ihre E-Mail-Adresse, indem Sie auf den Link in der E-Mail klicken.
auth.legal-links.description: Indem Sie fortfahren, bestätigen Sie, dass Sie die {{ terms }} und die {{ privacy }} verstanden haben und ihnen zustimmen.
auth.legal-links.terms: Nutzungsbedingungen
auth.legal-links.privacy: Datenschutzrichtlinie
auth.no-auth-provider.title: Kein Authentifizierungsanbieter
auth.no-auth-provider.description: Es gibt keine Authentifizierungsanbieter auf dieser Papra-Instanz. Bitte kontaktieren Sie den Administrator dieser Instanz, um sie zu aktivieren.
# User settings
user.settings.title: Benutzereinstellungen
user.settings.description: Verwalten Sie hier Ihre Kontoeinstellungen.
user.settings.email.title: E-Mail-Adresse
user.settings.email.description: Ihre E-Mail-Adresse kann nicht geändert werden.
user.settings.email.label: E-Mail-Adresse
user.settings.name.title: Vollständiger Name
user.settings.name.description: Ihr vollständiger Name wird anderen Organisationsmitgliedern angezeigt.
user.settings.name.label: Vollständiger Name
user.settings.name.placeholder: Z.B. Max Mustermann
user.settings.name.update: Namen aktualisieren
user.settings.name.updated: Ihr vollständiger Name wurde aktualisiert
user.settings.logout.title: Abmelden
user.settings.logout.description: Melden Sie sich von Ihrem Konto ab. Sie können sich später wieder anmelden.
user.settings.logout.button: Abmelden
# Organizations
organizations.list.title: Ihre Organisationen
organizations.list.description: Organisationen sind eine Möglichkeit, Ihre Dokumente zu gruppieren und den Zugriff darauf zu verwalten. Sie können mehrere Organisationen erstellen und Ihre Teammitglieder zur Zusammenarbeit einladen.
organizations.list.create-new: Neue Organisation erstellen
organizations.details.no-documents.title: Keine Dokumente
organizations.details.no-documents.description: Es sind noch keine Dokumente in dieser Organisation vorhanden. Beginnen Sie mit dem Hochladen von Dokumenten.
organizations.details.upload-documents: Dokumente hochladen
organizations.details.documents-count: Dokumente insgesamt
organizations.details.total-size: Gesamtgröße
organizations.details.latest-documents: Neueste importierte Dokumente
organizations.create.title: Eine neue Organisation erstellen
organizations.create.description: Ihre Dokumente werden nach Organisation gruppiert. Sie können mehrere Organisationen erstellen, um Ihre Dokumente zu trennen, z.B. für persönliche und geschäftliche Dokumente.
organizations.create.back: Zurück
organizations.create.error.max-count-reached: Sie haben die maximale Anzahl an Organisationen erreicht, die Sie erstellen können. Wenn Sie weitere erstellen möchten, kontaktieren Sie bitte den Support.
organizations.create.form.name.label: Name der Organisation
organizations.create.form.name.placeholder: Z.B. Acme Inc.
organizations.create.form.name.required: Bitte geben Sie einen Organisationsnamen ein
organizations.create.form.submit: Organisation erstellen
organizations.create.success: Organisation erfolgreich erstellt
organizations.create-first.title: Erstellen Sie Ihre Organisation
organizations.create-first.description: Ihre Dokumente werden nach Organisation gruppiert. Sie können mehrere Organisationen erstellen, um Ihre Dokumente zu trennen, z.B. für persönliche und geschäftliche Dokumente.
organizations.create-first.default-name: Meine Organisation
organizations.create-first.user-name: Organisation von "{{ name }}"
organization.settings.title: Organisationseinstellungen
organization.settings.page.title: Organisationseinstellungen
organization.settings.page.description: Verwalten Sie hier Ihre Organisationseinstellungen.
organization.settings.name.title: Name der Organisation
organization.settings.name.update: Namen aktualisieren
organization.settings.name.placeholder: Z.B. Acme Inc.
organization.settings.name.updated: Organisationsname aktualisiert
organization.settings.subscription.title: Abonnement
organization.settings.subscription.description: Verwalten Sie Ihre Abrechnung, Rechnungen und Zahlungsmethoden.
organization.settings.subscription.manage: Abonnement verwalten
organization.settings.subscription.error: Kundenportal-URL konnte nicht abgerufen werden
organization.settings.delete.title: Organisation löschen
organization.settings.delete.description: Das Löschen dieser Organisation entfernt dauerhaft alle damit verbundenen Daten.
organization.settings.delete.confirm.title: Organisation löschen
organization.settings.delete.confirm.message: Sind Sie sicher, dass Sie diese Organisation löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden und alle mit dieser Organisation verbundenen Daten werden dauerhaft entfernt.
organization.settings.delete.confirm.confirm-button: Organisation löschen
organization.settings.delete.confirm.cancel-button: Abbrechen
organization.settings.delete.success: Organisation gelöscht
organizations.members.title: Mitglieder
organizations.members.description: Verwalten Sie Ihre Organisationsmitglieder
organizations.members.invite-member: Mitglied einladen
organizations.members.invite-member-disabled-tooltip: Nur Administratoren oder Eigentümer können Mitglieder in die Organisation einladen
organizations.members.remove-from-organization: Aus Organisation entfernen
organizations.members.role: Rolle
organizations.members.roles.owner: Eigentümer
organizations.members.roles.admin: Administrator
organizations.members.roles.member: Mitglied
organizations.members.delete.confirm.title: Mitglied entfernen
organizations.members.delete.confirm.message: Sind Sie sicher, dass Sie dieses Mitglied aus der Organisation entfernen möchten?
organizations.members.delete.confirm.confirm-button: Entfernen
organizations.members.delete.confirm.cancel-button: Abbrechen
organizations.members.delete.success: Mitglied aus Organisation entfernt
organizations.members.update-role.success: Mitgliederrolle aktualisiert
organizations.members.table.headers.name: Name
organizations.members.table.headers.email: E-Mail
organizations.members.table.headers.role: Rolle
organizations.members.table.headers.created: Erstellt
organizations.members.table.headers.actions: Aktionen
organizations.invite-member.title: Mitglied einladen
organizations.invite-member.description: Laden Sie ein Mitglied in Ihre Organisation ein
organizations.invite-member.form.email.label: E-Mail
organizations.invite-member.form.email.placeholder: 'Beispiel: ada@papra.app'
organizations.invite-member.form.email.required: Bitte geben Sie eine gültige E-Mail-Adresse ein
organizations.invite-member.form.role.label: Rolle
organizations.invite-member.form.submit: In Organisation einladen
organizations.invite-member.success.message: Mitglied eingeladen
organizations.invite-member.success.description: Die E-Mail wurde in die Organisation eingeladen.
organizations.invite-member.error.message: Mitglied konnte nicht eingeladen werden
organizations.invitations.title: Einladungen
organizations.invitations.description: Verwalten Sie Ihre Organisationseinladungen
organizations.invitations.list.cta: Mitglied einladen
organizations.invitations.list.empty.title: Keine ausstehenden Einladungen
organizations.invitations.list.empty.description: Sie wurden noch nicht zu Organisationen eingeladen.
organizations.invitations.status.pending: Ausstehend
organizations.invitations.status.accepted: Angenommen
organizations.invitations.status.rejected: Abgelehnt
organizations.invitations.status.expired: Abgelaufen
organizations.invitations.status.cancelled: Abgebrochen
organizations.invitations.resend: Einladung erneut senden
organizations.invitations.cancel.title: Einladung abbrechen
organizations.invitations.cancel.description: Sind Sie sicher, dass Sie diese Einladung abbrechen möchten?
organizations.invitations.cancel.confirm: Einladung abbrechen
organizations.invitations.cancel.cancel: Abbrechen
organizations.invitations.resend.title: Einladung erneut senden
organizations.invitations.resend.description: Sind Sie sicher, dass Sie diese Einladung erneut senden möchten? Dadurch wird eine neue E-Mail an den Empfänger gesendet.
organizations.invitations.resend.confirm: Einladung erneut senden
organizations.invitations.resend.cancel: Abbrechen
invitations.list.title: Einladungen
invitations.list.description: Verwalten Sie Ihre Organisationseinladungen
invitations.list.empty.title: Keine ausstehenden Einladungen
invitations.list.empty.description: Sie wurden noch nicht zu Organisationen eingeladen.
invitations.list.headers.organization: Organisation
invitations.list.headers.status: Status
invitations.list.headers.created: Erstellt
invitations.list.headers.actions: Aktionen
invitations.list.actions.accept: Annehmen
invitations.list.actions.reject: Ablehnen
invitations.list.actions.accept.success.message: Einladung angenommen
invitations.list.actions.accept.success.description: Die Einladung wurde angenommen.
invitations.list.actions.reject.success.message: Einladung abgelehnt
invitations.list.actions.reject.success.description: Die Einladung wurde abgelehnt.
# Documents
documents.list.title: Dokumente
documents.list.no-documents.title: Keine Dokumente
documents.list.no-documents.description: Es sind noch keine Dokumente in dieser Organisation vorhanden. Beginnen Sie mit dem Hochladen von Dokumenten.
documents.list.no-results: Keine Dokumente gefunden
documents.tabs.info: Info
documents.tabs.content: Inhalt
documents.tabs.activity: Aktivität
documents.deleted.message: Dieses Dokument wurde gelöscht und wird in {{ days }} Tagen dauerhaft entfernt.
documents.actions.download: Herunterladen
documents.actions.open-in-new-tab: In neuem Tab öffnen
documents.actions.restore: Wiederherstellen
documents.actions.delete: Löschen
documents.actions.edit: Bearbeiten
documents.actions.cancel: Abbrechen
documents.actions.save: Speichern
documents.actions.saving: Speichern...
documents.content.alert: Der Inhalt des Dokuments wird beim Hochladen automatisch aus dem Dokument extrahiert. Er wird nur für Such- und Indexierungszwecke verwendet.
documents.info.id: ID
documents.info.name: Name
documents.info.type: Typ
documents.info.size: Größe
documents.info.created-at: Erstellt am
documents.info.updated-at: Aktualisiert am
documents.info.never: Nie
documents.rename.title: Dokument umbenennen
documents.rename.form.name.label: Name
documents.rename.form.name.placeholder: 'Beispiel: Rechnung 2024'
documents.rename.form.name.required: Bitte geben Sie einen Namen für das Dokument ein
documents.rename.form.name.max-length: Der Name muss weniger als 255 Zeichen lang sein
documents.rename.form.submit: Dokument umbenennen
documents.rename.success: Dokument erfolgreich umbenannt
documents.rename.cancel: Abbrechen
import-documents.title.error: '{{ count }} Dokumente fehlgeschlagen'
import-documents.title.success: '{{ count }} Dokumente importiert'
import-documents.title.pending: '{{ count }} / {{ total }} Dokumente importiert'
import-documents.title.none: Dokumente importieren
import-documents.no-import-in-progress: Kein Dokumentimport im Gange
documents.deleted.title: Gelöschte Dokumente
documents.deleted.empty.title: Keine gelöschten Dokumente
documents.deleted.empty.description: Sie haben keine gelöschten Dokumente. Gelöschte Dokumente werden für {{ days }} Tage in den Papierkorb verschoben.
documents.deleted.retention-notice: Alle gelöschten Dokumente werden für {{ days }} Tage im Papierkorb gespeichert. Nach Ablauf dieser Frist werden die Dokumente dauerhaft gelöscht und Sie können sie nicht wiederherstellen.
documents.deleted.deleted-at: Gelöscht
documents.deleted.restoring: Wiederherstellen...
documents.deleted.deleting: Löschen...
documents.preview.unknown-file-type: Kein Vorschau verfügbar für diesen Dateityp
documents.preview.binary-file: Dies scheint eine Binärdatei zu sein und kann nicht als Text angezeigt werden
trash.delete-all.button: Alles löschen
trash.delete-all.confirm.title: Alle Dokumente dauerhaft löschen?
trash.delete-all.confirm.description: Sind Sie sicher, dass Sie alle Dokumente aus dem Papierkorb dauerhaft löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.
trash.delete-all.confirm.label: Löschen
trash.delete-all.confirm.cancel: Abbrechen
trash.delete.button: Löschen
trash.delete.confirm.title: Dokument dauerhaft löschen?
trash.delete.confirm.description: Sind Sie sicher, dass Sie dieses Dokument dauerhaft aus dem Papierkorb löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.
trash.delete.confirm.label: Löschen
trash.delete.confirm.cancel: Abbrechen
trash.deleted.success.title: Dokument gelöscht
trash.deleted.success.description: Das Dokument wurde dauerhaft gelöscht.
activity.document.created: Das Dokument wurde erstellt
activity.document.updated.single: Das Feld {{ field }} wurde aktualisiert
activity.document.updated.multiple: Die Felder {{ fields }} wurden aktualisiert
activity.document.updated: Das Dokument wurde aktualisiert
activity.document.deleted: Das Dokument wurde gelöscht
activity.document.restored: Das Dokument wurde wiederhergestellt
activity.document.tagged: Tag {{ tag }} wurde hinzugefügt
activity.document.untagged: Tag {{ tag }} wurde entfernt
activity.document.user.name: von {{ name }}
activity.load-more: Mehr laden
activity.no-more-activities: Keine weiteren Aktivitäten für dieses Dokument
# Tags
tags.no-tags.title: Noch keine Tags
tags.no-tags.description: Diese Organisation hat noch keine Tags. Tags werden zur Kategorisierung von Dokumenten verwendet. Sie können Ihren Dokumenten Tags hinzufügen, um sie leichter zu finden und zu organisieren.
tags.no-tags.create-tag: Tag erstellen
tags.title: Dokumenten-Tags
tags.description: Tags werden zur Kategorisierung von Dokumenten verwendet. Sie können Ihren Dokumenten Tags hinzufügen, um sie leichter zu finden und zu organisieren.
tags.create: Tag erstellen
tags.update: Tag aktualisieren
tags.delete: Tag löschen
tags.delete.confirm.title: Tag löschen
tags.delete.confirm.message: Sind Sie sicher, dass Sie diesen Tag löschen möchten? Das Löschen eines Tags entfernt ihn von allen Dokumenten.
tags.delete.confirm.confirm-button: Löschen
tags.delete.confirm.cancel-button: Abbrechen
tags.delete.success: Tag erfolgreich gelöscht
tags.create.success: Tag "{{ name }}" erfolgreich erstellt.
tags.update.success: Tag "{{ name }}" erfolgreich aktualisiert.
tags.form.name.label: Name
tags.form.name.placeholder: Z.B. Verträge
tags.form.name.required: Bitte geben Sie einen Tag-Namen ein
tags.form.name.max-length: Tag-Name muss weniger als 64 Zeichen lang sein
tags.form.color.label: Farbe
tags.form.color.required: Bitte geben Sie eine Farbe ein
tags.form.color.invalid: Die Hex-Farbe ist falsch formatiert.
tags.form.description.label: Beschreibung
tags.form.description.optional: (optional)
tags.form.description.placeholder: Z.B. Alle von der Firma unterzeichneten Verträge
tags.form.description.max-length: Beschreibung muss weniger als 256 Zeichen lang sein
tags.form.no-description: Keine Beschreibung
tags.table.headers.tag: Tag
tags.table.headers.description: Beschreibung
tags.table.headers.documents: Dokumente
tags.table.headers.created: Erstellt
tags.table.headers.actions: Aktionen
# Tagging rules
tagging-rules.field.name: Dokumentenname
tagging-rules.field.content: Dokumenteninhalt
tagging-rules.operator.equals: ist gleich
tagging-rules.operator.not-equals: ist nicht gleich
tagging-rules.operator.contains: enthält
tagging-rules.operator.not-contains: enthält nicht
tagging-rules.operator.starts-with: beginnt mit
tagging-rules.operator.ends-with: endet mit
tagging-rules.list.title: Tagging-Regeln
tagging-rules.list.description: Verwalten Sie die Tagging-Regeln Ihrer Organisation, um Dokumente automatisch basierend auf von Ihnen definierten Bedingungen zu taggen.
tagging-rules.list.demo-warning: 'Hinweis: Da dies eine Demo-Umgebung (ohne Server) ist, werden Tagging-Regeln nicht auf neu hinzugefügte Dokumente angewendet.'
tagging-rules.list.no-tagging-rules.title: Keine Tagging-Regeln
tagging-rules.list.no-tagging-rules.description: Erstellen Sie eine Tagging-Regel, um Ihre hinzugefügten Dokumente automatisch basierend auf von Ihnen definierten Bedingungen zu taggen.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Tagging-Regel erstellen
tagging-rules.list.card.no-conditions: Keine Bedingungen
tagging-rules.list.card.one-condition: 1 Bedingung
tagging-rules.list.card.conditions: '{{ count }} Bedingungen'
tagging-rules.list.card.delete: Regel löschen
tagging-rules.list.card.edit: Regel bearbeiten
tagging-rules.create.title: Tagging-Regel erstellen
tagging-rules.create.success: Tagging-Regel erfolgreich erstellt
tagging-rules.create.error: Tagging-Regel konnte nicht erstellt werden
tagging-rules.create.submit: Regel erstellen
tagging-rules.form.name.label: Name
tagging-rules.form.name.placeholder: 'Beispiel: Rechnungen taggen'
tagging-rules.form.name.min-length: Bitte geben Sie einen Namen für die Regel ein
tagging-rules.form.name.max-length: Der Name muss weniger als 64 Zeichen lang sein
tagging-rules.form.description.label: Beschreibung
tagging-rules.form.description.placeholder: "Beispiel: Dokumente mit 'Rechnung' im Namen taggen"
tagging-rules.form.description.max-length: Die Beschreibung muss weniger als 256 Zeichen lang sein
tagging-rules.form.conditions.label: Bedingungen
tagging-rules.form.conditions.description: Definieren Sie die Bedingungen, die erfüllt sein müssen, damit die Regel angewendet wird. Alle Bedingungen müssen erfüllt sein, damit die Regel angewendet wird.
tagging-rules.form.conditions.add-condition: Bedingung hinzufügen
tagging-rules.form.conditions.no-conditions.title: Keine Bedingungen
tagging-rules.form.conditions.no-conditions.description: Sie haben dieser Regel keine Bedingungen hinzugefügt. Diese Regel wendet ihre Tags auf alle Dokumente an.
tagging-rules.form.conditions.no-conditions.confirm: Regel ohne Bedingungen anwenden
tagging-rules.form.conditions.no-conditions.cancel: Abbrechen
tagging-rules.form.conditions.value.placeholder: 'Beispiel: Rechnung'
tagging-rules.form.conditions.value.min-length: Bitte geben Sie einen Wert für die Bedingung ein
tagging-rules.form.tags.label: Tags
tagging-rules.form.tags.description: Wählen Sie die Tags aus, die auf die hinzugefügten Dokumente angewendet werden sollen, die den Bedingungen entsprechen
tagging-rules.form.tags.min-length: Es ist mindestens ein anzuwendender Tag erforderlich
tagging-rules.form.tags.add-tag: Tag erstellen
tagging-rules.form.submit: Regel erstellen
tagging-rules.update.title: Tagging-Regel aktualisieren
tagging-rules.update.error: Tagging-Regel konnte nicht aktualisiert werden
tagging-rules.update.submit: Regel aktualisieren
tagging-rules.update.cancel: Abbrechen
# Intake emails
intake-emails.title: E-Mail-Eingang
intake-emails.description: E-Mail-Eingangsadressen werden verwendet, um E-Mails automatisch in Papra aufzunehmen. Leiten Sie einfach E-Mails an die Eingangsadresse weiter und deren Anhänge werden zu den Dokumenten Ihrer Organisation hinzugefügt.
intake-emails.disabled.title: E-Mail-Eingang ist deaktiviert
intake-emails.disabled.description: E-Mail-Eingang ist auf dieser Instanz deaktiviert. Bitte kontaktieren Sie Ihren Administrator, um ihn zu aktivieren. Weitere Informationen finden Sie in der {{ documentation }}.
intake-emails.disabled.documentation: Dokumentation
intake-emails.info: Es werden nur aktivierte E-Mails aus zulässigen Ursprüngen verarbeitet. Sie können eine E-Mail-Eingangsadresse jederzeit aktivieren oder deaktivieren.
intake-emails.empty.title: Keine E-Mail-Eingänge
intake-emails.empty.description: Generieren Sie eine Eingangsadresse, um E-Mail-Anhänge einfach aufzunehmen.
intake-emails.empty.generate: E-Mail-Eingang generieren
intake-emails.count: '{{ count }} Eingangse-Mail{{ plural }} für diese Organisation'
intake-emails.new: Neue Eingangse-Mail
intake-emails.disabled-label: (Deaktiviert)
intake-emails.no-origins: Keine zulässigen E-Mail-Ursprünge
intake-emails.allowed-origins: Zulässig von {{ count }} Adresse{{ plural }}
intake-emails.actions.enable: Aktivieren
intake-emails.actions.disable: Deaktivieren
intake-emails.actions.manage-origins: Ursprungsadressen verwalten
intake-emails.actions.delete: Löschen
intake-emails.delete.confirm.title: Eingangse-Mail löschen?
intake-emails.delete.confirm.message: Sind Sie sicher, dass Sie diese Eingangse-Mail löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.
intake-emails.delete.confirm.confirm-button: Eingangse-Mail löschen
intake-emails.delete.confirm.cancel-button: Abbrechen
intake-emails.delete.success: Eingangse-Mail gelöscht
intake-emails.create.success: Eingangse-Mail erstellt
intake-emails.update.success.enabled: Eingangse-Mail aktiviert
intake-emails.update.success.disabled: Eingangse-Mail deaktiviert
intake-emails.allowed-origins.title: Zulässige Ursprünge
intake-emails.allowed-origins.description: Es werden nur E-Mails, die an {{ email }} von diesen Ursprüngen gesendet werden, verarbeitet. Wenn keine Ursprünge angegeben sind, werden alle E-Mails verworfen.
intake-emails.allowed-origins.add.label: Zulässige Ursprungs-E-Mail hinzufügen
intake-emails.allowed-origins.add.placeholder: Z.B. ada@papra.app
intake-emails.allowed-origins.add.button: Hinzufügen
intake-emails.allowed-origins.add.error.exists: Diese E-Mail ist bereits in den zulässigen Ursprüngen für diese Eingangse-Mail vorhanden
# API keys
api-keys.permissions.documents.title: Dokumente
api-keys.permissions.documents.documents:create: Dokumente erstellen
api-keys.permissions.documents.documents:read: Dokumente lesen
api-keys.permissions.documents.documents:update: Dokumente aktualisieren
api-keys.permissions.documents.documents:delete: Dokumente löschen
api-keys.permissions.tags.title: Tags
api-keys.permissions.tags.tags:create: Tags erstellen
api-keys.permissions.tags.tags:read: Tags lesen
api-keys.permissions.tags.tags:update: Tags aktualisieren
api-keys.permissions.tags.tags:delete: Tags löschen
api-keys.create.title: API-Schlüssel erstellen
api-keys.create.description: Erstellen Sie einen neuen API-Schlüssel, um auf die Papra API zuzugreifen.
api-keys.create.success: Der API-Schlüssel wurde erfolgreich erstellt.
api-keys.create.back: Zurück zu den API-Schlüsseln
api-keys.create.form.name.label: Name
api-keys.create.form.name.placeholder: 'Beispiel: Mein API-Schlüssel'
api-keys.create.form.name.required: Bitte geben Sie einen Namen für den API-Schlüssel ein
api-keys.create.form.permissions.label: Berechtigungen
api-keys.create.form.permissions.required: Bitte wählen Sie mindestens eine Berechtigung aus
api-keys.create.form.submit: API-Schlüssel erstellen
api-keys.create.created.title: API-Schlüssel erstellt
api-keys.create.created.description: Der API-Schlüssel wurde erfolgreich erstellt. Speichern Sie ihn an einem sicheren Ort, da er nicht erneut angezeigt wird.
api-keys.list.title: API-Schlüssel
api-keys.list.description: Verwalten Sie hier Ihre API-Schlüssel.
api-keys.list.create: API-Schlüssel erstellen
api-keys.list.empty.title: Keine API-Schlüssel
api-keys.list.empty.description: Erstellen Sie einen API-Schlüssel, um auf die Papra API zuzugreifen.
api-keys.list.card.last-used: Zuletzt verwendet
api-keys.list.card.never: Nie
api-keys.list.card.created: Erstellt
api-keys.delete.success: Der API-Schlüssel wurde erfolgreich gelöscht
api-keys.delete.confirm.title: API-Schlüssel löschen
api-keys.delete.confirm.message: Sind Sie sicher, dass Sie diesen API-Schlüssel löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.
api-keys.delete.confirm.confirm-button: Löschen
api-keys.delete.confirm.cancel-button: Abbrechen
# Webhooks
webhooks.list.title: Webhooks
webhooks.list.description: Verwalten Sie Ihre Organisations-Webhooks
webhooks.list.empty.title: Keine Webhooks
webhooks.list.empty.description: Erstellen Sie Ihren ersten Webhook, um Ereignisse zu empfangen
webhooks.list.create: Webhook erstellen
webhooks.list.card.last-triggered: Zuletzt ausgelöst
webhooks.list.card.never: Nie
webhooks.list.card.created: Erstellt
webhooks.create.title: Webhook erstellen
webhooks.create.description: Erstellen Sie einen neuen Webhook, um Ereignisse zu empfangen
webhooks.create.success: Webhook erfolgreich erstellt
webhooks.create.back: Zurück
webhooks.create.form.submit: Webhook erstellen
webhooks.create.form.name.label: Webhook-Name
webhooks.create.form.name.placeholder: Webhook-Namen eingeben
webhooks.create.form.name.required: Name ist erforderlich
webhooks.create.form.url.label: Webhook-URL
webhooks.create.form.url.placeholder: Webhook-URL eingeben
webhooks.create.form.url.required: URL ist erforderlich
webhooks.create.form.url.invalid: URL ist ungültig
webhooks.create.form.secret.label: Geheimnis
webhooks.create.form.secret.placeholder: Webhook-Geheimnis eingeben
webhooks.create.form.events.label: Ereignisse
webhooks.create.form.events.required: Mindestens ein Ereignis ist erforderlich
webhooks.update.title: Webhook bearbeiten
webhooks.update.description: Aktualisieren Sie Ihre Webhook-Details
webhooks.update.success: Webhook erfolgreich aktualisiert
webhooks.update.submit: Webhook aktualisieren
webhooks.update.cancel: Abbrechen
webhooks.update.form.secret.placeholder: Neues Geheimnis eingeben
webhooks.update.form.secret.placeholder-redacted: '[Geheimnis geschwärzt]'
webhooks.update.form.rotate-secret.button: Geheimnis rotieren
webhooks.delete.success: Webhook erfolgreich gelöscht
webhooks.delete.confirm.title: Webhook löschen
webhooks.delete.confirm.message: Sind Sie sicher, dass Sie diesen Webhook löschen möchten?
webhooks.delete.confirm.confirm-button: Löschen
webhooks.delete.confirm.cancel-button: Abbrechen
webhooks.events.documents.title: Dokumente Ereignisse
webhooks.events.documents.document:created.description: Dokument erstellt
webhooks.events.documents.document:deleted.description: Dokument gelöscht
webhooks.events.documents.document:updated.description: Dokument aktualisiert
webhooks.events.documents.document:tag:added.description: Ein Tag wurde zu einem Dokument hinzugefügt
webhooks.events.documents.document:tag:removed.description: Ein Tag wurde von einem Dokument entfernt
# Navigation
layout.menu.home: Startseite
layout.menu.documents: Dokumente
layout.menu.tags: Tags
layout.menu.tagging-rules: Tagging-Regeln
layout.menu.deleted-documents: Gelöschte Dokumente
layout.menu.organization-settings: Einstellungen
layout.menu.api-keys: API-Schlüssel
layout.menu.settings: Einstellungen
layout.menu.account: Konto
layout.menu.general-settings: Allgemeine Einstellungen
layout.menu.intake-emails: E-Mail-Eingang
layout.menu.webhooks: Webhooks
layout.menu.members: Mitglieder
layout.menu.invitations: Einladungen
layout.theme.light: Heller Modus
layout.theme.dark: Dunkler Modus
layout.theme.system: Systemmodus
layout.search.placeholder: Suchen...
layout.menu.import-document: Dokument importieren
user-menu.account-settings: Kontoeinstellungen
user-menu.api-keys: API-Schlüssel
user-menu.invitations: Einladungen
user-menu.language: Sprache
user-menu.logout: Abmelden
# Command palette
command-palette.search.placeholder: Befehle oder Dokumente suchen
command-palette.no-results: Keine Ergebnisse gefunden
command-palette.sections.documents: Dokumente
command-palette.sections.theme: Thema
# API errors
api-errors.document.already_exists: Das Dokument existiert bereits
api-errors.document.file_too_big: Die Dokumentdatei ist zu groß
api-errors.intake_email.limit_reached: Die maximale Anzahl an Eingangse-Mails für diese Organisation wurde erreicht. Bitte aktualisieren Sie Ihren Plan, um weitere Eingangse-Mails zu erstellen.
api-errors.user.max_organization_count_reached: Sie haben die maximale Anzahl an Organisationen erreicht, die Sie erstellen können. Wenn Sie weitere erstellen möchten, kontaktieren Sie bitte den Support.
api-errors.default: Beim Verarbeiten Ihrer Anfrage ist ein Fehler aufgetreten.
api-errors.organization.invitation_already_exists: Eine Einladung für diese E-Mail existiert bereits in dieser Organisation.
api-errors.user.already_in_organization: Dieser Benutzer ist bereits in dieser Organisation.
api-errors.user.organization_invitation_limit_reached: Die maximale Anzahl an Einladungen für heute wurde erreicht. Bitte versuchen Sie es morgen erneut.
api-errors.demo.not_available: Diese Funktion ist in der Demo nicht verfügbar
api-errors.tags.already_exists: Ein Tag mit diesem Namen existiert bereits für diese Organisation
api-errors.internal.error: Beim Verarbeiten Ihrer Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.
api-errors.auth.invalid_origin: Ungültige Anwendungs-Ursprung. Wenn Sie Papra selbst hosten, stellen Sie sicher, dass Ihre APP_BASE_URL-Umgebungsvariable mit Ihrer aktuellen URL übereinstimmt. Weitere Details finden Sie unter https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Seite nicht gefunden
not-found.description: Entschuldigung, die gesuchte Seite scheint nicht zu existieren. Bitte überprüfen Sie die URL und versuchen Sie es erneut.
not-found.back-to-home: Zurück zur Startseite
# Demo
demo.popup.description: Dies ist eine Demo-Umgebung, alle Daten werden im lokalen Speicher Ihres Browsers gespeichert.
demo.popup.discord: Treten Sie dem {{ discordLink }} bei, um Support zu erhalten, Funktionen vorzuschlagen oder einfach nur zu chatten.
demo.popup.discord-link-label: Discord-Server
demo.popup.reset: Demo-Daten zurücksetzen
demo.popup.hide: Ausblenden
# Color picker
color-picker.hue: Farbton
color-picker.saturation: Sättigung
color-picker.lightness: Helligkeit
color-picker.select-color: Farbe auswählen
color-picker.select-a-color: Eine Farbe auswählen

View File

@@ -0,0 +1,711 @@
export const translations = {
// Authentication
'auth.request-password-reset.title': 'Reset your password',
'auth.request-password-reset.description': 'Enter your email to reset your password.',
'auth.request-password-reset.requested': 'If an account exists for this email, we\'ve sent you an email to reset your password.',
'auth.request-password-reset.back-to-login': 'Back to login',
'auth.request-password-reset.form.email.label': 'Email',
'auth.request-password-reset.form.email.placeholder': 'Example: ada@papra.app',
'auth.request-password-reset.form.email.required': 'Please enter your email address',
'auth.request-password-reset.form.email.invalid': 'This email address is invalid',
'auth.request-password-reset.form.submit': 'Request password reset',
'auth.reset-password.title': 'Reset your password',
'auth.reset-password.description': 'Enter your new password to reset your password.',
'auth.reset-password.reset': 'Your password has been reset.',
'auth.reset-password.back-to-login': 'Back to login',
'auth.reset-password.form.new-password.label': 'New password',
'auth.reset-password.form.new-password.placeholder': 'Example: **********',
'auth.reset-password.form.new-password.required': 'Please enter your new password',
'auth.reset-password.form.new-password.min-length': 'Password must be at least {{ minLength }} characters',
'auth.reset-password.form.new-password.max-length': 'Password must be less than {{ maxLength }} characters',
'auth.reset-password.form.submit': 'Reset password',
'auth.email-provider.open': 'Open {{ provider }}',
'auth.login.title': 'Login to Papra',
'auth.login.description': 'Enter your email or use social login to access your Papra account.',
'auth.login.login-with-provider': 'Login with {{ provider }}',
'auth.login.no-account': 'Don\'t have an account?',
'auth.login.register': 'Register',
'auth.login.form.email.label': 'Email',
'auth.login.form.email.placeholder': 'Example: ada@papra.app',
'auth.login.form.email.required': 'Please enter your email address',
'auth.login.form.email.invalid': 'This email address is invalid',
'auth.login.form.password.label': 'Password',
'auth.login.form.password.placeholder': 'Set a password',
'auth.login.form.password.required': 'Please enter your password',
'auth.login.form.remember-me.label': 'Remember me',
'auth.login.form.forgot-password.label': 'Forgot password?',
'auth.login.form.submit': 'Login',
'auth.register.title': 'Register to Papra',
'auth.register.description': 'Create an account to start using Papra.',
'auth.register.register-with-email': 'Register with email',
'auth.register.register-with-provider': 'Register with {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Already have an account?',
'auth.register.login': 'Login',
'auth.register.registration-disabled.title': 'Registration is disabled',
'auth.register.registration-disabled.description': 'The creation of new accounts is currently disabled on this instance of Papra. Only users with existing accounts can log in. If you think this is a mistake, please contact the administrator of this instance.',
'auth.register.form.email.label': 'Email',
'auth.register.form.email.placeholder': 'Example: ada@papra.app',
'auth.register.form.email.required': 'Please enter your email address',
'auth.register.form.email.invalid': 'This email address is invalid',
'auth.register.form.password.label': 'Password',
'auth.register.form.password.placeholder': 'Set a password',
'auth.register.form.password.required': 'Please enter your password',
'auth.register.form.password.min-length': 'Password must be at least {{ minLength }} characters',
'auth.register.form.password.max-length': 'Password must be less than {{ maxLength }} characters',
'auth.register.form.name.label': 'Name',
'auth.register.form.name.placeholder': 'Example: Ada Lovelace',
'auth.register.form.name.required': 'Please enter your name',
'auth.register.form.name.max-length': 'Name must be less than {{ maxLength }} characters',
'auth.register.form.submit': 'Register',
'auth.email-validation-required.title': 'Verify your email',
'auth.email-validation-required.description': 'A verification email has been sent to your email address. Please verify your email address by clicking the link in the email.',
'auth.email-verification.success.title': 'Email verified',
'auth.email-verification.success.description': 'Your email has been successfully verified. You can now log in to your account.',
'auth.email-verification.success.login': 'Go to login',
'auth.email-verification.error.title': 'Verification failed',
'auth.email-verification.error.description': 'The verification link has expired or is invalid. Please request a new verification email by logging in.',
'auth.email-verification.error.back': 'Back to login',
'auth.legal-links.description': 'By continuing, you acknowledge that you understand and agree to the {{ terms }} and {{ privacy }}.',
'auth.legal-links.terms': 'Terms of Service',
'auth.legal-links.privacy': 'Privacy Policy',
'auth.no-auth-provider.title': 'No authentication provider',
'auth.no-auth-provider.description': 'There are no authentication providers enabled on this instance of Papra. Please contact the administrator of this instance to enable them.',
// User settings
'user.settings.title': 'User settings',
'user.settings.description': 'Manage your account settings here.',
'user.settings.email.title': 'Email address',
'user.settings.email.description': 'Your email address cannot be changed.',
'user.settings.email.label': 'Email address',
'user.settings.name.title': 'Full name',
'user.settings.name.description': 'Your full name is displayed to other organization members.',
'user.settings.name.label': 'Full name',
'user.settings.name.placeholder': 'Eg. John Doe',
'user.settings.name.update': 'Update name',
'user.settings.name.updated': 'Your full name has been updated',
'user.settings.logout.title': 'Logout',
'user.settings.logout.description': 'Logout from your account. You can login again later.',
'user.settings.logout.button': 'Logout',
// Organizations
'organizations.list.title': 'Your organizations',
'organizations.list.description': 'Organizations are a way to group your documents and manage access to them. You can create multiple organizations and invite your team members to collaborate.',
'organizations.list.create-new': 'Create new organization',
'organizations.list.back': 'Back to organizations',
'organizations.list.deleted.title': 'Deleted organizations',
'organizations.list.deleted.description': 'Deleted organizations are kept for {{ days }} days before being permanently removed. You can restore them during this period.',
'organizations.list.deleted.empty': 'No deleted organizations',
'organizations.list.deleted.empty-description': 'When you delete an organization, it will appear here for {{ days }} days before being permanently deleted.',
'organizations.list.deleted.restore': 'Restore',
'organizations.list.deleted.restore-success': 'Organization restored successfully',
'organizations.list.deleted.restore-confirm.title': 'Restore organization',
'organizations.list.deleted.restore-confirm.message': 'Are you sure you want to restore this organization? It will be moved back to your active organizations list.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Restore organization',
'organizations.list.deleted.deleted-at': 'Deleted {{ date }}',
'organizations.list.deleted.purge-at': 'Will be permanently deleted on {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} day, {daysUntilPurge} days }} remaining)',
'organizations.details.no-documents.title': 'No documents',
'organizations.details.no-documents.description': 'There are no documents in this organization yet. Start by uploading some documents.',
'organizations.details.upload-documents': 'Upload documents',
'organizations.details.documents-count': 'documents in total',
'organizations.details.total-size': 'total size',
'organizations.details.latest-documents': 'Latest imported documents',
'organizations.create.title': 'Create a new organization',
'organizations.create.description': 'Your documents will be grouped by organization. You can create multiple organizations to separate your documents, for example, for personal and work documents.',
'organizations.create.back': 'Back',
'organizations.create.error.max-count-reached': 'You have reached the maximum number of organizations you can create, if you need to create more, please contact support.',
'organizations.create.form.name.label': 'Organization name',
'organizations.create.form.name.placeholder': 'Eg. Acme Inc.',
'organizations.create.form.name.required': 'Please enter an organization name',
'organizations.create.form.submit': 'Create organization',
'organizations.create.success': 'Organization created successfully',
'organizations.create-first.title': 'Create your organization',
'organizations.create-first.description': 'Your documents will be grouped by organization. You can create multiple organizations to separate your documents, for example, for personal and work documents.',
'organizations.create-first.default-name': 'My organization',
'organizations.create-first.user-name': '{{ name }}\'s organization',
'organization.settings.title': 'Organization Settings',
'organization.settings.page.title': 'Organization settings',
'organization.settings.page.description': 'Manage your organization settings here.',
'organization.settings.name.title': 'Organization name',
'organization.settings.name.update': 'Update name',
'organization.settings.name.placeholder': 'Eg. Acme Inc.',
'organization.settings.name.updated': 'Organization name updated',
'organization.settings.subscription.title': 'Subscription',
'organization.settings.subscription.description': 'Manage your billing, invoices and payment methods.',
'organization.settings.subscription.manage': 'Manage subscription',
'organization.settings.subscription.error': 'Failed to get customer portal URL',
'organization.settings.delete.title': 'Delete organization',
'organization.settings.delete.description': 'Deleting this organization will permanently remove all data associated with it.',
'organization.settings.delete.confirm.title': 'Delete organization',
'organization.settings.delete.confirm.message': 'Are you sure you want to delete this organization? The organization will be marked for deletion and permanently removed after {{ days }} days. During this period, you can restore it from your organizations list. All documents and data will be permanently deleted after this delay.',
'organization.settings.delete.confirm.confirm-button': 'Delete organization',
'organization.settings.delete.confirm.cancel-button': 'Cancel',
'organization.settings.delete.success': 'Organization deleted',
'organization.settings.delete.only-owner': 'Only the organization owner can delete this organization.',
'organization.settings.delete.has-active-subscription': 'Cannot delete organization with an active subscription, please cancel your subscription above first.',
'organization.usage.page.title': 'Usage',
'organization.usage.page.description': 'View your organization\'s current usage and limits.',
'organization.usage.storage.title': 'Document storage',
'organization.usage.storage.description': 'Total storage used by your documents',
'organization.usage.intake-emails.title': 'Intake emails',
'organization.usage.intake-emails.description': 'Number of intake email addresses',
'organization.usage.members.title': 'Members',
'organization.usage.members.description': 'Number of members in the organization',
'organization.usage.unlimited': 'Unlimited',
'organizations.members.title': 'Members',
'organizations.members.description': 'Manage your organization members',
'organizations.members.invite-member': 'Invite member',
'organizations.members.invite-member-disabled-tooltip': 'Only admins or owners can invite members to the organization',
'organizations.members.remove-from-organization': 'Remove from organization',
'organizations.members.role': 'Role',
'organizations.members.roles.owner': 'Owner',
'organizations.members.roles.admin': 'Admin',
'organizations.members.roles.member': 'Member',
'organizations.members.delete.confirm.title': 'Remove member',
'organizations.members.delete.confirm.message': 'Are you sure you want to remove this member from the organization?',
'organizations.members.delete.confirm.confirm-button': 'Remove',
'organizations.members.delete.confirm.cancel-button': 'Cancel',
'organizations.members.delete.success': 'Member removed from organization',
'organizations.members.update-role.success': 'Member role updated',
'organizations.members.table.headers.name': 'Name',
'organizations.members.table.headers.email': 'Email',
'organizations.members.table.headers.role': 'Role',
'organizations.members.table.headers.created': 'Created',
'organizations.members.table.headers.actions': 'Actions',
'organizations.invite-member.title': 'Invite member',
'organizations.invite-member.description': 'Invite a member to your organization',
'organizations.invite-member.form.email.label': 'Email',
'organizations.invite-member.form.email.placeholder': 'Example: ada@papra.app',
'organizations.invite-member.form.email.required': 'Please enter a valid email address',
'organizations.invite-member.form.role.label': 'Role',
'organizations.invite-member.form.submit': 'Invite to organization',
'organizations.invite-member.success.message': 'Member invited',
'organizations.invite-member.success.description': 'The email has been invited to the organization.',
'organizations.invite-member.error.message': 'Failed to invite member',
'organizations.invitations.title': 'Invitations',
'organizations.invitations.description': 'Manage your organization invitations',
'organizations.invitations.list.cta': 'Invite member',
'organizations.invitations.list.empty.title': 'No pending invitations',
'organizations.invitations.list.empty.description': 'You haven\'t been invited to any organizations yet.',
'organizations.invitations.status.pending': 'Pending',
'organizations.invitations.status.accepted': 'Accepted',
'organizations.invitations.status.rejected': 'Rejected',
'organizations.invitations.status.expired': 'Expired',
'organizations.invitations.status.cancelled': 'Cancelled',
'organizations.invitations.resend': 'Resend invitation',
'organizations.invitations.cancel.title': 'Cancel invitation',
'organizations.invitations.cancel.description': 'Are you sure you want to cancel this invitation?',
'organizations.invitations.cancel.confirm': 'Cancel invitation',
'organizations.invitations.cancel.cancel': 'Cancel',
'organizations.invitations.resend.title': 'Resend invitation',
'organizations.invitations.resend.description': 'Are you sure you want to resend this invitation? This will send a new email to the recipient.',
'organizations.invitations.resend.confirm': 'Resend invitation',
'organizations.invitations.resend.cancel': 'Cancel',
'invitations.list.title': 'Invitations',
'invitations.list.description': 'Manage your organization invitations',
'invitations.list.empty.title': 'No pending invitations',
'invitations.list.empty.description': 'You haven\'t been invited to any organizations yet.',
'invitations.list.headers.organization': 'Organization',
'invitations.list.headers.status': 'Status',
'invitations.list.headers.created': 'Created',
'invitations.list.headers.actions': 'Actions',
'invitations.list.actions.accept': 'Accept',
'invitations.list.actions.reject': 'Reject',
'invitations.list.actions.accept.success.message': 'Invitation accepted',
'invitations.list.actions.accept.success.description': 'The invitation has been accepted.',
'invitations.list.actions.reject.success.message': 'Invitation rejected',
'invitations.list.actions.reject.success.description': 'The invitation has been rejected.',
// Documents
'documents.list.title': 'Documents',
'documents.list.no-documents.title': 'No documents',
'documents.list.no-documents.description': 'There are no documents in this organization yet. Start by uploading some documents.',
'documents.list.no-results': 'No documents found',
'documents.tabs.info': 'Info',
'documents.tabs.content': 'Content',
'documents.tabs.activity': 'Activity',
'documents.deleted.message': 'This document has been deleted and will be permanently removed in {{ days }} days.',
'documents.actions.download': 'Download',
'documents.actions.open-in-new-tab': 'Open in new tab',
'documents.actions.restore': 'Restore',
'documents.actions.delete': 'Delete',
'documents.actions.edit': 'Edit',
'documents.actions.cancel': 'Cancel',
'documents.actions.save': 'Save',
'documents.actions.saving': 'Saving...',
'documents.content.alert': 'The content of the document is automatically extracted from the document on upload. It is only used for search and indexing purposes.',
'documents.content.empty-placeholder': 'This document has no extracted content, you can set it manually here.',
'documents.info.id': 'ID',
'documents.info.name': 'Name',
'documents.info.type': 'Type',
'documents.info.size': 'Size',
'documents.info.created-at': 'Created At',
'documents.info.updated-at': 'Updated At',
'documents.info.never': 'Never',
'documents.rename.title': 'Rename document',
'documents.rename.form.name.label': 'Name',
'documents.rename.form.name.placeholder': 'Example: Invoice 2024',
'documents.rename.form.name.required': 'Please enter a name for the document',
'documents.rename.form.name.max-length': 'The name must be less than 255 characters',
'documents.rename.form.submit': 'Rename document',
'documents.rename.success': 'Document renamed successfully',
'documents.rename.cancel': 'Cancel',
'import-documents.title.error': '{{ count }} documents failed',
'import-documents.title.success': '{{ count }} documents imported',
'import-documents.title.pending': '{{ count }} / {{ total }} documents imported',
'import-documents.title.none': 'Import documents',
'import-documents.no-import-in-progress': 'No document import in progress',
'documents.deleted.title': 'Deleted documents',
'documents.deleted.empty.title': 'No deleted documents',
'documents.deleted.empty.description': 'You have no deleted documents. Documents that are deleted will be moved to the trash bin for {{ days }} days.',
'documents.deleted.retention-notice': 'All deleted documents are stored in the trash bin for {{ days }} days. Passing this delay, the documents will be permanently deleted, and you will not be able to restore them.',
'documents.deleted.deleted-at': 'Deleted',
'documents.deleted.restoring': 'Restoring...',
'documents.deleted.deleting': 'Deleting...',
'documents.preview.unknown-file-type': 'No preview available for this file type',
'documents.preview.binary-file': 'This appears to be a binary file and cannot be displayed as text',
'trash.delete-all.button': 'Delete all',
'trash.delete-all.confirm.title': 'Permanently delete all documents?',
'trash.delete-all.confirm.description': 'Are you sure you want to permanently delete all documents from the trash? This action cannot be undone.',
'trash.delete-all.confirm.label': 'Delete',
'trash.delete-all.confirm.cancel': 'Cancel',
'trash.delete.button': 'Delete',
'trash.delete.confirm.title': 'Permanently delete document?',
'trash.delete.confirm.description': 'Are you sure you want to permanently delete this document from the trash? This action cannot be undone.',
'trash.delete.confirm.label': 'Delete',
'trash.delete.confirm.cancel': 'Cancel',
'trash.deleted.success.title': 'Document deleted',
'trash.deleted.success.description': 'The document has been permanently deleted.',
'activity.document.created': 'The document has been created',
'activity.document.updated.single': 'The {{ field }} has been updated',
'activity.document.updated.multiple': 'The {{ fields }} have been updated',
'activity.document.updated': 'The document has been updated',
'activity.document.deleted': 'The document has been deleted',
'activity.document.restored': 'The document has been restored',
'activity.document.tagged': 'Tag {{ tag }} has been added',
'activity.document.untagged': 'Tag {{ tag }} has been removed',
'activity.document.user.name': 'by {{ name }}',
'activity.load-more': 'Load more',
'activity.no-more-activities': 'No more activities for this document',
// Tags
'tags.no-tags.title': 'No tags yet',
'tags.no-tags.description': 'This organization has no tags yet. Tags are used to categorize documents. You can add tags to your documents to make them easier to find and organize.',
'tags.no-tags.create-tag': 'Create tag',
'tags.title': 'Documents Tags',
'tags.description': 'Tags are used to categorize documents. You can add tags to your documents to make them easier to find and organize.',
'tags.create': 'Create tag',
'tags.update': 'Update tag',
'tags.delete': 'Delete tag',
'tags.delete.confirm.title': 'Delete tag',
'tags.delete.confirm.message': 'Are you sure you want to delete this tag? Deleting a tag will remove it from all documents.',
'tags.delete.confirm.confirm-button': 'Delete',
'tags.delete.confirm.cancel-button': 'Cancel',
'tags.delete.success': 'Tag deleted successfully',
'tags.create.success': 'Tag "{{ name }}" created successfully.',
'tags.update.success': 'Tag "{{ name }}" updated successfully.',
'tags.form.name.label': 'Name',
'tags.form.name.placeholder': 'Eg. Contracts',
'tags.form.name.required': 'Please enter a tag name',
'tags.form.name.max-length': 'Tag name must be less than 64 characters',
'tags.form.color.label': 'Color',
'tags.form.color.required': 'Please enter a color',
'tags.form.color.invalid': 'The hex color is badly formatted.',
'tags.form.description.label': 'Description',
'tags.form.description.optional': '(optional)',
'tags.form.description.placeholder': 'Eg. All the contracts signed by the company',
'tags.form.description.max-length': 'Description must be less than 256 characters',
'tags.form.no-description': 'No description',
'tags.table.headers.tag': 'Tag',
'tags.table.headers.description': 'Description',
'tags.table.headers.documents': 'Documents',
'tags.table.headers.created': 'Created',
'tags.table.headers.actions': 'Actions',
// Tagging rules
'tagging-rules.field.name': 'document name',
'tagging-rules.field.content': 'document content',
'tagging-rules.operator.equals': 'equals',
'tagging-rules.operator.not-equals': 'not equals',
'tagging-rules.operator.contains': 'contains',
'tagging-rules.operator.not-contains': 'not contains',
'tagging-rules.operator.starts-with': 'starts with',
'tagging-rules.operator.ends-with': 'ends with',
'tagging-rules.list.title': 'Tagging rules',
'tagging-rules.list.description': 'Manage your organization\'s tagging rules, to automatically tag documents based on conditions you define.',
'tagging-rules.list.demo-warning': 'Note: As this is a demo environment (with no server), tagging rules will not be applied to newly added documents.',
'tagging-rules.list.no-tagging-rules.title': 'No tagging rules',
'tagging-rules.list.no-tagging-rules.description': 'Create a tagging rule to automatically tag your added documents based on conditions you define.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Create tagging rule',
'tagging-rules.list.card.no-conditions': 'No conditions',
'tagging-rules.list.card.one-condition': '1 condition',
'tagging-rules.list.card.conditions': '{{ count }} conditions',
'tagging-rules.list.card.delete': 'Delete rule',
'tagging-rules.list.card.edit': 'Edit rule',
'tagging-rules.create.title': 'Create tagging rule',
'tagging-rules.create.success': 'Tagging rule created successfully',
'tagging-rules.create.error': 'Failed to create tagging rule',
'tagging-rules.create.submit': 'Create rule',
'tagging-rules.form.name.label': 'Name',
'tagging-rules.form.name.placeholder': 'Example: Tag invoices',
'tagging-rules.form.name.min-length': 'Please enter a name for the rule',
'tagging-rules.form.name.max-length': 'The name must be less than 64 characters',
'tagging-rules.form.description.label': 'Description',
'tagging-rules.form.description.placeholder': 'Example: Tag documents with \'invoice\' in the name',
'tagging-rules.form.description.max-length': 'The description must be less than 256 characters',
'tagging-rules.form.conditions.label': 'Conditions',
'tagging-rules.form.conditions.description': 'Define the conditions that must be met for the rule to apply. No conditions means the rule will apply to all documents',
'tagging-rules.form.conditions.add-condition': 'Add condition',
'tagging-rules.form.conditions.connector.when': 'When',
'tagging-rules.form.conditions.connector.and': 'and',
'tagging-rules.form.conditions.connector.or': 'or',
'tagging-rules.condition-match-mode.all': 'All conditions must match',
'tagging-rules.condition-match-mode.any': 'Any condition must match',
'tagging-rules.form.conditions.no-conditions.title': 'No conditions',
'tagging-rules.form.conditions.no-conditions.description': 'You didn\'t add any conditions to this rule. This rule will apply its tags to all documents.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Apply rule without conditions',
'tagging-rules.form.conditions.no-conditions.cancel': 'Cancel',
'tagging-rules.form.conditions.value.placeholder': 'Example: invoice',
'tagging-rules.form.conditions.value.min-length': 'Please enter a value for the condition',
'tagging-rules.form.tags.label': 'Tags',
'tagging-rules.form.tags.description': 'Select the tags to apply to the added documents that match the conditions',
'tagging-rules.form.tags.min-length': 'At least one tag to apply is required',
'tagging-rules.form.tags.add-tag': 'Create tag',
'tagging-rules.form.submit': 'Create rule',
'tagging-rules.update.title': 'Update tagging rule',
'tagging-rules.update.error': 'Failed to update tagging rule',
'tagging-rules.update.submit': 'Update rule',
'tagging-rules.update.cancel': 'Cancel',
'tagging-rules.apply.button': 'Apply to existing documents',
'tagging-rules.apply.confirm.title': 'Apply rule to existing documents?',
'tagging-rules.apply.confirm.description': 'This will check all existing documents in your organization and apply tags where conditions match. The processing will happen in the background.',
'tagging-rules.apply.confirm.button': 'Apply rule',
'tagging-rules.apply.success': 'Rule application started in the background',
'tagging-rules.apply.error': 'Failed to start rule application',
'tagging-rules.apply.processing': 'Starting...',
// Intake emails
'intake-emails.title': 'Intake Emails',
'intake-emails.description': 'Intake emails address are used to automatically ingest emails into Papra. Just forward emails to the intake email address and their attachments will be added to your organization\'s documents.',
'intake-emails.disabled.title': 'Intake Emails are disabled',
'intake-emails.disabled.description': 'Intake emails are disabled on this instance. Please contact your administrator to enable them. See the {{ documentation }} for more information.',
'intake-emails.disabled.documentation': 'documentation',
'intake-emails.info': 'Only enabled intake emails from allowed origins will be processed. You can enable or disable an intake email at any time.',
'intake-emails.empty.title': 'No intake emails',
'intake-emails.empty.description': 'Generate an intake address to easily ingest emails attachments.',
'intake-emails.empty.generate': 'Generate intake email',
'intake-emails.count': '{{ count }} intake email{{ plural }} for this organization',
'intake-emails.new': 'New intake email',
'intake-emails.disabled-label': '(Disabled)',
'intake-emails.no-origins': 'No allowed email origins',
'intake-emails.allowed-origins': 'Allowed from {{ count }} address{{ plural }}',
'intake-emails.actions.enable': 'Enable',
'intake-emails.actions.disable': 'Disable',
'intake-emails.actions.manage-origins': 'Manage origins addresses',
'intake-emails.actions.delete': 'Delete',
'intake-emails.delete.confirm.title': 'Delete intake email?',
'intake-emails.delete.confirm.message': 'Are you sure you want to delete this intake email? This action cannot be undone.',
'intake-emails.delete.confirm.confirm-button': 'Delete intake email',
'intake-emails.delete.confirm.cancel-button': 'Cancel',
'intake-emails.delete.success': 'Intake email deleted',
'intake-emails.create.success': 'Intake email created',
'intake-emails.update.success.enabled': 'Intake email enabled',
'intake-emails.update.success.disabled': 'Intake email disabled',
'intake-emails.allowed-origins.title': 'Allowed origins',
'intake-emails.allowed-origins.description': 'Only emails sent to {{ email }} from these origins will be processed. If no origins are specified, all emails will be discarded.',
'intake-emails.allowed-origins.add.label': 'Add allowed origin email',
'intake-emails.allowed-origins.add.placeholder': 'Eg. ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Add',
'intake-emails.allowed-origins.add.error.exists': 'This email is already in the allowed origins for this intake email',
// API keys
'api-keys.permissions.select-all': 'Select all',
'api-keys.permissions.deselect-all': 'Deselect all',
'api-keys.permissions.organizations.title': 'Organizations',
'api-keys.permissions.organizations.organizations:create': 'Create organizations',
'api-keys.permissions.organizations.organizations:read': 'Read organizations',
'api-keys.permissions.organizations.organizations:update': 'Update organizations',
'api-keys.permissions.organizations.organizations:delete': 'Delete organizations',
'api-keys.permissions.documents.title': 'Documents',
'api-keys.permissions.documents.documents:create': 'Create documents',
'api-keys.permissions.documents.documents:read': 'Read documents',
'api-keys.permissions.documents.documents:update': 'Update documents',
'api-keys.permissions.documents.documents:delete': 'Delete documents',
'api-keys.permissions.tags.title': 'Tags',
'api-keys.permissions.tags.tags:create': 'Create tags',
'api-keys.permissions.tags.tags:read': 'Read tags',
'api-keys.permissions.tags.tags:update': 'Update tags',
'api-keys.permissions.tags.tags:delete': 'Delete tags',
'api-keys.create.title': 'Create API key',
'api-keys.create.description': 'Create a new API key to access the Papra API.',
'api-keys.create.success': 'The API key has been created successfully.',
'api-keys.create.back': 'Back to API keys',
'api-keys.create.form.name.label': 'Name',
'api-keys.create.form.name.placeholder': 'Example: My API key',
'api-keys.create.form.name.required': 'Please enter a name for the API key',
'api-keys.create.form.permissions.label': 'Permissions',
'api-keys.create.form.permissions.required': 'Please select at least one permission',
'api-keys.create.form.submit': 'Create API key',
'api-keys.create.created.title': 'API key created',
'api-keys.create.created.description': 'The API key has been created successfully. Save it in a secure location as it will not be displayed again.',
'api-keys.list.title': 'API keys',
'api-keys.list.description': 'Manage your API keys here.',
'api-keys.list.create': 'Create API key',
'api-keys.list.empty.title': 'No API keys',
'api-keys.list.empty.description': 'Create an API key to access the Papra API.',
'api-keys.list.card.last-used': 'Last used',
'api-keys.list.card.never': 'Never',
'api-keys.list.card.created': 'Created',
'api-keys.delete.success': 'The API key has been deleted successfully',
'api-keys.delete.confirm.title': 'Delete API key',
'api-keys.delete.confirm.message': 'Are you sure you want to delete this API key? This action cannot be undone.',
'api-keys.delete.confirm.confirm-button': 'Delete',
'api-keys.delete.confirm.cancel-button': 'Cancel',
// Webhooks
'webhooks.list.title': 'Webhooks',
'webhooks.list.description': 'Manage your organization webhooks',
'webhooks.list.empty.title': 'No webhooks',
'webhooks.list.empty.description': 'Create your first webhook to start receiving events',
'webhooks.list.create': 'Create webhook',
'webhooks.list.card.last-triggered': 'Last triggered',
'webhooks.list.card.never': 'Never',
'webhooks.list.card.created': 'Created',
'webhooks.create.title': 'Create webhook',
'webhooks.create.description': 'Create a new webhook to receive events',
'webhooks.create.success': 'Webhook created successfully',
'webhooks.create.back': 'Back',
'webhooks.create.form.submit': 'Create webhook',
'webhooks.create.form.name.label': 'Webhook name',
'webhooks.create.form.name.placeholder': 'Enter webhook name',
'webhooks.create.form.name.required': 'Name is required',
'webhooks.create.form.url.label': 'Webhook URL',
'webhooks.create.form.url.placeholder': 'Enter webhook URL',
'webhooks.create.form.url.required': 'URL is required',
'webhooks.create.form.url.invalid': 'URL is invalid',
'webhooks.create.form.secret.label': 'Secret',
'webhooks.create.form.secret.placeholder': 'Enter webhook secret',
'webhooks.create.form.events.label': 'Events',
'webhooks.create.form.events.required': 'At least one event is required',
'webhooks.update.title': 'Edit webhook',
'webhooks.update.description': 'Update your webhook details',
'webhooks.update.success': 'Webhook updated successfully',
'webhooks.update.submit': 'Update webhook',
'webhooks.update.cancel': 'Cancel',
'webhooks.update.form.secret.placeholder': 'Enter new secret',
'webhooks.update.form.secret.placeholder-redacted': '[Redacted secret]',
'webhooks.update.form.rotate-secret.button': 'Rotate secret',
'webhooks.delete.success': 'Webhook deleted successfully',
'webhooks.delete.confirm.title': 'Delete webhook',
'webhooks.delete.confirm.message': 'Are you sure you want to delete this webhook?',
'webhooks.delete.confirm.confirm-button': 'Delete',
'webhooks.delete.confirm.cancel-button': 'Cancel',
'webhooks.events.documents.title': 'Documents events',
'webhooks.events.documents.document:created.description': 'Document created',
'webhooks.events.documents.document:deleted.description': 'Document deleted',
'webhooks.events.documents.document:updated.description': 'Document updated',
'webhooks.events.documents.document:tag:added.description': 'A tag is added to a document',
'webhooks.events.documents.document:tag:removed.description': 'A tag is removed from a document',
// Navigation
'layout.menu.home': 'Home',
'layout.menu.documents': 'Documents',
'layout.menu.tags': 'Tags',
'layout.menu.tagging-rules': 'Tagging rules',
'layout.menu.deleted-documents': 'Deleted documents',
'layout.menu.organization-settings': 'Settings',
'layout.menu.api-keys': 'API keys',
'layout.menu.settings': 'Settings',
'layout.menu.account': 'Account',
'layout.menu.general-settings': 'General settings',
'layout.menu.usage': 'Usage',
'layout.menu.intake-emails': 'Intake emails',
'layout.menu.webhooks': 'Webhooks',
'layout.menu.members': 'Members',
'layout.menu.invitations': 'Invitations',
'layout.upgrade-cta.title': 'Need more space?',
'layout.upgrade-cta.description': 'Get 10x more storage + team collaboration',
'layout.upgrade-cta.button': 'Upgrade now',
'layout.theme.light': 'Light mode',
'layout.theme.dark': 'Dark mode',
'layout.theme.system': 'System mode',
'layout.search.placeholder': 'Search...',
'layout.menu.import-document': 'Import a document',
'user-menu.account-settings': 'Account settings',
'user-menu.api-keys': 'API keys',
'user-menu.invitations': 'Invitations',
'user-menu.language': 'Language',
'user-menu.logout': 'Logout',
// Command palette
'command-palette.search.placeholder': 'Search commands or documents',
'command-palette.no-results': 'No results found',
'command-palette.sections.documents': 'Documents',
'command-palette.sections.theme': 'Theme',
// API errors
'api-errors.document.already_exists': 'The document already exists',
'api-errors.document.size_too_large': 'The file size is too large',
'api-errors.intake-emails.already_exists': 'An intake email with this address already exists.',
'api-errors.intake_email.limit_reached': 'The maximum number of intake emails for this organization has been reached. Please upgrade your plan to create more intake emails.',
'api-errors.user.max_organization_count_reached': 'You have reached the maximum number of organizations you can create, if you need to create more, please contact support.',
'api-errors.default': 'An error occurred while processing your request.',
'api-errors.organization.invitation_already_exists': 'An invitation for this email already exists in this organization.',
'api-errors.user.already_in_organization': 'This user is already in this organization.',
'api-errors.user.organization_invitation_limit_reached': 'The maximum number of invitations has been reached for today. Please try again tomorrow.',
'api-errors.demo.not_available': 'This feature is not available in demo',
'api-errors.tags.already_exists': 'A tag with this name already exists for this organization',
'api-errors.internal.error': 'An error occurred while processing your request. Please try again later.',
'api-errors.auth.invalid_origin': 'Invalid application origin. If you are self-hosting Papra, ensure your APP_BASE_URL environment variable matches your current url. For more details see https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'The maximum number of members and pending invitations for this organization has been reached. Please upgrade your plan to add more members.',
'api-errors.organization.has_active_subscription': 'Cannot delete organization with an active subscription. Please cancel your subscription first using the Manage Subscription button above.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'User not found',
'api-errors.FAILED_TO_CREATE_USER': 'Failed to create user',
'api-errors.FAILED_TO_CREATE_SESSION': 'Failed to create session',
'api-errors.FAILED_TO_UPDATE_USER': 'Failed to update user',
'api-errors.FAILED_TO_GET_SESSION': 'Failed to get session',
'api-errors.INVALID_PASSWORD': 'Invalid password',
'api-errors.INVALID_EMAIL': 'Invalid email',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'The email or password is incorrect, or the account does not exist.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Social account already linked',
'api-errors.PROVIDER_NOT_FOUND': 'Provider not found',
'api-errors.INVALID_TOKEN': 'Invalid token',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'ID token not supported',
'api-errors.FAILED_TO_GET_USER_INFO': 'Failed to get user info',
'api-errors.USER_EMAIL_NOT_FOUND': 'User email not found',
'api-errors.EMAIL_NOT_VERIFIED': 'Email not verified',
'api-errors.PASSWORD_TOO_SHORT': 'Password too short',
'api-errors.PASSWORD_TOO_LONG': 'Password too long',
'api-errors.USER_ALREADY_EXISTS': 'A user with this email already exists',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'Email can not be updated',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Credential account not found',
'api-errors.SESSION_EXPIRED': 'Session expired',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Failed to unlink last account',
'api-errors.ACCOUNT_NOT_FOUND': 'Account not found',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'User already has password',
// Not found
'not-found.title': '404 - Not Found',
'not-found.description': 'Sorry, the page you are looking for does not seem to exist. Please check the URL and try again.',
'not-found.back-to-home': 'Go back to home',
// Demo
'demo.popup.description': 'This is a demo environment, all data is save to your browser local storage.',
'demo.popup.discord': 'Join the {{ discordLink }} to get support, propose features or just chat.',
'demo.popup.discord-link-label': 'Discord server',
'demo.popup.reset': 'Reset demo data',
'demo.popup.hide': 'Hide',
// Color picker
'color-picker.hue': 'Hue',
'color-picker.saturation': 'Saturation',
'color-picker.lightness': 'Lightness',
'color-picker.select-color': 'Select color',
'color-picker.select-a-color': 'Select a color',
// Subscriptions
'subscriptions.checkout-success.title': 'Payment Successful!',
'subscriptions.checkout-success.description': 'Your subscription has been activated successfully.',
'subscriptions.checkout-success.thank-you': 'Thank you for upgrading to Papra Plus. You now have access to all premium features.',
'subscriptions.checkout-success.go-to-organizations': 'Go to Organizations',
'subscriptions.checkout-success.redirecting': 'Redirecting in {{ count }} second{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Payment Canceled',
'subscriptions.checkout-cancel.description': 'Your subscription upgrade was canceled.',
'subscriptions.checkout-cancel.no-charges': 'No charges have been made to your account. You can try again anytime you\'re ready.',
'subscriptions.checkout-cancel.back-to-organizations': 'Back to Organizations',
'subscriptions.checkout-cancel.need-help': 'Need help?',
'subscriptions.checkout-cancel.contact-support': 'Contact support',
'subscriptions.upgrade-dialog.title': 'Upgrade this organization',
'subscriptions.upgrade-dialog.description': 'Unlock powerful features for your organization',
'subscriptions.upgrade-dialog.contact-us': 'Contact us',
'subscriptions.upgrade-dialog.enterprise-plans': 'if you need custom enterprise plans.',
'subscriptions.upgrade-dialog.current-plan': 'Current Plan',
'subscriptions.upgrade-dialog.recommended': 'Recommended',
'subscriptions.upgrade-dialog.per-month': '/month',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} billed annually',
'subscriptions.upgrade-dialog.upgrade-now': 'Upgrade now',
'subscriptions.upgrade-dialog.promo-banner.title': 'Limited Time Offer',
'subscriptions.upgrade-dialog.promo-banner.description': 'Get {{ percent }}% off all plans forever per organization as an early adopter! Offer expires in {{ days, >1:{days} days, =1:1 day, less than 1 day }}.',
'subscriptions.plan.free.name': 'Free plan',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Document storage size',
'subscriptions.features.members': 'Organization Members',
'subscriptions.features.members-count': '{{ count }} members',
'subscriptions.features.email-intakes': 'Email Intakes',
'subscriptions.features.email-intakes-count-singular': '{{ count }} address',
'subscriptions.features.email-intakes-count-plural': '{{ count }} addresses',
'subscriptions.features.max-upload-size': 'Max upload file size',
'subscriptions.features.support': 'Support',
'subscriptions.features.support-community': 'Community support',
'subscriptions.features.support-email': 'Email support',
'subscriptions.features.support-priority': 'Priority support',
'subscriptions.billing-interval.monthly': 'Monthly',
'subscriptions.billing-interval.annual': 'Annual',
'subscriptions.usage-warning.message': 'You have used {{ percent }}% of your document storage. Consider upgrading your plan to get more space.',
'subscriptions.usage-warning.upgrade-button': 'Upgrade Plan',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Type "{{ text }}" to confirm',
} as const;

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Reset your password
auth.request-password-reset.description: Enter your email to reset your password.
auth.request-password-reset.requested: If an account exists for this email, we've sent you an email to reset your password.
auth.request-password-reset.back-to-login: Back to login
auth.request-password-reset.form.email.label: Email
auth.request-password-reset.form.email.placeholder: 'Example: ada@papra.app'
auth.request-password-reset.form.email.required: Please enter your email address
auth.request-password-reset.form.email.invalid: This email address is invalid
auth.request-password-reset.form.submit: Request password reset
auth.reset-password.title: Reset your password
auth.reset-password.description: Enter your new password to reset your password.
auth.reset-password.reset: Your password has been reset.
auth.reset-password.back-to-login: Back to login
auth.reset-password.form.new-password.label: New password
auth.reset-password.form.new-password.placeholder: 'Example: **********'
auth.reset-password.form.new-password.required: Please enter your new password
auth.reset-password.form.new-password.min-length: Password must be at least {{ minLength }} characters
auth.reset-password.form.new-password.max-length: Password must be less than {{ maxLength }} characters
auth.reset-password.form.submit: Reset password
auth.email-provider.open: Open {{ provider }}
auth.login.title: Login to Papra
auth.login.description: Enter your email or use social login to access your Papra account.
auth.login.login-with-provider: Login with {{ provider }}
auth.login.no-account: Don't have an account?
auth.login.register: Register
auth.login.form.email.label: Email
auth.login.form.email.placeholder: 'Example: ada@papra.app'
auth.login.form.email.required: Please enter your email address
auth.login.form.email.invalid: This email address is invalid
auth.login.form.password.label: Password
auth.login.form.password.placeholder: Set a password
auth.login.form.password.required: Please enter your password
auth.login.form.remember-me.label: Remember me
auth.login.form.forgot-password.label: Forgot password?
auth.login.form.submit: Login
auth.register.title: Register to Papra
auth.register.description: Create an account to start using Papra.
auth.register.register-with-email: Register with email
auth.register.register-with-provider: Register with {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Already have an account?
auth.register.login: Login
auth.register.registration-disabled.title: Registration is disabled
auth.register.registration-disabled.description: The creation of new accounts is currently disabled on this instance of Papra. Only users with existing accounts can log in. If you think this is a mistake, please contact the administrator of this instance.
auth.register.form.email.label: Email
auth.register.form.email.placeholder: 'Example: ada@papra.app'
auth.register.form.email.required: Please enter your email address
auth.register.form.email.invalid: This email address is invalid
auth.register.form.password.label: Password
auth.register.form.password.placeholder: Set a password
auth.register.form.password.required: Please enter your password
auth.register.form.password.min-length: Password must be at least {{ minLength }} characters
auth.register.form.password.max-length: Password must be less than {{ maxLength }} characters
auth.register.form.name.label: Name
auth.register.form.name.placeholder: 'Example: Ada Lovelace'
auth.register.form.name.required: Please enter your name
auth.register.form.name.max-length: Name must be less than {{ maxLength }} characters
auth.register.form.submit: Register
auth.email-validation-required.title: Verify your email
auth.email-validation-required.description: A verification email has been sent to your email address. Please verify your email address by clicking the link in the email.
auth.legal-links.description: By continuing, you acknowledge that you understand and agree to the {{ terms }} and {{ privacy }}.
auth.legal-links.terms: Terms of Service
auth.legal-links.privacy: Privacy Policy
auth.no-auth-provider.title: No authentication provider
auth.no-auth-provider.description: There are no authentication providers enabled on this instance of Papra. Please contact the administrator of this instance to enable them.
# User settings
user.settings.title: User settings
user.settings.description: Manage your account settings here.
user.settings.email.title: Email address
user.settings.email.description: Your email address cannot be changed.
user.settings.email.label: Email address
user.settings.name.title: Full name
user.settings.name.description: Your full name is displayed to other organization members.
user.settings.name.label: Full name
user.settings.name.placeholder: Eg. John Doe
user.settings.name.update: Update name
user.settings.name.updated: Your full name has been updated
user.settings.logout.title: Logout
user.settings.logout.description: Logout from your account. You can login again later.
user.settings.logout.button: Logout
# Organizations
organizations.list.title: Your organizations
organizations.list.description: Organizations are a way to group your documents and manage access to them. You can create multiple organizations and invite your team members to collaborate.
organizations.list.create-new: Create new organization
organizations.details.no-documents.title: No documents
organizations.details.no-documents.description: There are no documents in this organization yet. Start by uploading some documents.
organizations.details.upload-documents: Upload documents
organizations.details.documents-count: documents in total
organizations.details.total-size: total size
organizations.details.latest-documents: Latest imported documents
organizations.create.title: Create a new organization
organizations.create.description: Your documents will be grouped by organization. You can create multiple organizations to separate your documents, for example, for personal and work documents.
organizations.create.back: Back
organizations.create.error.max-count-reached: You have reached the maximum number of organizations you can create, if you need to create more, please contact support.
organizations.create.form.name.label: Organization name
organizations.create.form.name.placeholder: Eg. Acme Inc.
organizations.create.form.name.required: Please enter an organization name
organizations.create.form.submit: Create organization
organizations.create.success: Organization created successfully
organizations.create-first.title: Create your organization
organizations.create-first.description: Your documents will be grouped by organization. You can create multiple organizations to separate your documents, for example, for personal and work documents.
organizations.create-first.default-name: My organization
organizations.create-first.user-name: "{{ name }}'s organization"
organization.settings.title: Organization Settings
organization.settings.page.title: Organization settings
organization.settings.page.description: Manage your organization settings here.
organization.settings.name.title: Organization name
organization.settings.name.update: Update name
organization.settings.name.placeholder: Eg. Acme Inc.
organization.settings.name.updated: Organization name updated
organization.settings.subscription.title: Subscription
organization.settings.subscription.description: Manage your billing, invoices and payment methods.
organization.settings.subscription.manage: Manage subscription
organization.settings.subscription.error: Failed to get customer portal URL
organization.settings.delete.title: Delete organization
organization.settings.delete.description: Deleting this organization will permanently remove all data associated with it.
organization.settings.delete.confirm.title: Delete organization
organization.settings.delete.confirm.message: Are you sure you want to delete this organization? This action cannot be undone, and all data associated with this organization will be permanently removed.
organization.settings.delete.confirm.confirm-button: Delete organization
organization.settings.delete.confirm.cancel-button: Cancel
organization.settings.delete.success: Organization deleted
organizations.members.title: Members
organizations.members.description: Manage your organization members
organizations.members.invite-member: Invite member
organizations.members.invite-member-disabled-tooltip: Only admins or owners can invite members to the organization
organizations.members.remove-from-organization: Remove from organization
organizations.members.role: Role
organizations.members.roles.owner: Owner
organizations.members.roles.admin: Admin
organizations.members.roles.member: Member
organizations.members.delete.confirm.title: Remove member
organizations.members.delete.confirm.message: Are you sure you want to remove this member from the organization?
organizations.members.delete.confirm.confirm-button: Remove
organizations.members.delete.confirm.cancel-button: Cancel
organizations.members.delete.success: Member removed from organization
organizations.members.update-role.success: Member role updated
organizations.members.table.headers.name: Name
organizations.members.table.headers.email: Email
organizations.members.table.headers.role: Role
organizations.members.table.headers.created: Created
organizations.members.table.headers.actions: Actions
organizations.invite-member.title: Invite member
organizations.invite-member.description: Invite a member to your organization
organizations.invite-member.form.email.label: Email
organizations.invite-member.form.email.placeholder: 'Example: ada@papra.app'
organizations.invite-member.form.email.required: Please enter a valid email address
organizations.invite-member.form.role.label: Role
organizations.invite-member.form.submit: Invite to organization
organizations.invite-member.success.message: Member invited
organizations.invite-member.success.description: The email has been invited to the organization.
organizations.invite-member.error.message: Failed to invite member
organizations.invitations.title: Invitations
organizations.invitations.description: Manage your organization invitations
organizations.invitations.list.cta: Invite member
organizations.invitations.list.empty.title: No pending invitations
organizations.invitations.list.empty.description: You haven't been invited to any organizations yet.
organizations.invitations.status.pending: Pending
organizations.invitations.status.accepted: Accepted
organizations.invitations.status.rejected: Rejected
organizations.invitations.status.expired: Expired
organizations.invitations.status.cancelled: Cancelled
organizations.invitations.resend: Resend invitation
organizations.invitations.cancel.title: Cancel invitation
organizations.invitations.cancel.description: Are you sure you want to cancel this invitation?
organizations.invitations.cancel.confirm: Cancel invitation
organizations.invitations.cancel.cancel: Cancel
organizations.invitations.resend.title: Resend invitation
organizations.invitations.resend.description: Are you sure you want to resend this invitation? This will send a new email to the recipient.
organizations.invitations.resend.confirm: Resend invitation
organizations.invitations.resend.cancel: Cancel
invitations.list.title: Invitations
invitations.list.description: Manage your organization invitations
invitations.list.empty.title: No pending invitations
invitations.list.empty.description: You haven't been invited to any organizations yet.
invitations.list.headers.organization: Organization
invitations.list.headers.status: Status
invitations.list.headers.created: Created
invitations.list.headers.actions: Actions
invitations.list.actions.accept: Accept
invitations.list.actions.reject: Reject
invitations.list.actions.accept.success.message: Invitation accepted
invitations.list.actions.accept.success.description: The invitation has been accepted.
invitations.list.actions.reject.success.message: Invitation rejected
invitations.list.actions.reject.success.description: The invitation has been rejected.
# Documents
documents.list.title: Documents
documents.list.no-documents.title: No documents
documents.list.no-documents.description: There are no documents in this organization yet. Start by uploading some documents.
documents.list.no-results: No documents found
documents.tabs.info: Info
documents.tabs.content: Content
documents.tabs.activity: Activity
documents.deleted.message: This document has been deleted and will be permanently removed in {{ days }} days.
documents.actions.download: Download
documents.actions.open-in-new-tab: Open in new tab
documents.actions.restore: Restore
documents.actions.delete: Delete
documents.actions.edit: Edit
documents.actions.cancel: Cancel
documents.actions.save: Save
documents.actions.saving: Saving...
documents.content.alert: The content of the document is automatically extracted from the document on upload. It is only used for search and indexing purposes.
documents.info.id: ID
documents.info.name: Name
documents.info.type: Type
documents.info.size: Size
documents.info.created-at: Created At
documents.info.updated-at: Updated At
documents.info.never: Never
documents.rename.title: Rename document
documents.rename.form.name.label: Name
documents.rename.form.name.placeholder: 'Example: Invoice 2024'
documents.rename.form.name.required: Please enter a name for the document
documents.rename.form.name.max-length: The name must be less than 255 characters
documents.rename.form.submit: Rename document
documents.rename.success: Document renamed successfully
documents.rename.cancel: Cancel
import-documents.title.error: '{{ count }} documents failed'
import-documents.title.success: '{{ count }} documents imported'
import-documents.title.pending: '{{ count }} / {{ total }} documents imported'
import-documents.title.none: Import documents
import-documents.no-import-in-progress: No document import in progress
documents.deleted.title: Deleted documents
documents.deleted.empty.title: No deleted documents
documents.deleted.empty.description: You have no deleted documents. Documents that are deleted will be moved to the trash bin for {{ days }} days.
documents.deleted.retention-notice: All deleted documents are stored in the trash bin for {{ days }} days. Passing this delay, the documents will be permanently deleted, and you will not be able to restore them.
documents.deleted.deleted-at: Deleted
documents.deleted.restoring: Restoring...
documents.deleted.deleting: Deleting...
documents.preview.unknown-file-type: No preview available for this file type
documents.preview.binary-file: This appears to be a binary file and cannot be displayed as text
trash.delete-all.button: Delete all
trash.delete-all.confirm.title: Permanently delete all documents?
trash.delete-all.confirm.description: Are you sure you want to permanently delete all documents from the trash? This action cannot be undone.
trash.delete-all.confirm.label: Delete
trash.delete-all.confirm.cancel: Cancel
trash.delete.button: Delete
trash.delete.confirm.title: Permanently delete document?
trash.delete.confirm.description: Are you sure you want to permanently delete this document from the trash? This action cannot be undone.
trash.delete.confirm.label: Delete
trash.delete.confirm.cancel: Cancel
trash.deleted.success.title: Document deleted
trash.deleted.success.description: The document has been permanently deleted.
activity.document.created: The document has been created
activity.document.updated.single: The {{ field }} has been updated
activity.document.updated.multiple: The {{ fields }} have been updated
activity.document.updated: The document has been updated
activity.document.deleted: The document has been deleted
activity.document.restored: The document has been restored
activity.document.tagged: Tag {{ tag }} has been added
activity.document.untagged: Tag {{ tag }} has been removed
activity.document.user.name: by {{ name }}
activity.load-more: Load more
activity.no-more-activities: No more activities for this document
# Tags
tags.no-tags.title: No tags yet
tags.no-tags.description: This organization has no tags yet. Tags are used to categorize documents. You can add tags to your documents to make them easier to find and organize.
tags.no-tags.create-tag: Create tag
tags.title: Documents Tags
tags.description: Tags are used to categorize documents. You can add tags to your documents to make them easier to find and organize.
tags.create: Create tag
tags.update: Update tag
tags.delete: Delete tag
tags.delete.confirm.title: Delete tag
tags.delete.confirm.message: Are you sure you want to delete this tag? Deleting a tag will remove it from all documents.
tags.delete.confirm.confirm-button: Delete
tags.delete.confirm.cancel-button: Cancel
tags.delete.success: Tag deleted successfully
tags.create.success: Tag "{{ name }}" created successfully.
tags.update.success: Tag "{{ name }}" updated successfully.
tags.form.name.label: Name
tags.form.name.placeholder: Eg. Contracts
tags.form.name.required: Please enter a tag name
tags.form.name.max-length: Tag name must be less than 64 characters
tags.form.color.label: Color
tags.form.color.required: Please enter a color
tags.form.color.invalid: The hex color is badly formatted.
tags.form.description.label: Description
tags.form.description.optional: (optional)
tags.form.description.placeholder: Eg. All the contracts signed by the company
tags.form.description.max-length: Description must be less than 256 characters
tags.form.no-description: No description
tags.table.headers.tag: Tag
tags.table.headers.description: Description
tags.table.headers.documents: Documents
tags.table.headers.created: Created
tags.table.headers.actions: Actions
# Tagging rules
tagging-rules.field.name: document name
tagging-rules.field.content: document content
tagging-rules.operator.equals: equals
tagging-rules.operator.not-equals: not equals
tagging-rules.operator.contains: contains
tagging-rules.operator.not-contains: not contains
tagging-rules.operator.starts-with: starts with
tagging-rules.operator.ends-with: ends with
tagging-rules.list.title: Tagging rules
tagging-rules.list.description: Manage your organization's tagging rules, to automatically tag documents based on conditions you define.
tagging-rules.list.demo-warning: 'Note: As this is a demo environment (with no server), tagging rules will not be applied to newly added documents.'
tagging-rules.list.no-tagging-rules.title: No tagging rules
tagging-rules.list.no-tagging-rules.description: Create a tagging rule to automatically tag your added documents based on conditions you define.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Create tagging rule
tagging-rules.list.card.no-conditions: No conditions
tagging-rules.list.card.one-condition: 1 condition
tagging-rules.list.card.conditions: '{{ count }} conditions'
tagging-rules.list.card.delete: Delete rule
tagging-rules.list.card.edit: Edit rule
tagging-rules.create.title: Create tagging rule
tagging-rules.create.success: Tagging rule created successfully
tagging-rules.create.error: Failed to create tagging rule
tagging-rules.create.submit: Create rule
tagging-rules.form.name.label: Name
tagging-rules.form.name.placeholder: 'Example: Tag invoices'
tagging-rules.form.name.min-length: Please enter a name for the rule
tagging-rules.form.name.max-length: The name must be less than 64 characters
tagging-rules.form.description.label: Description
tagging-rules.form.description.placeholder: "Example: Tag documents with 'invoice' in the name"
tagging-rules.form.description.max-length: The description must be less than 256 characters
tagging-rules.form.conditions.label: Conditions
tagging-rules.form.conditions.description: Define the conditions that must be met for the rule to apply. All conditions must be met for the rule to apply.
tagging-rules.form.conditions.add-condition: Add condition
tagging-rules.form.conditions.no-conditions.title: No conditions
tagging-rules.form.conditions.no-conditions.description: You didn't add any conditions to this rule. This rule will apply its tags to all documents.
tagging-rules.form.conditions.no-conditions.confirm: Apply rule without conditions
tagging-rules.form.conditions.no-conditions.cancel: Cancel
tagging-rules.form.conditions.value.placeholder: 'Example: invoice'
tagging-rules.form.conditions.value.min-length: Please enter a value for the condition
tagging-rules.form.tags.label: Tags
tagging-rules.form.tags.description: Select the tags to apply to the added documents that match the conditions
tagging-rules.form.tags.min-length: At least one tag to apply is required
tagging-rules.form.tags.add-tag: Create tag
tagging-rules.form.submit: Create rule
tagging-rules.update.title: Update tagging rule
tagging-rules.update.error: Failed to update tagging rule
tagging-rules.update.submit: Update rule
tagging-rules.update.cancel: Cancel
# Intake emails
intake-emails.title: Intake Emails
intake-emails.description: Intake emails address are used to automatically ingest emails into Papra. Just forward emails to the intake email address and their attachments will be added to your organization's documents.
intake-emails.disabled.title: Intake Emails are disabled
intake-emails.disabled.description: Intake emails are disabled on this instance. Please contact your administrator to enable them. See the {{ documentation }} for more information.
intake-emails.disabled.documentation: documentation
intake-emails.info: Only enabled intake emails from allowed origins will be processed. You can enable or disable an intake email at any time.
intake-emails.empty.title: No intake emails
intake-emails.empty.description: Generate an intake address to easily ingest emails attachments.
intake-emails.empty.generate: Generate intake email
intake-emails.count: '{{ count }} intake email{{ plural }} for this organization'
intake-emails.new: New intake email
intake-emails.disabled-label: (Disabled)
intake-emails.no-origins: No allowed email origins
intake-emails.allowed-origins: Allowed from {{ count }} address{{ plural }}
intake-emails.actions.enable: Enable
intake-emails.actions.disable: Disable
intake-emails.actions.manage-origins: Manage origins addresses
intake-emails.actions.delete: Delete
intake-emails.delete.confirm.title: Delete intake email?
intake-emails.delete.confirm.message: Are you sure you want to delete this intake email? This action cannot be undone.
intake-emails.delete.confirm.confirm-button: Delete intake email
intake-emails.delete.confirm.cancel-button: Cancel
intake-emails.delete.success: Intake email deleted
intake-emails.create.success: Intake email created
intake-emails.update.success.enabled: Intake email enabled
intake-emails.update.success.disabled: Intake email disabled
intake-emails.allowed-origins.title: Allowed origins
intake-emails.allowed-origins.description: Only emails sent to {{ email }} from these origins will be processed. If no origins are specified, all emails will be discarded.
intake-emails.allowed-origins.add.label: Add allowed origin email
intake-emails.allowed-origins.add.placeholder: Eg. ada@papra.app
intake-emails.allowed-origins.add.button: Add
intake-emails.allowed-origins.add.error.exists: This email is already in the allowed origins for this intake email
# API keys
api-keys.permissions.documents.title: Documents
api-keys.permissions.documents.documents:create: Create documents
api-keys.permissions.documents.documents:read: Read documents
api-keys.permissions.documents.documents:update: Update documents
api-keys.permissions.documents.documents:delete: Delete documents
api-keys.permissions.tags.title: Tags
api-keys.permissions.tags.tags:create: Create tags
api-keys.permissions.tags.tags:read: Read tags
api-keys.permissions.tags.tags:update: Update tags
api-keys.permissions.tags.tags:delete: Delete tags
api-keys.create.title: Create API key
api-keys.create.description: Create a new API key to access the Papra API.
api-keys.create.success: The API key has been created successfully.
api-keys.create.back: Back to API keys
api-keys.create.form.name.label: Name
api-keys.create.form.name.placeholder: 'Example: My API key'
api-keys.create.form.name.required: Please enter a name for the API key
api-keys.create.form.permissions.label: Permissions
api-keys.create.form.permissions.required: Please select at least one permission
api-keys.create.form.submit: Create API key
api-keys.create.created.title: API key created
api-keys.create.created.description: The API key has been created successfully. Save it in a secure location as it will not be displayed again.
api-keys.list.title: API keys
api-keys.list.description: Manage your API keys here.
api-keys.list.create: Create API key
api-keys.list.empty.title: No API keys
api-keys.list.empty.description: Create an API key to access the Papra API.
api-keys.list.card.last-used: Last used
api-keys.list.card.never: Never
api-keys.list.card.created: Created
api-keys.delete.success: The API key has been deleted successfully
api-keys.delete.confirm.title: Delete API key
api-keys.delete.confirm.message: Are you sure you want to delete this API key? This action cannot be undone.
api-keys.delete.confirm.confirm-button: Delete
api-keys.delete.confirm.cancel-button: Cancel
# Webhooks
webhooks.list.title: Webhooks
webhooks.list.description: Manage your organization webhooks
webhooks.list.empty.title: No webhooks
webhooks.list.empty.description: Create your first webhook to start receiving events
webhooks.list.create: Create webhook
webhooks.list.card.last-triggered: Last triggered
webhooks.list.card.never: Never
webhooks.list.card.created: Created
webhooks.create.title: Create webhook
webhooks.create.description: Create a new webhook to receive events
webhooks.create.success: Webhook created successfully
webhooks.create.back: Back
webhooks.create.form.submit: Create webhook
webhooks.create.form.name.label: Webhook name
webhooks.create.form.name.placeholder: Enter webhook name
webhooks.create.form.name.required: Name is required
webhooks.create.form.url.label: Webhook URL
webhooks.create.form.url.placeholder: Enter webhook URL
webhooks.create.form.url.required: URL is required
webhooks.create.form.url.invalid: URL is invalid
webhooks.create.form.secret.label: Secret
webhooks.create.form.secret.placeholder: Enter webhook secret
webhooks.create.form.events.label: Events
webhooks.create.form.events.required: At least one event is required
webhooks.update.title: Edit webhook
webhooks.update.description: Update your webhook details
webhooks.update.success: Webhook updated successfully
webhooks.update.submit: Update webhook
webhooks.update.cancel: Cancel
webhooks.update.form.secret.placeholder: Enter new secret
webhooks.update.form.secret.placeholder-redacted: '[Redacted secret]'
webhooks.update.form.rotate-secret.button: Rotate secret
webhooks.delete.success: Webhook deleted successfully
webhooks.delete.confirm.title: Delete webhook
webhooks.delete.confirm.message: Are you sure you want to delete this webhook?
webhooks.delete.confirm.confirm-button: Delete
webhooks.delete.confirm.cancel-button: Cancel
webhooks.events.documents.title: Documents events
webhooks.events.documents.document:created.description: Document created
webhooks.events.documents.document:deleted.description: Document deleted
webhooks.events.documents.document:updated.description: Document updated
webhooks.events.documents.document:tag:added.description: A tag is added to a document
webhooks.events.documents.document:tag:removed.description: A tag is removed from a document
# Navigation
layout.menu.home: Home
layout.menu.documents: Documents
layout.menu.tags: Tags
layout.menu.tagging-rules: Tagging rules
layout.menu.deleted-documents: Deleted documents
layout.menu.organization-settings: Settings
layout.menu.api-keys: API keys
layout.menu.settings: Settings
layout.menu.account: Account
layout.menu.general-settings: General settings
layout.menu.intake-emails: Intake emails
layout.menu.webhooks: Webhooks
layout.menu.members: Members
layout.menu.invitations: Invitations
layout.theme.light: Light mode
layout.theme.dark: Dark mode
layout.theme.system: System mode
layout.search.placeholder: Search...
layout.menu.import-document: Import a document
user-menu.account-settings: Account settings
user-menu.api-keys: API keys
user-menu.invitations: Invitations
user-menu.language: Language
user-menu.logout: Logout
# Command palette
command-palette.search.placeholder: Search commands or documents
command-palette.no-results: No results found
command-palette.sections.documents: Documents
command-palette.sections.theme: Theme
# API errors
api-errors.document.already_exists: The document already exists
api-errors.document.file_too_big: The document file is too big
api-errors.intake_email.limit_reached: The maximum number of intake emails for this organization has been reached. Please upgrade your plan to create more intake emails.
api-errors.user.max_organization_count_reached: You have reached the maximum number of organizations you can create, if you need to create more, please contact support.
api-errors.default: An error occurred while processing your request.
api-errors.organization.invitation_already_exists: An invitation for this email already exists in this organization.
api-errors.user.already_in_organization: This user is already in this organization.
api-errors.user.organization_invitation_limit_reached: The maximum number of invitations has been reached for today. Please try again tomorrow.
api-errors.demo.not_available: This feature is not available in demo
api-errors.tags.already_exists: A tag with this name already exists for this organization
api-errors.internal.error: An error occurred while processing your request. Please try again later.
api-errors.auth.invalid_origin: Invalid application origin. If you are self-hosting Papra, ensure your APP_BASE_URL environment variable matches your current url. For more details see https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Not Found
not-found.description: Sorry, the page you are looking for does not seem to exist. Please check the URL and try again.
not-found.back-to-home: Go back to home
# Demo
demo.popup.description: This is a demo environment, all data is save to your browser local storage.
demo.popup.discord: Join the {{ discordLink }} to get support, propose features or just chat.
demo.popup.discord-link-label: Discord server
demo.popup.reset: Reset demo data
demo.popup.hide: Hide
# Color picker
color-picker.hue: Hue
color-picker.saturation: Saturation
color-picker.lightness: Lightness
color-picker.select-color: Select color
color-picker.select-a-color: Select a color

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Restablece tu contraseña',
'auth.request-password-reset.description': 'Ingresa tu correo electrónico para restablecer tu contraseña.',
'auth.request-password-reset.requested': 'Si existe una cuenta para este correo electrónico, te enviaremos un correo para restablecer tu contraseña.',
'auth.request-password-reset.back-to-login': 'Volver al inicio de sesión',
'auth.request-password-reset.form.email.label': 'Correo electrónico',
'auth.request-password-reset.form.email.placeholder': 'Ejemplo: ada@papra.app',
'auth.request-password-reset.form.email.required': 'Por favor, ingresa tu correo electrónico',
'auth.request-password-reset.form.email.invalid': 'Esta dirección de correo electrónico no es válida',
'auth.request-password-reset.form.submit': 'Solicitar restablecimiento de contraseña',
'auth.reset-password.title': 'Restablece tu contraseña',
'auth.reset-password.description': 'Ingresa tu nueva contraseña para restablecerla.',
'auth.reset-password.reset': 'Tu contraseña ha sido restablecida.',
'auth.reset-password.back-to-login': 'Volver al inicio de sesión',
'auth.reset-password.form.new-password.label': 'Nueva contraseña',
'auth.reset-password.form.new-password.placeholder': 'Ejemplo: **********',
'auth.reset-password.form.new-password.required': 'Por favor, ingresa tu nueva contraseña',
'auth.reset-password.form.new-password.min-length': 'La contraseña debe tener al menos {{ minLength }} caracteres',
'auth.reset-password.form.new-password.max-length': 'La contraseña debe tener menos de {{ maxLength }} caracteres',
'auth.reset-password.form.submit': 'Restablecer contraseña',
'auth.email-provider.open': 'Abrir {{ provider }}',
'auth.login.title': 'Inicia sesión en Papra',
'auth.login.description': 'Ingresa tu correo electrónico o usa un inicio de sesión social para acceder a tu cuenta de Papra.',
'auth.login.login-with-provider': 'Iniciar sesión con {{ provider }}',
'auth.login.no-account': '¿No tienes una cuenta?',
'auth.login.register': 'Registrarse',
'auth.login.form.email.label': 'Correo electrónico',
'auth.login.form.email.placeholder': 'Ejemplo: ada@papra.app',
'auth.login.form.email.required': 'Por favor, ingresa tu correo electrónico',
'auth.login.form.email.invalid': 'Esta dirección de correo electrónico no es válida',
'auth.login.form.password.label': 'Contraseña',
'auth.login.form.password.placeholder': 'Establece una contraseña',
'auth.login.form.password.required': 'Por favor, ingresa tu contraseña',
'auth.login.form.remember-me.label': 'Recordarme',
'auth.login.form.forgot-password.label': '¿Olvidaste tu contraseña?',
'auth.login.form.submit': 'Iniciar sesión',
'auth.register.title': 'Regístrate en Papra',
'auth.register.description': 'Crea una cuenta para comenzar a usar Papra.',
'auth.register.register-with-email': 'Registrarse con correo electrónico',
'auth.register.register-with-provider': 'Registrarse con {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': '¿Ya tienes una cuenta?',
'auth.register.login': 'Iniciar sesión',
'auth.register.registration-disabled.title': 'El registro está deshabilitado',
'auth.register.registration-disabled.description': 'La creación de nuevas cuentas está deshabilitada actualmente en esta instancia de Papra. Solo los usuarios con cuentas existentes pueden iniciar sesión. Si crees que esto es un error, contacta al administrador de esta instancia.',
'auth.register.form.email.label': 'Correo electrónico',
'auth.register.form.email.placeholder': 'Ejemplo: ada@papra.app',
'auth.register.form.email.required': 'Por favor, ingresa tu correo electrónico',
'auth.register.form.email.invalid': 'Esta dirección de correo electrónico no es válida',
'auth.register.form.password.label': 'Contraseña',
'auth.register.form.password.placeholder': 'Establece una contraseña',
'auth.register.form.password.required': 'Por favor, ingresa tu contraseña',
'auth.register.form.password.min-length': 'La contraseña debe tener al menos {{ minLength }} caracteres',
'auth.register.form.password.max-length': 'La contraseña debe tener menos de {{ maxLength }} caracteres',
'auth.register.form.name.label': 'Nombre',
'auth.register.form.name.placeholder': 'Ejemplo: Ada Lovelace',
'auth.register.form.name.required': 'Por favor, ingresa tu nombre',
'auth.register.form.name.max-length': 'El nombre debe tener menos de {{ maxLength }} caracteres',
'auth.register.form.submit': 'Registrarse',
'auth.email-validation-required.title': 'Verifica tu correo electrónico',
'auth.email-validation-required.description': 'Se ha enviado un correo de verificación a tu dirección de correo electrónico. Por favor, verifica tu correo haciendo clic en el enlace del correo.',
'auth.email-verification.success.title': 'Correo verificado',
'auth.email-verification.success.description': 'Tu correo ha sido verificado exitosamente. Ahora puedes iniciar sesión en tu cuenta.',
'auth.email-verification.success.login': 'Ir a iniciar sesión',
'auth.email-verification.error.title': 'Verificación fallida',
'auth.email-verification.error.description': 'El enlace de verificación es inválido o ha expirado. Por favor, solicita un nuevo correo de verificación iniciando sesión.',
'auth.email-verification.error.back': 'Volver a iniciar sesión',
'auth.legal-links.description': 'Al continuar, reconoces que entiendes y aceptas los {{ terms }} y la {{ privacy }}.',
'auth.legal-links.terms': 'Términos de servicio',
'auth.legal-links.privacy': 'Política de privacidad',
'auth.no-auth-provider.title': 'No hay proveedor de autenticación',
'auth.no-auth-provider.description': 'No hay proveedores de autenticación habilitados en esta instancia de Papra. Por favor, contacta al administrador de esta instancia para habilitarlos.',
// User settings
'user.settings.title': 'Configuración de usuario',
'user.settings.description': 'Administra aquí la configuración de tu cuenta.',
'user.settings.email.title': 'Dirección de correo electrónico',
'user.settings.email.description': 'Tu dirección de correo electrónico no puede ser cambiada.',
'user.settings.email.label': 'Correo electrónico',
'user.settings.name.title': 'Nombre completo',
'user.settings.name.description': 'Tu nombre completo se muestra a otros miembros de la organización.',
'user.settings.name.label': 'Nombre completo',
'user.settings.name.placeholder': 'Ej. John Doe',
'user.settings.name.update': 'Actualizar nombre',
'user.settings.name.updated': 'Tu nombre completo ha sido actualizado',
'user.settings.logout.title': 'Cerrar sesión',
'user.settings.logout.description': 'Cierra la sesión de tu cuenta. Puedes iniciar sesión nuevamente más tarde.',
'user.settings.logout.button': 'Cerrar sesión',
// Organizations
'organizations.list.title': 'Tus organizaciones',
'organizations.list.description': 'Las organizaciones son una manera de agrupar tus documentos y gestionar el acceso a ellos. Puedes crear varias organizaciones e invitar a tus compañeros para colaborar.',
'organizations.list.create-new': 'Crear nueva organización',
'organizations.list.back': 'Volver a organizaciones',
'organizations.list.deleted.title': 'Organizaciones eliminadas',
'organizations.list.deleted.description': 'Las organizaciones eliminadas se conservan durante {{ days }} días antes de ser eliminadas permanentemente. Puedes restaurarlas durante este período.',
'organizations.list.deleted.empty': 'No hay organizaciones eliminadas',
'organizations.list.deleted.empty-description': 'Cuando elimines una organización, aparecerá aquí durante {{ days }} días antes de ser eliminada permanentemente.',
'organizations.list.deleted.restore': 'Restaurar',
'organizations.list.deleted.restore-success': 'Organización restaurada exitosamente',
'organizations.list.deleted.restore-confirm.title': 'Restaurar organización',
'organizations.list.deleted.restore-confirm.message': '¿Estás seguro de que quieres restaurar esta organización? Se moverá de vuelta a tu lista de organizaciones activas.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Restaurar organización',
'organizations.list.deleted.deleted-at': 'Eliminada el {{ date }}',
'organizations.list.deleted.purge-at': 'Se eliminará permanentemente el {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} día, {daysUntilPurge} días }} restante{{ daysUntilPurge, >1:s}})',
'organizations.details.no-documents.title': 'Sin documentos',
'organizations.details.no-documents.description': 'Aún no hay documentos en esta organización. Comienza subiendo algunos documentos.',
'organizations.details.upload-documents': 'Subir documentos',
'organizations.details.documents-count': 'documentos en total',
'organizations.details.total-size': 'tamaño total',
'organizations.details.latest-documents': 'Últimos documentos importados',
'organizations.create.title': 'Crear una nueva organización',
'organizations.create.description': 'Tus documentos se agruparán por organización. Puedes crear varias organizaciones para separar tus documentos, por ejemplo, para documentos personales y de trabajo.',
'organizations.create.back': 'Volver',
'organizations.create.error.max-count-reached': 'Has alcanzado el número máximo de organizaciones que puedes crear, si necesitas crear más, contacta al soporte.',
'organizations.create.form.name.label': 'Nombre de la organización',
'organizations.create.form.name.placeholder': 'Ej. Acme Inc.',
'organizations.create.form.name.required': 'Por favor, ingresa un nombre para la organización',
'organizations.create.form.submit': 'Crear organización',
'organizations.create.success': 'Organización creada exitosamente',
'organizations.create-first.title': 'Crea tu organización',
'organizations.create-first.description': 'Tus documentos se agruparán por organización. Puedes crear varias organizaciones para separar tus documentos, por ejemplo, para documentos personales y de trabajo.',
'organizations.create-first.default-name': 'Mi organización',
'organizations.create-first.user-name': 'Organización de {{ name }}',
'organization.settings.title': 'Configuración de la organización',
'organization.settings.page.title': 'Configuración de la organización',
'organization.settings.page.description': 'Administra la configuración de tu organización aquí.',
'organization.settings.name.title': 'Nombre de la organización',
'organization.settings.name.update': 'Actualizar nombre',
'organization.settings.name.placeholder': 'Ej. Acme Inc.',
'organization.settings.name.updated': 'Nombre de la organización actualizado',
'organization.settings.subscription.title': 'Suscripción',
'organization.settings.subscription.description': 'Administra tu facturación, facturas y métodos de pago.',
'organization.settings.subscription.manage': 'Gestionar suscripción',
'organization.settings.subscription.error': 'Error al obtener la URL del portal del cliente',
'organization.settings.delete.title': 'Eliminar organización',
'organization.settings.delete.description': 'Eliminar esta organización eliminará permanentemente todos los datos asociados a ella.',
'organization.settings.delete.confirm.title': 'Eliminar organización',
'organization.settings.delete.confirm.message': '¿Estás seguro de que deseas eliminar esta organización? La organización se marcará para eliminación y se eliminará permanentemente después de {{ days }} días. Durante este período, puedes restaurarla desde tu lista de organizaciones. Todos los documentos y datos se eliminarán permanentemente después de este plazo.',
'organization.settings.delete.confirm.confirm-button': 'Eliminar organización',
'organization.settings.delete.confirm.cancel-button': 'Cancelar',
'organization.settings.delete.success': 'Organización eliminada',
'organization.settings.delete.only-owner': 'Solo el propietario de la organización puede eliminar esta organización.',
'organization.settings.delete.has-active-subscription': 'No se puede eliminar la organización con una suscripción activa, por favor cancela tu suscripción arriba primero.',
'organization.usage.page.title': 'Uso',
'organization.usage.page.description': 'Ver el uso y los límites actuales de su organización.',
'organization.usage.storage.title': 'Almacenamiento de documentos',
'organization.usage.storage.description': 'Almacenamiento total usado por sus documentos',
'organization.usage.intake-emails.title': 'Correos de ingesta',
'organization.usage.intake-emails.description': 'Número de direcciones de correo de ingesta',
'organization.usage.members.title': 'Miembros',
'organization.usage.members.description': 'Número de miembros en la organización',
'organization.usage.unlimited': 'Ilimitado',
'organizations.members.title': 'Miembros',
'organizations.members.description': 'Administra los miembros de tu organización',
'organizations.members.invite-member': 'Invitar miembro',
'organizations.members.invite-member-disabled-tooltip': 'Solo los administradores o propietarios pueden invitar miembros a la organización',
'organizations.members.remove-from-organization': 'Eliminar de la organización',
'organizations.members.role': 'Rol',
'organizations.members.roles.owner': 'Propietario',
'organizations.members.roles.admin': 'Administrador',
'organizations.members.roles.member': 'Miembro',
'organizations.members.delete.confirm.title': 'Eliminar miembro',
'organizations.members.delete.confirm.message': '¿Estás seguro de que deseas eliminar a este miembro de la organización?',
'organizations.members.delete.confirm.confirm-button': 'Eliminar',
'organizations.members.delete.confirm.cancel-button': 'Cancelar',
'organizations.members.delete.success': 'Miembro eliminado de la organización',
'organizations.members.update-role.success': 'Rol del miembro actualizado',
'organizations.members.table.headers.name': 'Nombre',
'organizations.members.table.headers.email': 'Correo electrónico',
'organizations.members.table.headers.role': 'Rol',
'organizations.members.table.headers.created': 'Creado',
'organizations.members.table.headers.actions': 'Acciones',
'organizations.invite-member.title': 'Invitar miembro',
'organizations.invite-member.description': 'Invita a un miembro a tu organización',
'organizations.invite-member.form.email.label': 'Correo electrónico',
'organizations.invite-member.form.email.placeholder': 'Ejemplo: ada@papra.app',
'organizations.invite-member.form.email.required': 'Por favor, ingresa un correo electrónico válido',
'organizations.invite-member.form.role.label': 'Rol',
'organizations.invite-member.form.submit': 'Invitar a la organización',
'organizations.invite-member.success.message': 'Miembro invitado',
'organizations.invite-member.success.description': 'El correo ha sido invitado a la organización.',
'organizations.invite-member.error.message': 'Error al invitar al miembro',
'organizations.invitations.title': 'Invitaciones',
'organizations.invitations.description': 'Administra las invitaciones de tu organización',
'organizations.invitations.list.cta': 'Invitar miembro',
'organizations.invitations.list.empty.title': 'No hay invitaciones pendientes',
'organizations.invitations.list.empty.description': 'Aún no te han invitado a ninguna organización.',
'organizations.invitations.status.pending': 'Pendiente',
'organizations.invitations.status.accepted': 'Aceptada',
'organizations.invitations.status.rejected': 'Rechazada',
'organizations.invitations.status.expired': 'Expirada',
'organizations.invitations.status.cancelled': 'Cancelada',
'organizations.invitations.resend': 'Reenviar invitación',
'organizations.invitations.cancel.title': 'Cancelar invitación',
'organizations.invitations.cancel.description': '¿Estás seguro de que deseas cancelar esta invitación?',
'organizations.invitations.cancel.confirm': 'Cancelar invitación',
'organizations.invitations.cancel.cancel': 'Cancelar',
'organizations.invitations.resend.title': 'Reenviar invitación',
'organizations.invitations.resend.description': '¿Estás seguro de que deseas reenviar esta invitación? Esto enviará un nuevo correo al destinatario.',
'organizations.invitations.resend.confirm': 'Reenviar invitación',
'organizations.invitations.resend.cancel': 'Cancelar',
'invitations.list.title': 'Invitaciones',
'invitations.list.description': 'Administra las invitaciones de tu organización',
'invitations.list.empty.title': 'No hay invitaciones pendientes',
'invitations.list.empty.description': 'Aún no te han invitado a ninguna organización.',
'invitations.list.headers.organization': 'Organización',
'invitations.list.headers.status': 'Estado',
'invitations.list.headers.created': 'Creado',
'invitations.list.headers.actions': 'Acciones',
'invitations.list.actions.accept': 'Aceptar',
'invitations.list.actions.reject': 'Rechazar',
'invitations.list.actions.accept.success.message': 'Invitación aceptada',
'invitations.list.actions.accept.success.description': 'La invitación ha sido aceptada.',
'invitations.list.actions.reject.success.message': 'Invitación rechazada',
'invitations.list.actions.reject.success.description': 'La invitación ha sido rechazada.',
// Documents
'documents.list.title': 'Documentos',
'documents.list.no-documents.title': 'Sin documentos',
'documents.list.no-documents.description': 'Aún no hay documentos en esta organización. Comienza subiendo algunos documentos.',
'documents.list.no-results': 'No se encontraron documentos',
'documents.tabs.info': 'Información',
'documents.tabs.content': 'Contenido',
'documents.tabs.activity': 'Actividad',
'documents.deleted.message': 'Este documento ha sido eliminado y será borrado permanentemente en {{ days }} días.',
'documents.actions.download': 'Descargar',
'documents.actions.open-in-new-tab': 'Abrir en una nueva pestaña',
'documents.actions.restore': 'Restaurar',
'documents.actions.delete': 'Eliminar',
'documents.actions.edit': 'Editar',
'documents.actions.cancel': 'Cancelar',
'documents.actions.save': 'Guardar',
'documents.actions.saving': 'Guardando...',
'documents.content.alert': 'El contenido del documento se extrae automáticamente al subirlo. Solo se utiliza para búsqueda e indexación.',
'documents.content.empty-placeholder': 'Este documento no tiene contenido extraído, puedes introducirlo manualmente aquí.',
'documents.info.id': 'ID',
'documents.info.name': 'Nombre',
'documents.info.type': 'Tipo',
'documents.info.size': 'Tamaño',
'documents.info.created-at': 'Creado el',
'documents.info.updated-at': 'Actualizado el',
'documents.info.never': 'Nunca',
'documents.rename.title': 'Renombrar documento',
'documents.rename.form.name.label': 'Nombre',
'documents.rename.form.name.placeholder': 'Ejemplo: Factura 2024',
'documents.rename.form.name.required': 'Por favor, ingresa un nombre para el documento',
'documents.rename.form.name.max-length': 'El nombre debe tener menos de 255 caracteres',
'documents.rename.form.submit': 'Renombrar documento',
'documents.rename.success': 'Documento renombrado exitosamente',
'documents.rename.cancel': 'Cancelar',
'import-documents.title.error': '{{ count }} documentos fallidos',
'import-documents.title.success': '{{ count }} documentos importados',
'import-documents.title.pending': '{{ count }} / {{ total }} documentos importados',
'import-documents.title.none': 'Importar documentos',
'import-documents.no-import-in-progress': 'No hay importación de documentos en curso',
'documents.deleted.title': 'Documentos eliminados',
'documents.deleted.empty.title': 'No hay documentos eliminados',
'documents.deleted.empty.description': 'No tienes documentos eliminados. Los documentos eliminados se moverán a la papelera durante {{ days }} días.',
'documents.deleted.retention-notice': 'Todos los documentos eliminados se almacenan en la papelera durante {{ days }} días. Pasado este tiempo, los documentos serán eliminados permanentemente y no podrás restaurarlos.',
'documents.deleted.deleted-at': 'Eliminado',
'documents.deleted.restoring': 'Restaurando...',
'documents.deleted.deleting': 'Eliminando...',
'documents.preview.unknown-file-type': 'No hay vista previa disponible para este tipo de archivo',
'documents.preview.binary-file': 'Este parece ser un archivo binario y no puede mostrarse como texto',
'trash.delete-all.button': 'Eliminar todo',
'trash.delete-all.confirm.title': '¿Eliminar permanentemente todos los documentos?',
'trash.delete-all.confirm.description': '¿Estás seguro de que deseas eliminar permanentemente todos los documentos de la papelera? Esta acción no se puede deshacer.',
'trash.delete-all.confirm.label': 'Eliminar',
'trash.delete-all.confirm.cancel': 'Cancelar',
'trash.delete.button': 'Eliminar',
'trash.delete.confirm.title': '¿Eliminar permanentemente el documento?',
'trash.delete.confirm.description': '¿Estás seguro de que deseas eliminar permanentemente este documento de la papelera? Esta acción no se puede deshacer.',
'trash.delete.confirm.label': 'Eliminar',
'trash.delete.confirm.cancel': 'Cancelar',
'trash.deleted.success.title': 'Documento eliminado',
'trash.deleted.success.description': 'El documento ha sido eliminado permanentemente.',
'activity.document.created': 'El documento ha sido creado',
'activity.document.updated.single': 'El campo {{ field }} ha sido actualizado',
'activity.document.updated.multiple': 'Los campos {{ fields }} han sido actualizados',
'activity.document.updated': 'El documento ha sido actualizado',
'activity.document.deleted': 'El documento ha sido eliminado',
'activity.document.restored': 'El documento ha sido restaurado',
'activity.document.tagged': 'La etiqueta {{ tag }} ha sido añadida',
'activity.document.untagged': 'La etiqueta {{ tag }} ha sido eliminada',
'activity.document.user.name': 'por {{ name }}',
'activity.load-more': 'Cargar más',
'activity.no-more-activities': 'No hay más actividades para este documento',
// Tags
'tags.no-tags.title': 'Aún no hay etiquetas',
'tags.no-tags.description': 'Esta organización no tiene etiquetas aún. Las etiquetas se utilizan para categorizar documentos. Puedes añadir etiquetas a tus documentos para que sean más fáciles de encontrar y organizar.',
'tags.no-tags.create-tag': 'Crear etiqueta',
'tags.title': 'Etiquetas de documentos',
'tags.description': 'Las etiquetas se utilizan para categorizar documentos. Puedes añadir etiquetas a tus documentos para que sean más fáciles de encontrar y organizar.',
'tags.create': 'Crear etiqueta',
'tags.update': 'Actualizar etiqueta',
'tags.delete': 'Eliminar etiqueta',
'tags.delete.confirm.title': 'Eliminar etiqueta',
'tags.delete.confirm.message': '¿Estás seguro de que deseas eliminar esta etiqueta? Eliminar una etiqueta la quitará de todos los documentos.',
'tags.delete.confirm.confirm-button': 'Eliminar',
'tags.delete.confirm.cancel-button': 'Cancelar',
'tags.delete.success': 'Etiqueta eliminada exitosamente',
'tags.create.success': 'Etiqueta "{{ name }}" creada exitosamente.',
'tags.update.success': 'Etiqueta "{{ name }}" actualizada exitosamente.',
'tags.form.name.label': 'Nombre',
'tags.form.name.placeholder': 'Ej. Contratos',
'tags.form.name.required': 'Por favor, ingresa un nombre para la etiqueta',
'tags.form.name.max-length': 'El nombre de la etiqueta debe tener menos de 64 caracteres',
'tags.form.color.label': 'Color',
'tags.form.color.required': 'Por favor, ingresa un color',
'tags.form.color.invalid': 'El color hexadecimal tiene un formato incorrecto.',
'tags.form.description.label': 'Descripción',
'tags.form.description.optional': '(opcional)',
'tags.form.description.placeholder': 'Ej. Todos los contratos firmados por la empresa',
'tags.form.description.max-length': 'La descripción debe tener menos de 256 caracteres',
'tags.form.no-description': 'Sin descripción',
'tags.table.headers.tag': 'Etiqueta',
'tags.table.headers.description': 'Descripción',
'tags.table.headers.documents': 'Documentos',
'tags.table.headers.created': 'Creado',
'tags.table.headers.actions': 'Acciones',
// Tagging rules
'tagging-rules.field.name': 'el nombre del documento',
'tagging-rules.field.content': 'el contenido del documento',
'tagging-rules.operator.equals': 'es igual a',
'tagging-rules.operator.not-equals': 'no es igual a',
'tagging-rules.operator.contains': 'contiene',
'tagging-rules.operator.not-contains': 'no contiene',
'tagging-rules.operator.starts-with': 'comienza con',
'tagging-rules.operator.ends-with': 'termina con',
'tagging-rules.list.title': 'Reglas de etiquetado',
'tagging-rules.list.description': 'Administra las reglas de etiquetado de tu organización, para etiquetar documentos automáticamente según las condiciones que definas.',
'tagging-rules.list.demo-warning': 'Nota: Como este es un entorno de demostración (sin servidor), las reglas de etiquetado no se aplicarán a los nuevos documentos añadidos.',
'tagging-rules.list.no-tagging-rules.title': 'No hay reglas de etiquetado',
'tagging-rules.list.no-tagging-rules.description': 'Crea una regla de etiquetado para etiquetar automáticamente tus documentos añadidos según las condiciones que definas.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Crear regla de etiquetado',
'tagging-rules.list.card.no-conditions': 'Sin condiciones',
'tagging-rules.list.card.one-condition': '1 condición',
'tagging-rules.list.card.conditions': '{{ count }} condiciones',
'tagging-rules.list.card.delete': 'Eliminar regla',
'tagging-rules.list.card.edit': 'Editar regla',
'tagging-rules.create.title': 'Crear regla de etiquetado',
'tagging-rules.create.success': 'Regla de etiquetado creada exitosamente',
'tagging-rules.create.error': 'Error al crear la regla de etiquetado',
'tagging-rules.create.submit': 'Crear regla',
'tagging-rules.form.name.label': 'Nombre',
'tagging-rules.form.name.placeholder': 'Ejemplo: Etiquetar facturas',
'tagging-rules.form.name.min-length': 'Por favor, ingresa un nombre para la regla',
'tagging-rules.form.name.max-length': 'El nombre debe tener menos de 64 caracteres',
'tagging-rules.form.description.label': 'Descripción',
'tagging-rules.form.description.placeholder': 'Ejemplo: Etiquetar documentos con \'factura\' en el nombre',
'tagging-rules.form.description.max-length': 'La descripción debe tener menos de 256 caracteres',
'tagging-rules.form.conditions.label': 'Condiciones',
'tagging-rules.form.conditions.description': 'Define las condiciones que deben cumplirse para que la regla se aplique. Sin condiciones significa que la regla se aplicará a todos los documentos',
'tagging-rules.form.conditions.add-condition': 'Añadir condición',
'tagging-rules.form.conditions.connector.when': 'Cuando',
'tagging-rules.form.conditions.connector.and': 'y que',
'tagging-rules.form.conditions.connector.or': 'o que',
'tagging-rules.condition-match-mode.all': 'Todas las condiciones deben coincidir',
'tagging-rules.condition-match-mode.any': 'Cualquier condición debe coincidir',
'tagging-rules.form.conditions.no-conditions.title': 'Sin condiciones',
'tagging-rules.form.conditions.no-conditions.description': 'No añadiste ninguna condición a esta regla. Esta regla aplicará sus etiquetas a todos los documentos.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Aplicar regla sin condiciones',
'tagging-rules.form.conditions.no-conditions.cancel': 'Cancelar',
'tagging-rules.form.conditions.value.placeholder': 'Ejemplo: factura',
'tagging-rules.form.conditions.value.min-length': 'Por favor, ingresa un valor para la condición',
'tagging-rules.form.tags.label': 'Etiquetas',
'tagging-rules.form.tags.description': 'Selecciona las etiquetas a aplicar a los documentos añadidos que cumplan las condiciones',
'tagging-rules.form.tags.min-length': 'Se requiere al menos una etiqueta para aplicar',
'tagging-rules.form.tags.add-tag': 'Crear etiqueta',
'tagging-rules.form.submit': 'Crear regla',
'tagging-rules.update.title': 'Actualizar regla de etiquetado',
'tagging-rules.update.error': 'Error al actualizar la regla de etiquetado',
'tagging-rules.update.submit': 'Actualizar regla',
'tagging-rules.update.cancel': 'Cancelar',
'tagging-rules.apply.button': 'Aplicar a documentos existentes',
'tagging-rules.apply.confirm.title': '¿Aplicar regla a documentos existentes?',
'tagging-rules.apply.confirm.description': 'Esto verificará todos los documentos existentes en tu organización y aplicará etiquetas donde las condiciones coincidan. El procesamiento se realizará en segundo plano.',
'tagging-rules.apply.confirm.button': 'Aplicar regla',
'tagging-rules.apply.success': 'Aplicación de regla iniciada en segundo plano',
'tagging-rules.apply.error': 'Error al iniciar la aplicación de la regla',
'tagging-rules.apply.processing': 'Iniciando...',
// Intake emails
'intake-emails.title': 'Correos de ingreso',
'intake-emails.description': 'Las direcciones de correo de ingreso se usan para ingresar automáticamente correos en Papra. Solo reenvía correos a la dirección de ingreso y sus archivos adjuntos se agregarán a los documentos de tu organización.',
'intake-emails.disabled.title': 'Correos de ingreso deshabilitados',
'intake-emails.disabled.description': 'Los correos de ingreso están deshabilitados en esta instancia. Contacta a tu administrador para habilitarlos. Consulta la {{ documentation }} para más información.',
'intake-emails.disabled.documentation': 'documentación',
'intake-emails.info': 'Solo los correos de ingreso habilitados desde orígenes permitidos serán procesados. Puedes habilitar o deshabilitar un correo de ingreso en cualquier momento.',
'intake-emails.empty.title': 'Sin correos de ingreso',
'intake-emails.empty.description': 'Genera una dirección de ingreso para añadir fácilmente archivos adjuntos de correos.',
'intake-emails.empty.generate': 'Generar correo de ingreso',
'intake-emails.count': '{{ count }} correo{{ plural }} de ingreso para esta organización',
'intake-emails.new': 'Nuevo correo de ingreso',
'intake-emails.disabled-label': '(Deshabilitado)',
'intake-emails.no-origins': 'Sin orígenes de correo permitidos',
'intake-emails.allowed-origins': 'Permitido desde {{ count }} dirección{{ plural }}',
'intake-emails.actions.enable': 'Habilitar',
'intake-emails.actions.disable': 'Deshabilitar',
'intake-emails.actions.manage-origins': 'Gestionar direcciones de origen',
'intake-emails.actions.delete': 'Eliminar',
'intake-emails.delete.confirm.title': '¿Eliminar correo de ingreso?',
'intake-emails.delete.confirm.message': '¿Estás seguro de que deseas eliminar este correo de ingreso? Esta acción no se puede deshacer.',
'intake-emails.delete.confirm.confirm-button': 'Eliminar correo de ingreso',
'intake-emails.delete.confirm.cancel-button': 'Cancelar',
'intake-emails.delete.success': 'Correo de ingreso eliminado',
'intake-emails.create.success': 'Correo de ingreso creado',
'intake-emails.update.success.enabled': 'Correo de ingreso habilitado',
'intake-emails.update.success.disabled': 'Correo de ingreso deshabilitado',
'intake-emails.allowed-origins.title': 'Orígenes permitidos',
'intake-emails.allowed-origins.description': 'Solo los correos enviados a {{ email }} desde estos orígenes serán procesados. Si no se especifican orígenes, todos los correos serán descartados.',
'intake-emails.allowed-origins.add.label': 'Añadir dirección de correo permitida',
'intake-emails.allowed-origins.add.placeholder': 'Ej. ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Añadir',
'intake-emails.allowed-origins.add.error.exists': 'Este correo ya está en los orígenes permitidos para este correo de ingreso',
// API keys
'api-keys.permissions.select-all': 'Seleccionar todo',
'api-keys.permissions.deselect-all': 'Deseleccionar todo',
'api-keys.permissions.organizations.title': 'Organizaciones',
'api-keys.permissions.organizations.organizations:create': 'Crear organizaciones',
'api-keys.permissions.organizations.organizations:read': 'Leer organizaciones',
'api-keys.permissions.organizations.organizations:update': 'Actualizar organizaciones',
'api-keys.permissions.organizations.organizations:delete': 'Eliminar organizaciones',
'api-keys.permissions.documents.title': 'Documentos',
'api-keys.permissions.documents.documents:create': 'Crear documentos',
'api-keys.permissions.documents.documents:read': 'Leer documentos',
'api-keys.permissions.documents.documents:update': 'Actualizar documentos',
'api-keys.permissions.documents.documents:delete': 'Eliminar documentos',
'api-keys.permissions.tags.title': 'Etiquetas',
'api-keys.permissions.tags.tags:create': 'Crear etiquetas',
'api-keys.permissions.tags.tags:read': 'Leer etiquetas',
'api-keys.permissions.tags.tags:update': 'Actualizar etiquetas',
'api-keys.permissions.tags.tags:delete': 'Eliminar etiquetas',
'api-keys.create.title': 'Crear clave API',
'api-keys.create.description': 'Crea una nueva clave API para acceder a la API de Papra.',
'api-keys.create.success': 'La clave API ha sido creada exitosamente.',
'api-keys.create.back': 'Volver a claves API',
'api-keys.create.form.name.label': 'Nombre',
'api-keys.create.form.name.placeholder': 'Ejemplo: Mi clave API',
'api-keys.create.form.name.required': 'Por favor, ingresa un nombre para la clave API',
'api-keys.create.form.permissions.label': 'Permisos',
'api-keys.create.form.permissions.required': 'Por favor, selecciona al menos un permiso',
'api-keys.create.form.submit': 'Crear clave API',
'api-keys.create.created.title': 'Clave API creada',
'api-keys.create.created.description': 'La clave API ha sido creada exitosamente. Guárdala en un lugar seguro ya que no se mostrará nuevamente.',
'api-keys.list.title': 'Claves API',
'api-keys.list.description': 'Administra tus claves API aquí.',
'api-keys.list.create': 'Crear clave API',
'api-keys.list.empty.title': 'Sin claves API',
'api-keys.list.empty.description': 'Crea una clave API para acceder a la API de Papra.',
'api-keys.list.card.last-used': 'Último uso',
'api-keys.list.card.never': 'Nunca',
'api-keys.list.card.created': 'Creado',
'api-keys.delete.success': 'La clave API ha sido eliminada exitosamente',
'api-keys.delete.confirm.title': 'Eliminar clave API',
'api-keys.delete.confirm.message': '¿Estás seguro de que deseas eliminar esta clave API? Esta acción no se puede deshacer.',
'api-keys.delete.confirm.confirm-button': 'Eliminar',
'api-keys.delete.confirm.cancel-button': 'Cancelar',
// Webhooks
'webhooks.list.title': 'Webhooks',
'webhooks.list.description': 'Administra los webhooks de tu organización',
'webhooks.list.empty.title': 'Sin webhooks',
'webhooks.list.empty.description': 'Crea tu primer webhook para empezar a recibir eventos',
'webhooks.list.create': 'Crear webhook',
'webhooks.list.card.last-triggered': 'Última activación',
'webhooks.list.card.never': 'Nunca',
'webhooks.list.card.created': 'Creado',
'webhooks.create.title': 'Crear webhook',
'webhooks.create.description': 'Crea un nuevo webhook para recibir eventos',
'webhooks.create.success': 'Webhook creado exitosamente',
'webhooks.create.back': 'Volver',
'webhooks.create.form.submit': 'Crear webhook',
'webhooks.create.form.name.label': 'Nombre del webhook',
'webhooks.create.form.name.placeholder': 'Ingresa el nombre del webhook',
'webhooks.create.form.name.required': 'El nombre es obligatorio',
'webhooks.create.form.url.label': 'URL del webhook',
'webhooks.create.form.url.placeholder': 'Ingresa la URL del webhook',
'webhooks.create.form.url.required': 'La URL es obligatoria',
'webhooks.create.form.url.invalid': 'La URL no es válida',
'webhooks.create.form.secret.label': 'Secreto',
'webhooks.create.form.secret.placeholder': 'Ingresa el secreto del webhook',
'webhooks.create.form.events.label': 'Eventos',
'webhooks.create.form.events.required': 'Se requiere al menos un evento',
'webhooks.update.title': 'Editar webhook',
'webhooks.update.description': 'Actualiza los detalles de tu webhook',
'webhooks.update.success': 'Webhook actualizado exitosamente',
'webhooks.update.submit': 'Actualizar webhook',
'webhooks.update.cancel': 'Cancelar',
'webhooks.update.form.secret.placeholder': 'Ingresa un nuevo secreto',
'webhooks.update.form.secret.placeholder-redacted': '[Secreto oculto]',
'webhooks.update.form.rotate-secret.button': 'Rotar secreto',
'webhooks.delete.success': 'Webhook eliminado exitosamente',
'webhooks.delete.confirm.title': 'Eliminar webhook',
'webhooks.delete.confirm.message': '¿Estás seguro de que deseas eliminar este webhook?',
'webhooks.delete.confirm.confirm-button': 'Eliminar',
'webhooks.delete.confirm.cancel-button': 'Cancelar',
'webhooks.events.documents.title': 'Eventos de documentos',
'webhooks.events.documents.document:created.description': 'Documento creado',
'webhooks.events.documents.document:deleted.description': 'Documento eliminado',
'webhooks.events.documents.document:updated.description': 'Documento actualizado',
'webhooks.events.documents.document:tag:added.description': 'Una etiqueta se ha añadido a un documento',
'webhooks.events.documents.document:tag:removed.description': 'Una etiqueta se ha eliminado de un documento',
// Navigation
'layout.menu.home': 'Inicio',
'layout.menu.documents': 'Documentos',
'layout.menu.tags': 'Etiquetas',
'layout.menu.tagging-rules': 'Reglas de etiquetado',
'layout.menu.deleted-documents': 'Documentos eliminados',
'layout.menu.organization-settings': 'Configuración',
'layout.menu.api-keys': 'Claves API',
'layout.menu.settings': 'Ajustes',
'layout.menu.account': 'Cuenta',
'layout.menu.general-settings': 'Ajustes generales',
'layout.menu.usage': 'Uso',
'layout.menu.intake-emails': 'Correos de ingreso',
'layout.menu.webhooks': 'Webhooks',
'layout.menu.members': 'Miembros',
'layout.menu.invitations': 'Invitaciones',
'layout.upgrade-cta.title': '¿Necesitas más espacio?',
'layout.upgrade-cta.description': 'Obtén 10x más almacenamiento + colaboración en equipo',
'layout.upgrade-cta.button': 'Actualizar ahora',
'layout.theme.light': 'Modo claro',
'layout.theme.dark': 'Modo oscuro',
'layout.theme.system': 'Modo del sistema',
'layout.search.placeholder': 'Buscar...',
'layout.menu.import-document': 'Importar un documento',
'user-menu.account-settings': 'Ajustes de cuenta',
'user-menu.api-keys': 'Claves API',
'user-menu.invitations': 'Invitaciones',
'user-menu.language': 'Idioma',
'user-menu.logout': 'Cerrar sesión',
// Command palette
'command-palette.search.placeholder': 'Buscar comandos o documentos',
'command-palette.no-results': 'No se encontraron resultados',
'command-palette.sections.documents': 'Documentos',
'command-palette.sections.theme': 'Tema',
// API errors
'api-errors.document.already_exists': 'El documento ya existe',
'api-errors.document.size_too_large': 'El archivo es demasiado grande',
'api-errors.intake-emails.already_exists': 'Ya existe un correo de ingreso con esta dirección.',
'api-errors.intake_email.limit_reached': 'Se ha alcanzado el número máximo de correos de ingreso para esta organización. Por favor, mejora tu plan para crear más correos de ingreso.',
'api-errors.user.max_organization_count_reached': 'Has alcanzado el número máximo de organizaciones que puedes crear, si necesitas crear más, contacta al soporte.',
'api-errors.default': 'Ocurrió un error al procesar tu solicitud.',
'api-errors.organization.invitation_already_exists': 'Ya existe una invitación para este correo electrónico en esta organización.',
'api-errors.user.already_in_organization': 'Este usuario ya está en esta organización.',
'api-errors.user.organization_invitation_limit_reached': 'Se ha alcanzado el número máximo de invitaciones para hoy. Por favor, inténtalo de nuevo mañana.',
'api-errors.demo.not_available': 'Esta función no está disponible en la demostración',
'api-errors.tags.already_exists': 'Ya existe una etiqueta con este nombre en esta organización',
'api-errors.internal.error': 'Ocurrió un error al procesar tu solicitud. Por favor, inténtalo de nuevo.',
'api-errors.auth.invalid_origin': 'Origen de la aplicación inválido. Si estás alojando Papra, asegúrate de que la variable de entorno APP_BASE_URL coincida con tu URL actual. Para más detalles, consulta https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'Se ha alcanzado el número máximo de miembros e invitaciones pendientes para esta organización. Por favor, actualiza tu plan para añadir más miembros.',
'api-errors.organization.has_active_subscription': 'No se puede eliminar la organización con una suscripción activa. Por favor, cancela tu suscripción primero usando el botón Gestionar Suscripción arriba.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Usuario no encontrado',
'api-errors.FAILED_TO_CREATE_USER': 'Error al crear usuario',
'api-errors.FAILED_TO_CREATE_SESSION': 'Error al crear sesión',
'api-errors.FAILED_TO_UPDATE_USER': 'Error al actualizar usuario',
'api-errors.FAILED_TO_GET_SESSION': 'Error al obtener sesión',
'api-errors.INVALID_PASSWORD': 'Contraseña inválida',
'api-errors.INVALID_EMAIL': 'Email inválido',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'El email o la contraseña es incorrecta, o la cuenta no existe.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Cuenta social ya vinculada',
'api-errors.PROVIDER_NOT_FOUND': 'Proveedor no encontrado',
'api-errors.INVALID_TOKEN': 'Token inválido',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Token de ID no soportado',
'api-errors.FAILED_TO_GET_USER_INFO': 'Error al obtener información del usuario',
'api-errors.USER_EMAIL_NOT_FOUND': 'Email del usuario no encontrado',
'api-errors.EMAIL_NOT_VERIFIED': 'Email no verificado',
'api-errors.PASSWORD_TOO_SHORT': 'Contraseña demasiado corta',
'api-errors.PASSWORD_TOO_LONG': 'Contraseña demasiado larga',
'api-errors.USER_ALREADY_EXISTS': 'Ya existe un usuario con este email',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'El email no puede ser actualizado',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Cuenta de credenciales no encontrada',
'api-errors.SESSION_EXPIRED': 'Sesión expirada',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Error al desvincular la última cuenta',
'api-errors.ACCOUNT_NOT_FOUND': 'Cuenta no encontrada',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'El usuario ya tiene contraseña',
// Not found
'not-found.title': '404 - No encontrado',
'not-found.description': 'Lo sentimos, la página que buscas no parece existir. Por favor, verifica la URL e inténtalo de nuevo.',
'not-found.back-to-home': 'Volver al inicio',
// Demo
'demo.popup.description': 'Este es un entorno de demostración, todos los datos se guardan en el almacenamiento local de tu navegador.',
'demo.popup.discord': 'Únete a {{ discordLink }} para obtener soporte, proponer funciones o simplemente chatear.',
'demo.popup.discord-link-label': 'Servidor de Discord',
'demo.popup.reset': 'Restablecer datos de la demo',
'demo.popup.hide': 'Ocultar',
// Color picker
'color-picker.hue': 'Matiz',
'color-picker.saturation': 'Saturación',
'color-picker.lightness': 'Luminosidad',
'color-picker.select-color': 'Seleccionar color',
'color-picker.select-a-color': 'Selecciona un color',
// Subscriptions
'subscriptions.checkout-success.title': '¡Pago exitoso!',
'subscriptions.checkout-success.description': 'Tu suscripción ha sido activada exitosamente.',
'subscriptions.checkout-success.thank-you': 'Gracias por actualizar a Papra Plus. Ahora tienes acceso a todas las funciones premium.',
'subscriptions.checkout-success.go-to-organizations': 'Ir a Organizaciones',
'subscriptions.checkout-success.redirecting': 'Redirigiendo en {{ count }} segundo{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Pago cancelado',
'subscriptions.checkout-cancel.description': 'Tu actualización de suscripción fue cancelada.',
'subscriptions.checkout-cancel.no-charges': 'No se han realizado cargos a tu cuenta. Puedes intentarlo de nuevo cuando estés listo.',
'subscriptions.checkout-cancel.back-to-organizations': 'Volver a Organizaciones',
'subscriptions.checkout-cancel.need-help': '¿Necesitas ayuda?',
'subscriptions.checkout-cancel.contact-support': 'Contactar soporte',
'subscriptions.upgrade-dialog.title': 'Actualizar esta organización',
'subscriptions.upgrade-dialog.description': 'Desbloquea funciones poderosas para tu organización',
'subscriptions.upgrade-dialog.contact-us': 'Contáctanos',
'subscriptions.upgrade-dialog.enterprise-plans': 'si necesitas planes empresariales personalizados.',
'subscriptions.upgrade-dialog.current-plan': 'Plan actual',
'subscriptions.upgrade-dialog.recommended': 'Recomendado',
'subscriptions.upgrade-dialog.per-month': '/mes',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} facturado anualmente',
'subscriptions.upgrade-dialog.upgrade-now': 'Actualizar ahora',
'subscriptions.upgrade-dialog.promo-banner.title': 'Oferta por tiempo limitado',
'subscriptions.upgrade-dialog.promo-banner.description': '¡Obtén {{ percent }}% de descuento por organización en todos los planes para siempre como early adopter! La oferta expira en {{ days, >1:{days} días, =1:1 día, menos de un día }}.',
'subscriptions.plan.free.name': 'Plan gratuito',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Tamaño de almacenamiento de documentos',
'subscriptions.features.members': 'Miembros de la organización',
'subscriptions.features.members-count': '{{ count }} miembros',
'subscriptions.features.email-intakes': 'Entradas de correo',
'subscriptions.features.email-intakes-count-singular': '{{ count }} dirección',
'subscriptions.features.email-intakes-count-plural': '{{ count }} direcciones',
'subscriptions.features.max-upload-size': 'Tamaño máximo de archivo de carga',
'subscriptions.features.support': 'Soporte',
'subscriptions.features.support-community': 'Soporte de la comunidad',
'subscriptions.features.support-email': 'Soporte por correo',
'subscriptions.features.support-priority': 'Soporte prioritario',
'subscriptions.billing-interval.monthly': 'Mensual',
'subscriptions.billing-interval.annual': 'Anual',
'subscriptions.usage-warning.message': 'Ha utilizado el {{ percent }}% de su almacenamiento de documentos. Considere actualizar su plan para obtener más espacio.',
'subscriptions.usage-warning.upgrade-button': 'Actualizar plan',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Escriba "{{ text }}" para confirmar',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Restablece tu contraseña
auth.request-password-reset.description: Ingresa tu correo electrónico para restablecer tu contraseña.
auth.request-password-reset.requested: Si existe una cuenta para este correo electrónico, te enviaremos un correo para restablecer tu contraseña.
auth.request-password-reset.back-to-login: Volver al inicio de sesión
auth.request-password-reset.form.email.label: Correo electrónico
auth.request-password-reset.form.email.placeholder: 'Ejemplo: ada@papra.app'
auth.request-password-reset.form.email.required: Por favor, ingresa tu correo electrónico
auth.request-password-reset.form.email.invalid: Esta dirección de correo electrónico no es válida
auth.request-password-reset.form.submit: Solicitar restablecimiento de contraseña
auth.reset-password.title: Restablece tu contraseña
auth.reset-password.description: Ingresa tu nueva contraseña para restablecerla.
auth.reset-password.reset: Tu contraseña ha sido restablecida.
auth.reset-password.back-to-login: Volver al inicio de sesión
auth.reset-password.form.new-password.label: Nueva contraseña
auth.reset-password.form.new-password.placeholder: 'Ejemplo: **********'
auth.reset-password.form.new-password.required: Por favor, ingresa tu nueva contraseña
auth.reset-password.form.new-password.min-length: La contraseña debe tener al menos {{ minLength }} caracteres
auth.reset-password.form.new-password.max-length: La contraseña debe tener menos de {{ maxLength }} caracteres
auth.reset-password.form.submit: Restablecer contraseña
auth.email-provider.open: Abrir {{ provider }}
auth.login.title: Inicia sesión en Papra
auth.login.description: Ingresa tu correo electrónico o usa un inicio de sesión social para acceder a tu cuenta de Papra.
auth.login.login-with-provider: Iniciar sesión con {{ provider }}
auth.login.no-account: ¿No tienes una cuenta?
auth.login.register: Registrarse
auth.login.form.email.label: Correo electrónico
auth.login.form.email.placeholder: 'Ejemplo: ada@papra.app'
auth.login.form.email.required: Por favor, ingresa tu correo electrónico
auth.login.form.email.invalid: Esta dirección de correo electrónico no es válida
auth.login.form.password.label: Contraseña
auth.login.form.password.placeholder: Establece una contraseña
auth.login.form.password.required: Por favor, ingresa tu contraseña
auth.login.form.remember-me.label: Recordarme
auth.login.form.forgot-password.label: ¿Olvidaste tu contraseña?
auth.login.form.submit: Iniciar sesión
auth.register.title: Regístrate en Papra
auth.register.description: Crea una cuenta para comenzar a usar Papra.
auth.register.register-with-email: Registrarse con correo electrónico
auth.register.register-with-provider: Registrarse con {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: ¿Ya tienes una cuenta?
auth.register.login: Iniciar sesión
auth.register.registration-disabled.title: El registro está deshabilitado
auth.register.registration-disabled.description: La creación de nuevas cuentas está deshabilitada actualmente en esta instancia de Papra. Solo los usuarios con cuentas existentes pueden iniciar sesión. Si crees que esto es un error, contacta al administrador de esta instancia.
auth.register.form.email.label: Correo electrónico
auth.register.form.email.placeholder: 'Ejemplo: ada@papra.app'
auth.register.form.email.required: Por favor, ingresa tu correo electrónico
auth.register.form.email.invalid: Esta dirección de correo electrónico no es válida
auth.register.form.password.label: Contraseña
auth.register.form.password.placeholder: Establece una contraseña
auth.register.form.password.required: Por favor, ingresa tu contraseña
auth.register.form.password.min-length: La contraseña debe tener al menos {{ minLength }} caracteres
auth.register.form.password.max-length: La contraseña debe tener menos de {{ maxLength }} caracteres
auth.register.form.name.label: Nombre
auth.register.form.name.placeholder: 'Ejemplo: Ada Lovelace'
auth.register.form.name.required: Por favor, ingresa tu nombre
auth.register.form.name.max-length: El nombre debe tener menos de {{ maxLength }} caracteres
auth.register.form.submit: Registrarse
auth.email-validation-required.title: Verifica tu correo electrónico
auth.email-validation-required.description: Se ha enviado un correo de verificación a tu dirección de correo electrónico. Por favor, verifica tu correo haciendo clic en el enlace del correo.
auth.legal-links.description: Al continuar, reconoces que entiendes y aceptas los {{ terms }} y la {{ privacy }}.
auth.legal-links.terms: Términos de servicio
auth.legal-links.privacy: Política de privacidad
auth.no-auth-provider.title: No hay proveedor de autenticación
auth.no-auth-provider.description: No hay proveedores de autenticación habilitados en esta instancia de Papra. Por favor, contacta al administrador de esta instancia para habilitarlos.
# User settings
user.settings.title: Configuración de usuario
user.settings.description: Administra aquí la configuración de tu cuenta.
user.settings.email.title: Dirección de correo electrónico
user.settings.email.description: Tu dirección de correo electrónico no puede ser cambiada.
user.settings.email.label: Correo electrónico
user.settings.name.title: Nombre completo
user.settings.name.description: Tu nombre completo se muestra a otros miembros de la organización.
user.settings.name.label: Nombre completo
user.settings.name.placeholder: Ej. John Doe
user.settings.name.update: Actualizar nombre
user.settings.name.updated: Tu nombre completo ha sido actualizado
user.settings.logout.title: Cerrar sesión
user.settings.logout.description: Cierra la sesión de tu cuenta. Puedes iniciar sesión nuevamente más tarde.
user.settings.logout.button: Cerrar sesión
# Organizations
organizations.list.title: Tus organizaciones
organizations.list.description: Las organizaciones son una manera de agrupar tus documentos y gestionar el acceso a ellos. Puedes crear varias organizaciones e invitar a tus compañeros para colaborar.
organizations.list.create-new: Crear nueva organización
organizations.details.no-documents.title: Sin documentos
organizations.details.no-documents.description: Aún no hay documentos en esta organización. Comienza subiendo algunos documentos.
organizations.details.upload-documents: Subir documentos
organizations.details.documents-count: documentos en total
organizations.details.total-size: tamaño total
organizations.details.latest-documents: Últimos documentos importados
organizations.create.title: Crear una nueva organización
organizations.create.description: Tus documentos se agruparán por organización. Puedes crear varias organizaciones para separar tus documentos, por ejemplo, para documentos personales y de trabajo.
organizations.create.back: Volver
organizations.create.error.max-count-reached: Has alcanzado el número máximo de organizaciones que puedes crear, si necesitas crear más, contacta al soporte.
organizations.create.form.name.label: Nombre de la organización
organizations.create.form.name.placeholder: Ej. Acme Inc.
organizations.create.form.name.required: Por favor, ingresa un nombre para la organización
organizations.create.form.submit: Crear organización
organizations.create.success: Organización creada exitosamente
organizations.create-first.title: Crea tu organización
organizations.create-first.description: Tus documentos se agruparán por organización. Puedes crear varias organizaciones para separar tus documentos, por ejemplo, para documentos personales y de trabajo.
organizations.create-first.default-name: Mi organización
organizations.create-first.user-name: Organización de {{ name }}
organization.settings.title: Configuración de la organización
organization.settings.page.title: Configuración de la organización
organization.settings.page.description: Administra la configuración de tu organización aquí.
organization.settings.name.title: Nombre de la organización
organization.settings.name.update: Actualizar nombre
organization.settings.name.placeholder: Ej. Acme Inc.
organization.settings.name.updated: Nombre de la organización actualizado
organization.settings.subscription.title: Suscripción
organization.settings.subscription.description: Administra tu facturación, facturas y métodos de pago.
organization.settings.subscription.manage: Gestionar suscripción
organization.settings.subscription.error: Error al obtener la URL del portal del cliente
organization.settings.delete.title: Eliminar organización
organization.settings.delete.description: Eliminar esta organización eliminará permanentemente todos los datos asociados a ella.
organization.settings.delete.confirm.title: Eliminar organización
organization.settings.delete.confirm.message: ¿Estás seguro de que deseas eliminar esta organización? Esta acción no se puede deshacer, y todos los datos asociados se eliminarán permanentemente.
organization.settings.delete.confirm.confirm-button: Eliminar organización
organization.settings.delete.confirm.cancel-button: Cancelar
organization.settings.delete.success: Organización eliminada
organizations.members.title: Miembros
organizations.members.description: Administra los miembros de tu organización
organizations.members.invite-member: Invitar miembro
organizations.members.invite-member-disabled-tooltip: Solo los administradores o propietarios pueden invitar miembros a la organización
organizations.members.remove-from-organization: Eliminar de la organización
organizations.members.role: Rol
organizations.members.roles.owner: Propietario
organizations.members.roles.admin: Administrador
organizations.members.roles.member: Miembro
organizations.members.delete.confirm.title: Eliminar miembro
organizations.members.delete.confirm.message: ¿Estás seguro de que deseas eliminar a este miembro de la organización?
organizations.members.delete.confirm.confirm-button: Eliminar
organizations.members.delete.confirm.cancel-button: Cancelar
organizations.members.delete.success: Miembro eliminado de la organización
organizations.members.update-role.success: Rol del miembro actualizado
organizations.members.table.headers.name: Nombre
organizations.members.table.headers.email: Correo electrónico
organizations.members.table.headers.role: Rol
organizations.members.table.headers.created: Creado
organizations.members.table.headers.actions: Acciones
organizations.invite-member.title: Invitar miembro
organizations.invite-member.description: Invita a un miembro a tu organización
organizations.invite-member.form.email.label: Correo electrónico
organizations.invite-member.form.email.placeholder: 'Ejemplo: ada@papra.app'
organizations.invite-member.form.email.required: Por favor, ingresa un correo electrónico válido
organizations.invite-member.form.role.label: Rol
organizations.invite-member.form.submit: Invitar a la organización
organizations.invite-member.success.message: Miembro invitado
organizations.invite-member.success.description: El correo ha sido invitado a la organización.
organizations.invite-member.error.message: Error al invitar al miembro
organizations.invitations.title: Invitaciones
organizations.invitations.description: Administra las invitaciones de tu organización
organizations.invitations.list.cta: Invitar miembro
organizations.invitations.list.empty.title: No hay invitaciones pendientes
organizations.invitations.list.empty.description: Aún no te han invitado a ninguna organización.
organizations.invitations.status.pending: Pendiente
organizations.invitations.status.accepted: Aceptada
organizations.invitations.status.rejected: Rechazada
organizations.invitations.status.expired: Expirada
organizations.invitations.status.cancelled: Cancelada
organizations.invitations.resend: Reenviar invitación
organizations.invitations.cancel.title: Cancelar invitación
organizations.invitations.cancel.description: ¿Estás seguro de que deseas cancelar esta invitación?
organizations.invitations.cancel.confirm: Cancelar invitación
organizations.invitations.cancel.cancel: Cancelar
organizations.invitations.resend.title: Reenviar invitación
organizations.invitations.resend.description: ¿Estás seguro de que deseas reenviar esta invitación? Esto enviará un nuevo correo al destinatario.
organizations.invitations.resend.confirm: Reenviar invitación
organizations.invitations.resend.cancel: Cancelar
invitations.list.title: Invitaciones
invitations.list.description: Administra las invitaciones de tu organización
invitations.list.empty.title: No hay invitaciones pendientes
invitations.list.empty.description: Aún no te han invitado a ninguna organización.
invitations.list.headers.organization: Organización
invitations.list.headers.status: Estado
invitations.list.headers.created: Creado
invitations.list.headers.actions: Acciones
invitations.list.actions.accept: Aceptar
invitations.list.actions.reject: Rechazar
invitations.list.actions.accept.success.message: Invitación aceptada
invitations.list.actions.accept.success.description: La invitación ha sido aceptada.
invitations.list.actions.reject.success.message: Invitación rechazada
invitations.list.actions.reject.success.description: La invitación ha sido rechazada.
# Documents
documents.list.title: Documentos
documents.list.no-documents.title: Sin documentos
documents.list.no-documents.description: Aún no hay documentos en esta organización. Comienza subiendo algunos documentos.
documents.list.no-results: No se encontraron documentos
documents.tabs.info: Información
documents.tabs.content: Contenido
documents.tabs.activity: Actividad
documents.deleted.message: Este documento ha sido eliminado y será borrado permanentemente en {{ days }} días.
documents.actions.download: Descargar
documents.actions.open-in-new-tab: Abrir en una nueva pestaña
documents.actions.restore: Restaurar
documents.actions.delete: Eliminar
documents.actions.edit: Editar
documents.actions.cancel: Cancelar
documents.actions.save: Guardar
documents.actions.saving: Guardando...
documents.content.alert: El contenido del documento se extrae automáticamente al subirlo. Solo se utiliza para búsqueda e indexación.
documents.info.id: ID
documents.info.name: Nombre
documents.info.type: Tipo
documents.info.size: Tamaño
documents.info.created-at: Creado el
documents.info.updated-at: Actualizado el
documents.info.never: Nunca
documents.rename.title: Renombrar documento
documents.rename.form.name.label: Nombre
documents.rename.form.name.placeholder: 'Ejemplo: Factura 2024'
documents.rename.form.name.required: Por favor, ingresa un nombre para el documento
documents.rename.form.name.max-length: El nombre debe tener menos de 255 caracteres
documents.rename.form.submit: Renombrar documento
documents.rename.success: Documento renombrado exitosamente
documents.rename.cancel: Cancelar
import-documents.title.error: '{{ count }} documentos fallidos'
import-documents.title.success: '{{ count }} documentos importados'
import-documents.title.pending: '{{ count }} / {{ total }} documentos importados'
import-documents.title.none: Importar documentos
import-documents.no-import-in-progress: No hay importación de documentos en curso
documents.deleted.title: Documentos eliminados
documents.deleted.empty.title: No hay documentos eliminados
documents.deleted.empty.description: No tienes documentos eliminados. Los documentos eliminados se moverán a la papelera durante {{ days }} días.
documents.deleted.retention-notice: Todos los documentos eliminados se almacenan en la papelera durante {{ days }} días. Pasado este tiempo, los documentos serán eliminados permanentemente y no podrás restaurarlos.
documents.deleted.deleted-at: Eliminado
documents.deleted.restoring: Restaurando...
documents.deleted.deleting: Eliminando...
documents.preview.unknown-file-type: No hay vista previa disponible para este tipo de archivo
documents.preview.binary-file: Este parece ser un archivo binario y no puede mostrarse como texto
trash.delete-all.button: Eliminar todo
trash.delete-all.confirm.title: ¿Eliminar permanentemente todos los documentos?
trash.delete-all.confirm.description: ¿Estás seguro de que deseas eliminar permanentemente todos los documentos de la papelera? Esta acción no se puede deshacer.
trash.delete-all.confirm.label: Eliminar
trash.delete-all.confirm.cancel: Cancelar
trash.delete.button: Eliminar
trash.delete.confirm.title: ¿Eliminar permanentemente el documento?
trash.delete.confirm.description: ¿Estás seguro de que deseas eliminar permanentemente este documento de la papelera? Esta acción no se puede deshacer.
trash.delete.confirm.label: Eliminar
trash.delete.confirm.cancel: Cancelar
trash.deleted.success.title: Documento eliminado
trash.deleted.success.description: El documento ha sido eliminado permanentemente.
activity.document.created: El documento ha sido creado
activity.document.updated.single: El campo {{ field }} ha sido actualizado
activity.document.updated.multiple: Los campos {{ fields }} han sido actualizados
activity.document.updated: El documento ha sido actualizado
activity.document.deleted: El documento ha sido eliminado
activity.document.restored: El documento ha sido restaurado
activity.document.tagged: La etiqueta {{ tag }} ha sido añadida
activity.document.untagged: La etiqueta {{ tag }} ha sido eliminada
activity.document.user.name: por {{ name }}
activity.load-more: Cargar más
activity.no-more-activities: No hay más actividades para este documento
# Tags
tags.no-tags.title: Aún no hay etiquetas
tags.no-tags.description: Esta organización no tiene etiquetas aún. Las etiquetas se utilizan para categorizar documentos. Puedes añadir etiquetas a tus documentos para que sean más fáciles de encontrar y organizar.
tags.no-tags.create-tag: Crear etiqueta
tags.title: Etiquetas de documentos
tags.description: Las etiquetas se utilizan para categorizar documentos. Puedes añadir etiquetas a tus documentos para que sean más fáciles de encontrar y organizar.
tags.create: Crear etiqueta
tags.update: Actualizar etiqueta
tags.delete: Eliminar etiqueta
tags.delete.confirm.title: Eliminar etiqueta
tags.delete.confirm.message: ¿Estás seguro de que deseas eliminar esta etiqueta? Eliminar una etiqueta la quitará de todos los documentos.
tags.delete.confirm.confirm-button: Eliminar
tags.delete.confirm.cancel-button: Cancelar
tags.delete.success: Etiqueta eliminada exitosamente
tags.create.success: Etiqueta "{{ name }}" creada exitosamente.
tags.update.success: Etiqueta "{{ name }}" actualizada exitosamente.
tags.form.name.label: Nombre
tags.form.name.placeholder: Ej. Contratos
tags.form.name.required: Por favor, ingresa un nombre para la etiqueta
tags.form.name.max-length: El nombre de la etiqueta debe tener menos de 64 caracteres
tags.form.color.label: Color
tags.form.color.required: Por favor, ingresa un color
tags.form.color.invalid: El color hexadecimal tiene un formato incorrecto.
tags.form.description.label: Descripción
tags.form.description.optional: (opcional)
tags.form.description.placeholder: Ej. Todos los contratos firmados por la empresa
tags.form.description.max-length: La descripción debe tener menos de 256 caracteres
tags.form.no-description: Sin descripción
tags.table.headers.tag: Etiqueta
tags.table.headers.description: Descripción
tags.table.headers.documents: Documentos
tags.table.headers.created: Creado
tags.table.headers.actions: Acciones
# Tagging rules
tagging-rules.field.name: nombre del documento
tagging-rules.field.content: contenido del documento
tagging-rules.operator.equals: es igual a
tagging-rules.operator.not-equals: no es igual a
tagging-rules.operator.contains: contiene
tagging-rules.operator.not-contains: no contiene
tagging-rules.operator.starts-with: comienza con
tagging-rules.operator.ends-with: termina con
tagging-rules.list.title: Reglas de etiquetado
tagging-rules.list.description: Administra las reglas de etiquetado de tu organización, para etiquetar documentos automáticamente según las condiciones que definas.
tagging-rules.list.demo-warning: 'Nota: Como este es un entorno de demostración (sin servidor), las reglas de etiquetado no se aplicarán a los nuevos documentos añadidos.'
tagging-rules.list.no-tagging-rules.title: No hay reglas de etiquetado
tagging-rules.list.no-tagging-rules.description: Crea una regla de etiquetado para etiquetar automáticamente tus documentos añadidos según las condiciones que definas.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Crear regla de etiquetado
tagging-rules.list.card.no-conditions: Sin condiciones
tagging-rules.list.card.one-condition: 1 condición
tagging-rules.list.card.conditions: '{{ count }} condiciones'
tagging-rules.list.card.delete: Eliminar regla
tagging-rules.list.card.edit: Editar regla
tagging-rules.create.title: Crear regla de etiquetado
tagging-rules.create.success: Regla de etiquetado creada exitosamente
tagging-rules.create.error: Error al crear la regla de etiquetado
tagging-rules.create.submit: Crear regla
tagging-rules.form.name.label: Nombre
tagging-rules.form.name.placeholder: 'Ejemplo: Etiquetar facturas'
tagging-rules.form.name.min-length: Por favor, ingresa un nombre para la regla
tagging-rules.form.name.max-length: El nombre debe tener menos de 64 caracteres
tagging-rules.form.description.label: Descripción
tagging-rules.form.description.placeholder: "Ejemplo: Etiquetar documentos con 'factura' en el nombre"
tagging-rules.form.description.max-length: La descripción debe tener menos de 256 caracteres
tagging-rules.form.conditions.label: Condiciones
tagging-rules.form.conditions.description: Define las condiciones que deben cumplirse para que la regla se aplique. Todas las condiciones deben cumplirse.
tagging-rules.form.conditions.add-condition: Añadir condición
tagging-rules.form.conditions.no-conditions.title: Sin condiciones
tagging-rules.form.conditions.no-conditions.description: No añadiste ninguna condición a esta regla. Esta regla aplicará sus etiquetas a todos los documentos.
tagging-rules.form.conditions.no-conditions.confirm: Aplicar regla sin condiciones
tagging-rules.form.conditions.no-conditions.cancel: Cancelar
tagging-rules.form.conditions.value.placeholder: 'Ejemplo: factura'
tagging-rules.form.conditions.value.min-length: Por favor, ingresa un valor para la condición
tagging-rules.form.tags.label: Etiquetas
tagging-rules.form.tags.description: Selecciona las etiquetas a aplicar a los documentos añadidos que cumplan las condiciones
tagging-rules.form.tags.min-length: Se requiere al menos una etiqueta para aplicar
tagging-rules.form.tags.add-tag: Crear etiqueta
tagging-rules.form.submit: Crear regla
tagging-rules.update.title: Actualizar regla de etiquetado
tagging-rules.update.error: Error al actualizar la regla de etiquetado
tagging-rules.update.submit: Actualizar regla
tagging-rules.update.cancel: Cancelar
# Intake emails
intake-emails.title: Correos de ingreso
intake-emails.description: Las direcciones de correo de ingreso se usan para ingresar automáticamente correos en Papra. Solo reenvía correos a la dirección de ingreso y sus archivos adjuntos se agregarán a los documentos de tu organización.
intake-emails.disabled.title: Correos de ingreso deshabilitados
intake-emails.disabled.description: Los correos de ingreso están deshabilitados en esta instancia. Contacta a tu administrador para habilitarlos. Consulta la {{ documentation }} para más información.
intake-emails.disabled.documentation: documentación
intake-emails.info: Solo los correos de ingreso habilitados desde orígenes permitidos serán procesados. Puedes habilitar o deshabilitar un correo de ingreso en cualquier momento.
intake-emails.empty.title: Sin correos de ingreso
intake-emails.empty.description: Genera una dirección de ingreso para añadir fácilmente archivos adjuntos de correos.
intake-emails.empty.generate: Generar correo de ingreso
intake-emails.count: '{{ count }} correo{{ plural }} de ingreso para esta organización'
intake-emails.new: Nuevo correo de ingreso
intake-emails.disabled-label: (Deshabilitado)
intake-emails.no-origins: Sin orígenes de correo permitidos
intake-emails.allowed-origins: Permitido desde {{ count }} dirección{{ plural }}
intake-emails.actions.enable: Habilitar
intake-emails.actions.disable: Deshabilitar
intake-emails.actions.manage-origins: Gestionar direcciones de origen
intake-emails.actions.delete: Eliminar
intake-emails.delete.confirm.title: ¿Eliminar correo de ingreso?
intake-emails.delete.confirm.message: ¿Estás seguro de que deseas eliminar este correo de ingreso? Esta acción no se puede deshacer.
intake-emails.delete.confirm.confirm-button: Eliminar correo de ingreso
intake-emails.delete.confirm.cancel-button: Cancelar
intake-emails.delete.success: Correo de ingreso eliminado
intake-emails.create.success: Correo de ingreso creado
intake-emails.update.success.enabled: Correo de ingreso habilitado
intake-emails.update.success.disabled: Correo de ingreso deshabilitado
intake-emails.allowed-origins.title: Orígenes permitidos
intake-emails.allowed-origins.description: Solo los correos enviados a {{ email }} desde estos orígenes serán procesados. Si no se especifican orígenes, todos los correos serán descartados.
intake-emails.allowed-origins.add.label: Añadir dirección de correo permitida
intake-emails.allowed-origins.add.placeholder: Ej. ada@papra.app
intake-emails.allowed-origins.add.button: Añadir
intake-emails.allowed-origins.add.error.exists: Este correo ya está en los orígenes permitidos para este correo de ingreso
# API keys
api-keys.permissions.documents.title: Documentos
api-keys.permissions.documents.documents:create: Crear documentos
api-keys.permissions.documents.documents:read: Leer documentos
api-keys.permissions.documents.documents:update: Actualizar documentos
api-keys.permissions.documents.documents:delete: Eliminar documentos
api-keys.permissions.tags.title: Etiquetas
api-keys.permissions.tags.tags:create: Crear etiquetas
api-keys.permissions.tags.tags:read: Leer etiquetas
api-keys.permissions.tags.tags:update: Actualizar etiquetas
api-keys.permissions.tags.tags:delete: Eliminar etiquetas
api-keys.create.title: Crear clave API
api-keys.create.description: Crea una nueva clave API para acceder a la API de Papra.
api-keys.create.success: La clave API ha sido creada exitosamente.
api-keys.create.back: Volver a claves API
api-keys.create.form.name.label: Nombre
api-keys.create.form.name.placeholder: 'Ejemplo: Mi clave API'
api-keys.create.form.name.required: Por favor, ingresa un nombre para la clave API
api-keys.create.form.permissions.label: Permisos
api-keys.create.form.permissions.required: Por favor, selecciona al menos un permiso
api-keys.create.form.submit: Crear clave API
api-keys.create.created.title: Clave API creada
api-keys.create.created.description: La clave API ha sido creada exitosamente. Guárdala en un lugar seguro ya que no se mostrará nuevamente.
api-keys.list.title: Claves API
api-keys.list.description: Administra tus claves API aquí.
api-keys.list.create: Crear clave API
api-keys.list.empty.title: Sin claves API
api-keys.list.empty.description: Crea una clave API para acceder a la API de Papra.
api-keys.list.card.last-used: Último uso
api-keys.list.card.never: Nunca
api-keys.list.card.created: Creado
api-keys.delete.success: La clave API ha sido eliminada exitosamente
api-keys.delete.confirm.title: Eliminar clave API
api-keys.delete.confirm.message: ¿Estás seguro de que deseas eliminar esta clave API? Esta acción no se puede deshacer.
api-keys.delete.confirm.confirm-button: Eliminar
api-keys.delete.confirm.cancel-button: Cancelar
# Webhooks
webhooks.list.title: Webhooks
webhooks.list.description: Administra los webhooks de tu organización
webhooks.list.empty.title: Sin webhooks
webhooks.list.empty.description: Crea tu primer webhook para empezar a recibir eventos
webhooks.list.create: Crear webhook
webhooks.list.card.last-triggered: Última activación
webhooks.list.card.never: Nunca
webhooks.list.card.created: Creado
webhooks.create.title: Crear webhook
webhooks.create.description: Crea un nuevo webhook para recibir eventos
webhooks.create.success: Webhook creado exitosamente
webhooks.create.back: Volver
webhooks.create.form.submit: Crear webhook
webhooks.create.form.name.label: Nombre del webhook
webhooks.create.form.name.placeholder: Ingresa el nombre del webhook
webhooks.create.form.name.required: El nombre es obligatorio
webhooks.create.form.url.label: URL del webhook
webhooks.create.form.url.placeholder: Ingresa la URL del webhook
webhooks.create.form.url.required: La URL es obligatoria
webhooks.create.form.url.invalid: La URL no es válida
webhooks.create.form.secret.label: Secreto
webhooks.create.form.secret.placeholder: Ingresa el secreto del webhook
webhooks.create.form.events.label: Eventos
webhooks.create.form.events.required: Se requiere al menos un evento
webhooks.update.title: Editar webhook
webhooks.update.description: Actualiza los detalles de tu webhook
webhooks.update.success: Webhook actualizado exitosamente
webhooks.update.submit: Actualizar webhook
webhooks.update.cancel: Cancelar
webhooks.update.form.secret.placeholder: Ingresa un nuevo secreto
webhooks.update.form.secret.placeholder-redacted: '[Secreto oculto]'
webhooks.update.form.rotate-secret.button: Rotar secreto
webhooks.delete.success: Webhook eliminado exitosamente
webhooks.delete.confirm.title: Eliminar webhook
webhooks.delete.confirm.message: ¿Estás seguro de que deseas eliminar este webhook?
webhooks.delete.confirm.confirm-button: Eliminar
webhooks.delete.confirm.cancel-button: Cancelar
webhooks.events.documents.title: Eventos de documentos
webhooks.events.documents.document:created.description: Documento creado
webhooks.events.documents.document:deleted.description: Documento eliminado
webhooks.events.documents.document:updated.description: Documento actualizado
webhooks.events.documents.document:tag:added.description: Una etiqueta se ha añadido a un documento
webhooks.events.documents.document:tag:removed.description: Una etiqueta se ha eliminado de un documento
# Navigation
layout.menu.home: Inicio
layout.menu.documents: Documentos
layout.menu.tags: Etiquetas
layout.menu.tagging-rules: Reglas de etiquetado
layout.menu.deleted-documents: Documentos eliminados
layout.menu.organization-settings: Configuración
layout.menu.api-keys: Claves API
layout.menu.settings: Ajustes
layout.menu.account: Cuenta
layout.menu.general-settings: Ajustes generales
layout.menu.intake-emails: Correos de ingreso
layout.menu.webhooks: Webhooks
layout.menu.members: Miembros
layout.menu.invitations: Invitaciones
layout.theme.light: Modo claro
layout.theme.dark: Modo oscuro
layout.theme.system: Modo del sistema
layout.search.placeholder: Buscar...
layout.menu.import-document: Importar un documento
user-menu.account-settings: Ajustes de cuenta
user-menu.api-keys: Claves API
user-menu.invitations: Invitaciones
user-menu.language: Idioma
user-menu.logout: Cerrar sesión
# Command palette
command-palette.search.placeholder: Buscar comandos o documentos
command-palette.no-results: No se encontraron resultados
command-palette.sections.documents: Documentos
command-palette.sections.theme: Tema
# API errors
api-errors.document.already_exists: El documento ya existe
api-errors.document.file_too_big: El archivo del documento es demasiado grande
api-errors.intake_email.limit_reached: Se ha alcanzado el número máximo de correos de ingreso para esta organización. Por favor, mejora tu plan para crear más correos de ingreso.
api-errors.user.max_organization_count_reached: Has alcanzado el número máximo de organizaciones que puedes crear, si necesitas crear más, contacta al soporte.
api-errors.default: Ocurrió un error al procesar tu solicitud.
api-errors.organization.invitation_already_exists: Ya existe una invitación para este correo electrónico en esta organización.
api-errors.user.already_in_organization: Este usuario ya está en esta organización.
api-errors.user.organization_invitation_limit_reached: Se ha alcanzado el número máximo de invitaciones para hoy. Por favor, inténtalo de nuevo mañana.
api-errors.demo.not_available: Esta función no está disponible en la demostración
api-errors.tags.already_exists: Ya existe una etiqueta con este nombre en esta organización
api-errors.internal.error: Ocurrió un error al procesar tu solicitud. Por favor, inténtalo de nuevo.
api-errors.auth.invalid_origin: Origen de la aplicación inválido. Si estás alojando Papra, asegúrate de que la variable de entorno APP_BASE_URL coincida con tu URL actual. Para más detalles, consulta https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - No encontrado
not-found.description: Lo sentimos, la página que buscas no parece existir. Por favor, verifica la URL e inténtalo de nuevo.
not-found.back-to-home: Volver al inicio
# Demo
demo.popup.description: Este es un entorno de demostración, todos los datos se guardan en el almacenamiento local de tu navegador.
demo.popup.discord: Únete a {{ discordLink }} para obtener soporte, proponer funciones o simplemente chatear.
demo.popup.discord-link-label: Servidor de Discord
demo.popup.reset: Restablecer datos de la demo
demo.popup.hide: Ocultar
# Color picker
color-picker.hue: Matiz
color-picker.saturation: Saturación
color-picker.lightness: Luminosidad
color-picker.select-color: Seleccionar color
color-picker.select-a-color: Selecciona un color

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Réinitialiser votre mot de passe',
'auth.request-password-reset.description': 'Entrez votre email pour réinitialiser votre mot de passe.',
'auth.request-password-reset.requested': 'Si un compte existe pour cet email, nous vous avons envoyé un email pour réinitialiser votre mot de passe.',
'auth.request-password-reset.back-to-login': 'Retour à la connexion',
'auth.request-password-reset.form.email.label': 'Email',
'auth.request-password-reset.form.email.placeholder': 'Exemple: ada@papra.app',
'auth.request-password-reset.form.email.required': 'Veuillez entrer votre adresse email',
'auth.request-password-reset.form.email.invalid': 'Cette adresse email est invalide',
'auth.request-password-reset.form.submit': 'Réinitialiser le mot de passe',
'auth.reset-password.title': 'Réinitialiser votre mot de passe',
'auth.reset-password.description': 'Entrez votre nouveau mot de passe pour réinitialiser votre mot de passe.',
'auth.reset-password.reset': 'Votre mot de passe a été réinitialisé.',
'auth.reset-password.back-to-login': 'Retour à la connexion',
'auth.reset-password.form.new-password.label': 'Nouveau mot de passe',
'auth.reset-password.form.new-password.placeholder': 'Exemple: **********',
'auth.reset-password.form.new-password.required': 'Veuillez entrer votre nouveau mot de passe',
'auth.reset-password.form.new-password.min-length': 'Le mot de passe doit contenir au moins {{ minLength }} caractères',
'auth.reset-password.form.new-password.max-length': 'Le mot de passe doit contenir moins de {{ maxLength }} caractères',
'auth.reset-password.form.submit': 'Réinitialiser le mot de passe',
'auth.email-provider.open': 'Ouvrir {{ provider }}',
'auth.login.title': 'Connexion à Papra',
'auth.login.description': 'Entrez votre email ou utilisez une connexion sociale pour accéder à votre compte Papra.',
'auth.login.login-with-provider': 'Connexion avec {{ provider }}',
'auth.login.no-account': 'Je n\'ai pas de compte',
'auth.login.register': 'S\'inscrire',
'auth.login.form.email.label': 'Email',
'auth.login.form.email.placeholder': 'Exemple: ada@papra.app',
'auth.login.form.email.required': 'Veuillez entrer votre adresse email',
'auth.login.form.email.invalid': 'Cette adresse email est invalide',
'auth.login.form.password.label': 'Mot de passe',
'auth.login.form.password.placeholder': 'Définir un mot de passe',
'auth.login.form.password.required': 'Veuillez entrer votre mot de passe',
'auth.login.form.remember-me.label': 'Se souvenir de moi',
'auth.login.form.forgot-password.label': 'Mot de passe oublié ?',
'auth.login.form.submit': 'Connexion',
'auth.register.title': 'S\'inscrire à Papra',
'auth.register.description': 'Créez un compte pour commencer à utiliser Papra.',
'auth.register.register-with-email': 'S\'inscrire avec email',
'auth.register.register-with-provider': 'S\'inscrire avec {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Je possède déjà un compte',
'auth.register.login': 'Connexion',
'auth.register.registration-disabled.title': 'Inscription désactivée',
'auth.register.registration-disabled.description': 'La création de nouveaux comptes est actuellement désactivée sur cette instance de Papra. Seuls les utilisateurs avec un compte existant peuvent se connecter. Si vous pensez que c\'est une erreur, veuillez contacter l\'administrateur de cette instance.',
'auth.register.form.email.label': 'Email',
'auth.register.form.email.placeholder': 'Exemple: ada@papra.app',
'auth.register.form.email.required': 'Veuillez entrer votre adresse email',
'auth.register.form.email.invalid': 'Cette adresse email est invalide',
'auth.register.form.password.label': 'Mot de passe',
'auth.register.form.password.placeholder': 'Définir un mot de passe',
'auth.register.form.password.required': 'Veuillez entrer votre mot de passe',
'auth.register.form.password.min-length': 'Le mot de passe doit contenir au moins {{ minLength }} caractères',
'auth.register.form.password.max-length': 'Le mot de passe doit contenir moins de {{ maxLength }} caractères',
'auth.register.form.name.label': 'Nom',
'auth.register.form.name.placeholder': 'Exemple: Ada Lovelace',
'auth.register.form.name.required': 'Veuillez entrer votre nom',
'auth.register.form.name.max-length': 'Le nom doit contenir moins de {{ maxLength }} caractères',
'auth.register.form.submit': 'S\'inscrire',
'auth.email-validation-required.title': 'Vérifier votre email',
'auth.email-validation-required.description': 'Un email de vérification a été envoyé à votre adresse email. Veuillez vérifier votre adresse email en cliquant sur le lien dans l\'email.',
'auth.email-verification.success.title': 'Email vérifié',
'auth.email-verification.success.description': 'Votre email a été vérifié avec succès. Vous pouvez maintenant vous connecter à votre compte.',
'auth.email-verification.success.login': 'Aller à la connexion',
'auth.email-verification.error.title': 'Échec de la vérification',
'auth.email-verification.error.description': 'Le lien de vérification est invalide ou a expiré. Veuillez demander un nouvel email de vérification en vous connectant.',
'auth.email-verification.error.back': 'Retour à la connexion',
'auth.legal-links.description': 'En continuant, vous reconnaissez que vous comprenez et acceptez les {{ terms }} et {{ privacy }}.',
'auth.legal-links.terms': 'Conditions d\'utilisation',
'auth.legal-links.privacy': 'Politique de confidentialité',
'auth.no-auth-provider.title': 'Aucun fournisseur d\'authentification',
'auth.no-auth-provider.description': 'Il n\'y a pas de fournisseurs d\'authentification activés sur cette instance de Papra. Veuillez contacter l\'administrateur de cette instance pour les activer.',
// User settings
'user.settings.title': 'Paramètres de l\'utilisateur',
'user.settings.description': 'Gérez vos paramètres de compte ici.',
'user.settings.email.title': 'Adresse email',
'user.settings.email.description': 'Votre adresse email ne peut pas être modifiée.',
'user.settings.email.label': 'Adresse email',
'user.settings.name.title': 'Nom complet',
'user.settings.name.description': 'Votre nom complet est affiché aux autres membres de l\'organisation.',
'user.settings.name.label': 'Nom complet',
'user.settings.name.placeholder': 'Exemple: John Doe',
'user.settings.name.update': 'Mettre à jour le nom',
'user.settings.name.updated': 'Votre nom complet a été mis à jour',
'user.settings.logout.title': 'Déconnexion',
'user.settings.logout.description': 'Déconnectez-vous de votre compte. Vous pouvez vous reconnecter plus tard.',
'user.settings.logout.button': 'Déconnexion',
// Organizations
'organizations.list.title': 'Vos organisations',
'organizations.list.description': 'Les organisations sont un moyen de grouper vos documents et de gérer l\'accès à eux. Vous pouvez créer plusieurs organisations et inviter vos membres de l\'équipe à collaborer.',
'organizations.list.create-new': 'Créer une nouvelle organisation',
'organizations.list.back': 'Retour aux organisations',
'organizations.list.deleted.title': 'Organisations supprimées',
'organizations.list.deleted.description': 'Les organisations supprimées sont conservées pendant {{ days }} jours avant d\'être définitivement supprimées. Vous pouvez les restaurer pendant cette période.',
'organizations.list.deleted.empty': 'Aucune organisation supprimée',
'organizations.list.deleted.empty-description': 'Lorsque vous supprimez une organisation, elle apparaîtra ici pendant {{ days }} jours avant d\'être définitivement supprimée.',
'organizations.list.deleted.restore': 'Restaurer',
'organizations.list.deleted.restore-success': 'Organisation restaurée avec succès',
'organizations.list.deleted.restore-confirm.title': 'Restaurer l\'organisation',
'organizations.list.deleted.restore-confirm.message': 'Êtes-vous sûr de vouloir restaurer cette organisation ? Elle sera remise dans votre liste d\'organisations actives.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Restaurer l\'organisation',
'organizations.list.deleted.deleted-at': 'Supprimée le {{ date }}',
'organizations.list.deleted.purge-at': 'Sera définitivement supprimée le {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} jour, {daysUntilPurge} jours }} restant{{ daysUntilPurge, >1:s}})',
'organizations.details.no-documents.title': 'Aucun document',
'organizations.details.no-documents.description': 'Il n\'y a pas de documents dans cette organisation. Commencez par télécharger des documents.',
'organizations.details.upload-documents': 'Télécharger des documents',
'organizations.details.documents-count': 'documents en total',
'organizations.details.total-size': 'taille totale',
'organizations.details.latest-documents': 'Derniers documents importés',
'organizations.create.title': 'Créer une nouvelle organisation',
'organizations.create.description': 'Vos documents seront regroupés par organisation. Vous pouvez créer plusieurs organisations pour séparer vos documents, par exemple, pour les documents personnels et professionnels.',
'organizations.create.back': 'Retour',
'organizations.create.error.max-count-reached': 'Vous avez atteint le nombre maximum d\'organisations que vous pouvez créer, si vous avez besoin de créer plus, veuillez contacter le support.',
'organizations.create.form.name.label': 'Nom de l\'organisation',
'organizations.create.form.name.placeholder': 'Exemple: Acme Inc.',
'organizations.create.form.name.required': 'Veuillez entrer un nom pour l\'organisation',
'organizations.create.form.submit': 'Créer l\'organisation',
'organizations.create.success': 'Organisation créée avec succès',
'organizations.create-first.title': 'Créer votre organisation',
'organizations.create-first.description': 'Vos documents seront regroupés par organisation. Vous pouvez créer plusieurs organisations pour séparer vos documents, par exemple, pour les documents personnels et professionnels.',
'organizations.create-first.default-name': 'Mon organisation',
'organizations.create-first.user-name': '{{ name }}\'s organisation',
'organization.settings.title': 'Paramètres de l\'organisation',
'organization.settings.page.title': 'Paramètres de l\'organisation',
'organization.settings.page.description': 'Gérez les paramètres de votre organisation ici.',
'organization.settings.name.title': 'Nom de l\'organisation',
'organization.settings.name.update': 'Modifier le nom',
'organization.settings.name.placeholder': 'Exemple: Acme Inc.',
'organization.settings.name.updated': 'Nom de l\'organisation mis à jour',
'organization.settings.subscription.title': 'Subscription',
'organization.settings.subscription.description': 'Gérez votre facturation, vos factures et vos méthodes de paiement.',
'organization.settings.subscription.manage': 'Gérer la souscription',
'organization.settings.subscription.error': 'Échec de la récupération de l\'URL du portail client',
'organization.settings.delete.title': 'Supprimer l\'organisation',
'organization.settings.delete.description': 'Supprimer cette organisation supprimera définitivement toutes les données associées à elle.',
'organization.settings.delete.confirm.title': 'Supprimer l\'organisation',
'organization.settings.delete.confirm.message': 'Êtes-vous sûr de vouloir supprimer cette organisation ? L\'organisation sera marquée pour suppression et définitivement supprimée après {{ days }} jours. Pendant cette période, vous pouvez la restaurer depuis votre liste d\'organisations. Tous les documents et données seront définitivement supprimés après ce délai.',
'organization.settings.delete.confirm.confirm-button': 'Supprimer l\'organisation',
'organization.settings.delete.confirm.cancel-button': 'Annuler',
'organization.settings.delete.success': 'Organisation supprimée',
'organization.settings.delete.only-owner': 'Seul le propriétaire de l\'organisation peut supprimer cette organisation.',
'organization.settings.delete.has-active-subscription': 'Impossible de supprimer l\'organisation avec un abonnement actif, veuillez d\'abord annuler votre abonnement ci-dessus.',
'organization.usage.page.title': 'Utilisation',
'organization.usage.page.description': 'Consultez l\'utilisation actuelle et les limites de votre organisation.',
'organization.usage.storage.title': 'Stockage de documents',
'organization.usage.storage.description': 'Stockage total utilisé par vos documents',
'organization.usage.intake-emails.title': 'E-mails d\'ingestion',
'organization.usage.intake-emails.description': 'Nombre d\'adresses e-mail d\'ingestion',
'organization.usage.members.title': 'Membres',
'organization.usage.members.description': 'Nombre de membres dans l\'organisation',
'organization.usage.unlimited': 'Illimité',
'organizations.members.title': 'Membres',
'organizations.members.description': 'Gérez les membres de votre organisation.',
'organizations.members.invite-member': 'Inviter un membre',
'organizations.members.invite-member-disabled-tooltip': 'Seuls les administrateurs ou les propriétaires peuvent inviter des membres à l\'organisation',
'organizations.members.remove-from-organization': 'Retirer de l\'organisation',
'organizations.members.role': 'Rôle',
'organizations.members.roles.owner': 'Propriétaire',
'organizations.members.roles.admin': 'Admin',
'organizations.members.roles.member': 'Membre',
'organizations.members.delete.confirm.title': 'Retirer un membre',
'organizations.members.delete.confirm.message': 'Êtes-vous sûr de vouloir retirer ce membre de l\'organisation ?',
'organizations.members.delete.confirm.confirm-button': 'Retirer',
'organizations.members.delete.confirm.cancel-button': 'Annuler',
'organizations.members.delete.success': 'Membre retiré de l\'organisation',
'organizations.members.update-role.success': 'Rôle du membre mis à jour',
'organizations.members.table.headers.name': 'Nom',
'organizations.members.table.headers.email': 'Email',
'organizations.members.table.headers.role': 'Rôle',
'organizations.members.table.headers.created': 'Créé',
'organizations.members.table.headers.actions': 'Actions',
'organizations.invite-member.title': 'Inviter un membre',
'organizations.invite-member.description': 'Invite un membre à votre organisation',
'organizations.invite-member.form.email.label': 'Email',
'organizations.invite-member.form.email.placeholder': 'Exemple: ada@papra.app',
'organizations.invite-member.form.email.required': 'Veuillez entrer une adresse email valide',
'organizations.invite-member.form.role.label': 'Rôle',
'organizations.invite-member.form.submit': 'Inviter à l\'organisation',
'organizations.invite-member.success.message': 'Membre invité',
'organizations.invite-member.success.description': 'L\'email a été invité à l\'organisation.',
'organizations.invite-member.error.message': 'Échec de l\'invitation du membre',
'organizations.invitations.title': 'Invitations',
'organizations.invitations.description': 'Gérez les invitations de votre organisation.',
'organizations.invitations.list.cta': 'Inviter un membre',
'organizations.invitations.list.empty.title': 'Aucune invitation en attente',
'organizations.invitations.list.empty.description': 'Vous n\'avez pas été invité à aucune organisation.',
'organizations.invitations.status.pending': 'En attente',
'organizations.invitations.status.accepted': 'Accepté',
'organizations.invitations.status.rejected': 'Refusé',
'organizations.invitations.status.expired': 'Expiré',
'organizations.invitations.status.cancelled': 'Annulé',
'organizations.invitations.resend': 'Renvoyer l\'invitation',
'organizations.invitations.cancel.title': 'Annuler l\'invitation',
'organizations.invitations.cancel.description': 'Êtes-vous sûr de vouloir annuler cette invitation ?',
'organizations.invitations.cancel.confirm': 'Annuler l\'invitation',
'organizations.invitations.cancel.cancel': 'Annuler',
'organizations.invitations.resend.title': 'Renvoyer l\'invitation',
'organizations.invitations.resend.description': 'Êtes-vous sûr de vouloir renvoyer cette invitation ? Cela enverra un nouvel email à l\'invité.',
'organizations.invitations.resend.confirm': 'Renvoyer l\'invitation',
'organizations.invitations.resend.cancel': 'Annuler',
'invitations.list.title': 'Invitations',
'invitations.list.description': 'Gérez les invitations de votre organisation.',
'invitations.list.empty.title': 'Aucune invitation en attente',
'invitations.list.empty.description': 'Vous n\'avez pas été invité à aucune organisation.',
'invitations.list.headers.organization': 'Organisation',
'invitations.list.headers.status': 'Statut',
'invitations.list.headers.created': 'Créé',
'invitations.list.headers.actions': 'Actions',
'invitations.list.actions.accept': 'Accepter',
'invitations.list.actions.reject': 'Refuser',
'invitations.list.actions.accept.success.message': 'Invitation acceptée',
'invitations.list.actions.accept.success.description': 'L\'invitation a été acceptée.',
'invitations.list.actions.reject.success.message': 'Invitation refusée',
'invitations.list.actions.reject.success.description': 'L\'invitation a été refusée.',
// Documents
'documents.list.title': 'Documents',
'documents.list.no-documents.title': 'Aucun document',
'documents.list.no-documents.description': 'Il n\'y a pas de documents dans cette organisation. Commencez par télécharger des documents.',
'documents.list.no-results': 'Aucun document trouvé',
'documents.tabs.info': 'Info',
'documents.tabs.content': 'Contenu',
'documents.tabs.activity': 'Activité',
'documents.deleted.message': 'Ce document a été supprimé et sera supprimé définitivement dans {{ days }} jours.',
'documents.actions.download': 'Télécharger',
'documents.actions.open-in-new-tab': 'Ouvrir dans un nouvel onglet',
'documents.actions.restore': 'Restaurer',
'documents.actions.delete': 'Supprimer',
'documents.actions.edit': 'Modifier',
'documents.actions.cancel': 'Annuler',
'documents.actions.save': 'Enregistrer',
'documents.actions.saving': 'Enregistrement...',
'documents.content.alert': 'Le contenu du document est automatiquement extrait du document lors de l\'import. Il est uniquement utilisé pour la recherche et l\'indexation.',
'documents.content.empty-placeholder': 'Ce document n\'a pas de contenu extrait, vous pouvez le définir manuellement ici.',
'documents.info.id': 'ID',
'documents.info.name': 'Nom',
'documents.info.type': 'Type',
'documents.info.size': 'Taille',
'documents.info.created-at': 'Créé le',
'documents.info.updated-at': 'Mis à jour le',
'documents.info.never': 'Jamais',
'documents.rename.title': 'Renommer le document',
'documents.rename.form.name.label': 'Nom',
'documents.rename.form.name.placeholder': 'Exemple: Facture 2024',
'documents.rename.form.name.required': 'Veuillez entrer un nom pour le document',
'documents.rename.form.name.max-length': 'Le nom doit contenir moins de 255 caractères',
'documents.rename.form.submit': 'Renommer',
'documents.rename.success': 'Document renommé avec succès',
'documents.rename.cancel': 'Annuler',
'import-documents.title.error': '{{ count }} documents ont échoué',
'import-documents.title.success': '{{ count }} documents ont été importés',
'import-documents.title.pending': '{{ count }} / {{ total }} documents importés',
'import-documents.title.none': 'Importer des documents',
'import-documents.no-import-in-progress': 'Aucune importation de documents en cours',
'documents.deleted.title': 'Documents supprimés',
'documents.deleted.empty.title': 'Aucun document supprimé',
'documents.deleted.empty.description': 'Vous n\'avez pas de documents supprimés. Les documents supprimés seront déplacés dans la corbeille pour {{ days }} jours.',
'documents.deleted.retention-notice': 'Tous les documents supprimés sont stockés dans la corbeille pour {{ days }} jours. Passé ce délai, les documents seront supprimés définitivement, et vous ne pourrez plus les restaurer.',
'documents.deleted.deleted-at': 'Supprimé',
'documents.deleted.restoring': 'Restauration...',
'documents.deleted.deleting': 'Suppression...',
'documents.preview.unknown-file-type': 'Aucun aperçu disponible pour ce type de fichier',
'documents.preview.binary-file': 'Cela semble être un fichier binaire et ne peut pas être affiché en texte',
'trash.delete-all.button': 'Supprimer tous les documents',
'trash.delete-all.confirm.title': 'Supprimer définitivement tous les documents ?',
'trash.delete-all.confirm.description': 'Êtes-vous sûr de vouloir supprimer définitivement tous les documents de la corbeille ? Cette action est irréversible.',
'trash.delete-all.confirm.label': 'Supprimer',
'trash.delete-all.confirm.cancel': 'Annuler',
'trash.delete.button': 'Supprimer',
'trash.delete.confirm.title': 'Supprimer définitivement le document ?',
'trash.delete.confirm.description': 'Êtes-vous sûr de vouloir supprimer définitivement ce document de la corbeille ? Cette action est irréversible.',
'trash.delete.confirm.label': 'Supprimer',
'trash.delete.confirm.cancel': 'Annuler',
'trash.deleted.success.title': 'Document supprimé',
'trash.deleted.success.description': 'Le document a été supprimé définitivement.',
'activity.document.created': 'Le document a été créé',
'activity.document.updated.single': 'Le {{ field }} a été mis à jour',
'activity.document.updated.multiple': 'Les {{ fields }} ont été mis à jour',
'activity.document.updated': 'Le document a été mis à jour',
'activity.document.deleted': 'Le document a été supprimé',
'activity.document.restored': 'Le document a été restauré',
'activity.document.tagged': 'Le tag {{ tag }} a été ajouté',
'activity.document.untagged': 'Le tag {{ tag }} a été supprimé',
'activity.document.user.name': 'par {{ name }}',
'activity.load-more': 'Charger plus',
'activity.no-more-activities': 'Aucune activité pour ce document',
// Tags
'tags.no-tags.title': 'Aucun tag',
'tags.no-tags.description': 'Cette organisation n\'a pas de tags. Les tags sont utilisés pour catégoriser les documents. Vous pouvez ajouter des tags à vos documents pour les rendre plus faciles à trouver et à organiser.',
'tags.no-tags.create-tag': 'Créer un tag',
'tags.title': 'Tags de documents',
'tags.description': 'Les tags sont utilisés pour catégoriser les documents. Vous pouvez ajouter des tags à vos documents pour les rendre plus faciles à trouver et à organiser.',
'tags.create': 'Créer un tag',
'tags.update': 'Mettre à jour un tag',
'tags.delete': 'Supprimer un tag',
'tags.delete.confirm.title': 'Supprimer un tag',
'tags.delete.confirm.message': 'Êtes-vous sûr de vouloir supprimer ce tag ? Supprimer un tag supprimera toutes les règles de catégorisation qui l\'utilisent.',
'tags.delete.confirm.confirm-button': 'Supprimer',
'tags.delete.confirm.cancel-button': 'Annuler',
'tags.delete.success': 'Tag supprimé avec succès',
'tags.create.success': 'Tag "{{ name }}" créé avec succès.',
'tags.update.success': 'Tag "{{ name }}" mis à jour avec succès.',
'tags.form.name.label': 'Nom',
'tags.form.name.placeholder': 'Exemple: Contrats',
'tags.form.name.required': 'Veuillez entrer un nom pour le tag',
'tags.form.name.max-length': 'Le nom du tag doit contenir moins de 64 caractères',
'tags.form.color.label': 'Couleur',
'tags.form.color.required': 'Veuillez entrer une couleur',
'tags.form.color.invalid': 'La couleur hexadécimale est mal formatée.',
'tags.form.description.label': 'Description',
'tags.form.description.optional': '(optionnel)',
'tags.form.description.placeholder': 'Exemple: Tous les contrats signés par l\'entreprise',
'tags.form.description.max-length': 'La description doit contenir moins de 256 caractères',
'tags.form.no-description': 'Aucune description',
'tags.table.headers.tag': 'Tag',
'tags.table.headers.description': 'Description',
'tags.table.headers.documents': 'Documents',
'tags.table.headers.created': 'Date de création',
'tags.table.headers.actions': 'Actions',
// Tagging rules
'tagging-rules.field.name': 'le nom du document',
'tagging-rules.field.content': 'le contenu du document',
'tagging-rules.operator.equals': 'égal à',
'tagging-rules.operator.not-equals': 'différent de',
'tagging-rules.operator.contains': 'contient',
'tagging-rules.operator.not-contains': 'ne contient pas',
'tagging-rules.operator.starts-with': 'commence par',
'tagging-rules.operator.ends-with': 'finit par',
'tagging-rules.list.title': 'Règles de catégorisation',
'tagging-rules.list.description': 'Gérez vos règles de catégorisation, pour catégoriser automatiquement les documents en fonction de conditions que vous définissez.',
'tagging-rules.list.demo-warning': 'Note: Cette instance est une démo, les règles de catégorisation ne seront pas appliquées aux documents ajoutés.',
'tagging-rules.list.no-tagging-rules.title': 'Aucune règle de catégorisation',
'tagging-rules.list.no-tagging-rules.description': 'Créez une règle de catégorisation pour catégoriser automatiquement vos documents en fonction de conditions que vous définissez.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Créer une règle de catégorisation',
'tagging-rules.list.card.no-conditions': 'Aucune condition',
'tagging-rules.list.card.one-condition': '1 condition',
'tagging-rules.list.card.conditions': '{{ count }} conditions',
'tagging-rules.list.card.delete': 'Supprimer la règle',
'tagging-rules.list.card.edit': 'Modifier la règle',
'tagging-rules.create.title': 'Créer une règle de catégorisation',
'tagging-rules.create.success': 'Règle de catégorisation créée avec succès',
'tagging-rules.create.error': 'Échec de la création de la règle de catégorisation',
'tagging-rules.create.submit': 'Créer la règle',
'tagging-rules.form.name.label': 'Nom',
'tagging-rules.form.name.placeholder': 'Exemple: Catégoriser les factures',
'tagging-rules.form.name.min-length': 'Veuillez entrer un nom pour la règle',
'tagging-rules.form.name.max-length': 'Le nom doit contenir moins de 64 caractères',
'tagging-rules.form.description.label': 'Description',
'tagging-rules.form.description.placeholder': 'Exemple: Catégoriser les documents avec \'facture\' dans le nom',
'tagging-rules.form.description.max-length': 'La description doit contenir moins de 256 caractères',
'tagging-rules.form.conditions.label': 'Conditions',
'tagging-rules.form.conditions.description': 'Définissez les conditions que doivent remplir la règle pour qu\'elle s\'applique. Si aucune condition n\'est définie, la règle s\'appliquera à tous les documents.',
'tagging-rules.form.conditions.add-condition': 'Ajouter une condition',
'tagging-rules.form.conditions.connector.when': 'Quand',
'tagging-rules.form.conditions.connector.and': 'et que',
'tagging-rules.form.conditions.connector.or': 'ou que',
'tagging-rules.condition-match-mode.all': 'Toutes les conditions doivent correspondre',
'tagging-rules.condition-match-mode.any': 'Au moins une condition doit correspondre',
'tagging-rules.form.conditions.no-conditions.title': 'Aucune condition',
'tagging-rules.form.conditions.no-conditions.description': 'Vous n\'avez pas ajouté de conditions à cette règle. Cette règle appliquera ses tags à tous les documents.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Appliquer la règle sans conditions',
'tagging-rules.form.conditions.no-conditions.cancel': 'Annuler',
'tagging-rules.form.conditions.value.placeholder': 'Exemple: facture',
'tagging-rules.form.conditions.value.min-length': 'Veuillez entrer une valeur pour la condition',
'tagging-rules.form.tags.label': 'Tags',
'tagging-rules.form.tags.description': 'Sélectionnez les tags à appliquer aux documents ajoutés qui correspondent aux conditions',
'tagging-rules.form.tags.min-length': 'Au moins un tag à appliquer est requis',
'tagging-rules.form.tags.add-tag': 'Créer un tag',
'tagging-rules.form.submit': 'Créer la règle',
'tagging-rules.update.title': 'Mettre à jour la règle de catégorisation',
'tagging-rules.update.error': 'Échec de la mise à jour de la règle de catégorisation',
'tagging-rules.update.submit': 'Mettre à jour la règle',
'tagging-rules.update.cancel': 'Annuler',
'tagging-rules.apply.button': 'Appliquer aux documents existants',
'tagging-rules.apply.confirm.title': 'Appliquer la règle aux documents existants ?',
'tagging-rules.apply.confirm.description': 'Cela vérifiera tous les documents existants dans votre organisation et appliquera les tags où les conditions correspondent. Le traitement se fera en arrière-plan.',
'tagging-rules.apply.confirm.button': 'Appliquer la règle',
'tagging-rules.apply.success': 'Application de la règle démarrée en arrière-plan',
'tagging-rules.apply.error': 'Échec du démarrage de l\'application de la règle',
'tagging-rules.apply.processing': 'Démarrage...',
// Intake emails
'intake-emails.title': 'Adresses de réception',
'intake-emails.description': 'Les adresses de réception sont utilisées pour ingérer automatiquement les emails dans Papra. Il suffit de les envoyer à l\'adresse de réception et leurs pièces jointes seront ajoutées à vos documents.',
'intake-emails.disabled.title': 'Les adresses de réception sont désactivées',
'intake-emails.disabled.description': 'Les adresses de réception sont désactivées sur cette instance. Veuillez contacter votre administrateur pour les activer. Voir la {{ documentation }} pour plus d\'informations.',
'intake-emails.disabled.documentation': 'documentation',
'intake-emails.info': 'Seules les adresses de réception activées depuis les origines autorisées seront traitées. Vous pouvez activer ou désactiver une adresse de réception à tout moment.',
'intake-emails.empty.title': 'Aucune adresse de réception',
'intake-emails.empty.description': 'Générez une adresse de réception pour ingérer facilement les pièces jointes des emails.',
'intake-emails.empty.generate': 'Générer une adresse de réception',
'intake-emails.count': '{{ count }} intake email{{ plural }} for this organization',
'intake-emails.new': 'Nouvelle adresse de réception',
'intake-emails.disabled-label': '(Désactivé)',
'intake-emails.no-origins': 'Aucune adresse de réception autorisée',
'intake-emails.allowed-origins': 'Autorisées depuis {{ count }} adresse{{ plural }}',
'intake-emails.actions.enable': 'Activer',
'intake-emails.actions.disable': 'Désactiver',
'intake-emails.actions.manage-origins': 'Gérer les adresses d\'origine',
'intake-emails.actions.delete': 'Supprimer',
'intake-emails.delete.confirm.title': 'Supprimer l\'adresse de réception ?',
'intake-emails.delete.confirm.message': 'Êtes-vous sûr de vouloir supprimer cette adresse de réception ? Cette action est irréversible.',
'intake-emails.delete.confirm.confirm-button': 'Supprimer l\'adresse de réception',
'intake-emails.delete.confirm.cancel-button': 'Annuler',
'intake-emails.delete.success': 'Adresse de réception supprimée',
'intake-emails.create.success': 'Adresse de réception créée',
'intake-emails.update.success.enabled': 'Adresse de réception activée',
'intake-emails.update.success.disabled': 'Adresse de réception désactivée',
'intake-emails.allowed-origins.title': 'Adresses d\'origine autorisées',
'intake-emails.allowed-origins.description': 'Seuls les emails envoyés à {{ email }} depuis ces adresses d\'origine seront traités. Si aucune adresse d\'origine n\'est spécifiée, tous les emails seront rejetés.',
'intake-emails.allowed-origins.add.label': 'Ajouter une adresse d\'origine autorisée',
'intake-emails.allowed-origins.add.placeholder': 'Exemple: ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Ajouter',
'intake-emails.allowed-origins.add.error.exists': 'Cette adresse email est déjà dans les adresses d\'origine autorisées pour cette adresse de réception',
// API keys
'api-keys.permissions.select-all': 'Tout sélectionner',
'api-keys.permissions.deselect-all': 'Tout désélectionner',
'api-keys.permissions.organizations.title': 'Organisations',
'api-keys.permissions.organizations.organizations:create': 'Créer des organisations',
'api-keys.permissions.organizations.organizations:read': 'Lire des organisations',
'api-keys.permissions.organizations.organizations:update': 'Mettre à jour des organisations',
'api-keys.permissions.organizations.organizations:delete': 'Supprimer des organisations',
'api-keys.permissions.documents.title': 'Documents',
'api-keys.permissions.documents.documents:create': 'Créer des documents',
'api-keys.permissions.documents.documents:read': 'Lire des documents',
'api-keys.permissions.documents.documents:update': 'Mettre à jour des documents',
'api-keys.permissions.documents.documents:delete': 'Supprimer des documents',
'api-keys.permissions.tags.title': 'Tags',
'api-keys.permissions.tags.tags:create': 'Créer des tags',
'api-keys.permissions.tags.tags:read': 'Lire des tags',
'api-keys.permissions.tags.tags:update': 'Mettre à jour des tags',
'api-keys.permissions.tags.tags:delete': 'Supprimer des tags',
'api-keys.create.title': 'Créer une clé API',
'api-keys.create.description': 'Créer une nouvelle clé API pour accéder à l\'API de Papra.',
'api-keys.create.success': 'La clé API a été créée avec succès.',
'api-keys.create.back': 'Retour aux clés API',
'api-keys.create.form.name.label': 'Nom',
'api-keys.create.form.name.placeholder': 'Exemple: Ma clé API',
'api-keys.create.form.name.required': 'Veuillez entrer un nom pour la clé API',
'api-keys.create.form.permissions.label': 'Permissions',
'api-keys.create.form.permissions.required': 'Veuillez sélectionner au moins une permission',
'api-keys.create.form.submit': 'Créer la clé API',
'api-keys.create.created.title': 'Clé API créée',
'api-keys.create.created.description': 'La clé API a été créée avec succès. Enregistrez-la dans un endroit sûr car elle ne sera plus affichée.',
'api-keys.list.title': 'Clés API',
'api-keys.list.description': 'Gérez vos clés API ici.',
'api-keys.list.create': 'Créer une clé API',
'api-keys.list.empty.title': 'Aucune clé API',
'api-keys.list.empty.description': 'Créez une clé API pour accéder à l\'API de Papra.',
'api-keys.list.card.last-used': 'Dernière utilisation',
'api-keys.list.card.never': 'Jamais',
'api-keys.list.card.created': 'Créée',
'api-keys.delete.success': 'La clé API a été supprimée avec succès',
'api-keys.delete.confirm.title': 'Supprimer la clé API',
'api-keys.delete.confirm.message': 'Êtes-vous sûr de vouloir supprimer cette clé API ? Cette action est irréversible.',
'api-keys.delete.confirm.confirm-button': 'Supprimer',
'api-keys.delete.confirm.cancel-button': 'Annuler',
// Webhooks
'webhooks.list.title': 'Webhooks',
'webhooks.list.description': 'Gérez vos webhooks ici.',
'webhooks.list.empty.title': 'Aucun webhook',
'webhooks.list.empty.description': 'Créez votre premier webhook pour commencer à recevoir des événements.',
'webhooks.list.create': 'Créer un webhook',
'webhooks.list.card.last-triggered': 'Dernière invocation',
'webhooks.list.card.never': 'Jamais',
'webhooks.list.card.created': 'Créée',
'webhooks.create.title': 'Créer un webhook',
'webhooks.create.description': 'Créez un webhook pour recevoir des événements lorsque des documents sont ajoutés à votre organisation.',
'webhooks.create.success': 'Le webhook a été créé avec succès.',
'webhooks.create.back': 'Retour aux webhooks',
'webhooks.create.form.submit': 'Créer le webhook',
'webhooks.create.form.name.label': 'Nom du webhook',
'webhooks.create.form.name.placeholder': 'Entrez le nom du webhook',
'webhooks.create.form.name.required': 'Le nom est requis',
'webhooks.create.form.url.label': 'URL du webhook',
'webhooks.create.form.url.placeholder': 'Entrez l\'URL du webhook',
'webhooks.create.form.url.required': 'L\'URL est requise',
'webhooks.create.form.url.invalid': 'L\'URL est invalide',
'webhooks.create.form.secret.label': 'Secret',
'webhooks.create.form.secret.placeholder': 'Entrez le secret du webhook',
'webhooks.create.form.events.label': 'Événements',
'webhooks.create.form.events.required': 'Au moins un événement est requis',
'webhooks.update.title': 'Modifier le webhook',
'webhooks.update.description': 'Mettez à jour les détails de votre webhook',
'webhooks.update.success': 'Le webhook a été mis à jour avec succès',
'webhooks.update.submit': 'Mettre à jour le webhook',
'webhooks.update.cancel': 'Annuler',
'webhooks.update.form.secret.placeholder': 'Entrez un nouveau secret',
'webhooks.update.form.secret.placeholder-redacted': '[Secret masqué]',
'webhooks.update.form.rotate-secret.button': 'Rotation du secret',
'webhooks.delete.success': 'Le webhook a été supprimé avec succès',
'webhooks.delete.confirm.title': 'Supprimer le webhook',
'webhooks.delete.confirm.message': 'Êtes-vous sûr de vouloir supprimer ce webhook ? Cette action est irréversible.',
'webhooks.delete.confirm.confirm-button': 'Supprimer',
'webhooks.delete.confirm.cancel-button': 'Annuler',
'webhooks.events.documents.title': 'Événements de documents',
'webhooks.events.documents.document:created.description': 'Document créé',
'webhooks.events.documents.document:deleted.description': 'Document supprimé',
'webhooks.events.documents.document:updated.description': 'Document mis à jour',
'webhooks.events.documents.document:tag:added.description': 'Un tag est ajouté à un document',
'webhooks.events.documents.document:tag:removed.description': 'Un tag est retiré d\'un document',
// Navigation
'layout.menu.home': 'Accueil',
'layout.menu.documents': 'Documents',
'layout.menu.tags': 'Tags',
'layout.menu.tagging-rules': 'Règles de catégorisation',
'layout.menu.deleted-documents': 'Documents supprimés',
'layout.menu.organization-settings': 'Paramètres',
'layout.menu.api-keys': 'API keys',
'layout.menu.settings': 'Paramètres',
'layout.menu.account': 'Compte',
'layout.menu.general-settings': 'Paramètres généraux',
'layout.menu.usage': 'Utilisation',
'layout.menu.intake-emails': 'Adresses de réception',
'layout.menu.webhooks': 'Webhooks',
'layout.menu.members': 'Membres',
'layout.menu.invitations': 'Invitations',
'layout.upgrade-cta.title': 'Besoin de plus d\'espace ?',
'layout.upgrade-cta.description': 'Obtenez 10x plus de stockage + collaboration d\'équipe',
'layout.upgrade-cta.button': 'Mettre à niveau maintenant',
'layout.theme.light': 'Mode clair',
'layout.theme.dark': 'Mode sombre',
'layout.theme.system': 'Mode système',
'layout.search.placeholder': 'Rechercher...',
'layout.menu.import-document': 'Importer un document',
'user-menu.account-settings': 'Paramètres du compte',
'user-menu.api-keys': 'Clés d\'API',
'user-menu.invitations': 'Invitations',
'user-menu.language': 'Langue',
'user-menu.logout': 'Déconnexion',
// Command palette
'command-palette.search.placeholder': 'Rechercher des commandes ou des documents',
'command-palette.no-results': 'Aucun résultat trouvé',
'command-palette.sections.documents': 'Documents',
'command-palette.sections.theme': 'Thème',
// API errors
'api-errors.document.already_exists': 'Le document existe déjà',
'api-errors.document.size_too_large': 'Le fichier est trop volumineux',
'api-errors.intake-emails.already_exists': 'Un email de réception avec cette adresse existe déjà.',
'api-errors.intake_email.limit_reached': 'Le nombre maximum d\'emails de réception pour cette organisation a été atteint. Veuillez mettre à niveau votre plan pour créer plus d\'emails de réception.',
'api-errors.user.max_organization_count_reached': 'Vous avez atteint le nombre maximum d\'organisations que vous pouvez créer, si vous avez besoin de créer plus, veuillez contacter le support.',
'api-errors.default': 'Une erreur est survenue lors du traitement de votre requête.',
'api-errors.organization.invitation_already_exists': 'Une invitation pour cet email existe déjà dans cette organisation.',
'api-errors.user.already_in_organization': 'Cet utilisateur est déjà dans cette organisation.',
'api-errors.user.organization_invitation_limit_reached': 'Le nombre maximum d\'invitations a été atteint pour aujourd\'hui. Veuillez réessayer demain.',
'api-errors.demo.not_available': 'Cette fonctionnalité n\'est pas disponible dans la démo',
'api-errors.tags.already_exists': 'Un tag avec ce nom existe déjà pour cette organisation',
'api-errors.internal.error': 'Une erreur est survenue lors du traitement de votre requête. Veuillez réessayer.',
'api-errors.auth.invalid_origin': 'Origine de l\'application invalide. Si vous hébergez Papra, assurez-vous que la variable d\'environnement APP_BASE_URL correspond à votre URL actuelle. Pour plus de détails, consultez https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'Le nombre maximum de membres et d\'invitations en attente pour cette organisation a été atteint. Veuillez mettre à niveau votre plan pour ajouter plus de membres.',
'api-errors.organization.has_active_subscription': 'Impossible de supprimer l\'organisation avec un abonnement actif. Veuillez d\'abord annuler votre abonnement en utilisant le bouton Gérer l\'abonnement ci-dessus.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Utilisateur introuvable',
'api-errors.FAILED_TO_CREATE_USER': 'Échec de la création de l\'utilisateur',
'api-errors.FAILED_TO_CREATE_SESSION': 'Échec de la création de la session',
'api-errors.FAILED_TO_UPDATE_USER': 'Échec de la mise à jour de l\'utilisateur',
'api-errors.FAILED_TO_GET_SESSION': 'Échec de la récupération de la session',
'api-errors.INVALID_PASSWORD': 'Mot de passe invalide',
'api-errors.INVALID_EMAIL': 'Email invalide',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'L\'email ou le mot de passe est incorrect, ou le compte n\'existe pas.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Compte social déjà associé',
'api-errors.PROVIDER_NOT_FOUND': 'Fournisseur introuvable',
'api-errors.INVALID_TOKEN': 'Jeton invalide',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Jeton d\'identité non pris en charge',
'api-errors.FAILED_TO_GET_USER_INFO': 'Échec de la récupération des informations utilisateur',
'api-errors.USER_EMAIL_NOT_FOUND': 'Email de l\'utilisateur introuvable',
'api-errors.EMAIL_NOT_VERIFIED': 'Email non vérifié',
'api-errors.PASSWORD_TOO_SHORT': 'Mot de passe trop court',
'api-errors.PASSWORD_TOO_LONG': 'Mot de passe trop long',
'api-errors.USER_ALREADY_EXISTS': 'Un utilisateur avec cet email existe déjà',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'L\'email ne peut pas être modifié',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Compte d\'identification introuvable',
'api-errors.SESSION_EXPIRED': 'Session expirée',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Échec de la dissociation du dernier compte',
'api-errors.ACCOUNT_NOT_FOUND': 'Compte introuvable',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'L\'utilisateur a déjà un mot de passe',
// Not found
'not-found.title': '404 - Not Found',
'not-found.description': 'Désolé, la page que vous cherchez n\'existe pas. Veuillez vérifier l\'URL et réessayer.',
'not-found.back-to-home': 'Retour à l\'accueil',
// Demo
'demo.popup.description': 'Cette instance est une démo, toutes les données sont sauvegardées dans le stockage local de votre navigateur.',
'demo.popup.discord': 'Rejoignez le {{ discordLink }} pour obtenir de l\'aide, proposer des fonctionnalités ou simplement discuter.',
'demo.popup.discord-link-label': 'Serveur Discord',
'demo.popup.reset': 'Réinitialiser la démo',
'demo.popup.hide': 'Masquer',
// Color picker
'color-picker.hue': 'Teinte',
'color-picker.saturation': 'Saturation',
'color-picker.lightness': 'Luminosité',
'color-picker.select-color': 'Sélectionner la couleur',
'color-picker.select-a-color': 'Sélectionner une couleur',
// Subscriptions
'subscriptions.checkout-success.title': 'Paiement réussi !',
'subscriptions.checkout-success.description': 'Votre abonnement a été activé avec succès.',
'subscriptions.checkout-success.thank-you': 'Merci d\'avoir mis à niveau vers Papra Plus. Vous avez maintenant accès à toutes les fonctionnalités premium.',
'subscriptions.checkout-success.go-to-organizations': 'Aller aux Organisations',
'subscriptions.checkout-success.redirecting': 'Redirection dans {{ count }} seconde{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Paiement annulé',
'subscriptions.checkout-cancel.description': 'Votre mise à niveau d\'abonnement a été annulée.',
'subscriptions.checkout-cancel.no-charges': 'Aucun frais n\'a été prélevé sur votre compte. Vous pouvez réessayer à tout moment.',
'subscriptions.checkout-cancel.back-to-organizations': 'Retour aux Organisations',
'subscriptions.checkout-cancel.need-help': 'Besoin d\'aide ?',
'subscriptions.checkout-cancel.contact-support': 'Contacter le support',
'subscriptions.upgrade-dialog.title': 'Mettre à niveau cette organisation',
'subscriptions.upgrade-dialog.description': 'Débloquez des fonctionnalités puissantes pour votre organisation',
'subscriptions.upgrade-dialog.contact-us': 'Contactez-nous',
'subscriptions.upgrade-dialog.enterprise-plans': 'si vous avez besoin de plans d\'entreprise personnalisés.',
'subscriptions.upgrade-dialog.current-plan': 'Plan actuel',
'subscriptions.upgrade-dialog.recommended': 'Recommandé',
'subscriptions.upgrade-dialog.per-month': '/mois',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} facturé annuellement',
'subscriptions.upgrade-dialog.upgrade-now': 'Mettre à niveau',
'subscriptions.upgrade-dialog.promo-banner.title': 'Offre à durée limitée',
'subscriptions.upgrade-dialog.promo-banner.description': 'Bénéficiez de {{ percent }}% de réduction à vie par organisation sur tous les forfaits en tant qu\'early adopter ! L\'offre expire dans {{ days, >1:{days} jours, =1:1 jour, moins d\'un jour }}.',
'subscriptions.plan.free.name': 'Plan gratuit',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Taille de stockage de documents',
'subscriptions.features.members': 'Membres de l\'organisation',
'subscriptions.features.members-count': '{{ count }} membres',
'subscriptions.features.email-intakes': 'Emails de réception',
'subscriptions.features.email-intakes-count-singular': '{{ count }} adresse',
'subscriptions.features.email-intakes-count-plural': '{{ count }} adresses',
'subscriptions.features.max-upload-size': 'Taille maximale de téléchargement',
'subscriptions.features.support': 'Support',
'subscriptions.features.support-community': 'Support communautaire',
'subscriptions.features.support-email': 'Support par email',
'subscriptions.features.support-priority': 'Support prioritaire',
'subscriptions.billing-interval.monthly': 'Mensuel',
'subscriptions.billing-interval.annual': 'Annuel',
'subscriptions.usage-warning.message': 'Vous avez utilisé {{ percent }}% de votre stockage de documents. Envisagez de mettre à niveau votre plan pour obtenir plus d\'espace.',
'subscriptions.usage-warning.upgrade-button': 'Mettre à niveau',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Saisissez "{{ text }}" pour confirmer',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Réinitialiser votre mot de passe
auth.request-password-reset.description: Entrez votre email pour réinitialiser votre mot de passe.
auth.request-password-reset.requested: Si un compte existe pour cet email, nous vous avons envoyé un email pour réinitialiser votre mot de passe.
auth.request-password-reset.back-to-login: Retour à la connexion
auth.request-password-reset.form.email.label: Email
auth.request-password-reset.form.email.placeholder: 'Exemple: ada@papra.app'
auth.request-password-reset.form.email.required: Veuillez entrer votre adresse email
auth.request-password-reset.form.email.invalid: Cette adresse email est invalide
auth.request-password-reset.form.submit: Réinitialiser le mot de passe
auth.reset-password.title: Réinitialiser votre mot de passe
auth.reset-password.description: Entrez votre nouveau mot de passe pour réinitialiser votre mot de passe.
auth.reset-password.reset: Votre mot de passe a été réinitialisé.
auth.reset-password.back-to-login: Retour à la connexion
auth.reset-password.form.new-password.label: Nouveau mot de passe
auth.reset-password.form.new-password.placeholder: 'Exemple: **********'
auth.reset-password.form.new-password.required: Veuillez entrer votre nouveau mot de passe
auth.reset-password.form.new-password.min-length: Le mot de passe doit contenir au moins {{ minLength }} caractères
auth.reset-password.form.new-password.max-length: Le mot de passe doit contenir moins de {{ maxLength }} caractères
auth.reset-password.form.submit: Réinitialiser le mot de passe
auth.email-provider.open: Ouvrir {{ provider }}
auth.login.title: Connexion à Papra
auth.login.description: Entrez votre email ou utilisez une connexion sociale pour accéder à votre compte Papra.
auth.login.login-with-provider: Connexion avec {{ provider }}
auth.login.no-account: Je n'ai pas de compte
auth.login.register: S'inscrire
auth.login.form.email.label: Email
auth.login.form.email.placeholder: 'Exemple: ada@papra.app'
auth.login.form.email.required: Veuillez entrer votre adresse email
auth.login.form.email.invalid: Cette adresse email est invalide
auth.login.form.password.label: Mot de passe
auth.login.form.password.placeholder: Définir un mot de passe
auth.login.form.password.required: Veuillez entrer votre mot de passe
auth.login.form.remember-me.label: Se souvenir de moi
auth.login.form.forgot-password.label: Mot de passe oublié ?
auth.login.form.submit: Connexion
auth.register.title: S'inscrire à Papra
auth.register.description: Créez un compte pour commencer à utiliser Papra.
auth.register.register-with-email: S'inscrire avec email
auth.register.register-with-provider: S'inscrire avec {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Je possède déjà un compte
auth.register.login: Connexion
auth.register.registration-disabled.title: Inscription désactivée
auth.register.registration-disabled.description: La création de nouveaux comptes est actuellement désactivée sur cette instance de Papra. Seuls les utilisateurs avec un compte existant peuvent se connecter. Si vous pensez que c'est une erreur, veuillez contacter l'administrateur de cette instance.
auth.register.form.email.label: Email
auth.register.form.email.placeholder: 'Exemple: ada@papra.app'
auth.register.form.email.required: Veuillez entrer votre adresse email
auth.register.form.email.invalid: Cette adresse email est invalide
auth.register.form.password.label: Mot de passe
auth.register.form.password.placeholder: Définir un mot de passe
auth.register.form.password.required: Veuillez entrer votre mot de passe
auth.register.form.password.min-length: Le mot de passe doit contenir au moins {{ minLength }} caractères
auth.register.form.password.max-length: Le mot de passe doit contenir moins de {{ maxLength }} caractères
auth.register.form.name.label: Nom
auth.register.form.name.placeholder: 'Exemple: Ada Lovelace'
auth.register.form.name.required: Veuillez entrer votre nom
auth.register.form.name.max-length: Le nom doit contenir moins de {{ maxLength }} caractères
auth.register.form.submit: S'inscrire
auth.email-validation-required.title: Vérifier votre email
auth.email-validation-required.description: Un email de vérification a été envoyé à votre adresse email. Veuillez vérifier votre adresse email en cliquant sur le lien dans l'email.
auth.legal-links.description: En continuant, vous reconnaissez que vous comprenez et acceptez les {{ terms }} et {{ privacy }}.
auth.legal-links.terms: Conditions d'utilisation
auth.legal-links.privacy: Politique de confidentialité
auth.no-auth-provider.title: Aucun fournisseur d'authentification
auth.no-auth-provider.description: Il n'y a pas de fournisseurs d'authentification activés sur cette instance de Papra. Veuillez contacter l'administrateur de cette instance pour les activer.
# User settings
user.settings.title: Paramètres de l'utilisateur
user.settings.description: Gérez vos paramètres de compte ici.
user.settings.email.title: Adresse email
user.settings.email.description: Votre adresse email ne peut pas être modifiée.
user.settings.email.label: Adresse email
user.settings.name.title: Nom complet
user.settings.name.description: Votre nom complet est affiché aux autres membres de l'organisation.
user.settings.name.label: Nom complet
user.settings.name.placeholder: 'Exemple: John Doe'
user.settings.name.update: Mettre à jour le nom
user.settings.name.updated: Votre nom complet a été mis à jour
user.settings.logout.title: Déconnexion
user.settings.logout.description: Déconnectez-vous de votre compte. Vous pouvez vous reconnecter plus tard.
user.settings.logout.button: Déconnexion
# Organizations
organizations.list.title: Vos organisations
organizations.list.description: Les organisations sont un moyen de grouper vos documents et de gérer l'accès à eux. Vous pouvez créer plusieurs organisations et inviter vos membres de l'équipe à collaborer.
organizations.list.create-new: Créer une nouvelle organisation
organizations.details.no-documents.title: Aucun document
organizations.details.no-documents.description: Il n'y a pas de documents dans cette organisation. Commencez par télécharger des documents.
organizations.details.upload-documents: Télécharger des documents
organizations.details.documents-count: documents en total
organizations.details.total-size: taille totale
organizations.details.latest-documents: Derniers documents importés
organizations.create.title: Créer une nouvelle organisation
organizations.create.description: Vos documents seront regroupés par organisation. Vous pouvez créer plusieurs organisations pour séparer vos documents, par exemple, pour les documents personnels et professionnels.
organizations.create.back: Retour
organizations.create.error.max-count-reached: Vous avez atteint le nombre maximum d'organisations que vous pouvez créer, si vous avez besoin de créer plus, veuillez contacter le support.
organizations.create.form.name.label: Nom de l'organisation
organizations.create.form.name.placeholder: 'Exemple: Acme Inc.'
organizations.create.form.name.required: Veuillez entrer un nom pour l'organisation
organizations.create.form.submit: Créer l'organisation
organizations.create.success: Organisation créée avec succès
organizations.create-first.title: Créer votre organisation
organizations.create-first.description: Vos documents seront regroupés par organisation. Vous pouvez créer plusieurs organisations pour séparer vos documents, par exemple, pour les documents personnels et professionnels.
organizations.create-first.default-name: Mon organisation
organizations.create-first.user-name: "{{ name }}'s organisation"
organization.settings.title: Paramètres de l'organisation
organization.settings.page.title: Paramètres de l'organisation
organization.settings.page.description: Gérez les paramètres de votre organisation ici.
organization.settings.name.title: Nom de l'organisation
organization.settings.name.update: Modifier le nom
organization.settings.name.placeholder: 'Exemple: Acme Inc.'
organization.settings.name.updated: Nom de l'organisation mis à jour
organization.settings.subscription.title: Subscription
organization.settings.subscription.description: Gérez votre facturation, vos factures et vos méthodes de paiement.
organization.settings.subscription.manage: Gérer la souscription
organization.settings.subscription.error: Échec de la récupération de l'URL du portail client
organization.settings.delete.title: Supprimer l'organisation
organization.settings.delete.description: Supprimer cette organisation supprimera définitivement toutes les données associées à elle.
organization.settings.delete.confirm.title: Supprimer l'organisation
organization.settings.delete.confirm.message: Êtes-vous sûr de vouloir supprimer cette organisation ? Cette action est irréversible, et toutes les données associées à cette organisation seront supprimées définitivement.
organization.settings.delete.confirm.confirm-button: Supprimer l'organisation
organization.settings.delete.confirm.cancel-button: Annuler
organization.settings.delete.success: Organisation supprimée
organizations.members.title: Membres
organizations.members.description: Gérez les membres de votre organisation.
organizations.members.invite-member: Inviter un membre
organizations.members.invite-member-disabled-tooltip: Seuls les administrateurs ou les propriétaires peuvent inviter des membres à l'organisation
organizations.members.remove-from-organization: Retirer de l'organisation
organizations.members.role: Rôle
organizations.members.roles.owner: Propriétaire
organizations.members.roles.admin: Admin
organizations.members.roles.member: Membre
organizations.members.delete.confirm.title: Retirer un membre
organizations.members.delete.confirm.message: Êtes-vous sûr de vouloir retirer ce membre de l'organisation ?
organizations.members.delete.confirm.confirm-button: Retirer
organizations.members.delete.confirm.cancel-button: Annuler
organizations.members.delete.success: Membre retiré de l'organisation
organizations.members.update-role.success: Rôle du membre mis à jour
organizations.members.table.headers.name: Nom
organizations.members.table.headers.email: Email
organizations.members.table.headers.role: Rôle
# organizations.members.table.headers.created: Created
organizations.members.table.headers.actions: Actions
organizations.invite-member.title: Inviter un membre
organizations.invite-member.description: Invite un membre à votre organisation
organizations.invite-member.form.email.label: Email
organizations.invite-member.form.email.placeholder: 'Exemple: ada@papra.app'
organizations.invite-member.form.email.required: Veuillez entrer une adresse email valide
organizations.invite-member.form.role.label: Rôle
organizations.invite-member.form.submit: Inviter à l'organisation
organizations.invite-member.success.message: Membre invité
organizations.invite-member.success.description: L'email a été invité à l'organisation.
organizations.invite-member.error.message: Échec de l'invitation du membre
organizations.invitations.title: Invitations
organizations.invitations.description: Gérez les invitations de votre organisation.
organizations.invitations.list.cta: Inviter un membre
organizations.invitations.list.empty.title: Aucune invitation en attente
organizations.invitations.list.empty.description: Vous n'avez pas été invité à aucune organisation.
organizations.invitations.status.pending: En attente
organizations.invitations.status.accepted: Accepté
organizations.invitations.status.rejected: Refusé
organizations.invitations.status.expired: Expiré
organizations.invitations.status.cancelled: Annulé
organizations.invitations.resend: Renvoyer l'invitation
organizations.invitations.cancel.title: Annuler l'invitation
organizations.invitations.cancel.description: Êtes-vous sûr de vouloir annuler cette invitation ?
organizations.invitations.cancel.confirm: Annuler l'invitation
organizations.invitations.cancel.cancel: Annuler
organizations.invitations.resend.title: Renvoyer l'invitation
organizations.invitations.resend.description: Êtes-vous sûr de vouloir renvoyer cette invitation ? Cela enverra un nouvel email à l'invité.
organizations.invitations.resend.confirm: Renvoyer l'invitation
organizations.invitations.resend.cancel: Annuler
invitations.list.title: Invitations
invitations.list.description: Gérez les invitations de votre organisation.
invitations.list.empty.title: Aucune invitation en attente
invitations.list.empty.description: Vous n'avez pas été invité à aucune organisation.
invitations.list.headers.organization: Organisation
# invitations.list.headers.status: Status
invitations.list.headers.created: Créé
invitations.list.headers.actions: Actions
invitations.list.actions.accept: Accepter
invitations.list.actions.reject: Refuser
invitations.list.actions.accept.success.message: Invitation acceptée
invitations.list.actions.accept.success.description: L'invitation a été acceptée.
invitations.list.actions.reject.success.message: Invitation refusée
invitations.list.actions.reject.success.description: L'invitation a été refusée.
# Documents
documents.list.title: Documents
documents.list.no-documents.title: Aucun document
documents.list.no-documents.description: Il n'y a pas de documents dans cette organisation. Commencez par télécharger des documents.
documents.list.no-results: Aucun document trouvé
documents.tabs.info: Info
documents.tabs.content: Contenu
documents.tabs.activity: Activité
documents.deleted.message: Ce document a été supprimé et sera supprimé définitivement dans {{ days }} jours.
documents.actions.download: Télécharger
documents.actions.open-in-new-tab: Ouvrir dans un nouvel onglet
documents.actions.restore: Restaurer
documents.actions.delete: Supprimer
documents.actions.edit: Modifier
documents.actions.cancel: Annuler
documents.actions.save: Enregistrer
documents.actions.saving: Enregistrement...
documents.content.alert: Le contenu du document est automatiquement extrait du document lors de l'import. Il est uniquement utilisé pour la recherche et l'indexation.
documents.info.id: ID
documents.info.name: Nom
documents.info.type: Type
documents.info.size: Taille
documents.info.created-at: Créé le
documents.info.updated-at: Mis à jour le
documents.info.never: Jamais
documents.rename.title: Renommer le document
documents.rename.form.name.label: Nom
documents.rename.form.name.placeholder: 'Exemple: Facture 2024'
documents.rename.form.name.required: Veuillez entrer un nom pour le document
documents.rename.form.name.max-length: Le nom doit contenir moins de 255 caractères
documents.rename.form.submit: Renommer
documents.rename.success: Document renommé avec succès
documents.rename.cancel: Annuler
import-documents.title.error: '{{ count }} documents ont échoué'
import-documents.title.success: '{{ count }} documents ont été importés'
import-documents.title.pending: '{{ count }} / {{ total }} documents importés'
import-documents.title.none: Importer des documents
import-documents.no-import-in-progress: Aucune importation de documents en cours
documents.deleted.title: Documents supprimés
documents.deleted.empty.title: Aucun document supprimé
documents.deleted.empty.description: Vous n'avez pas de documents supprimés. Les documents supprimés seront déplacés dans la corbeille pour {{ days }} jours.
documents.deleted.retention-notice: Tous les documents supprimés sont stockés dans la corbeille pour {{ days }} jours. Passé ce délai, les documents seront supprimés définitivement, et vous ne pourrez plus les restaurer.
documents.deleted.deleted-at: Supprimé
documents.deleted.restoring: Restauration...
documents.deleted.deleting: Suppression...
documents.preview.unknown-file-type: Aucun aperçu disponible pour ce type de fichier
documents.preview.binary-file: Cela semble être un fichier binaire et ne peut pas être affiché en texte
trash.delete-all.button: Supprimer tous les documents
trash.delete-all.confirm.title: Supprimer définitivement tous les documents ?
trash.delete-all.confirm.description: Êtes-vous sûr de vouloir supprimer définitivement tous les documents de la corbeille ? Cette action est irréversible.
trash.delete-all.confirm.label: Supprimer
trash.delete-all.confirm.cancel: Annuler
trash.delete.button: Supprimer
trash.delete.confirm.title: Supprimer définitivement le document ?
trash.delete.confirm.description: Êtes-vous sûr de vouloir supprimer définitivement ce document de la corbeille ? Cette action est irréversible.
trash.delete.confirm.label: Supprimer
trash.delete.confirm.cancel: Annuler
trash.deleted.success.title: Document supprimé
trash.deleted.success.description: Le document a été supprimé définitivement.
activity.document.created: Le document a été créé
activity.document.updated.single: Le {{ field }} a été mis à jour
activity.document.updated.multiple: Les {{ fields }} ont été mis à jour
activity.document.updated: Le document a été mis à jour
activity.document.deleted: Le document a été supprimé
activity.document.restored: Le document a été restauré
activity.document.tagged: Le tag {{ tag }} a été ajouté
activity.document.untagged: Le tag {{ tag }} a été supprimé
activity.document.user.name: par {{ name }}
activity.load-more: Charger plus
activity.no-more-activities: Aucune activité pour ce document
# Tags
tags.no-tags.title: Aucun tag
tags.no-tags.description: Cette organisation n'a pas de tags. Les tags sont utilisés pour catégoriser les documents. Vous pouvez ajouter des tags à vos documents pour les rendre plus faciles à trouver et à organiser.
tags.no-tags.create-tag: Créer un tag
tags.title: Tags de documents
tags.description: Les tags sont utilisés pour catégoriser les documents. Vous pouvez ajouter des tags à vos documents pour les rendre plus faciles à trouver et à organiser.
tags.create: Créer un tag
tags.update: Mettre à jour un tag
tags.delete: Supprimer un tag
tags.delete.confirm.title: Supprimer un tag
tags.delete.confirm.message: Êtes-vous sûr de vouloir supprimer ce tag ? Supprimer un tag supprimera toutes les règles de catégorisation qui l'utilisent.
tags.delete.confirm.confirm-button: Supprimer
tags.delete.confirm.cancel-button: Annuler
tags.delete.success: Tag supprimé avec succès
tags.create.success: Tag "{{ name }}" créé avec succès.
tags.update.success: Tag "{{ name }}" mis à jour avec succès.
tags.form.name.label: Nom
tags.form.name.placeholder: 'Exemple: Contrats'
tags.form.name.required: Veuillez entrer un nom pour le tag
tags.form.name.max-length: Le nom du tag doit contenir moins de 64 caractères
tags.form.color.label: Couleur
tags.form.color.required: Veuillez entrer une couleur
tags.form.color.invalid: La couleur hexadécimale est mal formatée.
tags.form.description.label: Description
tags.form.description.optional: (optionnel)
tags.form.description.placeholder: "Exemple: Tous les contrats signés par l'entreprise"
tags.form.description.max-length: La description doit contenir moins de 256 caractères
tags.form.no-description: Aucune description
tags.table.headers.tag: Tag
tags.table.headers.description: Description
tags.table.headers.documents: Documents
tags.table.headers.created: Date de création
tags.table.headers.actions: Actions
# Tagging rules
tagging-rules.field.name: nom du document
tagging-rules.field.content: contenu du document
tagging-rules.operator.equals: égal à
tagging-rules.operator.not-equals: différent de
tagging-rules.operator.contains: contient
tagging-rules.operator.not-contains: ne contient pas
tagging-rules.operator.starts-with: commence par
tagging-rules.operator.ends-with: finit par
tagging-rules.list.title: Règles de catégorisation
tagging-rules.list.description: Gérez vos règles de catégorisation, pour catégoriser automatiquement les documents en fonction de conditions que vous définissez.
tagging-rules.list.demo-warning: 'Note: Cette instance est une démo, les règles de catégorisation ne seront pas appliquées aux documents ajoutés.'
tagging-rules.list.no-tagging-rules.title: Aucune règle de catégorisation
tagging-rules.list.no-tagging-rules.description: Créez une règle de catégorisation pour catégoriser automatiquement vos documents en fonction de conditions que vous définissez.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Créer une règle de catégorisation
tagging-rules.list.card.no-conditions: Aucune condition
tagging-rules.list.card.one-condition: 1 condition
tagging-rules.list.card.conditions: '{{ count }} conditions'
tagging-rules.list.card.delete: Supprimer la règle
tagging-rules.list.card.edit: Modifier la règle
tagging-rules.create.title: Créer une règle de catégorisation
tagging-rules.create.success: Règle de catégorisation créée avec succès
tagging-rules.create.error: Échec de la création de la règle de catégorisation
tagging-rules.create.submit: Créer la règle
tagging-rules.form.name.label: Nom
tagging-rules.form.name.placeholder: 'Exemple: Catégoriser les factures'
tagging-rules.form.name.min-length: Veuillez entrer un nom pour la règle
tagging-rules.form.name.max-length: Le nom doit contenir moins de 64 caractères
tagging-rules.form.description.label: Description
tagging-rules.form.description.placeholder: "Exemple: Catégoriser les documents avec 'facture' dans le nom"
tagging-rules.form.description.max-length: La description doit contenir moins de 256 caractères
tagging-rules.form.conditions.label: Conditions
tagging-rules.form.conditions.description: Définissez les conditions que doivent remplir la règle pour qu'elle s'applique. Toutes les conditions doivent être remplies pour que la règle s'applique.
tagging-rules.form.conditions.add-condition: Ajouter une condition
tagging-rules.form.conditions.no-conditions.title: Aucune condition
tagging-rules.form.conditions.no-conditions.description: Vous n'avez pas ajouté de conditions à cette règle. Cette règle appliquera ses tags à tous les documents.
tagging-rules.form.conditions.no-conditions.confirm: Appliquer la règle sans conditions
tagging-rules.form.conditions.no-conditions.cancel: Annuler
tagging-rules.form.conditions.value.placeholder: 'Exemple: facture'
tagging-rules.form.conditions.value.min-length: Veuillez entrer une valeur pour la condition
tagging-rules.form.tags.label: Tags
tagging-rules.form.tags.description: Sélectionnez les tags à appliquer aux documents ajoutés qui correspondent aux conditions
tagging-rules.form.tags.min-length: Au moins un tag à appliquer est requis
tagging-rules.form.tags.add-tag: Créer un tag
tagging-rules.form.submit: Créer la règle
tagging-rules.update.title: Mettre à jour la règle de catégorisation
tagging-rules.update.error: Échec de la mise à jour de la règle de catégorisation
tagging-rules.update.submit: Mettre à jour la règle
tagging-rules.update.cancel: Annuler
# Intake emails
intake-emails.title: Adresses de réception
intake-emails.description: Les adresses de réception sont utilisées pour ingérer automatiquement les emails dans Papra. Il suffit de les envoyer à l'adresse de réception et leurs pièces jointes seront ajoutées à vos documents.
intake-emails.disabled.title: Les adresses de réception sont désactivées
intake-emails.disabled.description: Les adresses de réception sont désactivées sur cette instance. Veuillez contacter votre administrateur pour les activer. Voir la {{ documentation }} pour plus d'informations.
intake-emails.disabled.documentation: documentation
intake-emails.info: Seules les adresses de réception activées depuis les origines autorisées seront traitées. Vous pouvez activer ou désactiver une adresse de réception à tout moment.
intake-emails.empty.title: Aucune adresse de réception
intake-emails.empty.description: Générez une adresse de réception pour ingérer facilement les pièces jointes des emails.
intake-emails.empty.generate: Générer une adresse de réception
intake-emails.count: '{{ count }} intake email{{ plural }} for this organization'
intake-emails.new: Nouvelle adresse de réception
intake-emails.disabled-label: (Désactivé)
intake-emails.no-origins: Aucune adresse de réception autorisée
intake-emails.allowed-origins: Autorisées depuis {{ count }} adresse{{ plural }}
intake-emails.actions.enable: Activer
intake-emails.actions.disable: Désactiver
intake-emails.actions.manage-origins: Gérer les adresses d'origine
intake-emails.actions.delete: Supprimer
intake-emails.delete.confirm.title: Supprimer l'adresse de réception ?
intake-emails.delete.confirm.message: Êtes-vous sûr de vouloir supprimer cette adresse de réception ? Cette action est irréversible.
intake-emails.delete.confirm.confirm-button: Supprimer l'adresse de réception
intake-emails.delete.confirm.cancel-button: Annuler
intake-emails.delete.success: Adresse de réception supprimée
intake-emails.create.success: Adresse de réception créée
intake-emails.update.success.enabled: Adresse de réception activée
intake-emails.update.success.disabled: Adresse de réception désactivée
intake-emails.allowed-origins.title: Adresses d'origine autorisées
intake-emails.allowed-origins.description: Seuls les emails envoyés à {{ email }} depuis ces adresses d'origine seront traités. Si aucune adresse d'origine n'est spécifiée, tous les emails seront rejetés.
intake-emails.allowed-origins.add.label: Ajouter une adresse d'origine autorisée
intake-emails.allowed-origins.add.placeholder: 'Exemple: ada@papra.app'
intake-emails.allowed-origins.add.button: Ajouter
intake-emails.allowed-origins.add.error.exists: Cette adresse email est déjà dans les adresses d'origine autorisées pour cette adresse de réception
# API keys
api-keys.permissions.documents.title: Documents
api-keys.permissions.documents.documents:create: Créer des documents
api-keys.permissions.documents.documents:read: Lire des documents
api-keys.permissions.documents.documents:update: Mettre à jour des documents
api-keys.permissions.documents.documents:delete: Supprimer des documents
api-keys.permissions.tags.title: Tags
api-keys.permissions.tags.tags:create: Créer des tags
api-keys.permissions.tags.tags:read: Lire des tags
api-keys.permissions.tags.tags:update: Mettre à jour des tags
api-keys.permissions.tags.tags:delete: Supprimer des tags
api-keys.create.title: Créer une clé API
api-keys.create.description: Créer une nouvelle clé API pour accéder à l'API de Papra.
api-keys.create.success: La clé API a été créée avec succès.
api-keys.create.back: Retour aux clés API
api-keys.create.form.name.label: Nom
api-keys.create.form.name.placeholder: 'Exemple: Ma clé API'
api-keys.create.form.name.required: Veuillez entrer un nom pour la clé API
api-keys.create.form.permissions.label: Permissions
api-keys.create.form.permissions.required: Veuillez sélectionner au moins une permission
api-keys.create.form.submit: Créer la clé API
api-keys.create.created.title: Clé API créée
api-keys.create.created.description: La clé API a été créée avec succès. Enregistrez-la dans un endroit sûr car elle ne sera plus affichée.
api-keys.list.title: Clés API
api-keys.list.description: Gérez vos clés API ici.
api-keys.list.create: Créer une clé API
api-keys.list.empty.title: Aucune clé API
api-keys.list.empty.description: Créez une clé API pour accéder à l'API de Papra.
api-keys.list.card.last-used: Dernière utilisation
api-keys.list.card.never: Jamais
api-keys.list.card.created: Créée
api-keys.delete.success: La clé API a été supprimée avec succès
api-keys.delete.confirm.title: Supprimer la clé API
api-keys.delete.confirm.message: Êtes-vous sûr de vouloir supprimer cette clé API ? Cette action est irréversible.
api-keys.delete.confirm.confirm-button: Supprimer
api-keys.delete.confirm.cancel-button: Annuler
# Webhooks
webhooks.list.title: Webhooks
webhooks.list.description: Gérez vos webhooks ici.
webhooks.list.empty.title: Aucun webhook
webhooks.list.empty.description: Créez votre premier webhook pour commencer à recevoir des événements.
webhooks.list.create: Créer un webhook
webhooks.list.card.last-triggered: Dernière invocation
webhooks.list.card.never: Jamais
webhooks.list.card.created: Créée
webhooks.create.title: Créer un webhook
webhooks.create.description: Créez un webhook pour recevoir des événements lorsque des documents sont ajoutés à votre organisation.
webhooks.create.success: Le webhook a été créé avec succès.
webhooks.create.back: Retour aux webhooks
webhooks.create.form.submit: Créer le webhook
webhooks.create.form.name.label: Nom du webhook
webhooks.create.form.name.placeholder: Entrez le nom du webhook
webhooks.create.form.name.required: Le nom est requis
webhooks.create.form.url.label: URL du webhook
webhooks.create.form.url.placeholder: Entrez l'URL du webhook
webhooks.create.form.url.required: L'URL est requise
webhooks.create.form.url.invalid: L'URL est invalide
webhooks.create.form.secret.label: Secret
webhooks.create.form.secret.placeholder: Entrez le secret du webhook
webhooks.create.form.events.label: Événements
webhooks.create.form.events.required: Au moins un événement est requis
webhooks.update.title: Modifier le webhook
webhooks.update.description: Mettez à jour les détails de votre webhook
webhooks.update.success: Le webhook a été mis à jour avec succès
webhooks.update.submit: Mettre à jour le webhook
webhooks.update.cancel: Annuler
webhooks.update.form.secret.placeholder: Entrez un nouveau secret
webhooks.update.form.secret.placeholder-redacted: '[Secret masqué]'
webhooks.update.form.rotate-secret.button: Rotation du secret
webhooks.delete.success: Le webhook a été supprimé avec succès
webhooks.delete.confirm.title: Supprimer le webhook
webhooks.delete.confirm.message: Êtes-vous sûr de vouloir supprimer ce webhook ? Cette action est irréversible.
webhooks.delete.confirm.confirm-button: Supprimer
webhooks.delete.confirm.cancel-button: Annuler
webhooks.events.documents.title: Événements de documents
webhooks.events.documents.document:created.description: Document créé
webhooks.events.documents.document:deleted.description: Document supprimé
webhooks.events.documents.document:updated.description: Document mis à jour
webhooks.events.documents.document:tag:added.description: Un tag est ajouté à un document
webhooks.events.documents.document:tag:removed.description: Un tag est retiré d'un document
# Navigation
layout.menu.home: Accueil
layout.menu.documents: Documents
layout.menu.tags: Tags
layout.menu.tagging-rules: Règles de catégorisation
layout.menu.deleted-documents: Documents supprimés
layout.menu.organization-settings: Paramètres
layout.menu.api-keys: API keys
layout.menu.settings: Paramètres
layout.menu.account: Compte
layout.menu.general-settings: Paramètres généraux
layout.menu.intake-emails: Adresses de réception
layout.menu.webhooks: Webhooks
layout.menu.members: Membres
layout.menu.invitations: Invitations
layout.theme.light: Mode clair
layout.theme.dark: Mode sombre
layout.theme.system: Mode système
layout.search.placeholder: Rechercher...
layout.menu.import-document: Importer un document
user-menu.account-settings: Paramètres du compte
user-menu.api-keys: Clés d'API
user-menu.invitations: Invitations
user-menu.language: Langue
user-menu.logout: Déconnexion
# Command palette
command-palette.search.placeholder: Rechercher des commandes ou des documents
command-palette.no-results: Aucun résultat trouvé
command-palette.sections.documents: Documents
command-palette.sections.theme: Thème
# API errors
api-errors.document.already_exists: Le document existe déjà
api-errors.document.file_too_big: Le fichier du document est trop grand
api-errors.intake_email.limit_reached: Le nombre maximum d'emails de réception pour cette organisation a été atteint. Veuillez mettre à niveau votre plan pour créer plus d'emails de réception.
api-errors.user.max_organization_count_reached: Vous avez atteint le nombre maximum d'organisations que vous pouvez créer, si vous avez besoin de créer plus, veuillez contacter le support.
api-errors.default: Une erreur est survenue lors du traitement de votre requête.
api-errors.organization.invitation_already_exists: Une invitation pour cet email existe déjà dans cette organisation.
api-errors.user.already_in_organization: Cet utilisateur est déjà dans cette organisation.
api-errors.user.organization_invitation_limit_reached: Le nombre maximum d'invitations a été atteint pour aujourd'hui. Veuillez réessayer demain.
api-errors.demo.not_available: Cette fonctionnalité n'est pas disponible dans la démo
api-errors.tags.already_exists: Un tag avec ce nom existe déjà pour cette organisation
api-errors.internal.error: Une erreur est survenue lors du traitement de votre requête. Veuillez réessayer.
api-errors.auth.invalid_origin: Origine de l'application invalide. Si vous hébergez Papra, assurez-vous que la variable d'environnement APP_BASE_URL correspond à votre URL actuelle. Pour plus de détails, consultez https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Not Found
not-found.description: Désolé, la page que vous cherchez n'existe pas. Veuillez vérifier l'URL et réessayer.
not-found.back-to-home: Retour à l'accueil
# Demo
demo.popup.description: Cette instance est une démo, toutes les données sont sauvegardées dans le stockage local de votre navigateur.
demo.popup.discord: Rejoignez le {{ discordLink }} pour obtenir de l'aide, proposer des fonctionnalités ou simplement discuter.
demo.popup.discord-link-label: Serveur Discord
demo.popup.reset: Réinitialiser la démo
demo.popup.hide: Masquer
# Color picker
color-picker.hue: Teinte
color-picker.saturation: Saturation
color-picker.lightness: Luminosité
color-picker.select-color: Sélectionner la couleur
color-picker.select-a-color: Sélectionner une couleur

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Reimposta la tua password',
'auth.request-password-reset.description': 'Inserisci la tua email per reimpostare la password.',
'auth.request-password-reset.requested': 'Se esiste un account per questa email, ti abbiamo inviato un\'email per reimpostare la password.',
'auth.request-password-reset.back-to-login': 'Torna al login',
'auth.request-password-reset.form.email.label': 'Email',
'auth.request-password-reset.form.email.placeholder': 'Esempio: ada@papra.app',
'auth.request-password-reset.form.email.required': 'Inserisci il tuo indirizzo email',
'auth.request-password-reset.form.email.invalid': 'Questo indirizzo email non è valido',
'auth.request-password-reset.form.submit': 'Richiedi reimpostazione password',
'auth.reset-password.title': 'Reimposta la tua password',
'auth.reset-password.description': 'Inserisci la nuova password per reimpostare la password.',
'auth.reset-password.reset': 'La tua password è stata reimpostata.',
'auth.reset-password.back-to-login': 'Torna al login',
'auth.reset-password.form.new-password.label': 'Nuova password',
'auth.reset-password.form.new-password.placeholder': 'Esempio: **********',
'auth.reset-password.form.new-password.required': 'Inserisci la tua nuova password',
'auth.reset-password.form.new-password.min-length': 'La password deve essere di almeno {{ minLength }} caratteri',
'auth.reset-password.form.new-password.max-length': 'La password deve essere inferiore a {{ maxLength }} caratteri',
'auth.reset-password.form.submit': 'Reimposta password',
'auth.email-provider.open': 'Apri {{ provider }}',
'auth.login.title': 'Accedi a Papra',
'auth.login.description': 'Inserisci la tua email o usa un provider per accedere al tuo account Papra.',
'auth.login.login-with-provider': 'Accedi con {{ provider }}',
'auth.login.no-account': 'Non hai un account?',
'auth.login.register': 'Registrati',
'auth.login.form.email.label': 'Email',
'auth.login.form.email.placeholder': 'Esempio: ada@papra.app',
'auth.login.form.email.required': 'Inserisci il tuo indirizzo email',
'auth.login.form.email.invalid': 'Questo indirizzo email non è valido',
'auth.login.form.password.label': 'Password',
'auth.login.form.password.placeholder': 'Imposta una password',
'auth.login.form.password.required': 'Inserisci la tua password',
'auth.login.form.remember-me.label': 'Ricordami',
'auth.login.form.forgot-password.label': 'Password dimenticata?',
'auth.login.form.submit': 'Accedi',
'auth.register.title': 'Registrati a Papra',
'auth.register.description': 'Crea un account per iniziare a usare Papra.',
'auth.register.register-with-email': 'Registrati tramite email',
'auth.register.register-with-provider': 'Registrati tramite {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Hai già un account?',
'auth.register.login': 'Accedi',
'auth.register.registration-disabled.title': 'Registrazione disabilitata',
'auth.register.registration-disabled.description': 'La creazione di nuovi account è attualmente disabilitata su questa istanza di Papra. Solo gli utenti con account esistenti possono accedere. Se pensi che sia un errore, contatta l\'amministratore di questa istanza.',
'auth.register.form.email.label': 'Email',
'auth.register.form.email.placeholder': 'Esempio: ada@papra.app',
'auth.register.form.email.required': 'Inserisci il tuo indirizzo email',
'auth.register.form.email.invalid': 'Questo indirizzo email non è valido',
'auth.register.form.password.label': 'Password',
'auth.register.form.password.placeholder': 'Imposta una password',
'auth.register.form.password.required': 'Inserisci la tua password',
'auth.register.form.password.min-length': 'La password deve essere di almeno {{ minLength }} caratteri',
'auth.register.form.password.max-length': 'La password deve essere inferiore a {{ maxLength }} caratteri',
'auth.register.form.name.label': 'Nome',
'auth.register.form.name.placeholder': 'Esempio: Ada Lovelace',
'auth.register.form.name.required': 'Inserisci il tuo nome',
'auth.register.form.name.max-length': 'Il nome deve essere inferiore a {{ maxLength }} caratteri',
'auth.register.form.submit': 'Registrati',
'auth.email-validation-required.title': 'Verifica la tua email',
'auth.email-validation-required.description': 'Una email di verifica è stata inviata al tuo indirizzo email. Verifica il tuo indirizzo cliccando il link nell\'email.',
'auth.email-verification.success.title': 'Email verificata',
'auth.email-verification.success.description': 'La tua email è stata verificata con successo. Ora puoi accedere al tuo account.',
'auth.email-verification.success.login': 'Vai al login',
'auth.email-verification.error.title': 'Verifica fallita',
'auth.email-verification.error.description': 'Il link di verifica non è valido o è scaduto. Richiedi una nuova email di verifica effettuando l\'accesso.',
'auth.email-verification.error.back': 'Torna al login',
'auth.legal-links.description': 'Continuando, confermi di aver letto e accettato i {{ terms }} e l\'{{ privacy }}.',
'auth.legal-links.terms': 'Termini di servizio',
'auth.legal-links.privacy': 'Informativa sulla privacy',
'auth.no-auth-provider.title': 'Nessun provider di autenticazione',
'auth.no-auth-provider.description': 'Nessun provider di autenticazione è abilitato su questa istanza di Papra. Contatta l\'amministratore di questa istanza per abilitarli.',
// User settings
'user.settings.title': 'Impostazioni utente',
'user.settings.description': 'Gestisci qui le impostazioni del tuo account.',
'user.settings.email.title': 'Indirizzo email',
'user.settings.email.description': 'Il tuo indirizzo email non può essere modificato.',
'user.settings.email.label': 'Indirizzo email',
'user.settings.name.title': 'Nome completo',
'user.settings.name.description': 'Il tuo nome completo è visibile agli altri membri dell\'organizzazione.',
'user.settings.name.label': 'Nome completo',
'user.settings.name.placeholder': 'Es. Mario Rossi',
'user.settings.name.update': 'Aggiorna nome',
'user.settings.name.updated': 'Il tuo nome completo è stato aggiornato',
'user.settings.logout.title': 'Logout',
'user.settings.logout.description': 'Esci dal tuo account. Potrai accedere nuovamente in seguito.',
'user.settings.logout.button': 'Esci',
// Organizations
'organizations.list.title': 'Le tue organizzazioni',
'organizations.list.description': 'Le organizzazioni sono un modo per raggruppare i tuoi documenti e gestire l\'accesso. Puoi creare più organizzazioni e invitare i tuoi collaboratori.',
'organizations.list.create-new': 'Crea una nuova organizzazione',
'organizations.list.back': 'Torna alle organizzazioni',
'organizations.list.deleted.title': 'Organizzazioni eliminate',
'organizations.list.deleted.description': 'Le organizzazioni eliminate vengono conservate per {{ days }} giorni prima di essere rimosse definitivamente. Puoi ripristinarle durante questo periodo.',
'organizations.list.deleted.empty': 'Nessuna organizzazione eliminata',
'organizations.list.deleted.empty-description': 'Quando elimini un\'organizzazione, apparirà qui per {{ days }} giorni prima di essere eliminata definitivamente.',
'organizations.list.deleted.restore': 'Ripristina',
'organizations.list.deleted.restore-success': 'Organizzazione ripristinata con successo',
'organizations.list.deleted.restore-confirm.title': 'Ripristina organizzazione',
'organizations.list.deleted.restore-confirm.message': 'Sei sicuro di voler ripristinare questa organizzazione? Verrà rimossa nella tua lista di organizzazioni attive.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Ripristina organizzazione',
'organizations.list.deleted.deleted-at': 'Eliminata il {{ date }}',
'organizations.list.deleted.purge-at': 'Sarà eliminata definitivamente il {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} giorno, {daysUntilPurge} giorni }} rimanent{{ daysUntilPurge, =1:e, i}})',
'organizations.details.no-documents.title': 'Nessun documento',
'organizations.details.no-documents.description': 'Non ci sono ancora documenti in questa organizzazione. Inizia caricando dei documenti.',
'organizations.details.upload-documents': 'Carica documenti',
'organizations.details.documents-count': 'documenti in totale',
'organizations.details.total-size': 'dimensione totale',
'organizations.details.latest-documents': 'Ultimi documenti importati',
'organizations.create.title': 'Crea una nuova organizzazione',
'organizations.create.description': 'I tuoi documenti saranno raggruppati per organizzazione. Puoi creare più organizzazioni per separare i documenti, ad esempio per uso personale e lavorativo.',
'organizations.create.back': 'Indietro',
'organizations.create.error.max-count-reached': 'Hai raggiunto il numero massimo di organizzazioni che puoi creare, se hai bisogno di crearne altre contatta il supporto.',
'organizations.create.form.name.label': 'Nome organizzazione',
'organizations.create.form.name.placeholder': 'Es. Acme Inc.',
'organizations.create.form.name.required': 'Inserisci il nome dell\'organizzazione',
'organizations.create.form.submit': 'Crea organizzazione',
'organizations.create.success': 'Organizzazione creata con successo',
'organizations.create-first.title': 'Crea la tua organizzazione',
'organizations.create-first.description': 'I tuoi documenti saranno raggruppati per organizzazione. Puoi creare più organizzazioni per separare i documenti, ad esempio per uso personale e lavorativo.',
'organizations.create-first.default-name': 'La mia organizzazione',
'organizations.create-first.user-name': 'Organizzazione di {{ name }}',
'organization.settings.title': 'Impostazioni organizzazione',
'organization.settings.page.title': 'Impostazioni organizzazione',
'organization.settings.page.description': 'Gestisci qui le impostazioni della tua organizzazione.',
'organization.settings.name.title': 'Nome organizzazione',
'organization.settings.name.update': 'Aggiorna nome',
'organization.settings.name.placeholder': 'Es. Acme Inc.',
'organization.settings.name.updated': 'Nome organizzazione aggiornato',
'organization.settings.subscription.title': 'Sottoscrizione',
'organization.settings.subscription.description': 'Gestisci fatturazione, fatture e metodi di pagamento.',
'organization.settings.subscription.manage': 'Gestisci sottoscrizione',
'organization.settings.subscription.error': 'Impossibile ottenere l\'URL del portale clienti',
'organization.settings.delete.title': 'Elimina organizzazione',
'organization.settings.delete.description': 'Eliminando questa organizzazione rimuoverai definitivamente tutti i dati associati.',
'organization.settings.delete.confirm.title': 'Elimina organizzazione',
'organization.settings.delete.confirm.message': 'Sei sicuro di voler eliminare questa organizzazione? L\'organizzazione verrà contrassegnata per l\'eliminazione e rimossa definitivamente dopo {{ days }} giorni. Durante questo periodo, puoi ripristinarla dalla tua lista di organizzazioni. Tutti i documenti e i dati verranno eliminati definitivamente dopo questo periodo.',
'organization.settings.delete.confirm.confirm-button': 'Elimina organizzazione',
'organization.settings.delete.confirm.cancel-button': 'Annulla',
'organization.settings.delete.success': 'Organizzazione eliminata',
'organization.settings.delete.only-owner': 'Solo il proprietario dell\'organizzazione può eliminare questa organizzazione.',
'organization.settings.delete.has-active-subscription': 'Impossibile eliminare l\'organizzazione con un abbonamento attivo, si prega di annullare prima l\'abbonamento sopra.',
'organization.usage.page.title': 'Utilizzo',
'organization.usage.page.description': 'Visualizza l\'utilizzo attuale e i limiti della tua organizzazione.',
'organization.usage.storage.title': 'Archiviazione documenti',
'organization.usage.storage.description': 'Archiviazione totale utilizzata dai tuoi documenti',
'organization.usage.intake-emails.title': 'Email di acquisizione',
'organization.usage.intake-emails.description': 'Numero di indirizzi email di acquisizione',
'organization.usage.members.title': 'Membri',
'organization.usage.members.description': 'Numero di membri nell\'organizzazione',
'organization.usage.unlimited': 'Illimitato',
'organizations.members.title': 'Membri',
'organizations.members.description': 'Gestisci i membri della tua organizzazione',
'organizations.members.invite-member': 'Invita membro',
'organizations.members.invite-member-disabled-tooltip': 'Solo gli amministratori o i proprietari possono invitare membri nell\'organizzazione',
'organizations.members.remove-from-organization': 'Rimuovi dall\'organizzazione',
'organizations.members.role': 'Ruolo',
'organizations.members.roles.owner': 'Proprietario',
'organizations.members.roles.admin': 'Amministratore',
'organizations.members.roles.member': 'Membro',
'organizations.members.delete.confirm.title': 'Rimuovi membro',
'organizations.members.delete.confirm.message': 'Sei sicuro di voler rimuovere questo membro dall\'organizzazione?',
'organizations.members.delete.confirm.confirm-button': 'Rimuovi',
'organizations.members.delete.confirm.cancel-button': 'Annulla',
'organizations.members.delete.success': 'Membro rimosso dall\'organizzazione',
'organizations.members.update-role.success': 'Ruolo del membro aggiornato',
'organizations.members.table.headers.name': 'Nome',
'organizations.members.table.headers.email': 'Email',
'organizations.members.table.headers.role': 'Ruolo',
'organizations.members.table.headers.created': 'Creato',
'organizations.members.table.headers.actions': 'Azioni',
'organizations.invite-member.title': 'Invita membro',
'organizations.invite-member.description': 'Invita un membro nella tua organizzazione',
'organizations.invite-member.form.email.label': 'Email',
'organizations.invite-member.form.email.placeholder': 'Esempio: ada@papra.app',
'organizations.invite-member.form.email.required': 'Inserisci un indirizzo email valido',
'organizations.invite-member.form.role.label': 'Ruolo',
'organizations.invite-member.form.submit': 'Invita nell\'organizzazione',
'organizations.invite-member.success.message': 'Membro invitato',
'organizations.invite-member.success.description': 'Il membro è stato invitato nell\'organizzazione.',
'organizations.invite-member.error.message': 'Impossibile invitare il membro',
'organizations.invitations.title': 'Inviti',
'organizations.invitations.description': 'Gestisci gli inviti della tua organizzazione',
'organizations.invitations.list.cta': 'Invita membro',
'organizations.invitations.list.empty.title': 'Nessun invito in sospeso',
'organizations.invitations.list.empty.description': 'Non sei stato ancora invitato in nessuna organizzazione.',
'organizations.invitations.status.pending': 'In sospeso',
'organizations.invitations.status.accepted': 'Accettato',
'organizations.invitations.status.rejected': 'Rifiutato',
'organizations.invitations.status.expired': 'Scaduto',
'organizations.invitations.status.cancelled': 'Cancellato',
'organizations.invitations.resend': 'Invia di nuovo invito',
'organizations.invitations.cancel.title': 'Annulla invito',
'organizations.invitations.cancel.description': 'Sei sicuro di voler annullare questo invito?',
'organizations.invitations.cancel.confirm': 'Annulla invito',
'organizations.invitations.cancel.cancel': 'Annulla',
'organizations.invitations.resend.title': 'Invia di nuovo invito',
'organizations.invitations.resend.description': 'Sei sicuro di voler inviare nuovamente questo invito? Sarà inviata una nuova email al destinatario.',
'organizations.invitations.resend.confirm': 'Invia invito',
'organizations.invitations.resend.cancel': 'Annulla',
'invitations.list.title': 'Inviti',
'invitations.list.description': 'Gestisci gli inviti della tua organizzazione',
'invitations.list.empty.title': 'Nessun invito in sospeso',
'invitations.list.empty.description': 'Non sei stato ancora invitato in nessuna organizzazione.',
'invitations.list.headers.organization': 'Organizzazione',
'invitations.list.headers.status': 'Stato',
'invitations.list.headers.created': 'Creato',
'invitations.list.headers.actions': 'Azioni',
'invitations.list.actions.accept': 'Accetta',
'invitations.list.actions.reject': 'Rifiuta',
'invitations.list.actions.accept.success.message': 'Invito accettato',
'invitations.list.actions.accept.success.description': 'L\'invito è stato accettato.',
'invitations.list.actions.reject.success.message': 'Invito rifiutato',
'invitations.list.actions.reject.success.description': 'L\'invito è stato rifiutato.',
// Documents
'documents.list.title': 'Documenti',
'documents.list.no-documents.title': 'Nessun documento',
'documents.list.no-documents.description': 'Non ci sono ancora documenti in questa organizzazione. Inizia caricando dei documenti.',
'documents.list.no-results': 'Nessun documento trovato',
'documents.tabs.info': 'Info',
'documents.tabs.content': 'Contenuto',
'documents.tabs.activity': 'Attività',
'documents.deleted.message': 'Questo documento è stato eliminato e sarà rimosso definitivamente tra {{ days }} giorni.',
'documents.actions.download': 'Scarica',
'documents.actions.open-in-new-tab': 'Apri in una nuova scheda',
'documents.actions.restore': 'Ripristina',
'documents.actions.delete': 'Elimina',
'documents.actions.edit': 'Modifica',
'documents.actions.cancel': 'Annulla',
'documents.actions.save': 'Salva',
'documents.actions.saving': 'Salvataggio in corso...',
'documents.content.alert': 'Il contenuto del documento è estratto automaticamente al caricamento. È usato solo per la ricerca e l\'indicizzazione.',
'documents.content.empty-placeholder': 'Questo documento non ha contenuto estratto, puoi inserirlo manualmente qui.',
'documents.info.id': 'ID',
'documents.info.name': 'Nome',
'documents.info.type': 'Tipo',
'documents.info.size': 'Dimensione',
'documents.info.created-at': 'Creato il',
'documents.info.updated-at': 'Aggiornato il',
'documents.info.never': 'Mai',
'documents.rename.title': 'Rinomina documento',
'documents.rename.form.name.label': 'Nome',
'documents.rename.form.name.placeholder': 'Esempio: Fattura 2024',
'documents.rename.form.name.required': 'Inserisci un nome per il documento',
'documents.rename.form.name.max-length': 'Il nome deve essere inferiore a 255 caratteri',
'documents.rename.form.submit': 'Rinomina documento',
'documents.rename.success': 'Documento rinominato con successo',
'documents.rename.cancel': 'Annulla',
'import-documents.title.error': '{{ count }} documenti non importati',
'import-documents.title.success': '{{ count }} documenti importati',
'import-documents.title.pending': '{{ count }} / {{ total }} documenti importati',
'import-documents.title.none': 'Importa documenti',
'import-documents.no-import-in-progress': 'Nessuna importazione documenti in corso',
'documents.deleted.title': 'Documenti eliminati',
'documents.deleted.empty.title': 'Nessun documento eliminato',
'documents.deleted.empty.description': 'Non hai documenti eliminati. I documenti eliminati saranno spostati nel cestino per {{ days }} giorni.',
'documents.deleted.retention-notice': 'Tutti i documenti eliminati sono conservati nel cestino per {{ days }} giorni. Passato questo periodo, saranno eliminati definitivamente e non potrai recuperarli.',
'documents.deleted.deleted-at': 'Eliminato il',
'documents.deleted.restoring': 'Ripristino in corso...',
'documents.deleted.deleting': 'Eliminazione in corso...',
'documents.preview.unknown-file-type': 'Nessuna anteprima disponibile per questo tipo di file',
'documents.preview.binary-file': 'Sembra essere un file binario e non può essere visualizzato come testo',
'trash.delete-all.button': 'Elimina tutto',
'trash.delete-all.confirm.title': 'Eliminare definitivamente tutti i documenti?',
'trash.delete-all.confirm.description': 'Sei sicuro di voler eliminare definitivamente tutti i documenti dal cestino? Questa azione non può essere annullata.',
'trash.delete-all.confirm.label': 'Elimina',
'trash.delete-all.confirm.cancel': 'Annulla',
'trash.delete.button': 'Elimina',
'trash.delete.confirm.title': 'Eliminare definitivamente il documento?',
'trash.delete.confirm.description': 'Sei sicuro di voler eliminare definitivamente questo documento dal cestino? Questa azione non può essere annullata.',
'trash.delete.confirm.label': 'Elimina',
'trash.delete.confirm.cancel': 'Annulla',
'trash.deleted.success.title': 'Documento eliminato',
'trash.deleted.success.description': 'Il documento è stato eliminato definitivamente.',
'activity.document.created': 'Documento creato',
'activity.document.updated.single': 'Il campo {{ field }} è stato aggiornato',
'activity.document.updated.multiple': 'I campi {{ fields }} sono stati aggiornati',
'activity.document.updated': 'Documento aggiornato',
'activity.document.deleted': 'Documento eliminato',
'activity.document.restored': 'Documento ripristinato',
'activity.document.tagged': 'Tag {{ tag }} aggiunto',
'activity.document.untagged': 'Tag {{ tag }} rimosso',
'activity.document.user.name': 'da {{ name }}',
'activity.load-more': 'Carica altri',
'activity.no-more-activities': 'Nessuna altra attività per questo documento',
// Tags
'tags.no-tags.title': 'Nessun tag',
'tags.no-tags.description': 'Questa organizzazione non ha ancora tag. I tag vengono usati per categorizzare i documenti. Puoi aggiungere tag ai tuoi documenti per trovarli e organizzarli più facilmente.',
'tags.no-tags.create-tag': 'Crea tag',
'tags.title': 'Tag dei documenti',
'tags.description': 'I tag vengono usati per categorizzare i documenti. Puoi aggiungere tag ai tuoi documenti per trovarli e organizzarli più facilmente.',
'tags.create': 'Crea tag',
'tags.update': 'Aggiorna tag',
'tags.delete': 'Elimina tag',
'tags.delete.confirm.title': 'Elimina tag',
'tags.delete.confirm.message': 'Sei sicuro di voler eliminare questo tag? Il tag verrà rimosso da tutti i documenti.',
'tags.delete.confirm.confirm-button': 'Elimina',
'tags.delete.confirm.cancel-button': 'Annulla',
'tags.delete.success': 'Tag eliminato con successo',
'tags.create.success': 'Tag "{{ name }}" creato con successo.',
'tags.update.success': 'Tag "{{ name }}" aggiornato con successo.',
'tags.form.name.label': 'Nome',
'tags.form.name.placeholder': 'Es. Contratti',
'tags.form.name.required': 'Inserisci un nome per il tag',
'tags.form.name.max-length': 'Il nome del tag deve essere inferiore a 64 caratteri',
'tags.form.color.label': 'Colore',
'tags.form.color.required': 'Inserisci un colore',
'tags.form.color.invalid': 'Il colore hex non è formattato correttamente.',
'tags.form.description.label': 'Descrizione',
'tags.form.description.optional': '(opzionale)',
'tags.form.description.placeholder': 'Es. Tutti i contratti firmati dall\'azienda',
'tags.form.description.max-length': 'La descrizione deve essere inferiore a 256 caratteri',
'tags.form.no-description': 'Nessuna descrizione',
'tags.table.headers.tag': 'Tag',
'tags.table.headers.description': 'Descrizione',
'tags.table.headers.documents': 'Documenti',
'tags.table.headers.created': 'Creato',
'tags.table.headers.actions': 'Azioni',
// Tagging rules
'tagging-rules.field.name': 'il nome del documento',
'tagging-rules.field.content': 'il contenuto del documento',
'tagging-rules.operator.equals': 'uguale a',
'tagging-rules.operator.not-equals': 'diverso da',
'tagging-rules.operator.contains': 'contiene',
'tagging-rules.operator.not-contains': 'non contiene',
'tagging-rules.operator.starts-with': 'inizia con',
'tagging-rules.operator.ends-with': 'termina con',
'tagging-rules.list.title': 'Regole di tagging',
'tagging-rules.list.description': 'Gestisci le regole di tagging della tua organizzazione per taggare automaticamente i documenti in base a condizioni definite da te.',
'tagging-rules.list.demo-warning': 'Nota: Essendo un ambiente demo (senza server), le regole di tagging non verranno applicate ai nuovi documenti.',
'tagging-rules.list.no-tagging-rules.title': 'Nessuna regola di tagging',
'tagging-rules.list.no-tagging-rules.description': 'Crea una regola per taggare automaticamente i documenti aggiunti in base a condizioni definite da te.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Crea regola di tagging',
'tagging-rules.list.card.no-conditions': 'Nessuna condizione',
'tagging-rules.list.card.one-condition': '1 condizione',
'tagging-rules.list.card.conditions': '{{ count }} condizioni',
'tagging-rules.list.card.delete': 'Elimina regola',
'tagging-rules.list.card.edit': 'Modifica regola',
'tagging-rules.create.title': 'Crea regola di tagging',
'tagging-rules.create.success': 'Regola di tagging creata con successo',
'tagging-rules.create.error': 'Errore nella creazione della regola di tagging',
'tagging-rules.create.submit': 'Crea regola',
'tagging-rules.form.name.label': 'Nome',
'tagging-rules.form.name.placeholder': 'Esempio: Tagga fatture',
'tagging-rules.form.name.min-length': 'Inserisci un nome per la regola',
'tagging-rules.form.name.max-length': 'Il nome deve essere inferiore a 64 caratteri',
'tagging-rules.form.description.label': 'Descrizione',
'tagging-rules.form.description.placeholder': 'Esempio: Tagga i documenti con \'fattura\' nel nome',
'tagging-rules.form.description.max-length': 'La descrizione deve essere inferiore a 256 caratteri',
'tagging-rules.form.conditions.label': 'Condizioni',
'tagging-rules.form.conditions.description': 'Definisci le condizioni che devono essere soddisfatte affinché la regola si applichi. Nessuna condizione significa che la regola si applicherà a tutti i documenti',
'tagging-rules.form.conditions.add-condition': 'Aggiungi condizione',
'tagging-rules.form.conditions.connector.when': 'Quando',
'tagging-rules.form.conditions.connector.and': 'e che',
'tagging-rules.form.conditions.connector.or': 'o che',
'tagging-rules.condition-match-mode.all': 'Tutte le condizioni devono corrispondere',
'tagging-rules.condition-match-mode.any': 'Qualsiasi condizione deve corrispondere',
'tagging-rules.form.conditions.no-conditions.title': 'Nessuna condizione',
'tagging-rules.form.conditions.no-conditions.description': 'Non hai aggiunto nessuna condizione a questa regola. Questa regola applicherà i suoi tag a tutti i documenti.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Applica regola senza condizioni',
'tagging-rules.form.conditions.no-conditions.cancel': 'Annulla',
'tagging-rules.form.conditions.value.placeholder': 'Esempio: fattura',
'tagging-rules.form.conditions.value.min-length': 'Inserisci un valore per la condizione',
'tagging-rules.form.tags.label': 'Tag',
'tagging-rules.form.tags.description': 'Seleziona i tag da applicare ai documenti che soddisfano le condizioni',
'tagging-rules.form.tags.min-length': 'È richiesto almeno un tag da applicare',
'tagging-rules.form.tags.add-tag': 'Crea tag',
'tagging-rules.form.submit': 'Crea regola',
'tagging-rules.update.title': 'Aggiorna regola di tagging',
'tagging-rules.update.error': 'Errore nell\'aggiornamento della regola di tagging',
'tagging-rules.update.submit': 'Aggiorna regola',
'tagging-rules.update.cancel': 'Annulla',
'tagging-rules.apply.button': 'Applica ai documenti esistenti',
'tagging-rules.apply.confirm.title': 'Applicare la regola ai documenti esistenti?',
'tagging-rules.apply.confirm.description': 'Questo controllerà tutti i documenti esistenti nella tua organizzazione e applicherà i tag dove le condizioni corrispondono. L\'elaborazione avverrà in background.',
'tagging-rules.apply.confirm.button': 'Applica regola',
'tagging-rules.apply.success': 'Applicazione della regola avviata in background',
'tagging-rules.apply.error': 'Impossibile avviare l\'applicazione della regola',
'tagging-rules.apply.processing': 'Avvio in corso...',
// Intake emails
'intake-emails.title': 'Email di acquisizione',
'intake-emails.description': 'Gli indirizzi email di acquisizione vengono usati per importare automaticamente email in Papra. Basta inoltrare le email all\'indirizzo di acquisizione e gli allegati saranno aggiunti ai documenti dell\'organizzazione.',
'intake-emails.disabled.title': 'Email di acquisizione disabilitate',
'intake-emails.disabled.description': 'Le email di acquisizione sono disabilitate su questa istanza. Contatta il tuo amministratore per abilitarle. Consulta la {{ documentation }} per maggiori informazioni.',
'intake-emails.disabled.documentation': 'documentazione',
'intake-emails.info': 'Solo le email di acquisizione abilitate provenienti da origini consentite saranno processate. Puoi abilitare o disabilitare un\'email di acquisizione in qualsiasi momento.',
'intake-emails.empty.title': 'Nessuna email di acquisizione',
'intake-emails.empty.description': 'Genera un indirizzo di acquisizione per importare facilmente allegati email.',
'intake-emails.empty.generate': 'Genera email di acquisizione',
'intake-emails.count': '{{ count }} email di acquisizione per questa organizzazione',
'intake-emails.new': 'Nuova email di acquisizione',
'intake-emails.disabled-label': '(Disabilitata)',
'intake-emails.no-origins': 'Nessuna origine email consentita',
'intake-emails.allowed-origins': 'Consentito da {{ count }} indirizzo/i',
'intake-emails.actions.enable': 'Abilita',
'intake-emails.actions.disable': 'Disabilita',
'intake-emails.actions.manage-origins': 'Gestisci indirizzi origine',
'intake-emails.actions.delete': 'Elimina',
'intake-emails.delete.confirm.title': 'Eliminare l\'email di acquisizione?',
'intake-emails.delete.confirm.message': 'Sei sicuro di voler eliminare questa email di acquisizione? Questa azione non può essere annullata.',
'intake-emails.delete.confirm.confirm-button': 'Elimina email di acquisizione',
'intake-emails.delete.confirm.cancel-button': 'Annulla',
'intake-emails.delete.success': 'Email di acquisizione eliminata',
'intake-emails.create.success': 'Email di acquisizione creata',
'intake-emails.update.success.enabled': 'Email di acquisizione abilitata',
'intake-emails.update.success.disabled': 'Email di acquisizione disabilitata',
'intake-emails.allowed-origins.title': 'Origini consentite',
'intake-emails.allowed-origins.description': 'Solo le email inviate a {{ email }} da queste origini saranno processate. Se non sono specificate origini, tutte le email saranno scartate.',
'intake-emails.allowed-origins.add.label': 'Aggiungi email origine consentita',
'intake-emails.allowed-origins.add.placeholder': 'Es. ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Aggiungi',
'intake-emails.allowed-origins.add.error.exists': 'Questa email è già tra le origini consentite per questa email di acquisizione',
// API keys
'api-keys.permissions.select-all': 'Seleziona tutto',
'api-keys.permissions.deselect-all': 'Deseleziona tutto',
'api-keys.permissions.organizations.title': 'Organizzazioni',
'api-keys.permissions.organizations.organizations:create': 'Crea organizzazioni',
'api-keys.permissions.organizations.organizations:read': 'Leggi organizzazioni',
'api-keys.permissions.organizations.organizations:update': 'Aggiorna organizzazioni',
'api-keys.permissions.organizations.organizations:delete': 'Elimina organizzazioni',
'api-keys.permissions.documents.title': 'Documenti',
'api-keys.permissions.documents.documents:create': 'Crea documenti',
'api-keys.permissions.documents.documents:read': 'Leggi documenti',
'api-keys.permissions.documents.documents:update': 'Aggiorna documenti',
'api-keys.permissions.documents.documents:delete': 'Elimina documenti',
'api-keys.permissions.tags.title': 'Tag',
'api-keys.permissions.tags.tags:create': 'Crea tag',
'api-keys.permissions.tags.tags:read': 'Leggi tag',
'api-keys.permissions.tags.tags:update': 'Aggiorna tag',
'api-keys.permissions.tags.tags:delete': 'Elimina tag',
'api-keys.create.title': 'Crea chiave API',
'api-keys.create.description': 'Crea una nuova chiave API per accedere all\'API di Papra.',
'api-keys.create.success': 'La chiave API è stata creata con successo.',
'api-keys.create.back': 'Torna alle chiavi API',
'api-keys.create.form.name.label': 'Nome',
'api-keys.create.form.name.placeholder': 'Esempio: La mia chiave API',
'api-keys.create.form.name.required': 'Inserisci un nome per la chiave API',
'api-keys.create.form.permissions.label': 'Permessi',
'api-keys.create.form.permissions.required': 'Seleziona almeno un permesso',
'api-keys.create.form.submit': 'Crea chiave API',
'api-keys.create.created.title': 'Chiave API creata',
'api-keys.create.created.description': 'La chiave API è stata creata con successo. Salvala in un luogo sicuro, non verrà più mostrata.',
'api-keys.list.title': 'Chiavi API',
'api-keys.list.description': 'Gestisci qui le tue chiavi API.',
'api-keys.list.create': 'Crea chiave API',
'api-keys.list.empty.title': 'Nessuna chiave API',
'api-keys.list.empty.description': 'Crea una chiave API per accedere all\'API di Papra.',
'api-keys.list.card.last-used': 'Ultimo utilizzo',
'api-keys.list.card.never': 'Mai',
'api-keys.list.card.created': 'Creato',
'api-keys.delete.success': 'La chiave API è stata eliminata con successo',
'api-keys.delete.confirm.title': 'Eliminare la chiave API',
'api-keys.delete.confirm.message': 'Sei sicuro di voler eliminare questa chiave API? Questa azione non può essere annullata.',
'api-keys.delete.confirm.confirm-button': 'Elimina',
'api-keys.delete.confirm.cancel-button': 'Annulla',
// Webhooks
'webhooks.list.title': 'Webhook',
'webhooks.list.description': 'Gestisci i webhook della tua organizzazione',
'webhooks.list.empty.title': 'Nessun webhook',
'webhooks.list.empty.description': 'Crea il tuo primo webhook per iniziare a ricevere eventi',
'webhooks.list.create': 'Crea webhook',
'webhooks.list.card.last-triggered': 'Ultima attivazione',
'webhooks.list.card.never': 'Mai',
'webhooks.list.card.created': 'Creato',
'webhooks.create.title': 'Crea webhook',
'webhooks.create.description': 'Crea un nuovo webhook per ricevere eventi',
'webhooks.create.success': 'Webhook creato con successo',
'webhooks.create.back': 'Indietro',
'webhooks.create.form.submit': 'Crea webhook',
'webhooks.create.form.name.label': 'Nome webhook',
'webhooks.create.form.name.placeholder': 'Inserisci nome webhook',
'webhooks.create.form.name.required': 'Il nome è obbligatorio',
'webhooks.create.form.url.label': 'URL webhook',
'webhooks.create.form.url.placeholder': 'Inserisci URL webhook',
'webhooks.create.form.url.required': 'L\'URL è obbligatorio',
'webhooks.create.form.url.invalid': 'L\'URL non è valido',
'webhooks.create.form.secret.label': 'Segreto',
'webhooks.create.form.secret.placeholder': 'Inserisci il segreto del webhook',
'webhooks.create.form.events.label': 'Eventi',
'webhooks.create.form.events.required': 'È richiesto almeno un evento',
'webhooks.update.title': 'Modifica webhook',
'webhooks.update.description': 'Aggiorna i dettagli del webhook',
'webhooks.update.success': 'Webhook aggiornato con successo',
'webhooks.update.submit': 'Aggiorna webhook',
'webhooks.update.cancel': 'Annulla',
'webhooks.update.form.secret.placeholder': 'Inserisci nuovo segreto',
'webhooks.update.form.secret.placeholder-redacted': '[Segreto nascosto]',
'webhooks.update.form.rotate-secret.button': 'Rigenera segreto',
'webhooks.delete.success': 'Webhook eliminato con successo',
'webhooks.delete.confirm.title': 'Eliminare webhook',
'webhooks.delete.confirm.message': 'Sei sicuro di voler eliminare questo webhook?',
'webhooks.delete.confirm.confirm-button': 'Elimina',
'webhooks.delete.confirm.cancel-button': 'Annulla',
'webhooks.events.documents.title': 'Eventi documenti',
'webhooks.events.documents.document:created.description': 'Documento creato',
'webhooks.events.documents.document:deleted.description': 'Documento eliminato',
'webhooks.events.documents.document:updated.description': 'Documento aggiornato',
'webhooks.events.documents.document:tag:added.description': 'Un tag è stato aggiunto a un documento',
'webhooks.events.documents.document:tag:removed.description': 'Un tag è stato rimosso da un documento',
// Navigation
'layout.menu.home': 'Home',
'layout.menu.documents': 'Documenti',
'layout.menu.tags': 'Tag',
'layout.menu.tagging-rules': 'Regole di tagging',
'layout.menu.deleted-documents': 'Documenti eliminati',
'layout.menu.organization-settings': 'Impostazioni',
'layout.menu.api-keys': 'Chiavi API',
'layout.menu.settings': 'Impostazioni',
'layout.menu.account': 'Account',
'layout.menu.general-settings': 'Impostazioni generali',
'layout.menu.usage': 'Utilizzo',
'layout.menu.intake-emails': 'Email di acquisizione',
'layout.menu.webhooks': 'Webhook',
'layout.menu.members': 'Membri',
'layout.menu.invitations': 'Inviti',
'layout.upgrade-cta.title': 'Serve più spazio?',
'layout.upgrade-cta.description': 'Ottieni 10x più storage + collaborazione del team',
'layout.upgrade-cta.button': 'Aggiorna ora',
'layout.theme.light': 'Modalità chiara',
'layout.theme.dark': 'Modalità scura',
'layout.theme.system': 'Modalità sistema',
'layout.search.placeholder': 'Cerca...',
'layout.menu.import-document': 'Importa un documento',
'user-menu.account-settings': 'Impostazioni account',
'user-menu.api-keys': 'Chiavi API',
'user-menu.invitations': 'Inviti',
'user-menu.language': 'Lingua',
'user-menu.logout': 'Esci',
// Command palette
'command-palette.search.placeholder': 'Cerca comandi o documenti',
'command-palette.no-results': 'Nessun risultato trovato',
'command-palette.sections.documents': 'Documenti',
'command-palette.sections.theme': 'Tema',
// API errors
'api-errors.document.already_exists': 'Il documento esiste già',
'api-errors.document.size_too_large': 'Il file è troppo grande',
'api-errors.intake-emails.already_exists': 'Un\'email di acquisizione con questo indirizzo esiste già.',
'api-errors.intake_email.limit_reached': 'È stato raggiunto il numero massimo di email di acquisizione per questa organizzazione. Aggiorna il tuo piano per crearne altre.',
'api-errors.user.max_organization_count_reached': 'Hai raggiunto il numero massimo di organizzazioni che puoi creare, se hai bisogno di crearne altre contatta il supporto.',
'api-errors.default': 'Si è verificato un errore durante l\'elaborazione della richiesta.',
'api-errors.organization.invitation_already_exists': 'Esiste già un invito per questa email in questa organizzazione.',
'api-errors.user.already_in_organization': 'Questo utente è già in questa organizzazione.',
'api-errors.user.organization_invitation_limit_reached': 'È stato raggiunto il numero massimo di inviti per oggi. Riprova domani.',
'api-errors.demo.not_available': 'Questa funzionalità non è disponibile nella demo',
'api-errors.tags.already_exists': 'Esiste già un tag con questo nome per questa organizzazione',
'api-errors.internal.error': 'Si è verificato un errore durante l\'elaborazione della richiesta. Riprova.',
'api-errors.auth.invalid_origin': 'Origine dell\'applicazione non valida. Se stai ospitando Papra, assicurati che la variabile di ambiente APP_BASE_URL corrisponda all\'URL corrente. Per maggiori dettagli, consulta https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'È stato raggiunto il numero massimo di membri e inviti in sospeso per questa organizzazione. Aggiorna il tuo piano per aggiungere altri membri.',
'api-errors.organization.has_active_subscription': 'Impossibile eliminare l\'organizzazione con un abbonamento attivo. Si prega di annullare prima l\'abbonamento utilizzando il pulsante Gestisci abbonamento sopra.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Utente non trovato',
'api-errors.FAILED_TO_CREATE_USER': 'Impossibile creare l\'utente',
'api-errors.FAILED_TO_CREATE_SESSION': 'Impossibile creare la sessione',
'api-errors.FAILED_TO_UPDATE_USER': 'Impossibile aggiornare l\'utente',
'api-errors.FAILED_TO_GET_SESSION': 'Impossibile recuperare la sessione',
'api-errors.INVALID_PASSWORD': 'Password non valida',
'api-errors.INVALID_EMAIL': 'Email non valida',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'L\'email o la password non è corretta, oppure l\'account non esiste.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Account social già collegato',
'api-errors.PROVIDER_NOT_FOUND': 'Provider non trovato',
'api-errors.INVALID_TOKEN': 'Token non valido',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Token ID non supportato',
'api-errors.FAILED_TO_GET_USER_INFO': 'Impossibile recuperare le informazioni utente',
'api-errors.USER_EMAIL_NOT_FOUND': 'Email utente non trovata',
'api-errors.EMAIL_NOT_VERIFIED': 'Email non verificata',
'api-errors.PASSWORD_TOO_SHORT': 'Password troppo corta',
'api-errors.PASSWORD_TOO_LONG': 'Password troppo lunga',
'api-errors.USER_ALREADY_EXISTS': 'Esiste già un utente con questa email',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'L\'email non può essere aggiornata',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Account credenziali non trovato',
'api-errors.SESSION_EXPIRED': 'Sessione scaduta',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Impossibile scollegare l\'ultimo account',
'api-errors.ACCOUNT_NOT_FOUND': 'Account non trovato',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'L\'utente ha già una password',
// Not found
'not-found.title': '404 - Non trovato',
'not-found.description': 'Spiacenti, la pagina che stai cercando non sembra esistere. Controlla l\'URL e riprova.',
'not-found.back-to-home': 'Torna alla home',
// Demo
'demo.popup.description': 'Questo è un ambiente demo, tutti i dati vengono salvati nello storage locale del browser.',
'demo.popup.discord': 'Unisciti a {{ discordLink }} per ricevere supporto, proporre funzionalità o semplicemente fare due chiacchiere.',
'demo.popup.discord-link-label': 'Server Discord',
'demo.popup.reset': 'Reimposta dati demo',
'demo.popup.hide': 'Nascondi',
// Color picker
'color-picker.hue': 'Tonalità',
'color-picker.saturation': 'Saturazione',
'color-picker.lightness': 'Luminosità',
'color-picker.select-color': 'Seleziona colore',
'color-picker.select-a-color': 'Seleziona un colore',
// Subscriptions
'subscriptions.checkout-success.title': 'Pagamento riuscito!',
'subscriptions.checkout-success.description': 'Il tuo abbonamento è stato attivato con successo.',
'subscriptions.checkout-success.thank-you': 'Grazie per l\'upgrade a Papra Plus. Ora hai accesso a tutte le funzionalità premium.',
'subscriptions.checkout-success.go-to-organizations': 'Vai alle Organizzazioni',
'subscriptions.checkout-success.redirecting': 'Reindirizzamento tra {{ count }} secondo{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Pagamento annullato',
'subscriptions.checkout-cancel.description': 'L\'upgrade del tuo abbonamento è stato annullato.',
'subscriptions.checkout-cancel.no-charges': 'Non sono stati effettuati addebiti sul tuo account. Puoi riprovare quando sei pronto.',
'subscriptions.checkout-cancel.back-to-organizations': 'Torna alle Organizzazioni',
'subscriptions.checkout-cancel.need-help': 'Hai bisogno di aiuto?',
'subscriptions.checkout-cancel.contact-support': 'Contatta il supporto',
'subscriptions.upgrade-dialog.title': 'Aggiorna questa organizzazione',
'subscriptions.upgrade-dialog.description': 'Sblocca funzionalità potenti per la tua organizzazione',
'subscriptions.upgrade-dialog.contact-us': 'Contattaci',
'subscriptions.upgrade-dialog.enterprise-plans': 'se hai bisogno di piani aziendali personalizzati.',
'subscriptions.upgrade-dialog.current-plan': 'Piano attuale',
'subscriptions.upgrade-dialog.recommended': 'Consigliato',
'subscriptions.upgrade-dialog.per-month': '/mese',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} fatturato annualmente',
'subscriptions.upgrade-dialog.upgrade-now': 'Aggiorna ora',
'subscriptions.upgrade-dialog.promo-banner.title': 'Offerta a tempo limitato',
'subscriptions.upgrade-dialog.promo-banner.description': 'Ottieni {{ percent }}% di sconto per organizzazione su tutti i piani per sempre come early adopter! L\'offerta scade tra {{ days, >1:{days} giorni, =1:1 giorno, meno di un giorno }}.',
'subscriptions.plan.free.name': 'Piano gratuito',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Dimensione archiviazione documenti',
'subscriptions.features.members': 'Membri dell\'organizzazione',
'subscriptions.features.members-count': '{{ count }} membri',
'subscriptions.features.email-intakes': 'Email di acquisizione',
'subscriptions.features.email-intakes-count-singular': '{{ count }} indirizzo',
'subscriptions.features.email-intakes-count-plural': '{{ count }} indirizzi',
'subscriptions.features.max-upload-size': 'Dimensione massima file caricamento',
'subscriptions.features.support': 'Supporto',
'subscriptions.features.support-community': 'Supporto della comunità',
'subscriptions.features.support-email': 'Supporto via email',
'subscriptions.features.support-priority': 'Supporto prioritario',
'subscriptions.billing-interval.monthly': 'Mensile',
'subscriptions.billing-interval.annual': 'Annuale',
'subscriptions.usage-warning.message': 'Hai utilizzato il {{ percent }}% dello spazio di archiviazione dei documenti. Considera l\'aggiornamento del piano per ottenere più spazio.',
'subscriptions.usage-warning.upgrade-button': 'Aggiorna piano',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Digita "{{ text }}" per confermare',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Reimposta la tua password
auth.request-password-reset.description: Inserisci la tua email per reimpostare la password.
auth.request-password-reset.requested: Se esiste un account per questa email, ti abbiamo inviato un'email per reimpostare la password.
auth.request-password-reset.back-to-login: Torna al login
auth.request-password-reset.form.email.label: Email
auth.request-password-reset.form.email.placeholder: 'Esempio: ada@papra.app'
auth.request-password-reset.form.email.required: Inserisci il tuo indirizzo email
auth.request-password-reset.form.email.invalid: Questo indirizzo email non è valido
auth.request-password-reset.form.submit: Richiedi reimpostazione password
auth.reset-password.title: Reimposta la tua password
auth.reset-password.description: Inserisci la nuova password per reimpostare la password.
auth.reset-password.reset: La tua password è stata reimpostata.
auth.reset-password.back-to-login: Torna al login
auth.reset-password.form.new-password.label: Nuova password
auth.reset-password.form.new-password.placeholder: 'Esempio: **********'
auth.reset-password.form.new-password.required: Inserisci la tua nuova password
auth.reset-password.form.new-password.min-length: La password deve essere di almeno {{ minLength }} caratteri
auth.reset-password.form.new-password.max-length: La password deve essere inferiore a {{ maxLength }} caratteri
auth.reset-password.form.submit: Reimposta password
auth.email-provider.open: Apri {{ provider }}
auth.login.title: Accedi a Papra
auth.login.description: Inserisci la tua email o usa un provider per accedere al tuo account Papra.
auth.login.login-with-provider: Accedi con {{ provider }}
auth.login.no-account: Non hai un account?
auth.login.register: Registrati
auth.login.form.email.label: Email
auth.login.form.email.placeholder: 'Esempio: ada@papra.app'
auth.login.form.email.required: Inserisci il tuo indirizzo email
auth.login.form.email.invalid: Questo indirizzo email non è valido
auth.login.form.password.label: Password
auth.login.form.password.placeholder: Imposta una password
auth.login.form.password.required: Inserisci la tua password
auth.login.form.remember-me.label: Ricordami
auth.login.form.forgot-password.label: Password dimenticata?
auth.login.form.submit: Accedi
auth.register.title: Registrati a Papra
auth.register.description: Crea un account per iniziare a usare Papra.
auth.register.register-with-email: Registrati tramite email
auth.register.register-with-provider: Registrati tramite {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Hai già un account?
auth.register.login: Accedi
auth.register.registration-disabled.title: Registrazione disabilitata
auth.register.registration-disabled.description: La creazione di nuovi account è attualmente disabilitata su questa istanza di Papra. Solo gli utenti con account esistenti possono accedere. Se pensi che sia un errore, contatta l'amministratore di questa istanza.
auth.register.form.email.label: Email
auth.register.form.email.placeholder: 'Esempio: ada@papra.app'
auth.register.form.email.required: Inserisci il tuo indirizzo email
auth.register.form.email.invalid: Questo indirizzo email non è valido
auth.register.form.password.label: Password
auth.register.form.password.placeholder: Imposta una password
auth.register.form.password.required: Inserisci la tua password
auth.register.form.password.min-length: La password deve essere di almeno {{ minLength }} caratteri
auth.register.form.password.max-length: La password deve essere inferiore a {{ maxLength }} caratteri
auth.register.form.name.label: Nome
auth.register.form.name.placeholder: 'Esempio: Ada Lovelace'
auth.register.form.name.required: Inserisci il tuo nome
auth.register.form.name.max-length: Il nome deve essere inferiore a {{ maxLength }} caratteri
auth.register.form.submit: Registrati
auth.email-validation-required.title: Verifica la tua email
auth.email-validation-required.description: Una email di verifica è stata inviata al tuo indirizzo email. Verifica il tuo indirizzo cliccando il link nell'email.
auth.legal-links.description: Continuando, confermi di aver letto e accettato i {{ terms }} e l'{{ privacy }}.
auth.legal-links.terms: Termini di servizio
auth.legal-links.privacy: Informativa sulla privacy
auth.no-auth-provider.title: Nessun provider di autenticazione
auth.no-auth-provider.description: Nessun provider di autenticazione è abilitato su questa istanza di Papra. Contatta l'amministratore di questa istanza per abilitarli.
# User settings
user.settings.title: Impostazioni utente
user.settings.description: Gestisci qui le impostazioni del tuo account.
user.settings.email.title: Indirizzo email
user.settings.email.description: Il tuo indirizzo email non può essere modificato.
user.settings.email.label: Indirizzo email
user.settings.name.title: Nome completo
user.settings.name.description: Il tuo nome completo è visibile agli altri membri dell'organizzazione.
user.settings.name.label: Nome completo
user.settings.name.placeholder: Es. Mario Rossi
user.settings.name.update: Aggiorna nome
user.settings.name.updated: Il tuo nome completo è stato aggiornato
user.settings.logout.title: Logout
user.settings.logout.description: Esci dal tuo account. Potrai accedere nuovamente in seguito.
user.settings.logout.button: Esci
# Organizations
organizations.list.title: Le tue organizzazioni
organizations.list.description: Le organizzazioni sono un modo per raggruppare i tuoi documenti e gestire l'accesso. Puoi creare più organizzazioni e invitare i tuoi collaboratori.
organizations.list.create-new: Crea una nuova organizzazione
organizations.details.no-documents.title: Nessun documento
organizations.details.no-documents.description: Non ci sono ancora documenti in questa organizzazione. Inizia caricando dei documenti.
organizations.details.upload-documents: Carica documenti
organizations.details.documents-count: documenti in totale
organizations.details.total-size: dimensione totale
organizations.details.latest-documents: Ultimi documenti importati
organizations.create.title: Crea una nuova organizzazione
organizations.create.description: I tuoi documenti saranno raggruppati per organizzazione. Puoi creare più organizzazioni per separare i documenti, ad esempio per uso personale e lavorativo.
organizations.create.back: Indietro
organizations.create.error.max-count-reached: Hai raggiunto il numero massimo di organizzazioni che puoi creare, se hai bisogno di crearne altre contatta il supporto.
organizations.create.form.name.label: Nome organizzazione
organizations.create.form.name.placeholder: Es. Acme Inc.
organizations.create.form.name.required: Inserisci il nome dell'organizzazione
organizations.create.form.submit: Crea organizzazione
organizations.create.success: Organizzazione creata con successo
organizations.create-first.title: Crea la tua organizzazione
organizations.create-first.description: I tuoi documenti saranno raggruppati per organizzazione. Puoi creare più organizzazioni per separare i documenti, ad esempio per uso personale e lavorativo.
organizations.create-first.default-name: La mia organizzazione
organizations.create-first.user-name: 'Organizzazione di {{ name }}'
organization.settings.title: Impostazioni organizzazione
organization.settings.page.title: Impostazioni organizzazione
organization.settings.page.description: Gestisci qui le impostazioni della tua organizzazione.
organization.settings.name.title: Nome organizzazione
organization.settings.name.update: Aggiorna nome
organization.settings.name.placeholder: Es. Acme Inc.
organization.settings.name.updated: Nome organizzazione aggiornato
organization.settings.subscription.title: Sottoscrizione
organization.settings.subscription.description: Gestisci fatturazione, fatture e metodi di pagamento.
organization.settings.subscription.manage: Gestisci sottoscrizione
organization.settings.subscription.error: Impossibile ottenere l'URL del portale clienti
organization.settings.delete.title: Elimina organizzazione
organization.settings.delete.description: Eliminando questa organizzazione rimuoverai definitivamente tutti i dati associati.
organization.settings.delete.confirm.title: Elimina organizzazione
organization.settings.delete.confirm.message: Sei sicuro di voler eliminare questa organizzazione? Questa azione non può essere annullata e tutti i dati associati saranno rimossi in modo permanente.
organization.settings.delete.confirm.confirm-button: Elimina organizzazione
organization.settings.delete.confirm.cancel-button: Annulla
organization.settings.delete.success: Organizzazione eliminata
organizations.members.title: Membri
organizations.members.description: Gestisci i membri della tua organizzazione
organizations.members.invite-member: Invita membro
organizations.members.invite-member-disabled-tooltip: Solo gli amministratori o i proprietari possono invitare membri nell'organizzazione
organizations.members.remove-from-organization: Rimuovi dall'organizzazione
organizations.members.role: Ruolo
organizations.members.roles.owner: Proprietario
organizations.members.roles.admin: Amministratore
organizations.members.roles.member: Membro
organizations.members.delete.confirm.title: Rimuovi membro
organizations.members.delete.confirm.message: Sei sicuro di voler rimuovere questo membro dall'organizzazione?
organizations.members.delete.confirm.confirm-button: Rimuovi
organizations.members.delete.confirm.cancel-button: Annulla
organizations.members.delete.success: Membro rimosso dall'organizzazione
organizations.members.update-role.success: Ruolo del membro aggiornato
organizations.members.table.headers.name: Nome
organizations.members.table.headers.email: Email
organizations.members.table.headers.role: Ruolo
organizations.members.table.headers.created: Creato
organizations.members.table.headers.actions: Azioni
organizations.invite-member.title: Invita membro
organizations.invite-member.description: Invita un membro nella tua organizzazione
organizations.invite-member.form.email.label: Email
organizations.invite-member.form.email.placeholder: 'Esempio: ada@papra.app'
organizations.invite-member.form.email.required: Inserisci un indirizzo email valido
organizations.invite-member.form.role.label: Ruolo
organizations.invite-member.form.submit: Invita nell'organizzazione
organizations.invite-member.success.message: Membro invitato
organizations.invite-member.success.description: Il membro è stato invitato nell'organizzazione.
organizations.invite-member.error.message: Impossibile invitare il membro
organizations.invitations.title: Inviti
organizations.invitations.description: Gestisci gli inviti della tua organizzazione
organizations.invitations.list.cta: Invita membro
organizations.invitations.list.empty.title: Nessun invito in sospeso
organizations.invitations.list.empty.description: Non sei stato ancora invitato in nessuna organizzazione.
organizations.invitations.status.pending: In sospeso
organizations.invitations.status.accepted: Accettato
organizations.invitations.status.rejected: Rifiutato
organizations.invitations.status.expired: Scaduto
organizations.invitations.status.cancelled: Cancellato
organizations.invitations.resend: Invia di nuovo invito
organizations.invitations.cancel.title: Annulla invito
organizations.invitations.cancel.description: Sei sicuro di voler annullare questo invito?
organizations.invitations.cancel.confirm: Annulla invito
organizations.invitations.cancel.cancel: Annulla
organizations.invitations.resend.title: Invia di nuovo invito
organizations.invitations.resend.description: Sei sicuro di voler inviare nuovamente questo invito? Sarà inviata una nuova email al destinatario.
organizations.invitations.resend.confirm: Invia invito
organizations.invitations.resend.cancel: Annulla
invitations.list.title: Inviti
invitations.list.description: Gestisci gli inviti della tua organizzazione
invitations.list.empty.title: Nessun invito in sospeso
invitations.list.empty.description: Non sei stato ancora invitato in nessuna organizzazione.
invitations.list.headers.organization: Organizzazione
invitations.list.headers.status: Stato
invitations.list.headers.created: Creato
invitations.list.headers.actions: Azioni
invitations.list.actions.accept: Accetta
invitations.list.actions.reject: Rifiuta
invitations.list.actions.accept.success.message: Invito accettato
invitations.list.actions.accept.success.description: L'invito è stato accettato.
invitations.list.actions.reject.success.message: Invito rifiutato
invitations.list.actions.reject.success.description: L'invito è stato rifiutato.
# Documents
documents.list.title: Documenti
documents.list.no-documents.title: Nessun documento
documents.list.no-documents.description: Non ci sono ancora documenti in questa organizzazione. Inizia caricando dei documenti.
documents.list.no-results: Nessun documento trovato
documents.tabs.info: Info
documents.tabs.content: Contenuto
documents.tabs.activity: Attività
documents.deleted.message: Questo documento è stato eliminato e sarà rimosso definitivamente tra {{ days }} giorni.
documents.actions.download: Scarica
documents.actions.open-in-new-tab: Apri in una nuova scheda
documents.actions.restore: Ripristina
documents.actions.delete: Elimina
documents.actions.edit: Modifica
documents.actions.cancel: Annulla
documents.actions.save: Salva
documents.actions.saving: Salvataggio in corso...
documents.content.alert: Il contenuto del documento è estratto automaticamente al caricamento. È usato solo per la ricerca e l'indicizzazione.
documents.info.id: ID
documents.info.name: Nome
documents.info.type: Tipo
documents.info.size: Dimensione
documents.info.created-at: Creato il
documents.info.updated-at: Aggiornato il
documents.info.never: Mai
documents.rename.title: Rinomina documento
documents.rename.form.name.label: Nome
documents.rename.form.name.placeholder: 'Esempio: Fattura 2024'
documents.rename.form.name.required: Inserisci un nome per il documento
documents.rename.form.name.max-length: Il nome deve essere inferiore a 255 caratteri
documents.rename.form.submit: Rinomina documento
documents.rename.success: Documento rinominato con successo
documents.rename.cancel: Annulla
import-documents.title.error: '{{ count }} documenti non importati'
import-documents.title.success: '{{ count }} documenti importati'
import-documents.title.pending: '{{ count }} / {{ total }} documenti importati'
import-documents.title.none: Importa documenti
import-documents.no-import-in-progress: Nessuna importazione documenti in corso
documents.deleted.title: Documenti eliminati
documents.deleted.empty.title: Nessun documento eliminato
documents.deleted.empty.description: Non hai documenti eliminati. I documenti eliminati saranno spostati nel cestino per {{ days }} giorni.
documents.deleted.retention-notice: Tutti i documenti eliminati sono conservati nel cestino per {{ days }} giorni. Passato questo periodo, saranno eliminati definitivamente e non potrai recuperarli.
documents.deleted.deleted-at: Eliminato il
documents.deleted.restoring: Ripristino in corso...
documents.deleted.deleting: Eliminazione in corso...
documents.preview.unknown-file-type: Nessuna anteprima disponibile per questo tipo di file
documents.preview.binary-file: Sembra essere un file binario e non può essere visualizzato come testo
trash.delete-all.button: Elimina tutto
trash.delete-all.confirm.title: Eliminare definitivamente tutti i documenti?
trash.delete-all.confirm.description: Sei sicuro di voler eliminare definitivamente tutti i documenti dal cestino? Questa azione non può essere annullata.
trash.delete-all.confirm.label: Elimina
trash.delete-all.confirm.cancel: Annulla
trash.delete.button: Elimina
trash.delete.confirm.title: Eliminare definitivamente il documento?
trash.delete.confirm.description: Sei sicuro di voler eliminare definitivamente questo documento dal cestino? Questa azione non può essere annullata.
trash.delete.confirm.label: Elimina
trash.delete.confirm.cancel: Annulla
trash.deleted.success.title: Documento eliminato
trash.deleted.success.description: Il documento è stato eliminato definitivamente.
activity.document.created: Documento creato
activity.document.updated.single: Il campo {{ field }} è stato aggiornato
activity.document.updated.multiple: I campi {{ fields }} sono stati aggiornati
activity.document.updated: Documento aggiornato
activity.document.deleted: Documento eliminato
activity.document.restored: Documento ripristinato
activity.document.tagged: Tag {{ tag }} aggiunto
activity.document.untagged: Tag {{ tag }} rimosso
activity.document.user.name: da {{ name }}
activity.load-more: Carica altri
activity.no-more-activities: Nessuna altra attività per questo documento
# Tags
tags.no-tags.title: Nessun tag
tags.no-tags.description: Questa organizzazione non ha ancora tag. I tag vengono usati per categorizzare i documenti. Puoi aggiungere tag ai tuoi documenti per trovarli e organizzarli più facilmente.
tags.no-tags.create-tag: Crea tag
tags.title: Tag dei documenti
tags.description: I tag vengono usati per categorizzare i documenti. Puoi aggiungere tag ai tuoi documenti per trovarli e organizzarli più facilmente.
tags.create: Crea tag
tags.update: Aggiorna tag
tags.delete: Elimina tag
tags.delete.confirm.title: Elimina tag
tags.delete.confirm.message: Sei sicuro di voler eliminare questo tag? Il tag verrà rimosso da tutti i documenti.
tags.delete.confirm.confirm-button: Elimina
tags.delete.confirm.cancel-button: Annulla
tags.delete.success: Tag eliminato con successo
tags.create.success: Tag "{{ name }}" creato con successo.
tags.update.success: Tag "{{ name }}" aggiornato con successo.
tags.form.name.label: Nome
tags.form.name.placeholder: Es. Contratti
tags.form.name.required: Inserisci un nome per il tag
tags.form.name.max-length: Il nome del tag deve essere inferiore a 64 caratteri
tags.form.color.label: Colore
tags.form.color.required: Inserisci un colore
tags.form.color.invalid: Il colore hex non è formattato correttamente.
tags.form.description.label: Descrizione
tags.form.description.optional: (opzionale)
tags.form.description.placeholder: Es. Tutti i contratti firmati dall'azienda
tags.form.description.max-length: La descrizione deve essere inferiore a 256 caratteri
tags.form.no-description: Nessuna descrizione
tags.table.headers.tag: Tag
tags.table.headers.description: Descrizione
tags.table.headers.documents: Documenti
tags.table.headers.created: Creato
tags.table.headers.actions: Azioni
# Tagging rules
tagging-rules.field.name: nome documento
tagging-rules.field.content: contenuto documento
tagging-rules.operator.equals: uguale a
tagging-rules.operator.not-equals: diverso da
tagging-rules.operator.contains: contiene
tagging-rules.operator.not-contains: non contiene
tagging-rules.operator.starts-with: inizia con
tagging-rules.operator.ends-with: termina con
tagging-rules.list.title: Regole di tagging
tagging-rules.list.description: Gestisci le regole di tagging della tua organizzazione per taggare automaticamente i documenti in base a condizioni definite da te.
tagging-rules.list.demo-warning: 'Nota: Essendo un ambiente demo (senza server), le regole di tagging non verranno applicate ai nuovi documenti.'
tagging-rules.list.no-tagging-rules.title: Nessuna regola di tagging
tagging-rules.list.no-tagging-rules.description: Crea una regola per taggare automaticamente i documenti aggiunti in base a condizioni definite da te.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Crea regola di tagging
tagging-rules.list.card.no-conditions: Nessuna condizione
tagging-rules.list.card.one-condition: 1 condizione
tagging-rules.list.card.conditions: '{{ count }} condizioni'
tagging-rules.list.card.delete: Elimina regola
tagging-rules.list.card.edit: Modifica regola
tagging-rules.create.title: Crea regola di tagging
tagging-rules.create.success: Regola di tagging creata con successo
tagging-rules.create.error: Errore nella creazione della regola di tagging
tagging-rules.create.submit: Crea regola
tagging-rules.form.name.label: Nome
tagging-rules.form.name.placeholder: 'Esempio: Tagga fatture'
tagging-rules.form.name.min-length: Inserisci un nome per la regola
tagging-rules.form.name.max-length: Il nome deve essere inferiore a 64 caratteri
tagging-rules.form.description.label: Descrizione
tagging-rules.form.description.placeholder: "Esempio: Tagga i documenti con 'fattura' nel nome"
tagging-rules.form.description.max-length: La descrizione deve essere inferiore a 256 caratteri
tagging-rules.form.conditions.label: Condizioni
tagging-rules.form.conditions.description: Definisci le condizioni che devono essere soddisfatte affinché la regola si applichi. Tutte le condizioni devono essere soddisfatte.
tagging-rules.form.conditions.add-condition: Aggiungi condizione
tagging-rules.form.conditions.no-conditions.title: Nessuna condizione
tagging-rules.form.conditions.no-conditions.description: Non hai aggiunto nessuna condizione a questa regola. Questa regola applicherà i suoi tag a tutti i documenti.
tagging-rules.form.conditions.no-conditions.confirm: Applica regola senza condizioni
tagging-rules.form.conditions.no-conditions.cancel: Annulla
tagging-rules.form.conditions.value.placeholder: 'Esempio: fattura'
tagging-rules.form.conditions.value.min-length: Inserisci un valore per la condizione
tagging-rules.form.tags.label: Tag
tagging-rules.form.tags.description: Seleziona i tag da applicare ai documenti che soddisfano le condizioni
tagging-rules.form.tags.min-length: È richiesto almeno un tag da applicare
tagging-rules.form.tags.add-tag: Crea tag
tagging-rules.form.submit: Crea regola
tagging-rules.update.title: Aggiorna regola di tagging
tagging-rules.update.error: Errore nell'aggiornamento della regola di tagging
tagging-rules.update.submit: Aggiorna regola
tagging-rules.update.cancel: Annulla
# Intake emails
intake-emails.title: Email di acquisizione
intake-emails.description: Gli indirizzi email di acquisizione vengono usati per importare automaticamente email in Papra. Basta inoltrare le email all'indirizzo di acquisizione e gli allegati saranno aggiunti ai documenti dell'organizzazione.
intake-emails.disabled.title: Email di acquisizione disabilitate
intake-emails.disabled.description: Le email di acquisizione sono disabilitate su questa istanza. Contatta il tuo amministratore per abilitarle. Consulta la {{ documentation }} per maggiori informazioni.
intake-emails.disabled.documentation: documentazione
intake-emails.info: Solo le email di acquisizione abilitate provenienti da origini consentite saranno processate. Puoi abilitare o disabilitare un'email di acquisizione in qualsiasi momento.
intake-emails.empty.title: Nessuna email di acquisizione
intake-emails.empty.description: Genera un indirizzo di acquisizione per importare facilmente allegati email.
intake-emails.empty.generate: Genera email di acquisizione
intake-emails.count: '{{ count }} email di acquisizione per questa organizzazione'
intake-emails.new: Nuova email di acquisizione
intake-emails.disabled-label: (Disabilitata)
intake-emails.no-origins: Nessuna origine email consentita
intake-emails.allowed-origins: Consentito da {{ count }} indirizzo/i
intake-emails.actions.enable: Abilita
intake-emails.actions.disable: Disabilita
intake-emails.actions.manage-origins: Gestisci indirizzi origine
intake-emails.actions.delete: Elimina
intake-emails.delete.confirm.title: Eliminare l'email di acquisizione?
intake-emails.delete.confirm.message: Sei sicuro di voler eliminare questa email di acquisizione? Questa azione non può essere annullata.
intake-emails.delete.confirm.confirm-button: Elimina email di acquisizione
intake-emails.delete.confirm.cancel-button: Annulla
intake-emails.delete.success: Email di acquisizione eliminata
intake-emails.create.success: Email di acquisizione creata
intake-emails.update.success.enabled: Email di acquisizione abilitata
intake-emails.update.success.disabled: Email di acquisizione disabilitata
intake-emails.allowed-origins.title: Origini consentite
intake-emails.allowed-origins.description: Solo le email inviate a {{ email }} da queste origini saranno processate. Se non sono specificate origini, tutte le email saranno scartate.
intake-emails.allowed-origins.add.label: Aggiungi email origine consentita
intake-emails.allowed-origins.add.placeholder: Es. ada@papra.app
intake-emails.allowed-origins.add.button: Aggiungi
intake-emails.allowed-origins.add.error.exists: Questa email è già tra le origini consentite per questa email di acquisizione
# API keys
api-keys.permissions.documents.title: Documenti
api-keys.permissions.documents.documents:create: Crea documenti
api-keys.permissions.documents.documents:read: Leggi documenti
api-keys.permissions.documents.documents:update: Aggiorna documenti
api-keys.permissions.documents.documents:delete: Elimina documenti
api-keys.permissions.tags.title: Tag
api-keys.permissions.tags.tags:create: Crea tag
api-keys.permissions.tags.tags:read: Leggi tag
api-keys.permissions.tags.tags:update: Aggiorna tag
api-keys.permissions.tags.tags:delete: Elimina tag
api-keys.create.title: Crea chiave API
api-keys.create.description: Crea una nuova chiave API per accedere all'API di Papra.
api-keys.create.success: La chiave API è stata creata con successo.
api-keys.create.back: Torna alle chiavi API
api-keys.create.form.name.label: Nome
api-keys.create.form.name.placeholder: 'Esempio: La mia chiave API'
api-keys.create.form.name.required: Inserisci un nome per la chiave API
api-keys.create.form.permissions.label: Permessi
api-keys.create.form.permissions.required: Seleziona almeno un permesso
api-keys.create.form.submit: Crea chiave API
api-keys.create.created.title: Chiave API creata
api-keys.create.created.description: La chiave API è stata creata con successo. Salvala in un luogo sicuro, non verrà più mostrata.
api-keys.list.title: Chiavi API
api-keys.list.description: Gestisci qui le tue chiavi API.
api-keys.list.create: Crea chiave API
api-keys.list.empty.title: Nessuna chiave API
api-keys.list.empty.description: Crea una chiave API per accedere all'API di Papra.
api-keys.list.card.last-used: Ultimo utilizzo
api-keys.list.card.never: Mai
api-keys.list.card.created: Creato
api-keys.delete.success: La chiave API è stata eliminata con successo
api-keys.delete.confirm.title: Eliminare la chiave API
api-keys.delete.confirm.message: Sei sicuro di voler eliminare questa chiave API? Questa azione non può essere annullata.
api-keys.delete.confirm.confirm-button: Elimina
api-keys.delete.confirm.cancel-button: Annulla
# Webhooks
webhooks.list.title: Webhook
webhooks.list.description: Gestisci i webhook della tua organizzazione
webhooks.list.empty.title: Nessun webhook
webhooks.list.empty.description: Crea il tuo primo webhook per iniziare a ricevere eventi
webhooks.list.create: Crea webhook
webhooks.list.card.last-triggered: Ultima attivazione
webhooks.list.card.never: Mai
webhooks.list.card.created: Creato
webhooks.create.title: Crea webhook
webhooks.create.description: Crea un nuovo webhook per ricevere eventi
webhooks.create.success: Webhook creato con successo
webhooks.create.back: Indietro
webhooks.create.form.submit: Crea webhook
webhooks.create.form.name.label: Nome webhook
webhooks.create.form.name.placeholder: Inserisci nome webhook
webhooks.create.form.name.required: Il nome è obbligatorio
webhooks.create.form.url.label: URL webhook
webhooks.create.form.url.placeholder: Inserisci URL webhook
webhooks.create.form.url.required: L'URL è obbligatorio
webhooks.create.form.url.invalid: L'URL non è valido
webhooks.create.form.secret.label: Segreto
webhooks.create.form.secret.placeholder: Inserisci il segreto del webhook
webhooks.create.form.events.label: Eventi
webhooks.create.form.events.required: È richiesto almeno un evento
webhooks.update.title: Modifica webhook
webhooks.update.description: Aggiorna i dettagli del webhook
webhooks.update.success: Webhook aggiornato con successo
webhooks.update.submit: Aggiorna webhook
webhooks.update.cancel: Annulla
webhooks.update.form.secret.placeholder: Inserisci nuovo segreto
webhooks.update.form.secret.placeholder-redacted: '[Segreto nascosto]'
webhooks.update.form.rotate-secret.button: Rigenera segreto
webhooks.delete.success: Webhook eliminato con successo
webhooks.delete.confirm.title: Eliminare webhook
webhooks.delete.confirm.message: Sei sicuro di voler eliminare questo webhook?
webhooks.delete.confirm.confirm-button: Elimina
webhooks.delete.confirm.cancel-button: Annulla
webhooks.events.documents.title: Eventi documenti
webhooks.events.documents.document:created.description: Documento creato
webhooks.events.documents.document:deleted.description: Documento eliminato
webhooks.events.documents.document:updated.description: Documento aggiornato
webhooks.events.documents.document:tag:added.description: Un tag è stato aggiunto a un documento
webhooks.events.documents.document:tag:removed.description: Un tag è stato rimosso da un documento
# Navigation
layout.menu.home: Home
layout.menu.documents: Documenti
layout.menu.tags: Tag
layout.menu.tagging-rules: Regole di tagging
layout.menu.deleted-documents: Documenti eliminati
layout.menu.organization-settings: Impostazioni
layout.menu.api-keys: Chiavi API
layout.menu.settings: Impostazioni
layout.menu.account: Account
layout.menu.general-settings: Impostazioni generali
layout.menu.intake-emails: Email di acquisizione
layout.menu.webhooks: Webhook
layout.menu.members: Membri
layout.menu.invitations: Inviti
layout.theme.light: Modalità chiara
layout.theme.dark: Modalità scura
layout.theme.system: Modalità sistema
layout.search.placeholder: Cerca...
layout.menu.import-document: Importa un documento
user-menu.account-settings: Impostazioni account
user-menu.api-keys: Chiavi API
user-menu.invitations: Inviti
user-menu.language: Lingua
user-menu.logout: Esci
# Command palette
command-palette.search.placeholder: Cerca comandi o documenti
command-palette.no-results: Nessun risultato trovato
command-palette.sections.documents: Documenti
command-palette.sections.theme: Tema
# API errors
api-errors.document.already_exists: Il documento esiste già
api-errors.document.file_too_big: Il file del documento è troppo grande
api-errors.intake_email.limit_reached: È stato raggiunto il numero massimo di email di acquisizione per questa organizzazione. Aggiorna il tuo piano per crearne altre.
api-errors.user.max_organization_count_reached: Hai raggiunto il numero massimo di organizzazioni che puoi creare, se hai bisogno di crearne altre contatta il supporto.
api-errors.default: Si è verificato un errore durante l'elaborazione della richiesta.
api-errors.organization.invitation_already_exists: Esiste già un invito per questa email in questa organizzazione.
api-errors.user.already_in_organization: Questo utente è già in questa organizzazione.
api-errors.user.organization_invitation_limit_reached: È stato raggiunto il numero massimo di inviti per oggi. Riprova domani.
api-errors.demo.not_available: Questa funzionalità non è disponibile nella demo
api-errors.tags.already_exists: Esiste già un tag con questo nome per questa organizzazione
api-errors.internal.error: Si è verificato un errore durante l'elaborazione della richiesta. Riprova.
api-errors.auth.invalid_origin: Origine dell'applicazione non valida. Se stai ospitando Papra, assicurati che la variabile di ambiente APP_BASE_URL corrisponda all'URL corrente. Per maggiori dettagli, consulta https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Non trovato
not-found.description: Spiacenti, la pagina che stai cercando non sembra esistere. Controlla l'URL e riprova.
not-found.back-to-home: Torna alla home
# Demo
demo.popup.description: Questo è un ambiente demo, tutti i dati vengono salvati nello storage locale del browser.
demo.popup.discord: Unisciti a {{ discordLink }} per ricevere supporto, proporre funzionalità o semplicemente fare due chiacchiere.
demo.popup.discord-link-label: Server Discord
demo.popup.reset: Reimposta dati demo
demo.popup.hide: Nascondi
# Color picker
color-picker.hue: Tonalità
color-picker.saturation: Saturazione
color-picker.lightness: Luminosità
color-picker.select-color: Seleziona colore
color-picker.select-a-color: Seleziona un colore

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Zresetuj swoje hasło',
'auth.request-password-reset.description': 'Wprowadź swój adres e-mail, aby zresetować hasło.',
'auth.request-password-reset.requested': 'Jeśli istnieje konto powiązane z tym adresem e-mail, otrzymasz wiadomość umożliwiającą zresetowanie hasła.',
'auth.request-password-reset.back-to-login': 'Wróć do logowania',
'auth.request-password-reset.form.email.label': 'E-mail',
'auth.request-password-reset.form.email.placeholder': 'Przykład: ada@papra.app',
'auth.request-password-reset.form.email.required': 'Wprowadź swój adres e-mail',
'auth.request-password-reset.form.email.invalid': 'Ten adres e-mail jest nieprawidłowy',
'auth.request-password-reset.form.submit': 'Poproś o zresetowanie hasła',
'auth.reset-password.title': 'Zresetuj swoje hasło',
'auth.reset-password.description': 'Wprowadź nowe hasło, aby zresetować dotychczasowe.',
'auth.reset-password.reset': 'Twoje hasło zostało zresetowane.',
'auth.reset-password.back-to-login': 'Wróć do logowania',
'auth.reset-password.form.new-password.label': 'Nowe hasło',
'auth.reset-password.form.new-password.placeholder': 'Przykład: **********',
'auth.reset-password.form.new-password.required': 'Wprowadź nowe hasło',
'auth.reset-password.form.new-password.min-length': 'Hasło musi mieć co najmniej {{ minLength }} znaków',
'auth.reset-password.form.new-password.max-length': 'Hasło musi mieć mniej niż {{ maxLength }} znaków',
'auth.reset-password.form.submit': 'Zresetuj hasło',
'auth.email-provider.open': 'Otwórz {{ provider }}',
'auth.login.title': 'Zaloguj się do Papra',
'auth.login.description': 'Wprowadź swój adres e-mail lub skorzystaj z logowania federacyjnego, aby uzyskać dostęp do swojego konta Papra.',
'auth.login.login-with-provider': 'Zaloguj się za pomocą {{ provider }}',
'auth.login.no-account': 'Nie masz konta?',
'auth.login.register': 'Zarejestruj się',
'auth.login.form.email.label': 'E-mail',
'auth.login.form.email.placeholder': 'Przykład: ada@papra.app',
'auth.login.form.email.required': 'Wprowadź swój adres e-mail',
'auth.login.form.email.invalid': 'Ten adres e-mail jest nieprawidłowy',
'auth.login.form.password.label': 'Hasło',
'auth.login.form.password.placeholder': 'Ustaw hasło',
'auth.login.form.password.required': 'Wprowadź swoje hasło',
'auth.login.form.remember-me.label': 'Zapamiętaj mnie',
'auth.login.form.forgot-password.label': 'Zapomniałeś hasła?',
'auth.login.form.submit': 'Zaloguj się',
'auth.register.title': 'Zarejestruj się w Papra',
'auth.register.description': 'Utwórz konto, aby zacząć korzystać z Papra.',
'auth.register.register-with-email': 'Zarejestruj się przez e-mail',
'auth.register.register-with-provider': 'Zarejestruj się przez {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Masz już konto?',
'auth.register.login': 'Zaloguj się',
'auth.register.registration-disabled.title': 'Rejestracja jest wyłączona',
'auth.register.registration-disabled.description': 'Tworzenie nowych kont na tej instancji Papra jest obecnie wyłączone. Tylko użytkownicy z istniejącymi kontami mogą się zalogować. Jeśli uważasz, że to błąd, skontaktuj się z administratorem tej instancji.',
'auth.register.form.email.label': 'E-mail',
'auth.register.form.email.placeholder': 'Przykład: ada@papra.app',
'auth.register.form.email.required': 'Wprowadź swój adres e-mail',
'auth.register.form.email.invalid': 'Ten adres e-mail jest nieprawidłowy',
'auth.register.form.password.label': 'Hasło',
'auth.register.form.password.placeholder': 'Ustaw hasło',
'auth.register.form.password.required': 'Wprowadź swoje hasło',
'auth.register.form.password.min-length': 'Hasło musi mieć co najmniej {{ minLength }} znaków',
'auth.register.form.password.max-length': 'Hasło musi mieć mniej niż {{ maxLength }} znaków',
'auth.register.form.name.label': 'Imię i nazwisko',
'auth.register.form.name.placeholder': 'Przykład: Ada Lovelace',
'auth.register.form.name.required': 'Wprowadź swoje imię i nazwisko',
'auth.register.form.name.max-length': 'Imię i nazwisko musi mieć mniej niż {{ maxLength }} znaków',
'auth.register.form.submit': 'Zarejestruj się',
'auth.email-validation-required.title': 'Zweryfikuj swój adres e-mail',
'auth.email-validation-required.description': 'Wiadomość weryfikacyjna została wysłana na Twój adres e-mail. Zweryfikuj swój adres e-mail, klikając link w wiadomości.',
'auth.email-verification.success.title': 'E-mail zweryfikowany',
'auth.email-verification.success.description': 'Twój adres e-mail został pomyślnie zweryfikowany. Możesz teraz zalogować się do swojego konta.',
'auth.email-verification.success.login': 'Przejdź do logowania',
'auth.email-verification.error.title': 'Weryfikacja nie powiodła się',
'auth.email-verification.error.description': 'Link weryfikacyjny jest nieprawidłowy lub wygasł. Poproś o nową wiadomość weryfikacyjną, logując się.',
'auth.email-verification.error.back': 'Powrót do logowania',
'auth.legal-links.description': 'Kontynuując, potwierdzasz, że rozumiesz i zgadzasz się na {{ terms }} oraz {{ privacy }}.',
'auth.legal-links.terms': 'Warunki korzystania z usługi',
'auth.legal-links.privacy': 'Polityka prywatności',
'auth.no-auth-provider.title': 'Brak dostawcy uwierzytelniania',
'auth.no-auth-provider.description': 'Na tej instancji Papra nie ma włączonych dostawców uwierzytelniania. Skontaktuj się z administratorem tej instancji, aby je włączyć.',
// User settings
'user.settings.title': 'Ustawienia użytkownika',
'user.settings.description': 'Zarządzaj ustawieniami swojego konta.',
'user.settings.email.title': 'Adres e-mail',
'user.settings.email.description': 'Twój adres e-mail nie może być zmieniony.',
'user.settings.email.label': 'Adres e-mail',
'user.settings.name.title': 'Imię i nazwisko',
'user.settings.name.description': 'Twoje imię i nazwisko jest wyświetlane innym członkom organizacji.',
'user.settings.name.label': 'Imię i nazwisko',
'user.settings.name.placeholder': 'Przykład: Jan Kowalski',
'user.settings.name.update': 'Zaktualizuj imię i nazwisko',
'user.settings.name.updated': 'Twoje imię i nazwisko zostało zaktualizowane',
'user.settings.logout.title': 'Wyloguj się',
'user.settings.logout.description': 'Wyloguj się ze swojego konta. Możesz zalogować się ponownie później.',
'user.settings.logout.button': 'Wyloguj się',
// Organizations
'organizations.list.title': 'Twoje organizacje',
'organizations.list.description': 'Organizacje to sposób grupowania dokumentów i zarządzania dostępem do nich. Możesz tworzyć wiele organizacji i zapraszać członków zespołu do współpracy.',
'organizations.list.create-new': 'Utwórz nową organizację',
'organizations.list.back': 'Powrót do organizacji',
'organizations.list.deleted.title': 'Usunięte organizacje',
'organizations.list.deleted.description': 'Usunięte organizacje są przechowywane przez {{ days }} dni przed trwałym usunięciem. Możesz je przywrócić w tym okresie.',
'organizations.list.deleted.empty': 'Brak usuniętych organizacji',
'organizations.list.deleted.empty-description': 'Kiedy usuniesz organizację, pojawi się tutaj na {{ days }} dni przed trwałym usunięciem.',
'organizations.list.deleted.restore': 'Przywróć',
'organizations.list.deleted.restore-success': 'Organizacja została pomyślnie przywrócona',
'organizations.list.deleted.restore-confirm.title': 'Przywróć organizację',
'organizations.list.deleted.restore-confirm.message': 'Czy na pewno chcesz przywrócić tę organizację? Zostanie przeniesiona z powrotem do listy aktywnych organizacji.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Przywróć organizację',
'organizations.list.deleted.deleted-at': 'Usunięto {{ date }}',
'organizations.list.deleted.purge-at': 'Zostanie trwale usunięta {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} dzień, {daysUntilPurge} dni }} pozostał{{ daysUntilPurge, =1:o, o}})',
'organizations.details.no-documents.title': 'Brak dokumentów',
'organizations.details.no-documents.description': 'W tej organizacji nie ma jeszcze żadnych dokumentów. Zacznij od przesłania kilku dokumentów.',
'organizations.details.upload-documents': 'Prześlij dokumenty',
'organizations.details.documents-count': 'dokumentów w sumie',
'organizations.details.total-size': 'całkowity rozmiar',
'organizations.details.latest-documents': 'Najnowsze zaimportowane dokumenty',
'organizations.create.title': 'Utwórz nową organizację',
'organizations.create.description': 'Twoje dokumenty będą grupowane według organizacji. Możesz tworzyć wiele organizacji, aby oddzielić swoje dokumenty, na przykład dokumenty osobiste i służbowe.',
'organizations.create.back': 'Wstecz',
'organizations.create.error.max-count-reached': 'Osiągnąłeś maksymalną liczbę organizacji, które możesz utworzyć. Jeśli potrzebujesz utworzyć więcej, skontaktuj się z pomocą techniczną.',
'organizations.create.form.name.label': 'Nazwa organizacji',
'organizations.create.form.name.placeholder': 'Przykład: Acme Inc.',
'organizations.create.form.name.required': 'Wprowadź nazwę organizacji',
'organizations.create.form.submit': 'Utwórz organizację',
'organizations.create.success': 'Organizacja została pomyślnie utworzona',
'organizations.create-first.title': 'Utwórz swoją organizację',
'organizations.create-first.description': 'Twoje dokumenty będą grupowane według organizacji. Możesz tworzyć wiele organizacji, aby oddzielić swoje dokumenty, na przykład dokumenty osobiste i służbowe.',
'organizations.create-first.default-name': 'Moja organizacja',
'organizations.create-first.user-name': 'Organizacja użytkownika {{ name }}',
'organization.settings.title': 'Ustawienia organizacji',
'organization.settings.page.title': 'Ustawienia organizacji',
'organization.settings.page.description': 'Zarządzaj ustawieniami swojej organizacji.',
'organization.settings.name.title': 'Nazwa organizacji',
'organization.settings.name.update': 'Zaktualizuj nazwę',
'organization.settings.name.placeholder': 'Przykład: Acme Inc.',
'organization.settings.name.updated': 'Nazwa organizacji została zaktualizowana',
'organization.settings.subscription.title': 'Subskrypcja',
'organization.settings.subscription.description': 'Zarządzaj swoim rozliczeniem, fakturami i metodami płatności.',
'organization.settings.subscription.manage': 'Zarządzaj subskrypcją',
'organization.settings.subscription.error': 'Nie udało się uzyskać adresu URL portalu klienta',
'organization.settings.delete.title': 'Usuń organizację',
'organization.settings.delete.description': 'Usunięcie tej organizacji spowoduje trwałe usunięcie wszystkich danych z nią związanych.',
'organization.settings.delete.confirm.title': 'Usuń organizację',
'organization.settings.delete.confirm.message': 'Czy na pewno chcesz usunąć tę organizację? Organizacja zostanie oznaczona do usunięcia i trwale usunięta po {{ days}} dniach. W tym okresie możesz ją przywrócić z listy organizacji. Wszystkie dokumenty i dane zostaną trwale usunięte po upływie tego terminu.',
'organization.settings.delete.confirm.confirm-button': 'Usuń organizację',
'organization.settings.delete.confirm.cancel-button': 'Anuluj',
'organization.settings.delete.success': 'Organizacja została usunięta',
'organization.settings.delete.only-owner': 'Tylko właściciel organizacji może usunąć tę organizację.',
'organization.settings.delete.has-active-subscription': 'Nie można usunąć organizacji z aktywną subskrypcją, proszę najpierw anulować subskrypcję powyżej.',
'organization.usage.page.title': 'Użycie',
'organization.usage.page.description': 'Zobacz aktualne użycie i limity Twojej organizacji.',
'organization.usage.storage.title': 'Przechowywanie dokumentów',
'organization.usage.storage.description': 'Całkowite miejsce używane przez Twoje dokumenty',
'organization.usage.intake-emails.title': 'E-maile przychodzące',
'organization.usage.intake-emails.description': 'Liczba adresów e-mail przychodzących',
'organization.usage.members.title': 'Członkowie',
'organization.usage.members.description': 'Liczba członków w organizacji',
'organization.usage.unlimited': 'Nieograniczone',
'organizations.members.title': 'Członkowie',
'organizations.members.description': 'Zarządzaj członkami swojej organizacji',
'organizations.members.invite-member': 'Zaproś członka',
'organizations.members.invite-member-disabled-tooltip': 'Tylko administratorzy lub właściciele mogą zapraszać członków do organizacji',
'organizations.members.remove-from-organization': 'Usuń z organizacji',
'organizations.members.role': 'Rola',
'organizations.members.roles.owner': 'Właściciel',
'organizations.members.roles.admin': 'Administrator',
'organizations.members.roles.member': 'Członek',
'organizations.members.delete.confirm.title': 'Usuń członka',
'organizations.members.delete.confirm.message': 'Czy na pewno chcesz usunąć tego członka z organizacji?',
'organizations.members.delete.confirm.confirm-button': 'Usuń',
'organizations.members.delete.confirm.cancel-button': 'Anuluj',
'organizations.members.delete.success': 'Członek został usunięty z organizacji',
'organizations.members.update-role.success': 'Rola członka została zaktualizowana',
'organizations.members.table.headers.name': 'Imię i nazwisko',
'organizations.members.table.headers.email': 'E-mail',
'organizations.members.table.headers.role': 'Rola',
'organizations.members.table.headers.created': 'Utworzono',
'organizations.members.table.headers.actions': 'Akcje',
'organizations.invite-member.title': 'Zaproś członka',
'organizations.invite-member.description': 'Zaproś członka do swojej organizacji',
'organizations.invite-member.form.email.label': 'E-mail',
'organizations.invite-member.form.email.placeholder': 'Przykład: ada@papra.app',
'organizations.invite-member.form.email.required': 'Wprowadź poprawny adres e-mail',
'organizations.invite-member.form.role.label': 'Rola',
'organizations.invite-member.form.submit': 'Zaproś do organizacji',
'organizations.invite-member.success.message': 'Członek zaproszony',
'organizations.invite-member.success.description': 'E-mail został zaproszony do organizacji.',
'organizations.invite-member.error.message': 'Nie udało się zaprosić członka',
'organizations.invitations.title': 'Zaproszenia',
'organizations.invitations.description': 'Zarządzaj zaproszeniami do swojej organizacji',
'organizations.invitations.list.cta': 'Zaproś członka',
'organizations.invitations.list.empty.title': 'Brak oczekujących zaproszeń',
'organizations.invitations.list.empty.description': 'Nie zostałeś zaproszony do żadnej organizacji.',
'organizations.invitations.status.pending': 'Oczekujące',
'organizations.invitations.status.accepted': 'Zaakceptowane',
'organizations.invitations.status.rejected': 'Odrzucone',
'organizations.invitations.status.expired': 'Wygasłe',
'organizations.invitations.status.cancelled': 'Anulowane',
'organizations.invitations.resend': 'Wyślij zaproszenie ponownie',
'organizations.invitations.cancel.title': 'Anuluj zaproszenie',
'organizations.invitations.cancel.description': 'Czy na pewno chcesz anulować to zaproszenie?',
'organizations.invitations.cancel.confirm': 'Anuluj zaproszenie',
'organizations.invitations.cancel.cancel': 'Anuluj',
'organizations.invitations.resend.title': 'Wyślij zaproszenie ponownie',
'organizations.invitations.resend.description': 'Czy na pewno chcesz wysłać ponownie to zaproszenie? To spowoduje wysłanie nowego e-maila do odbiorcy.',
'organizations.invitations.resend.confirm': 'Wyślij zaproszenie ponownie',
'organizations.invitations.resend.cancel': 'Anuluj',
'invitations.list.title': 'Zaproszenia',
'invitations.list.description': 'Zarządzaj zaproszeniami do swojej organizacji',
'invitations.list.empty.title': 'Brak oczekujących zaproszeń',
'invitations.list.empty.description': 'Nie zostałeś zaproszony do żadnej organizacji.',
'invitations.list.headers.organization': 'Organizacja',
'invitations.list.headers.status': 'Status',
'invitations.list.headers.created': 'Utworzono',
'invitations.list.headers.actions': 'Akcje',
'invitations.list.actions.accept': 'Zaakceptuj',
'invitations.list.actions.reject': 'Odrzuć',
'invitations.list.actions.accept.success.message': 'Zaproszenie zaakceptowane',
'invitations.list.actions.accept.success.description': 'Zaproszenie zostało zaakceptowane.',
'invitations.list.actions.reject.success.message': 'Zaproszenie odrzucone',
'invitations.list.actions.reject.success.description': 'Zaproszenie zostało odrzucone.',
// Documents
'documents.list.title': 'Dokumenty',
'documents.list.no-documents.title': 'Brak dokumentów',
'documents.list.no-documents.description': 'W tej organizacji nie ma jeszcze żadnych dokumentów. Zacznij od przesłania kilku dokumentów.',
'documents.list.no-results': 'Nie znaleziono dokumentów',
'documents.tabs.info': 'Informacje',
'documents.tabs.content': 'Treść',
'documents.tabs.activity': 'Aktywność',
'documents.deleted.message': 'Ten dokument został usunięty i zostanie trwale usunięty za {{ days }} dni.',
'documents.actions.download': 'Pobierz',
'documents.actions.open-in-new-tab': 'Otwórz w nowej karcie',
'documents.actions.restore': 'Przywróć',
'documents.actions.delete': 'Usuń',
'documents.actions.edit': 'Edytuj',
'documents.actions.cancel': 'Anuluj',
'documents.actions.save': 'Zapisz',
'documents.actions.saving': 'Zapisywanie...',
'documents.content.alert': 'Zawartość dokumentu jest automatycznie wyodrębniana z dokumentu podczas przesyłania. Jest używana tylko do wyszukiwania i indeksowania.',
'documents.content.empty-placeholder': 'Ten dokument nie ma wyodrębnionej zawartości, możesz ją ustawić ręcznie tutaj.',
'documents.info.id': 'ID',
'documents.info.name': 'Nazwa',
'documents.info.type': 'Typ',
'documents.info.size': 'Rozmiar',
'documents.info.created-at': 'Utworzono',
'documents.info.updated-at': 'Zaktualizowano',
'documents.info.never': 'Nigdy',
'documents.rename.title': 'Zmień nazwę dokumentu',
'documents.rename.form.name.label': 'Nazwa',
'documents.rename.form.name.placeholder': 'Przykład: Faktura 2024',
'documents.rename.form.name.required': 'Proszę wprowadzić nazwę dokumentu',
'documents.rename.form.name.max-length': 'Nazwa musi mieć mniej niż 255 znaków',
'documents.rename.form.submit': 'Zmień nazwę dokumentu',
'documents.rename.success': 'Nazwa dokumentu została pomyślnie zmieniona',
'documents.rename.cancel': 'Anuluj',
'import-documents.title.error': '{{ count }} dokumentów nie powiodły się',
'import-documents.title.success': '{{ count }} dokumentów zaimportowane',
'import-documents.title.pending': '{{ count }} / {{ total }} dokumentów zaimportowanych',
'import-documents.title.none': 'Importuj dokumenty',
'import-documents.no-import-in-progress': 'Brak importu dokumentów w toku',
'documents.deleted.title': 'Usunięte dokumenty',
'documents.deleted.empty.title': 'Brak usuniętych dokumentów',
'documents.deleted.empty.description': 'Nie masz żadnych usuniętych dokumentów. Dokumenty, które są usuwane, zostaną przeniesione do kosza na {{ days }} dni.',
'documents.deleted.retention-notice': 'Wszystkie usunięte dokumenty są przechowywane w koszu przez {{ days }} dni. Po upływie tego terminu dokumenty zostaną trwale usunięte, a Ty nie będziesz mógł ich przywrócić.',
'documents.deleted.deleted-at': 'Usunięto',
'documents.deleted.restoring': 'Przywracanie...',
'documents.deleted.deleting': 'Usuwanie...',
'documents.preview.unknown-file-type': 'Brak podglądu dla tego typu pliku',
'documents.preview.binary-file': 'To wydaje się być plikiem binarnym i nie może być wyświetlane jako tekst',
'trash.delete-all.button': 'Usuń wszystkie',
'trash.delete-all.confirm.title': 'Trwale usunąć wszystkie dokumenty?',
'trash.delete-all.confirm.description': 'Czy na pewno chcesz trwale usunąć wszystkie dokumenty z kosza? Ta akcja nie może być cofnięta.',
'trash.delete-all.confirm.label': 'Usuń',
'trash.delete-all.confirm.cancel': 'Anuluj',
'trash.delete.button': 'Usuń',
'trash.delete.confirm.title': 'Trwale usunąć dokument?',
'trash.delete.confirm.description': 'Czy na pewno chcesz trwale usunąć ten dokument z kosza? Ta akcja nie może być cofnięta.',
'trash.delete.confirm.label': 'Usuń',
'trash.delete.confirm.cancel': 'Anuluj',
'trash.deleted.success.title': 'Dokument usunięty',
'trash.deleted.success.description': 'Dokument został trwale usunięty.',
'activity.document.created': 'Dokument został utworzony',
'activity.document.updated.single': 'Pole {{ field }} zostało zaktualizowane',
'activity.document.updated.multiple': 'Pola {{ fields }} zostały zaktualizowane',
'activity.document.updated': 'Dokument został zaktualizowany',
'activity.document.deleted': 'Dokument został usunięty',
'activity.document.restored': 'Dokument został przywrócony',
'activity.document.tagged': 'Tag {{ tag }} został dodany',
'activity.document.untagged': 'Tag {{ tag }} został usunięty',
'activity.document.user.name': 'od {{ name }}',
'activity.load-more': 'Załaduj więcej',
'activity.no-more-activities': 'Brak dalszych działań dla tego dokumentu',
// Tags
'tags.no-tags.title': 'Brak tagów',
'tags.no-tags.description': 'Ta organizacja nie ma jeszcze tagów. Tagi służą do kategoryzowania dokumentów. Możesz dodać tagi do swoich dokumentów, aby ułatwić ich wyszukiwanie i organizację.',
'tags.no-tags.create-tag': 'Utwórz tag',
'tags.title': 'Tagi dokumentów',
'tags.description': 'Tagi służą do kategoryzowania dokumentów. Możesz dodać tagi do swoich dokumentów, aby ułatwić ich wyszukiwanie i organizację.',
'tags.create': 'Utwórz tag',
'tags.update': 'Zaktualizuj tag',
'tags.delete': 'Usuń tag',
'tags.delete.confirm.title': 'Usuń tag',
'tags.delete.confirm.message': 'Czy na pewno chcesz usunąć ten tag? Usunięcie tagu spowoduje jego usunięcie ze wszystkich dokumentów.',
'tags.delete.confirm.confirm-button': 'Usuń',
'tags.delete.confirm.cancel-button': 'Anuluj',
'tags.delete.success': 'Tag został pomyślnie usunięty',
'tags.create.success': 'Tag "{{ name }}" został pomyślnie utworzony.',
'tags.update.success': 'Tag "{{ name }}" został pomyślnie zaktualizowany.',
'tags.form.name.label': 'Nazwa',
'tags.form.name.placeholder': 'Przykład: Umowy',
'tags.form.name.required': 'Proszę wprowadzić nazwę tagu',
'tags.form.name.max-length': 'Nazwa tagu musi mieć mniej niż 64 znaki',
'tags.form.color.label': 'Kolor',
'tags.form.color.required': 'Proszę wprowadzić kolor',
'tags.form.color.invalid': 'Kolor hex jest źle sformatowany.',
'tags.form.description.label': 'Opis',
'tags.form.description.optional': '(opcjonalnie)',
'tags.form.description.placeholder': 'Przykład: Wszystkie umowy podpisane przez firmę',
'tags.form.description.max-length': 'Opis musi mieć mniej niż 256 znaków',
'tags.form.no-description': 'Brak opisu',
'tags.table.headers.tag': 'Tag',
'tags.table.headers.description': 'Opis',
'tags.table.headers.documents': 'Dokumenty',
'tags.table.headers.created': 'Utworzono',
'tags.table.headers.actions': 'Akcje',
// Tagging rules
'tagging-rules.field.name': 'nazwa dokumentu',
'tagging-rules.field.content': 'treść dokumentu',
'tagging-rules.operator.equals': 'równa się',
'tagging-rules.operator.not-equals': 'nie równa się',
'tagging-rules.operator.contains': 'zawiera',
'tagging-rules.operator.not-contains': 'nie zawiera',
'tagging-rules.operator.starts-with': 'zaczyna się od',
'tagging-rules.operator.ends-with': 'kończy się na',
'tagging-rules.list.title': 'Reguły tagowania',
'tagging-rules.list.description': 'Zarządzaj regułami tagowania w swojej organizacji, aby automatycznie tagować dokumenty na podstawie zdefiniowanych przez siebie warunków.',
'tagging-rules.list.demo-warning': 'Uwaga: Ponieważ jest to środowisko demonstracyjne (bez serwera), reguły tagowania nie będą stosowane do nowo dodanych dokumentów.',
'tagging-rules.list.no-tagging-rules.title': 'Brak reguł tagowania',
'tagging-rules.list.no-tagging-rules.description': 'Utwórz regułę tagowania, aby automatycznie tagować dodane dokumenty na podstawie zdefiniowanych przez siebie warunków.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Utwórz regułę tagowania',
'tagging-rules.list.card.no-conditions': 'Brak warunków',
'tagging-rules.list.card.one-condition': '1 warunek',
'tagging-rules.list.card.conditions': '{{ count }} warunków',
'tagging-rules.list.card.delete': 'Usuń regułę',
'tagging-rules.list.card.edit': 'Edytuj regułę',
'tagging-rules.create.title': 'Utwórz regułę tagowania',
'tagging-rules.create.success': 'Reguła tagowania została pomyślnie utworzona',
'tagging-rules.create.error': 'Nie udało się utworzyć reguły tagowania',
'tagging-rules.create.submit': 'Utwórz regułę',
'tagging-rules.form.name.label': 'Nazwa',
'tagging-rules.form.name.placeholder': 'Przykład: Taguj faktury',
'tagging-rules.form.name.min-length': 'Proszę wprowadzić nazwę reguły',
'tagging-rules.form.name.max-length': 'Nazwa musi mieć mniej niż 64 znaki',
'tagging-rules.form.description.label': 'Opis',
'tagging-rules.form.description.placeholder': 'Przykład: Oznacz dokumenty ze słowem \'faktura\' w nazwie',
'tagging-rules.form.description.max-length': 'Opis musi mieć mniej niż 256 znaków',
'tagging-rules.form.conditions.label': 'Warunki',
'tagging-rules.form.conditions.description': 'Zdefiniuj warunki, które muszą być spełnione, aby reguła mogła zostać zastosowana. Brak warunków oznacza, że reguła zostanie zastosowana do wszystkich dokumentów',
'tagging-rules.form.conditions.add-condition': 'Dodaj warunek',
'tagging-rules.form.conditions.connector.when': 'Kiedy',
'tagging-rules.form.conditions.connector.and': 'i',
'tagging-rules.form.conditions.connector.or': 'lub',
'tagging-rules.condition-match-mode.all': 'Wszystkie warunki muszą być spełnione',
'tagging-rules.condition-match-mode.any': 'Dowolny warunek musi być spełniony',
'tagging-rules.form.conditions.no-conditions.title': 'Brak warunków',
'tagging-rules.form.conditions.no-conditions.description': 'Nie dodałeś żadnych warunków do tej reguły. Ta reguła zastosuje swoje tagi do wszystkich dokumentów.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Zastosuj regułę bez warunków',
'tagging-rules.form.conditions.no-conditions.cancel': 'Anuluj',
'tagging-rules.form.conditions.value.placeholder': 'Przykład: faktura',
'tagging-rules.form.conditions.value.min-length': 'Proszę wprowadzić wartość dla warunku',
'tagging-rules.form.tags.label': 'Tagi',
'tagging-rules.form.tags.description': 'Wybierz tagi do zastosowania do dodanych dokumentów, które spełniają warunki',
'tagging-rules.form.tags.min-length': 'Co najmniej jeden tag do zastosowania jest wymagany',
'tagging-rules.form.tags.add-tag': 'Utwórz tag',
'tagging-rules.form.submit': 'Utwórz regułę',
'tagging-rules.update.title': 'Zaktualizuj regułę tagowania',
'tagging-rules.update.error': 'Nie udało się zaktualizować reguły tagowania',
'tagging-rules.update.submit': 'Zaktualizuj regułę',
'tagging-rules.update.cancel': 'Anuluj',
'tagging-rules.apply.button': 'Zastosuj do istniejących dokumentów',
'tagging-rules.apply.confirm.title': 'Zastosować regułę do istniejących dokumentów?',
'tagging-rules.apply.confirm.description': 'Sprawdzi to wszystkie istniejące dokumenty w organizacji i zastosuje tagi tam, gdzie warunki są spełnione. Przetwarzanie odbędzie się w tle.',
'tagging-rules.apply.confirm.button': 'Zastosuj regułę',
'tagging-rules.apply.success': 'Rozpoczęto stosowanie reguły w tle',
'tagging-rules.apply.error': 'Nie udało się rozpocząć stosowania reguły',
'tagging-rules.apply.processing': 'Uruchamianie...',
// Intake emails
'intake-emails.title': 'Adresy przyjęć',
'intake-emails.description': 'Adresy przyjęć służą do automatycznego przyjmowania wiadomości e-mail do Papra. Wystarczy przekazać wiadomości e-mail na adres e-mail do przyjmowania, a ich załączniki zostaną dodane do dokumentów Twojej organizacji.',
'intake-emails.disabled.title': 'Adresy przyjęć są wyłączone',
'intake-emails.disabled.description': 'Adresy przyjęć są wyłączone na tej instancji. Skontaktuj się z administratorem, aby je włączyć. Zobacz {{ documentation }} w celu uzyskania dodatkowych informacji.',
'intake-emails.disabled.documentation': 'dokumentację',
'intake-emails.info': 'Tylko włączone adresy przyjęć z dozwolonych źródeł będą przetwarzane. Możesz w dowolnym momencie włączyć lub wyłączyć adres e-mail do przyjęć.',
'intake-emails.empty.title': 'Brak adresów przyjęć',
'intake-emails.empty.description': 'Wygeneruj adres przyjęć, aby łatwo przyjmować załączniki e-mail.',
'intake-emails.empty.generate': 'Wygeneruj adres e-mail do przyjęć',
'intake-emails.count': '{{ count }} adres/ów e-mail do przyjęć dla tej organizacji',
'intake-emails.new': 'Nowy adres e-mail do przyjęć',
'intake-emails.disabled-label': '(Wyłączone)',
'intake-emails.no-origins': 'Brak dozwolonych źródeł e-mail',
'intake-emails.allowed-origins': 'Dozwolone z {{ count }} adresu/ów',
'intake-emails.actions.enable': 'Włącz',
'intake-emails.actions.disable': 'Wyłącz',
'intake-emails.actions.manage-origins': 'Zarządzaj dozwolonymi źródłami',
'intake-emails.actions.delete': 'Usuń',
'intake-emails.delete.confirm.title': 'Usuąć adres e-mail do przyjęć?',
'intake-emails.delete.confirm.message': 'Czy na pewno chcesz usunąć ten adres e-mail do przyjęć? Ta akcja jest nieodwracalna.',
'intake-emails.delete.confirm.confirm-button': 'Usuń adres przyjęć',
'intake-emails.delete.confirm.cancel-button': 'Anuluj',
'intake-emails.delete.success': 'Adres przyjęć usunięty',
'intake-emails.create.success': 'Adres przyjęć utworzony',
'intake-emails.update.success.enabled': 'Adres przyjęć włączony',
'intake-emails.update.success.disabled': 'Adres przyjęć wyłączony',
'intake-emails.allowed-origins.title': 'Dozwolone źródła',
'intake-emails.allowed-origins.description': 'Tylko e-maile wysłane na {{ email }} z tych źródeł będą przetwarzane. Jeśli nie określono źródeł, wszystkie e-maile zostaną odrzucone.',
'intake-emails.allowed-origins.add.label': 'Dodaj dozwolony adres e-mail',
'intake-emails.allowed-origins.add.placeholder': 'Przykład: ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Dodaj',
'intake-emails.allowed-origins.add.error.exists': 'Ten adres e-mail jest już w dozwolonych źródłach dla tego adresu e-mail do przyjęć.',
// API keys
'api-keys.permissions.select-all': 'Zaznacz wszystko',
'api-keys.permissions.deselect-all': 'Odznacz wszystko',
'api-keys.permissions.organizations.title': 'Organizacje',
'api-keys.permissions.organizations.organizations:create': 'Tworzenie organizacji',
'api-keys.permissions.organizations.organizations:read': 'Odczyt organizacji',
'api-keys.permissions.organizations.organizations:update': 'Aktualizacja organizacji',
'api-keys.permissions.organizations.organizations:delete': 'Usuwanie organizacji',
'api-keys.permissions.documents.title': 'Dokumenty',
'api-keys.permissions.documents.documents:create': 'Tworzenie dokumentów',
'api-keys.permissions.documents.documents:read': 'Odczyt dokumentów',
'api-keys.permissions.documents.documents:update': 'Aktualizacja dokumentów',
'api-keys.permissions.documents.documents:delete': 'Usuwanie dokumentów',
'api-keys.permissions.tags.title': 'Tag',
'api-keys.permissions.tags.tags:create': 'Tworzenie tagów',
'api-keys.permissions.tags.tags:read': 'Odczyt tagów',
'api-keys.permissions.tags.tags:update': 'Aktualizacja tagów',
'api-keys.permissions.tags.tags:delete': 'Usuwanie tagów',
'api-keys.create.title': 'Tworzenie klucza API',
'api-keys.create.description': 'Utwórz nowy klucz API, aby uzyskać dostęp do API Papra.',
'api-keys.create.success': 'Klucz API został utworzony pomyślnie.',
'api-keys.create.back': 'Wróć do kluczy API',
'api-keys.create.form.name.label': 'Nazwa',
'api-keys.create.form.name.placeholder': 'Przykład: Mój klucz API',
'api-keys.create.form.name.required': 'Proszę wprowadzić nazwę dla klucza API',
'api-keys.create.form.permissions.label': 'Uprawnienia',
'api-keys.create.form.permissions.required': 'Proszę wybrać co najmniej jedno uprawnienie',
'api-keys.create.form.submit': 'Utwórz klucz API',
'api-keys.create.created.title': 'Klucz API utworzony',
'api-keys.create.created.description': 'Klucz API został utworzony pomyślnie. Zapisz go w bezpiecznym miejscu, ponieważ nie będzie wyświetlony ponownie.',
'api-keys.list.title': 'Klucze API',
'api-keys.list.description': 'Zarządzaj swoimi kluczami API tutaj.',
'api-keys.list.create': 'Utwórz klucz API',
'api-keys.list.empty.title': 'Brak kluczy API',
'api-keys.list.empty.description': 'Utwórz klucz API, aby uzyskać dostęp do API Papra.',
'api-keys.list.card.last-used': 'Ostatnie użycie',
'api-keys.list.card.never': 'Nigdy',
'api-keys.list.card.created': 'Utworzono',
'api-keys.delete.success': 'Klucz API został usunięty pomyślnie',
'api-keys.delete.confirm.title': 'Usuń klucz API',
'api-keys.delete.confirm.message': 'Czy na pewno chcesz usunąć ten klucz API? Ta akcja jest nieodwracalna.',
'api-keys.delete.confirm.confirm-button': 'Usuń',
'api-keys.delete.confirm.cancel-button': 'Anuluj',
// Webhooks
'webhooks.list.title': 'Webhooki',
'webhooks.list.description': 'Zarządzaj webhookami swojej organizacji',
'webhooks.list.empty.title': 'Brak webhooków',
'webhooks.list.empty.description': 'Utwórz pierwszy webhook, aby rozpocząć odbieranie zdarzeń',
'webhooks.list.create': 'Utwórz webhook',
'webhooks.list.card.last-triggered': 'Ostatnie wywołanie',
'webhooks.list.card.never': 'Nigdy',
'webhooks.list.card.created': 'Utworzono',
'webhooks.create.title': 'Utwórz webhook',
'webhooks.create.description': 'Utwórz nowy webhook, aby odbierać zdarzenia',
'webhooks.create.success': 'Webhook został utworzony pomyślnie',
'webhooks.create.back': 'Wróć',
'webhooks.create.form.submit': 'Utwórz webhook',
'webhooks.create.form.name.label': 'Nazwa webhooka',
'webhooks.create.form.name.placeholder': 'Wprowadź nazwę webhooka',
'webhooks.create.form.name.required': 'Nazwa jest wymagana',
'webhooks.create.form.url.label': 'URL webhooka',
'webhooks.create.form.url.placeholder': 'Wprowadź URL webhooka',
'webhooks.create.form.url.required': 'URL jest wymagany',
'webhooks.create.form.url.invalid': 'URL jest nieprawidłowy',
'webhooks.create.form.secret.label': 'Sekret',
'webhooks.create.form.secret.placeholder': 'Wprowadź sekret webhooka',
'webhooks.create.form.events.label': 'Zdarzenia',
'webhooks.create.form.events.required': 'Co najmniej jedno zdarzenie jest wymagane',
'webhooks.update.title': 'Edytuj webhook',
'webhooks.update.description': 'Zaktualizuj szczegóły webhooka',
'webhooks.update.success': 'Webhook został zaktualizowany pomyślnie',
'webhooks.update.submit': 'Zaktualizuj webhook',
'webhooks.update.cancel': 'Anuluj',
'webhooks.update.form.secret.placeholder': 'Wprowadź nowy sekret',
'webhooks.update.form.secret.placeholder-redacted': '[Zredagowany sekret]',
'webhooks.update.form.rotate-secret.button': 'Wygeneruj nowy sekret',
'webhooks.delete.success': 'Webhook został usunięty pomyślnie',
'webhooks.delete.confirm.title': 'Usuń webhook',
'webhooks.delete.confirm.message': 'Czy na pewno chcesz usunąć ten webhook?',
'webhooks.delete.confirm.confirm-button': 'Usuń',
'webhooks.delete.confirm.cancel-button': 'Anuluj',
'webhooks.events.documents.title': 'Zdarzenia dokumentów',
'webhooks.events.documents.document:created.description': 'Utworzono dokument',
'webhooks.events.documents.document:deleted.description': 'Usunięto dokument',
'webhooks.events.documents.document:updated.description': 'Dokument został zaktualizowany',
'webhooks.events.documents.document:tag:added.description': 'Tag został dodany do dokumentu',
'webhooks.events.documents.document:tag:removed.description': 'Tag został usunięty z dokumentu',
// Navigation
'layout.menu.home': 'Strona główna',
'layout.menu.documents': 'Dokumenty',
'layout.menu.tags': 'Tagi',
'layout.menu.tagging-rules': 'Zasady tagowania',
'layout.menu.deleted-documents': 'Usunięte dokumenty',
'layout.menu.organization-settings': 'Ustawienia',
'layout.menu.api-keys': 'Klucze API',
'layout.menu.settings': 'Ustawienia',
'layout.menu.account': 'Konto',
'layout.menu.general-settings': 'Ustawienia ogólne',
'layout.menu.usage': 'Użycie',
'layout.menu.intake-emails': 'Adresy przyjęć',
'layout.menu.webhooks': 'Webhooki',
'layout.menu.members': 'Członkowie',
'layout.menu.invitations': 'Zaproszenia',
'layout.upgrade-cta.title': 'Potrzebujesz więcej miejsca?',
'layout.upgrade-cta.description': 'Uzyskaj 10x więcej przestrzeni + współpracę zespołową',
'layout.upgrade-cta.button': 'Ulepsz teraz',
'layout.theme.light': 'Tryb jasny',
'layout.theme.dark': 'Tryb ciemny',
'layout.theme.system': 'Tryb systemowy',
'layout.search.placeholder': 'Szukaj...',
'layout.menu.import-document': 'Importuj dokument',
'user-menu.account-settings': 'Ustawienia konta',
'user-menu.api-keys': 'Klucze API',
'user-menu.invitations': 'Zaproszenia',
'user-menu.language': 'Język',
'user-menu.logout': 'Wyloguj',
// Command palette
'command-palette.search.placeholder': 'Szukaj poleceń lub dokumentów',
'command-palette.no-results': 'Nie znaleziono wyników',
'command-palette.sections.documents': 'Dokumenty',
'command-palette.sections.theme': 'Motyw',
// API errors
'api-errors.document.already_exists': 'Dokument już istnieje',
'api-errors.document.size_too_large': 'Plik jest zbyt duży',
'api-errors.intake-emails.already_exists': 'Adres e-mail do przyjęć z tym adresem już istnieje.',
'api-errors.intake_email.limit_reached': 'Osiągnięto maksymalną liczbę adresów e-mail do przyjęć dla tej organizacji. Aby utworzyć więcej adresów e-mail do przyjęć, zaktualizuj swój plan.',
'api-errors.user.max_organization_count_reached': 'Osiągnięto maksymalną liczbę organizacji, które możesz utworzyć. Jeśli potrzebujesz utworzyć więcej, skontaktuj się z pomocą techniczną.',
'api-errors.default': 'Wystąpił błąd podczas przetwarzania żądania.',
'api-errors.organization.invitation_already_exists': 'Zaproszenie dla tego adresu e-mail już istnieje w tej organizacji.',
'api-errors.user.already_in_organization': 'Ten użytkownik należy już do tej organizacji.',
'api-errors.user.organization_invitation_limit_reached': 'Osiągnięto maksymalną liczbę zaproszeń na dzisiaj. Spróbuj ponownie jutro.',
'api-errors.demo.not_available': 'Ta funkcja nie jest dostępna w wersji demo',
'api-errors.tags.already_exists': 'Tag o tej nazwie już istnieje w tej organizacji',
'api-errors.internal.error': 'Wystąpił błąd podczas przetwarzania żądania. Spróbuj ponownie później.',
'api-errors.auth.invalid_origin': 'Nieprawidłowa lokalizacja aplikacji. Jeśli hostujesz Papra, upewnij się, że zmienna środowiskowa APP_BASE_URL odpowiada bieżącemu adresowi URL. Aby uzyskać więcej informacji, zobacz https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'Osiągnięto maksymalną liczbę członków i oczekujących zaproszeń dla tej organizacji. Zaktualizuj swój plan, aby dodać więcej członków.',
'api-errors.organization.has_active_subscription': 'Nie można usunąć organizacji z aktywną subskrypcją. Proszę najpierw anulować subskrypcję za pomocą przycisku Zarządzaj subskrypcją powyżej.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Nie znaleziono użytkownika',
'api-errors.FAILED_TO_CREATE_USER': 'Nie udało się utworzyć użytkownika',
'api-errors.FAILED_TO_CREATE_SESSION': 'Nie udało się utworzyć sesji',
'api-errors.FAILED_TO_UPDATE_USER': 'Nie udało się zaktualizować użytkownika',
'api-errors.FAILED_TO_GET_SESSION': 'Nie udało się pobrać sesji',
'api-errors.INVALID_PASSWORD': 'Nieprawidłowe hasło',
'api-errors.INVALID_EMAIL': 'Nieprawidłowy email',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'Email lub hasło jest nieprawidłowe, lub konto nie istnieje.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Konto społecznościowe już połączone',
'api-errors.PROVIDER_NOT_FOUND': 'Nie znaleziono dostawcy',
'api-errors.INVALID_TOKEN': 'Nieprawidłowy token',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Token ID nie jest obsługiwany',
'api-errors.FAILED_TO_GET_USER_INFO': 'Nie udało się pobrać informacji o użytkowniku',
'api-errors.USER_EMAIL_NOT_FOUND': 'Nie znaleziono emaila użytkownika',
'api-errors.EMAIL_NOT_VERIFIED': 'Email nie został zweryfikowany',
'api-errors.PASSWORD_TOO_SHORT': 'Hasło zbyt krótkie',
'api-errors.PASSWORD_TOO_LONG': 'Hasło zbyt długie',
'api-errors.USER_ALREADY_EXISTS': 'Użytkownik z tym emailem już istnieje',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'Email nie może być zaktualizowany',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Nie znaleziono konta uwierzytelniającego',
'api-errors.SESSION_EXPIRED': 'Sesja wygasła',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Nie udało się odłączyć ostatniego konta',
'api-errors.ACCOUNT_NOT_FOUND': 'Nie znaleziono konta',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'Użytkownik ma już hasło',
// Not found
'not-found.title': '404 - Nie znaleziono',
'not-found.description': 'Przepraszamy, strona, której szukasz wydaje się nie istnieć. Sprawdź URL i spróbuj ponownie.',
'not-found.back-to-home': 'Wróć do strony głównej',
// Demo
'demo.popup.description': 'To jest środowisko demonstracyjne, wszystkie dane są zapisywane w lokalnej pamięci przeglądarki.',
'demo.popup.discord': 'Dołącz do {{ discordLink }}, aby uzyskać wsparcie, zaproponować funkcje lub po prostu porozmawiać.',
'demo.popup.discord-link-label': 'Serwer Discord',
'demo.popup.reset': 'Zresetuj dane demonstracyjne',
'demo.popup.hide': 'Ukryj',
// Color picker
'color-picker.hue': 'Odcień',
'color-picker.saturation': 'Nasycenie',
'color-picker.lightness': 'Jasność',
'color-picker.select-color': 'Wybierz kolor',
'color-picker.select-a-color': 'Wybierz kolor',
// Subscriptions
'subscriptions.checkout-success.title': 'Płatność zakończona sukcesem!',
'subscriptions.checkout-success.description': 'Twoja subskrypcja została pomyślnie aktywowana.',
'subscriptions.checkout-success.thank-you': 'Dziękujemy za przejście na Papra Plus. Teraz masz dostęp do wszystkich funkcji premium.',
'subscriptions.checkout-success.go-to-organizations': 'Przejdź do Organizacji',
'subscriptions.checkout-success.redirecting': 'Przekierowanie za {{ count }} sekund{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Płatność anulowana',
'subscriptions.checkout-cancel.description': 'Twoja aktualizacja subskrypcji została anulowana.',
'subscriptions.checkout-cancel.no-charges': 'Nie pobrano żadnych opłat z Twojego konta. Możesz spróbować ponownie w dowolnym momencie.',
'subscriptions.checkout-cancel.back-to-organizations': 'Powrót do Organizacji',
'subscriptions.checkout-cancel.need-help': 'Potrzebujesz pomocy?',
'subscriptions.checkout-cancel.contact-support': 'Skontaktuj się z pomocą techniczną',
'subscriptions.upgrade-dialog.title': 'Ulepsz tę organizację',
'subscriptions.upgrade-dialog.description': 'Odblokuj zaawansowane funkcje dla swojej organizacji',
'subscriptions.upgrade-dialog.contact-us': 'Skontaktuj się z nami',
'subscriptions.upgrade-dialog.enterprise-plans': 'jeśli potrzebujesz niestandardowych planów biznesowych.',
'subscriptions.upgrade-dialog.current-plan': 'Obecny plan',
'subscriptions.upgrade-dialog.recommended': 'Polecane',
'subscriptions.upgrade-dialog.per-month': '/miesiąc',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} rozliczane rocznie',
'subscriptions.upgrade-dialog.upgrade-now': 'Ulepsz teraz',
'subscriptions.upgrade-dialog.promo-banner.title': 'Oferta ograniczona czasowo',
'subscriptions.upgrade-dialog.promo-banner.description': 'Uzyskaj {{ percent }}% zniżki na organizację na wszystkie plany na zawsze jako early adopter! Oferta wygasa za {{ days, >1:{days} dni, =1:1 dzień, mniej niż 1 dzień }}.',
'subscriptions.plan.free.name': 'Plan darmowy',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Rozmiar przechowywania dokumentów',
'subscriptions.features.members': 'Członkowie organizacji',
'subscriptions.features.members-count': '{{ count }} członków',
'subscriptions.features.email-intakes': 'Adresy e-mail do przyjęć',
'subscriptions.features.email-intakes-count-singular': '{{ count }} adres',
'subscriptions.features.email-intakes-count-plural': '{{ count }} adresy',
'subscriptions.features.max-upload-size': 'Maksymalny rozmiar pliku',
'subscriptions.features.support': 'Wsparcie',
'subscriptions.features.support-community': 'Wsparcie społeczności',
'subscriptions.features.support-email': 'Wsparcie e-mail',
'subscriptions.features.support-priority': 'Wsparcie priorytetowe',
'subscriptions.billing-interval.monthly': 'Miesięcznie',
'subscriptions.billing-interval.annual': 'Rocznie',
'subscriptions.usage-warning.message': 'Wykorzystano {{ percent }}% miejsca na dokumenty. Rozważ aktualizację planu, aby uzyskać więcej miejsca.',
'subscriptions.usage-warning.upgrade-button': 'Ulepsz plan',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Wpisz "{{ text }}", aby potwierdzić',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Zresetuj swoje hasło
auth.request-password-reset.description: Wprowadź swój adres e-mail, aby zresetować hasło.
auth.request-password-reset.requested: Jeśli istnieje konto powiązane z tym adresem e-mail, otrzymasz wiadomość umożliwiającą zresetowanie hasła.
auth.request-password-reset.back-to-login: Wróć do logowania
auth.request-password-reset.form.email.label: E-mail
auth.request-password-reset.form.email.placeholder: 'Przykład: ada@papra.app'
auth.request-password-reset.form.email.required: Wprowadź swój adres e-mail
auth.request-password-reset.form.email.invalid: Ten adres e-mail jest nieprawidłowy
auth.request-password-reset.form.submit: Poproś o zresetowanie hasła
auth.reset-password.title: Zresetuj swoje hasło
auth.reset-password.description: Wprowadź nowe hasło, aby zresetować dotychczasowe.
auth.reset-password.reset: Twoje hasło zostało zresetowane.
auth.reset-password.back-to-login: Wróć do logowania
auth.reset-password.form.new-password.label: Nowe hasło
auth.reset-password.form.new-password.placeholder: 'Przykład: **********'
auth.reset-password.form.new-password.required: Wprowadź nowe hasło
auth.reset-password.form.new-password.min-length: Hasło musi mieć co najmniej {{ minLength }} znaków
auth.reset-password.form.new-password.max-length: Hasło musi mieć mniej niż {{ maxLength }} znaków
auth.reset-password.form.submit: Zresetuj hasło
auth.email-provider.open: Otwórz {{ provider }}
auth.login.title: Zaloguj się do Papra
auth.login.description: Wprowadź swój adres e-mail lub skorzystaj z logowania federacyjnego, aby uzyskać dostęp do swojego konta Papra.
auth.login.login-with-provider: Zaloguj się za pomocą {{ provider }}
auth.login.no-account: Nie masz konta?
auth.login.register: Zarejestruj się
auth.login.form.email.label: E-mail
auth.login.form.email.placeholder: 'Przykład: ada@papra.app'
auth.login.form.email.required: Wprowadź swój adres e-mail
auth.login.form.email.invalid: Ten adres e-mail jest nieprawidłowy
auth.login.form.password.label: Hasło
auth.login.form.password.placeholder: Ustaw hasło
auth.login.form.password.required: Wprowadź swoje hasło
auth.login.form.remember-me.label: Zapamiętaj mnie
auth.login.form.forgot-password.label: Zapomniałeś hasła?
auth.login.form.submit: Zaloguj się
auth.register.title: Zarejestruj się w Papra
auth.register.description: Utwórz konto, aby zacząć korzystać z Papra.
auth.register.register-with-email: Zarejestruj się przez e-mail
auth.register.register-with-provider: Zarejestruj się przez {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Masz już konto?
auth.register.login: Zaloguj się
auth.register.registration-disabled.title: Rejestracja jest wyłączona
auth.register.registration-disabled.description: Tworzenie nowych kont na tej instancji Papra jest obecnie wyłączone. Tylko użytkownicy z istniejącymi kontami mogą się zalogować. Jeśli uważasz, że to błąd, skontaktuj się z administratorem tej instancji.
auth.register.form.email.label: E-mail
auth.register.form.email.placeholder: 'Przykład: ada@papra.app'
auth.register.form.email.required: Wprowadź swój adres e-mail
auth.register.form.email.invalid: Ten adres e-mail jest nieprawidłowy
auth.register.form.password.label: Hasło
auth.register.form.password.placeholder: Ustaw hasło
auth.register.form.password.required: Wprowadź swoje hasło
auth.register.form.password.min-length: Hasło musi mieć co najmniej {{ minLength }} znaków
auth.register.form.password.max-length: Hasło musi mieć mniej niż {{ maxLength }} znaków
auth.register.form.name.label: Imię i nazwisko
auth.register.form.name.placeholder: 'Przykład: Ada Lovelace'
auth.register.form.name.required: Wprowadź swoje imię i nazwisko
auth.register.form.name.max-length: Imię i nazwisko musi mieć mniej niż {{ maxLength }} znaków
auth.register.form.submit: Zarejestruj się
auth.email-validation-required.title: Zweryfikuj swój adres e-mail
auth.email-validation-required.description: Wiadomość weryfikacyjna została wysłana na Twój adres e-mail. Zweryfikuj swój adres e-mail, klikając link w wiadomości.
auth.legal-links.description: Kontynuując, potwierdzasz, że rozumiesz i zgadzasz się na {{ terms }} oraz {{ privacy }}.
auth.legal-links.terms: Warunki korzystania z usługi
auth.legal-links.privacy: Polityka prywatności
auth.no-auth-provider.title: Brak dostawcy uwierzytelniania
auth.no-auth-provider.description: Na tej instancji Papra nie ma włączonych dostawców uwierzytelniania. Skontaktuj się z administratorem tej instancji, aby je włączyć.
# User settings
user.settings.title: Ustawienia użytkownika
user.settings.description: Zarządzaj ustawieniami swojego konta.
user.settings.email.title: Adres e-mail
user.settings.email.description: Twój adres e-mail nie może być zmieniony.
user.settings.email.label: Adres e-mail
user.settings.name.title: Imię i nazwisko
user.settings.name.description: Twoje imię i nazwisko jest wyświetlane innym członkom organizacji.
user.settings.name.label: Imię i nazwisko
user.settings.name.placeholder: 'Przykład: Jan Kowalski'
user.settings.name.update: Zaktualizuj imię i nazwisko
user.settings.name.updated: Twoje imię i nazwisko zostało zaktualizowane
user.settings.logout.title: Wyloguj się
user.settings.logout.description: Wyloguj się ze swojego konta. Możesz zalogować się ponownie później.
user.settings.logout.button: Wyloguj się
# Organizations
organizations.list.title: Twoje organizacje
organizations.list.description: Organizacje to sposób grupowania dokumentów i zarządzania dostępem do nich. Możesz tworzyć wiele organizacji i zapraszać członków zespołu do współpracy.
organizations.list.create-new: Utwórz nową organizację
organizations.details.no-documents.title: Brak dokumentów
organizations.details.no-documents.description: W tej organizacji nie ma jeszcze żadnych dokumentów. Zacznij od przesłania kilku dokumentów.
organizations.details.upload-documents: Prześlij dokumenty
organizations.details.documents-count: dokumentów w sumie
organizations.details.total-size: całkowity rozmiar
organizations.details.latest-documents: Najnowsze zaimportowane dokumenty
organizations.create.title: Utwórz nową organizację
organizations.create.description: Twoje dokumenty będą grupowane według organizacji. Możesz tworzyć wiele organizacji, aby oddzielić swoje dokumenty, na przykład dokumenty osobiste i służbowe.
organizations.create.back: Wstecz
organizations.create.error.max-count-reached: Osiągnąłeś maksymalną liczbę organizacji, które możesz utworzyć. Jeśli potrzebujesz utworzyć więcej, skontaktuj się z pomocą techniczną.
organizations.create.form.name.label: Nazwa organizacji
organizations.create.form.name.placeholder: 'Przykład: Acme Inc.'
organizations.create.form.name.required: Wprowadź nazwę organizacji
organizations.create.form.submit: Utwórz organizację
organizations.create.success: Organizacja została pomyślnie utworzona
organizations.create-first.title: Utwórz swoją organizację
organizations.create-first.description: Twoje dokumenty będą grupowane według organizacji. Możesz tworzyć wiele organizacji, aby oddzielić swoje dokumenty, na przykład dokumenty osobiste i służbowe.
organizations.create-first.default-name: Moja organizacja
organizations.create-first.user-name: 'Organizacja użytkownika {{ name }}'
organization.settings.title: Ustawienia organizacji
organization.settings.page.title: Ustawienia organizacji
organization.settings.page.description: Zarządzaj ustawieniami swojej organizacji.
organization.settings.name.title: Nazwa organizacji
organization.settings.name.update: Zaktualizuj nazwę
organization.settings.name.placeholder: 'Przykład: Acme Inc.'
organization.settings.name.updated: Nazwa organizacji została zaktualizowana
organization.settings.subscription.title: Subskrypcja
organization.settings.subscription.description: Zarządzaj swoim rozliczeniem, fakturami i metodami płatności.
organization.settings.subscription.manage: Zarządzaj subskrypcją
organization.settings.subscription.error: Nie udało się uzyskać adresu URL portalu klienta
organization.settings.delete.title: Usuń organizację
organization.settings.delete.description: Usunięcie tej organizacji spowoduje trwałe usunięcie wszystkich danych z nią związanych.
organization.settings.delete.confirm.title: Usuń organizację
organization.settings.delete.confirm.message: Czy na pewno chcesz usunąć tę organizację? Ta operacja jest nieodwracalna, a wszystkie dane związane z tą organizacją zostaną trwale usunięte.
organization.settings.delete.confirm.confirm-button: Usuń organizację
organization.settings.delete.confirm.cancel-button: Anuluj
organization.settings.delete.success: Organizacja została usunięta
organizations.members.title: Członkowie
organizations.members.description: Zarządzaj członkami swojej organizacji
organizations.members.invite-member: Zaproś członka
organizations.members.invite-member-disabled-tooltip: Tylko administratorzy lub właściciele mogą zapraszać członków do organizacji
organizations.members.remove-from-organization: Usuń z organizacji
organizations.members.role: Rola
organizations.members.roles.owner: Właściciel
organizations.members.roles.admin: Administrator
organizations.members.roles.member: Członek
organizations.members.delete.confirm.title: Usuń członka
organizations.members.delete.confirm.message: Czy na pewno chcesz usunąć tego członka z organizacji?
organizations.members.delete.confirm.confirm-button: Usuń
organizations.members.delete.confirm.cancel-button: Anuluj
organizations.members.delete.success: Członek został usunięty z organizacji
organizations.members.update-role.success: Rola członka została zaktualizowana
organizations.members.table.headers.name: Imię i nazwisko
organizations.members.table.headers.email: E-mail
organizations.members.table.headers.role: Rola
organizations.members.table.headers.created: Utworzono
organizations.members.table.headers.actions: Akcje
organizations.invite-member.title: Zaproś członka
organizations.invite-member.description: Zaproś członka do swojej organizacji
organizations.invite-member.form.email.label: E-mail
organizations.invite-member.form.email.placeholder: 'Przykład: ada@papra.app'
organizations.invite-member.form.email.required: Wprowadź poprawny adres e-mail
organizations.invite-member.form.role.label: Rola
organizations.invite-member.form.submit: Zaproś do organizacji
organizations.invite-member.success.message: Członek zaproszony
organizations.invite-member.success.description: E-mail został zaproszony do organizacji.
organizations.invite-member.error.message: Nie udało się zaprosić członka
organizations.invitations.title: Zaproszenia
organizations.invitations.description: Zarządzaj zaproszeniami do swojej organizacji
organizations.invitations.list.cta: Zaproś członka
organizations.invitations.list.empty.title: Brak oczekujących zaproszeń
organizations.invitations.list.empty.description: Nie zostałeś zaproszony do żadnej organizacji.
organizations.invitations.status.pending: Oczekujące
organizations.invitations.status.accepted: Zaakceptowane
organizations.invitations.status.rejected: Odrzucone
organizations.invitations.status.expired: Wygasłe
organizations.invitations.status.cancelled: Anulowane
organizations.invitations.resend: Wyślij zaproszenie ponownie
organizations.invitations.cancel.title: Anuluj zaproszenie
organizations.invitations.cancel.description: Czy na pewno chcesz anulować to zaproszenie?
organizations.invitations.cancel.confirm: Anuluj zaproszenie
organizations.invitations.cancel.cancel: Anuluj
organizations.invitations.resend.title: Wyślij zaproszenie ponownie
organizations.invitations.resend.description: Czy na pewno chcesz wysłać ponownie to zaproszenie? To spowoduje wysłanie nowego e-maila do odbiorcy.
organizations.invitations.resend.confirm: Wyślij zaproszenie ponownie
organizations.invitations.resend.cancel: Anuluj
invitations.list.title: Zaproszenia
invitations.list.description: Zarządzaj zaproszeniami do swojej organizacji
invitations.list.empty.title: Brak oczekujących zaproszeń
invitations.list.empty.description: Nie zostałeś zaproszony do żadnej organizacji.
invitations.list.headers.organization: Organizacja
invitations.list.headers.status: Status
invitations.list.headers.created: Utworzono
invitations.list.headers.actions: Akcje
invitations.list.actions.accept: Zaakceptuj
invitations.list.actions.reject: Odrzuć
invitations.list.actions.accept.success.message: Zaproszenie zaakceptowane
invitations.list.actions.accept.success.description: Zaproszenie zostało zaakceptowane.
invitations.list.actions.reject.success.message: Zaproszenie odrzucone
invitations.list.actions.reject.success.description: Zaproszenie zostało odrzucone.
# Documents
documents.list.title: Dokumenty
documents.list.no-documents.title: Brak dokumentów
documents.list.no-documents.description: W tej organizacji nie ma jeszcze żadnych dokumentów. Zacznij od przesłania kilku dokumentów.
documents.list.no-results: Nie znaleziono dokumentów
documents.tabs.info: Informacje
documents.tabs.content: Treść
documents.tabs.activity: Aktywność
documents.deleted.message: Ten dokument został usunięty i zostanie trwale usunięty za {{ days }} dni.
documents.actions.download: Pobierz
documents.actions.open-in-new-tab: Otwórz w nowej karcie
documents.actions.restore: Przywróć
documents.actions.delete: Usuń
documents.actions.edit: Edytuj
documents.actions.cancel: Anuluj
documents.actions.save: Zapisz
documents.actions.saving: Zapisywanie...
documents.content.alert: Zawartość dokumentu jest automatycznie wyodrębniana z dokumentu podczas przesyłania. Jest używana tylko do wyszukiwania i indeksowania.
documents.info.id: ID
documents.info.name: Nazwa
documents.info.type: Typ
documents.info.size: Rozmiar
documents.info.created-at: Utworzono
documents.info.updated-at: Zaktualizowano
documents.info.never: Nigdy
documents.rename.title: Zmień nazwę dokumentu
documents.rename.form.name.label: Nazwa
documents.rename.form.name.placeholder: 'Przykład: Faktura 2024'
documents.rename.form.name.required: Proszę wprowadzić nazwę dokumentu
documents.rename.form.name.max-length: Nazwa musi mieć mniej niż 255 znaków
documents.rename.form.submit: Zmień nazwę dokumentu
documents.rename.success: Nazwa dokumentu została pomyślnie zmieniona
documents.rename.cancel: Anuluj
import-documents.title.error: '{{ count }} dokumentów nie powiodły się'
import-documents.title.success: '{{ count }} dokumentów zaimportowane'
import-documents.title.pending: '{{ count }} / {{ total }} dokumentów zaimportowanych'
import-documents.title.none: Importuj dokumenty
import-documents.no-import-in-progress: Brak importu dokumentów w toku
documents.deleted.title: Usunięte dokumenty
documents.deleted.empty.title: Brak usuniętych dokumentów
documents.deleted.empty.description: Nie masz żadnych usuniętych dokumentów. Dokumenty, które są usuwane, zostaną przeniesione do kosza na {{ days }} dni.
documents.deleted.retention-notice: Wszystkie usunięte dokumenty są przechowywane w koszu przez {{ days }} dni. Po upływie tego terminu dokumenty zostaną trwale usunięte, a Ty nie będziesz mógł ich przywrócić.
documents.deleted.deleted-at: Usunięto
documents.deleted.restoring: Przywracanie...
documents.deleted.deleting: Usuwanie...
documents.preview.unknown-file-type: Brak podglądu dla tego typu pliku
documents.preview.binary-file: To wydaje się być plikiem binarnym i nie może być wyświetlane jako tekst
trash.delete-all.button: Usuń wszystkie
trash.delete-all.confirm.title: Trwale usunąć wszystkie dokumenty?
trash.delete-all.confirm.description: Czy na pewno chcesz trwale usunąć wszystkie dokumenty z kosza? Ta akcja nie może być cofnięta.
trash.delete-all.confirm.label: Usuń
trash.delete-all.confirm.cancel: Anuluj
trash.delete.button: Usuń
trash.delete.confirm.title: Trwale usunąć dokument?
trash.delete.confirm.description: Czy na pewno chcesz trwale usunąć ten dokument z kosza? Ta akcja nie może być cofnięta.
trash.delete.confirm.label: Usuń
trash.delete.confirm.cancel: Anuluj
trash.deleted.success.title: Dokument usunięty
trash.deleted.success.description: Dokument został trwale usunięty.
activity.document.created: Dokument został utworzony
activity.document.updated.single: Pole {{ field }} zostało zaktualizowane
activity.document.updated.multiple: Pola {{ fields }} zostały zaktualizowane
activity.document.updated: Dokument został zaktualizowany
activity.document.deleted: Dokument został usunięty
activity.document.restored: Dokument został przywrócony
activity.document.tagged: Tag {{ tag }} został dodany
activity.document.untagged: Tag {{ tag }} został usunięty
activity.document.user.name: od {{ name }}
activity.load-more: Załaduj więcej
activity.no-more-activities: Brak dalszych działań dla tego dokumentu
# Tags
tags.no-tags.title: Brak tagów
tags.no-tags.description: Ta organizacja nie ma jeszcze tagów. Tagi służą do kategoryzowania dokumentów. Możesz dodać tagi do swoich dokumentów, aby ułatwić ich wyszukiwanie i organizację.
tags.no-tags.create-tag: Utwórz tag
tags.title: Tagi dokumentów
tags.description: Tagi służą do kategoryzowania dokumentów. Możesz dodać tagi do swoich dokumentów, aby ułatwić ich wyszukiwanie i organizację.
tags.create: Utwórz tag
tags.update: Zaktualizuj tag
tags.delete: Usuń tag
tags.delete.confirm.title: Usuń tag
tags.delete.confirm.message: Czy na pewno chcesz usunąć ten tag? Usunięcie tagu spowoduje jego usunięcie ze wszystkich dokumentów.
tags.delete.confirm.confirm-button: Usuń
tags.delete.confirm.cancel-button: Anuluj
tags.delete.success: Tag został pomyślnie usunięty
tags.create.success: Tag "{{ name }}" został pomyślnie utworzony.
tags.update.success: Tag "{{ name }}" został pomyślnie zaktualizowany.
tags.form.name.label: Nazwa
tags.form.name.placeholder: 'Przykład: Umowy'
tags.form.name.required: Proszę wprowadzić nazwę tagu
tags.form.name.max-length: Nazwa tagu musi mieć mniej niż 64 znaki
tags.form.color.label: Kolor
tags.form.color.required: Proszę wprowadzić kolor
tags.form.color.invalid: Kolor hex jest źle sformatowany.
tags.form.description.label: Opis
tags.form.description.optional: (opcjonalnie)
tags.form.description.placeholder: 'Przykład: Wszystkie umowy podpisane przez firmę'
tags.form.description.max-length: Opis musi mieć mniej niż 256 znaków
tags.form.no-description: Brak opisu
tags.table.headers.tag: Tag
tags.table.headers.description: Opis
tags.table.headers.documents: Dokumenty
tags.table.headers.created: Utworzono
tags.table.headers.actions: Akcje
# Tagging rules
tagging-rules.field.name: nazwa dokumentu
tagging-rules.field.content: treść dokumentu
tagging-rules.operator.equals: równa się
tagging-rules.operator.not-equals: nie równa się
tagging-rules.operator.contains: zawiera
tagging-rules.operator.not-contains: nie zawiera
tagging-rules.operator.starts-with: zaczyna się od
tagging-rules.operator.ends-with: kończy się na
tagging-rules.list.title: Reguły tagowania
tagging-rules.list.description: Zarządzaj regułami tagowania w swojej organizacji, aby automatycznie tagować dokumenty na podstawie zdefiniowanych przez siebie warunków.
tagging-rules.list.demo-warning: 'Uwaga: Ponieważ jest to środowisko demonstracyjne (bez serwera), reguły tagowania nie będą stosowane do nowo dodanych dokumentów.'
tagging-rules.list.no-tagging-rules.title: Brak reguł tagowania
tagging-rules.list.no-tagging-rules.description: Utwórz regułę tagowania, aby automatycznie tagować dodane dokumenty na podstawie zdefiniowanych przez siebie warunków.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Utwórz regułę tagowania
tagging-rules.list.card.no-conditions: Brak warunków
tagging-rules.list.card.one-condition: 1 warunek
tagging-rules.list.card.conditions: '{{ count }} warunków'
tagging-rules.list.card.delete: Usuń regułę
tagging-rules.list.card.edit: Edytuj regułę
tagging-rules.create.title: Utwórz regułę tagowania
tagging-rules.create.success: Reguła tagowania została pomyślnie utworzona
tagging-rules.create.error: Nie udało się utworzyć reguły tagowania
tagging-rules.create.submit: Utwórz regułę
tagging-rules.form.name.label: Nazwa
tagging-rules.form.name.placeholder: 'Przykład: Taguj faktury'
tagging-rules.form.name.min-length: Proszę wprowadzić nazwę reguły
tagging-rules.form.name.max-length: Nazwa musi mieć mniej niż 64 znaki
tagging-rules.form.description.label: Opis
tagging-rules.form.description.placeholder: "Przykład: Oznacz dokumenty ze słowem 'faktura' w nazwie"
tagging-rules.form.description.max-length: Opis musi mieć mniej niż 256 znaków
tagging-rules.form.conditions.label: Warunki
tagging-rules.form.conditions.description: Zdefiniuj warunki, które muszą być spełnione, aby reguła mogła zostać zastosowana. Wszystkie warunki muszą być spełnione, aby reguła mogła zostać zastosowana.
tagging-rules.form.conditions.add-condition: Dodaj warunek
tagging-rules.form.conditions.no-conditions.title: Brak warunków
tagging-rules.form.conditions.no-conditions.description: Nie dodałeś żadnych warunków do tej reguły. Ta reguła zastosuje swoje tagi do wszystkich dokumentów.
tagging-rules.form.conditions.no-conditions.confirm: Zastosuj regułę bez warunków
tagging-rules.form.conditions.no-conditions.cancel: Anuluj
tagging-rules.form.conditions.value.placeholder: 'Przykład: faktura'
tagging-rules.form.conditions.value.min-length: Proszę wprowadzić wartość dla warunku
tagging-rules.form.tags.label: Tagi
tagging-rules.form.tags.description: Wybierz tagi do zastosowania do dodanych dokumentów, które spełniają warunki
tagging-rules.form.tags.min-length: Co najmniej jeden tag do zastosowania jest wymagany
tagging-rules.form.tags.add-tag: Utwórz tag
tagging-rules.form.submit: Utwórz regułę
tagging-rules.update.title: Zaktualizuj regułę tagowania
tagging-rules.update.error: Nie udało się zaktualizować reguły tagowania
tagging-rules.update.submit: Zaktualizuj regułę
tagging-rules.update.cancel: Anuluj
# Intake emails
intake-emails.title: Adresy przyjęć
intake-emails.description: Adresy przyjęć służą do automatycznego przyjmowania wiadomości e-mail do Papra. Wystarczy przekazać wiadomości e-mail na adres e-mail do przyjmowania, a ich załączniki zostaną dodane do dokumentów Twojej organizacji.
intake-emails.disabled.title: Adresy przyjęć są wyłączone
intake-emails.disabled.description: Adresy przyjęć są wyłączone na tej instancji. Skontaktuj się z administratorem, aby je włączyć. Zobacz {{ documentation }} w celu uzyskania dodatkowych informacji.
intake-emails.disabled.documentation: dokumentację
intake-emails.info: Tylko włączone adresy przyjęć z dozwolonych źródeł będą przetwarzane. Możesz w dowolnym momencie włączyć lub wyłączyć adres e-mail do przyjęć.
intake-emails.empty.title: Brak adresów przyjęć
intake-emails.empty.description: Wygeneruj adres przyjęć, aby łatwo przyjmować załączniki e-mail.
intake-emails.empty.generate: Wygeneruj adres e-mail do przyjęć
intake-emails.count: '{{ count }} adres/ów e-mail do przyjęć dla tej organizacji'
intake-emails.new: Nowy adres e-mail do przyjęć
intake-emails.disabled-label: (Wyłączone)
intake-emails.no-origins: Brak dozwolonych źródeł e-mail
intake-emails.allowed-origins: Dozwolone z {{ count }} adresu/ów
intake-emails.actions.enable: Włącz
intake-emails.actions.disable: Wyłącz
intake-emails.actions.manage-origins: Zarządzaj dozwolonymi źródłami
intake-emails.actions.delete: Usuń
intake-emails.delete.confirm.title: Usuąć adres e-mail do przyjęć?
intake-emails.delete.confirm.message: Czy na pewno chcesz usunąć ten adres e-mail do przyjęć? Ta akcja jest nieodwracalna.
intake-emails.delete.confirm.confirm-button: Usuń adres przyjęć
intake-emails.delete.confirm.cancel-button: Anuluj
intake-emails.delete.success: Adres przyjęć usunięty
intake-emails.create.success: Adres przyjęć utworzony
intake-emails.update.success.enabled: Adres przyjęć włączony
intake-emails.update.success.disabled: Adres przyjęć wyłączony
intake-emails.allowed-origins.title: Dozwolone źródła
intake-emails.allowed-origins.description: Tylko e-maile wysłane na {{ email }} z tych źródeł będą przetwarzane. Jeśli nie określono źródeł, wszystkie e-maile zostaną odrzucone.
intake-emails.allowed-origins.add.label: Dodaj dozwolony adres e-mail
intake-emails.allowed-origins.add.placeholder: 'Przykład: ada@papra.app'
intake-emails.allowed-origins.add.button: Dodaj
intake-emails.allowed-origins.add.error.exists: Ten adres e-mail jest już w dozwolonych źródłach dla tego adresu e-mail do przyjęć.
# API keys
api-keys.permissions.documents.title: Dokumenty
api-keys.permissions.documents.documents:create: Tworzenie dokumentów
api-keys.permissions.documents.documents:read: Odczyt dokumentów
api-keys.permissions.documents.documents:update: Aktualizacja dokumentów
api-keys.permissions.documents.documents:delete: Usuwanie dokumentów
api-keys.permissions.tags.title: Tag
api-keys.permissions.tags.tags:create: Tworzenie tagów
api-keys.permissions.tags.tags:read: Odczyt tagów
api-keys.permissions.tags.tags:update: Aktualizacja tagów
api-keys.permissions.tags.tags:delete: Usuwanie tagów
api-keys.create.title: Tworzenie klucza API
api-keys.create.description: Utwórz nowy klucz API, aby uzyskać dostęp do API Papra.
api-keys.create.success: Klucz API został utworzony pomyślnie.
api-keys.create.back: Wróć do kluczy API
api-keys.create.form.name.label: Nazwa
api-keys.create.form.name.placeholder: 'Przykład: Mój klucz API'
api-keys.create.form.name.required: Proszę wprowadzić nazwę dla klucza API
api-keys.create.form.permissions.label: Uprawnienia
api-keys.create.form.permissions.required: Proszę wybrać co najmniej jedno uprawnienie
api-keys.create.form.submit: Utwórz klucz API
api-keys.create.created.title: Klucz API utworzony
api-keys.create.created.description: Klucz API został utworzony pomyślnie. Zapisz go w bezpiecznym miejscu, ponieważ nie będzie wyświetlony ponownie.
api-keys.list.title: Klucze API
api-keys.list.description: Zarządzaj swoimi kluczami API tutaj.
api-keys.list.create: Utwórz klucz API
api-keys.list.empty.title: Brak kluczy API
api-keys.list.empty.description: Utwórz klucz API, aby uzyskać dostęp do API Papra.
api-keys.list.card.last-used: Ostatnie użycie
api-keys.list.card.never: Nigdy
api-keys.list.card.created: Utworzono
api-keys.delete.success: Klucz API został usunięty pomyślnie
api-keys.delete.confirm.title: Usuń klucz API
api-keys.delete.confirm.message: Czy na pewno chcesz usunąć ten klucz API? Ta akcja jest nieodwracalna.
api-keys.delete.confirm.confirm-button: Usuń
api-keys.delete.confirm.cancel-button: Anuluj
# Webhooks
webhooks.list.title: Webhooki
webhooks.list.description: Zarządzaj webhookami swojej organizacji
webhooks.list.empty.title: Brak webhooków
webhooks.list.empty.description: Utwórz pierwszy webhook, aby rozpocząć odbieranie zdarzeń
webhooks.list.create: Utwórz webhook
webhooks.list.card.last-triggered: Ostatnie wywołanie
webhooks.list.card.never: Nigdy
webhooks.list.card.created: Utworzono
webhooks.create.title: Utwórz webhook
webhooks.create.description: Utwórz nowy webhook, aby odbierać zdarzenia
webhooks.create.success: Webhook został utworzony pomyślnie
webhooks.create.back: Wróć
webhooks.create.form.submit: Utwórz webhook
webhooks.create.form.name.label: Nazwa webhooka
webhooks.create.form.name.placeholder: Wprowadź nazwę webhooka
webhooks.create.form.name.required: Nazwa jest wymagana
webhooks.create.form.url.label: URL webhooka
webhooks.create.form.url.placeholder: Wprowadź URL webhooka
webhooks.create.form.url.required: URL jest wymagany
webhooks.create.form.url.invalid: URL jest nieprawidłowy
webhooks.create.form.secret.label: Sekret
webhooks.create.form.secret.placeholder: Wprowadź sekret webhooka
webhooks.create.form.events.label: Zdarzenia
webhooks.create.form.events.required: Co najmniej jedno zdarzenie jest wymagane
webhooks.update.title: Edytuj webhook
webhooks.update.description: Zaktualizuj szczegóły webhooka
webhooks.update.success: Webhook został zaktualizowany pomyślnie
webhooks.update.submit: Zaktualizuj webhook
webhooks.update.cancel: Anuluj
webhooks.update.form.secret.placeholder: Wprowadź nowy sekret
webhooks.update.form.secret.placeholder-redacted: '[Zredagowany sekret]'
webhooks.update.form.rotate-secret.button: Wygeneruj nowy sekret
webhooks.delete.success: Webhook został usunięty pomyślnie
webhooks.delete.confirm.title: Usuń webhook
webhooks.delete.confirm.message: Czy na pewno chcesz usunąć ten webhook?
webhooks.delete.confirm.confirm-button: Usuń
webhooks.delete.confirm.cancel-button: Anuluj
webhooks.events.documents.title: Zdarzenia dokumentów
webhooks.events.documents.document:created.description: Utworzono dokument
webhooks.events.documents.document:deleted.description: Usunięto dokument
webhooks.events.documents.document:updated.description: Dokument został zaktualizowany
webhooks.events.documents.document:tag:added.description: Tag został dodany do dokumentu
webhooks.events.documents.document:tag:removed.description: Tag został usunięty z dokumentu
# Navigation
layout.menu.home: Strona główna
layout.menu.documents: Dokumenty
layout.menu.tags: Tagi
layout.menu.tagging-rules: Zasady tagowania
layout.menu.deleted-documents: Usunięte dokumenty
layout.menu.organization-settings: Ustawienia
layout.menu.api-keys: Klucze API
layout.menu.settings: Ustawienia
layout.menu.account: Konto
layout.menu.general-settings: Ustawienia ogólne
layout.menu.intake-emails: Adresy przyjęć
layout.menu.webhooks: Webhooki
layout.menu.members: Członkowie
layout.menu.invitations: Zaproszenia
layout.theme.light: Tryb jasny
layout.theme.dark: Tryb ciemny
layout.theme.system: Tryb systemowy
layout.search.placeholder: Szukaj...
layout.menu.import-document: Importuj dokument
user-menu.account-settings: Ustawienia konta
user-menu.api-keys: Klucze API
user-menu.invitations: Zaproszenia
user-menu.language: Język
user-menu.logout: Wyloguj
# Command palette
command-palette.search.placeholder: Szukaj poleceń lub dokumentów
command-palette.no-results: Nie znaleziono wyników
command-palette.sections.documents: Dokumenty
command-palette.sections.theme: Motyw
# API errors
api-errors.document.already_exists: Dokument już istnieje
api-errors.document.file_too_big: Plik dokumentu jest zbyt duży
api-errors.intake_email.limit_reached: Osiągnięto maksymalną liczbę adresów e-mail do przyjęć dla tej organizacji. Aby utworzyć więcej adresów e-mail do przyjęć, zaktualizuj swój plan.
api-errors.user.max_organization_count_reached: Osiągnięto maksymalną liczbę organizacji, które możesz utworzyć. Jeśli potrzebujesz utworzyć więcej, skontaktuj się z pomocą techniczną.
api-errors.default: Wystąpił błąd podczas przetwarzania żądania.
api-errors.organization.invitation_already_exists: Zaproszenie dla tego adresu e-mail już istnieje w tej organizacji.
api-errors.user.already_in_organization: Ten użytkownik należy już do tej organizacji.
api-errors.user.organization_invitation_limit_reached: Osiągnięto maksymalną liczbę zaproszeń na dzisiaj. Spróbuj ponownie jutro.
api-errors.demo.not_available: Ta funkcja nie jest dostępna w wersji demo
api-errors.tags.already_exists: Tag o tej nazwie już istnieje w tej organizacji
api-errors.internal.error: Wystąpił błąd podczas przetwarzania żądania. Spróbuj ponownie później.
api-errors.auth.invalid_origin: Nieprawidłowa lokalizacja aplikacji. Jeśli hostujesz Papra, upewnij się, że zmienna środowiskowa APP_BASE_URL odpowiada bieżącemu adresowi URL. Aby uzyskać więcej informacji, zobacz https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Nie znaleziono
not-found.description: Przepraszamy, strona, której szukasz wydaje się nie istnieć. Sprawdź URL i spróbuj ponownie.
not-found.back-to-home: Wróć do strony głównej
# Demo
demo.popup.description: To jest środowisko demonstracyjne, wszystkie dane są zapisywane w lokalnej pamięci przeglądarki.
demo.popup.discord: Dołącz do {{ discordLink }}, aby uzyskać wsparcie, zaproponować funkcje lub po prostu porozmawiać.
demo.popup.discord-link-label: Serwer Discord
demo.popup.reset: Zresetuj dane demonstracyjne
demo.popup.hide: Ukryj
# Color picker
color-picker.hue: Odcień
color-picker.saturation: Nasycenie
color-picker.lightness: Jasność
color-picker.select-color: Wybierz kolor
color-picker.select-a-color: Wybierz kolor

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Redefina sua senha',
'auth.request-password-reset.description': 'Insira seu e-mail para redefinir sua senha.',
'auth.request-password-reset.requested': 'Se uma conta com este e-mail existe, enviamos uma mensagem para redefinir sua senha.',
'auth.request-password-reset.back-to-login': 'Voltar para o login',
'auth.request-password-reset.form.email.label': 'E-mail',
'auth.request-password-reset.form.email.placeholder': 'Exemplo: cesar@papra.app',
'auth.request-password-reset.form.email.required': 'Por favor, insira seu endereço de e-mail',
'auth.request-password-reset.form.email.invalid': 'Este endereço de e-mail é inválido',
'auth.request-password-reset.form.submit': 'Solicitar redefinição de senha',
'auth.reset-password.title': 'Redefina sua senha',
'auth.reset-password.description': 'Insira sua nova senha para redefinir sua senha.',
'auth.reset-password.reset': 'Sua senha foi redefinida.',
'auth.reset-password.back-to-login': 'Voltar para o login',
'auth.reset-password.form.new-password.label': 'Nova senha',
'auth.reset-password.form.new-password.placeholder': 'Exemplo: **********',
'auth.reset-password.form.new-password.required': 'Por favor, insira sua nova senha',
'auth.reset-password.form.new-password.min-length': 'A senha deve ter pelo menos {{ minLength }} caracteres',
'auth.reset-password.form.new-password.max-length': 'A senha deve ter menos de {{ maxLength }} caracteres',
'auth.reset-password.form.submit': 'Redefinir senha',
'auth.email-provider.open': 'Abrir {{ provider }}',
'auth.login.title': 'Acessar o Papra',
'auth.login.description': 'Insira seu e-mail ou use um login de rede social para acessar sua conta no Papra.',
'auth.login.login-with-provider': 'Entrar com {{ provider }}',
'auth.login.no-account': 'Não tem uma conta?',
'auth.login.register': 'Cadastre-se',
'auth.login.form.email.label': 'E-mail',
'auth.login.form.email.placeholder': 'Exemplo: cesar@papra.app',
'auth.login.form.email.required': 'Por favor, insira seu endereço de e-mail',
'auth.login.form.email.invalid': 'Este endereço de e-mail é inválido',
'auth.login.form.password.label': 'Senha',
'auth.login.form.password.placeholder': 'Defina uma senha',
'auth.login.form.password.required': 'Por favor, insira sua senha',
'auth.login.form.remember-me.label': 'Lembrar de mim',
'auth.login.form.forgot-password.label': 'Esqueceu a senha?',
'auth.login.form.submit': 'Entrar',
'auth.register.title': 'Cadastre-se no Papra',
'auth.register.description': 'Crie uma conta para começar a usar o Papra.',
'auth.register.register-with-email': 'Cadastrar com e-mail',
'auth.register.register-with-provider': 'Cadastrar com {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Já tem uma conta?',
'auth.register.login': 'Entrar',
'auth.register.registration-disabled.title': 'Cadastro desativado',
'auth.register.registration-disabled.description': 'A criação de novas contas está desativada nesta instância do Papra. Somente usuários com contas existentes podem acessar. Se você acha que isso é um engano, entre em contato com o administrador desta instância.',
'auth.register.form.email.label': 'E-mail',
'auth.register.form.email.placeholder': 'Exemplo: cesar@papra.app',
'auth.register.form.email.required': 'Por favor, insira seu endereço de e-mail',
'auth.register.form.email.invalid': 'Este endereço de e-mail é inválido',
'auth.register.form.password.label': 'Senha',
'auth.register.form.password.placeholder': 'Defina uma senha',
'auth.register.form.password.required': 'Por favor, insira sua senha',
'auth.register.form.password.min-length': 'A senha deve ter pelo menos {{ minLength }} caracteres',
'auth.register.form.password.max-length': 'A senha deve ter menos de {{ maxLength }} caracteres',
'auth.register.form.name.label': 'Nome',
'auth.register.form.name.placeholder': 'Exemplo: César Lattes',
'auth.register.form.name.required': 'Por favor, insira seu nome',
'auth.register.form.name.max-length': 'O nome deve ter menos de {{ maxLength }} caracteres',
'auth.register.form.submit': 'Cadastrar',
'auth.email-validation-required.title': 'Verifique seu e-mail',
'auth.email-validation-required.description': 'Um e-mail de verificação foi enviado para seu endereço. Por favor, verifique seu e-mail clicando no link enviado.',
'auth.email-verification.success.title': 'E-mail verificado',
'auth.email-verification.success.description': 'Seu e-mail foi verificado com sucesso. Você já pode fazer login na sua conta.',
'auth.email-verification.success.login': 'Ir para login',
'auth.email-verification.error.title': 'Falha na verificação',
'auth.email-verification.error.description': 'O link de verificação é inválido ou expirou. Por favor, solicite um novo e-mail de verificação ao fazer login.',
'auth.email-verification.error.back': 'Voltar ao login',
'auth.legal-links.description': 'Ao continuar, você reconhece que leu e concorda com os {{ terms }} e a {{ privacy }}.',
'auth.legal-links.terms': 'Termos de Serviço',
'auth.legal-links.privacy': 'Política de Privacidade',
'auth.no-auth-provider.title': 'Nenhum provedor de autenticação',
'auth.no-auth-provider.description': 'Não há provedores de autenticação habilitados nesta instância do Papra. Por favor, entre em contato com o administrador desta instância para habilitá-los.',
// User settings
'user.settings.title': 'Configurações do usuário',
'user.settings.description': 'Gerencie as configurações da sua conta aqui.',
'user.settings.email.title': 'Endereço de e-mail',
'user.settings.email.description': 'Seu endereço de e-mail não pode ser alterado.',
'user.settings.email.label': 'Endereço de e-mail',
'user.settings.name.title': 'Nome completo',
'user.settings.name.description': 'Seu nome completo é exibido para outros membros da organização.',
'user.settings.name.label': 'Nome completo',
'user.settings.name.placeholder': 'Ex: João da Silva',
'user.settings.name.update': 'Atualizar nome',
'user.settings.name.updated': 'Seu nome completo foi atualizado',
'user.settings.logout.title': 'Sair',
'user.settings.logout.description': 'Encerre a sessão da sua conta. Você poderá acessá-la novamente mais tarde.',
'user.settings.logout.button': 'Sair',
// Organizations
'organizations.list.title': 'Suas organizações',
'organizations.list.description': 'Organizações são uma forma de agrupar seus documentos e gerenciar o acesso a eles. Você pode criar várias organizações e convidar membros da sua equipe para colaborar.',
'organizations.list.create-new': 'Criar nova organização',
'organizations.list.back': 'Voltar às organizações',
'organizations.list.deleted.title': 'Organizações excluídas',
'organizations.list.deleted.description': 'As organizações excluídas são mantidas por {{ days }} dias antes de serem removidas permanentemente. Você pode restaurá-las durante este período.',
'organizations.list.deleted.empty': 'Nenhuma organização excluída',
'organizations.list.deleted.empty-description': 'Quando você excluir uma organização, ela aparecerá aqui por {{ days }} dias antes de ser excluída permanentemente.',
'organizations.list.deleted.restore': 'Restaurar',
'organizations.list.deleted.restore-success': 'Organização restaurada com sucesso',
'organizations.list.deleted.restore-confirm.title': 'Restaurar organização',
'organizations.list.deleted.restore-confirm.message': 'Tem certeza de que deseja restaurar esta organização? Ela será movida de volta para sua lista de organizações ativas.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Restaurar organização',
'organizations.list.deleted.deleted-at': 'Excluída em {{ date }}',
'organizations.list.deleted.purge-at': 'Será excluída permanentemente em {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} dia, {daysUntilPurge} dias }} restante{{ daysUntilPurge, >1:s}})',
'organizations.details.no-documents.title': 'Nenhum documento',
'organizations.details.no-documents.description': 'Ainda não há documentos nesta organização. Comece enviando documentos.',
'organizations.details.upload-documents': 'Enviar documentos',
'organizations.details.documents-count': 'documentos no total',
'organizations.details.total-size': 'tamanho total',
'organizations.details.latest-documents': 'Documentos importados recentemente',
'organizations.create.title': 'Criar uma nova organização',
'organizations.create.description': 'Seus documentos serão agrupados por organização. Você pode criar várias organizações para separar, por exemplo, documentos pessoais e profissionais.',
'organizations.create.back': 'Voltar',
'organizations.create.error.max-count-reached': 'Você atingiu o número máximo de organizações que pode criar. Se precisar criar mais, entre em contato com o suporte.',
'organizations.create.form.name.label': 'Nome da organização',
'organizations.create.form.name.placeholder': 'Ex: Empresa Ltda.',
'organizations.create.form.name.required': 'Por favor, insira um nome para a organização',
'organizations.create.form.submit': 'Criar organização',
'organizations.create.success': 'Organização criada com sucesso',
'organizations.create-first.title': 'Crie sua organização',
'organizations.create-first.description': 'Seus documentos serão agrupados por organização. Você pode criar várias organizações para separar, por exemplo, documentos pessoais e profissionais.',
'organizations.create-first.default-name': 'Minha organização',
'organizations.create-first.user-name': 'Organização de {{ name }}',
'organization.settings.title': 'Configurações da Organização',
'organization.settings.page.title': 'Configurações da organização',
'organization.settings.page.description': 'Gerencie aqui as configurações da sua organização.',
'organization.settings.name.title': 'Nome da organização',
'organization.settings.name.update': 'Atualizar nome',
'organization.settings.name.placeholder': 'Ex: Empresa Ltda.',
'organization.settings.name.updated': 'Nome da organização atualizado',
'organization.settings.subscription.title': 'Assinatura',
'organization.settings.subscription.description': 'Gerencie sua cobrança, faturas e formas de pagamento.',
'organization.settings.subscription.manage': 'Gerenciar assinatura',
'organization.settings.subscription.error': 'Falha ao obter o link do portal do cliente',
'organization.settings.delete.title': 'Excluir organização',
'organization.settings.delete.description': 'A exclusão desta organização removerá permanentemente todos seus dados associados.',
'organization.settings.delete.confirm.title': 'Excluir organização',
'organization.settings.delete.confirm.message': 'Tem certeza de que deseja excluir esta organização? A organização será marcada para exclusão e removida permanentemente após {{ days }} dias. Durante este período, você pode restaurá-la da sua lista de organizações. Todos os documentos e dados serão excluídos permanentemente após este prazo.',
'organization.settings.delete.confirm.confirm-button': 'Excluir organização',
'organization.settings.delete.confirm.cancel-button': 'Cancelar',
'organization.settings.delete.success': 'Organização excluída',
'organization.settings.delete.only-owner': 'Apenas o proprietário da organização pode excluir esta organização.',
'organization.settings.delete.has-active-subscription': 'Não é possível excluir a organização com uma assinatura ativa, por favor cancele sua assinatura acima primeiro.',
'organization.usage.page.title': 'Uso',
'organization.usage.page.description': 'Visualize o uso atual e os limites da sua organização.',
'organization.usage.storage.title': 'Armazenamento de documentos',
'organization.usage.storage.description': 'Armazenamento total usado pelos seus documentos',
'organization.usage.intake-emails.title': 'E-mails de entrada',
'organization.usage.intake-emails.description': 'Número de endereços de e-mail de entrada',
'organization.usage.members.title': 'Membros',
'organization.usage.members.description': 'Número de membros na organização',
'organization.usage.unlimited': 'Ilimitado',
'organizations.members.title': 'Membros',
'organizations.members.description': 'Gerencie os membros da sua organização',
'organizations.members.invite-member': 'Convidar membro',
'organizations.members.invite-member-disabled-tooltip': 'Apenas administradores ou proprietários podem convidar membros para a organização',
'organizations.members.remove-from-organization': 'Remover da organização',
'organizations.members.role': 'Função',
'organizations.members.roles.owner': 'Proprietário',
'organizations.members.roles.admin': 'Administrador',
'organizations.members.roles.member': 'Membro',
'organizations.members.delete.confirm.title': 'Remover membro',
'organizations.members.delete.confirm.message': 'Tem certeza de que deseja remover este membro da organização?',
'organizations.members.delete.confirm.confirm-button': 'Remover',
'organizations.members.delete.confirm.cancel-button': 'Cancelar',
'organizations.members.delete.success': 'Membro removido da organização',
'organizations.members.update-role.success': 'Função do membro atualizada',
'organizations.members.table.headers.name': 'Nome',
'organizations.members.table.headers.email': 'E-mail',
'organizations.members.table.headers.role': 'Função',
'organizations.members.table.headers.created': 'Criado em',
'organizations.members.table.headers.actions': 'Ações',
'organizations.invite-member.title': 'Convidar membro',
'organizations.invite-member.description': 'Convide um membro para a sua organização',
'organizations.invite-member.form.email.label': 'E-mail',
'organizations.invite-member.form.email.placeholder': 'Exemplo: cesar@papra.app',
'organizations.invite-member.form.email.required': 'Por favor, insira um endereço de e-mail válido',
'organizations.invite-member.form.role.label': 'Função',
'organizations.invite-member.form.submit': 'Convidar para a organização',
'organizations.invite-member.success.message': 'Membro convidado',
'organizations.invite-member.success.description': 'O e-mail foi convidado para a organização.',
'organizations.invite-member.error.message': 'Falha ao convidar o membro',
'organizations.invitations.title': 'Convites',
'organizations.invitations.description': 'Gerencie os convites da sua organização',
'organizations.invitations.list.cta': 'Convidar membro',
'organizations.invitations.list.empty.title': 'Nenhum convite pendente',
'organizations.invitations.list.empty.description': 'Você ainda não foi convidado para nenhuma organização.',
'organizations.invitations.status.pending': 'Pendente',
'organizations.invitations.status.accepted': 'Aceito',
'organizations.invitations.status.rejected': 'Rejeitado',
'organizations.invitations.status.expired': 'Expirado',
'organizations.invitations.status.cancelled': 'Cancelado',
'organizations.invitations.resend': 'Reenviar convite',
'organizations.invitations.cancel.title': 'Cancelar convite',
'organizations.invitations.cancel.description': 'Tem certeza de que deseja cancelar este convite?',
'organizations.invitations.cancel.confirm': 'Cancelar convite',
'organizations.invitations.cancel.cancel': 'Cancelar',
'organizations.invitations.resend.title': 'Reenviar convite',
'organizations.invitations.resend.description': 'Tem certeza de que deseja reenviar este convite? Um novo e-mail será enviado ao destinatário.',
'organizations.invitations.resend.confirm': 'Reenviar convite',
'organizations.invitations.resend.cancel': 'Cancelar',
'invitations.list.title': 'Convites',
'invitations.list.description': 'Gerencie os convites da sua organização',
'invitations.list.empty.title': 'Nenhum convite pendente',
'invitations.list.empty.description': 'Você ainda não foi convidado para nenhuma organização.',
'invitations.list.headers.organization': 'Organização',
'invitations.list.headers.status': 'Status',
'invitations.list.headers.created': 'Criado em',
'invitations.list.headers.actions': 'Ações',
'invitations.list.actions.accept': 'Aceitar',
'invitations.list.actions.reject': 'Rejeitar',
'invitations.list.actions.accept.success.message': 'Convite aceito',
'invitations.list.actions.accept.success.description': 'O convite foi aceito.',
'invitations.list.actions.reject.success.message': 'Convite rejeitado',
'invitations.list.actions.reject.success.description': 'O convite foi rejeitado.',
// Documents
'documents.list.title': 'Documentos',
'documents.list.no-documents.title': 'Nenhum documento',
'documents.list.no-documents.description': 'Ainda não há documentos nesta organização. Comece enviando documentos.',
'documents.list.no-results': 'Nenhum documento encontrado',
'documents.tabs.info': 'Informações',
'documents.tabs.content': 'Conteúdo',
'documents.tabs.activity': 'Atividades',
'documents.deleted.message': 'Este documento foi excluído e será deletado permanentemente em {{ days }} dias.',
'documents.actions.download': 'Baixar',
'documents.actions.open-in-new-tab': 'Abrir em nova aba',
'documents.actions.restore': 'Restaurar',
'documents.actions.delete': 'Excluir',
'documents.actions.edit': 'Editar',
'documents.actions.cancel': 'Cancelar',
'documents.actions.save': 'Salvar',
'documents.actions.saving': 'Salvando...',
'documents.content.alert': 'O conteúdo do documento é extraído automaticamente durante o envio e será utilizado apenas para fins de busca e indexação.',
'documents.content.empty-placeholder': 'Este documento não tem conteúdo extraído, você pode inserir manualmente aqui.',
'documents.info.id': 'ID',
'documents.info.name': 'Nome',
'documents.info.type': 'Tipo',
'documents.info.size': 'Tamanho',
'documents.info.created-at': 'Criado em',
'documents.info.updated-at': 'Atualizado em',
'documents.info.never': 'Nunca',
'documents.rename.title': 'Renomear documento',
'documents.rename.form.name.label': 'Nome',
'documents.rename.form.name.placeholder': 'Exemplo: Fatura 2024',
'documents.rename.form.name.required': 'Por favor, insira um nome para o documento',
'documents.rename.form.name.max-length': 'O nome deve ter menos de 255 caracteres',
'documents.rename.form.submit': 'Renomear documento',
'documents.rename.success': 'Documento renomeado com sucesso',
'documents.rename.cancel': 'Cancelar',
'import-documents.title.error': '{{ count }} documentos falharam',
'import-documents.title.success': '{{ count }} documentos importados',
'import-documents.title.pending': '{{ count }} / {{ total }} documentos importados',
'import-documents.title.none': 'Importar documentos',
'import-documents.no-import-in-progress': 'Nenhuma importação de documentos em andamento',
'documents.deleted.title': 'Documentos excluídos',
'documents.deleted.empty.title': 'Nenhum documento excluído',
'documents.deleted.empty.description': 'Você não tem documentos excluídos. Documentos excluídos serão movidos para a lixeira por {{ days }} dias.',
'documents.deleted.retention-notice': 'Todos os documentos excluídos são armazenados na lixeira por {{ days }} dias. Após esse período, os documentos serão excluídos permanentemente e não será possível restaurá-los.',
'documents.deleted.deleted-at': 'Excluído em',
'documents.deleted.restoring': 'Restaurando...',
'documents.deleted.deleting': 'Excluindo...',
'documents.preview.unknown-file-type': 'Pré-visualização não disponível para este tipo de arquivo',
'documents.preview.binary-file': 'Arquivos binários não podem ser exibidos como texto',
'trash.delete-all.button': 'Excluir tudo',
'trash.delete-all.confirm.title': 'Excluir todos os documentos permanentemente?',
'trash.delete-all.confirm.description': 'Tem certeza de que deseja excluir permanentemente todos os documentos da lixeira? Esta ação não poderá ser desfeita.',
'trash.delete-all.confirm.label': 'Excluir',
'trash.delete-all.confirm.cancel': 'Cancelar',
'trash.delete.button': 'Excluir',
'trash.delete.confirm.title': 'Excluir documento permanentemente?',
'trash.delete.confirm.description': 'Tem certeza de que deseja excluir permanentemente este documento da lixeira? Esta ação não poderá ser desfeita.',
'trash.delete.confirm.label': 'Excluir',
'trash.delete.confirm.cancel': 'Cancelar',
'trash.deleted.success.title': 'Documento excluído',
'trash.deleted.success.description': 'O documento foi excluído permanentemente.',
'activity.document.created': 'O documento foi criado',
'activity.document.updated.single': 'O {{ field }} foi atualizado',
'activity.document.updated.multiple': 'Os {{ fields }} foram atualizados',
'activity.document.updated': 'O documento foi atualizado',
'activity.document.deleted': 'O documento foi excluído',
'activity.document.restored': 'O documento foi restaurado',
'activity.document.tagged': 'A tag {{ tag }} foi adicionada',
'activity.document.untagged': 'A tag {{ tag }} foi removida',
'activity.document.user.name': 'por {{ name }}',
'activity.load-more': 'Carregar mais',
'activity.no-more-activities': 'Não há mais atividades para este documento',
// Tags
'tags.no-tags.title': 'Nenhuma tag',
'tags.no-tags.description': 'Esta organização ainda não possui tags. As tags são usadas para categorizar documentos. Você pode adicioná-las aos seus documentos para facilitar a busca e a organização.',
'tags.no-tags.create-tag': 'Criar tag',
'tags.title': 'Tags de documentos',
'tags.description': 'As tags são usadas para categorizar documentos. Você pode adicioná-las aos seus documentos para facilitar a busca e a organização.',
'tags.create': 'Criar tag',
'tags.update': 'Atualizar tag',
'tags.delete': 'Excluir tag',
'tags.delete.confirm.title': 'Excluir tag',
'tags.delete.confirm.message': 'Tem certeza de que deseja excluir esta tag? A exclusão de uma tag a removerá de todos os documentos.',
'tags.delete.confirm.confirm-button': 'Excluir',
'tags.delete.confirm.cancel-button': 'Cancelar',
'tags.delete.success': 'Tag excluída com sucesso',
'tags.create.success': 'Tag "{{ name }}" criada com sucesso.',
'tags.update.success': 'Tag "{{ name }}" atualizada com sucesso.',
'tags.form.name.label': 'Nome',
'tags.form.name.placeholder': 'Ex: Contratos',
'tags.form.name.required': 'Por favor, insira um nome para a tag',
'tags.form.name.max-length': 'O nome da tag deve ter menos de 64 caracteres',
'tags.form.color.label': 'Cor',
'tags.form.color.required': 'Por favor, insira uma cor',
'tags.form.color.invalid': 'Código hexadecimal formatado incorretamente.',
'tags.form.description.label': 'Descrição',
'tags.form.description.optional': '(opcional)',
'tags.form.description.placeholder': 'Ex: Todos os contratos assinados pela empresa',
'tags.form.description.max-length': 'A descrição deve ter menos de 256 caracteres',
'tags.form.no-description': 'Sem descrição',
'tags.table.headers.tag': 'Tag',
'tags.table.headers.description': 'Descrição',
'tags.table.headers.documents': 'Documentos',
'tags.table.headers.created': 'Criado em',
'tags.table.headers.actions': 'Ações',
// Tagging rules
'tagging-rules.field.name': 'o nome do documento',
'tagging-rules.field.content': 'o conteúdo do documento',
'tagging-rules.operator.equals': 'é igual a',
'tagging-rules.operator.not-equals': 'é diferente de',
'tagging-rules.operator.contains': 'contém',
'tagging-rules.operator.not-contains': 'não contém',
'tagging-rules.operator.starts-with': 'começa com',
'tagging-rules.operator.ends-with': 'termina com',
'tagging-rules.list.title': 'Regras de marcação',
'tagging-rules.list.description': 'Gerencie as regras de marcação da sua organização para aplicar tags automaticamente a documentos com base em condições definidas por você.',
'tagging-rules.list.demo-warning': 'Nota: Como este é um ambiente de demonstração (sem servidor), as regras de marcação não serão aplicadas a novos documentos adicionados.',
'tagging-rules.list.no-tagging-rules.title': 'Nenhuma regra de marcação',
'tagging-rules.list.no-tagging-rules.description': 'Crie uma regra de marcação para aplicar tags automaticamente aos documentos adicionados, com base em condições definidas por você.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Criar regra de marcação',
'tagging-rules.list.card.no-conditions': 'Nenhuma condição',
'tagging-rules.list.card.one-condition': '1 condição',
'tagging-rules.list.card.conditions': '{{ count }} condições',
'tagging-rules.list.card.delete': 'Excluir regra',
'tagging-rules.list.card.edit': 'Editar regra',
'tagging-rules.create.title': 'Criar regra de marcação',
'tagging-rules.create.success': 'Regra de marcação criada com sucesso',
'tagging-rules.create.error': 'Falha ao criar a regra de marcação',
'tagging-rules.create.submit': 'Criar regra',
'tagging-rules.form.name.label': 'Nome',
'tagging-rules.form.name.placeholder': 'Exemplo: Marcar faturas',
'tagging-rules.form.name.min-length': 'Por favor, insira um nome para a regra',
'tagging-rules.form.name.max-length': 'O nome deve ter menos de 64 caracteres',
'tagging-rules.form.description.label': 'Descrição',
'tagging-rules.form.description.placeholder': 'Exemplo: Marcar documentos com \'fatura\' no nome',
'tagging-rules.form.description.max-length': 'A descrição deve ter menos de 256 caracteres',
'tagging-rules.form.conditions.label': 'Condições',
'tagging-rules.form.conditions.description': 'Defina as condições que devem ser atendidas para que a regra seja aplicada. Sem condições significa que a regra será aplicada a todos os documentos',
'tagging-rules.form.conditions.add-condition': 'Adicionar condição',
'tagging-rules.form.conditions.connector.when': 'Quando',
'tagging-rules.form.conditions.connector.and': 'e que',
'tagging-rules.form.conditions.connector.or': 'ou que',
'tagging-rules.condition-match-mode.all': 'Todas as condições devem corresponder',
'tagging-rules.condition-match-mode.any': 'Qualquer condição deve corresponder',
'tagging-rules.form.conditions.no-conditions.title': 'Nenhuma condição',
'tagging-rules.form.conditions.no-conditions.description': 'Você não adicionou nenhuma condição a esta regra. Ela será aplicada a todos os documentos.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Aplicar regra sem condições',
'tagging-rules.form.conditions.no-conditions.cancel': 'Cancelar',
'tagging-rules.form.conditions.value.placeholder': 'Exemplo: fatura',
'tagging-rules.form.conditions.value.min-length': 'Por favor, insira um valor para a condição',
'tagging-rules.form.tags.label': 'Tags',
'tagging-rules.form.tags.description': 'Selecione as tags que serão aplicadas aos documentos adicionados que correspondam às condições',
'tagging-rules.form.tags.min-length': 'Ao menos uma tag para aplicar é necessária',
'tagging-rules.form.tags.add-tag': 'Criar tag',
'tagging-rules.form.submit': 'Criar regra',
'tagging-rules.update.title': 'Atualizar regra de marcação',
'tagging-rules.update.error': 'Falha ao atualizar a regra de marcação',
'tagging-rules.update.submit': 'Atualizar regra',
'tagging-rules.update.cancel': 'Cancelar',
'tagging-rules.apply.button': 'Aplicar a documentos existentes',
'tagging-rules.apply.confirm.title': 'Aplicar regra a documentos existentes?',
'tagging-rules.apply.confirm.description': 'Isso verificará todos os documentos existentes em sua organização e aplicará tags onde as condições correspondam. O processamento será feito em segundo plano.',
'tagging-rules.apply.confirm.button': 'Aplicar regra',
'tagging-rules.apply.success': 'Aplicação da regra iniciada em segundo plano',
'tagging-rules.apply.error': 'Falha ao iniciar a aplicação da regra',
'tagging-rules.apply.processing': 'Iniciando...',
// Intake emails
'intake-emails.title': 'E-mails de entrada',
'intake-emails.description': 'Os endereços de e-mail de entrada são usados para importar automaticamente e-mails para o Papra. Basta encaminhar e-mails para o endereço de entrada e os anexos serão adicionados aos documentos da sua organização.',
'intake-emails.disabled.title': 'E-mails de entrada desativados',
'intake-emails.disabled.description': 'Os e-mails de entrada estão desativados nesta instância. Por favor, entre em contato com o administrador para ativá-los. Consulte a {{ documentation }} para mais informações.',
'intake-emails.disabled.documentation': 'documentação',
'intake-emails.info': 'Apenas e-mails de entrada habilitados e provenientes de origens permitidas serão processados. Você pode ativar ou desativar um e-mail de entrada a qualquer momento.',
'intake-emails.empty.title': 'Nenhum e-mail de entrada',
'intake-emails.empty.description': 'Gere um endereço de entrada para importar facilmente anexos de e-mails.',
'intake-emails.empty.generate': 'Gerar e-mail de entrada',
'intake-emails.count': '{{ count }} e-mail{{ plural }} de entrada para esta organização',
'intake-emails.new': 'Novo e-mail de entrada',
'intake-emails.disabled-label': '(Desativado)',
'intake-emails.no-origins': 'Nenhuma origem de e-mail permitida',
'intake-emails.allowed-origins': 'Permitido de {{ count }} endereço{{ plural }}',
'intake-emails.actions.enable': 'Ativar',
'intake-emails.actions.disable': 'Desativar',
'intake-emails.actions.manage-origins': 'Gerenciar endereços de origem',
'intake-emails.actions.delete': 'Excluir',
'intake-emails.delete.confirm.title': 'Excluir e-mail de entrada?',
'intake-emails.delete.confirm.message': 'Tem certeza de que deseja excluir este e-mail de entrada? Esta ação não poderá ser desfeita.',
'intake-emails.delete.confirm.confirm-button': 'Excluir e-mail de entrada',
'intake-emails.delete.confirm.cancel-button': 'Cancelar',
'intake-emails.delete.success': 'E-mail de entrada excluído',
'intake-emails.create.success': 'E-mail de entrada criado',
'intake-emails.update.success.enabled': 'E-mail de entrada ativado',
'intake-emails.update.success.disabled': 'E-mail de entrada desativado',
'intake-emails.allowed-origins.title': 'Origens permitidas',
'intake-emails.allowed-origins.description': 'Apenas e-mails enviados para {{ email }} a partir dessas origens serão processados. Se nenhuma origem for especificada, todos os e-mails serão descartados.',
'intake-emails.allowed-origins.add.label': 'Adicionar e-mail de origem permitida',
'intake-emails.allowed-origins.add.placeholder': 'Ex: ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Adicionar',
'intake-emails.allowed-origins.add.error.exists': 'Este e-mail já está nas origens permitidas para este e-mail de entrada',
// API keys
'api-keys.permissions.select-all': 'Selecionar tudo',
'api-keys.permissions.deselect-all': 'Desmarcar tudo',
'api-keys.permissions.organizations.title': 'Organizações',
'api-keys.permissions.organizations.organizations:create': 'Criar organizações',
'api-keys.permissions.organizations.organizations:read': 'Ler organizações',
'api-keys.permissions.organizations.organizations:update': 'Atualizar organizações',
'api-keys.permissions.organizations.organizations:delete': 'Excluir organizações',
'api-keys.permissions.documents.title': 'Documentos',
'api-keys.permissions.documents.documents:create': 'Criar documentos',
'api-keys.permissions.documents.documents:read': 'Ler documentos',
'api-keys.permissions.documents.documents:update': 'Atualizar documentos',
'api-keys.permissions.documents.documents:delete': 'Excluir documentos',
'api-keys.permissions.tags.title': 'Tags',
'api-keys.permissions.tags.tags:create': 'Criar tags',
'api-keys.permissions.tags.tags:read': 'Ler tags',
'api-keys.permissions.tags.tags:update': 'Atualizar tags',
'api-keys.permissions.tags.tags:delete': 'Excluir tags',
'api-keys.create.title': 'Criar chave de API',
'api-keys.create.description': 'Crie uma nova chave de API para acessar a API do Papra.',
'api-keys.create.success': 'A chave de API foi criada com sucesso.',
'api-keys.create.back': 'Voltar para as chaves de API',
'api-keys.create.form.name.label': 'Nome',
'api-keys.create.form.name.placeholder': 'Exemplo: Minha chave de API',
'api-keys.create.form.name.required': 'Por favor, insira um nome para a chave de API',
'api-keys.create.form.permissions.label': 'Permissões',
'api-keys.create.form.permissions.required': 'Por favor, selecione ao menos uma permissão',
'api-keys.create.form.submit': 'Criar chave de API',
'api-keys.create.created.title': 'Chave de API criada',
'api-keys.create.created.description': 'A chave de API foi criada com sucesso. Salve-a em um local seguro, pois ela não será exibida novamente.',
'api-keys.list.title': 'Chaves de API',
'api-keys.list.description': 'Gerencie suas chaves de API aqui.',
'api-keys.list.create': 'Criar chave de API',
'api-keys.list.empty.title': 'Nenhuma chave de API',
'api-keys.list.empty.description': 'Crie uma chave de API para acessar a API do Papra.',
'api-keys.list.card.last-used': 'Último uso',
'api-keys.list.card.never': 'Nunca',
'api-keys.list.card.created': 'Criada em',
'api-keys.delete.success': 'A chave de API foi excluída com sucesso',
'api-keys.delete.confirm.title': 'Excluir chave de API',
'api-keys.delete.confirm.message': 'Tem certeza de que deseja excluir esta chave de API? Esta ação não poderá ser desfeita.',
'api-keys.delete.confirm.confirm-button': 'Excluir',
'api-keys.delete.confirm.cancel-button': 'Cancelar',
// Webhooks
'webhooks.list.title': 'Webhooks',
'webhooks.list.description': 'Gerencie os webhooks da sua organização',
'webhooks.list.empty.title': 'Nenhum webhook',
'webhooks.list.empty.description': 'Crie seu primeiro webhook para começar a receber eventos',
'webhooks.list.create': 'Criar webhook',
'webhooks.list.card.last-triggered': 'Última ativação',
'webhooks.list.card.never': 'Nunca',
'webhooks.list.card.created': 'Criado em',
'webhooks.create.title': 'Criar webhook',
'webhooks.create.description': 'Crie um novo webhook para receber eventos',
'webhooks.create.success': 'Webhook criado com sucesso',
'webhooks.create.back': 'Voltar',
'webhooks.create.form.submit': 'Criar webhook',
'webhooks.create.form.name.label': 'Nome do webhook',
'webhooks.create.form.name.placeholder': 'Insira o nome do webhook',
'webhooks.create.form.name.required': 'O nome é obrigatório',
'webhooks.create.form.url.label': 'URL do Webhook',
'webhooks.create.form.url.placeholder': 'Insira a URL do webhook',
'webhooks.create.form.url.required': 'A URL é obrigatória',
'webhooks.create.form.url.invalid': 'URL inválida',
'webhooks.create.form.secret.label': 'Segredo',
'webhooks.create.form.secret.placeholder': 'Insira o segredo do webhook',
'webhooks.create.form.events.label': 'Eventos',
'webhooks.create.form.events.required': 'Adicione pelo menos um evento',
'webhooks.update.title': 'Editar webhook',
'webhooks.update.description': 'Atualize os detalhes do seu webhook',
'webhooks.update.success': 'Webhook atualizado com sucesso',
'webhooks.update.submit': 'Atualizar webhook',
'webhooks.update.cancel': 'Cancelar',
'webhooks.update.form.secret.placeholder': 'Insira um novo segredo',
'webhooks.update.form.secret.placeholder-redacted': '[Segredo ocultado]',
'webhooks.update.form.rotate-secret.button': 'Rotacionar segredo',
'webhooks.delete.success': 'Webhook excluído com sucesso',
'webhooks.delete.confirm.title': 'Excluir webhook',
'webhooks.delete.confirm.message': 'Tem certeza de que deseja excluir este webhook?',
'webhooks.delete.confirm.confirm-button': 'Excluir',
'webhooks.delete.confirm.cancel-button': 'Cancelar',
'webhooks.events.documents.title': 'Eventos de documentos',
'webhooks.events.documents.document:created.description': 'Documento criado',
'webhooks.events.documents.document:deleted.description': 'Documento excluído',
'webhooks.events.documents.document:updated.description': 'Documento atualizado',
'webhooks.events.documents.document:tag:added.description': 'Uma tag foi adicionada a um documento',
'webhooks.events.documents.document:tag:removed.description': 'Uma tag foi removida de um documento',
// Navigation
'layout.menu.home': 'Início',
'layout.menu.documents': 'Documentos',
'layout.menu.tags': 'Tags',
'layout.menu.tagging-rules': 'Regras de marcação',
'layout.menu.deleted-documents': 'Documentos excluídos',
'layout.menu.organization-settings': 'Configurações',
'layout.menu.api-keys': 'Chaves de API',
'layout.menu.settings': 'Configurações',
'layout.menu.account': 'Conta',
'layout.menu.general-settings': 'Configurações gerais',
'layout.menu.usage': 'Uso',
'layout.menu.intake-emails': 'E-mails de entrada',
'layout.menu.webhooks': 'Webhooks',
'layout.menu.members': 'Membros',
'layout.menu.invitations': 'Convites',
'layout.upgrade-cta.title': 'Precisa de mais espaço?',
'layout.upgrade-cta.description': 'Obtenha 10x mais armazenamento + colaboração em equipe',
'layout.upgrade-cta.button': 'Atualizar agora',
'layout.theme.light': 'Tema claro',
'layout.theme.dark': 'Tema escuro',
'layout.theme.system': 'Tema do sistema',
'layout.search.placeholder': 'Buscar...',
'layout.menu.import-document': 'Importar um documento',
'user-menu.account-settings': 'Configurações da conta',
'user-menu.api-keys': 'Chaves de API',
'user-menu.invitations': 'Convites',
'user-menu.language': 'Idioma',
'user-menu.logout': 'Sair',
// Command palette
'command-palette.search.placeholder': 'Buscar comandos ou documentos',
'command-palette.no-results': 'Nenhum resultado encontrado',
'command-palette.sections.documents': 'Documentos',
'command-palette.sections.theme': 'Tema',
// API errors
'api-errors.document.already_exists': 'O documento já existe',
'api-errors.document.size_too_large': 'O arquivo é muito grande',
'api-errors.intake-emails.already_exists': 'Um e-mail de entrada com este endereço já existe.',
'api-errors.intake_email.limit_reached': 'O número máximo de e-mails de entrada para esta organização foi atingido. Faça um upgrade no seu plano para criar mais e-mails de entrada.',
'api-errors.user.max_organization_count_reached': 'Você atingiu o número máximo de organizações que pode criar. Se precisar criar mais, entre em contato com o suporte.',
'api-errors.default': 'Ocorreu um erro ao processar sua solicitação.',
'api-errors.organization.invitation_already_exists': 'Já existe um convite para este e-mail nesta organização.',
'api-errors.user.already_in_organization': 'Este usuário já faz parte desta organização.',
'api-errors.user.organization_invitation_limit_reached': 'O número máximo de convites por hoje foi atingido. Por favor, tente novamente amanhã.',
'api-errors.demo.not_available': 'Este recurso não está disponível em ambiente de demonstração',
'api-errors.tags.already_exists': 'Já existe uma tag com este nome nesta organização',
'api-errors.internal.error': 'Ocorreu um erro ao processar sua solicitação. Por favor, tente novamente.',
'api-errors.auth.invalid_origin': 'Origem da aplicação inválida. Se você está hospedando o Papra, certifique-se de que a variável de ambiente APP_BASE_URL corresponde à sua URL atual. Para mais detalhes, consulte https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'O número máximo de membros e convites pendentes para esta organização foi atingido. Atualize seu plano para adicionar mais membros.',
'api-errors.organization.has_active_subscription': 'Não é possível excluir a organização com uma assinatura ativa. Por favor, cancele sua assinatura primeiro usando o botão Gerenciar Assinatura acima.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Usuário não encontrado',
'api-errors.FAILED_TO_CREATE_USER': 'Falha ao criar usuário',
'api-errors.FAILED_TO_CREATE_SESSION': 'Falha ao criar sessão',
'api-errors.FAILED_TO_UPDATE_USER': 'Falha ao atualizar usuário',
'api-errors.FAILED_TO_GET_SESSION': 'Falha ao obter sessão',
'api-errors.INVALID_PASSWORD': 'Senha inválida',
'api-errors.INVALID_EMAIL': 'Email inválido',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'O email ou a senha está incorreta, ou a conta não existe.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Conta social já vinculada',
'api-errors.PROVIDER_NOT_FOUND': 'Provedor não encontrado',
'api-errors.INVALID_TOKEN': 'Token inválido',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Token de ID não suportado',
'api-errors.FAILED_TO_GET_USER_INFO': 'Falha ao obter informações do usuário',
'api-errors.USER_EMAIL_NOT_FOUND': 'Email do usuário não encontrado',
'api-errors.EMAIL_NOT_VERIFIED': 'Email não verificado',
'api-errors.PASSWORD_TOO_SHORT': 'Senha muito curta',
'api-errors.PASSWORD_TOO_LONG': 'Senha muito longa',
'api-errors.USER_ALREADY_EXISTS': 'Já existe um usuário com este email',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'O email não pode ser atualizado',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Conta de credenciais não encontrada',
'api-errors.SESSION_EXPIRED': 'Sessão expirada',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Falha ao desvincular a última conta',
'api-errors.ACCOUNT_NOT_FOUND': 'Conta não encontrada',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'O usuário já possui uma senha',
// Not found
'not-found.title': '404 - Página não encontrada',
'not-found.description': 'Desculpe, a página que você está procurando não existe. Verifique o URL e tente novamente.',
'not-found.back-to-home': 'Voltar para a página inicial',
// Demo
'demo.popup.description': 'Este é um ambiente de demonstração; todos os dados são salvos no armazenamento local do seu navegador.',
'demo.popup.discord': 'Entre no {{ discordLink }} para obter suporte, sugerir funcionalidades ou apenas conversar.',
'demo.popup.discord-link-label': 'Comunidade do Discord',
'demo.popup.reset': 'Redefinir dados da demonstração',
'demo.popup.hide': 'Ocultar',
// Color picker
'color-picker.hue': 'Matiz',
'color-picker.saturation': 'Saturação',
'color-picker.lightness': 'Brilho',
'color-picker.select-color': 'Selecionar cor',
'color-picker.select-a-color': 'Selecione uma cor',
// Subscriptions
'subscriptions.checkout-success.title': 'Pagamento bem-sucedido!',
'subscriptions.checkout-success.description': 'Sua assinatura foi ativada com sucesso.',
'subscriptions.checkout-success.thank-you': 'Obrigado por fazer upgrade para o Papra Plus. Agora você tem acesso a todos os recursos premium.',
'subscriptions.checkout-success.go-to-organizations': 'Ir para Organizações',
'subscriptions.checkout-success.redirecting': 'Redirecionando em {{ count }} segundo{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Pagamento cancelado',
'subscriptions.checkout-cancel.description': 'Seu upgrade de assinatura foi cancelado.',
'subscriptions.checkout-cancel.no-charges': 'Nenhuma cobrança foi feita em sua conta. Você pode tentar novamente quando estiver pronto.',
'subscriptions.checkout-cancel.back-to-organizations': 'Voltar para Organizações',
'subscriptions.checkout-cancel.need-help': 'Precisa de ajuda?',
'subscriptions.checkout-cancel.contact-support': 'Contatar suporte',
'subscriptions.upgrade-dialog.title': 'Atualizar esta organização',
'subscriptions.upgrade-dialog.description': 'Desbloqueie recursos poderosos para sua organização',
'subscriptions.upgrade-dialog.contact-us': 'Entre em contato',
'subscriptions.upgrade-dialog.enterprise-plans': 'se você precisar de planos empresariais personalizados.',
'subscriptions.upgrade-dialog.current-plan': 'Plano atual',
'subscriptions.upgrade-dialog.recommended': 'Recomendado',
'subscriptions.upgrade-dialog.per-month': '/mês',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} faturado anualmente',
'subscriptions.upgrade-dialog.upgrade-now': 'Fazer upgrade agora',
'subscriptions.upgrade-dialog.promo-banner.title': 'Oferta por tempo limitado',
'subscriptions.upgrade-dialog.promo-banner.description': 'Ganhe {{ percent }}% de desconto por organização em todos os planos para sempre como early adopter! A oferta expira em {{ days, >1:{days} dias, =1:1 dia, menos de um dia }}.',
'subscriptions.plan.free.name': 'Plano gratuito',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Tamanho de armazenamento de documentos',
'subscriptions.features.members': 'Membros da organização',
'subscriptions.features.members-count': '{{ count }} membros',
'subscriptions.features.email-intakes': 'E-mails de entrada',
'subscriptions.features.email-intakes-count-singular': '{{ count }} endereço',
'subscriptions.features.email-intakes-count-plural': '{{ count }} endereços',
'subscriptions.features.max-upload-size': 'Tamanho máximo de upload',
'subscriptions.features.support': 'Suporte',
'subscriptions.features.support-community': 'Suporte da comunidade',
'subscriptions.features.support-email': 'Suporte por e-mail',
'subscriptions.features.support-priority': 'Suporte prioritário',
'subscriptions.billing-interval.monthly': 'Mensal',
'subscriptions.billing-interval.annual': 'Anual',
'subscriptions.usage-warning.message': 'Você usou {{ percent }}% do seu armazenamento de documentos. Considere atualizar seu plano para obter mais espaço.',
'subscriptions.usage-warning.upgrade-button': 'Atualizar plano',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Digite "{{ text }}" para confirmar',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Redefina sua senha
auth.request-password-reset.description: Insira seu e-mail para redefinir sua senha.
auth.request-password-reset.requested: Se uma conta com este e-mail existe, enviamos uma mensagem para redefinir sua senha.
auth.request-password-reset.back-to-login: Voltar para o login
auth.request-password-reset.form.email.label: E-mail
auth.request-password-reset.form.email.placeholder: 'Exemplo: cesar@papra.app'
auth.request-password-reset.form.email.required: Por favor, insira seu endereço de e-mail
auth.request-password-reset.form.email.invalid: Este endereço de e-mail é inválido
auth.request-password-reset.form.submit: Solicitar redefinição de senha
auth.reset-password.title: Redefina sua senha
auth.reset-password.description: Insira sua nova senha para redefinir sua senha.
auth.reset-password.reset: Sua senha foi redefinida.
auth.reset-password.back-to-login: Voltar para o login
auth.reset-password.form.new-password.label: Nova senha
auth.reset-password.form.new-password.placeholder: 'Exemplo: **********'
auth.reset-password.form.new-password.required: Por favor, insira sua nova senha
auth.reset-password.form.new-password.min-length: A senha deve ter pelo menos {{ minLength }} caracteres
auth.reset-password.form.new-password.max-length: A senha deve ter menos de {{ maxLength }} caracteres
auth.reset-password.form.submit: Redefinir senha
auth.email-provider.open: Abrir {{ provider }}
auth.login.title: Acessar o Papra
auth.login.description: Insira seu e-mail ou use um login de rede social para acessar sua conta no Papra.
auth.login.login-with-provider: Entrar com {{ provider }}
auth.login.no-account: Não tem uma conta?
auth.login.register: Cadastre-se
auth.login.form.email.label: E-mail
auth.login.form.email.placeholder: 'Exemplo: cesar@papra.app'
auth.login.form.email.required: Por favor, insira seu endereço de e-mail
auth.login.form.email.invalid: Este endereço de e-mail é inválido
auth.login.form.password.label: Senha
auth.login.form.password.placeholder: Defina uma senha
auth.login.form.password.required: Por favor, insira sua senha
auth.login.form.remember-me.label: Lembrar de mim
auth.login.form.forgot-password.label: Esqueceu a senha?
auth.login.form.submit: Entrar
auth.register.title: Cadastre-se no Papra
auth.register.description: Crie uma conta para começar a usar o Papra.
auth.register.register-with-email: Cadastrar com e-mail
auth.register.register-with-provider: Cadastrar com {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Já tem uma conta?
auth.register.login: Entrar
auth.register.registration-disabled.title: Cadastro desativado
auth.register.registration-disabled.description: A criação de novas contas está desativada nesta instância do Papra. Somente usuários com contas existentes podem acessar. Se você acha que isso é um engano, entre em contato com o administrador desta instância.
auth.register.form.email.label: E-mail
auth.register.form.email.placeholder: 'Exemplo: cesar@papra.app'
auth.register.form.email.required: Por favor, insira seu endereço de e-mail
auth.register.form.email.invalid: Este endereço de e-mail é inválido
auth.register.form.password.label: Senha
auth.register.form.password.placeholder: Defina uma senha
auth.register.form.password.required: Por favor, insira sua senha
auth.register.form.password.min-length: A senha deve ter pelo menos {{ minLength }} caracteres
auth.register.form.password.max-length: A senha deve ter menos de {{ maxLength }} caracteres
auth.register.form.name.label: Nome
auth.register.form.name.placeholder: 'Exemplo: César Lattes'
auth.register.form.name.required: Por favor, insira seu nome
auth.register.form.name.max-length: O nome deve ter menos de {{ maxLength }} caracteres
auth.register.form.submit: Cadastrar
auth.email-validation-required.title: Verifique seu e-mail
auth.email-validation-required.description: Um e-mail de verificação foi enviado para seu endereço. Por favor, verifique seu e-mail clicando no link enviado.
auth.legal-links.description: Ao continuar, você reconhece que leu e concorda com os {{ terms }} e a {{ privacy }}.
auth.legal-links.terms: Termos de Serviço
auth.legal-links.privacy: Política de Privacidade
auth.no-auth-provider.title: Nenhum provedor de autenticação
auth.no-auth-provider.description: Não há provedores de autenticação habilitados nesta instância do Papra. Por favor, entre em contato com o administrador desta instância para habilitá-los.
# User settings
user.settings.title: Configurações do usuário
user.settings.description: Gerencie as configurações da sua conta aqui.
user.settings.email.title: Endereço de e-mail
user.settings.email.description: Seu endereço de e-mail não pode ser alterado.
user.settings.email.label: Endereço de e-mail
user.settings.name.title: Nome completo
user.settings.name.description: Seu nome completo é exibido para outros membros da organização.
user.settings.name.label: Nome completo
user.settings.name.placeholder: 'Ex: João da Silva'
user.settings.name.update: Atualizar nome
user.settings.name.updated: Seu nome completo foi atualizado
user.settings.logout.title: Sair
user.settings.logout.description: Encerre a sessão da sua conta. Você poderá acessá-la novamente mais tarde.
user.settings.logout.button: Sair
# Organizations
organizations.list.title: Suas organizações
organizations.list.description: Organizações são uma forma de agrupar seus documentos e gerenciar o acesso a eles. Você pode criar várias organizações e convidar membros da sua equipe para colaborar.
organizations.list.create-new: Criar nova organização
organizations.details.no-documents.title: Nenhum documento
organizations.details.no-documents.description: Ainda não há documentos nesta organização. Comece enviando documentos.
organizations.details.upload-documents: Enviar documentos
organizations.details.documents-count: documentos no total
organizations.details.total-size: tamanho total
organizations.details.latest-documents: Documentos importados recentemente
organizations.create.title: Criar uma nova organização
organizations.create.description: Seus documentos serão agrupados por organização. Você pode criar várias organizações para separar, por exemplo, documentos pessoais e profissionais.
organizations.create.back: Voltar
organizations.create.error.max-count-reached: Você atingiu o número máximo de organizações que pode criar. Se precisar criar mais, entre em contato com o suporte.
organizations.create.form.name.label: Nome da organização
organizations.create.form.name.placeholder: 'Ex: Empresa Ltda.'
organizations.create.form.name.required: Por favor, insira um nome para a organização
organizations.create.form.submit: Criar organização
organizations.create.success: Organização criada com sucesso
organizations.create-first.title: Crie sua organização
organizations.create-first.description: Seus documentos serão agrupados por organização. Você pode criar várias organizações para separar, por exemplo, documentos pessoais e profissionais.
organizations.create-first.default-name: Minha organização
organizations.create-first.user-name: Organização de {{ name }}
organization.settings.title: Configurações da Organização
organization.settings.page.title: Configurações da organização
organization.settings.page.description: Gerencie aqui as configurações da sua organização.
organization.settings.name.title: Nome da organização
organization.settings.name.update: Atualizar nome
organization.settings.name.placeholder: 'Ex: Empresa Ltda.'
organization.settings.name.updated: Nome da organização atualizado
organization.settings.subscription.title: Assinatura
organization.settings.subscription.description: Gerencie sua cobrança, faturas e formas de pagamento.
organization.settings.subscription.manage: Gerenciar assinatura
organization.settings.subscription.error: Falha ao obter o link do portal do cliente
organization.settings.delete.title: Excluir organização
organization.settings.delete.description: A exclusão desta organização removerá permanentemente todos seus dados associados.
organization.settings.delete.confirm.title: Excluir organização
organization.settings.delete.confirm.message: Tem certeza de que deseja excluir esta organização? Esta ação não pode ser desfeita e todos os dados associados serão permanentemente removidos.
organization.settings.delete.confirm.confirm-button: Excluir organização
organization.settings.delete.confirm.cancel-button: Cancelar
organization.settings.delete.success: Organização excluída
organizations.members.title: Membros
organizations.members.description: Gerencie os membros da sua organização
organizations.members.invite-member: Convidar membro
organizations.members.invite-member-disabled-tooltip: Apenas administradores ou proprietários podem convidar membros para a organização
organizations.members.remove-from-organization: Remover da organização
organizations.members.role: Função
organizations.members.roles.owner: Proprietário
organizations.members.roles.admin: Administrador
organizations.members.roles.member: Membro
organizations.members.delete.confirm.title: Remover membro
organizations.members.delete.confirm.message: Tem certeza de que deseja remover este membro da organização?
organizations.members.delete.confirm.confirm-button: Remover
organizations.members.delete.confirm.cancel-button: Cancelar
organizations.members.delete.success: Membro removido da organização
organizations.members.update-role.success: Função do membro atualizada
organizations.members.table.headers.name: Nome
organizations.members.table.headers.email: E-mail
organizations.members.table.headers.role: Função
organizations.members.table.headers.created: Criado em
organizations.members.table.headers.actions: Ações
organizations.invite-member.title: Convidar membro
organizations.invite-member.description: Convide um membro para a sua organização
organizations.invite-member.form.email.label: E-mail
organizations.invite-member.form.email.placeholder: 'Exemplo: cesar@papra.app'
organizations.invite-member.form.email.required: Por favor, insira um endereço de e-mail válido
organizations.invite-member.form.role.label: Função
organizations.invite-member.form.submit: Convidar para a organização
organizations.invite-member.success.message: Membro convidado
organizations.invite-member.success.description: O e-mail foi convidado para a organização.
organizations.invite-member.error.message: Falha ao convidar o membro
organizations.invitations.title: Convites
organizations.invitations.description: Gerencie os convites da sua organização
organizations.invitations.list.cta: Convidar membro
organizations.invitations.list.empty.title: Nenhum convite pendente
organizations.invitations.list.empty.description: Você ainda não foi convidado para nenhuma organização.
organizations.invitations.status.pending: Pendente
organizations.invitations.status.accepted: Aceito
organizations.invitations.status.rejected: Rejeitado
organizations.invitations.status.expired: Expirado
organizations.invitations.status.cancelled: Cancelado
organizations.invitations.resend: Reenviar convite
organizations.invitations.cancel.title: Cancelar convite
organizations.invitations.cancel.description: Tem certeza de que deseja cancelar este convite?
organizations.invitations.cancel.confirm: Cancelar convite
organizations.invitations.cancel.cancel: Cancelar
organizations.invitations.resend.title: Reenviar convite
organizations.invitations.resend.description: Tem certeza de que deseja reenviar este convite? Um novo e-mail será enviado ao destinatário.
organizations.invitations.resend.confirm: Reenviar convite
organizations.invitations.resend.cancel: Cancelar
invitations.list.title: Convites
invitations.list.description: Gerencie os convites da sua organização
invitations.list.empty.title: Nenhum convite pendente
invitations.list.empty.description: Você ainda não foi convidado para nenhuma organização.
invitations.list.headers.organization: Organização
invitations.list.headers.status: Status
invitations.list.headers.created: Criado em
invitations.list.headers.actions: Ações
invitations.list.actions.accept: Aceitar
invitations.list.actions.reject: Rejeitar
invitations.list.actions.accept.success.message: Convite aceito
invitations.list.actions.accept.success.description: O convite foi aceito.
invitations.list.actions.reject.success.message: Convite rejeitado
invitations.list.actions.reject.success.description: O convite foi rejeitado.
# Documents
documents.list.title: Documentos
documents.list.no-documents.title: Nenhum documento
documents.list.no-documents.description: Ainda não há documentos nesta organização. Comece enviando documentos.
documents.list.no-results: Nenhum documento encontrado
documents.tabs.info: Informações
documents.tabs.content: Conteúdo
documents.tabs.activity: Atividades
documents.deleted.message: Este documento foi excluído e será deletado permanentemente em {{ days }} dias.
documents.actions.download: Baixar
documents.actions.open-in-new-tab: Abrir em nova aba
documents.actions.restore: Restaurar
documents.actions.delete: Excluir
documents.actions.edit: Editar
documents.actions.cancel: Cancelar
documents.actions.save: Salvar
documents.actions.saving: Salvando...
documents.content.alert: O conteúdo do documento é extraído automaticamente durante o envio e será utilizado apenas para fins de busca e indexação.
documents.info.id: ID
documents.info.name: Nome
documents.info.type: Tipo
documents.info.size: Tamanho
documents.info.created-at: Criado em
documents.info.updated-at: Atualizado em
documents.info.never: Nunca
documents.rename.title: Renomear documento
documents.rename.form.name.label: Nome
documents.rename.form.name.placeholder: 'Exemplo: Fatura 2024'
documents.rename.form.name.required: Por favor, insira um nome para o documento
documents.rename.form.name.max-length: O nome deve ter menos de 255 caracteres
documents.rename.form.submit: Renomear documento
documents.rename.success: Documento renomeado com sucesso
documents.rename.cancel: Cancelar
import-documents.title.error: '{{ count }} documentos falharam'
import-documents.title.success: '{{ count }} documentos importados'
import-documents.title.pending: '{{ count }} / {{ total }} documentos importados'
import-documents.title.none: Importar documentos
import-documents.no-import-in-progress: Nenhuma importação de documentos em andamento
documents.deleted.title: Documentos excluídos
documents.deleted.empty.title: Nenhum documento excluído
documents.deleted.empty.description: Você não tem documentos excluídos. Documentos excluídos serão movidos para a lixeira por {{ days }} dias.
documents.deleted.retention-notice: Todos os documentos excluídos são armazenados na lixeira por {{ days }} dias. Após esse período, os documentos serão excluídos permanentemente e não será possível restaurá-los.
documents.deleted.deleted-at: Excluído em
documents.deleted.restoring: Restaurando...
documents.deleted.deleting: Excluindo...
documents.preview.unknown-file-type: Pré-visualização não disponível para este tipo de arquivo
documents.preview.binary-file: Arquivos binários não podem ser exibidos como texto
trash.delete-all.button: Excluir tudo
trash.delete-all.confirm.title: Excluir todos os documentos permanentemente?
trash.delete-all.confirm.description: Tem certeza de que deseja excluir permanentemente todos os documentos da lixeira? Esta ação não poderá ser desfeita.
trash.delete-all.confirm.label: Excluir
trash.delete-all.confirm.cancel: Cancelar
trash.delete.button: Excluir
trash.delete.confirm.title: Excluir documento permanentemente?
trash.delete.confirm.description: Tem certeza de que deseja excluir permanentemente este documento da lixeira? Esta ação não poderá ser desfeita.
trash.delete.confirm.label: Excluir
trash.delete.confirm.cancel: Cancelar
trash.deleted.success.title: Documento excluído
trash.deleted.success.description: O documento foi excluído permanentemente.
activity.document.created: O documento foi criado
activity.document.updated.single: O {{ field }} foi atualizado
activity.document.updated.multiple: Os {{ fields }} foram atualizados
activity.document.updated: O documento foi atualizado
activity.document.deleted: O documento foi excluído
activity.document.restored: O documento foi restaurado
activity.document.tagged: A tag {{ tag }} foi adicionada
activity.document.untagged: A tag {{ tag }} foi removida
activity.document.user.name: por {{ name }}
activity.load-more: Carregar mais
activity.no-more-activities: Não há mais atividades para este documento
# Tags
tags.no-tags.title: Nenhuma tag
tags.no-tags.description: Esta organização ainda não possui tags. As tags são usadas para categorizar documentos. Você pode adicioná-las aos seus documentos para facilitar a busca e a organização.
tags.no-tags.create-tag: Criar tag
tags.title: Tags de documentos
tags.description: As tags são usadas para categorizar documentos. Você pode adicioná-las aos seus documentos para facilitar a busca e a organização.
tags.create: Criar tag
tags.update: Atualizar tag
tags.delete: Excluir tag
tags.delete.confirm.title: Excluir tag
tags.delete.confirm.message: Tem certeza de que deseja excluir esta tag? A exclusão de uma tag a removerá de todos os documentos.
tags.delete.confirm.confirm-button: Excluir
tags.delete.confirm.cancel-button: Cancelar
tags.delete.success: Tag excluída com sucesso
tags.create.success: Tag "{{ name }}" criada com sucesso.
tags.update.success: Tag "{{ name }}" atualizada com sucesso.
tags.form.name.label: Nome
tags.form.name.placeholder: 'Ex: Contratos'
tags.form.name.required: Por favor, insira um nome para a tag
tags.form.name.max-length: O nome da tag deve ter menos de 64 caracteres
tags.form.color.label: Cor
tags.form.color.required: Por favor, insira uma cor
tags.form.color.invalid: Código hexadecimal formatado incorretamente.
tags.form.description.label: Descrição
tags.form.description.optional: (opcional)
tags.form.description.placeholder: 'Ex: Todos os contratos assinados pela empresa'
tags.form.description.max-length: A descrição deve ter menos de 256 caracteres
tags.form.no-description: Sem descrição
tags.table.headers.tag: Tag
tags.table.headers.description: Descrição
tags.table.headers.documents: Documentos
tags.table.headers.created: Criado em
tags.table.headers.actions: Ações
# Tagging rules
tagging-rules.field.name: nome do documento
tagging-rules.field.content: conteúdo do documento
tagging-rules.operator.equals: é igual a
tagging-rules.operator.not-equals: é diferente de
tagging-rules.operator.contains: contém
tagging-rules.operator.not-contains: não contém
tagging-rules.operator.starts-with: começa com
tagging-rules.operator.ends-with: termina com
tagging-rules.list.title: Regras de marcação
tagging-rules.list.description: Gerencie as regras de marcação da sua organização para aplicar tags automaticamente a documentos com base em condições definidas por você.
tagging-rules.list.demo-warning: 'Nota: Como este é um ambiente de demonstração (sem servidor), as regras de marcação não serão aplicadas a novos documentos adicionados.'
tagging-rules.list.no-tagging-rules.title: Nenhuma regra de marcação
tagging-rules.list.no-tagging-rules.description: Crie uma regra de marcação para aplicar tags automaticamente aos documentos adicionados, com base em condições definidas por você.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Criar regra de marcação
tagging-rules.list.card.no-conditions: Nenhuma condição
tagging-rules.list.card.one-condition: 1 condição
tagging-rules.list.card.conditions: '{{ count }} condições'
tagging-rules.list.card.delete: Excluir regra
tagging-rules.list.card.edit: Editar regra
tagging-rules.create.title: Criar regra de marcação
tagging-rules.create.success: Regra de marcação criada com sucesso
tagging-rules.create.error: Falha ao criar a regra de marcação
tagging-rules.create.submit: Criar regra
tagging-rules.form.name.label: Nome
tagging-rules.form.name.placeholder: 'Exemplo: Marcar faturas'
tagging-rules.form.name.min-length: Por favor, insira um nome para a regra
tagging-rules.form.name.max-length: O nome deve ter menos de 64 caracteres
tagging-rules.form.description.label: Descrição
tagging-rules.form.description.placeholder: "Exemplo: Marcar documentos com 'fatura' no nome"
tagging-rules.form.description.max-length: A descrição deve ter menos de 256 caracteres
tagging-rules.form.conditions.label: Condições
tagging-rules.form.conditions.description: Defina as condições que devem ser atendidas para que a regra seja aplicada. Todas as condições devem ser atendidas.
tagging-rules.form.conditions.add-condition: Adicionar condição
tagging-rules.form.conditions.no-conditions.title: Nenhuma condição
tagging-rules.form.conditions.no-conditions.description: Você não adicionou nenhuma condição a esta regra. Ela será aplicada a todos os documentos.
tagging-rules.form.conditions.no-conditions.confirm: Aplicar regra sem condições
tagging-rules.form.conditions.no-conditions.cancel: Cancelar
tagging-rules.form.conditions.value.placeholder: 'Exemplo: fatura'
tagging-rules.form.conditions.value.min-length: Por favor, insira um valor para a condição
tagging-rules.form.tags.label: Tags
tagging-rules.form.tags.description: Selecione as tags que serão aplicadas aos documentos adicionados que correspondam às condições
tagging-rules.form.tags.min-length: Ao menos uma tag para aplicar é necessária
tagging-rules.form.tags.add-tag: Criar tag
tagging-rules.form.submit: Criar regra
tagging-rules.update.title: Atualizar regra de marcação
tagging-rules.update.error: Falha ao atualizar a regra de marcação
tagging-rules.update.submit: Atualizar regra
tagging-rules.update.cancel: Cancelar
# Intake emails
intake-emails.title: E-mails de entrada
intake-emails.description: Os endereços de e-mail de entrada são usados para importar automaticamente e-mails para o Papra. Basta encaminhar e-mails para o endereço de entrada e os anexos serão adicionados aos documentos da sua organização.
intake-emails.disabled.title: E-mails de entrada desativados
intake-emails.disabled.description: Os e-mails de entrada estão desativados nesta instância. Por favor, entre em contato com o administrador para ativá-los. Consulte a {{ documentation }} para mais informações.
intake-emails.disabled.documentation: documentação
intake-emails.info: Apenas e-mails de entrada habilitados e provenientes de origens permitidas serão processados. Você pode ativar ou desativar um e-mail de entrada a qualquer momento.
intake-emails.empty.title: Nenhum e-mail de entrada
intake-emails.empty.description: Gere um endereço de entrada para importar facilmente anexos de e-mails.
intake-emails.empty.generate: Gerar e-mail de entrada
intake-emails.count: '{{ count }} e-mail{{ plural }} de entrada para esta organização'
intake-emails.new: Novo e-mail de entrada
intake-emails.disabled-label: (Desativado)
intake-emails.no-origins: Nenhuma origem de e-mail permitida
intake-emails.allowed-origins: Permitido de {{ count }} endereço{{ plural }}
intake-emails.actions.enable: Ativar
intake-emails.actions.disable: Desativar
intake-emails.actions.manage-origins: Gerenciar endereços de origem
intake-emails.actions.delete: Excluir
intake-emails.delete.confirm.title: Excluir e-mail de entrada?
intake-emails.delete.confirm.message: Tem certeza de que deseja excluir este e-mail de entrada? Esta ação não poderá ser desfeita.
intake-emails.delete.confirm.confirm-button: Excluir e-mail de entrada
intake-emails.delete.confirm.cancel-button: Cancelar
intake-emails.delete.success: E-mail de entrada excluído
intake-emails.create.success: E-mail de entrada criado
intake-emails.update.success.enabled: E-mail de entrada ativado
intake-emails.update.success.disabled: E-mail de entrada desativado
intake-emails.allowed-origins.title: Origens permitidas
intake-emails.allowed-origins.description: Apenas e-mails enviados para {{ email }} a partir dessas origens serão processados. Se nenhuma origem for especificada, todos os e-mails serão descartados.
intake-emails.allowed-origins.add.label: Adicionar e-mail de origem permitida
intake-emails.allowed-origins.add.placeholder: 'Ex: ada@papra.app'
intake-emails.allowed-origins.add.button: Adicionar
intake-emails.allowed-origins.add.error.exists: Este e-mail já está nas origens permitidas para este e-mail de entrada
# API keys
api-keys.permissions.documents.title: Documentos
api-keys.permissions.documents.documents:create: Criar documentos
api-keys.permissions.documents.documents:read: Ler documentos
api-keys.permissions.documents.documents:update: Atualizar documentos
api-keys.permissions.documents.documents:delete: Excluir documentos
api-keys.permissions.tags.title: Tags
api-keys.permissions.tags.tags:create: Criar tags
api-keys.permissions.tags.tags:read: Ler tags
api-keys.permissions.tags.tags:update: Atualizar tags
api-keys.permissions.tags.tags:delete: Excluir tags
api-keys.create.title: Criar chave de API
api-keys.create.description: Crie uma nova chave de API para acessar a API do Papra.
api-keys.create.success: A chave de API foi criada com sucesso.
api-keys.create.back: Voltar para as chaves de API
api-keys.create.form.name.label: Nome
api-keys.create.form.name.placeholder: 'Exemplo: Minha chave de API'
api-keys.create.form.name.required: Por favor, insira um nome para a chave de API
api-keys.create.form.permissions.label: Permissões
api-keys.create.form.permissions.required: Por favor, selecione ao menos uma permissão
api-keys.create.form.submit: Criar chave de API
api-keys.create.created.title: Chave de API criada
api-keys.create.created.description: A chave de API foi criada com sucesso. Salve-a em um local seguro, pois ela não será exibida novamente.
api-keys.list.title: Chaves de API
api-keys.list.description: Gerencie suas chaves de API aqui.
api-keys.list.create: Criar chave de API
api-keys.list.empty.title: Nenhuma chave de API
api-keys.list.empty.description: Crie uma chave de API para acessar a API do Papra.
api-keys.list.card.last-used: Último uso
api-keys.list.card.never: Nunca
api-keys.list.card.created: Criada em
api-keys.delete.success: A chave de API foi excluída com sucesso
api-keys.delete.confirm.title: Excluir chave de API
api-keys.delete.confirm.message: Tem certeza de que deseja excluir esta chave de API? Esta ação não poderá ser desfeita.
api-keys.delete.confirm.confirm-button: Excluir
api-keys.delete.confirm.cancel-button: Cancelar
# Webhooks
webhooks.list.title: Webhooks
webhooks.list.description: Gerencie os webhooks da sua organização
webhooks.list.empty.title: Nenhum webhook
webhooks.list.empty.description: Crie seu primeiro webhook para começar a receber eventos
webhooks.list.create: Criar webhook
webhooks.list.card.last-triggered: Última ativação
webhooks.list.card.never: Nunca
webhooks.list.card.created: Criado em
webhooks.create.title: Criar webhook
webhooks.create.description: Crie um novo webhook para receber eventos
webhooks.create.success: Webhook criado com sucesso
webhooks.create.back: Voltar
webhooks.create.form.submit: Criar webhook
webhooks.create.form.name.label: Nome do webhook
webhooks.create.form.name.placeholder: Insira o nome do webhook
webhooks.create.form.name.required: O nome é obrigatório
webhooks.create.form.url.label: URL do Webhook
webhooks.create.form.url.placeholder: Insira a URL do webhook
webhooks.create.form.url.required: A URL é obrigatória
webhooks.create.form.url.invalid: URL inválida
webhooks.create.form.secret.label: Segredo
webhooks.create.form.secret.placeholder: Insira o segredo do webhook
webhooks.create.form.events.label: Eventos
webhooks.create.form.events.required: Adicione pelo menos um evento
webhooks.update.title: Editar webhook
webhooks.update.description: Atualize os detalhes do seu webhook
webhooks.update.success: Webhook atualizado com sucesso
webhooks.update.submit: Atualizar webhook
webhooks.update.cancel: Cancelar
webhooks.update.form.secret.placeholder: Insira um novo segredo
webhooks.update.form.secret.placeholder-redacted: '[Segredo ocultado]'
webhooks.update.form.rotate-secret.button: Rotacionar segredo
webhooks.delete.success: Webhook excluído com sucesso
webhooks.delete.confirm.title: Excluir webhook
webhooks.delete.confirm.message: Tem certeza de que deseja excluir este webhook?
webhooks.delete.confirm.confirm-button: Excluir
webhooks.delete.confirm.cancel-button: Cancelar
webhooks.events.documents.title: Eventos de documentos
webhooks.events.documents.document:created.description: Documento criado
webhooks.events.documents.document:deleted.description: Documento excluído
webhooks.events.documents.document:updated.description: Documento atualizado
webhooks.events.documents.document:tag:added.description: Uma tag foi adicionada a um documento
webhooks.events.documents.document:tag:removed.description: Uma tag foi removida de um documento
# Navigation
layout.menu.home: Início
layout.menu.documents: Documentos
layout.menu.tags: Tags
layout.menu.tagging-rules: Regras de marcação
layout.menu.deleted-documents: Documentos excluídos
layout.menu.organization-settings: Configurações
layout.menu.api-keys: Chaves de API
layout.menu.settings: Configurações
layout.menu.account: Conta
layout.menu.general-settings: Configurações gerais
layout.menu.intake-emails: E-mails de entrada
layout.menu.webhooks: Webhooks
layout.menu.members: Membros
layout.menu.invitations: Convites
layout.theme.light: Tema claro
layout.theme.dark: Tema escuro
layout.theme.system: Tema do sistema
layout.search.placeholder: Buscar...
layout.menu.import-document: Importar um documento
user-menu.account-settings: Configurações da conta
user-menu.api-keys: Chaves de API
user-menu.invitations: Convites
user-menu.language: Idioma
user-menu.logout: Sair
# Command palette
command-palette.search.placeholder: Buscar comandos ou documentos
command-palette.no-results: Nenhum resultado encontrado
command-palette.sections.documents: Documentos
command-palette.sections.theme: Tema
# API errors
api-errors.document.already_exists: O documento já existe
api-errors.document.file_too_big: O arquivo do documento é muito grande
api-errors.intake_email.limit_reached: O número máximo de e-mails de entrada para esta organização foi atingido. Faça um upgrade no seu plano para criar mais e-mails de entrada.
api-errors.user.max_organization_count_reached: Você atingiu o número máximo de organizações que pode criar. Se precisar criar mais, entre em contato com o suporte.
api-errors.default: Ocorreu um erro ao processar sua solicitação.
api-errors.organization.invitation_already_exists: Já existe um convite para este e-mail nesta organização.
api-errors.user.already_in_organization: Este usuário já faz parte desta organização.
api-errors.user.organization_invitation_limit_reached: O número máximo de convites por hoje foi atingido. Por favor, tente novamente amanhã.
api-errors.demo.not_available: Este recurso não está disponível em ambiente de demonstração
api-errors.tags.already_exists: Já existe uma tag com este nome nesta organização
api-errors.internal.error: Ocorreu um erro ao processar sua solicitação. Por favor, tente novamente.
api-errors.auth.invalid_origin: Origem da aplicação inválida. Se você está hospedando o Papra, certifique-se de que a variável de ambiente APP_BASE_URL corresponde à sua URL atual. Para mais detalhes, consulte https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Página não encontrada
not-found.description: Desculpe, a página que você está procurando não existe. Verifique o URL e tente novamente.
not-found.back-to-home: Voltar para a página inicial
# Demo
demo.popup.description: Este é um ambiente de demonstração; todos os dados são salvos no armazenamento local do seu navegador.
demo.popup.discord: Entre no {{ discordLink }} para obter suporte, sugerir funcionalidades ou apenas conversar.
demo.popup.discord-link-label: Comunidade do Discord
demo.popup.reset: Redefinir dados da demonstração
demo.popup.hide: Ocultar
# Color picker
color-picker.hue: Matiz
color-picker.saturation: Saturação
color-picker.lightness: Brilho
color-picker.select-color: Selecionar cor
color-picker.select-a-color: Selecione uma cor

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Redefinir a sua palavra-passe',
'auth.request-password-reset.description': 'Introduza o seu e-mail para redefinir a palavra-passe.',
'auth.request-password-reset.requested': 'Se existir uma conta para este e-mail, enviámos-lhe um e-mail para redefinir a palavra-passe.',
'auth.request-password-reset.back-to-login': 'Voltar ao início de sessão',
'auth.request-password-reset.form.email.label': 'E-mail',
'auth.request-password-reset.form.email.placeholder': 'Exemplo: joao@papra.app',
'auth.request-password-reset.form.email.required': 'Por favor, introduza o seu endereço de e-mail',
'auth.request-password-reset.form.email.invalid': 'Este endereço de e-mail é inválido',
'auth.request-password-reset.form.submit': 'Solicitar redefinição de palavra-passe',
'auth.reset-password.title': 'Redefinir a sua palavra-passe',
'auth.reset-password.description': 'Introduza a sua nova palavra-passe para redefinir a palavra-passe.',
'auth.reset-password.reset': 'A sua palavra-passe foi redefinida.',
'auth.reset-password.back-to-login': 'Voltar ao início de sessão',
'auth.reset-password.form.new-password.label': 'Nova palavra-passe',
'auth.reset-password.form.new-password.placeholder': 'Exemplo: **********',
'auth.reset-password.form.new-password.required': 'Por favor, introduza a sua nova palavra-passe',
'auth.reset-password.form.new-password.min-length': 'A palavra-passe deve ter pelo menos {{ minLength }} caracteres',
'auth.reset-password.form.new-password.max-length': 'A palavra-passe deve ter menos de {{ maxLength }} caracteres',
'auth.reset-password.form.submit': 'Redefinir palavra-passe',
'auth.email-provider.open': 'Abrir {{ provider }}',
'auth.login.title': 'Iniciar sessão no Papra',
'auth.login.description': 'Introduza o seu e-mail ou use o início de sessão social para aceder à sua conta Papra.',
'auth.login.login-with-provider': 'Iniciar sessão com {{ provider }}',
'auth.login.no-account': 'Não tem uma conta?',
'auth.login.register': 'Registar',
'auth.login.form.email.label': 'E-mail',
'auth.login.form.email.placeholder': 'Exemplo: joao@papra.app',
'auth.login.form.email.required': 'Por favor, introduza o seu endereço de e-mail',
'auth.login.form.email.invalid': 'Este endereço de e-mail é inválido',
'auth.login.form.password.label': 'Palavra-passe',
'auth.login.form.password.placeholder': 'Definir uma palavra-passe',
'auth.login.form.password.required': 'Por favor, introduza a sua palavra-passe',
'auth.login.form.remember-me.label': 'Lembrar-me',
'auth.login.form.forgot-password.label': 'Esqueceu-se da palavra-passe?',
'auth.login.form.submit': 'Iniciar sessão',
'auth.register.title': 'Registar no Papra',
'auth.register.description': 'Crie uma conta para começar a usar o Papra.',
'auth.register.register-with-email': 'Registar com e-mail',
'auth.register.register-with-provider': 'Registar com {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Já tem uma conta?',
'auth.register.login': 'Iniciar sessão',
'auth.register.registration-disabled.title': 'O registo está desativado',
'auth.register.registration-disabled.description': 'A criação de novas contas está atualmente desativada nesta instância do Papra. Apenas utilizadores com contas existentes podem iniciar sessão. Se acha que isto é um erro, contacte o administrador desta instância.',
'auth.register.form.email.label': 'E-mail',
'auth.register.form.email.placeholder': 'Exemplo: joao@papra.app',
'auth.register.form.email.required': 'Por favor, introduza o seu endereço de e-mail',
'auth.register.form.email.invalid': 'Este endereço de e-mail é inválido',
'auth.register.form.password.label': 'Palavra-passe',
'auth.register.form.password.placeholder': 'Definir uma palavra-passe',
'auth.register.form.password.required': 'Por favor, introduza a sua palavra-passe',
'auth.register.form.password.min-length': 'A palavra-passe deve ter pelo menos {{ minLength }} caracteres',
'auth.register.form.password.max-length': 'A palavra-passe deve ter menos de {{ maxLength }} caracteres',
'auth.register.form.name.label': 'Nome',
'auth.register.form.name.placeholder': 'Exemplo: Ada Lovelace',
'auth.register.form.name.required': 'Por favor, introduza o seu nome',
'auth.register.form.name.max-length': 'O nome deve ter menos de {{ maxLength }} caracteres',
'auth.register.form.submit': 'Registar',
'auth.email-validation-required.title': 'Verifique o seu e-mail',
'auth.email-validation-required.description': 'Foi enviado um e-mail de verificação para o seu endereço de e-mail. Por favor, verifique o seu endereço de e-mail clicando na ligação no e-mail.',
'auth.email-verification.success.title': 'E-mail verificado',
'auth.email-verification.success.description': 'O seu e-mail foi verificado com sucesso. Pode agora iniciar sessão na sua conta.',
'auth.email-verification.success.login': 'Ir para o login',
'auth.email-verification.error.title': 'Falha na verificação',
'auth.email-verification.error.description': 'A ligação de verificação é inválida ou expirou. Por favor, solicite um novo e-mail de verificação ao iniciar sessão.',
'auth.email-verification.error.back': 'Voltar ao login',
'auth.legal-links.description': 'Ao continuar, reconhece que compreende e concorda com os {{ terms }} e a {{ privacy }}.',
'auth.legal-links.terms': 'Termos de Serviço',
'auth.legal-links.privacy': 'Política de Privacidade',
'auth.no-auth-provider.title': 'Nenhum fornecedor de autenticação',
'auth.no-auth-provider.description': 'Não há fornecedores de autenticação ativados nesta instância do Papra. Por favor, contacte o administrador desta instância para ativar os mesmos.',
// User settings
'user.settings.title': 'Definições do utilizador',
'user.settings.description': 'Gira as definições da sua conta aqui.',
'user.settings.email.title': 'Endereço de e-mail',
'user.settings.email.description': 'O seu endereço de e-mail não pode ser alterado.',
'user.settings.email.label': 'Endereço de e-mail',
'user.settings.name.title': 'Nome completo',
'user.settings.name.description': 'O seu nome completo é exibido a outros membros da organização.',
'user.settings.name.label': 'Nome completo',
'user.settings.name.placeholder': 'Ex. João Silva',
'user.settings.name.update': 'Atualizar nome',
'user.settings.name.updated': 'O seu nome completo foi atualizado',
'user.settings.logout.title': 'Terminar sessão',
'user.settings.logout.description': 'Terminar sessão da sua conta. Pode iniciar sessão novamente mais tarde.',
'user.settings.logout.button': 'Terminar sessão',
// Organizations
'organizations.list.title': 'As suas organizações',
'organizations.list.description': 'As organizações são uma forma de agrupar os seus documentos e gerir o acesso aos mesmos. Pode criar várias organizações e convidar os membros da sua equipa para colaborar.',
'organizations.list.create-new': 'Criar nova organização',
'organizations.list.back': 'Voltar às organizações',
'organizations.list.deleted.title': 'Organizações eliminadas',
'organizations.list.deleted.description': 'As organizações eliminadas são mantidas durante {{ days }} dias antes de serem removidas permanentemente. Pode restaurá-las durante este período.',
'organizations.list.deleted.empty': 'Nenhuma organização eliminada',
'organizations.list.deleted.empty-description': 'Quando eliminar uma organização, ela aparecerá aqui durante {{ days }} dias antes de ser eliminada permanentemente.',
'organizations.list.deleted.restore': 'Restaurar',
'organizations.list.deleted.restore-success': 'Organização restaurada com sucesso',
'organizations.list.deleted.restore-confirm.title': 'Restaurar organização',
'organizations.list.deleted.restore-confirm.message': 'Tem a certeza de que quer restaurar esta organização? Ela será movida de volta para a sua lista de organizações ativas.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Restaurar organização',
'organizations.list.deleted.deleted-at': 'Eliminada em {{ date }}',
'organizations.list.deleted.purge-at': 'Será eliminada permanentemente em {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} dia, {daysUntilPurge} dias }} restante{{ daysUntilPurge, >1:s}})',
'organizations.details.no-documents.title': 'Sem documentos',
'organizations.details.no-documents.description': 'Não há documentos nesta organização ainda. Comece por carregar alguns documentos.',
'organizations.details.upload-documents': 'Carregar documentos',
'organizations.details.documents-count': 'documentos no total',
'organizations.details.total-size': 'tamanho total',
'organizations.details.latest-documents': 'Últimos documentos importados',
'organizations.create.title': 'Criar uma nova organização',
'organizations.create.description': 'Os seus documentos serão agrupados por organização. Pode criar várias organizações para separar os seus documentos, por exemplo, para documentos pessoais e de trabalho.',
'organizations.create.back': 'Voltar',
'organizations.create.error.max-count-reached': 'Atingiu o número máximo de organizações que pode criar, se precisar de criar mais, contacte o suporte.',
'organizations.create.form.name.label': 'Nome da organização',
'organizations.create.form.name.placeholder': 'Ex. Acme Inc.',
'organizations.create.form.name.required': 'Por favor, introduza um nome para a organização',
'organizations.create.form.submit': 'Criar organização',
'organizations.create.success': 'Organização criada com sucesso',
'organizations.create-first.title': 'Criar a sua organização',
'organizations.create-first.description': 'Os seus documentos serão agrupados por organização. Pode criar várias organizações para separar os seus documentos, por exemplo, para documentos pessoais e de trabalho.',
'organizations.create-first.default-name': 'A minha organização',
'organizations.create-first.user-name': 'Organização de {{ name }}',
'organization.settings.title': 'Definições da Organização',
'organization.settings.page.title': 'Definições da organização',
'organization.settings.page.description': 'Gira as definições da sua organização aqui.',
'organization.settings.name.title': 'Nome da organização',
'organization.settings.name.update': 'Atualizar nome',
'organization.settings.name.placeholder': 'Ex. Acme Inc.',
'organization.settings.name.updated': 'Nome da organização atualizado',
'organization.settings.subscription.title': 'Subscrição',
'organization.settings.subscription.description': 'Gira a sua faturação, faturas e métodos de pagamento.',
'organization.settings.subscription.manage': 'Gerir subscrição',
'organization.settings.subscription.error': 'Falha ao obter URL do portal do cliente',
'organization.settings.delete.title': 'Eliminar organização',
'organization.settings.delete.description': 'Eliminar esta organização removerá permanentemente todos os dados associados à mesma.',
'organization.settings.delete.confirm.title': 'Eliminar organização',
'organization.settings.delete.confirm.message': 'Tem a certeza de que pretende eliminar esta organização? A organização será marcada para eliminação e permanentemente removida após {{ days }} dias. Durante este período, pode restaurá-la a partir da sua lista de organizações. Todos os documentos e dados serão permanentemente eliminados após este prazo.',
'organization.settings.delete.confirm.confirm-button': 'Eliminar organização',
'organization.settings.delete.confirm.cancel-button': 'Cancelar',
'organization.settings.delete.success': 'Organização eliminada',
'organization.settings.delete.only-owner': 'Apenas o proprietário da organização pode eliminar esta organização.',
'organization.settings.delete.has-active-subscription': 'Não é possível eliminar a organização com uma subscrição ativa, por favor cancele a sua subscrição acima primeiro.',
'organization.usage.page.title': 'Uso',
'organization.usage.page.description': 'Visualize o uso atual e os limites da sua organização.',
'organization.usage.storage.title': 'Armazenamento de documentos',
'organization.usage.storage.description': 'Armazenamento total usado pelos seus documentos',
'organization.usage.intake-emails.title': 'E-mails de entrada',
'organization.usage.intake-emails.description': 'Número de endereços de e-mail de entrada',
'organization.usage.members.title': 'Membros',
'organization.usage.members.description': 'Número de membros na organização',
'organization.usage.unlimited': 'Ilimitado',
'organizations.members.title': 'Membros',
'organizations.members.description': 'Gira os membros da sua organização',
'organizations.members.invite-member': 'Convidar membro',
'organizations.members.invite-member-disabled-tooltip': 'Apenas administradores ou proprietários podem convidar membros para a organização',
'organizations.members.remove-from-organization': 'Remover da organização',
'organizations.members.role': 'Função',
'organizations.members.roles.owner': 'Proprietário',
'organizations.members.roles.admin': 'Administrador',
'organizations.members.roles.member': 'Membro',
'organizations.members.delete.confirm.title': 'Remover membro',
'organizations.members.delete.confirm.message': 'Tem a certeza de que quer remover este membro da organização?',
'organizations.members.delete.confirm.confirm-button': 'Remover',
'organizations.members.delete.confirm.cancel-button': 'Cancelar',
'organizations.members.delete.success': 'Membro removido da organização',
'organizations.members.update-role.success': 'Função do membro atualizada',
'organizations.members.table.headers.name': 'Nome',
'organizations.members.table.headers.email': 'E-mail',
'organizations.members.table.headers.role': 'Função',
'organizations.members.table.headers.created': 'Criado',
'organizations.members.table.headers.actions': 'Ações',
'organizations.invite-member.title': 'Convidar membro',
'organizations.invite-member.description': 'Convide um membro para a sua organização',
'organizations.invite-member.form.email.label': 'E-mail',
'organizations.invite-member.form.email.placeholder': 'Exemplo: joao@papra.app',
'organizations.invite-member.form.email.required': 'Por favor, introduza um endereço de e-mail válido',
'organizations.invite-member.form.role.label': 'Função',
'organizations.invite-member.form.submit': 'Convidar para a organização',
'organizations.invite-member.success.message': 'Membro convidado',
'organizations.invite-member.success.description': 'O e-mail foi convidado para a organização.',
'organizations.invite-member.error.message': 'Falha ao convidar membro',
'organizations.invitations.title': 'Convites',
'organizations.invitations.description': 'Gira os convites da sua organização',
'organizations.invitations.list.cta': 'Convidar membro',
'organizations.invitations.list.empty.title': 'Sem convites pendentes',
'organizations.invitations.list.empty.description': 'Ainda não foi convidado para nenhuma organização.',
'organizations.invitations.status.pending': 'Pendente',
'organizations.invitations.status.accepted': 'Aceite',
'organizations.invitations.status.rejected': 'Rejeitado',
'organizations.invitations.status.expired': 'Expirado',
'organizations.invitations.status.cancelled': 'Cancelado',
'organizations.invitations.resend': 'Reenviar convite',
'organizations.invitations.cancel.title': 'Cancelar convite',
'organizations.invitations.cancel.description': 'Tem a certeza de que quer cancelar este convite?',
'organizations.invitations.cancel.confirm': 'Cancelar convite',
'organizations.invitations.cancel.cancel': 'Cancelar',
'organizations.invitations.resend.title': 'Reenviar convite',
'organizations.invitations.resend.description': 'Tem a certeza de que quer reenviar este convite? Isto enviará um novo e-mail ao destinatário.',
'organizations.invitations.resend.confirm': 'Reenviar convite',
'organizations.invitations.resend.cancel': 'Cancelar',
'invitations.list.title': 'Convites',
'invitations.list.description': 'Gira os convites da sua organização',
'invitations.list.empty.title': 'Sem convites pendentes',
'invitations.list.empty.description': 'Ainda não foi convidado para nenhuma organização.',
'invitations.list.headers.organization': 'Organização',
'invitations.list.headers.status': 'Estado',
'invitations.list.headers.created': 'Criado',
'invitations.list.headers.actions': 'Ações',
'invitations.list.actions.accept': 'Aceitar',
'invitations.list.actions.reject': 'Rejeitar',
'invitations.list.actions.accept.success.message': 'Convite aceite',
'invitations.list.actions.accept.success.description': 'O convite foi aceite.',
'invitations.list.actions.reject.success.message': 'Convite rejeitado',
'invitations.list.actions.reject.success.description': 'O convite foi rejeitado.',
// Documents
'documents.list.title': 'Documentos',
'documents.list.no-documents.title': 'Sem documentos',
'documents.list.no-documents.description': 'Não há documentos nesta organização ainda. Comece por carregar alguns documentos.',
'documents.list.no-results': 'Nenhum documento encontrado',
'documents.tabs.info': 'Informação',
'documents.tabs.content': 'Conteúdo',
'documents.tabs.activity': 'Atividade',
'documents.deleted.message': 'Este documento foi eliminado e será permanentemente removido em {{ days }} dias.',
'documents.actions.download': 'Descarregar',
'documents.actions.open-in-new-tab': 'Abrir em novo separador',
'documents.actions.restore': 'Restaurar',
'documents.actions.delete': 'Eliminar',
'documents.actions.edit': 'Editar',
'documents.actions.cancel': 'Cancelar',
'documents.actions.save': 'Guardar',
'documents.actions.saving': 'A guardar...',
'documents.content.alert': 'O conteúdo do documento é automaticamente extraído do documento no carregamento. É usado apenas para fins de pesquisa e indexação.',
'documents.content.empty-placeholder': 'Este documento não tem conteúdo extraído, pode inserir manualmente aqui.',
'documents.info.id': 'ID',
'documents.info.name': 'Nome',
'documents.info.type': 'Tipo',
'documents.info.size': 'Tamanho',
'documents.info.created-at': 'Criado em',
'documents.info.updated-at': 'Atualizado em',
'documents.info.never': 'Nunca',
'documents.rename.title': 'Renomear documento',
'documents.rename.form.name.label': 'Nome',
'documents.rename.form.name.placeholder': 'Exemplo: Fatura 2024',
'documents.rename.form.name.required': 'Por favor, introduza um nome para o documento',
'documents.rename.form.name.max-length': 'O nome deve ter menos de 255 caracteres',
'documents.rename.form.submit': 'Renomear documento',
'documents.rename.success': 'Documento renomeado com sucesso',
'documents.rename.cancel': 'Cancelar',
'import-documents.title.error': '{{ count }} documentos falharam',
'import-documents.title.success': '{{ count }} documentos importados',
'import-documents.title.pending': '{{ count }} / {{ total }} documentos importados',
'import-documents.title.none': 'Importar documentos',
'import-documents.no-import-in-progress': 'Nenhuma importação de documento em progresso',
'documents.deleted.title': 'Documentos eliminados',
'documents.deleted.empty.title': 'Sem documentos eliminados',
'documents.deleted.empty.description': 'Não tem documentos eliminados. Os documentos que são eliminados serão movidos para a reciclagem por {{ days }} dias.',
'documents.deleted.retention-notice': 'Todos os documentos eliminados são armazenados na reciclagem por {{ days }} dias. Passando este prazo, os documentos serão permanentemente eliminados e não poderá restaurá-los.',
'documents.deleted.deleted-at': 'Eliminado',
'documents.deleted.restoring': 'A restaurar...',
'documents.deleted.deleting': 'A eliminar...',
'documents.preview.unknown-file-type': 'Não há pré-visualização disponível para este tipo de ficheiro',
'documents.preview.binary-file': 'Este parece ser um ficheiro binário e não pode ser exibido como texto',
'trash.delete-all.button': 'Eliminar tudo',
'trash.delete-all.confirm.title': 'Eliminar permanentemente todos os documentos?',
'trash.delete-all.confirm.description': 'Tem a certeza de que quer eliminar permanentemente todos os documentos da reciclagem? Esta ação não pode ser desfeita.',
'trash.delete-all.confirm.label': 'Eliminar',
'trash.delete-all.confirm.cancel': 'Cancelar',
'trash.delete.button': 'Eliminar',
'trash.delete.confirm.title': 'Eliminar documento permanentemente?',
'trash.delete.confirm.description': 'Tem a certeza de que quer eliminar permanentemente este documento da reciclagem? Esta ação não pode ser desfeita.',
'trash.delete.confirm.label': 'Eliminar',
'trash.delete.confirm.cancel': 'Cancelar',
'trash.deleted.success.title': 'Documento eliminado',
'trash.deleted.success.description': 'O documento foi eliminado permanentemente.',
'activity.document.created': 'O documento foi criado',
'activity.document.updated.single': 'O {{ field }} foi atualizado',
'activity.document.updated.multiple': 'Os {{ fields }} foram atualizados',
'activity.document.updated': 'O documento foi atualizado',
'activity.document.deleted': 'O documento foi eliminado',
'activity.document.restored': 'O documento foi restaurado',
'activity.document.tagged': 'A etiqueta {{ tag }} foi adicionada',
'activity.document.untagged': 'A etiqueta {{ tag }} foi removida',
'activity.document.user.name': 'por {{ name }}',
'activity.load-more': 'Carregar mais',
'activity.no-more-activities': 'Não há mais atividades para este documento',
// Tags
'tags.no-tags.title': 'Ainda sem etiquetas',
'tags.no-tags.description': 'Esta organização ainda não tem etiquetas. As etiquetas são usadas para categorizar documentos. Pode adicionar etiquetas aos seus documentos para os tornar mais fáceis de encontrar e organizar.',
'tags.no-tags.create-tag': 'Criar etiqueta',
'tags.title': 'Etiquetas de Documentos',
'tags.description': 'As etiquetas são usadas para categorizar documentos. Pode adicionar etiquetas aos seus documentos para os tornar mais fáceis de encontrar e organizar.',
'tags.create': 'Criar etiqueta',
'tags.update': 'Atualizar etiqueta',
'tags.delete': 'Eliminar etiqueta',
'tags.delete.confirm.title': 'Eliminar etiqueta',
'tags.delete.confirm.message': 'Tem a certeza de que quer eliminar esta etiqueta? Eliminar uma etiqueta irá removê-la de todos os documentos.',
'tags.delete.confirm.confirm-button': 'Eliminar',
'tags.delete.confirm.cancel-button': 'Cancelar',
'tags.delete.success': 'Etiqueta eliminada com sucesso',
'tags.create.success': 'Etiqueta "{{ name }}" criada com sucesso.',
'tags.update.success': 'Etiqueta "{{ name }}" atualizada com sucesso.',
'tags.form.name.label': 'Nome',
'tags.form.name.placeholder': 'Ex. Contratos',
'tags.form.name.required': 'Por favor, introduza um nome para a etiqueta',
'tags.form.name.max-length': 'O nome da etiqueta deve ter menos de 64 caracteres',
'tags.form.color.label': 'Cor',
'tags.form.color.required': 'Por favor, introduza uma cor',
'tags.form.color.invalid': 'A cor hexadecimal está mal formatada.',
'tags.form.description.label': 'Descrição',
'tags.form.description.optional': '(opcional)',
'tags.form.description.placeholder': 'Ex. Todos os contratos assinados pela empresa',
'tags.form.description.max-length': 'A descrição deve ter menos de 256 caracteres',
'tags.form.no-description': 'Sem descrição',
'tags.table.headers.tag': 'Etiqueta',
'tags.table.headers.description': 'Descrição',
'tags.table.headers.documents': 'Documentos',
'tags.table.headers.created': 'Criado',
'tags.table.headers.actions': 'Ações',
// Tagging rules
'tagging-rules.field.name': 'o nome do documento',
'tagging-rules.field.content': 'o conteúdo do documento',
'tagging-rules.operator.equals': 'igual a',
'tagging-rules.operator.not-equals': 'não igual a',
'tagging-rules.operator.contains': 'contém',
'tagging-rules.operator.not-contains': 'não contém',
'tagging-rules.operator.starts-with': 'começa com',
'tagging-rules.operator.ends-with': 'termina com',
'tagging-rules.list.title': 'Regras de etiquetagem',
'tagging-rules.list.description': 'Gira as regras de etiquetagem da sua organização, para etiquetar automaticamente documentos com base em condições que define.',
'tagging-rules.list.demo-warning': 'Nota: Como este é um ambiente de demonstração (sem servidor), as regras de etiquetagem não serão aplicadas a documentos recém-adicionados.',
'tagging-rules.list.no-tagging-rules.title': 'Sem regras de etiquetagem',
'tagging-rules.list.no-tagging-rules.description': 'Crie uma regra de etiquetagem para etiquetar automaticamente os seus documentos adicionados com base em condições que define.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Criar regra de etiquetagem',
'tagging-rules.list.card.no-conditions': 'Sem condições',
'tagging-rules.list.card.one-condition': '1 condição',
'tagging-rules.list.card.conditions': '{{ count }} condições',
'tagging-rules.list.card.delete': 'Eliminar regra',
'tagging-rules.list.card.edit': 'Editar regra',
'tagging-rules.create.title': 'Criar regra de etiquetagem',
'tagging-rules.create.success': 'Regra de etiquetagem criada com sucesso',
'tagging-rules.create.error': 'Falha ao criar regra de etiquetagem',
'tagging-rules.create.submit': 'Criar regra',
'tagging-rules.form.name.label': 'Nome',
'tagging-rules.form.name.placeholder': 'Exemplo: Etiquetar faturas',
'tagging-rules.form.name.min-length': 'Por favor, introduza um nome para a regra',
'tagging-rules.form.name.max-length': 'O nome deve ter menos de 64 caracteres',
'tagging-rules.form.description.label': 'Descrição',
'tagging-rules.form.description.placeholder': 'Exemplo: Etiquetar documentos com \'fatura\' no nome',
'tagging-rules.form.description.max-length': 'A descrição deve ter menos de 256 caracteres',
'tagging-rules.form.conditions.label': 'Condições',
'tagging-rules.form.conditions.description': 'Defina as condições que devem ser cumpridas para a regra se aplicar. Sem condições significa que a regra será aplicada a todos os documentos',
'tagging-rules.form.conditions.add-condition': 'Adicionar condição',
'tagging-rules.form.conditions.connector.when': 'Quando',
'tagging-rules.form.conditions.connector.and': 'e que',
'tagging-rules.form.conditions.connector.or': 'ou que',
'tagging-rules.condition-match-mode.all': 'Todas as condições devem corresponder',
'tagging-rules.condition-match-mode.any': 'Qualquer condição deve corresponder',
'tagging-rules.form.conditions.no-conditions.title': 'Sem condições',
'tagging-rules.form.conditions.no-conditions.description': 'Não adicionou nenhuma condição a esta regra. Esta regra aplicará as suas etiquetas a todos os documentos.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Aplicar regra sem condições',
'tagging-rules.form.conditions.no-conditions.cancel': 'Cancelar',
'tagging-rules.form.conditions.value.placeholder': 'Exemplo: fatura',
'tagging-rules.form.conditions.value.min-length': 'Por favor, introduza um valor para a condição',
'tagging-rules.form.tags.label': 'Etiquetas',
'tagging-rules.form.tags.description': 'Selecione as etiquetas a aplicar aos documentos adicionados que correspondem às condições',
'tagging-rules.form.tags.min-length': 'É necessária pelo menos uma etiqueta para aplicar',
'tagging-rules.form.tags.add-tag': 'Criar etiqueta',
'tagging-rules.form.submit': 'Criar regra',
'tagging-rules.update.title': 'Atualizar regra de etiquetagem',
'tagging-rules.update.error': 'Falha ao atualizar regra de etiquetagem',
'tagging-rules.update.submit': 'Atualizar regra',
'tagging-rules.update.cancel': 'Cancelar',
'tagging-rules.apply.button': 'Aplicar a documentos existentes',
'tagging-rules.apply.confirm.title': 'Aplicar regra a documentos existentes?',
'tagging-rules.apply.confirm.description': 'Isto irá verificar todos os documentos existentes na sua organização e aplicar etiquetas onde as condições correspondam. O processamento será feito em segundo plano.',
'tagging-rules.apply.confirm.button': 'Aplicar regra',
'tagging-rules.apply.success': 'Aplicação da regra iniciada em segundo plano',
'tagging-rules.apply.error': 'Falha ao iniciar a aplicação da regra',
'tagging-rules.apply.processing': 'A iniciar...',
// Intake emails
'intake-emails.title': 'E-mails de Receção',
'intake-emails.description': 'Os endereços de e-mail de receção são usados para ingerir automaticamente e-mails no Papra. Basta reencaminhar e-mails para o endereço de e-mail de receção e os seus anexos serão adicionados aos documentos da sua organização.',
'intake-emails.disabled.title': 'Os E-mails de Receção estão desativados',
'intake-emails.disabled.description': 'Os e-mails de receção estão desativados nesta instância. Contacte o seu administrador para os ativar. Consulte a {{ documentation }} para mais informações.',
'intake-emails.disabled.documentation': 'documentação',
'intake-emails.info': 'Apenas e-mails de receção ativados de origens permitidas serão processados. Pode ativar ou desativar um e-mail de receção a qualquer momento.',
'intake-emails.empty.title': 'Sem e-mails de receção',
'intake-emails.empty.description': 'Gere um endereço de receção para ingerir facilmente anexos de e-mails.',
'intake-emails.empty.generate': 'Gerar e-mail de receção',
'intake-emails.count': '{{ count }} e-mail{{ plural }} de receção para esta organização',
'intake-emails.new': 'Novo e-mail de receção',
'intake-emails.disabled-label': '(Desativado)',
'intake-emails.no-origins': 'Sem origens de e-mail permitidas',
'intake-emails.allowed-origins': 'Permitido de {{ count }} endereço{{ plural }}',
'intake-emails.actions.enable': 'Ativar',
'intake-emails.actions.disable': 'Desativar',
'intake-emails.actions.manage-origins': 'Gerir endereços de origem',
'intake-emails.actions.delete': 'Eliminar',
'intake-emails.delete.confirm.title': 'Eliminar e-mail de receção?',
'intake-emails.delete.confirm.message': 'Tem a certeza de que quer eliminar este e-mail de receção? Esta ação não pode ser desfeita.',
'intake-emails.delete.confirm.confirm-button': 'Eliminar e-mail de receção',
'intake-emails.delete.confirm.cancel-button': 'Cancelar',
'intake-emails.delete.success': 'E-mail de receção eliminado',
'intake-emails.create.success': 'E-mail de receção criado',
'intake-emails.update.success.enabled': 'E-mail de receção ativado',
'intake-emails.update.success.disabled': 'E-mail de receção desativado',
'intake-emails.allowed-origins.title': 'Origens permitidas',
'intake-emails.allowed-origins.description': 'Apenas e-mails enviados para {{ email }} destas origens serão processados. Se nenhuma origem for especificada, todos os e-mails serão descartados.',
'intake-emails.allowed-origins.add.label': 'Adicionar e-mail de origem permitida',
'intake-emails.allowed-origins.add.placeholder': 'Ex. joao@papra.app',
'intake-emails.allowed-origins.add.button': 'Adicionar',
'intake-emails.allowed-origins.add.error.exists': 'Este e-mail já está nas origens permitidas para este e-mail de receção',
// API keys
'api-keys.permissions.select-all': 'Selecionar tudo',
'api-keys.permissions.deselect-all': 'Desselecionar tudo',
'api-keys.permissions.organizations.title': 'Organizações',
'api-keys.permissions.organizations.organizations:create': 'Criar organizações',
'api-keys.permissions.organizations.organizations:read': 'Ler organizações',
'api-keys.permissions.organizations.organizations:update': 'Atualizar organizações',
'api-keys.permissions.organizations.organizations:delete': 'Eliminar organizações',
'api-keys.permissions.documents.title': 'Documentos',
'api-keys.permissions.documents.documents:create': 'Criar documentos',
'api-keys.permissions.documents.documents:read': 'Ler documentos',
'api-keys.permissions.documents.documents:update': 'Atualizar documentos',
'api-keys.permissions.documents.documents:delete': 'Eliminar documentos',
'api-keys.permissions.tags.title': 'Etiquetas',
'api-keys.permissions.tags.tags:create': 'Criar etiquetas',
'api-keys.permissions.tags.tags:read': 'Ler etiquetas',
'api-keys.permissions.tags.tags:update': 'Atualizar etiquetas',
'api-keys.permissions.tags.tags:delete': 'Eliminar etiquetas',
'api-keys.create.title': 'Criar chave API',
'api-keys.create.description': 'Crie uma nova chave API para aceder à API do Papra.',
'api-keys.create.success': 'A chave API foi criada com sucesso.',
'api-keys.create.back': 'Voltar às chaves API',
'api-keys.create.form.name.label': 'Nome',
'api-keys.create.form.name.placeholder': 'Exemplo: A minha chave API',
'api-keys.create.form.name.required': 'Por favor, introduza um nome para a chave API',
'api-keys.create.form.permissions.label': 'Permissões',
'api-keys.create.form.permissions.required': 'Por favor, selecione pelo menos uma permissão',
'api-keys.create.form.submit': 'Criar chave API',
'api-keys.create.created.title': 'Chave API criada',
'api-keys.create.created.description': 'A chave API foi criada com sucesso. Guarde-a num local seguro pois não será exibida novamente.',
'api-keys.list.title': 'Chaves API',
'api-keys.list.description': 'Gira as suas chaves API aqui.',
'api-keys.list.create': 'Criar chave API',
'api-keys.list.empty.title': 'Sem chaves API',
'api-keys.list.empty.description': 'Crie uma chave API para aceder à API do Papra.',
'api-keys.list.card.last-used': 'Última utilização',
'api-keys.list.card.never': 'Nunca',
'api-keys.list.card.created': 'Criado',
'api-keys.delete.success': 'A chave API foi eliminada com sucesso',
'api-keys.delete.confirm.title': 'Eliminar chave API',
'api-keys.delete.confirm.message': 'Tem a certeza de que quer eliminar esta chave API? Esta ação não pode ser desfeita.',
'api-keys.delete.confirm.confirm-button': 'Eliminar',
'api-keys.delete.confirm.cancel-button': 'Cancelar',
// Webhooks
'webhooks.list.title': 'Webhooks',
'webhooks.list.description': 'Gira os webhooks da sua organização',
'webhooks.list.empty.title': 'Nenhum webhook',
'webhooks.list.empty.description': 'Crie o seu primeiro webhook para começar a receber eventos',
'webhooks.list.create': 'Criar webhook',
'webhooks.list.card.last-triggered': 'Última ativação',
'webhooks.list.card.never': 'Nunca',
'webhooks.list.card.created': 'Criado em',
'webhooks.create.title': 'Criar webhook',
'webhooks.create.description': 'Crie um novo webhook para receber eventos',
'webhooks.create.success': 'Webhook criado com sucesso',
'webhooks.create.back': 'Voltar',
'webhooks.create.form.submit': 'Criar webhook',
'webhooks.create.form.name.label': 'Nome do webhook',
'webhooks.create.form.name.placeholder': 'Insira o nome do webhook',
'webhooks.create.form.name.required': 'O nome é obrigatório',
'webhooks.create.form.url.label': 'URL do Webhook',
'webhooks.create.form.url.placeholder': 'Insira o URL do webhook',
'webhooks.create.form.url.required': 'O URL é obrigatória',
'webhooks.create.form.url.invalid': 'URL inválido',
'webhooks.create.form.secret.label': 'Segredo',
'webhooks.create.form.secret.placeholder': 'Insira o segredo do webhook',
'webhooks.create.form.events.label': 'Eventos',
'webhooks.create.form.events.required': 'Adicione pelo menos um evento',
'webhooks.update.title': 'Editar webhook',
'webhooks.update.description': 'Atualize os detalhes do seu webhook',
'webhooks.update.success': 'Webhook atualizado com sucesso',
'webhooks.update.submit': 'Atualizar webhook',
'webhooks.update.cancel': 'Cancelar',
'webhooks.update.form.secret.placeholder': 'Insira um novo segredo',
'webhooks.update.form.secret.placeholder-redacted': '[Segredo ocultado]',
'webhooks.update.form.rotate-secret.button': 'Rotacionar segredo',
'webhooks.delete.success': 'Webhook eliminado com sucesso',
'webhooks.delete.confirm.title': 'Eliminar webhook',
'webhooks.delete.confirm.message': 'Tem a certeza de que deseja eliminar este webhook?',
'webhooks.delete.confirm.confirm-button': 'Eliminar',
'webhooks.delete.confirm.cancel-button': 'Cancelar',
'webhooks.events.documents.title': 'Eventos de documentos',
'webhooks.events.documents.document:created.description': 'Documento criado',
'webhooks.events.documents.document:deleted.description': 'Documento eliminado',
'webhooks.events.documents.document:updated.description': 'Documento atualizado',
'webhooks.events.documents.document:tag:added.description': 'Uma etiqueta foi adicionada a um documento',
'webhooks.events.documents.document:tag:removed.description': 'Uma etiqueta foi removida de um documento',
// Navigation
'layout.menu.home': 'Início',
'layout.menu.documents': 'Documentos',
'layout.menu.tags': 'Tags',
'layout.menu.tagging-rules': 'Regras de etiquetagem',
'layout.menu.deleted-documents': 'Documentos eliminados',
'layout.menu.organization-settings': 'Definições',
'layout.menu.api-keys': 'Chaves API',
'layout.menu.settings': 'Definições',
'layout.menu.account': 'Conta',
'layout.menu.general-settings': 'Definições gerais',
'layout.menu.usage': 'Uso',
'layout.menu.intake-emails': 'E-mails de entrada',
'layout.menu.webhooks': 'Webhooks',
'layout.menu.members': 'Membros',
'layout.menu.invitations': 'Convites',
'layout.upgrade-cta.title': 'Precisa de mais espaço?',
'layout.upgrade-cta.description': 'Obtenha 10x mais armazenamento + colaboração em equipa',
'layout.upgrade-cta.button': 'Atualizar agora',
'layout.theme.light': 'Tema claro',
'layout.theme.dark': 'Tema escuro',
'layout.theme.system': 'Tema do sistema',
'layout.search.placeholder': 'Procurar...',
'layout.menu.import-document': 'Importar um documento',
'user-menu.account-settings': 'Definições da conta',
'user-menu.api-keys': 'Chaves API',
'user-menu.invitations': 'Convites',
'user-menu.language': 'Linguagem',
'user-menu.logout': 'Sair',
// Command palette
'command-palette.search.placeholder': 'Procurar comandos ou documentos',
'command-palette.no-results': 'Nenhum resultado encontrado',
'command-palette.sections.documents': 'Documentos',
'command-palette.sections.theme': 'Tema',
// API errors
'api-errors.document.already_exists': 'O documento já existe',
'api-errors.document.size_too_large': 'O arquivo é muito grande',
'api-errors.intake-emails.already_exists': 'Um e-mail de entrada com este endereço já existe.',
'api-errors.intake_email.limit_reached': 'O número máximo de e-mails de entrada para esta organização foi atingido. Faça um upgrade no seu plano para criar mais e-mails de entrada.',
'api-errors.user.max_organization_count_reached': 'Atingiu o número máximo de organizações que pode criar. Se precisar de criar mais, entre em contato com o suporte.',
'api-errors.default': 'Ocorreu um erro ao processar a solicitação.',
'api-errors.organization.invitation_already_exists': 'Já existe um convite para este e-mail nesta organização.',
'api-errors.user.already_in_organization': 'Este utilizadpr já faz parte desta organização.',
'api-errors.user.organization_invitation_limit_reached': 'O número máximo de convites por hoje foi atingido. Por favor, tente novamente amanhã.',
'api-errors.demo.not_available': 'Este recurso não está disponível em ambiente de demonstração',
'api-errors.tags.already_exists': 'Já existe uma etiqueta com este nome nesta organização',
'api-errors.internal.error': 'Ocorreu um erro ao processar a solicitação. Por favor, tente novamente.',
'api-errors.auth.invalid_origin': 'Origem da aplicação inválida. Se você está hospedando o Papra, certifique-se de que a variável de ambiente APP_BASE_URL corresponde à sua URL atual. Para mais detalhes, consulte https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'O número máximo de membros e convites pendentes para esta organização foi atingido. Atualize o seu plano para adicionar mais membros.',
'api-errors.organization.has_active_subscription': 'Não é possível eliminar a organização com uma subscrição ativa. Por favor, cancele a sua subscrição primeiro usando o botão Gerir Subscrição acima.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Utilizador não encontrado',
'api-errors.FAILED_TO_CREATE_USER': 'Falha ao criar utilizador',
'api-errors.FAILED_TO_CREATE_SESSION': 'Falha ao criar sessão',
'api-errors.FAILED_TO_UPDATE_USER': 'Falha ao atualizar utilizador',
'api-errors.FAILED_TO_GET_SESSION': 'Falha ao obter sessão',
'api-errors.INVALID_PASSWORD': 'Palavra-passe inválida',
'api-errors.INVALID_EMAIL': 'Email inválido',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'O email ou a palavra-passe está incorreta, ou a conta não existe.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Conta social já associada',
'api-errors.PROVIDER_NOT_FOUND': 'Fornecedor não encontrado',
'api-errors.INVALID_TOKEN': 'Token inválido',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Token de ID não suportado',
'api-errors.FAILED_TO_GET_USER_INFO': 'Falha ao obter informações do utilizador',
'api-errors.USER_EMAIL_NOT_FOUND': 'Email do utilizador não encontrado',
'api-errors.EMAIL_NOT_VERIFIED': 'Email não verificado',
'api-errors.PASSWORD_TOO_SHORT': 'Palavra-passe demasiado curta',
'api-errors.PASSWORD_TOO_LONG': 'Palavra-passe demasiado longa',
'api-errors.USER_ALREADY_EXISTS': 'Já existe um utilizador com este email',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'O email não pode ser atualizado',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Conta de credenciais não encontrada',
'api-errors.SESSION_EXPIRED': 'Sessão expirada',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Falha ao desassociar a última conta',
'api-errors.ACCOUNT_NOT_FOUND': 'Conta não encontrada',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'O utilizador já tem uma palavra-passe',
// Not found
'not-found.title': '404 - Página não encontrada',
'not-found.description': 'Desculpe, a página que procura não existe. Verifique o URL e tente novamente.',
'not-found.back-to-home': 'Voltar para a página inicial',
// Demo
'demo.popup.description': 'Este é um ambiente de demonstração; todos os dados são guardadis no armazenamento local do navegador.',
'demo.popup.discord': 'Entre no {{ discordLink }} para obter suporte, sugerir funcionalidades ou apenas conversar.',
'demo.popup.discord-link-label': 'Comunidade do Discord',
'demo.popup.reset': 'Redefinir dados da demonstração',
'demo.popup.hide': 'Ocultar',
// Color picker
'color-picker.hue': 'Matiz',
'color-picker.saturation': 'Saturação',
'color-picker.lightness': 'Brilho',
'color-picker.select-color': 'Selecionar cor',
'color-picker.select-a-color': 'Selecione uma cor',
// Subscriptions
'subscriptions.checkout-success.title': 'Pagamento bem-sucedido!',
'subscriptions.checkout-success.description': 'A sua subscrição foi ativada com sucesso.',
'subscriptions.checkout-success.thank-you': 'Obrigado por fazer upgrade para o Papra Plus. Agora tem acesso a todos os recursos premium.',
'subscriptions.checkout-success.go-to-organizations': 'Ir para Organizações',
'subscriptions.checkout-success.redirecting': 'A redirecionar em {{ count }} segundo{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Pagamento cancelado',
'subscriptions.checkout-cancel.description': 'O seu upgrade de subscrição foi cancelado.',
'subscriptions.checkout-cancel.no-charges': 'Nenhuma cobrança foi feita na sua conta. Pode tentar novamente quando estiver pronto.',
'subscriptions.checkout-cancel.back-to-organizations': 'Voltar para Organizações',
'subscriptions.checkout-cancel.need-help': 'Precisa de ajuda?',
'subscriptions.checkout-cancel.contact-support': 'Contactar suporte',
'subscriptions.upgrade-dialog.title': 'Atualizar esta organização',
'subscriptions.upgrade-dialog.description': 'Desbloqueie recursos poderosos para a sua organização',
'subscriptions.upgrade-dialog.contact-us': 'Contacte-nos',
'subscriptions.upgrade-dialog.enterprise-plans': 'se precisar de planos empresariais personalizados.',
'subscriptions.upgrade-dialog.current-plan': 'Plano atual',
'subscriptions.upgrade-dialog.recommended': 'Recomendado',
'subscriptions.upgrade-dialog.per-month': '/mês',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} faturado anualmente',
'subscriptions.upgrade-dialog.upgrade-now': 'Atualizar agora',
'subscriptions.upgrade-dialog.promo-banner.title': 'Oferta por tempo limitado',
'subscriptions.upgrade-dialog.promo-banner.description': 'Obtenha {{ percent }}% de desconto por organização em todos os planos para sempre como early adopter! A oferta expira em {{ days, >1:{days} dias, =1:1 dia, menos de um dia }}.',
'subscriptions.plan.free.name': 'Plano gratuito',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Tamanho de armazenamento de documentos',
'subscriptions.features.members': 'Membros da organização',
'subscriptions.features.members-count': '{{ count }} membros',
'subscriptions.features.email-intakes': 'E-mails de entrada',
'subscriptions.features.email-intakes-count-singular': '{{ count }} endereço',
'subscriptions.features.email-intakes-count-plural': '{{ count }} endereços',
'subscriptions.features.max-upload-size': 'Tamanho máximo de upload',
'subscriptions.features.support': 'Suporte',
'subscriptions.features.support-community': 'Suporte da comunidade',
'subscriptions.features.support-email': 'Suporte por e-mail',
'subscriptions.features.support-priority': 'Suporte prioritário',
'subscriptions.billing-interval.monthly': 'Mensal',
'subscriptions.billing-interval.annual': 'Anual',
'subscriptions.usage-warning.message': 'Usou {{ percent }}% do seu armazenamento de documentos. Considere atualizar o seu plano para obter mais espaço.',
'subscriptions.usage-warning.upgrade-button': 'Atualizar plano',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Digite "{{ text }}" para confirmar',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Redefinir a sua palavra-passe
auth.request-password-reset.description: Introduza o seu e-mail para redefinir a palavra-passe.
auth.request-password-reset.requested: Se existir uma conta para este e-mail, enviámos-lhe um e-mail para redefinir a palavra-passe.
auth.request-password-reset.back-to-login: Voltar ao início de sessão
auth.request-password-reset.form.email.label: E-mail
auth.request-password-reset.form.email.placeholder: 'Exemplo: joao@papra.app'
auth.request-password-reset.form.email.required: Por favor, introduza o seu endereço de e-mail
auth.request-password-reset.form.email.invalid: Este endereço de e-mail é inválido
auth.request-password-reset.form.submit: Solicitar redefinição de palavra-passe
auth.reset-password.title: Redefinir a sua palavra-passe
auth.reset-password.description: Introduza a sua nova palavra-passe para redefinir a palavra-passe.
auth.reset-password.reset: A sua palavra-passe foi redefinida.
auth.reset-password.back-to-login: Voltar ao início de sessão
auth.reset-password.form.new-password.label: Nova palavra-passe
auth.reset-password.form.new-password.placeholder: 'Exemplo: **********'
auth.reset-password.form.new-password.required: Por favor, introduza a sua nova palavra-passe
auth.reset-password.form.new-password.min-length: A palavra-passe deve ter pelo menos {{ minLength }} caracteres
auth.reset-password.form.new-password.max-length: A palavra-passe deve ter menos de {{ maxLength }} caracteres
auth.reset-password.form.submit: Redefinir palavra-passe
auth.email-provider.open: Abrir {{ provider }}
auth.login.title: Iniciar sessão no Papra
auth.login.description: Introduza o seu e-mail ou use o início de sessão social para aceder à sua conta Papra.
auth.login.login-with-provider: Iniciar sessão com {{ provider }}
auth.login.no-account: Não tem uma conta?
auth.login.register: Registar
auth.login.form.email.label: E-mail
auth.login.form.email.placeholder: 'Exemplo: joao@papra.app'
auth.login.form.email.required: Por favor, introduza o seu endereço de e-mail
auth.login.form.email.invalid: Este endereço de e-mail é inválido
auth.login.form.password.label: Palavra-passe
auth.login.form.password.placeholder: Definir uma palavra-passe
auth.login.form.password.required: Por favor, introduza a sua palavra-passe
auth.login.form.remember-me.label: Lembrar-me
auth.login.form.forgot-password.label: Esqueceu-se da palavra-passe?
auth.login.form.submit: Iniciar sessão
auth.register.title: Registar no Papra
auth.register.description: Crie uma conta para começar a usar o Papra.
auth.register.register-with-email: Registar com e-mail
auth.register.register-with-provider: Registar com {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Já tem uma conta?
auth.register.login: Iniciar sessão
auth.register.registration-disabled.title: O registo está desativado
auth.register.registration-disabled.description: A criação de novas contas está atualmente desativada nesta instância do Papra. Apenas utilizadores com contas existentes podem iniciar sessão. Se acha que isto é um erro, contacte o administrador desta instância.
auth.register.form.email.label: E-mail
auth.register.form.email.placeholder: 'Exemplo: joao@papra.app'
auth.register.form.email.required: Por favor, introduza o seu endereço de e-mail
auth.register.form.email.invalid: Este endereço de e-mail é inválido
auth.register.form.password.label: Palavra-passe
auth.register.form.password.placeholder: Definir uma palavra-passe
auth.register.form.password.required: Por favor, introduza a sua palavra-passe
auth.register.form.password.min-length: A palavra-passe deve ter pelo menos {{ minLength }} caracteres
auth.register.form.password.max-length: A palavra-passe deve ter menos de {{ maxLength }} caracteres
auth.register.form.name.label: Nome
auth.register.form.name.placeholder: 'Exemplo: Ada Lovelace'
auth.register.form.name.required: Por favor, introduza o seu nome
auth.register.form.name.max-length: O nome deve ter menos de {{ maxLength }} caracteres
auth.register.form.submit: Registar
auth.email-validation-required.title: Verifique o seu e-mail
auth.email-validation-required.description: Foi enviado um e-mail de verificação para o seu endereço de e-mail. Por favor, verifique o seu endereço de e-mail clicando na ligação no e-mail.
auth.legal-links.description: Ao continuar, reconhece que compreende e concorda com os {{ terms }} e a {{ privacy }}.
auth.legal-links.terms: Termos de Serviço
auth.legal-links.privacy: Política de Privacidade
# auth.no-auth-provider.title: No authentication provider
# auth.no-auth-provider.description: There are no authentication providers enabled on this instance of Papra. Please contact the administrator of this instance to enable them.
# User settings
user.settings.title: Definições do utilizador
user.settings.description: Gira as definições da sua conta aqui.
user.settings.email.title: Endereço de e-mail
user.settings.email.description: O seu endereço de e-mail não pode ser alterado.
user.settings.email.label: Endereço de e-mail
user.settings.name.title: Nome completo
user.settings.name.description: O seu nome completo é exibido a outros membros da organização.
user.settings.name.label: Nome completo
user.settings.name.placeholder: Ex. João Silva
user.settings.name.update: Atualizar nome
user.settings.name.updated: O seu nome completo foi atualizado
user.settings.logout.title: Terminar sessão
user.settings.logout.description: Terminar sessão da sua conta. Pode iniciar sessão novamente mais tarde.
user.settings.logout.button: Terminar sessão
# Organizations
organizations.list.title: As suas organizações
organizations.list.description: As organizações são uma forma de agrupar os seus documentos e gerir o acesso aos mesmos. Pode criar várias organizações e convidar os membros da sua equipa para colaborar.
organizations.list.create-new: Criar nova organização
organizations.details.no-documents.title: Sem documentos
organizations.details.no-documents.description: Não há documentos nesta organização ainda. Comece por carregar alguns documentos.
organizations.details.upload-documents: Carregar documentos
organizations.details.documents-count: documentos no total
organizations.details.total-size: tamanho total
organizations.details.latest-documents: Últimos documentos importados
organizations.create.title: Criar uma nova organização
organizations.create.description: Os seus documentos serão agrupados por organização. Pode criar várias organizações para separar os seus documentos, por exemplo, para documentos pessoais e de trabalho.
organizations.create.back: Voltar
organizations.create.error.max-count-reached: Atingiu o número máximo de organizações que pode criar, se precisar de criar mais, contacte o suporte.
organizations.create.form.name.label: Nome da organização
organizations.create.form.name.placeholder: Ex. Acme Inc.
organizations.create.form.name.required: Por favor, introduza um nome para a organização
organizations.create.form.submit: Criar organização
organizations.create.success: Organização criada com sucesso
organizations.create-first.title: Criar a sua organização
organizations.create-first.description: Os seus documentos serão agrupados por organização. Pode criar várias organizações para separar os seus documentos, por exemplo, para documentos pessoais e de trabalho.
organizations.create-first.default-name: A minha organização
organizations.create-first.user-name: 'Organização de {{ name }}'
organization.settings.title: Definições da Organização
organization.settings.page.title: Definições da organização
organization.settings.page.description: Gira as definições da sua organização aqui.
organization.settings.name.title: Nome da organização
organization.settings.name.update: Atualizar nome
organization.settings.name.placeholder: Ex. Acme Inc.
organization.settings.name.updated: Nome da organização atualizado
organization.settings.subscription.title: Subscrição
organization.settings.subscription.description: Gira a sua faturação, faturas e métodos de pagamento.
organization.settings.subscription.manage: Gerir subscrição
organization.settings.subscription.error: Falha ao obter URL do portal do cliente
organization.settings.delete.title: Eliminar organização
organization.settings.delete.description: Eliminar esta organização removerá permanentemente todos os dados associados à mesma.
organization.settings.delete.confirm.title: Eliminar organização
organization.settings.delete.confirm.message: Tem a certeza de que quer eliminar esta organização? Esta ação não pode ser desfeita e todos os dados associados a esta organização serão permanentemente removidos.
organization.settings.delete.confirm.confirm-button: Eliminar organização
organization.settings.delete.confirm.cancel-button: Cancelar
organization.settings.delete.success: Organização eliminada
organizations.members.title: Membros
organizations.members.description: Gira os membros da sua organização
organizations.members.invite-member: Convidar membro
organizations.members.invite-member-disabled-tooltip: Apenas administradores ou proprietários podem convidar membros para a organização
organizations.members.remove-from-organization: Remover da organização
organizations.members.role: Função
organizations.members.roles.owner: Proprietário
organizations.members.roles.admin: Administrador
organizations.members.roles.member: Membro
organizations.members.delete.confirm.title: Remover membro
organizations.members.delete.confirm.message: Tem a certeza de que quer remover este membro da organização?
organizations.members.delete.confirm.confirm-button: Remover
organizations.members.delete.confirm.cancel-button: Cancelar
organizations.members.delete.success: Membro removido da organização
organizations.members.update-role.success: Função do membro atualizada
organizations.members.table.headers.name: Nome
organizations.members.table.headers.email: E-mail
organizations.members.table.headers.role: Função
organizations.members.table.headers.created: Criado
organizations.members.table.headers.actions: Ações
organizations.invite-member.title: Convidar membro
organizations.invite-member.description: Convide um membro para a sua organização
organizations.invite-member.form.email.label: E-mail
organizations.invite-member.form.email.placeholder: 'Exemplo: joao@papra.app'
organizations.invite-member.form.email.required: Por favor, introduza um endereço de e-mail válido
organizations.invite-member.form.role.label: Função
organizations.invite-member.form.submit: Convidar para a organização
organizations.invite-member.success.message: Membro convidado
organizations.invite-member.success.description: O e-mail foi convidado para a organização.
organizations.invite-member.error.message: Falha ao convidar membro
organizations.invitations.title: Convites
organizations.invitations.description: Gira os convites da sua organização
organizations.invitations.list.cta: Convidar membro
organizations.invitations.list.empty.title: Sem convites pendentes
organizations.invitations.list.empty.description: Ainda não foi convidado para nenhuma organização.
organizations.invitations.status.pending: Pendente
organizations.invitations.status.accepted: Aceite
organizations.invitations.status.rejected: Rejeitado
organizations.invitations.status.expired: Expirado
organizations.invitations.status.cancelled: Cancelado
organizations.invitations.resend: Reenviar convite
organizations.invitations.cancel.title: Cancelar convite
organizations.invitations.cancel.description: Tem a certeza de que quer cancelar este convite?
organizations.invitations.cancel.confirm: Cancelar convite
organizations.invitations.cancel.cancel: Cancelar
organizations.invitations.resend.title: Reenviar convite
organizations.invitations.resend.description: Tem a certeza de que quer reenviar este convite? Isto enviará um novo e-mail ao destinatário.
organizations.invitations.resend.confirm: Reenviar convite
organizations.invitations.resend.cancel: Cancelar
invitations.list.title: Convites
invitations.list.description: Gira os convites da sua organização
invitations.list.empty.title: Sem convites pendentes
invitations.list.empty.description: Ainda não foi convidado para nenhuma organização.
invitations.list.headers.organization: Organização
invitations.list.headers.status: Estado
invitations.list.headers.created: Criado
invitations.list.headers.actions: Ações
invitations.list.actions.accept: Aceitar
invitations.list.actions.reject: Rejeitar
invitations.list.actions.accept.success.message: Convite aceite
invitations.list.actions.accept.success.description: O convite foi aceite.
invitations.list.actions.reject.success.message: Convite rejeitado
invitations.list.actions.reject.success.description: O convite foi rejeitado.
# Documents
documents.list.title: Documentos
documents.list.no-documents.title: Sem documentos
documents.list.no-documents.description: Não há documentos nesta organização ainda. Comece por carregar alguns documentos.
documents.list.no-results: Nenhum documento encontrado
documents.tabs.info: Informação
documents.tabs.content: Conteúdo
documents.tabs.activity: Atividade
documents.deleted.message: Este documento foi eliminado e será permanentemente removido em {{ days }} dias.
documents.actions.download: Descarregar
documents.actions.open-in-new-tab: Abrir em novo separador
documents.actions.restore: Restaurar
documents.actions.delete: Eliminar
documents.actions.edit: Editar
documents.actions.cancel: Cancelar
documents.actions.save: Guardar
documents.actions.saving: A guardar...
documents.content.alert: O conteúdo do documento é automaticamente extraído do documento no carregamento. É usado apenas para fins de pesquisa e indexação.
documents.info.id: ID
documents.info.name: Nome
documents.info.type: Tipo
documents.info.size: Tamanho
documents.info.created-at: Criado em
documents.info.updated-at: Atualizado em
documents.info.never: Nunca
documents.rename.title: Renomear documento
documents.rename.form.name.label: Nome
documents.rename.form.name.placeholder: 'Exemplo: Fatura 2024'
documents.rename.form.name.required: Por favor, introduza um nome para o documento
documents.rename.form.name.max-length: O nome deve ter menos de 255 caracteres
documents.rename.form.submit: Renomear documento
documents.rename.success: Documento renomeado com sucesso
documents.rename.cancel: Cancelar
import-documents.title.error: '{{ count }} documentos falharam'
import-documents.title.success: '{{ count }} documentos importados'
import-documents.title.pending: '{{ count }} / {{ total }} documentos importados'
import-documents.title.none: Importar documentos
import-documents.no-import-in-progress: Nenhuma importação de documento em progresso
documents.deleted.title: Documentos eliminados
documents.deleted.empty.title: Sem documentos eliminados
documents.deleted.empty.description: Não tem documentos eliminados. Os documentos que são eliminados serão movidos para a reciclagem por {{ days }} dias.
documents.deleted.retention-notice: Todos os documentos eliminados são armazenados na reciclagem por {{ days }} dias. Passando este prazo, os documentos serão permanentemente eliminados e não poderá restaurá-los.
documents.deleted.deleted-at: Eliminado
documents.deleted.restoring: A restaurar...
documents.deleted.deleting: A eliminar...
documents.preview.unknown-file-type: Não há pré-visualização disponível para este tipo de ficheiro
documents.preview.binary-file: Este parece ser um ficheiro binário e não pode ser exibido como texto
trash.delete-all.button: Eliminar tudo
trash.delete-all.confirm.title: Eliminar permanentemente todos os documentos?
trash.delete-all.confirm.description: Tem a certeza de que quer eliminar permanentemente todos os documentos da reciclagem? Esta ação não pode ser desfeita.
trash.delete-all.confirm.label: Eliminar
trash.delete-all.confirm.cancel: Cancelar
trash.delete.button: Eliminar
trash.delete.confirm.title: Eliminar documento permanentemente?
trash.delete.confirm.description: Tem a certeza de que quer eliminar permanentemente este documento da reciclagem? Esta ação não pode ser desfeita.
trash.delete.confirm.label: Eliminar
trash.delete.confirm.cancel: Cancelar
trash.deleted.success.title: Documento eliminado
trash.deleted.success.description: O documento foi eliminado permanentemente.
activity.document.created: O documento foi criado
activity.document.updated.single: O {{ field }} foi atualizado
activity.document.updated.multiple: Os {{ fields }} foram atualizados
activity.document.updated: O documento foi atualizado
activity.document.deleted: O documento foi eliminado
activity.document.restored: O documento foi restaurado
activity.document.tagged: A etiqueta {{ tag }} foi adicionada
activity.document.untagged: A etiqueta {{ tag }} foi removida
activity.document.user.name: por {{ name }}
activity.load-more: Carregar mais
activity.no-more-activities: Não há mais atividades para este documento
# Tags
tags.no-tags.title: Ainda sem etiquetas
tags.no-tags.description: Esta organização ainda não tem etiquetas. As etiquetas são usadas para categorizar documentos. Pode adicionar etiquetas aos seus documentos para os tornar mais fáceis de encontrar e organizar.
tags.no-tags.create-tag: Criar etiqueta
tags.title: Etiquetas de Documentos
tags.description: As etiquetas são usadas para categorizar documentos. Pode adicionar etiquetas aos seus documentos para os tornar mais fáceis de encontrar e organizar.
tags.create: Criar etiqueta
tags.update: Atualizar etiqueta
tags.delete: Eliminar etiqueta
tags.delete.confirm.title: Eliminar etiqueta
tags.delete.confirm.message: Tem a certeza de que quer eliminar esta etiqueta? Eliminar uma etiqueta irá removê-la de todos os documentos.
tags.delete.confirm.confirm-button: Eliminar
tags.delete.confirm.cancel-button: Cancelar
tags.delete.success: Etiqueta eliminada com sucesso
tags.create.success: Etiqueta "{{ name }}" criada com sucesso.
tags.update.success: Etiqueta "{{ name }}" atualizada com sucesso.
tags.form.name.label: Nome
tags.form.name.placeholder: Ex. Contratos
tags.form.name.required: Por favor, introduza um nome para a etiqueta
tags.form.name.max-length: O nome da etiqueta deve ter menos de 64 caracteres
tags.form.color.label: Cor
tags.form.color.required: Por favor, introduza uma cor
tags.form.color.invalid: A cor hexadecimal está mal formatada.
tags.form.description.label: Descrição
tags.form.description.optional: (opcional)
tags.form.description.placeholder: Ex. Todos os contratos assinados pela empresa
tags.form.description.max-length: A descrição deve ter menos de 256 caracteres
tags.form.no-description: Sem descrição
tags.table.headers.tag: Etiqueta
tags.table.headers.description: Descrição
tags.table.headers.documents: Documentos
tags.table.headers.created: Criado
tags.table.headers.actions: Ações
# Tagging rules
tagging-rules.field.name: nome do documento
tagging-rules.field.content: conteúdo do documento
tagging-rules.operator.equals: igual a
tagging-rules.operator.not-equals: não igual a
tagging-rules.operator.contains: contém
tagging-rules.operator.not-contains: não contém
tagging-rules.operator.starts-with: começa com
tagging-rules.operator.ends-with: termina com
tagging-rules.list.title: Regras de etiquetagem
tagging-rules.list.description: Gira as regras de etiquetagem da sua organização, para etiquetar automaticamente documentos com base em condições que define.
tagging-rules.list.demo-warning: 'Nota: Como este é um ambiente de demonstração (sem servidor), as regras de etiquetagem não serão aplicadas a documentos recém-adicionados.'
tagging-rules.list.no-tagging-rules.title: Sem regras de etiquetagem
tagging-rules.list.no-tagging-rules.description: Crie uma regra de etiquetagem para etiquetar automaticamente os seus documentos adicionados com base em condições que define.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Criar regra de etiquetagem
tagging-rules.list.card.no-conditions: Sem condições
tagging-rules.list.card.one-condition: 1 condição
tagging-rules.list.card.conditions: '{{ count }} condições'
tagging-rules.list.card.delete: Eliminar regra
tagging-rules.list.card.edit: Editar regra
tagging-rules.create.title: Criar regra de etiquetagem
tagging-rules.create.success: Regra de etiquetagem criada com sucesso
tagging-rules.create.error: Falha ao criar regra de etiquetagem
tagging-rules.create.submit: Criar regra
tagging-rules.form.name.label: Nome
tagging-rules.form.name.placeholder: 'Exemplo: Etiquetar faturas'
tagging-rules.form.name.min-length: Por favor, introduza um nome para a regra
tagging-rules.form.name.max-length: O nome deve ter menos de 64 caracteres
tagging-rules.form.description.label: Descrição
tagging-rules.form.description.placeholder: "Exemplo: Etiquetar documentos com 'fatura' no nome"
tagging-rules.form.description.max-length: A descrição deve ter menos de 256 caracteres
tagging-rules.form.conditions.label: Condições
tagging-rules.form.conditions.description: Defina as condições que devem ser cumpridas para a regra se aplicar. Todas as condições devem ser cumpridas para a regra se aplicar.
tagging-rules.form.conditions.add-condition: Adicionar condição
tagging-rules.form.conditions.no-conditions.title: Sem condições
tagging-rules.form.conditions.no-conditions.description: Não adicionou nenhuma condição a esta regra. Esta regra aplicará as suas etiquetas a todos os documentos.
tagging-rules.form.conditions.no-conditions.confirm: Aplicar regra sem condições
tagging-rules.form.conditions.no-conditions.cancel: Cancelar
tagging-rules.form.conditions.value.placeholder: 'Exemplo: fatura'
tagging-rules.form.conditions.value.min-length: Por favor, introduza um valor para a condição
tagging-rules.form.tags.label: Etiquetas
tagging-rules.form.tags.description: Selecione as etiquetas a aplicar aos documentos adicionados que correspondem às condições
tagging-rules.form.tags.min-length: É necessária pelo menos uma etiqueta para aplicar
tagging-rules.form.tags.add-tag: Criar etiqueta
tagging-rules.form.submit: Criar regra
tagging-rules.update.title: Atualizar regra de etiquetagem
tagging-rules.update.error: Falha ao atualizar regra de etiquetagem
tagging-rules.update.submit: Atualizar regra
tagging-rules.update.cancel: Cancelar
# Intake emails
intake-emails.title: E-mails de Receção
intake-emails.description: Os endereços de e-mail de receção são usados para ingerir automaticamente e-mails no Papra. Basta reencaminhar e-mails para o endereço de e-mail de receção e os seus anexos serão adicionados aos documentos da sua organização.
intake-emails.disabled.title: Os E-mails de Receção estão desativados
intake-emails.disabled.description: Os e-mails de receção estão desativados nesta instância. Contacte o seu administrador para os ativar. Consulte a {{ documentation }} para mais informações.
intake-emails.disabled.documentation: documentação
intake-emails.info: Apenas e-mails de receção ativados de origens permitidas serão processados. Pode ativar ou desativar um e-mail de receção a qualquer momento.
intake-emails.empty.title: Sem e-mails de receção
intake-emails.empty.description: Gere um endereço de receção para ingerir facilmente anexos de e-mails.
intake-emails.empty.generate: Gerar e-mail de receção
intake-emails.count: '{{ count }} e-mail{{ plural }} de receção para esta organização'
intake-emails.new: Novo e-mail de receção
intake-emails.disabled-label: (Desativado)
intake-emails.no-origins: Sem origens de e-mail permitidas
intake-emails.allowed-origins: Permitido de {{ count }} endereço{{ plural }}
intake-emails.actions.enable: Ativar
intake-emails.actions.disable: Desativar
intake-emails.actions.manage-origins: Gerir endereços de origem
intake-emails.actions.delete: Eliminar
intake-emails.delete.confirm.title: Eliminar e-mail de receção?
intake-emails.delete.confirm.message: Tem a certeza de que quer eliminar este e-mail de receção? Esta ação não pode ser desfeita.
intake-emails.delete.confirm.confirm-button: Eliminar e-mail de receção
intake-emails.delete.confirm.cancel-button: Cancelar
intake-emails.delete.success: E-mail de receção eliminado
intake-emails.create.success: E-mail de receção criado
intake-emails.update.success.enabled: E-mail de receção ativado
intake-emails.update.success.disabled: E-mail de receção desativado
intake-emails.allowed-origins.title: Origens permitidas
intake-emails.allowed-origins.description: Apenas e-mails enviados para {{ email }} destas origens serão processados. Se nenhuma origem for especificada, todos os e-mails serão descartados.
intake-emails.allowed-origins.add.label: Adicionar e-mail de origem permitida
intake-emails.allowed-origins.add.placeholder: Ex. joao@papra.app
intake-emails.allowed-origins.add.button: Adicionar
intake-emails.allowed-origins.add.error.exists: Este e-mail já está nas origens permitidas para este e-mail de receção
# API keys
api-keys.permissions.documents.title: Documentos
api-keys.permissions.documents.documents:create: Criar documentos
api-keys.permissions.documents.documents:read: Ler documentos
api-keys.permissions.documents.documents:update: Atualizar documentos
api-keys.permissions.documents.documents:delete: Eliminar documentos
api-keys.permissions.tags.title: Etiquetas
api-keys.permissions.tags.tags:create: Criar etiquetas
api-keys.permissions.tags.tags:read: Ler etiquetas
api-keys.permissions.tags.tags:update: Atualizar etiquetas
api-keys.permissions.tags.tags:delete: Eliminar etiquetas
api-keys.create.title: Criar chave API
api-keys.create.description: Crie uma nova chave API para aceder à API do Papra.
api-keys.create.success: A chave API foi criada com sucesso.
api-keys.create.back: Voltar às chaves API
api-keys.create.form.name.label: Nome
api-keys.create.form.name.placeholder: 'Exemplo: A minha chave API'
api-keys.create.form.name.required: Por favor, introduza um nome para a chave API
api-keys.create.form.permissions.label: Permissões
api-keys.create.form.permissions.required: Por favor, selecione pelo menos uma permissão
api-keys.create.form.submit: Criar chave API
api-keys.create.created.title: Chave API criada
api-keys.create.created.description: A chave API foi criada com sucesso. Guarde-a num local seguro pois não será exibida novamente.
api-keys.list.title: Chaves API
api-keys.list.description: Gira as suas chaves API aqui.
api-keys.list.create: Criar chave API
api-keys.list.empty.title: Sem chaves API
api-keys.list.empty.description: Crie uma chave API para aceder à API do Papra.
api-keys.list.card.last-used: Última utilização
api-keys.list.card.never: Nunca
api-keys.list.card.created: Criado
api-keys.delete.success: A chave API foi eliminada com sucesso
api-keys.delete.confirm.title: Eliminar chave API
api-keys.delete.confirm.message: Tem a certeza de que quer eliminar esta chave API? Esta ação não pode ser desfeita.
api-keys.delete.confirm.confirm-button: Eliminar
api-keys.delete.confirm.cancel-button: Cancelar
# Webhooks
webhooks.list.title: Webhooks
webhooks.list.description: Gira os webhooks da sua organização
webhooks.list.empty.title: Nenhum webhook
webhooks.list.empty.description: Crie o seu primeiro webhook para começar a receber eventos
webhooks.list.create: Criar webhook
webhooks.list.card.last-triggered: Última ativação
webhooks.list.card.never: Nunca
webhooks.list.card.created: Criado em
webhooks.create.title: Criar webhook
webhooks.create.description: Crie um novo webhook para receber eventos
webhooks.create.success: Webhook criado com sucesso
webhooks.create.back: Voltar
webhooks.create.form.submit: Criar webhook
webhooks.create.form.name.label: Nome do webhook
webhooks.create.form.name.placeholder: Insira o nome do webhook
webhooks.create.form.name.required: O nome é obrigatório
webhooks.create.form.url.label: URL do Webhook
webhooks.create.form.url.placeholder: Insira o URL do webhook
webhooks.create.form.url.required: O URL é obrigatória
webhooks.create.form.url.invalid: URL inválido
webhooks.create.form.secret.label: Segredo
webhooks.create.form.secret.placeholder: Insira o segredo do webhook
webhooks.create.form.events.label: Eventos
webhooks.create.form.events.required: Adicione pelo menos um evento
webhooks.update.title: Editar webhook
webhooks.update.description: Atualize os detalhes do seu webhook
webhooks.update.success: Webhook atualizado com sucesso
webhooks.update.submit: Atualizar webhook
webhooks.update.cancel: Cancelar
webhooks.update.form.secret.placeholder: Insira um novo segredo
webhooks.update.form.secret.placeholder-redacted: '[Segredo ocultado]'
webhooks.update.form.rotate-secret.button: Rotacionar segredo
webhooks.delete.success: Webhook eliminado com sucesso
webhooks.delete.confirm.title: Eliminar webhook
webhooks.delete.confirm.message: Tem a certeza de que deseja eliminar este webhook?
webhooks.delete.confirm.confirm-button: Eliminar
webhooks.delete.confirm.cancel-button: Cancelar
webhooks.events.documents.title: Eventos de documentos
webhooks.events.documents.document:created.description: Documento criado
webhooks.events.documents.document:deleted.description: Documento eliminado
webhooks.events.documents.document:updated.description: Documento atualizado
webhooks.events.documents.document:tag:added.description: Uma etiqueta foi adicionada a um documento
webhooks.events.documents.document:tag:removed.description: Uma etiqueta foi removida de um documento
# Navigation
layout.menu.home: Início
layout.menu.documents: Documentos
layout.menu.tags: Tags
layout.menu.tagging-rules: Regras de etiquetagem
layout.menu.deleted-documents: Documentos eliminados
layout.menu.organization-settings: Definições
layout.menu.api-keys: Chaves API
layout.menu.settings: Definições
layout.menu.account: Conta
layout.menu.general-settings: Definições gerais
layout.menu.intake-emails: E-mails de entrada
layout.menu.webhooks: Webhooks
layout.menu.members: Membros
layout.menu.invitations: Convites
layout.theme.light: Tema claro
layout.theme.dark: Tema escuro
layout.theme.system: Tema do sistema
layout.search.placeholder: Procurar...
layout.menu.import-document: Importar um documento
user-menu.account-settings: Definições da conta
user-menu.api-keys: Chaves API
user-menu.invitations: Convites
user-menu.language: Linguagem
user-menu.logout: Sair
# Command palette
command-palette.search.placeholder: Procurar comandos ou documentos
command-palette.no-results: Nenhum resultado encontrado
command-palette.sections.documents: Documentos
command-palette.sections.theme: Tema
# API errors
api-errors.document.already_exists: O documento já existe
api-errors.document.file_too_big: O arquivo do documento é muito grande
api-errors.intake_email.limit_reached: O número máximo de e-mails de entrada para esta organização foi atingido. Faça um upgrade no seu plano para criar mais e-mails de entrada.
api-errors.user.max_organization_count_reached: Atingiu o número máximo de organizações que pode criar. Se precisar de criar mais, entre em contato com o suporte.
api-errors.default: Ocorreu um erro ao processar a solicitação.
api-errors.organization.invitation_already_exists: Já existe um convite para este e-mail nesta organização.
api-errors.user.already_in_organization: Este utilizadpr já faz parte desta organização.
api-errors.user.organization_invitation_limit_reached: O número máximo de convites por hoje foi atingido. Por favor, tente novamente amanhã.
api-errors.demo.not_available: Este recurso não está disponível em ambiente de demonstração
api-errors.tags.already_exists: Já existe uma etiqueta com este nome nesta organização
api-errors.internal.error: Ocorreu um erro ao processar a solicitação. Por favor, tente novamente.
api-errors.auth.invalid_origin: Origem da aplicação inválida. Se você está hospedando o Papra, certifique-se de que a variável de ambiente APP_BASE_URL corresponde à sua URL atual. Para mais detalhes, consulte https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Página não encontrada
not-found.description: Desculpe, a página que procura não existe. Verifique o URL e tente novamente.
not-found.back-to-home: Voltar para a página inicial
# Demo
demo.popup.description: Este é um ambiente de demonstração; todos os dados são guardadis no armazenamento local do navegador.
demo.popup.discord: Entre no {{ discordLink }} para obter suporte, sugerir funcionalidades ou apenas conversar.
demo.popup.discord-link-label: Comunidade do Discord
demo.popup.reset: Redefinir dados da demonstração
demo.popup.hide: Ocultar
# Color picker
color-picker.hue: Matiz
color-picker.saturation: Saturação
color-picker.lightness: Brilho
color-picker.select-color: Selecionar cor
color-picker.select-a-color: Selecione uma cor

View File

@@ -0,0 +1,713 @@
import type { TranslationsDictionary } from '@/modules/i18n/locales.types';
export const translations: Partial<TranslationsDictionary> = {
// Authentication
'auth.request-password-reset.title': 'Resetează parola',
'auth.request-password-reset.description': 'Introdu adresa de e-mail pentru a reseta parola.',
'auth.request-password-reset.requested': 'Dacă există un cont pentru acest e-mail, am trimis un e-mail pentru resetarea parolei.',
'auth.request-password-reset.back-to-login': 'Înapoi la autentificare',
'auth.request-password-reset.form.email.label': 'E-mail',
'auth.request-password-reset.form.email.placeholder': 'Exemplu: popescu@papra.app',
'auth.request-password-reset.form.email.required': 'Introdu adresa de e-mail',
'auth.request-password-reset.form.email.invalid': 'Adresa de e-mail este invalidă',
'auth.request-password-reset.form.submit': 'Trimite cererea de resetare a parolei',
'auth.reset-password.title': 'Resetează parola',
'auth.reset-password.description': 'Introdu o parolă noua pentră a o reseta pe cea veche.',
'auth.reset-password.reset': 'Parola a fost resetată cu success.',
'auth.reset-password.back-to-login': 'Înapoi la autentificare',
'auth.reset-password.form.new-password.label': 'Parolă nouă',
'auth.reset-password.form.new-password.placeholder': 'Exemplu: **********',
'auth.reset-password.form.new-password.required': 'Introdu parola nouă',
'auth.reset-password.form.new-password.min-length': 'Parola trebuie să fie de minim {{ minLength }} caractere',
'auth.reset-password.form.new-password.max-length': 'Parola trebuie să fie de maxim {{ maxLength }} de caractere',
'auth.reset-password.form.submit': 'Resetează parola',
'auth.email-provider.open': 'Deschide {{ provider }}',
'auth.login.title': 'Autentificare la Papra',
'auth.login.description': 'Introdu e-mailul sau folosește autentificarea cu cont social pentru a accesa contul Papra.',
'auth.login.login-with-provider': 'Autentificare cu {{ provider }}',
'auth.login.no-account': 'Nu ai cont?',
'auth.login.register': 'Înregistrare',
'auth.login.form.email.label': 'E-mail',
'auth.login.form.email.placeholder': 'Exemplu: popescu@papra.app',
'auth.login.form.email.required': 'Introdu adresa de e-mail',
'auth.login.form.email.invalid': 'Adresa e-mail este invalidă',
'auth.login.form.password.label': 'Parola',
'auth.login.form.password.placeholder': 'Setează o parola noua',
'auth.login.form.password.required': 'Introdu parola noua',
'auth.login.form.remember-me.label': 'Ține-mă minte',
'auth.login.form.forgot-password.label': 'Ai uitat parola?',
'auth.login.form.submit': 'Autentificare',
'auth.register.title': 'Înregistrare la Papra',
'auth.register.description': 'Introdu e-mailul pentru a accesa Papra.',
'auth.register.register-with-email': 'înregistrează-te cu e-mail',
'auth.register.register-with-provider': 'Inregistreaza-te cu {{ provider }}',
'auth.register.providers.google': 'Google',
'auth.register.providers.github': 'GitHub',
'auth.register.have-account': 'Ai deja un cont?',
'auth.register.login': 'Autentificare',
'auth.register.registration-disabled.title': 'Înregistrarea este dezactivată',
'auth.register.registration-disabled.description': 'Crearea de conturi noi este momentan dezactivată pe această instanță de Papra. Doar utilizatorii cu conturi existente se pot autentifica. Dacă aceasta pare a fi o greșeală, contactează administratorul acestei instanțe.',
'auth.register.form.email.label': 'E-mail',
'auth.register.form.email.placeholder': 'Exemplu: popescu@papra.app',
'auth.register.form.email.required': 'Introdu adresa de e-mail',
'auth.register.form.email.invalid': 'Adresa e-mail este invalida',
'auth.register.form.password.label': 'Parola',
'auth.register.form.password.placeholder': 'Setează parola',
'auth.register.form.password.required': 'Te rugăm să introduci parola',
'auth.register.form.password.min-length': 'Parola trebuie să fie de minim {{ minLength }} caractere',
'auth.register.form.password.max-length': 'Parola trebuie să fie de maxim {{ maxLength }} de caractere',
'auth.register.form.name.label': 'Nume',
'auth.register.form.name.placeholder': 'Exemplu: Andrei Popescu',
'auth.register.form.name.required': 'Introdu numele',
'auth.register.form.name.max-length': 'Numele trebuie să fie de minim {{ maxLength }} caractere',
'auth.register.form.submit': 'Înregistrare',
'auth.email-validation-required.title': 'Verifică-ți email-ul',
'auth.email-validation-required.description': 'A fost trimis un e-mail de verificare la adresa ta de e-mail. Te rugăm să îți verifici adresa de e-mail dând click pe linkul din e-mail.',
'auth.email-verification.success.title': 'Email verificat',
'auth.email-verification.success.description': 'Email-ul tău a fost verificat cu succes. Acum te poți autentifica în contul tău.',
'auth.email-verification.success.login': 'Mergi la autentificare',
'auth.email-verification.error.title': 'Verificare eșuată',
'auth.email-verification.error.description': 'Linkul de verificare este invalid sau a expirat. Te rugăm să soliciți un nou e-mail de verificare autentificându-te.',
'auth.email-verification.error.back': 'Înapoi la autentificare',
'auth.legal-links.description': 'Continuând, confirmați că întelegeți și sunteti de acord cu {{ terms }} și {{ privacy }}.',
'auth.legal-links.terms': 'Termenii și condițiile',
'auth.legal-links.privacy': 'Politica de confidențialitate',
'auth.no-auth-provider.title': 'Niciun furnizor de autentificare',
'auth.no-auth-provider.description': 'Nu este niciun furnizor de autentificare activat pe această instanță de Papra. Te rugăm să contactezi administratorul aceste instanțe pentru a le activa.',
// User settings
'user.settings.title': 'Setările utilizatorului',
'user.settings.description': 'Configurează setările contului aici.',
'user.settings.email.title': 'Adresa de e-mail',
'user.settings.email.description': 'Adresa de e-mail nu poate fi schimbată.',
'user.settings.email.label': 'Adresa de e-mail',
'user.settings.name.title': 'Numele complet',
'user.settings.name.description': 'Numele complet este afișat altor membri din organizație.',
'user.settings.name.label': 'Numele complet',
'user.settings.name.placeholder': 'Ex. Andrei Popescu',
'user.settings.name.update': 'Schimbă numele',
'user.settings.name.updated': 'Numele a fost schimbat',
'user.settings.logout.title': 'Deconectare',
'user.settings.logout.description': 'Vei fi deconectat din cont. Te poți conecta înapoi ulterior.',
'user.settings.logout.button': 'Deconectare',
// Organizations
'organizations.list.title': 'Organizațiile tale',
'organizations.list.description': 'Organizațiile sunt o modalitate de a grupa documentele și de a gestiona accesul la acestea. Poți crea multiple organizații și invita membrii echipei tale să colaboreze.',
'organizations.list.create-new': 'Creează o organizație nouă',
'organizations.list.back': 'Înapoi la organizații',
'organizations.list.deleted.title': 'Organizații șterse',
'organizations.list.deleted.description': 'Organizațiile șterse sunt păstrate {{ days }} zile înainte de a fi eliminate definitiv. Le poți restaura în această perioadă.',
'organizations.list.deleted.empty': 'Nu există organizații șterse',
'organizations.list.deleted.empty-description': 'Când ștergi o organizație, va apărea aici pentru {{ days }} zile înainte de a fi ștearsă definitiv.',
'organizations.list.deleted.restore': 'Restaurează',
'organizations.list.deleted.restore-success': 'Organizația a fost restaurată cu succes',
'organizations.list.deleted.restore-confirm.title': 'Restaurează organizația',
'organizations.list.deleted.restore-confirm.message': 'Ești sigur că vrei să restaurezi această organizație? Va fi mutată înapoi în lista organizațiilor active.',
'organizations.list.deleted.restore-confirm.confirm-button': 'Restaurează organizația',
'organizations.list.deleted.deleted-at': 'Ștearsă {{ date }}',
'organizations.list.deleted.purge-at': 'Va fi ștearsă definitiv {{ date }}',
'organizations.list.deleted.days-remaining': '({{ daysUntilPurge, =1:{daysUntilPurge} zi, {daysUntilPurge} zile }} rămas{{ daysUntilPurge, =1:ă, e}})',
'organizations.details.no-documents.title': 'Niciun document',
'organizations.details.no-documents.description': 'Încă nu există documente în această organizație. Încarcă niște documente pentru a începe.',
'organizations.details.upload-documents': 'Încarcă documente',
'organizations.details.documents-count': 'documente in total',
'organizations.details.total-size': 'mărime totala',
'organizations.details.latest-documents': 'Ultimele documente încarcate',
'organizations.create.title': 'Creează o organizație nouă',
'organizations.create.description': 'Documentele sunt grupate în funcție de organizație. Poți crea mai multe organizații pentru documente diferite, de exemplu, pentru uz personal și profesional.',
'organizations.create.back': 'Înapoi',
'organizations.create.error.max-count-reached': 'Ai ajuns la numărul maxim de organizații pe care le poți crea. Dacă ai nevoie de mai multe, contactează asistența.',
'organizations.create.form.name.label': 'Numle organizației',
'organizations.create.form.name.placeholder': 'Ex. Acme SRL.',
'organizations.create.form.name.required': 'Introdu numele organizației',
'organizations.create.form.submit': 'Creează organizația',
'organizations.create.success': 'Organizația a fost creată cu succes',
'organizations.create-first.title': 'Creează organizația',
'organizations.create-first.description': 'Documentele sunt grupate în funcție de organizație. Poți crea mai multe organizații pentru documente diferite, de exemplu, pentru uz personal și profesional.',
'organizations.create-first.default-name': 'Organizația mea',
'organizations.create-first.user-name': 'Organizația lui {{ name }}',
'organization.settings.title': 'Setările organizației',
'organization.settings.page.title': 'Setările organizației',
'organization.settings.page.description': 'Gestionează setarile organizației aici.',
'organization.settings.name.title': 'Numele organizației',
'organization.settings.name.update': 'Actualizează numele',
'organization.settings.name.placeholder': 'Ex. Acme SRL.',
'organization.settings.name.updated': 'Numele organizației a fost actualizat',
'organization.settings.subscription.title': 'Abonament',
'organization.settings.subscription.description': 'Gestionează facturile și metodele de plată.',
'organization.settings.subscription.manage': 'Gestionează-ți abonamentul',
'organization.settings.subscription.error': 'Eroare la obținerea URL-ului portalului de client',
'organization.settings.delete.title': 'Șterge organizația',
'organization.settings.delete.description': 'Ștergerea acestei organizații va elimina definitiv toate datele asociate cu aceasta.',
'organization.settings.delete.confirm.title': 'Șterge organizatia',
'organization.settings.delete.confirm.message': 'Sigur doriți să ștergeți această organizație? Organizația va fi marcată pentru ștergere și eliminată definitiv după {{ days }} zile. În această perioadă, o puteți restaura din lista dvs. de organizații. Toate documentele și datele vor fi șterse definitiv după această perioadă.',
'organization.settings.delete.confirm.confirm-button': 'Șterge organizație',
'organization.settings.delete.confirm.cancel-button': 'Anulează',
'organization.settings.delete.success': 'Organizație ștearsă cu succes',
'organization.settings.delete.only-owner': 'Doar proprietarul organizației poate șterge această organizație.',
'organization.settings.delete.has-active-subscription': 'Nu se poate șterge organizația cu un abonament activ, vă rugăm să anulați mai întâi abonamentul de mai sus.',
'organization.usage.page.title': 'Utilizare',
'organization.usage.page.description': 'Vizualizează utilizarea curentă și limitele organizației tale.',
'organization.usage.storage.title': 'Stocare documente',
'organization.usage.storage.description': 'Spațiul total folosit de documentele tale',
'organization.usage.intake-emails.title': 'E-mailuri de intrare',
'organization.usage.intake-emails.description': 'Număr de adrese de e-mail de intrare',
'organization.usage.members.title': 'Membri',
'organization.usage.members.description': 'Număr de membri în organizație',
'organization.usage.unlimited': 'Nelimitat',
'organizations.members.title': 'Membri',
'organizations.members.description': 'Gestionează membrii organizației tale',
'organizations.members.invite-member': 'Invită membru',
'organizations.members.invite-member-disabled-tooltip': 'Doar administratorii sau proprietarii pot invita membrii la organizație',
'organizations.members.remove-from-organization': 'Elimina din organizație',
'organizations.members.role': 'Rol',
'organizations.members.roles.owner': 'Proprietar',
'organizations.members.roles.admin': 'Admin',
'organizations.members.roles.member': 'Membru',
'organizations.members.delete.confirm.title': 'Elimină membrul',
'organizations.members.delete.confirm.message': 'Ești sigur că vrei să elimini acest membru din organizație?',
'organizations.members.delete.confirm.confirm-button': 'Elimină',
'organizations.members.delete.confirm.cancel-button': 'Anulează',
'organizations.members.delete.success': 'Membru eliminat cu succes',
'organizations.members.update-role.success': 'Rolul membrului a fost actualizat',
'organizations.members.table.headers.name': 'Nume',
'organizations.members.table.headers.email': 'E-mail',
'organizations.members.table.headers.role': 'Rol',
'organizations.members.table.headers.created': 'Creat',
'organizations.members.table.headers.actions': 'Acțiuni',
'organizations.invite-member.title': 'Invită membru',
'organizations.invite-member.description': 'Invită un membru la organizație',
'organizations.invite-member.form.email.label': 'E-mail',
'organizations.invite-member.form.email.placeholder': 'Exemplu: ada@papra.app',
'organizations.invite-member.form.email.required': 'Introdu o adresă de e-mail validă',
'organizations.invite-member.form.role.label': 'Rol',
'organizations.invite-member.form.submit': 'Invită membru',
'organizations.invite-member.success.message': 'Membru invitat',
'organizations.invite-member.success.description': 'Adresă de e-mail a fost invitată la organizație.',
'organizations.invite-member.error.message': 'Eroare la invitarea membrului',
'organizations.invitations.title': 'Invitații',
'organizations.invitations.description': 'Gestionează invitațiile la organizație',
'organizations.invitations.list.cta': 'Invită membru',
'organizations.invitations.list.empty.title': 'Nicio invitație în așteptare',
'organizations.invitations.list.empty.description': 'Încă nu ai fost invitat la nicio organizație.',
'organizations.invitations.status.pending': 'În așteptare',
'organizations.invitations.status.accepted': 'Acceptată',
'organizations.invitations.status.rejected': 'Respinsă',
'organizations.invitations.status.expired': 'Expirată',
'organizations.invitations.status.cancelled': 'Anulată',
'organizations.invitations.resend': 'Retrimite invitația',
'organizations.invitations.cancel.title': 'Anulează invitația',
'organizations.invitations.cancel.description': 'Ești sigur că vrei să anulezi această invitație?',
'organizations.invitations.cancel.confirm': 'Anulează invitația',
'organizations.invitations.cancel.cancel': 'Anulează',
'organizations.invitations.resend.title': 'Retrimite invitația',
'organizations.invitations.resend.description': 'Ești sigur că vrei să retrimiți această invitație? Se va trimite un nou e-mail destinatarului.',
'organizations.invitations.resend.confirm': 'Retrimite invitația',
'organizations.invitations.resend.cancel': 'Anulează',
'invitations.list.title': 'Invitații',
'invitations.list.description': 'Gestionează invitații la organizație',
'invitations.list.empty.title': 'Nicio invitație în așteptare',
'invitations.list.empty.description': 'Încă nu ai fost invitat la nicio organizație.',
'invitations.list.headers.organization': 'Organizație',
'invitations.list.headers.status': 'Status',
'invitations.list.headers.created': 'Creat la',
'invitations.list.headers.actions': 'Acțiuni',
'invitations.list.actions.accept': 'Acceptă',
'invitations.list.actions.reject': 'Refuză',
'invitations.list.actions.accept.success.message': 'Invitație acceptată',
'invitations.list.actions.accept.success.description': 'Invitația a fost acceptată.',
'invitations.list.actions.reject.success.message': 'Invitație refuzată',
'invitations.list.actions.reject.success.description': 'Invitația a fost refuzată.',
// Documents
'documents.list.title': 'Documente',
'documents.list.no-documents.title': 'Niciun document',
'documents.list.no-documents.description': 'Încă nu există documente în aceasta organizație. Începe prin a încarca câteva documente.',
'documents.list.no-results': 'Nu au fost găsite documente',
'documents.tabs.info': 'Info',
'documents.tabs.content': 'Conținut',
'documents.tabs.activity': 'Activitate',
'documents.deleted.message': 'Acest document a fost șters și va fi eliminat definitiv după {{ days }} zile.',
'documents.actions.download': 'Descarcă',
'documents.actions.open-in-new-tab': 'Deschide în filă nouă',
'documents.actions.restore': 'Restaurează',
'documents.actions.delete': 'Șterge',
'documents.actions.edit': 'Editează',
'documents.actions.cancel': 'Anulează',
'documents.actions.save': 'Salvează',
'documents.actions.saving': 'Se salvează...',
'documents.content.alert': 'Conținutul documentului este extras automat din document la încarcare. Este folosit doar pentru căutare și indexare.',
'documents.content.empty-placeholder': 'Acest document nu are conținut extra, poți introduce manual aici.',
'documents.info.id': 'ID',
'documents.info.name': 'Nume',
'documents.info.type': 'Tip',
'documents.info.size': 'Dimensiune',
'documents.info.created-at': 'Creat la',
'documents.info.updated-at': 'Actualizat la',
'documents.info.never': 'Niciodată',
'documents.rename.title': 'Redenumește documentul',
'documents.rename.form.name.label': 'Nume',
'documents.rename.form.name.placeholder': 'Exemplu: Factura 2024',
'documents.rename.form.name.required': 'Te rugăm să introduci un nume pentru document',
'documents.rename.form.name.max-length': 'Numele trebuie să aibă mai puțin de 255 de caractere',
'documents.rename.form.submit': 'Redenumește documentul',
'documents.rename.success': 'Document redenumit cu succes',
'documents.rename.cancel': 'Anulează',
'import-documents.title.error': '{{ count }} documente au eșuat',
'import-documents.title.success': '{{ count }} documente importate',
'import-documents.title.pending': '{{ count }} / {{ total }} documente importate',
'import-documents.title.none': 'Importă documente',
'import-documents.no-import-in-progress': 'Niciun import de documente în curs',
'documents.deleted.title': 'Documente șterse',
'documents.deleted.empty.title': 'Niciun document șters',
'documents.deleted.empty.description': 'Nu ai niciun document șters. Documentele care sunt șterse vor fi mutate în coșul de gunoi timp de {{ days }} zile.',
'documents.deleted.retention-notice': 'Toate documentele șterse sunt stocate în coșul de gunoi timp de {{ days }} zile. După acest interval, documentele vor fi șterse definitiv și nu le vei mai putea restaura.',
'documents.deleted.deleted-at': 'Șterse la',
'documents.deleted.restoring': 'Se restaurează...',
'documents.deleted.deleting': 'Se șterge...',
'documents.preview.unknown-file-type': 'Nicio previzualizare disponibilă pentru acest tip de fișier',
'documents.preview.binary-file': 'Acesta pare a fi un fișier binar și nu poate fi afișat ca text',
'trash.delete-all.button': 'Șterge tot',
'trash.delete-all.confirm.title': 'Ștergi definitiv toate documentele?',
'trash.delete-all.confirm.description': 'Ești sigur că dorești să ștergi definitiv toate documentele din coșul de gunoi? Această acțiune nu poate fi anulată.',
'trash.delete-all.confirm.label': 'Șterge',
'trash.delete-all.confirm.cancel': 'Anulează',
'trash.delete.button': 'Șterge',
'trash.delete.confirm.title': 'Ștergi definitiv documentul?',
'trash.delete.confirm.description': 'Sunteti sigur ca doriti să stergeti definitiv acest document din cosul de gunoi? Această actiune nu poate fi anulată.',
'trash.delete.confirm.label': 'Șterge',
'trash.delete.confirm.cancel': 'Anulează',
'trash.deleted.success.title': 'Document șters',
'trash.deleted.success.description': 'Documentul a fost șters definitiv.',
'activity.document.created': 'Documentul a fost creat',
'activity.document.updated.single': 'Câmpul {{ field }} a fost actualizat',
'activity.document.updated.multiple': 'Câmpurile {{ fields }} au fost actualizate',
'activity.document.updated': 'Documentul a fost actualizat',
'activity.document.deleted': 'Documentul a fost șters',
'activity.document.restored': 'Documentul a fost restaurat',
'activity.document.tagged': 'Eticheta {{ tag }} a fost adaugată',
'activity.document.untagged': 'Eticheta {{ tag }} a fost eliminată',
'activity.document.user.name': 'de {{ name }}',
'activity.load-more': 'Încarcă mai multe',
'activity.no-more-activities': 'Nu mai sunt activități pentru acest document',
// Tags
'tags.no-tags.title': 'Încă nu există etichete',
'tags.no-tags.description': 'Această organizație nu are încă etichete. Etichetele sunt folosite pentru a clasifica documentele. Poți adăuga etichete la documente pentru a le găsi și organiza mai ușor.',
'tags.no-tags.create-tag': 'Creează eticheta',
'tags.title': 'Etichete documente',
'tags.description': 'Etichetele sunt folosite pentru a clasifica documentele. Poți adăuga etichete la documente pentru a le găsi și organiza mai ușor.',
'tags.create': 'Creează eticheta',
'tags.update': 'Actualizează eticheta',
'tags.delete': 'Șterge eticheta',
'tags.delete.confirm.title': 'Șterge eticheta',
'tags.delete.confirm.message': 'Ești sigur că vrei să ștergi aceasta eticheta? Stergerea unei etichete o va elimina din toate documentele.',
'tags.delete.confirm.confirm-button': 'Șterge',
'tags.delete.confirm.cancel-button': 'Anulează',
'tags.delete.success': 'Eticheta a fost ștearsă cu succes',
'tags.create.success': 'Eticheta "{{ name }}" a fost creată cu succes.',
'tags.update.success': 'Eticheta "{{ name }}" a fost actualizată cu succes.',
'tags.form.name.label': 'Nume',
'tags.form.name.placeholder': 'Ex. Contracte',
'tags.form.name.required': 'Te rugăm să introduci un nume pentru etichetă',
'tags.form.name.max-length': 'Numele etichetei trebuie să aibă mai puțin de 64 de caractere',
'tags.form.color.label': 'Culoare',
'tags.form.color.required': 'Te rugăm să introduci o culoare',
'tags.form.color.invalid': 'Culoarea hex este formatată greșit.',
'tags.form.description.label': 'Descriere',
'tags.form.description.optional': '(optional)',
'tags.form.description.placeholder': 'Ex. Toate contractele semnate de companie',
'tags.form.description.max-length': 'Descrierea trebuie să aibă mai puțin de 256 de caractere',
'tags.form.no-description': 'Nicio descriere',
'tags.table.headers.tag': 'Etichetă',
'tags.table.headers.description': 'Descriere',
'tags.table.headers.documents': 'Documente',
'tags.table.headers.created': 'Creat la',
'tags.table.headers.actions': 'Acțiuni',
// Tagging rules
'tagging-rules.field.name': 'numele documentului',
'tagging-rules.field.content': 'conținutul documentului',
'tagging-rules.operator.equals': 'egal cu',
'tagging-rules.operator.not-equals': 'nu este egal cu',
'tagging-rules.operator.contains': 'conține',
'tagging-rules.operator.not-contains': 'nu conține',
'tagging-rules.operator.starts-with': 'începe cu',
'tagging-rules.operator.ends-with': 'se termină cu',
'tagging-rules.list.title': 'Reguli de etichetare',
'tagging-rules.list.description': 'Gestionează regulile de etichetare ale organizației pentru a eticheta automat documentele pe baza unor condiții definite.',
'tagging-rules.list.demo-warning': 'Notă: Deoarece acesta este un mediu demonstrativ (fără server), regulile de etichetare nu vor fi aplicate documentelor nou adăugate.',
'tagging-rules.list.no-tagging-rules.title': 'Nicio regulă de etichetare',
'tagging-rules.list.no-tagging-rules.description': 'Creează o regulă de etichetare pentru a eticheta automat documentele adăugate pe baza unor condiții definite.',
'tagging-rules.list.no-tagging-rules.create-tagging-rule': 'Creează regula de etichetare',
'tagging-rules.list.card.no-conditions': 'Nicio condiție',
'tagging-rules.list.card.one-condition': 'O condiție',
'tagging-rules.list.card.conditions': '{{ count }} condiții',
'tagging-rules.list.card.delete': 'Șterge regula',
'tagging-rules.list.card.edit': 'Editează regula',
'tagging-rules.create.title': 'Creează regula de etichetare',
'tagging-rules.create.success': 'Regula de etichetare a fost creată cu succes',
'tagging-rules.create.error': 'Nu s-a putut crea regula de etichetare',
'tagging-rules.create.submit': 'Creează regula',
'tagging-rules.form.name.label': 'Nume',
'tagging-rules.form.name.placeholder': 'Exemplu: Etichetează facturile',
'tagging-rules.form.name.min-length': 'Te rugăm să introduci numele regulii',
'tagging-rules.form.name.max-length': 'Numele trebuie să aibă mai puțin de 64 de caractere',
'tagging-rules.form.description.label': 'Descriere',
'tagging-rules.form.description.placeholder': 'Exemplu: Etichetează documentele cu \'factură\' în nume',
'tagging-rules.form.description.max-length': 'Descrierea trebuie să aibă mai puțin de 256 de caractere',
'tagging-rules.form.conditions.label': 'Condiții',
'tagging-rules.form.conditions.description': 'Definește condițiile care trebuie îndeplinite pentru ca regula să se aplice. Fără condiții înseamnă că regula se va aplica tuturor documentelor',
'tagging-rules.form.conditions.add-condition': 'Adaugă condiție',
'tagging-rules.form.conditions.connector.when': 'Când',
'tagging-rules.form.conditions.connector.and': 'și că',
'tagging-rules.form.conditions.connector.or': 'sau că',
'tagging-rules.condition-match-mode.all': 'Toate condițiile trebuie îndeplinite',
'tagging-rules.condition-match-mode.any': 'Orice condiție trebuie îndeplinită',
'tagging-rules.form.conditions.no-conditions.title': 'Nicio condiție',
'tagging-rules.form.conditions.no-conditions.description': 'Nu ai adăugat nicio condiție acestei reguli. Această regula va aplica etichetele sale tuturor documentelor.',
'tagging-rules.form.conditions.no-conditions.confirm': 'Aplică regula fara condiții',
'tagging-rules.form.conditions.no-conditions.cancel': 'Anulează',
'tagging-rules.form.conditions.value.placeholder': 'Exemplu: factură',
'tagging-rules.form.conditions.value.min-length': 'Te rugăm să introduci o valoare pentru condiție',
'tagging-rules.form.tags.label': 'Etichete',
'tagging-rules.form.tags.description': 'Selectează etichetele de aplicat documentelor adăugate care corespund condițiilor',
'tagging-rules.form.tags.min-length': 'Este necesară cel puțin o etichetă de aplicat',
'tagging-rules.form.tags.add-tag': 'Creează eticheta',
'tagging-rules.form.submit': 'Creează regula',
'tagging-rules.update.title': 'Actualizează regula de etichetare',
'tagging-rules.update.error': 'Nu s-a putut actualiza regula de etichetare',
'tagging-rules.update.submit': 'Actualizează regula',
'tagging-rules.update.cancel': 'Anulează',
'tagging-rules.apply.button': 'Aplicați la documente existente',
'tagging-rules.apply.confirm.title': 'Aplicați regula la documente existente?',
'tagging-rules.apply.confirm.description': 'Aceasta va verifica toate documentele existente din organizația dvs. și va aplica etichetele unde condițiile corespund. Procesarea va avea loc în fundal.',
'tagging-rules.apply.confirm.button': 'Aplicați regula',
'tagging-rules.apply.success': 'Aplicarea regulii a fost pornită în fundal',
'tagging-rules.apply.error': 'Eroare la pornirea aplicării regulii',
'tagging-rules.apply.processing': 'Se pornește...',
// Intake emails
'intake-emails.title': 'E-mailuri de primire',
'intake-emails.description': 'Adresele de e-mail de primire sunt folosite pentru a introduce automat email-uri în Papra. Doar redirecționează e-mailuri către adresa de primire, iar fișierele atașate vor fi adăugate automat în documentele organizației tale.',
'intake-emails.disabled.title': 'Email-urile de primire sunt dezactivate',
'intake-emails.disabled.description': 'Email-urile de primire sunt dezactivate pe aceasta instanță. Te rugăm să contactezi administratorul pentru a le activa. Consultă {{ documentation }} pentru mai multe informații.',
'intake-emails.disabled.documentation': 'documentația',
'intake-emails.info': 'Vor fi procesate numai e-mailurile de primire activate de la originile permise. Poți activa sau dezactiva un e-mail de primire în orice moment.',
'intake-emails.empty.title': 'Niciun e-mail de primire',
'intake-emails.empty.description': 'Generează o adresă de primire pentru a primi cu ușurință fișiere atașate din e-mail.',
'intake-emails.empty.generate': 'Generează e-mail de primire',
'intake-emails.count': '{{ count }} email{{ plural }} de primire pentru această organizație',
'intake-emails.new': 'E-mail nou de primire',
'intake-emails.disabled-label': '(Dezactivat)',
'intake-emails.no-origins': 'Nicio origine de e-mail permisă',
'intake-emails.allowed-origins': 'Permis de la {{ count }} adrese{{ plural }}',
'intake-emails.actions.enable': 'Activează',
'intake-emails.actions.disable': 'Dezactivează',
'intake-emails.actions.manage-origins': 'Gestionează adresele de origine',
'intake-emails.actions.delete': 'Șterge',
'intake-emails.delete.confirm.title': 'Ștergi email-ul de primire?',
'intake-emails.delete.confirm.message': 'Ești sigur că vrei să ștergi acest e-mail de primire? Această acțiune nu poate fi anulată.',
'intake-emails.delete.confirm.confirm-button': 'Șterge email-ul de primire',
'intake-emails.delete.confirm.cancel-button': 'Anulează',
'intake-emails.delete.success': 'E-mail de primire șters',
'intake-emails.create.success': 'E-mail de primire creat',
'intake-emails.update.success.enabled': 'E-mail de primire activat',
'intake-emails.update.success.disabled': 'E-mail de primire dezactivat',
'intake-emails.allowed-origins.title': 'Origini permise',
'intake-emails.allowed-origins.description': 'Doar email-urile trimise la {{ e-mail }} de la aceste origini vor fi procesate. Dacă nu sunt specificate origini, toate email-urile vor fi ignorate.',
'intake-emails.allowed-origins.add.label': 'Adaugă adresa de e-mail de origine permisă',
'intake-emails.allowed-origins.add.placeholder': 'Ex. ada@papra.app',
'intake-emails.allowed-origins.add.button': 'Adaugă',
'intake-emails.allowed-origins.add.error.exists': 'Acest e-mail este deja în originile permise pentru acest e-mail de primire',
// API keys
'api-keys.permissions.select-all': 'Selectează tot',
'api-keys.permissions.deselect-all': 'Deselectează tot',
'api-keys.permissions.organizations.title': 'Organizații',
'api-keys.permissions.organizations.organizations:create': 'Creează organizații',
'api-keys.permissions.organizations.organizations:read': 'Citește organizații',
'api-keys.permissions.organizations.organizations:update': 'Actualizează organizații',
'api-keys.permissions.organizations.organizations:delete': 'Șterge organizații',
'api-keys.permissions.documents.title': 'Documente',
'api-keys.permissions.documents.documents:create': 'Creează documente',
'api-keys.permissions.documents.documents:read': 'Citește documente',
'api-keys.permissions.documents.documents:update': 'Actualizează documente',
'api-keys.permissions.documents.documents:delete': 'Șterge documente',
'api-keys.permissions.tags.title': 'Etichete',
'api-keys.permissions.tags.tags:create': 'Creează etichete',
'api-keys.permissions.tags.tags:read': 'Citește etichete',
'api-keys.permissions.tags.tags:update': 'Actualizează etichete',
'api-keys.permissions.tags.tags:delete': 'Șterge etichete',
'api-keys.create.title': 'Creează cheie API',
'api-keys.create.description': 'Creează o nouă cheie API pentru a accesa API-ul Papra.',
'api-keys.create.success': 'Cheia API a fost creată cu succes.',
'api-keys.create.back': 'Înapoi la cheile API',
'api-keys.create.form.name.label': 'Nume',
'api-keys.create.form.name.placeholder': 'Exemplu: Cheia mea API',
'api-keys.create.form.name.required': 'Te rugăm să introduci un nume pentru cheia API',
'api-keys.create.form.permissions.label': 'Permisiuni',
'api-keys.create.form.permissions.required': 'Te rugăm să selectezi cel puțin o permisiune',
'api-keys.create.form.submit': 'Creează cheie API',
'api-keys.create.created.title': 'Cheie API creată',
'api-keys.create.created.description': 'Cheia API a fost creată cu succes. Salveaz-o într-un loc sigur, deoarece nu va fi afișată din nou.',
'api-keys.list.title': 'Chei API',
'api-keys.list.description': 'Gestionează-ți cheile API aici.',
'api-keys.list.create': 'Creează cheie API',
'api-keys.list.empty.title': 'Nicio cheie API',
'api-keys.list.empty.description': 'Creează o cheie API pentru a accesa API-ul Papra.',
'api-keys.list.card.last-used': 'Ultima utilizare',
'api-keys.list.card.never': 'Niciodată',
'api-keys.list.card.created': 'Creat la',
'api-keys.delete.success': 'Cheia API a fost ștearsă cu succes',
'api-keys.delete.confirm.title': 'Șterge cheia API',
'api-keys.delete.confirm.message': 'Ești sigur ca vrei să ștergi aceasta cheie API? Această acțiune nu poate fi anulată.',
'api-keys.delete.confirm.confirm-button': 'Șterge',
'api-keys.delete.confirm.cancel-button': 'Anulează',
// Webhooks
'webhooks.list.title': 'Webhook-uri',
'webhooks.list.description': 'Gestionează webhook-urile organizației tale',
'webhooks.list.empty.title': 'Niciun webhook',
'webhooks.list.empty.description': 'Creează primul webhook pentru a începe să primesti evenimente',
'webhooks.list.create': 'Creează webhook',
'webhooks.list.card.last-triggered': 'Ultima declanșare',
'webhooks.list.card.never': 'Niciodată',
'webhooks.list.card.created': 'Creat la',
'webhooks.create.title': 'Creează webhook',
'webhooks.create.description': 'Creează un nou webhook pentru a primi evenimente',
'webhooks.create.success': 'Webhook creat cu succes',
'webhooks.create.back': 'Înapoi',
'webhooks.create.form.submit': 'Creează webhook',
'webhooks.create.form.name.label': 'Nume webhook',
'webhooks.create.form.name.placeholder': 'Introdu numele webhook-ului',
'webhooks.create.form.name.required': 'Numele este obligatoriu',
'webhooks.create.form.url.label': 'URL webhook',
'webhooks.create.form.url.placeholder': 'Introdu URL-ul webhook-ului',
'webhooks.create.form.url.required': 'URL-ul este obligatoriu',
'webhooks.create.form.url.invalid': 'URL-ul este invalid',
'webhooks.create.form.secret.label': 'Secret',
'webhooks.create.form.secret.placeholder': 'Introdu secretul webhook-ului',
'webhooks.create.form.events.label': 'Evenimente',
'webhooks.create.form.events.required': 'Este necesar cel puțin un eveniment',
'webhooks.update.title': 'Editează webhook',
'webhooks.update.description': 'Actualizează detaliile webhook-ului',
'webhooks.update.success': 'Webhook actualizat cu succes',
'webhooks.update.submit': 'Actualizează webhook',
'webhooks.update.cancel': 'Anulează',
'webhooks.update.form.secret.placeholder': 'Introdu un secret nou',
'webhooks.update.form.secret.placeholder-redacted': '[Secret protejat]',
'webhooks.update.form.rotate-secret.button': 'Rotește secretul',
'webhooks.delete.success': 'Webhook șters cu succes',
'webhooks.delete.confirm.title': 'Șterge webhook',
'webhooks.delete.confirm.message': 'Ești sigur ca vrei să ștergi acest webhook?',
'webhooks.delete.confirm.confirm-button': 'Șterge',
'webhooks.delete.confirm.cancel-button': 'Anulează',
'webhooks.events.documents.title': 'Evenimente documente',
'webhooks.events.documents.document:created.description': 'Document creat',
'webhooks.events.documents.document:deleted.description': 'Document șters',
'webhooks.events.documents.document:updated.description': 'Document actualizat',
'webhooks.events.documents.document:tag:added.description': 'O etichetă a fost adăugată la un document',
'webhooks.events.documents.document:tag:removed.description': 'O etichetă a fost eliminată dintr-un document',
// Navigation
'layout.menu.home': 'Acasă',
'layout.menu.documents': 'Documente',
'layout.menu.tags': 'Etichete',
'layout.menu.tagging-rules': 'Reguli de etichetare',
'layout.menu.deleted-documents': 'Documente șterse',
'layout.menu.organization-settings': 'Setări organizație',
'layout.menu.api-keys': 'Chei API',
'layout.menu.settings': 'Setări',
'layout.menu.account': 'Cont',
'layout.menu.general-settings': 'Setări generale',
'layout.menu.usage': 'Utilizare',
'layout.menu.intake-emails': 'Email-uri de primire',
'layout.menu.webhooks': 'Webhook-uri',
'layout.menu.members': 'Membri',
'layout.menu.invitations': 'Invitații',
'layout.upgrade-cta.title': 'Ai nevoie de mai mult spațiu?',
'layout.upgrade-cta.description': 'Obține de 10x mai mult spațiu de stocare + colaborare în echipă',
'layout.upgrade-cta.button': 'Actualizează la Plus',
'layout.theme.light': 'Mod luminos',
'layout.theme.dark': 'Mod intunecat',
'layout.theme.system': 'Modul sistemului',
'layout.search.placeholder': 'Căutare...',
'layout.menu.import-document': 'Importă un document',
'user-menu.account-settings': 'Setări cont',
'user-menu.api-keys': 'Chei API',
'user-menu.invitations': 'Invitații',
'user-menu.language': 'Limbă',
'user-menu.logout': 'Deconectare',
// Command palette
'command-palette.search.placeholder': 'Caută comenzi sau documente',
'command-palette.no-results': 'Niciun rezultat gasit',
'command-palette.sections.documents': 'Documente',
'command-palette.sections.theme': 'Temă',
// API errors
'api-errors.document.already_exists': 'Documentul există deja',
'api-errors.document.size_too_large': 'Fișierul este prea mare',
'api-errors.intake-emails.already_exists': 'Un email de primire cu această adresă există deja.',
'api-errors.intake_email.limit_reached': 'Numărul maxim de email-uri de primire pentru această organizație a fost atins. Te rugăm să-ți îmbunătățești planul pentru a crea mai multe email-uri de primire.',
'api-errors.user.max_organization_count_reached': 'Ai atins numărul maxim de organizații pe care le poți crea. Dacă ai nevoie să creezi mai multe, te rugăm să contactezi asistența.',
'api-errors.default': 'A apărut o eroare la procesarea cererii.',
'api-errors.organization.invitation_already_exists': 'O invitatie pentru acest e-mail există deja în această organizație.',
'api-errors.user.already_in_organization': 'Acest utilizator este deja în această organizație.',
'api-errors.user.organization_invitation_limit_reached': 'Numărul maxim de invitații a fost atins pentru astazi. Te rugăm să încerci din nou mâine.',
'api-errors.demo.not_available': 'Această functie nu este disponibila în demo',
'api-errors.tags.already_exists': 'O etichetă cu acest nume există deja pentru aceasta organizație',
'api-errors.internal.error': 'A apărut o eroare la procesarea cererii. Te rugăm să încerci din nou.',
'api-errors.auth.invalid_origin': 'Origine invalidă a aplicației. Dacă hospedezi Papra, asigură-te că variabila de mediu APP_BASE_URL corespunde URL-ului actual. Pentru mai multe detalii, consulta https://docs.papra.app/resources/troubleshooting/#invalid-application-origin',
'api-errors.organization.max_members_count_reached': 'Numărul maxim de membri și invitații în așteptare pentru această organizație a fost atins. Te rugăm să îți actualizezi planul pentru a adăuga mai mulți membri.',
'api-errors.organization.has_active_subscription': 'Nu se poate șterge organizația cu un abonament activ. Vă rugăm să anulați mai întâi abonamentul folosind butonul Gestionați abonamentul de mai sus.',
// Better auth api errors
'api-errors.USER_NOT_FOUND': 'Utilizatorul nu a fost găsit',
'api-errors.FAILED_TO_CREATE_USER': 'Eroare la crearea utilizatorului',
'api-errors.FAILED_TO_CREATE_SESSION': 'Eroare la crearea sesiunii',
'api-errors.FAILED_TO_UPDATE_USER': 'Eroare la actualizarea utilizatorului',
'api-errors.FAILED_TO_GET_SESSION': 'Eroare la obținerea sesiunii',
'api-errors.INVALID_PASSWORD': 'Parolă invalidă',
'api-errors.INVALID_EMAIL': 'Email invalid',
'api-errors.INVALID_EMAIL_OR_PASSWORD': 'Email-ul sau parola este incorectă, sau contul nu există.',
'api-errors.SOCIAL_ACCOUNT_ALREADY_LINKED': 'Contul social este deja asociat',
'api-errors.PROVIDER_NOT_FOUND': 'Furnizorul nu a fost găsit',
'api-errors.INVALID_TOKEN': 'Token invalid',
'api-errors.ID_TOKEN_NOT_SUPPORTED': 'Token ID nu este suportat',
'api-errors.FAILED_TO_GET_USER_INFO': 'Eroare la obținerea informațiilor utilizatorului',
'api-errors.USER_EMAIL_NOT_FOUND': 'Email-ul utilizatorului nu a fost găsit',
'api-errors.EMAIL_NOT_VERIFIED': 'Email-ul nu este verificat',
'api-errors.PASSWORD_TOO_SHORT': 'Parolă prea scurtă',
'api-errors.PASSWORD_TOO_LONG': 'Parolă prea lungă',
'api-errors.USER_ALREADY_EXISTS': 'Există deja un utilizator cu acest email',
'api-errors.EMAIL_CAN_NOT_BE_UPDATED': 'Email-ul nu poate fi actualizat',
'api-errors.CREDENTIAL_ACCOUNT_NOT_FOUND': 'Contul de autentificare nu a fost găsit',
'api-errors.SESSION_EXPIRED': 'Sesiunea a expirat',
'api-errors.FAILED_TO_UNLINK_LAST_ACCOUNT': 'Eroare la disocierea ultimului cont',
'api-errors.ACCOUNT_NOT_FOUND': 'Contul nu a fost găsit',
'api-errors.USER_ALREADY_HAS_PASSWORD': 'Utilizatorul are deja o parolă',
// Not found
'not-found.title': '404 - Nu a fost gasit',
'not-found.description': 'Ne pare rău, pagina pe care o cauți nu pare să existe. Te rugăm să verifici URL-ul și să încerci din nou.',
'not-found.back-to-home': 'Înapoi la pagina principală',
// Demo
'demo.popup.description': 'Acesta este un mediu demonstrativ, toate datele sunt salvate in stocarea locală a browserului.',
'demo.popup.discord': 'Alătură-te {{ discordLink }} pentru a obtine asistență, a propune funcționalități sau doar pentru a discuta.',
'demo.popup.discord-link-label': 'serverului de Discord',
'demo.popup.reset': 'Resetează datele demo',
'demo.popup.hide': 'Ascunde',
// Color picker
'color-picker.hue': 'Nuanță',
'color-picker.saturation': 'Saturație',
'color-picker.lightness': 'Luminozitate',
'color-picker.select-color': 'Selectează culoarea',
'color-picker.select-a-color': 'Selectează o culoare',
// Subscriptions
'subscriptions.checkout-success.title': 'Plată reușită!',
'subscriptions.checkout-success.description': 'Abonamentul tău a fost activat cu succes.',
'subscriptions.checkout-success.thank-you': 'Mulțumim pentru că ai făcut upgrade la Papra Plus. Acum ai acces la toate funcționalitățile premium.',
'subscriptions.checkout-success.go-to-organizations': 'Mergi la Organizații',
'subscriptions.checkout-success.redirecting': 'Redirecționare în {{ count }} secundă{{ plural }}...',
'subscriptions.checkout-cancel.title': 'Plată anulată',
'subscriptions.checkout-cancel.description': 'Upgrade-ul abonamentului tău a fost anulat.',
'subscriptions.checkout-cancel.no-charges': 'Nu au fost efectuate taxe pe contul tău. Poți încerca din nou oricând ești gata.',
'subscriptions.checkout-cancel.back-to-organizations': 'Înapoi la Organizații',
'subscriptions.checkout-cancel.need-help': 'Ai nevoie de ajutor?',
'subscriptions.checkout-cancel.contact-support': 'Contactează asistența',
'subscriptions.upgrade-dialog.title': 'Upgrade la Plus',
'subscriptions.upgrade-dialog.description': 'Deblochează funcționalități puternice pentru organizația ta',
'subscriptions.upgrade-dialog.contact-us': 'Contactează-ne',
'subscriptions.upgrade-dialog.enterprise-plans': 'dacă ai nevoie de planuri enterprise personalizate.',
'subscriptions.upgrade-dialog.current-plan': 'Plan curent',
'subscriptions.upgrade-dialog.recommended': 'Recomandat',
'subscriptions.upgrade-dialog.per-month': '/lună',
'subscriptions.upgrade-dialog.billed-annually': '${{ price }} facturat anual',
'subscriptions.upgrade-dialog.upgrade-now': 'Upgrade acum',
'subscriptions.upgrade-dialog.promo-banner.title': 'Ofertă pe durată limitată',
'subscriptions.upgrade-dialog.promo-banner.description': 'Obțineți {{ percent }}% reducere pe organizație la toate planurile pentru totdeauna ca early adopter! Oferta expiră în {{ days, >1:{days} zile, =1:1 zi, mai puțin de o zi }}.',
'subscriptions.plan.free.name': 'Plan gratuit',
'subscriptions.plan.plus.name': 'Plus',
'subscriptions.plan.pro.name': 'Pro',
'subscriptions.features.storage-size': 'Dimensiune stocare documente',
'subscriptions.features.members': 'Membri ai organizației',
'subscriptions.features.members-count': '{{ count }} membri',
'subscriptions.features.email-intakes': 'Email-uri de primire',
'subscriptions.features.email-intakes-count-singular': '{{ count }} adresă',
'subscriptions.features.email-intakes-count-plural': '{{ count }} adrese',
'subscriptions.features.max-upload-size': 'Dimensiune maximă fișier upload',
'subscriptions.features.support': 'Asistență',
'subscriptions.features.support-community': 'Asistență comunitate',
'subscriptions.features.support-email': 'Asistență email',
'subscriptions.features.support-priority': 'Asistență prioritară',
'subscriptions.billing-interval.monthly': 'Lunar',
'subscriptions.billing-interval.annual': 'Anual',
'subscriptions.usage-warning.message': 'Ai folosit {{ percent }}% din spațiul de stocare pentru documente. Ia în considerare actualizarea planului pentru a obține mai mult spațiu.',
'subscriptions.usage-warning.upgrade-button': 'Actualizează planul',
// Common / Shared
'common.confirm-modal.type-to-confirm': 'Tastează "{{ text }}" pentru confirmare',
};

View File

@@ -1,571 +0,0 @@
# Authentication
auth.request-password-reset.title: Resetează parola
auth.request-password-reset.description: Introdu adresa de e-mail pentru a reseta parola.
auth.request-password-reset.requested: Dacă există un cont pentru acest e-mail, am trimis un e-mail pentru resetarea parolei.
auth.request-password-reset.back-to-login: Înapoi la autentificare
auth.request-password-reset.form.email.label: E-mail
auth.request-password-reset.form.email.placeholder: 'Exemplu: popescu@papra.app'
auth.request-password-reset.form.email.required: Introdu adresa de e-mail
auth.request-password-reset.form.email.invalid: Adresa de e-mail este invalidă
auth.request-password-reset.form.submit: Trimite cererea de resetare a parolei
auth.reset-password.title: Resetează parola
auth.reset-password.description: Introdu o parolă noua pentră a o reseta pe cea veche.
auth.reset-password.reset: Parola a fost resetată cu success.
auth.reset-password.back-to-login: Înapoi la autentificare
auth.reset-password.form.new-password.label: Parolă nouă
auth.reset-password.form.new-password.placeholder: 'Exemplu: **********'
auth.reset-password.form.new-password.required: Introdu parola nouă
auth.reset-password.form.new-password.min-length: Parola trebuie să fie de minim {{ minLength }} caractere
auth.reset-password.form.new-password.max-length: Parola trebuie să fie de maxim {{ maxLength }} de caractere
auth.reset-password.form.submit: Resetează parola
auth.email-provider.open: Deschide {{ provider }}
auth.login.title: Autentificare la Papra
auth.login.description: Introdu e-mailul sau folosește autentificarea cu cont social pentru a accesa contul Papra.
auth.login.login-with-provider: Autentificare cu {{ provider }}
auth.login.no-account: Nu ai cont?
auth.login.register: Înregistrare
auth.login.form.email.label: E-mail
auth.login.form.email.placeholder: 'Exemplu: popescu@papra.app'
auth.login.form.email.required: Introdu adresa de e-mail
auth.login.form.email.invalid: Adresa e-mail este invalidă
auth.login.form.password.label: Parola
auth.login.form.password.placeholder: Setează o parola noua
auth.login.form.password.required: Introdu parola noua
auth.login.form.remember-me.label: Ține-mă minte
auth.login.form.forgot-password.label: Ai uitat parola?
auth.login.form.submit: Autentificare
auth.register.title: Înregistrare la Papra
auth.register.description: Introdu e-mailul pentru a accesa Papra.
auth.register.register-with-email: înregistrează-te cu e-mail
auth.register.register-with-provider: Inregistreaza-te cu {{ provider }}
auth.register.providers.google: Google
auth.register.providers.github: GitHub
auth.register.have-account: Ai deja un cont?
auth.register.login: Autentificare
auth.register.registration-disabled.title: Înregistrarea este dezactivată
auth.register.registration-disabled.description: Crearea de conturi noi este momentan dezactivată pe această instanță de Papra. Doar utilizatorii cu conturi existente se pot autentifica. Dacă aceasta pare a fi o greșeală, contactează administratorul acestei instanțe.
auth.register.form.email.label: E-mail
auth.register.form.email.placeholder: 'Exemplu: popescu@papra.app'
auth.register.form.email.required: Introdu adresa de e-mail
auth.register.form.email.invalid: Adresa e-mail este invalida
auth.register.form.password.label: Parola
auth.register.form.password.placeholder: Setează parola
auth.register.form.password.required: Te rugăm să introduci parola
auth.register.form.password.min-length: Parola trebuie să fie de minim {{ minLength }} caractere
auth.register.form.password.max-length: Parola trebuie să fie de maxim {{ maxLength }} de caractere
auth.register.form.name.label: Nume
auth.register.form.name.placeholder: 'Exemplu: Andrei Popescu'
auth.register.form.name.required: Introdu numele
auth.register.form.name.max-length: Numele trebuie să fie de minim {{ maxLength }} caractere
auth.register.form.submit: Înregistrare
auth.email-validation-required.title: Verifică-ți email-ul
auth.email-validation-required.description: A fost trimis un e-mail de verificare la adresa ta de e-mail. Te rugăm să îți verifici adresa de e-mail dând click pe linkul din e-mail.
auth.legal-links.description: Continuând, confirmați că întelegeți și sunteti de acord cu {{ terms }} și {{ privacy }}.
auth.legal-links.terms: Termenii și condițiile
auth.legal-links.privacy: Politica de confidențialitate
auth.no-auth-provider.title: Niciun furnizor de autentificare
auth.no-auth-provider.description: Nu este niciun furnizor de autentificare activat pe această instanță de Papra. Te rugăm să contactezi administratorul aceste instanțe pentru a le activa.
# User settings
user.settings.title: Setările utilizatorului
user.settings.description: Configurează setările contului aici.
user.settings.email.title: Adresa de e-mail
user.settings.email.description: Adresa de e-mail nu poate fi schimbată.
user.settings.email.label: Adresa de e-mail
user.settings.name.title: Numele complet
user.settings.name.description: Numele complet este afișat altor membri din organizație.
user.settings.name.label: Numele complet
user.settings.name.placeholder: Ex. Andrei Popescu
user.settings.name.update: Schimbă numele
user.settings.name.updated: Numele a fost schimbat
user.settings.logout.title: Deconectare
user.settings.logout.description: Vei fi deconectat din cont. Te poți conecta înapoi ulterior.
user.settings.logout.button: Deconectare
# Organizations
organizations.list.title: Organizațiile tale
organizations.list.description: Organizațiile sunt o modalitate de a grupa documentele și de a gestiona accesul la acestea. Poți crea multiple organizații și invita membrii echipei tale să colaboreze.
organizations.list.create-new: Creează o organizație nouă
organizations.details.no-documents.title: Niciun document
organizations.details.no-documents.description: Încă nu există documente în această organizație. Încarcă niște documente pentru a începe.
organizations.details.upload-documents: Încarcă documente
organizations.details.documents-count: documente in total
organizations.details.total-size: mărime totala
organizations.details.latest-documents: Ultimele documente încarcate
organizations.create.title: Creează o organizație nouă
organizations.create.description: Documentele sunt grupate în funcție de organizație. Poți crea mai multe organizații pentru documente diferite, de exemplu, pentru uz personal și profesional.
organizations.create.back: Înapoi
organizations.create.error.max-count-reached: Ai ajuns la numărul maxim de organizații pe care le poți crea. Dacă ai nevoie de mai multe, contactează asistența.
organizations.create.form.name.label: Numle organizației
organizations.create.form.name.placeholder: Ex. Acme SRL.
organizations.create.form.name.required: Introdu numele organizației
organizations.create.form.submit: Creează organizația
organizations.create.success: Organizația a fost creată cu succes
organizations.create-first.title: Creează organizația
organizations.create-first.description: Documentele sunt grupate în funcție de organizație. Poți crea mai multe organizații pentru documente diferite, de exemplu, pentru uz personal și profesional.
organizations.create-first.default-name: Organizația mea
organizations.create-first.user-name: 'Organizația lui {{ name }}'
organization.settings.title: Setările organizației
organization.settings.page.title: Setările organizației
organization.settings.page.description: Gestionează setarile organizației aici.
organization.settings.name.title: Numele organizației
organization.settings.name.update: Actualizează numele
organization.settings.name.placeholder: Ex. Acme SRL.
organization.settings.name.updated: Numele organizației a fost actualizat
organization.settings.subscription.title: Abonament
organization.settings.subscription.description: Gestionează facturile și metodele de plată.
organization.settings.subscription.manage: Gestionează-ți abonamentul
organization.settings.subscription.error: Eroare la obținerea URL-ului portalului de client
organization.settings.delete.title: Șterge organizația
organization.settings.delete.description: Ștergerea acestei organizații va elimina definitiv toate datele asociate cu aceasta.
organization.settings.delete.confirm.title: Șterge organizatia
organization.settings.delete.confirm.message: Ești sigur că vrei să ștergi această organizație? Aceasta operatie nu poate fi anulată si toate datele asociate cu aceasta vor fi eliminate definitiv.
organization.settings.delete.confirm.confirm-button: Șterge organizație
organization.settings.delete.confirm.cancel-button: Anulează
organization.settings.delete.success: Organizație ștearsă cu succes
organizations.members.title: Membri
organizations.members.description: Gestionează membrii organizației tale
organizations.members.invite-member: Invită membru
organizations.members.invite-member-disabled-tooltip: Doar administratorii sau proprietarii pot invita membrii la organizație
organizations.members.remove-from-organization: Elimina din organizație
organizations.members.role: Rol
organizations.members.roles.owner: Proprietar
organizations.members.roles.admin: Admin
organizations.members.roles.member: Membru
organizations.members.delete.confirm.title: Elimină membrul
organizations.members.delete.confirm.message: Ești sigur că vrei să elimini acest membru din organizație?
organizations.members.delete.confirm.confirm-button: Elimină
organizations.members.delete.confirm.cancel-button: Anulează
organizations.members.delete.success: Membru eliminat cu succes
organizations.members.update-role.success: Rolul membrului a fost actualizat
organizations.members.table.headers.name: Nume
organizations.members.table.headers.email: E-mail
organizations.members.table.headers.role: Rol
organizations.members.table.headers.created: Creat
organizations.members.table.headers.actions: Acțiuni
organizations.invite-member.title: Invită membru
organizations.invite-member.description: Invită un membru la organizație
organizations.invite-member.form.email.label: E-mail
organizations.invite-member.form.email.placeholder: 'Exemplu: ada@papra.app'
organizations.invite-member.form.email.required: Introdu o adresă de e-mail validă
organizations.invite-member.form.role.label: Rol
organizations.invite-member.form.submit: Invită membru
organizations.invite-member.success.message: Membru invitat
organizations.invite-member.success.description: Adresă de e-mail a fost invitată la organizație.
organizations.invite-member.error.message: Eroare la invitarea membrului
organizations.invitations.title: Invitații
organizations.invitations.description: Gestionează invitațiile la organizație
organizations.invitations.list.cta: Invită membru
organizations.invitations.list.empty.title: Nicio invitație în așteptare
organizations.invitations.list.empty.description: Încă nu ai fost invitat la nicio organizație.
organizations.invitations.status.pending: În așteptare
organizations.invitations.status.accepted: Acceptată
organizations.invitations.status.rejected: Respinsă
organizations.invitations.status.expired: Expirată
organizations.invitations.status.cancelled: Anulată
organizations.invitations.resend: Retrimite invitația
organizations.invitations.cancel.title: Anulează invitația
organizations.invitations.cancel.description: Ești sigur că vrei să anulezi această invitație?
organizations.invitations.cancel.confirm: Anulează invitația
organizations.invitations.cancel.cancel: Anulează
organizations.invitations.resend.title: Retrimite invitația
organizations.invitations.resend.description: Ești sigur că vrei să retrimiți această invitație? Se va trimite un nou e-mail destinatarului.
organizations.invitations.resend.confirm: Retrimite invitația
organizations.invitations.resend.cancel: Anulează
invitations.list.title: Invitații
invitations.list.description: Gestionează invitații la organizație
invitations.list.empty.title: Nicio invitație în așteptare
invitations.list.empty.description: Încă nu ai fost invitat la nicio organizație.
invitations.list.headers.organization: Organizație
invitations.list.headers.status: Status
invitations.list.headers.created: Creat la
invitations.list.headers.actions: Acțiuni
invitations.list.actions.accept: Acceptă
invitations.list.actions.reject: Refuză
invitations.list.actions.accept.success.message: Invitație acceptată
invitations.list.actions.accept.success.description: Invitația a fost acceptată.
invitations.list.actions.reject.success.message: Invitație refuzată
invitations.list.actions.reject.success.description: Invitația a fost refuzată.
# Documents
documents.list.title: Documente
documents.list.no-documents.title: Niciun document
documents.list.no-documents.description: Încă nu există documente în aceasta organizație. Începe prin a încarca câteva documente.
documents.list.no-results: Nu au fost găsite documente
documents.tabs.info: Info
documents.tabs.content: Conținut
documents.tabs.activity: Activitate
documents.deleted.message: Acest document a fost șters și va fi eliminat definitiv după {{ days }} zile.
documents.actions.download: Descarcă
documents.actions.open-in-new-tab: Deschide în filă nouă
documents.actions.restore: Restaurează
documents.actions.delete: Șterge
documents.actions.edit: Editează
documents.actions.cancel: Anulează
documents.actions.save: Salvează
documents.actions.saving: Se salvează...
documents.content.alert: Conținutul documentului este extras automat din document la încarcare. Este folosit doar pentru căutare și indexare.
documents.info.id: ID
documents.info.name: Nume
documents.info.type: Tip
documents.info.size: Dimensiune
documents.info.created-at: Creat la
documents.info.updated-at: Actualizat la
documents.info.never: Niciodată
documents.rename.title: Redenumește documentul
documents.rename.form.name.label: Nume
documents.rename.form.name.placeholder: 'Exemplu: Factura 2024'
documents.rename.form.name.required: Te rugăm să introduci un nume pentru document
documents.rename.form.name.max-length: Numele trebuie să aibă mai puțin de 255 de caractere
documents.rename.form.submit: Redenumește documentul
documents.rename.success: Document redenumit cu succes
documents.rename.cancel: Anulează
import-documents.title.error: '{{ count }} documente au eșuat'
import-documents.title.success: '{{ count }} documente importate'
import-documents.title.pending: '{{ count }} / {{ total }} documente importate'
import-documents.title.none: Importă documente
import-documents.no-import-in-progress: Niciun import de documente în curs
documents.deleted.title: Documente șterse
documents.deleted.empty.title: Niciun document șters
documents.deleted.empty.description: Nu ai niciun document șters. Documentele care sunt șterse vor fi mutate în coșul de gunoi timp de {{ days }} zile.
documents.deleted.retention-notice: Toate documentele șterse sunt stocate în coșul de gunoi timp de {{ days }} zile. După acest interval, documentele vor fi șterse definitiv și nu le vei mai putea restaura.
documents.deleted.deleted-at: Șterse la
documents.deleted.restoring: Se restaurează...
documents.deleted.deleting: Se șterge...
documents.preview.unknown-file-type: Nicio previzualizare disponibilă pentru acest tip de fișier
documents.preview.binary-file: Acesta pare a fi un fișier binar și nu poate fi afișat ca text
trash.delete-all.button: Șterge tot
trash.delete-all.confirm.title: Ștergi definitiv toate documentele?
trash.delete-all.confirm.description: Ești sigur că dorești să ștergi definitiv toate documentele din coșul de gunoi? Această acțiune nu poate fi anulată.
trash.delete-all.confirm.label: Șterge
trash.delete-all.confirm.cancel: Anulează
trash.delete.button: Șterge
trash.delete.confirm.title: Ștergi definitiv documentul?
trash.delete.confirm.description: Sunteti sigur ca doriti să stergeti definitiv acest document din cosul de gunoi? Această actiune nu poate fi anulată.
trash.delete.confirm.label: Șterge
trash.delete.confirm.cancel: Anulează
trash.deleted.success.title: Document șters
trash.deleted.success.description: Documentul a fost șters definitiv.
activity.document.created: Documentul a fost creat
activity.document.updated.single: Câmpul {{ field }} a fost actualizat
activity.document.updated.multiple: Câmpurile {{ fields }} au fost actualizate
activity.document.updated: Documentul a fost actualizat
activity.document.deleted: Documentul a fost șters
activity.document.restored: Documentul a fost restaurat
activity.document.tagged: Eticheta {{ tag }} a fost adaugată
activity.document.untagged: Eticheta {{ tag }} a fost eliminată
activity.document.user.name: de {{ name }}
activity.load-more: Încarcă mai multe
activity.no-more-activities: Nu mai sunt activități pentru acest document
# Tags
tags.no-tags.title: Încă nu există etichete
tags.no-tags.description: Această organizație nu are încă etichete. Etichetele sunt folosite pentru a clasifica documentele. Poți adăuga etichete la documente pentru a le găsi și organiza mai ușor.
tags.no-tags.create-tag: Creează eticheta
tags.title: Etichete documente
tags.description: Etichetele sunt folosite pentru a clasifica documentele. Poți adăuga etichete la documente pentru a le găsi și organiza mai ușor.
tags.create: Creează eticheta
tags.update: Actualizează eticheta
tags.delete: Șterge eticheta
tags.delete.confirm.title: Șterge eticheta
tags.delete.confirm.message: Ești sigur că vrei să ștergi aceasta eticheta? Stergerea unei etichete o va elimina din toate documentele.
tags.delete.confirm.confirm-button: Șterge
tags.delete.confirm.cancel-button: Anulează
tags.delete.success: Eticheta a fost ștearsă cu succes
tags.create.success: Eticheta "{{ name }}" a fost creată cu succes.
tags.update.success: Eticheta "{{ name }}" a fost actualizată cu succes.
tags.form.name.label: Nume
tags.form.name.placeholder: Ex. Contracte
tags.form.name.required: Te rugăm să introduci un nume pentru etichetă
tags.form.name.max-length: Numele etichetei trebuie să aibă mai puțin de 64 de caractere
tags.form.color.label: Culoare
tags.form.color.required: Te rugăm să introduci o culoare
tags.form.color.invalid: Culoarea hex este formatată greșit.
tags.form.description.label: Descriere
tags.form.description.optional: (optional)
tags.form.description.placeholder: Ex. Toate contractele semnate de companie
tags.form.description.max-length: Descrierea trebuie să aibă mai puțin de 256 de caractere
tags.form.no-description: Nicio descriere
tags.table.headers.tag: Etichetă
tags.table.headers.description: Descriere
tags.table.headers.documents: Documente
tags.table.headers.created: Creat la
tags.table.headers.actions: Acțiuni
# Tagging rules
tagging-rules.field.name: nume document
tagging-rules.field.content: conținut document
tagging-rules.operator.equals: egal cu
tagging-rules.operator.not-equals: nu este egal cu
tagging-rules.operator.contains: conține
tagging-rules.operator.not-contains: nu conține
tagging-rules.operator.starts-with: începe cu
tagging-rules.operator.ends-with: se termină cu
tagging-rules.list.title: Reguli de etichetare
tagging-rules.list.description: Gestionează regulile de etichetare ale organizației pentru a eticheta automat documentele pe baza unor condiții definite.
tagging-rules.list.demo-warning: 'Notă: Deoarece acesta este un mediu demonstrativ (fără server), regulile de etichetare nu vor fi aplicate documentelor nou adăugate.'
tagging-rules.list.no-tagging-rules.title: Nicio regulă de etichetare
tagging-rules.list.no-tagging-rules.description: Creează o regulă de etichetare pentru a eticheta automat documentele adăugate pe baza unor condiții definite.
tagging-rules.list.no-tagging-rules.create-tagging-rule: Creează regula de etichetare
tagging-rules.list.card.no-conditions: Nicio condiție
tagging-rules.list.card.one-condition: O condiție
tagging-rules.list.card.conditions: '{{ count }} condiții'
tagging-rules.list.card.delete: Șterge regula
tagging-rules.list.card.edit: Editează regula
tagging-rules.create.title: Creează regula de etichetare
tagging-rules.create.success: Regula de etichetare a fost creată cu succes
tagging-rules.create.error: Nu s-a putut crea regula de etichetare
tagging-rules.create.submit: Creează regula
tagging-rules.form.name.label: Nume
tagging-rules.form.name.placeholder: 'Exemplu: Etichetează facturile'
tagging-rules.form.name.min-length: Te rugăm să introduci numele regulii
tagging-rules.form.name.max-length: Numele trebuie să aibă mai puțin de 64 de caractere
tagging-rules.form.description.label: Descriere
tagging-rules.form.description.placeholder: "Exemplu: Etichetează documentele cu 'factură' în nume"
tagging-rules.form.description.max-length: Descrierea trebuie să aibă mai puțin de 256 de caractere
tagging-rules.form.conditions.label: Condiții
tagging-rules.form.conditions.description: Definește condițiile care trebuie îndeplinite pentru ca regula să se aplice. Toate condițiile trebuie îndeplinite pentru ca regula să se aplice.
tagging-rules.form.conditions.add-condition: Adaugă condiție
tagging-rules.form.conditions.no-conditions.title: Nicio condiție
tagging-rules.form.conditions.no-conditions.description: Nu ai adăugat nicio condiție acestei reguli. Această regula va aplica etichetele sale tuturor documentelor.
tagging-rules.form.conditions.no-conditions.confirm: Aplică regula fara condiții
tagging-rules.form.conditions.no-conditions.cancel: Anulează
tagging-rules.form.conditions.value.placeholder: 'Exemplu: factură'
tagging-rules.form.conditions.value.min-length: Te rugăm să introduci o valoare pentru condiție
tagging-rules.form.tags.label: Etichete
tagging-rules.form.tags.description: Selectează etichetele de aplicat documentelor adăugate care corespund condițiilor
tagging-rules.form.tags.min-length: Este necesară cel puțin o etichetă de aplicat
tagging-rules.form.tags.add-tag: Creează eticheta
tagging-rules.form.submit: Creează regula
tagging-rules.update.title: Actualizează regula de etichetare
tagging-rules.update.error: Nu s-a putut actualiza regula de etichetare
tagging-rules.update.submit: Actualizează regula
tagging-rules.update.cancel: Anulează
# Intake emails
intake-emails.title: E-mailuri de primire
intake-emails.description: Adresele de e-mail de primire sunt folosite pentru a introduce automat email-uri în Papra. Doar redirecționează e-mailuri către adresa de primire, iar fișierele atașate vor fi adăugate automat în documentele organizației tale.
intake-emails.disabled.title: Email-urile de primire sunt dezactivate
intake-emails.disabled.description: Email-urile de primire sunt dezactivate pe aceasta instanță. Te rugăm să contactezi administratorul pentru a le activa. Consultă {{ documentation }} pentru mai multe informații.
intake-emails.disabled.documentation: documentația
intake-emails.info: Vor fi procesate numai e-mailurile de primire activate de la originile permise. Poți activa sau dezactiva un e-mail de primire în orice moment.
intake-emails.empty.title: Niciun e-mail de primire
intake-emails.empty.description: Generează o adresă de primire pentru a primi cu ușurință fișiere atașate din e-mail.
intake-emails.empty.generate: Generează e-mail de primire
intake-emails.count: '{{ count }} email{{ plural }} de primire pentru această organizație'
intake-emails.new: E-mail nou de primire
intake-emails.disabled-label: (Dezactivat)
intake-emails.no-origins: Nicio origine de e-mail permisă
intake-emails.allowed-origins: Permis de la {{ count }} adrese{{ plural }}
intake-emails.actions.enable: Activează
intake-emails.actions.disable: Dezactivează
intake-emails.actions.manage-origins: Gestionează adresele de origine
intake-emails.actions.delete: Șterge
intake-emails.delete.confirm.title: Ștergi email-ul de primire?
intake-emails.delete.confirm.message: Ești sigur că vrei să ștergi acest e-mail de primire? Această acțiune nu poate fi anulată.
intake-emails.delete.confirm.confirm-button: Șterge email-ul de primire
intake-emails.delete.confirm.cancel-button: Anulează
intake-emails.delete.success: E-mail de primire șters
intake-emails.create.success: E-mail de primire creat
intake-emails.update.success.enabled: E-mail de primire activat
intake-emails.update.success.disabled: E-mail de primire dezactivat
intake-emails.allowed-origins.title: Origini permise
intake-emails.allowed-origins.description: Doar email-urile trimise la {{ e-mail }} de la aceste origini vor fi procesate. Dacă nu sunt specificate origini, toate email-urile vor fi ignorate.
intake-emails.allowed-origins.add.label: Adaugă adresa de e-mail de origine permisă
intake-emails.allowed-origins.add.placeholder: Ex. ada@papra.app
intake-emails.allowed-origins.add.button: Adaugă
intake-emails.allowed-origins.add.error.exists: Acest e-mail este deja în originile permise pentru acest e-mail de primire
# API keys
api-keys.permissions.documents.title: Documente
api-keys.permissions.documents.documents:create: Creează documente
api-keys.permissions.documents.documents:read: Citește documente
api-keys.permissions.documents.documents:update: Actualizează documente
api-keys.permissions.documents.documents:delete: Șterge documente
api-keys.permissions.tags.title: Etichete
api-keys.permissions.tags.tags:create: Creează etichete
api-keys.permissions.tags.tags:read: Citește etichete
api-keys.permissions.tags.tags:update: Actualizează etichete
api-keys.permissions.tags.tags:delete: Șterge etichete
api-keys.create.title: Creează cheie API
api-keys.create.description: Creează o nouă cheie API pentru a accesa API-ul Papra.
api-keys.create.success: Cheia API a fost creată cu succes.
api-keys.create.back: Înapoi la cheile API
api-keys.create.form.name.label: Nume
api-keys.create.form.name.placeholder: 'Exemplu: Cheia mea API'
api-keys.create.form.name.required: Te rugăm să introduci un nume pentru cheia API
api-keys.create.form.permissions.label: Permisiuni
api-keys.create.form.permissions.required: Te rugăm să selectezi cel puțin o permisiune
api-keys.create.form.submit: Creează cheie API
api-keys.create.created.title: Cheie API creată
api-keys.create.created.description: Cheia API a fost creată cu succes. Salveaz-o într-un loc sigur, deoarece nu va fi afișată din nou.
api-keys.list.title: Chei API
api-keys.list.description: Gestionează-ți cheile API aici.
api-keys.list.create: Creează cheie API
api-keys.list.empty.title: Nicio cheie API
api-keys.list.empty.description: Creează o cheie API pentru a accesa API-ul Papra.
api-keys.list.card.last-used: Ultima utilizare
api-keys.list.card.never: Niciodată
api-keys.list.card.created: Creat la
api-keys.delete.success: Cheia API a fost ștearsă cu succes
api-keys.delete.confirm.title: Șterge cheia API
api-keys.delete.confirm.message: Ești sigur ca vrei să ștergi aceasta cheie API? Această acțiune nu poate fi anulată.
api-keys.delete.confirm.confirm-button: Șterge
api-keys.delete.confirm.cancel-button: Anulează
# Webhooks
webhooks.list.title: Webhook-uri
webhooks.list.description: Gestionează webhook-urile organizației tale
webhooks.list.empty.title: Niciun webhook
webhooks.list.empty.description: Creează primul webhook pentru a începe să primesti evenimente
webhooks.list.create: Creează webhook
webhooks.list.card.last-triggered: Ultima declanșare
webhooks.list.card.never: Niciodată
webhooks.list.card.created: Creat la
webhooks.create.title: Creează webhook
webhooks.create.description: Creează un nou webhook pentru a primi evenimente
webhooks.create.success: Webhook creat cu succes
webhooks.create.back: Înapoi
webhooks.create.form.submit: Creează webhook
webhooks.create.form.name.label: Nume webhook
webhooks.create.form.name.placeholder: Introdu numele webhook-ului
webhooks.create.form.name.required: Numele este obligatoriu
webhooks.create.form.url.label: URL webhook
webhooks.create.form.url.placeholder: Introdu URL-ul webhook-ului
webhooks.create.form.url.required: URL-ul este obligatoriu
webhooks.create.form.url.invalid: URL-ul este invalid
webhooks.create.form.secret.label: Secret
webhooks.create.form.secret.placeholder: Introdu secretul webhook-ului
webhooks.create.form.events.label: Evenimente
webhooks.create.form.events.required: Este necesar cel puțin un eveniment
webhooks.update.title: Editează webhook
webhooks.update.description: Actualizează detaliile webhook-ului
webhooks.update.success: Webhook actualizat cu succes
webhooks.update.submit: Actualizează webhook
webhooks.update.cancel: Anulează
webhooks.update.form.secret.placeholder: Introdu un secret nou
webhooks.update.form.secret.placeholder-redacted: '[Secret protejat]'
webhooks.update.form.rotate-secret.button: Rotește secretul
webhooks.delete.success: Webhook șters cu succes
webhooks.delete.confirm.title: Șterge webhook
webhooks.delete.confirm.message: Ești sigur ca vrei să ștergi acest webhook?
webhooks.delete.confirm.confirm-button: Șterge
webhooks.delete.confirm.cancel-button: Anulează
webhooks.events.documents.title: Evenimente documente
webhooks.events.documents.document:created.description: Document creat
webhooks.events.documents.document:deleted.description: Document șters
webhooks.events.documents.document:updated.description: Document actualizat
webhooks.events.documents.document:tag:added.description: O etichetă a fost adăugată la un document
webhooks.events.documents.document:tag:removed.description: O etichetă a fost eliminată dintr-un document
# Navigation
layout.menu.home: Acasă
layout.menu.documents: Documente
layout.menu.tags: Etichete
layout.menu.tagging-rules: Reguli de etichetare
layout.menu.deleted-documents: Documente șterse
layout.menu.organization-settings: Setări organizație
layout.menu.api-keys: Chei API
layout.menu.settings: Setări
layout.menu.account: Cont
layout.menu.general-settings: Setări generale
layout.menu.intake-emails: Email-uri de primire
layout.menu.webhooks: Webhook-uri
layout.menu.members: Membri
layout.menu.invitations: Invitații
layout.theme.light: Mod luminos
layout.theme.dark: Mod intunecat
layout.theme.system: Modul sistemului
layout.search.placeholder: Căutare...
layout.menu.import-document: Importă un document
user-menu.account-settings: Setări cont
user-menu.api-keys: Chei API
user-menu.invitations: Invitații
user-menu.language: Limbă
user-menu.logout: Deconectare
# Command palette
command-palette.search.placeholder: Caută comenzi sau documente
command-palette.no-results: Niciun rezultat gasit
command-palette.sections.documents: Documente
command-palette.sections.theme: Temă
# API errors
api-errors.document.already_exists: Documentul există deja
api-errors.document.file_too_big: Fișierul documentului este prea mare
api-errors.intake_email.limit_reached: Numărul maxim de email-uri de primire pentru această organizație a fost atins. Te rugăm să-ți îmbunătățești planul pentru a crea mai multe email-uri de primire.
api-errors.user.max_organization_count_reached: Ai atins numărul maxim de organizații pe care le poți crea. Dacă ai nevoie să creezi mai multe, te rugăm să contactezi asistența.
api-errors.default: A apărut o eroare la procesarea cererii.
api-errors.organization.invitation_already_exists: O invitatie pentru acest e-mail există deja în această organizație.
api-errors.user.already_in_organization: Acest utilizator este deja în această organizație.
api-errors.user.organization_invitation_limit_reached: Numărul maxim de invitații a fost atins pentru astazi. Te rugăm să încerci din nou mâine.
api-errors.demo.not_available: Această functie nu este disponibila în demo
api-errors.tags.already_exists: O etichetă cu acest nume există deja pentru aceasta organizație
api-errors.internal.error: A apărut o eroare la procesarea cererii. Te rugăm să încerci din nou.
api-errors.auth.invalid_origin: Origine invalidă a aplicației. Dacă hospedezi Papra, asigură-te că variabila de mediu APP_BASE_URL corespunde URL-ului actual. Pentru mai multe detalii, consulta https://docs.papra.app/resources/troubleshooting/#invalid-application-origin
# Not found
not-found.title: 404 - Nu a fost gasit
not-found.description: Ne pare rău, pagina pe care o cauți nu pare să existe. Te rugăm să verifici URL-ul și să încerci din nou.
not-found.back-to-home: Înapoi la pagina principală
# Demo
demo.popup.description: Acesta este un mediu demonstrativ, toate datele sunt salvate in stocarea locală a browserului.
demo.popup.discord: Alătură-te {{ discordLink }} pentru a obtine asistență, a propune funcționalități sau doar pentru a discuta.
demo.popup.discord-link-label: serverului de Discord
demo.popup.reset: Resetează datele demo
demo.popup.hide: Ascunde
# Color picker
color-picker.hue: Nuanță
color-picker.saturation: Saturație
color-picker.lightness: Luminozitate
color-picker.select-color: Selectează culoarea
color-picker.select-a-color: Selectează o culoare

View File

@@ -5,6 +5,15 @@
// } as const;
export const API_KEY_PERMISSIONS = [
{
section: 'organizations',
permissions: [
'organizations:create',
'organizations:read',
'organizations:update',
'organizations:delete',
],
},
{
section: 'documents',
permissions: [

View File

@@ -1,7 +1,8 @@
import type { Component } from 'solid-js';
import type { LocaleKeys } from '@/modules/i18n/locales.types';
import type { TranslationKeys } from '@/modules/i18n/locales.types';
import { createSignal, For } from 'solid-js';
import { useI18n } from '@/modules/i18n/i18n.provider';
import { Button } from '@/modules/ui/components/button';
import { Checkbox, CheckboxControl, CheckboxLabel } from '@/modules/ui/components/checkbox';
import { API_KEY_PERMISSIONS } from '../api-keys.constants';
@@ -20,7 +21,7 @@ export const ApiKeyPermissionsPicker: Component<{ permissions: string[]; onChang
name: permission,
prefix,
suffix,
description: t(`api-keys.permissions.${section.section}.${permission}` as LocaleKeys),
description: t(`api-keys.permissions.${section.section}.${permission}` as TranslationKeys),
};
}),
}));
@@ -42,34 +43,78 @@ export const ApiKeyPermissionsPicker: Component<{ permissions: string[]; onChang
props.onChange(permissions());
};
return (
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<For each={getPermissionsSections()}>
{section => (
<div>
<p class="text-muted-foreground text-xs">{section.title}</p>
const toggleSection = (sectionName: typeof API_KEY_PERMISSIONS[number]['section']) => {
const section = API_KEY_PERMISSIONS.find(s => s.section === sectionName);
if (!section) {
return;
}
<div class="pl-4 flex flex-col gap-4 mt-4">
<For each={section.permissions}>
{permission => (
<Checkbox
class="flex items-center gap-2"
checked={isPermissionSelected(permission.name)}
onChange={() => togglePermission(permission.name)}
>
<CheckboxControl />
<div class="flex flex-col gap-1">
<CheckboxLabel class="text-sm leading-none">
{permission.description}
</CheckboxLabel>
</div>
</Checkbox>
)}
</For>
const sectionPermissions: ReadonlyArray<string> = section.permissions;
const currentPermissions = permissions();
const allSelected = sectionPermissions.every(p => currentPermissions.includes(p));
setPermissions((prev) => {
if (allSelected) {
return [...prev.filter(p => !sectionPermissions.includes(p))];
}
return [...new Set([...prev, ...sectionPermissions])];
});
};
return (
<div class="p-6 pb-8 border rounded-md mt-2">
<div class="flex flex-col gap-6">
<For each={getPermissionsSections()}>
{section => (
<div>
<Button variant="link" class="text-muted-foreground text-xs p-0 h-auto hover:no-underline" onClick={() => toggleSection(section.section)}>{section.title}</Button>
<div class="pl-4 flex flex-col mt-2">
<For each={section.permissions}>
{permission => (
<Checkbox
class="flex items-center gap-2"
checked={isPermissionSelected(permission.name)}
onChange={() => togglePermission(permission.name)}
>
<CheckboxControl />
<div class="flex flex-col gap-1">
<CheckboxLabel class="text-sm leading-none py-1">
{permission.description}
</CheckboxLabel>
</div>
</Checkbox>
)}
</For>
</div>
</div>
</div>
)}
</For>
)}
</For>
</div>
<div class="flex items-center gap-2 mt-6 border-t pt-6">
<Button
variant="outline"
size="sm"
class="disabled:(op-100! border-op-50 text-muted-foreground)"
onClick={() => setPermissions(API_KEY_PERMISSIONS.flatMap(section => section.permissions))}
disabled={permissions().length === API_KEY_PERMISSIONS.flatMap(section => section.permissions).length}
>
{t('api-keys.permissions.select-all')}
</Button>
<Button
variant="outline"
size="sm"
class="disabled:(op-100! border-op-50 text-muted-foreground)"
onClick={() => setPermissions([])}
disabled={permissions().length === 0}
>
{t('api-keys.permissions.deselect-all')}
</Button>
</div>
</div>
);
};

View File

@@ -2,7 +2,6 @@ import type { Component } from 'solid-js';
import type { ApiKey } from '../api-keys.types';
import { A } from '@solidjs/router';
import { useMutation, useQuery } from '@tanstack/solid-query';
import { format } from 'date-fns';
import { For, Match, Show, Suspense, Switch } from 'solid-js';
import { useI18n } from '@/modules/i18n/i18n.provider';
import { useConfirmModal } from '@/modules/shared/confirm';
@@ -13,7 +12,7 @@ import { createToast } from '@/modules/ui/components/sonner';
import { deleteApiKey, fetchApiKeys } from '../api-keys.services';
export const ApiKeyCard: Component<{ apiKey: ApiKey }> = ({ apiKey }) => {
const { t } = useI18n();
const { t, formatRelativeTime, formatDate } = useI18n();
const { confirm } = useConfirmModal();
const deleteApiKeyMutation = useMutation(() => ({
@@ -57,15 +56,15 @@ export const ApiKeyCard: Component<{ apiKey: ApiKey }> = ({ apiKey }) => {
</div>
<div>
<p class="text-muted-foreground text-xs">
{/* <p class="text-muted-foreground text-xs">
{t('api-keys.list.card.last-used')}
{' '}
{apiKey.lastUsedAt ? format(apiKey.lastUsedAt, 'MMM d, yyyy') : t('api-keys.list.card.never')}
</p>
<p class="text-muted-foreground text-xs">
{apiKey.lastUsedAt ? formatDate(apiKey.lastUsedAt) : t('api-keys.list.card.never')}
</p> */}
<p class="text-muted-foreground text-xs" title={formatDate(apiKey.createdAt, { dateStyle: 'short', timeStyle: 'long' })}>
{t('api-keys.list.card.created')}
{' '}
{format(apiKey.createdAt, 'MMM d, yyyy')}
{formatRelativeTime(apiKey.createdAt)}
</p>
</div>

View File

@@ -96,9 +96,7 @@ export const CreateApiKeyPage: Component = () => {
<div>
<p class="text-sm font-bold">{t('api-keys.create.form.permissions.label')}</p>
<div class="p-6 pb-8 border rounded-md mt-2">
<ApiKeyPermissionsPicker permissions={field.value ?? []} onChange={permissions => setValue(form, 'permissions', permissions)} />
</div>
<ApiKeyPermissionsPicker permissions={field.value ?? []} onChange={permissions => setValue(form, 'permissions', permissions)} />
{field.error && <div class="text-red-500 text-sm">{field.error}</div>}
</div>

View File

@@ -10,3 +10,7 @@ export const ssoProviders = [
icon: 'i-tabler-brand-github',
},
] as const;
export const authPagesPaths = {
emailVerification: '/email-verification',
};

View File

@@ -1,17 +1,17 @@
import type { Config } from '../config/config';
import type { SsoProviderConfig } from './auth.types';
import { get } from 'lodash-es';
import { get } from '../shared/utils/get';
import { ssoProviders } from './auth.constants';
export function isAuthErrorWithCode({ error, code }: { error: unknown; code: string }) {
return get(error, 'code') === code;
return get(error, ['code']) === code;
}
export const isEmailVerificationRequiredError = ({ error }: { error: unknown }) => isAuthErrorWithCode({ error, code: 'EMAIL_NOT_VERIFIED' });
export function getEnabledSsoProviderConfigs({ config }: { config: Config }): SsoProviderConfig[] {
const enabledSsoProviders: SsoProviderConfig[] = [
...ssoProviders.filter(({ key }) => get(config, `auth.providers.${key}.isEnabled`)),
...ssoProviders.filter(({ key }) => config.auth.providers[key]?.isEnabled),
...config.auth.providers.customs.map(({ providerId, providerName, providerIconUrl }) => ({
key: providerId,
name: providerName,

View File

@@ -4,6 +4,7 @@ import type { SsoProviderConfig } from './auth.types';
import { genericOAuthClient } from 'better-auth/client/plugins';
import { createAuthClient as createBetterAuthClient } from 'better-auth/solid';
import { buildTimeConfig } from '../config/config';
import { queryClient } from '../shared/query/query-client';
import { trackingServices } from '../tracking/tracking.services';
import { createDemoAuthClient } from './auth.demo.services';
@@ -28,6 +29,8 @@ export function createAuthClient() {
const result = await client.signOut();
trackingServices.reset();
queryClient.clear();
return result;
},
};

View File

@@ -0,0 +1,56 @@
import type { Component } from 'solid-js';
import { A, useSearchParams } from '@solidjs/router';
import { useI18n } from '@/modules/i18n/i18n.provider';
import { Button } from '@/modules/ui/components/button';
import { AuthLayout } from '../../ui/layouts/auth-layout.component';
export const EmailVerificationPage: Component = () => {
const { t } = useI18n();
const [searchParams] = useSearchParams();
const getHasError = () => Boolean(searchParams.error);
return (
<AuthLayout>
<div class="flex items-center justify-center h-full p-6 sm:pb-32">
<div class="max-w-xs w-full flex flex-col items-center text-center">
{getHasError()
? (
<>
<div class="i-tabler-alert-circle size-12 text-destructive mb-2" />
<h1 class="text-xl font-bold">
{t('auth.email-verification.error.title')}
</h1>
<p class="text-muted-foreground mt-1 mb-4">
{t('auth.email-verification.error.description')}
</p>
<Button as={A} href="/login" class="gap-2" variant="secondary">
<div class="i-tabler-arrow-left size-4" />
{t('auth.email-verification.error.back')}
</Button>
</>
)
: (
<>
<div class="i-tabler-circle-check size-12 text-primary mb-2" />
<h1 class="text-xl font-bold">
{t('auth.email-verification.success.title')}
</h1>
<p class="text-muted-foreground mt-1 mb-4">
{t('auth.email-verification.success.description')}
</p>
<Button as={A} href="/login" class="gap-2">
{t('auth.email-verification.success.login')}
<div class="i-tabler-arrow-right size-4" />
</Button>
</>
)}
</div>
</div>
</AuthLayout>
);
};

View File

@@ -1,5 +1,6 @@
import type { Component } from 'solid-js';
import type { SsoProviderConfig } from '../auth.types';
import { buildUrl } from '@corentinth/chisels';
import { A, useNavigate } from '@solidjs/router';
import { createSignal, For, Show } from 'solid-js';
import * as v from 'valibot';
@@ -12,6 +13,7 @@ import { Checkbox, CheckboxControl, CheckboxLabel } from '@/modules/ui/component
import { Separator } from '@/modules/ui/components/separator';
import { TextField, TextFieldLabel, TextFieldRoot } from '@/modules/ui/components/textfield';
import { AuthLayout } from '../../ui/layouts/auth-layout.component';
import { authPagesPaths } from '../auth.constants';
import { getEnabledSsoProviderConfigs, isEmailVerificationRequiredError } from '../auth.models';
import { authWithProvider, signIn } from '../auth.services';
import { AuthLegalLinks } from '../components/legal-links.component';
@@ -26,7 +28,13 @@ export const EmailLoginForm: Component = () => {
const { form, Form, Field } = createForm({
onSubmit: async ({ email, password, rememberMe }) => {
const { error } = await signIn.email({ email, password, rememberMe, callbackURL: config.baseUrl });
const { error } = await signIn.email({
email,
password,
rememberMe,
// This URL is where the user will be redirected after email verification
callbackURL: buildUrl({ baseUrl: config.baseUrl, path: authPagesPaths.emailVerification }),
});
if (isEmailVerificationRequiredError({ error })) {
navigate('/email-validation-required');
@@ -35,6 +43,8 @@ export const EmailLoginForm: Component = () => {
if (error) {
throw createI18nApiError({ error });
}
// If all good guard will redirect to dashboard
},
schema: v.object({
email: v.pipe(

View File

@@ -1,5 +1,6 @@
import type { Component } from 'solid-js';
import type { SsoProviderConfig } from '../auth.types';
import { buildUrl } from '@corentinth/chisels';
import { A, useNavigate } from '@solidjs/router';
import { createSignal, For, Show } from 'solid-js';
import * as v from 'valibot';
@@ -11,6 +12,7 @@ import { Button } from '@/modules/ui/components/button';
import { Separator } from '@/modules/ui/components/separator';
import { TextField, TextFieldLabel, TextFieldRoot } from '@/modules/ui/components/textfield';
import { AuthLayout } from '../../ui/layouts/auth-layout.component';
import { authPagesPaths } from '../auth.constants';
import { getEnabledSsoProviderConfigs } from '../auth.models';
import { authWithProvider, signUp } from '../auth.services';
import { AuthLegalLinks } from '../components/legal-links.component';
@@ -29,7 +31,8 @@ export const EmailRegisterForm: Component = () => {
email,
password,
name,
callbackURL: config.baseUrl,
// This URL is where the user will be redirected after email verification
callbackURL: buildUrl({ baseUrl: config.baseUrl, path: authPagesPaths.emailVerification }),
});
if (error) {

View File

@@ -1,12 +1,13 @@
import type { Accessor, ParentComponent } from 'solid-js';
import type { Document } from '../documents/documents.types';
import { safely } from '@corentinth/chisels';
import { useNavigate, useParams } from '@solidjs/router';
import { debounce } from 'lodash-es';
import { createContext, createEffect, createSignal, For, on, onCleanup, onMount, Show, useContext } from 'solid-js';
import { getDocumentIcon } from '../documents/document.models';
import { searchDocuments } from '../documents/documents.services';
import { useI18n } from '../i18n/i18n.provider';
import { cn } from '../shared/style/cn';
import { debounce } from '../shared/utils/timing';
import { useThemeStore } from '../theme/theme.store';
import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading } from '../ui/components/command';
@@ -54,7 +55,10 @@ export const CommandPaletteProvider: ParentComponent = (props) => {
const { setColorMode } = useThemeStore();
const searchDocs = debounce(async ({ searchQuery }: { searchQuery: string }) => {
const { documents } = await searchDocuments({ searchQuery, organizationId: params.organizationId, pageIndex: 0, pageSize: 5 });
const [result] = await safely(searchDocuments({ searchQuery, organizationId: params.organizationId, pageIndex: 0, pageSize: 5 }));
const { documents = [] } = result ?? {};
setMatchingDocuments(documents);
setIsLoading(false);
}, 300);

View File

@@ -1,8 +1,8 @@
import type { ParentComponent } from 'solid-js';
import type { Config, RuntimePublicConfig } from './config';
import { useQuery } from '@tanstack/solid-query';
import { merge } from 'lodash-es';
import { createContext, Match, Switch, useContext } from 'solid-js';
import { deepMerge } from '../shared/utils/object';
import { Button } from '../ui/components/button';
import { EmptyState } from '../ui/components/empty';
import { createToast } from '../ui/components/sonner';
@@ -27,10 +27,11 @@ export const ConfigProvider: ParentComponent = (props) => {
const query = useQuery(() => ({
queryKey: ['config'],
queryFn: fetchPublicConfig,
refetchOnWindowFocus: false,
}));
const mergeConfigs = (runtimeConfig: RuntimePublicConfig): Config => {
return merge({}, buildTimeConfig, runtimeConfig);
return deepMerge(buildTimeConfig, runtimeConfig);
};
const retry = async () => {

View File

@@ -5,7 +5,6 @@ const asString = <T extends string | undefined>(value: string | undefined, defau
const asNumber = <T extends number | undefined>(value: string | undefined, defaultValue?: T): T extends undefined ? number | undefined : number => (value === undefined ? defaultValue : Number(value)) as T extends undefined ? number | undefined : number;
export const buildTimeConfig = {
papraVersion: asString(import.meta.env.VITE_PAPRA_VERSION, '0.0.0'),
baseUrl: asString(import.meta.env.VITE_BASE_URL, window.location.origin),
baseApiUrl: asString(import.meta.env.VITE_BASE_API_URL, window.location.origin),
vitrineBaseUrl: asString(import.meta.env.VITE_VITRINE_BASE_URL, 'http://localhost:3000/'),
@@ -29,6 +28,9 @@ export const buildTimeConfig = {
documents: {
deletedDocumentsRetentionDays: asNumber(import.meta.env.VITE_DOCUMENTS_DELETED_DOCUMENTS_RETENTION_DAYS, 30),
},
organizations: {
deletedOrganizationsPurgeDaysDelay: asNumber(import.meta.env.VITE_ORGANIZATIONS_DELETED_PURGE_DAYS_DELAY, 30),
},
posthog: {
apiKey: asString(import.meta.env.VITE_POSTHOG_API_KEY),
host: asString(import.meta.env.VITE_POSTHOG_HOST),
@@ -41,4 +43,4 @@ export const buildTimeConfig = {
} as const;
export type Config = typeof buildTimeConfig;
export type RuntimePublicConfig = Pick<Config, 'auth'>;
export type RuntimePublicConfig = Pick<Config, 'auth' | 'documents' | 'intakeEmails' | 'organizations'>;

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